@@ -24,25 +24,31 @@ import (
24
24
"crypto/md5"
25
25
"encoding/binary"
26
26
"fmt"
27
+ "strconv"
27
28
"time"
28
29
29
30
"github.com/arduino/go-paths-helper"
31
+ "github.com/sirupsen/logrus"
30
32
"go.bug.st/serial"
31
33
)
32
34
33
35
// NewNinaFlasher creates an new instance of NinaFlasher
34
36
func NewNinaFlasher (portAddress string ) (* NinaFlasher , error ) {
35
37
port , err := openSerial (portAddress )
36
38
if err != nil {
39
+ logrus .Error (err )
37
40
return nil , err
38
41
}
39
42
f := & NinaFlasher {port : port }
40
43
payloadSize , err := f .getMaximumPayloadSize ()
41
44
if err != nil {
45
+ logrus .Error (err )
42
46
return nil , err
43
47
}
44
48
if payloadSize < 1024 {
45
- return nil , fmt .Errorf ("programmer reports %d as maximum payload size (1024 is needed)" , payloadSize )
49
+ err = fmt .Errorf ("programmer reports %d as maximum payload size (1024 is needed)" , payloadSize )
50
+ logrus .Error (err )
51
+ return nil , err
46
52
}
47
53
f .payloadSize = int (payloadSize )
48
54
return f , nil
@@ -55,17 +61,21 @@ type NinaFlasher struct {
55
61
56
62
// FlashFirmware in board connected to port using data from firmwareFile
57
63
func (f * NinaFlasher ) FlashFirmware (firmwareFile * paths.Path ) error {
64
+ logrus .Infof ("Flashing firmware %s" , firmwareFile )
58
65
if err := f .hello (); err != nil {
66
+ logrus .Error (err )
59
67
return err
60
68
}
61
69
62
70
data , err := firmwareFile .ReadFile ()
63
71
if err != nil {
72
+ logrus .Error (err )
64
73
return err
65
74
}
66
75
67
76
firmwareOffset := 0x0000
68
77
if err := f .flashChunk (firmwareOffset , data ); err != nil {
78
+ logrus .Error (err )
69
79
return err
70
80
}
71
81
@@ -79,7 +89,9 @@ func (f *NinaFlasher) FlashCertificates(certificatePaths *paths.PathList) error
79
89
80
90
// Close the port used by this flasher
81
91
func (f * NinaFlasher ) Close () error {
82
- return f .port .Close ()
92
+ err := f .port .Close ()
93
+ logrus .Error (err )
94
+ return err
83
95
}
84
96
85
97
// Ping the programmer to see if it is alive.
@@ -93,6 +105,7 @@ func (f *NinaFlasher) hello() error {
93
105
Payload : nil ,
94
106
})
95
107
if err != nil {
108
+ logrus .Error (err )
96
109
return err
97
110
}
98
111
@@ -103,6 +116,7 @@ func (f *NinaFlasher) hello() error {
103
116
res := make ([]byte , 65535 )
104
117
n , err := f .port .Read (res )
105
118
if err != nil {
119
+ logrus .Error (err )
106
120
return err
107
121
}
108
122
// flush eventual leftover from the rx buffer
@@ -111,11 +125,15 @@ func (f *NinaFlasher) hello() error {
111
125
}
112
126
113
127
if res [0 ] != 'v' {
114
- return FlasherError {err : "Programmer is not responding" }
128
+ err = FlasherError {err : "Programmer is not responding" }
129
+ logrus .Error (err )
130
+ return err
115
131
}
116
132
if string (res ) != "v10000" {
117
133
// TODO: Do we really need this check? What is it trying to verify?
118
- return FlasherError {err : fmt .Sprintf ("Programmer version mismatch, v10000 needed: %s" , res )}
134
+ err = FlasherError {err : fmt .Sprintf ("Programmer version mismatch, v10000 needed: %s" , res )}
135
+ logrus .Error (err )
136
+ return err
119
137
}
120
138
return nil
121
139
}
@@ -126,17 +144,19 @@ func (f *NinaFlasher) flashChunk(offset int, buffer []byte) error {
126
144
bufferLength := len (buffer )
127
145
128
146
if err := f .erase (uint32 (offset ), uint32 (bufferLength )); err != nil {
147
+ logrus .Error (err )
129
148
return err
130
149
}
131
150
132
151
for i := 0 ; i < bufferLength ; i += chunkSize {
133
- // fmt.Printf("\rFlashing: " + strconv.Itoa((i*100)/bufferLength) + "%%" )
152
+ logrus . Debugf ( "Flashing chunk: %s%%" , strconv .Itoa ((i * 100 )/ bufferLength ))
134
153
start := i
135
154
end := i + chunkSize
136
155
if end > bufferLength {
137
156
end = bufferLength
138
157
}
139
158
if err := f .write (uint32 (offset + i ), buffer [start :end ]); err != nil {
159
+ logrus .Error (err )
140
160
return err
141
161
}
142
162
}
@@ -154,12 +174,14 @@ func (f *NinaFlasher) getMaximumPayloadSize() (uint16, error) {
154
174
Payload : nil ,
155
175
})
156
176
if err != nil {
177
+ logrus .Error (err )
157
178
return 0 , err
158
179
}
159
180
160
181
// Receive response
161
182
res := make ([]byte , 2 )
162
183
if err := f .serialFillBuffer (res ); err != nil {
184
+ logrus .Error (err )
163
185
return 0 , err
164
186
}
165
187
return (uint16 (res [0 ]) << 8 ) + uint16 (res [1 ]), nil
@@ -171,10 +193,13 @@ func (f *NinaFlasher) serialFillBuffer(buffer []byte) error {
171
193
for read < len (buffer ) {
172
194
n , err := f .port .Read (buffer [read :])
173
195
if err != nil {
196
+ logrus .Error (err )
174
197
return err
175
198
}
176
199
if n == 0 {
177
- return FlasherError {err : "Serial port closed unexpectedly" }
200
+ err = FlasherError {err : "Serial port closed unexpectedly" }
201
+ logrus .Error (err )
202
+ return err
178
203
}
179
204
read += n
180
205
}
@@ -183,14 +208,18 @@ func (f *NinaFlasher) serialFillBuffer(buffer []byte) error {
183
208
184
209
// sendCommand sends the data over serial port to connected board
185
210
func (f * NinaFlasher ) sendCommand (data CommandData ) error {
211
+ logrus .Debugf ("sending command data %s" , data )
186
212
buff := new (bytes.Buffer )
187
213
if err := binary .Write (buff , binary .BigEndian , data .Command ); err != nil {
214
+ logrus .Error (err )
188
215
return err
189
216
}
190
217
if err := binary .Write (buff , binary .BigEndian , data .Address ); err != nil {
218
+ logrus .Error (err )
191
219
return err
192
220
}
193
221
if err := binary .Write (buff , binary .BigEndian , data .Value ); err != nil {
222
+ logrus .Error (err )
194
223
return err
195
224
}
196
225
var length uint16
@@ -200,6 +229,7 @@ func (f *NinaFlasher) sendCommand(data CommandData) error {
200
229
length = uint16 (len (data .Payload ))
201
230
}
202
231
if err := binary .Write (buff , binary .BigEndian , length ); err != nil {
232
+ logrus .Error (err )
203
233
return err
204
234
}
205
235
if data .Payload != nil {
@@ -209,11 +239,13 @@ func (f *NinaFlasher) sendCommand(data CommandData) error {
209
239
for {
210
240
sent , err := f .port .Write (bufferData )
211
241
if err != nil {
242
+ logrus .Error (err )
212
243
return err
213
244
}
214
245
if sent == len (bufferData ) {
215
246
break
216
247
}
248
+ logrus .Debugf ("Sent %d bytes out of %d" , sent , len (bufferData ))
217
249
bufferData = bufferData [sent :]
218
250
}
219
251
return nil
@@ -229,20 +261,25 @@ func (f *NinaFlasher) read(address uint32, length uint32) ([]byte, error) {
229
261
Payload : nil ,
230
262
})
231
263
if err != nil {
264
+ logrus .Error (err )
232
265
return nil , err
233
266
}
234
267
235
268
// Receive response
236
269
result := make ([]byte , length )
237
270
if err := f .serialFillBuffer (result ); err != nil {
271
+ logrus .Error (err )
238
272
return nil , err
239
273
}
240
274
ack := make ([]byte , 2 )
241
275
if err := f .serialFillBuffer (ack ); err != nil {
276
+ logrus .Error (err )
242
277
return nil , err
243
278
}
244
279
if string (ack ) != "OK" {
245
- return nil , FlasherError {err : fmt .Sprintf ("Missing ack on read: %s, result: %s" , ack , result )}
280
+ err = FlasherError {err : fmt .Sprintf ("Missing ack on read: %s, result: %s" , ack , result )}
281
+ logrus .Error (err )
282
+ return nil , err
246
283
}
247
284
return result , nil
248
285
}
@@ -257,16 +294,20 @@ func (f *NinaFlasher) write(address uint32, buffer []byte) error {
257
294
Payload : buffer ,
258
295
})
259
296
if err != nil {
297
+ logrus .Error (err )
260
298
return err
261
299
}
262
300
263
301
// wait acknowledge
264
302
ack := make ([]byte , 2 )
265
303
if err := f .serialFillBuffer (ack ); err != nil {
304
+ logrus .Error (err )
266
305
return err
267
306
}
268
307
if string (ack ) != "OK" {
269
- return FlasherError {err : fmt .Sprintf ("Missing ack on write: %s" , ack )}
308
+ err = FlasherError {err : fmt .Sprintf ("Missing ack on write: %s" , ack )}
309
+ logrus .Error (err )
310
+ return err
270
311
}
271
312
return nil
272
313
}
@@ -281,16 +322,20 @@ func (f *NinaFlasher) erase(address uint32, length uint32) error {
281
322
Payload : nil ,
282
323
})
283
324
if err != nil {
325
+ logrus .Error (err )
284
326
return err
285
327
}
286
328
287
329
// wait acknowledge
288
330
ack := make ([]byte , 2 )
289
331
if err := f .serialFillBuffer (ack ); err != nil {
332
+ logrus .Error (err )
290
333
return err
291
334
}
292
335
if string (ack ) != "OK" {
293
- return FlasherError {err : fmt .Sprintf ("Missing ack on erase: %s" , ack )}
336
+ err = FlasherError {err : fmt .Sprintf ("Missing ack on erase: %s" , ack )}
337
+ logrus .Error (err )
338
+ return err
294
339
}
295
340
return nil
296
341
}
@@ -307,33 +352,39 @@ func (f *NinaFlasher) md5sum(data []byte) error {
307
352
Payload : nil ,
308
353
})
309
354
if err != nil {
355
+ logrus .Error (err )
310
356
return err
311
357
}
312
358
313
359
// Wait acknowledge
314
360
ack := make ([]byte , 2 )
315
361
if err := f .serialFillBuffer (ack ); err != nil {
362
+ logrus .Error (err )
316
363
return err
317
364
}
318
365
if string (ack ) != "OK" {
319
- return FlasherError {err : fmt .Sprintf ("Missing ack on md5sum: %s" , ack )}
366
+ err := FlasherError {err : fmt .Sprintf ("Missing ack on md5sum: %s" , ack )}
367
+ logrus .Error (err )
368
+ return err
320
369
}
321
370
322
371
// Wait md5
323
- md5sum := make ([]byte , 16 )
324
- if err := f .serialFillBuffer (md5sum ); err != nil {
372
+ md5sumfromdevice := make ([]byte , 16 )
373
+ if err := f .serialFillBuffer (md5sumfromdevice ); err != nil {
325
374
return err
326
375
}
327
376
328
- md5sumfromdevice := hasher .Sum (nil )
377
+ md5sum := hasher .Sum (nil )
378
+ logrus .Debugf ("md5 read from device %s" , md5sumfromdevice )
379
+ logrus .Debugf ("md5 of data %s" , md5sum )
329
380
330
381
for i := 0 ; i < 16 ; i ++ {
331
- if md5sumfromdevice [i ] != md5sum [i ] {
332
- return & FlasherError {err : "MD5sum failed" }
382
+ if md5sum [i ] != md5sumfromdevice [i ] {
383
+ err := FlasherError {err : "MD5sum failed" }
384
+ logrus .Error (err )
385
+ return err
333
386
}
334
387
}
335
388
336
- // log.Println("Integrity ok")
337
-
338
389
return nil
339
390
}
0 commit comments