@@ -123,24 +123,24 @@ func getUserFields(toolID string, platformRelease *cores.PlatformRelease) []*rpc
123
123
}
124
124
125
125
// 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 ) {
127
127
logrus .Tracef ("Upload %s on %s started" , req .GetSketchPath (), req .GetFqbn ())
128
128
129
129
// TODO: make a generic function to extract sketch from request
130
130
// and remove duplication in commands/compile.go
131
131
sketchPath := paths .New (req .GetSketchPath ())
132
132
sk , err := sketch .New (sketchPath )
133
133
if err != nil && req .GetImportDir () == "" && req .GetImportFile () == "" {
134
- return & arduino.CantOpenSketchError {Cause : err }
134
+ return nil , & arduino.CantOpenSketchError {Cause : err }
135
135
}
136
136
137
137
pme , release := commands .GetPackageManagerExplorer (req )
138
138
if pme == nil {
139
- return & arduino.InvalidInstanceError {}
139
+ return nil , & arduino.InvalidInstanceError {}
140
140
}
141
141
defer release ()
142
142
143
- if err := runProgramAction (
143
+ updatedPort , err := runProgramAction (
144
144
pme ,
145
145
sk ,
146
146
req .GetImportFile (),
@@ -155,11 +155,14 @@ func Upload(ctx context.Context, req *rpc.UploadRequest, outStream io.Writer, er
155
155
errStream ,
156
156
req .GetDryRun (),
157
157
req .GetUserFields (),
158
- ); err != nil {
159
- return err
158
+ )
159
+ if err != nil {
160
+ return nil , err
160
161
}
161
162
162
- return nil
163
+ return & rpc.UploadResult {
164
+ UpdatedUploadPort : updatedPort ,
165
+ }, nil
163
166
}
164
167
165
168
// UsingProgrammer FIXMEDOC
@@ -169,7 +172,7 @@ func UsingProgrammer(ctx context.Context, req *rpc.UploadUsingProgrammerRequest,
169
172
if req .GetProgrammer () == "" {
170
173
return & arduino.MissingProgrammerError {}
171
174
}
172
- err := Upload (ctx , & rpc.UploadRequest {
175
+ _ , err := Upload (ctx , & rpc.UploadRequest {
173
176
Instance : req .GetInstance (),
174
177
SketchPath : req .GetSketchPath (),
175
178
ImportFile : req .GetImportFile (),
@@ -190,10 +193,10 @@ func runProgramAction(pme *packagemanager.Explorer,
190
193
programmerID string ,
191
194
verbose , verify , burnBootloader bool ,
192
195
outStream , errStream io.Writer ,
193
- dryRun bool , userFields map [string ]string ) error {
196
+ dryRun bool , userFields map [string ]string ) ( * rpc. Port , error ) {
194
197
195
198
if burnBootloader && programmerID == "" {
196
- return & arduino.MissingProgrammerError {}
199
+ return nil , & arduino.MissingProgrammerError {}
197
200
}
198
201
if port == nil || (port .Address == "" && port .Protocol == "" ) {
199
202
// For no-port uploads use "default" protocol
@@ -203,19 +206,19 @@ func runProgramAction(pme *packagemanager.Explorer,
203
206
204
207
fqbn , err := cores .ParseFQBN (fqbnIn )
205
208
if err != nil {
206
- return & arduino.InvalidFQBNError {Cause : err }
209
+ return nil , & arduino.InvalidFQBNError {Cause : err }
207
210
}
208
211
logrus .WithField ("fqbn" , fqbn ).Tracef ("Detected FQBN" )
209
212
210
213
// Find target board and board properties
211
214
_ , boardPlatform , board , boardProperties , buildPlatform , err := pme .ResolveFQBN (fqbn )
212
215
if boardPlatform == nil {
213
- return & arduino.PlatformNotFoundError {
216
+ return nil , & arduino.PlatformNotFoundError {
214
217
Platform : fmt .Sprintf ("%s:%s" , fqbn .Package , fqbn .PlatformArch ),
215
218
Cause : err ,
216
219
}
217
220
} else if err != nil {
218
- return & arduino.UnknownFQBNError {Cause : err }
221
+ return nil , & arduino.UnknownFQBNError {Cause : err }
219
222
}
220
223
logrus .
221
224
WithField ("boardPlatform" , boardPlatform ).
@@ -232,7 +235,7 @@ func runProgramAction(pme *packagemanager.Explorer,
232
235
programmer = buildPlatform .Programmers [programmerID ]
233
236
}
234
237
if programmer == nil {
235
- return & arduino.ProgrammerNotFoundError {Programmer : programmerID }
238
+ return nil , & arduino.ProgrammerNotFoundError {Programmer : programmerID }
236
239
}
237
240
}
238
241
@@ -253,7 +256,7 @@ func runProgramAction(pme *packagemanager.Explorer,
253
256
}
254
257
uploadToolID , err := getToolID (props , action , port .Protocol )
255
258
if err != nil {
256
- return err
259
+ return nil , err
257
260
}
258
261
259
262
var uploadToolPlatform * cores.PlatformRelease
@@ -268,7 +271,7 @@ func runProgramAction(pme *packagemanager.Explorer,
268
271
Trace ("Upload tool" )
269
272
270
273
if split := strings .Split (uploadToolID , ":" ); len (split ) > 2 {
271
- return & arduino.InvalidPlatformPropertyError {
274
+ return nil , & arduino.InvalidPlatformPropertyError {
272
275
Property : fmt .Sprintf ("%s.tool.%s" , action , port .Protocol ), // TODO: Can be done better, maybe inline getToolID(...)
273
276
Value : uploadToolID }
274
277
} else if len (split ) == 2 {
@@ -277,12 +280,12 @@ func runProgramAction(pme *packagemanager.Explorer,
277
280
PlatformArchitecture : boardPlatform .Platform .Architecture ,
278
281
})
279
282
if p == nil {
280
- return & arduino.PlatformNotFoundError {Platform : split [0 ] + ":" + boardPlatform .Platform .Architecture }
283
+ return nil , & arduino.PlatformNotFoundError {Platform : split [0 ] + ":" + boardPlatform .Platform .Architecture }
281
284
}
282
285
uploadToolID = split [1 ]
283
286
uploadToolPlatform = pme .GetInstalledPlatformRelease (p )
284
287
if uploadToolPlatform == nil {
285
- return & arduino.PlatformNotFoundError {Platform : split [0 ] + ":" + boardPlatform .Platform .Architecture }
288
+ return nil , & arduino.PlatformNotFoundError {Platform : split [0 ] + ":" + boardPlatform .Platform .Architecture }
286
289
}
287
290
}
288
291
@@ -309,7 +312,7 @@ func runProgramAction(pme *packagemanager.Explorer,
309
312
}
310
313
311
314
if ! uploadProperties .ContainsKey ("upload.protocol" ) && programmer == nil {
312
- return & arduino.ProgrammerRequiredForUploadError {}
315
+ return nil , & arduino.ProgrammerRequiredForUploadError {}
313
316
}
314
317
315
318
// Set properties for verbose upload
@@ -357,13 +360,13 @@ func runProgramAction(pme *packagemanager.Explorer,
357
360
if ! burnBootloader {
358
361
importPath , sketchName , err := determineBuildPathAndSketchName (importFile , importDir , sk , fqbn )
359
362
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 }
361
364
}
362
365
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 )}
364
367
}
365
368
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 )}
367
370
}
368
371
uploadProperties .SetPath ("build.path" , importPath )
369
372
uploadProperties .Set ("build.project_name" , sketchName )
@@ -466,22 +469,28 @@ func runProgramAction(pme *packagemanager.Explorer,
466
469
toolEnv := pme .GetEnvVarsForSpawnedProcess ()
467
470
if burnBootloader {
468
471
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 }
470
473
}
471
474
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 }
473
476
}
474
477
} else if programmer != nil {
475
478
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 }
477
480
}
478
481
} else {
479
482
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 }
481
484
}
482
485
}
483
486
484
487
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
485
494
return nil
486
495
}
487
496
0 commit comments