@@ -36,19 +36,19 @@ import (
36
36
"regexp"
37
37
"time"
38
38
39
- "github.com/bcmi-labs/arduino-cli/cores"
40
- "github.com/bcmi-labs/arduino-cli/cores/packagemanager"
41
-
42
39
discovery "github.com/arduino/board-discovery"
43
40
"github.com/bcmi-labs/arduino-cli/commands"
44
41
"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"
45
44
"github.com/bcmi-labs/arduino-modules/sketches"
46
45
"github.com/sirupsen/logrus"
47
46
"github.com/spf13/cobra"
48
47
)
49
48
50
49
var validSerialBoardURIRegexp = regexp .MustCompile ("(serial|tty)://.+" )
51
50
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 (".+:.+:.+" )
52
52
53
53
func init () {
54
54
command .AddCommand (attachCommand )
@@ -62,7 +62,7 @@ var attachFlags struct {
62
62
}
63
63
64
64
var attachCommand = & cobra.Command {
65
- Use : "attach <port> [sketchPath]" ,
65
+ Use : "attach <port>|<FQBN> [sketchPath]" ,
66
66
Short : "Attaches a sketch to a board." ,
67
67
Long : "Attaches a sketch to a board." ,
68
68
Example : "arduino board attach serial:///dev/tty/ACM0" ,
@@ -82,17 +82,10 @@ func runAttachCommand(cmd *cobra.Command, args []string) {
82
82
os .Exit (commands .ErrGeneric )
83
83
}
84
84
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
89
87
}
90
88
91
- monitor := discovery .New (time .Second )
92
- monitor .Start ()
93
-
94
- time .Sleep (duration )
95
-
96
89
pm := commands .InitPackageManager ()
97
90
if err = pm .LoadHardware (); err != nil {
98
91
formatter .PrintError (err , "Error loading hardware packages." )
@@ -108,32 +101,55 @@ func runAttachCommand(cmd *cobra.Command, args []string) {
108
101
var findBoardFunc func (* packagemanager.PackageManager , * discovery.Monitor , * url.URL ) * cores.Board
109
102
var Type string
110
103
111
- if validSerialBoardURIRegexp .Match ([]byte (boardURI )) {
104
+ fqbn := ""
105
+ if validFQBN .MatchString (boardURI ) {
106
+ fqbn = boardURI
107
+ } else if validSerialBoardURIRegexp .MatchString (boardURI ) {
112
108
findBoardFunc = findSerialConnectedBoard
113
109
Type = "serial"
114
- } else if validNetworkBoardURIRegexp .Match ([] byte ( boardURI ) ) {
110
+ } else if validNetworkBoardURIRegexp .MatchString ( boardURI ) {
115
111
findBoardFunc = findNetworkConnectedBoard
116
112
Type = "network"
117
113
} else {
118
114
formatter .PrintErrorMessage ("Invalid device port type provided. Accepted types are: serial://, tty://, http://, https://, tcp://, udp://." )
119
115
os .Exit (commands .ErrBadCall )
120
116
}
121
117
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 ())
126
136
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
+ }
131
147
}
132
148
err = sketch .ExportMetadata ()
133
149
if err != nil {
134
150
formatter .PrintError (err , "Cannot export sketch metadata." )
135
151
}
136
- formatter .PrintResult ("BOARD ATTACHED." )
152
+ formatter .PrintResult ("Selected fqbn: " + fqbn )
137
153
}
138
154
139
155
// FIXME: Those should probably go in a "BoardManager" pkg or something
@@ -151,7 +167,7 @@ func findSerialConnectedBoard(pm *packagemanager.PackageManager, monitor *discov
151
167
}
152
168
}
153
169
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 :-( " )
155
171
return nil
156
172
}
157
173
0 commit comments