Skip to content

Commit 6f6327e

Browse files
committed
Allow board attach with FQBN
1 parent d61e988 commit 6f6327e

File tree

1 file changed

+41
-25
lines changed

1 file changed

+41
-25
lines changed

commands/board/attach.go

+41-25
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,19 @@ import (
3636
"regexp"
3737
"time"
3838

39-
"github.com/bcmi-labs/arduino-cli/cores"
40-
"github.com/bcmi-labs/arduino-cli/cores/packagemanager"
41-
4239
discovery "github.com/arduino/board-discovery"
4340
"github.com/bcmi-labs/arduino-cli/commands"
4441
"github.com/bcmi-labs/arduino-cli/common/formatter"
42+
"github.com/bcmi-labs/arduino-cli/cores"
43+
"github.com/bcmi-labs/arduino-cli/cores/packagemanager"
4544
"github.com/bcmi-labs/arduino-modules/sketches"
4645
"github.com/sirupsen/logrus"
4746
"github.com/spf13/cobra"
4847
)
4948

5049
var validSerialBoardURIRegexp = regexp.MustCompile("(serial|tty)://.+")
5150
var validNetworkBoardURIRegexp = regexp.MustCompile("(http(s)?|(tc|ud)p)://[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}:[0-9]{1,5}")
51+
var validFQBN = regexp.MustCompile(".+:.+:.+")
5252

5353
func init() {
5454
command.AddCommand(attachCommand)
@@ -62,7 +62,7 @@ var attachFlags struct {
6262
}
6363

6464
var attachCommand = &cobra.Command{
65-
Use: "attach <port> [sketchPath]",
65+
Use: "attach <port>|<FQBN> [sketchPath]",
6666
Short: "Attaches a sketch to a board.",
6767
Long: "Attaches a sketch to a board.",
6868
Example: "arduino board attach serial:///dev/tty/ACM0",
@@ -82,17 +82,10 @@ func runAttachCommand(cmd *cobra.Command, args []string) {
8282
os.Exit(commands.ErrGeneric)
8383
}
8484

85-
duration, err := time.ParseDuration(attachFlags.searchTimeout)
86-
if err != nil {
87-
logrus.WithError(err).Warnf("Invalid interval `%s` provided, using default (5s).", attachFlags.searchTimeout)
88-
duration = time.Second * 5
85+
if !validFQBN.MatchString(boardURI) && boardURI[:6] != "serial" {
86+
boardURI = "serial://" + boardURI
8987
}
9088

91-
monitor := discovery.New(time.Second)
92-
monitor.Start()
93-
94-
time.Sleep(duration)
95-
9689
pm := commands.InitPackageManager()
9790
if err = pm.LoadHardware(); err != nil {
9891
formatter.PrintError(err, "Error loading hardware packages.")
@@ -108,32 +101,55 @@ func runAttachCommand(cmd *cobra.Command, args []string) {
108101
var findBoardFunc func(*packagemanager.PackageManager, *discovery.Monitor, *url.URL) *cores.Board
109102
var Type string
110103

111-
if validSerialBoardURIRegexp.Match([]byte(boardURI)) {
104+
fqbn := ""
105+
if validFQBN.MatchString(boardURI) {
106+
fqbn = boardURI
107+
} else if validSerialBoardURIRegexp.MatchString(boardURI) {
112108
findBoardFunc = findSerialConnectedBoard
113109
Type = "serial"
114-
} else if validNetworkBoardURIRegexp.Match([]byte(boardURI)) {
110+
} else if validNetworkBoardURIRegexp.MatchString(boardURI) {
115111
findBoardFunc = findNetworkConnectedBoard
116112
Type = "network"
117113
} else {
118114
formatter.PrintErrorMessage("Invalid device port type provided. Accepted types are: serial://, tty://, http://, https://, tcp://, udp://.")
119115
os.Exit(commands.ErrBadCall)
120116
}
121117

122-
// TODO: Handle the case when no board is found.
123-
board := findBoardFunc(pm, monitor, deviceURI)
124-
formatter.Print("SUPPORTED BOARD FOUND:")
125-
formatter.Print(board.Name())
118+
if fqbn == "" {
119+
duration, err := time.ParseDuration(attachFlags.searchTimeout)
120+
if err != nil {
121+
logrus.WithError(err).Warnf("Invalid interval `%s` provided, using default (5s).", attachFlags.searchTimeout)
122+
duration = time.Second * 5
123+
}
124+
125+
monitor := discovery.New(time.Second)
126+
monitor.Start()
127+
128+
time.Sleep(duration)
129+
130+
// TODO: Handle the case when no board is found.
131+
board := findBoardFunc(pm, monitor, deviceURI)
132+
if board == nil {
133+
os.Exit(commands.ErrGeneric)
134+
}
135+
formatter.Print("Board found: " + board.Name())
126136

127-
sketch.Metadata.CPU = sketches.MetadataCPU{
128-
Fqbn: board.FQBN(),
129-
Name: board.Name(),
130-
Type: Type,
137+
sketch.Metadata.CPU = sketches.MetadataCPU{
138+
Fqbn: board.FQBN(),
139+
Name: board.Name(),
140+
Type: Type,
141+
}
142+
fqbn = board.FQBN()
143+
} else {
144+
sketch.Metadata.CPU = sketches.MetadataCPU{
145+
Fqbn: fqbn,
146+
}
131147
}
132148
err = sketch.ExportMetadata()
133149
if err != nil {
134150
formatter.PrintError(err, "Cannot export sketch metadata.")
135151
}
136-
formatter.PrintResult("BOARD ATTACHED.")
152+
formatter.PrintResult("Selected fqbn: " + fqbn)
137153
}
138154

139155
// FIXME: Those should probably go in a "BoardManager" pkg or something
@@ -151,7 +167,7 @@ func findSerialConnectedBoard(pm *packagemanager.PackageManager, monitor *discov
151167
}
152168
}
153169
if !found {
154-
formatter.PrintErrorMessage("No Supported board has been found at the specified board URI.")
170+
formatter.PrintErrorMessage("Sorry, no Supported board has been found at the specified board URI :-(")
155171
return nil
156172
}
157173

0 commit comments

Comments
 (0)