@@ -45,22 +45,30 @@ func InitCommand() *cobra.Command {
4545 Args : cobra .MaximumNArgs (1 ),
4646 Run : run ,
4747 }
48- uploadCommand .Flags ().StringVarP (& flags .fqbn , "fqbn" , "b" , "" ,
48+ uploadCommand .Flags ().StringVarP (
49+ & flags .fqbn , "fqbn" , "b" , "" ,
4950 "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" , "" ,
5153 "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 ,
5359 "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 ,
5562 "Optional, turns on verbose mode." )
5663 return uploadCommand
5764}
5865
5966var 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
6472}
6573
6674func run (command * cobra.Command , args []string ) {
@@ -81,42 +89,28 @@ func run(command *cobra.Command, args []string) {
8189 os .Exit (commands .ErrBadCall )
8290 }
8391
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
8794 }
88- if fqbn == "" {
95+ if flags . fqbn == "" {
8996 formatter .PrintErrorMessage ("No Fully Qualified Board Name provided." )
9097 os .Exit (commands .ErrBadCall )
9198 }
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 ." )
95102 os .Exit (commands .ErrBadCall )
96103 }
97104
98105 pm := commands .InitPackageManager ()
99106
100- // Find target board
101- board , err := pm .FindBoardWithFQBN (fqbn )
107+ // Find target board and board properties
108+ _ , _ , board , boardProperties , _ , err := pm .ResolveFQBN (fqbn )
102109 if err != nil {
103110 formatter .PrintError (err , "Invalid FQBN." )
104111 os .Exit (commands .ErrBadCall )
105112 }
106113
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-
120114 // Load programmer tool
121115 uploadToolID , have := boardProperties .GetOk ("upload.tool" )
122116 if ! have || uploadToolID == "" {
@@ -194,12 +188,27 @@ func run(command *cobra.Command, args []string) {
194188 }
195189
196190 // 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 )
201194 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 {
203212 if os .IsNotExist (err ) {
204213 formatter .PrintErrorMessage ("Compiled sketch not found. Please compile first." )
205214 } else {
0 commit comments