@@ -21,6 +21,7 @@ package firmware
21
21
import (
22
22
"bytes"
23
23
"fmt"
24
+ "io"
24
25
"os"
25
26
"strings"
26
27
"time"
@@ -32,6 +33,7 @@ import (
32
33
"github.com/arduino/arduino-fwuploader/flasher"
33
34
"github.com/arduino/arduino-fwuploader/indexes/download"
34
35
"github.com/arduino/arduino-fwuploader/indexes/firmwareindex"
36
+ "github.com/arduino/arduino-fwuploader/plugin"
35
37
"github.com/arduino/go-paths-helper"
36
38
"github.com/sirupsen/logrus"
37
39
"github.com/spf13/cobra"
@@ -69,6 +71,10 @@ func runFlash(cmd *cobra.Command, args []string) {
69
71
// at the end cleanup the fwuploader temp dir
70
72
defer globals .FwUploaderPath .RemoveAll ()
71
73
74
+ if retries < 1 {
75
+ feedback .Fatal ("Number of retries should be at least 1" , feedback .ErrBadArgument )
76
+ }
77
+
72
78
common .CheckFlags (commonFlags .Fqbn , commonFlags .Address )
73
79
packageIndex , firmwareIndex := common .InitIndexes ()
74
80
board := common .GetBoard (firmwareIndex , commonFlags .Fqbn )
@@ -115,6 +121,7 @@ func runFlash(cmd *cobra.Command, args []string) {
115
121
}
116
122
117
123
loaderSketch := ""
124
+ var uploader * plugin.FwUploader
118
125
if ! board .IsPlugin () {
119
126
loaderSketchPath , err := download .DownloadSketch (board .LoaderSketch )
120
127
if err != nil {
@@ -123,34 +130,63 @@ func runFlash(cmd *cobra.Command, args []string) {
123
130
logrus .Debugf ("loader sketch downloaded in %s" , loaderSketchPath .String ())
124
131
loaderSketch = strings .ReplaceAll (loaderSketchPath .String (), loaderSketchPath .Ext (), "" )
125
132
} else {
126
- // TODO...
133
+ var err error
134
+ uploader , err = plugin .NewFWUploaderPlugin (uploadToolDir )
135
+ if err != nil {
136
+ feedback .Fatal (fmt .Sprintf ("Could not open uploader plugin: %s" , err ), feedback .ErrGeneric )
137
+ }
127
138
}
128
139
129
- for retry := 1 ; retry <= retries ; retry ++ {
140
+ retry := 0
141
+ for {
142
+ retry ++
143
+ logrus .Infof ("Uploading firmware (try %d of %d)" , retry , retries )
144
+
145
+ var res * flasher.FlashResult
130
146
var err error
131
147
if ! board .IsPlugin () {
132
- err = updateFirmware (board , loaderSketch , moduleName , uploadToolDir , firmwareFilePath )
148
+ res , err = updateFirmware (board , loaderSketch , moduleName , uploadToolDir , firmwareFilePath )
133
149
} else {
134
- err = nil // TODO...
150
+ res , err = updateFirmwareWithPlugin ( uploader , firmwareFilePath )
135
151
}
136
152
if err == nil {
153
+ feedback .PrintResult (res )
137
154
logrus .Info ("Operation completed: success! :-)" )
138
155
break
139
156
}
140
157
logrus .Error (err )
158
+
141
159
if retry == retries {
142
160
logrus .Fatal ("Operation failed. :-(" )
143
161
}
162
+
144
163
logrus .Info ("Waiting 1 second before retrying..." )
145
164
time .Sleep (time .Second )
146
- logrus .Infof ("Retrying upload (%d of %d)" , retry , retries )
147
165
}
148
166
}
149
167
150
- func updateFirmware (board * firmwareindex.IndexBoard , loaderSketch , moduleName string , uploadToolDir , firmwareFile * paths.Path ) error {
168
+ func updateFirmwareWithPlugin (uploader * plugin.FwUploader , fwPath * paths.Path ) (* flasher.FlashResult , error ) {
169
+ var stdout , stderr io.Writer
170
+ if feedback .GetFormat () == feedback .Text {
171
+ stdout = os .Stdout
172
+ stderr = os .Stderr
173
+ }
174
+ res , err := uploader .FlashFirmware (commonFlags .Address , fwPath , stdout , stderr )
175
+ if err != nil {
176
+ return nil , fmt .Errorf ("couldn't update firmware: %s" , err )
177
+ }
178
+ return & flasher.FlashResult {
179
+ Programmer : & flasher.ExecOutput {
180
+ Stdout : string (res .Stdout ),
181
+ Stderr : string (res .Stderr ),
182
+ },
183
+ }, nil
184
+ }
185
+
186
+ func updateFirmware (board * firmwareindex.IndexBoard , loaderSketch , moduleName string , uploadToolDir , firmwareFile * paths.Path ) (* flasher.FlashResult , error ) {
151
187
programmerOut , programmerErr , err := common .FlashSketch (board , loaderSketch , uploadToolDir , commonFlags .Address )
152
188
if err != nil {
153
- return err
189
+ return nil , err
154
190
}
155
191
// Wait a bit after flashing the loader sketch for the board to become
156
192
// available again.
@@ -174,7 +210,7 @@ func updateFirmware(board *firmwareindex.IndexBoard, loaderSketch, moduleName st
174
210
feedback .Fatal (fmt .Sprintf ("Error during firmware flashing: %s" , err ), feedback .ErrGeneric )
175
211
}
176
212
if err != nil {
177
- return fmt .Errorf ("error during firmware flashing: %s" , err )
213
+ return nil , fmt .Errorf ("error during firmware flashing: %s" , err )
178
214
}
179
215
defer f .Close ()
180
216
@@ -189,11 +225,11 @@ func updateFirmware(board *firmwareindex.IndexBoard, loaderSketch, moduleName st
189
225
}
190
226
if err != nil {
191
227
flasherErr .Write ([]byte (fmt .Sprintf ("Error during firmware flashing: %s" , err )))
192
- return err
228
+ return nil , err
193
229
}
194
230
195
231
// Print the results
196
- feedback . PrintResult ( & flasher.FlashResult {
232
+ return & flasher.FlashResult {
197
233
Programmer : (& flasher.ExecOutput {
198
234
Stdout : programmerOut .String (),
199
235
Stderr : programmerErr .String (),
@@ -202,8 +238,7 @@ func updateFirmware(board *firmwareindex.IndexBoard, loaderSketch, moduleName st
202
238
Stdout : flasherOut .String (),
203
239
Stderr : flasherErr .String (),
204
240
}),
205
- })
206
- return nil
241
+ }, nil
207
242
}
208
243
209
244
// callback used to print the progress
0 commit comments