@@ -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
}
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4