Skip to content

Commit 59436ca

Browse files
committed
Added --input flag to 'upload' command.
Also simplified configuration creation for upload command.
1 parent 9170d1f commit 59436ca

File tree

1 file changed

+44
-35
lines changed

1 file changed

+44
-35
lines changed

Diff for: commands/upload/upload.go

+44-35
Original file line numberDiff line numberDiff line change
@@ -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

5966
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
6472
}
6573

6674
func 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

Comments
 (0)