@@ -45,22 +45,30 @@ func InitCommand() *cobra.Command {
45
45
Args : cobra .MaximumNArgs (1 ),
46
46
Run : run ,
47
47
}
48
- uploadCommand .Flags ().StringVarP (& flags .fqbn , "fqbn" , "b" , "" ,
48
+ uploadCommand .Flags ().StringVarP (
49
+ & flags .fqbn , "fqbn" , "b" , "" ,
49
50
"Fully Qualified Board Name, e.g.: arduino:avr:uno" )
50
- uploadCommand .Flags ().StringVarP (& flags .port , "port" , "p" , "" ,
51
+ uploadCommand .Flags ().StringVarP (
52
+ & flags .port , "port" , "p" , "" ,
51
53
"Upload port, e.g.: COM10 or /dev/ttyACM0" )
52
- uploadCommand .Flags ().BoolVarP (& flags .verify , "verify" , "t" , false ,
54
+ uploadCommand .Flags ().StringVarP (
55
+ & flags .importFile , "input" , "i" , "" ,
56
+ "Input file to be uploaded." )
57
+ uploadCommand .Flags ().BoolVarP (
58
+ & flags .verify , "verify" , "t" , false ,
53
59
"Verify uploaded binary after the upload." )
54
- uploadCommand .Flags ().BoolVarP (& flags .verbose , "verbose" , "v" , false ,
60
+ uploadCommand .Flags ().BoolVarP (
61
+ & flags .verbose , "verbose" , "v" , false ,
55
62
"Optional, turns on verbose mode." )
56
63
return uploadCommand
57
64
}
58
65
59
66
var flags struct {
60
- fqbn string
61
- port string
62
- verbose bool
63
- verify bool
67
+ fqbn string
68
+ port string
69
+ verbose bool
70
+ verify bool
71
+ importFile string
64
72
}
65
73
66
74
func run (command * cobra.Command , args []string ) {
@@ -81,42 +89,28 @@ func run(command *cobra.Command, args []string) {
81
89
os .Exit (commands .ErrBadCall )
82
90
}
83
91
84
- fqbn := flags .fqbn
85
- if fqbn == "" && sketch != nil {
86
- fqbn = sketch .Metadata .CPU .Fqbn
92
+ if flags .fqbn == "" && sketch != nil {
93
+ flags .fqbn = sketch .Metadata .CPU .Fqbn
87
94
}
88
- if fqbn == "" {
95
+ if flags . fqbn == "" {
89
96
formatter .PrintErrorMessage ("No Fully Qualified Board Name provided." )
90
97
os .Exit (commands .ErrBadCall )
91
98
}
92
- fqbnParts := strings . Split ( fqbn , ":" )
93
- if len ( fqbnParts ) < 3 || len ( fqbnParts ) > 4 {
94
- formatter .PrintErrorMessage ( "Fully Qualified Board Name has incorrect format ." )
99
+ fqbn , err := cores . ParseFQBN ( flags . fqbn )
100
+ if err != nil {
101
+ formatter .PrintError ( err , "Invalid FQBN ." )
95
102
os .Exit (commands .ErrBadCall )
96
103
}
97
104
98
105
pm := commands .InitPackageManager ()
99
106
100
- // Find target board
101
- board , err := pm .FindBoardWithFQBN (fqbn )
107
+ // Find target board and board properties
108
+ _ , _ , board , boardProperties , _ , err := pm .ResolveFQBN (fqbn )
102
109
if err != nil {
103
110
formatter .PrintError (err , "Invalid FQBN." )
104
111
os .Exit (commands .ErrBadCall )
105
112
}
106
113
107
- // Create board configuration
108
- var boardProperties * properties.Map
109
- if len (fqbnParts ) == 3 {
110
- boardProperties = board .Properties
111
- } else {
112
- if props , err := board .GeneratePropertiesForConfiguration (fqbnParts [3 ]); err != nil {
113
- formatter .PrintError (err , "Invalid FQBN." )
114
- os .Exit (commands .ErrBadCall )
115
- } else {
116
- boardProperties = props
117
- }
118
- }
119
-
120
114
// Load programmer tool
121
115
uploadToolID , have := boardProperties .GetOk ("upload.tool" )
122
116
if ! have || uploadToolID == "" {
@@ -194,12 +188,27 @@ func run(command *cobra.Command, args []string) {
194
188
}
195
189
196
190
// Set path to compiled binary
197
- // FIXME: refactor this should be made into a function
198
- fqbn = strings .Replace (fqbn , ":" , "." , - 1 )
199
- uploadProperties .Set ("build.path" , sketch .FullPath )
200
- uploadProperties .Set ("build.project_name" , sketch .Name + "." + fqbn )
191
+ // Make the filename without the FQBN configs part
192
+ fqbn .Configs = properties .NewMap ()
193
+ fqbnSuffix := strings .Replace (fqbn .String (), ":" , "." , - 1 )
201
194
ext := filepath .Ext (uploadProperties .ExpandPropsInString ("{recipe.output.tmp_file}" ))
202
- if _ , err := os .Stat (filepath .Join (sketch .FullPath , sketch .Name + "." + fqbn + ext )); err != nil {
195
+
196
+ var importPath * paths.Path
197
+ var importFile string
198
+ if flags .importFile == "" {
199
+ importPath = paths .New (sketch .FullPath )
200
+ importFile = sketch .Name + "." + fqbnSuffix
201
+ } else {
202
+ importPath = paths .New (flags .importFile ).Parent ()
203
+ importFile = paths .New (flags .importFile ).Base ()
204
+ if strings .HasSuffix (importFile , ext ) {
205
+ importFile = importFile [:len (importFile )- len (ext )]
206
+ }
207
+ }
208
+
209
+ uploadProperties .SetPath ("build.path" , importPath )
210
+ uploadProperties .Set ("build.project_name" , importFile )
211
+ if _ , err := os .Stat (filepath .Join (sketch .FullPath , importFile + ext )); err != nil {
203
212
if os .IsNotExist (err ) {
204
213
formatter .PrintErrorMessage ("Compiled sketch not found. Please compile first." )
205
214
} else {
0 commit comments