Skip to content

Commit bdb4fb7

Browse files
committed
add retries flag (just like in #24)
1 parent d4c7b34 commit bdb4fb7

File tree

1 file changed

+86
-70
lines changed

1 file changed

+86
-70
lines changed

cli/firmware/flash.go

Lines changed: 86 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ var (
4444
fqbn string
4545
address string
4646
module string
47+
retries uint8
4748
)
4849

4950
// NewCommand created a new `version` command
@@ -63,6 +64,7 @@ func NewFlashCommand() *cobra.Command {
6364
command.Flags().StringVarP(&fqbn, "fqbn", "b", "", "Fully Qualified Board Name, e.g.: arduino:samd:mkr1000, arduino:mbed_nano:nanorp2040connect")
6465
command.Flags().StringVarP(&address, "address", "a", "", "Upload port, e.g.: COM10, /dev/ttyACM0")
6566
command.Flags().StringVarP(&module, "module", "m", "", "Firmware module ID, e.g.: WINC1500, NINA")
67+
command.Flags().Uint8Var(&retries, "retries", 9, "Number of retries in case of upload failure (default 9)")
6668
return command
6769
}
6870

@@ -159,82 +161,96 @@ func run(cmd *cobra.Command, args []string) {
159161
os.Exit(errorcodes.ErrGeneric)
160162
}
161163

162-
// Check if board needs a 1200bps touch for upload
163-
uploadPort := address
164-
if board.UploadTouch {
165-
logrus.Info("Putting board into bootloader mode")
166-
newUploadPort, err := serialutils.Reset(address, board.UploadWait, nil)
164+
for retry := 0; retry <= int(retries); retry++ {
165+
166+
if retry == int(retries) {
167+
logrus.Fatal("Operation failed. :-(")
168+
}
169+
170+
if retry != 0 {
171+
logrus.Infof("Retrying upload (%d of %d)", retry, retries)
172+
}
173+
174+
// Check if board needs a 1200bps touch for upload
175+
uploadPort := address
176+
if board.UploadTouch {
177+
logrus.Info("Putting board into bootloader mode")
178+
newUploadPort, err := serialutils.Reset(address, board.UploadWait, nil)
179+
if err != nil {
180+
feedback.Errorf("Error during firmware flashing: missing board address")
181+
continue
182+
}
183+
if newUploadPort != "" {
184+
logrus.Infof("Found port to upload Loader: %s", newUploadPort)
185+
uploadPort = newUploadPort
186+
}
187+
}
188+
189+
// Flash loader Sketch
190+
programmerOut := new(bytes.Buffer)
191+
programmerErr := new(bytes.Buffer)
192+
if feedback.GetFormat() == feedback.JSON {
193+
err = programmer.Flash(commandLine, programmerOut, programmerErr)
194+
} else {
195+
err = programmer.Flash(commandLine, os.Stdout, os.Stderr)
196+
}
167197
if err != nil {
168-
feedback.Errorf("Error during firmware flashing: missing board address")
198+
feedback.Errorf("Error during firmware flashing: %s", err)
199+
continue
200+
}
201+
202+
// Wait a bit after flashing the loader sketch for the board to become
203+
// available again.
204+
time.Sleep(2 * time.Second)
205+
206+
// Get flasher depending on which module to use
207+
var f flasher.Flasher
208+
switch moduleName {
209+
case "NINA":
210+
f, err = flasher.NewNinaFlasher(uploadPort)
211+
case "SARA":
212+
f, err = flasher.NewSaraFlasher(uploadPort)
213+
case "WINC1500":
214+
f, err = flasher.NewWincFlasher(uploadPort)
215+
default:
216+
err = fmt.Errorf("unknown module: %s", moduleName)
217+
feedback.Errorf("Error during firmware flashing: ", err)
169218
os.Exit(errorcodes.ErrGeneric)
170219
}
171-
if newUploadPort != "" {
172-
logrus.Infof("Found port to upload Loader: %s", newUploadPort)
173-
uploadPort = newUploadPort
220+
if err != nil {
221+
feedback.Errorf("Error during firmware flashing: %s", err)
222+
continue
174223
}
175-
}
176224

177-
// Flash loader Sketch
178-
programmerOut := new(bytes.Buffer)
179-
programmerErr := new(bytes.Buffer)
180-
if feedback.GetFormat() == feedback.JSON {
181-
err = programmer.Flash(commandLine, programmerOut, programmerErr)
182-
} else {
183-
err = programmer.Flash(commandLine, os.Stdout, os.Stderr)
184-
}
185-
if err != nil {
186-
feedback.Errorf("Error during firmware flashing: %s", err)
187-
os.Exit(errorcodes.ErrGeneric)
188-
}
189-
190-
// Wait a bit after flashing the loader sketch for the board to become
191-
// available again.
192-
time.Sleep(2 * time.Second)
193-
194-
// Get flasher depending on which module to use
195-
var f flasher.Flasher
196-
switch moduleName {
197-
case "NINA":
198-
f, err = flasher.NewNinaFlasher(uploadPort)
199-
case "SARA":
200-
f, err = flasher.NewSaraFlasher(uploadPort)
201-
case "WINC1500":
202-
f, err = flasher.NewWincFlasher(uploadPort)
203-
default:
204-
err = fmt.Errorf("unknown module: %s", moduleName)
205-
}
206-
if err != nil {
207-
feedback.Errorf("Error during firmware flashing: %s", err)
208-
os.Exit(errorcodes.ErrGeneric)
209-
}
210-
defer f.Close()
225+
// now flash the actual firmware
226+
flasherOut := new(bytes.Buffer)
227+
flasherErr := new(bytes.Buffer)
228+
if feedback.GetFormat() == feedback.JSON {
229+
err = f.FlashFirmware(firmwareFile, flasherOut)
230+
} else {
231+
err = f.FlashFirmware(firmwareFile, os.Stdout)
232+
}
233+
if err != nil {
234+
feedback.Errorf("Error during firmware flashing: %s", err)
235+
flasherErr.Write([]byte(fmt.Sprintf("Error during firmware flashing: %s", err)))
236+
}
237+
f.Close()
211238

212-
// now flash the actual firmware
213-
flasherOut := new(bytes.Buffer)
214-
flasherErr := new(bytes.Buffer)
215-
if feedback.GetFormat() == feedback.JSON {
216-
err = f.FlashFirmware(firmwareFile, flasherOut)
217-
} else {
218-
err = f.FlashFirmware(firmwareFile, os.Stdout)
219-
}
220-
if err != nil {
221-
feedback.Errorf("Error during firmware flashing: %s", err)
222-
flasherErr.Write([]byte(fmt.Sprintf("Error during firmware flashing: %s", err)))
223-
}
239+
// Print the results
240+
feedback.PrintResult(&flasher.FlashResult{
241+
Programmer: (&flasher.ExecOutput{
242+
Stdout: programmerOut.String(),
243+
Stderr: programmerErr.String(),
244+
}),
245+
Flasher: (&flasher.ExecOutput{
246+
Stdout: flasherOut.String(),
247+
Stderr: flasherErr.String(),
248+
}),
249+
})
224250

225-
// Print the results
226-
feedback.PrintResult(&flasher.FlashResult{
227-
Programmer: (&flasher.ExecOutput{
228-
Stdout: programmerOut.String(),
229-
Stderr: programmerErr.String(),
230-
}),
231-
Flasher: (&flasher.ExecOutput{
232-
Stdout: flasherOut.String(),
233-
Stderr: flasherErr.String(),
234-
}),
235-
})
236-
// Exit if something went wrong but after printing
237-
if err != nil {
238-
os.Exit(errorcodes.ErrGeneric)
251+
if err == nil {
252+
logrus.Info("Operation completed: success! :-)")
253+
break
254+
}
239255
}
240256
}

0 commit comments

Comments
 (0)