Skip to content

Commit 4c7be74

Browse files
committed
Refactored and simplified Programmer
- removed DumpAndFlash (it doesn't work reliably) - simplified ctx message passing
1 parent 96a73e6 commit 4c7be74

File tree

7 files changed

+109
-88
lines changed

7 files changed

+109
-88
lines changed

Diff for: main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"github.com/arduino/FirmwareUpdater/utils/context"
1616
)
1717

18-
var ctx context.Context
18+
var ctx = &context.Context{}
1919

2020
func init() {
2121
flag.StringVar(&ctx.PortName, "port", "", "serial port to use for flashing")

Diff for: modules/nina/main.go

+17-26
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,17 @@ import (
3333
"github.com/arduino/FirmwareUpdater/utils/context"
3434
)
3535

36-
var f *Flasher
36+
var flasher *Flasher
3737
var payloadSize uint16
3838
var programmer context.Programmer
3939

40-
func Run(ctx context.Context) {
41-
42-
var err error
40+
func Run(ctx *context.Context) {
4341

4442
if ctx.ProgrammerPath != "" {
4543
if strings.Contains(filepath.Base(ctx.ProgrammerPath), "bossac") {
4644
programmer = &bossac.Bossac{}
4745
} else if strings.Contains(filepath.Base(ctx.ProgrammerPath), "avrdude") {
48-
programmer = &avrdude.Avrdude{}
46+
programmer = avrdude.NewAvrdude(ctx)
4947
} else {
5048
log.Fatal("Programmer path not specified correctly, programmer path set to: " + ctx.ProgrammerPath)
5149
}
@@ -56,34 +54,27 @@ func Run(ctx context.Context) {
5654
if programmer == nil {
5755
log.Fatal("ERROR: You must specify a programmer!")
5856
}
59-
if ctx.BinaryToRestore == "" {
60-
ctx.BinaryToRestore, err = programmer.DumpAndFlash(&ctx, ctx.FWUploaderBinary)
61-
} else {
62-
err = programmer.Flash(&ctx, ctx.FWUploaderBinary)
63-
}
64-
if err != nil {
57+
if err := programmer.Flash(ctx.FWUploaderBinary); err != nil {
6558
log.Fatal(err)
6659
}
6760
}
6861

6962
log.Println("Connecting to programmer")
70-
if _f, err := OpenFlasher(ctx.PortName); err != nil {
63+
if f, err := OpenFlasher(ctx.PortName); err != nil {
7164
log.Fatal(err)
7265
} else {
73-
f = _f
66+
flasher = f
7467
}
75-
defer f.Close()
7668

7769
// Synchronize with programmer
7870
log.Println("Sync with programmer")
79-
if err := f.Hello(); err != nil {
71+
if err := flasher.Hello(); err != nil {
8072
log.Fatal(err)
8173
}
8274

8375
// Check maximum supported payload size
8476
log.Println("Reading max payload size")
85-
_payloadSize, err := f.GetMaximumPayloadSize()
86-
if err != nil {
77+
if _payloadSize, err := flasher.GetMaximumPayloadSize(); err != nil {
8778
log.Fatal(err)
8879
} else {
8980
payloadSize = _payloadSize
@@ -111,22 +102,22 @@ func Run(ctx context.Context) {
111102
}
112103
}
113104

114-
f.Close()
105+
flasher.Close()
115106

116107
if ctx.BinaryToRestore != "" {
117-
log.Println("Restoring previous sketch")
108+
log.Println("Restoring binary")
118109
if programmer == nil {
119110
log.Fatal("ERROR: You must specify a programmer!")
120111
}
121-
if err := programmer.Flash(&ctx, ctx.BinaryToRestore); err != nil {
112+
if err := programmer.Flash(ctx.BinaryToRestore); err != nil {
122113
log.Fatal(err)
123114
}
124115
}
125116
}
126117

127118
func readAllFlash() error {
128119
for i := 0; i < 256; i++ {
129-
if data, err := f.Read(uint32(i*1024), 1024); err != nil {
120+
if data, err := flasher.Read(uint32(i*1024), 1024); err != nil {
130121
log.Fatal(err)
131122
} else {
132123
os.Stdout.Write(data)
@@ -135,7 +126,7 @@ func readAllFlash() error {
135126
return nil
136127
}
137128

138-
func flashCerts(ctx context.Context) error {
129+
func flashCerts(ctx *context.Context) error {
139130
CertificatesOffset := 0x10000
140131

141132
if ctx.RootCertDir != "" {
@@ -161,7 +152,7 @@ func flashCerts(ctx context.Context) error {
161152
return flashChunk(CertificatesOffset, certificatesData, false)
162153
}
163154

164-
func flashFirmware(ctx context.Context) error {
155+
func flashFirmware(ctx *context.Context) error {
165156
FirmwareOffset := 0x0000
166157

167158
log.Printf("Flashing firmware from '%v'", ctx.FirmwareFile)
@@ -178,7 +169,7 @@ func flashChunk(offset int, buffer []byte, doChecksum bool) error {
178169
chunkSize := int(payloadSize)
179170
bufferLength := len(buffer)
180171

181-
if err := f.Erase(uint32(offset), uint32(bufferLength)); err != nil {
172+
if err := flasher.Erase(uint32(offset), uint32(bufferLength)); err != nil {
182173
return err
183174
}
184175

@@ -189,15 +180,15 @@ func flashChunk(offset int, buffer []byte, doChecksum bool) error {
189180
if end > bufferLength {
190181
end = bufferLength
191182
}
192-
if err := f.Write(uint32(offset+i), buffer[start:end]); err != nil {
183+
if err := flasher.Write(uint32(offset+i), buffer[start:end]); err != nil {
193184
return err
194185
}
195186
}
196187

197188
fmt.Println("")
198189

199190
if doChecksum {
200-
return f.Md5sum(buffer)
191+
return flasher.Md5sum(buffer)
201192
} else {
202193
return nil
203194
}

Diff for: modules/sara/main.go

+16-26
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,25 @@ package sara
2121

2222
import (
2323
"fmt"
24-
"github.com/arduino/FirmwareUpdater/programmers/bossac"
25-
"github.com/arduino/FirmwareUpdater/utils/context"
2624
"io/ioutil"
2725
"log"
2826
"strconv"
2927
"time"
28+
29+
"github.com/arduino/FirmwareUpdater/programmers/bossac"
30+
"github.com/arduino/FirmwareUpdater/utils/context"
3031
)
3132

3233
var f *Flasher
3334
var payloadSize uint16
3435
var programmer context.Programmer
3536

36-
func Run(ctx context.Context) {
37-
38-
var err error
39-
programmer = &bossac.Bossac{}
37+
func Run(ctx *context.Context) {
38+
programmer := bossac.NewBossac(ctx)
4039

4140
if ctx.FWUploaderBinary != "" {
4241
log.Println("Flashing firmware uploader sara")
43-
if ctx.BinaryToRestore == "" {
44-
ctx.BinaryToRestore, err = programmer.DumpAndFlash(&ctx, ctx.FWUploaderBinary)
45-
} else {
46-
err = programmer.Flash(&ctx, ctx.FWUploaderBinary)
47-
}
48-
if err != nil {
42+
if err := programmer.Flash(ctx.FWUploaderBinary); err != nil {
4943
log.Fatal(err)
5044
}
5145
}
@@ -56,7 +50,6 @@ func Run(ctx context.Context) {
5650
} else {
5751
f = _f
5852
}
59-
defer f.Close()
6053

6154
time.Sleep(2 * time.Second)
6255

@@ -68,42 +61,39 @@ func Run(ctx context.Context) {
6861

6962
// Check maximum supported payload size
7063
log.Println("Reading actual firmware version")
71-
fwVersion, err := f.GetFwVersion()
72-
if err != nil {
64+
65+
if fwVersion, err := f.GetFwVersion(); err != nil {
7366
log.Fatal(err)
7467
} else {
75-
payloadSize = 128
68+
log.Println("Initial firmware version: " + fwVersion)
7669
}
7770

78-
log.Println("Initial firmware version: " + fwVersion)
71+
payloadSize = 128
7972

8073
if ctx.FirmwareFile != "" {
8174
if err := flashFirmware(ctx); err != nil {
8275
log.Fatal(err)
8376
}
8477
}
8578

86-
fwVersion, err = f.GetFwVersion()
87-
if err != nil {
79+
if fwVersion, err := f.GetFwVersion(); err != nil {
8880
log.Fatal(err)
81+
} else {
82+
log.Println("After applying update firmware version: " + fwVersion)
8983
}
9084

91-
log.Println("After applying update firmware version: " + fwVersion)
85+
f.Close()
9286

9387
if ctx.BinaryToRestore != "" {
9488
log.Println("Restoring previous sketch")
95-
f.Close()
9689

97-
if err := programmer.Flash(&ctx, ctx.BinaryToRestore); err != nil {
90+
if err := programmer.Flash(ctx.BinaryToRestore); err != nil {
9891
log.Fatal(err)
9992
}
100-
101-
// just to allow cleanup via defer()
102-
// f.port, _ = OpenSerial(ctx.PortName)
10393
}
10494
}
10595

106-
func flashFirmware(ctx context.Context) error {
96+
func flashFirmware(ctx *context.Context) error {
10797
FirmwareOffset := 0x0000
10898

10999
log.Printf("Flashing firmware from '%v'", ctx.FirmwareFile)

Diff for: modules/winc/main.go

+8-17
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,13 @@ import (
3535
var f *Flasher
3636
var payloadSize uint16
3737

38-
func Run(ctx context.Context) {
38+
func Run(ctx *context.Context) {
3939

40-
var err error
41-
programmer := &bossac.Bossac{}
40+
programmer := bossac.NewBossac(ctx)
4241

4342
if ctx.FWUploaderBinary != "" {
4443
log.Println("Flashing firmware uploader winc")
45-
if ctx.BinaryToRestore == "" {
46-
ctx.BinaryToRestore, err = programmer.DumpAndFlash(&ctx, ctx.FWUploaderBinary)
47-
} else {
48-
err = programmer.Flash(&ctx, ctx.FWUploaderBinary)
49-
}
50-
if err != nil {
44+
if err := programmer.Flash(ctx.FWUploaderBinary); err != nil {
5145
log.Fatal(err)
5246
}
5347
}
@@ -58,7 +52,6 @@ func Run(ctx context.Context) {
5852
} else {
5953
f = _f
6054
}
61-
defer f.Close()
6255

6356
// Synchronize with programmer
6457
log.Println("Sync with programmer")
@@ -97,16 +90,14 @@ func Run(ctx context.Context) {
9790
}
9891
}
9992

93+
f.Close()
94+
10095
if ctx.BinaryToRestore != "" {
10196
log.Println("Restoring previous sketch")
102-
f.Close()
10397

104-
if err := programmer.Flash(&ctx, ctx.BinaryToRestore); err != nil {
98+
if err := programmer.Flash(ctx.BinaryToRestore); err != nil {
10599
log.Fatal(err)
106100
}
107-
108-
// just to allow cleanup via defer()
109-
// f.port, _ = OpenSerial(ctx.PortName)
110101
}
111102
}
112103

@@ -121,7 +112,7 @@ func readAllFlash() error {
121112
return nil
122113
}
123114

124-
func flashCerts(ctx context.Context) error {
115+
func flashCerts(ctx *context.Context) error {
125116
CertificatesOffset := 0x4000
126117

127118
if ctx.RootCertDir != "" {
@@ -136,7 +127,7 @@ func flashCerts(ctx context.Context) error {
136127
return flashChunk(CertificatesOffset, certificatesData)
137128
}
138129

139-
func flashFirmware(ctx context.Context) error {
130+
func flashFirmware(ctx *context.Context) error {
140131
FirmwareOffset := 0x0000
141132

142133
log.Printf("Flashing firmware from '%v'", ctx.FirmwareFile)

0 commit comments

Comments
 (0)