Skip to content

Commit 7472c82

Browse files
Use new port address only while flashing the sketch (#7)
1 parent 026fc1b commit 7472c82

File tree

1 file changed

+39
-18
lines changed

1 file changed

+39
-18
lines changed

main.go

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,11 @@ var _ helper.Plugin = (*ninaPlugin)(nil)
5656

5757
// GetFirmwareVersion implements helper.Plugin.
5858
func (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

Comments
 (0)