@@ -23,31 +23,27 @@ import (
23
23
"bytes"
24
24
"fmt"
25
25
"os"
26
- "path/filepath"
27
26
"strings"
28
27
"time"
29
28
30
- "github.com/arduino/arduino-cli/arduino/serialutils"
31
29
"github.com/arduino/arduino-cli/cli/errorcodes"
32
30
"github.com/arduino/arduino-cli/cli/feedback"
31
+ "github.com/arduino/arduino-fwuploader/cli/arguments"
32
+ "github.com/arduino/arduino-fwuploader/cli/common"
33
33
"github.com/arduino/arduino-fwuploader/flasher"
34
- "github.com/arduino/arduino-fwuploader/indexes"
35
34
"github.com/arduino/arduino-fwuploader/indexes/download"
36
- programmer "github.com/arduino/arduino-fwuploader/programmers"
37
35
"github.com/arduino/go-paths-helper"
38
- "github.com/arduino/go-properties-orderedmap"
39
36
"github.com/sirupsen/logrus"
40
37
"github.com/spf13/cobra"
41
38
)
42
39
43
40
var (
44
- fqbn string
45
- address string
41
+ commonFlags arguments.Flags
46
42
certificateURLs []string
47
43
certificatePaths []string
48
44
)
49
45
50
- // NewCommand created a new `version ` command
46
+ // NewFlashCommand creates a new `flash ` command
51
47
func NewFlashCommand () * cobra.Command {
52
48
command := & cobra.Command {
53
49
Use : "flash" ,
@@ -58,121 +54,59 @@ func NewFlashCommand() *cobra.Command {
58
54
" " + os .Args [0 ] + " certificates flash -b arduino:samd:mkr1000 -a COM10 -u arduino.cc:443 -u google.cc:443\n " +
59
55
" " + os .Args [0 ] + " certificates flash -b arduino:samd:mkr1000 -a COM10 -f /home/me/VeriSign.cer -f /home/me/Digicert.cer\n " ,
60
56
Args : cobra .NoArgs ,
61
- Run : run ,
57
+ Run : runFlash ,
62
58
}
63
-
64
- command .Flags ().StringVarP (& fqbn , "fqbn" , "b" , "" , "Fully Qualified Board Name, e.g.: arduino:samd:mkr1000, arduino:mbed_nano:nanorp2040connect" )
65
- command .Flags ().StringVarP (& address , "address" , "a" , "" , "Upload port, e.g.: COM10, /dev/ttyACM0" )
59
+ commonFlags .AddToCommand (command )
66
60
command .Flags ().StringSliceVarP (& certificateURLs , "url" , "u" , []string {}, "List of urls to download root certificates, e.g.: arduino.cc:443" )
67
61
command .Flags ().StringSliceVarP (& certificatePaths , "file" , "f" , []string {}, "List of paths to certificate file, e.g.: /home/me/Digicert.cer" )
68
62
return command
69
63
}
70
64
71
- func run (cmd * cobra.Command , args []string ) {
72
- packageIndex , err := indexes .GetPackageIndex ()
73
- if err != nil {
74
- feedback .Errorf ("Can't load package index: %s" , err )
75
- os .Exit (errorcodes .ErrGeneric )
76
- }
65
+ func runFlash (cmd * cobra.Command , args []string ) {
77
66
78
- firmwareIndex , err := indexes .GetFirmwareIndex ()
79
- if err != nil {
80
- feedback .Errorf ("Can't load firmware index: %s" , err )
81
- os .Exit (errorcodes .ErrGeneric )
82
- }
83
-
84
- if fqbn == "" {
85
- feedback .Errorf ("Error during certificates flashing: missing board fqbn" )
86
- os .Exit (errorcodes .ErrBadArgument )
87
- }
88
-
89
- if address == "" {
90
- feedback .Errorf ("Error during certificates flashing: missing board address" )
91
- os .Exit (errorcodes .ErrBadArgument )
92
- }
67
+ packageIndex , firmwareIndex := common .InitIndexes ()
68
+ common .CheckFlags (commonFlags .Fqbn , commonFlags .Address )
69
+ board := common .GetBoard (firmwareIndex , commonFlags .Fqbn )
70
+ uploadToolDir := common .GetUploadToolDir (packageIndex , board )
93
71
94
72
if len (certificateURLs ) == 0 && len (certificatePaths ) == 0 {
95
73
feedback .Errorf ("Error during certificates flashing: no certificates provided" )
96
74
os .Exit (errorcodes .ErrBadArgument )
97
75
}
98
76
99
- board := firmwareIndex .GetBoard (fqbn )
100
- if board == nil {
101
- feedback .Errorf ("Can't find board with %s fqbn" , fqbn )
102
- os .Exit (errorcodes .ErrBadArgument )
103
- }
104
-
105
- toolRelease := indexes .GetToolRelease (packageIndex , board .Uploader )
106
- if toolRelease == nil {
107
- feedback .Errorf ("Error getting upload tool %s for board %s" , board .Uploader , board .Fqbn )
108
- os .Exit (errorcodes .ErrGeneric )
109
- }
110
- uploadToolDir , err := download .DownloadTool (toolRelease )
111
- if err != nil {
112
- feedback .Errorf ("Error downloading tool %s: %s" , board .Uploader , err )
113
- os .Exit (errorcodes .ErrGeneric )
114
- }
115
-
116
- loaderSketchPath , err := download .DownloadLoaderSketch (board .LoaderSketch )
77
+ loaderSketchPath , err := download .DownloadSketch (board .LoaderSketch )
117
78
if err != nil {
118
79
feedback .Errorf ("Error downloading loader sketch from %s: %s" , board .LoaderSketch .URL , err )
119
80
os .Exit (errorcodes .ErrGeneric )
120
81
}
82
+ logrus .Debugf ("loader sketch downloaded in %s" , loaderSketchPath .String ())
121
83
122
84
loaderSketch := strings .ReplaceAll (loaderSketchPath .String (), loaderSketchPath .Ext (), "" )
123
85
124
- // Check if board needs a 1200bps touch for upload
125
- bootloaderPort := address
126
- if board .UploadTouch {
127
- logrus .Info ("Putting board into bootloader mode" )
128
- newUploadPort , err := serialutils .Reset (address , board .UploadWait , nil )
129
- if err != nil {
130
- feedback .Errorf ("Error during certificates flashing: missing board address" )
131
- os .Exit (errorcodes .ErrGeneric )
132
- }
133
- if newUploadPort != "" {
134
- logrus .Infof ("Found port to upload Loader: %s" , newUploadPort )
135
- bootloaderPort = newUploadPort
136
- }
137
- }
138
-
139
- uploaderCommand := board .GetUploaderCommand ()
140
- uploaderCommand = strings .ReplaceAll (uploaderCommand , "{tool_dir}" , filepath .FromSlash (uploadToolDir .String ()))
141
- uploaderCommand = strings .ReplaceAll (uploaderCommand , "{serial.port.file}" , bootloaderPort )
142
- uploaderCommand = strings .ReplaceAll (uploaderCommand , "{loader.sketch}" , loaderSketch )
143
-
144
- commandLine , err := properties .SplitQuotedString (uploaderCommand , "\" " , false )
86
+ programmerOut , programmerErr , err := common .FlashSketch (board , loaderSketch , uploadToolDir , commonFlags .Address )
145
87
if err != nil {
146
- feedback .Errorf (`Error splitting command line "%s": %s` , uploaderCommand , err )
147
- os .Exit (errorcodes .ErrGeneric )
148
- }
149
-
150
- // Flash loader Sketch
151
- programmerOut := new (bytes.Buffer )
152
- programmerErr := new (bytes.Buffer )
153
- if feedback .GetFormat () == feedback .JSON {
154
- err = programmer .Flash (commandLine , programmerOut , programmerErr )
155
- } else {
156
- err = programmer .Flash (commandLine , os .Stdout , os .Stderr )
157
- }
158
- if err != nil {
159
- feedback .Errorf ("Error during certificates flashing: %s" , err )
88
+ feedback .Error (err )
160
89
os .Exit (errorcodes .ErrGeneric )
161
90
}
162
91
163
92
// Wait a bit after flashing the loader sketch for the board to become
164
93
// available again.
94
+ logrus .Debug ("sleeping for 3 sec" )
165
95
time .Sleep (3 * time .Second )
166
96
167
97
// Get flasher depending on which module to use
168
98
var f flasher.Flasher
169
99
moduleName := board .Module
100
+
101
+ // This matches the baudrate used in the FirmwareUpdater.ino sketch
102
+ // https://github.com/arduino-libraries/WiFiNINA/blob/master/examples/Tools/FirmwareUpdater/FirmwareUpdater.ino
103
+ const baudRate = 1000000
170
104
switch moduleName {
171
105
case "NINA" :
172
106
// we use address and not bootloaderPort because the board should not be in bootloader mode
173
- f , err = flasher .NewNinaFlasher (address )
107
+ f , err = flasher .NewNinaFlasher (commonFlags . Address , baudRate , 30 )
174
108
case "WINC1500" :
175
- f , err = flasher .NewWincFlasher (address )
109
+ f , err = flasher .NewWincFlasher (commonFlags . Address , baudRate , 30 )
176
110
default :
177
111
err = fmt .Errorf ("unknown module: %s" , moduleName )
178
112
}
0 commit comments