@@ -56,9 +56,11 @@ var _ helper.Plugin = (*ninaPlugin)(nil)
5656
5757// GetFirmwareVersion implements helper.Plugin.
5858func (p * ninaPlugin ) GetFirmwareVersion (portAddress string , fqbn string , feedback * helper.PluginFeedback ) (* semver.RelaxedVersion , error ) {
59- if err := p .uploadCommandsSketch (& portAddress , fqbn , feedback ); err != nil {
59+ newPort , err := p .uploadCommandsSketch (portAddress , fqbn , feedback )
60+ if err != nil {
6061 return nil , err
6162 }
63+ portAddress = newPort
6264
6365 port , err := serialOpen (portAddress )
6466 if err != nil {
@@ -111,9 +113,11 @@ func (p *ninaPlugin) UploadCertificate(portAddress string, fqbn string, certific
111113 }
112114 fmt .Fprintf (feedback .Out (), "Uploading certificates to %s...\n " , portAddress )
113115
114- if err := p .uploadCommandsSketch (& portAddress , fqbn , feedback ); err != nil {
116+ newPort , err := p .uploadCommandsSketch (portAddress , fqbn , feedback )
117+ if err != nil {
115118 return err
116119 }
120+ portAddress = newPort
117121
118122 flasher , err := newFlasher (portAddress , defaultProgressCallBack (feedback ))
119123 if err != nil {
@@ -151,9 +155,11 @@ func (p *ninaPlugin) UploadFirmware(portAddress string, fqbn string, firmwarePat
151155 return fmt .Errorf ("invalid firmware path" )
152156 }
153157
154- if err := p .uploadCommandsSketch (& portAddress , fqbn , feedback ); err != nil {
158+ newPort , err := p .uploadCommandsSketch (portAddress , fqbn , feedback )
159+ if err != nil {
155160 return err
156161 }
162+ portAddress = newPort
157163
158164 flasher , err := newFlasher (portAddress , defaultProgressCallBack (feedback ))
159165 if err != nil {
@@ -177,7 +183,7 @@ func (p *ninaPlugin) UploadFirmware(portAddress string, fqbn string, firmwarePat
177183 return nil
178184}
179185
180- func (p * ninaPlugin ) uploadCommandsSketch (portAddress * string , fqbn string , feedback * helper.PluginFeedback ) error {
186+ func (p * ninaPlugin ) uploadCommandsSketch (portAddress string , fqbn string , feedback * helper.PluginFeedback ) ( string , error ) {
181187 slog .Info ("upload command sketch" )
182188
183189 readCommandsSketch := func (fqbn string ) ([]byte , error ) {
@@ -197,12 +203,12 @@ func (p *ninaPlugin) uploadCommandsSketch(portAddress *string, fqbn string, feed
197203
198204 sketchData , err := readCommandsSketch (fqbn )
199205 if err != nil {
200- return err
206+ return "" , err
201207 }
202208
203209 rebootFile , err := paths .WriteToTempFile (sketchData , paths .TempDir (), "nina-fwuploader-plugin" )
204210 if err != nil {
205- return err
211+ return "" , err
206212 }
207213 defer rebootFile .Remove ()
208214
@@ -211,19 +217,27 @@ func (p *ninaPlugin) uploadCommandsSketch(portAddress *string, fqbn string, feed
211217 // Will be used after the 1200 touch to check if the OS changed the serial port.
212218 allSerialPorts , err := serial .AllPorts ()
213219 if err != nil {
214- return err
220+ return "" , err
215221 }
216222
217- if err := serialutils .TouchSerialPortAt1200bps (* portAddress ); err != nil {
218- return err
223+ if err := serialutils .TouchSerialPortAt1200bps (portAddress ); err != nil {
224+ return "" , err
219225 }
220226
221- newPort , changed , err := allSerialPorts .NewPort ()
227+ // The bootloaderPort will be used only by the loader, after the sketch is flashed it will restore the board at the user provided port.
228+ bootloaderPort , changed , err := allSerialPorts .NewPort ()
222229 if err != nil {
223- return err
230+ return "" , err
224231 }
225- if changed {
226- * portAddress = newPort
232+ if ! changed {
233+ bootloaderPort = portAddress
234+ }
235+ slog .Info ("bootloader port" , slog .String ("address" , bootloaderPort ))
236+
237+ // Will be used after the loader the detect possible new serial port
238+ allSerialPorts , err = serial .AllPorts ()
239+ if err != nil {
240+ return "" , err
227241 }
228242
229243 getSketchUploader := func (fqbn string ) (* executils.Process , error ) {
@@ -248,23 +262,30 @@ func (p *ninaPlugin) uploadCommandsSketch(portAddress *string, fqbn string, feed
248262 return nil ,
fmt .
Errorf (
"couldn't find [email protected] binary" )
249263 }
250264
251- return executils .NewProcess (nil , bossacPath .Join ("bossac" ).String (), "-i" , "-d" , "--port=" + * portAddress , "-U" , "true" , "-i" , "-e" , "-w" , "-v" , rebootFile .String (), "-R" )
265+ return executils .NewProcess (nil , bossacPath .Join ("bossac" ).String (), "-i" , "-d" , "--port=" + bootloaderPort , "-U" , "true" , "-i" , "-e" , "-w" , "-v" , rebootFile .String (), "-R" )
252266 }
253267 return nil , fmt .Errorf ("sketch uploader: the board (fqbn: %v) is not supported" , fqbn )
254268 }
255269
256270 slog .Info ("uploading command sketch" )
257271 cmd , err := getSketchUploader (fqbn )
258272 if err != nil {
259- return err
273+ return "" , err
260274 }
261275 cmd .RedirectStderrTo (feedback .Err ())
262276 cmd .RedirectStdoutTo (feedback .Out ())
263277 if err := cmd .Run (); err != nil {
264- return err
278+ return "" , err
265279 }
266280
281+ newPort , changed , err := allSerialPorts .NewPort ()
282+ if err != nil {
283+ return "" , err
284+ }
285+ if changed {
286+ portAddress = newPort
287+ slog .Info ("new serial port" , slog .String ("address" , portAddress ))
288+ }
267289 slog .Info ("upload command sketch completed" )
268- time .Sleep (3 * time .Second )
269- return nil
290+ return portAddress , nil
270291}
0 commit comments