44
44
fqbn string
45
45
address string
46
46
module string
47
+ retries uint8
47
48
)
48
49
49
50
// NewCommand created a new `version` command
@@ -63,6 +64,7 @@ func NewFlashCommand() *cobra.Command {
63
64
command .Flags ().StringVarP (& fqbn , "fqbn" , "b" , "" , "Fully Qualified Board Name, e.g.: arduino:samd:mkr1000, arduino:mbed_nano:nanorp2040connect" )
64
65
command .Flags ().StringVarP (& address , "address" , "a" , "" , "Upload port, e.g.: COM10, /dev/ttyACM0" )
65
66
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)" )
66
68
return command
67
69
}
68
70
@@ -159,82 +161,96 @@ func run(cmd *cobra.Command, args []string) {
159
161
os .Exit (errorcodes .ErrGeneric )
160
162
}
161
163
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
+ }
167
197
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: %s" , err )
169
218
os .Exit (errorcodes .ErrGeneric )
170
219
}
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
174
223
}
175
- }
176
224
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 ()
211
238
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
+ })
224
250
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
+ }
239
255
}
240
256
}
0 commit comments