@@ -123,24 +123,24 @@ func getUserFields(toolID string, platformRelease *cores.PlatformRelease) []*rpc
123123}
124124
125125// Upload FIXMEDOC
126- func Upload (ctx context.Context , req * rpc.UploadRequest , outStream io.Writer , errStream io.Writer ) error {
126+ func Upload (ctx context.Context , req * rpc.UploadRequest , outStream io.Writer , errStream io.Writer ) ( * rpc. UploadResult , error ) {
127127 logrus .Tracef ("Upload %s on %s started" , req .GetSketchPath (), req .GetFqbn ())
128128
129129 // TODO: make a generic function to extract sketch from request
130130 // and remove duplication in commands/compile.go
131131 sketchPath := paths .New (req .GetSketchPath ())
132132 sk , err := sketch .New (sketchPath )
133133 if err != nil && req .GetImportDir () == "" && req .GetImportFile () == "" {
134- return & arduino.CantOpenSketchError {Cause : err }
134+ return nil , & arduino.CantOpenSketchError {Cause : err }
135135 }
136136
137137 pme , release := commands .GetPackageManagerExplorer (req )
138138 if pme == nil {
139- return & arduino.InvalidInstanceError {}
139+ return nil , & arduino.InvalidInstanceError {}
140140 }
141141 defer release ()
142142
143- if err := runProgramAction (
143+ updatedPort , err := runProgramAction (
144144 pme ,
145145 sk ,
146146 req .GetImportFile (),
@@ -155,11 +155,14 @@ func Upload(ctx context.Context, req *rpc.UploadRequest, outStream io.Writer, er
155155 errStream ,
156156 req .GetDryRun (),
157157 req .GetUserFields (),
158- ); err != nil {
159- return err
158+ )
159+ if err != nil {
160+ return nil , err
160161 }
161162
162- return nil
163+ return & rpc.UploadResult {
164+ UpdatedUploadPort : updatedPort ,
165+ }, nil
163166}
164167
165168// UsingProgrammer FIXMEDOC
@@ -169,7 +172,7 @@ func UsingProgrammer(ctx context.Context, req *rpc.UploadUsingProgrammerRequest,
169172 if req .GetProgrammer () == "" {
170173 return & arduino.MissingProgrammerError {}
171174 }
172- err := Upload (ctx , & rpc.UploadRequest {
175+ _ , err := Upload (ctx , & rpc.UploadRequest {
173176 Instance : req .GetInstance (),
174177 SketchPath : req .GetSketchPath (),
175178 ImportFile : req .GetImportFile (),
@@ -190,10 +193,10 @@ func runProgramAction(pme *packagemanager.Explorer,
190193 programmerID string ,
191194 verbose , verify , burnBootloader bool ,
192195 outStream , errStream io.Writer ,
193- dryRun bool , userFields map [string ]string ) error {
196+ dryRun bool , userFields map [string ]string ) ( * rpc. Port , error ) {
194197
195198 if burnBootloader && programmerID == "" {
196- return & arduino.MissingProgrammerError {}
199+ return nil , & arduino.MissingProgrammerError {}
197200 }
198201 if port == nil || (port .Address == "" && port .Protocol == "" ) {
199202 // For no-port uploads use "default" protocol
@@ -203,19 +206,19 @@ func runProgramAction(pme *packagemanager.Explorer,
203206
204207 fqbn , err := cores .ParseFQBN (fqbnIn )
205208 if err != nil {
206- return & arduino.InvalidFQBNError {Cause : err }
209+ return nil , & arduino.InvalidFQBNError {Cause : err }
207210 }
208211 logrus .WithField ("fqbn" , fqbn ).Tracef ("Detected FQBN" )
209212
210213 // Find target board and board properties
211214 _ , boardPlatform , board , boardProperties , buildPlatform , err := pme .ResolveFQBN (fqbn )
212215 if boardPlatform == nil {
213- return & arduino.PlatformNotFoundError {
216+ return nil , & arduino.PlatformNotFoundError {
214217 Platform : fmt .Sprintf ("%s:%s" , fqbn .Package , fqbn .PlatformArch ),
215218 Cause : err ,
216219 }
217220 } else if err != nil {
218- return & arduino.UnknownFQBNError {Cause : err }
221+ return nil , & arduino.UnknownFQBNError {Cause : err }
219222 }
220223 logrus .
221224 WithField ("boardPlatform" , boardPlatform ).
@@ -232,7 +235,7 @@ func runProgramAction(pme *packagemanager.Explorer,
232235 programmer = buildPlatform .Programmers [programmerID ]
233236 }
234237 if programmer == nil {
235- return & arduino.ProgrammerNotFoundError {Programmer : programmerID }
238+ return nil , & arduino.ProgrammerNotFoundError {Programmer : programmerID }
236239 }
237240 }
238241
@@ -253,7 +256,7 @@ func runProgramAction(pme *packagemanager.Explorer,
253256 }
254257 uploadToolID , err := getToolID (props , action , port .Protocol )
255258 if err != nil {
256- return err
259+ return nil , err
257260 }
258261
259262 var uploadToolPlatform * cores.PlatformRelease
@@ -268,7 +271,7 @@ func runProgramAction(pme *packagemanager.Explorer,
268271 Trace ("Upload tool" )
269272
270273 if split := strings .Split (uploadToolID , ":" ); len (split ) > 2 {
271- return & arduino.InvalidPlatformPropertyError {
274+ return nil , & arduino.InvalidPlatformPropertyError {
272275 Property : fmt .Sprintf ("%s.tool.%s" , action , port .Protocol ), // TODO: Can be done better, maybe inline getToolID(...)
273276 Value : uploadToolID }
274277 } else if len (split ) == 2 {
@@ -277,12 +280,12 @@ func runProgramAction(pme *packagemanager.Explorer,
277280 PlatformArchitecture : boardPlatform .Platform .Architecture ,
278281 })
279282 if p == nil {
280- return & arduino.PlatformNotFoundError {Platform : split [0 ] + ":" + boardPlatform .Platform .Architecture }
283+ return nil , & arduino.PlatformNotFoundError {Platform : split [0 ] + ":" + boardPlatform .Platform .Architecture }
281284 }
282285 uploadToolID = split [1 ]
283286 uploadToolPlatform = pme .GetInstalledPlatformRelease (p )
284287 if uploadToolPlatform == nil {
285- return & arduino.PlatformNotFoundError {Platform : split [0 ] + ":" + boardPlatform .Platform .Architecture }
288+ return nil , & arduino.PlatformNotFoundError {Platform : split [0 ] + ":" + boardPlatform .Platform .Architecture }
286289 }
287290 }
288291
@@ -309,7 +312,7 @@ func runProgramAction(pme *packagemanager.Explorer,
309312 }
310313
311314 if ! uploadProperties .ContainsKey ("upload.protocol" ) && programmer == nil {
312- return & arduino.ProgrammerRequiredForUploadError {}
315+ return nil , & arduino.ProgrammerRequiredForUploadError {}
313316 }
314317
315318 // Set properties for verbose upload
@@ -357,13 +360,13 @@ func runProgramAction(pme *packagemanager.Explorer,
357360 if ! burnBootloader {
358361 importPath , sketchName , err := determineBuildPathAndSketchName (importFile , importDir , sk , fqbn )
359362 if err != nil {
360- return & arduino.NotFoundError {Message : tr ("Error finding build artifacts" ), Cause : err }
363+ return nil , & arduino.NotFoundError {Message : tr ("Error finding build artifacts" ), Cause : err }
361364 }
362365 if ! importPath .Exist () {
363- return & arduino.NotFoundError {Message : tr ("Compiled sketch not found in %s" , importPath )}
366+ return nil , & arduino.NotFoundError {Message : tr ("Compiled sketch not found in %s" , importPath )}
364367 }
365368 if ! importPath .IsDir () {
366- return & arduino.NotFoundError {Message : tr ("Expected compiled sketch in directory %s, but is a file instead" , importPath )}
369+ return nil , & arduino.NotFoundError {Message : tr ("Expected compiled sketch in directory %s, but is a file instead" , importPath )}
367370 }
368371 uploadProperties .SetPath ("build.path" , importPath )
369372 uploadProperties .Set ("build.project_name" , sketchName )
@@ -466,22 +469,28 @@ func runProgramAction(pme *packagemanager.Explorer,
466469 toolEnv := pme .GetEnvVarsForSpawnedProcess ()
467470 if burnBootloader {
468471 if err := runTool ("erase.pattern" , uploadProperties , outStream , errStream , verbose , dryRun , toolEnv ); err != nil {
469- return & arduino.FailedUploadError {Message : tr ("Failed chip erase" ), Cause : err }
472+ return nil , & arduino.FailedUploadError {Message : tr ("Failed chip erase" ), Cause : err }
470473 }
471474 if err := runTool ("bootloader.pattern" , uploadProperties , outStream , errStream , verbose , dryRun , toolEnv ); err != nil {
472- return & arduino.FailedUploadError {Message : tr ("Failed to burn bootloader" ), Cause : err }
475+ return nil , & arduino.FailedUploadError {Message : tr ("Failed to burn bootloader" ), Cause : err }
473476 }
474477 } else if programmer != nil {
475478 if err := runTool ("program.pattern" , uploadProperties , outStream , errStream , verbose , dryRun , toolEnv ); err != nil {
476- return & arduino.FailedUploadError {Message : tr ("Failed programming" ), Cause : err }
479+ return nil , & arduino.FailedUploadError {Message : tr ("Failed programming" ), Cause : err }
477480 }
478481 } else {
479482 if err := runTool ("upload.pattern" , uploadProperties , outStream , errStream , verbose , dryRun , toolEnv ); err != nil {
480- return & arduino.FailedUploadError {Message : tr ("Failed uploading" ), Cause : err }
483+ return nil , & arduino.FailedUploadError {Message : tr ("Failed uploading" ), Cause : err }
481484 }
482485 }
483486
484487 logrus .Tracef ("Upload successful" )
488+ return nil , nil // TODO: return new port
489+ }
490+
491+ func detectNewUploadPort (oldPort * rpc.Port ) * rpc.Port {
492+ logrus .Tracef ("Detecting new board port" )
493+ // TODO
485494 return nil
486495}
487496
0 commit comments