@@ -37,23 +37,25 @@ import (
37
37
"github.com/pkg/errors"
38
38
"github.com/sirupsen/logrus"
39
39
"go.bug.st/serial"
40
+ "google.golang.org/grpc/codes"
41
+ "google.golang.org/grpc/status"
40
42
)
41
43
42
44
// Upload FIXMEDOC
43
- func Upload (ctx context.Context , req * rpc.UploadRequest , outStream io.Writer , errStream io.Writer ) (* rpc.UploadResponse , error ) {
45
+ func Upload (ctx context.Context , req * rpc.UploadRequest , outStream io.Writer , errStream io.Writer ) (* rpc.UploadResponse , * status. Status ) {
44
46
logrus .Tracef ("Upload %s on %s started" , req .GetSketchPath (), req .GetFqbn ())
45
47
46
48
// TODO: make a generic function to extract sketch from request
47
49
// and remove duplication in commands/compile.go
48
50
sketchPath := paths .New (req .GetSketchPath ())
49
51
sketch , err := sketches .NewSketchFromPath (sketchPath )
50
52
if err != nil && req .GetImportDir () == "" && req .GetImportFile () == "" {
51
- return nil , fmt . Errorf ( "opening sketch : %s" , err )
53
+ return nil , status . Newf ( codes . InvalidArgument , "Sketch not found : %s" , err )
52
54
}
53
55
54
56
pm := commands .GetPackageManager (req .GetInstance ().GetId ())
55
57
56
- err = runProgramAction (
58
+ return & rpc. UploadResponse {}, runProgramAction (
57
59
pm ,
58
60
sketch ,
59
61
req .GetImportFile (),
@@ -67,18 +69,14 @@ func Upload(ctx context.Context, req *rpc.UploadRequest, outStream io.Writer, er
67
69
outStream ,
68
70
errStream ,
69
71
)
70
- if err != nil {
71
- return nil , err
72
- }
73
- return & rpc.UploadResponse {}, nil
74
72
}
75
73
76
74
// UsingProgrammer FIXMEDOC
77
- func UsingProgrammer (ctx context.Context , req * rpc.UploadUsingProgrammerRequest , outStream io.Writer , errStream io.Writer ) (* rpc.UploadUsingProgrammerResponse , error ) {
75
+ func UsingProgrammer (ctx context.Context , req * rpc.UploadUsingProgrammerRequest , outStream io.Writer , errStream io.Writer ) (* rpc.UploadUsingProgrammerResponse , * status. Status ) {
78
76
logrus .Tracef ("Upload using programmer %s on %s started" , req .GetSketchPath (), req .GetFqbn ())
79
77
80
78
if req .GetProgrammer () == "" {
81
- return nil , errors .New ("programmer not specified" )
79
+ return nil , status .New (codes . InvalidArgument , "Programmer not specified" )
82
80
}
83
81
_ , err := Upload (ctx , & rpc.UploadRequest {
84
82
Instance : req .GetInstance (),
@@ -99,17 +97,17 @@ func runProgramAction(pm *packagemanager.PackageManager,
99
97
importFile , importDir , fqbnIn , port string ,
100
98
programmerID string ,
101
99
verbose , verify , burnBootloader bool ,
102
- outStream , errStream io.Writer ) error {
100
+ outStream , errStream io.Writer ) * status. Status {
103
101
104
102
if burnBootloader && programmerID == "" {
105
- return fmt . Errorf ( "no programmer specified for burning bootloader " )
103
+ return status . New ( codes . InvalidArgument , "Programmer not specified" )
106
104
}
107
105
108
106
// FIXME: make a specification on how a port is specified via command line
109
107
if port == "" && sketch != nil && sketch .Metadata != nil {
110
108
deviceURI , err := url .Parse (sketch .Metadata .CPU .Port )
111
109
if err != nil {
112
- return fmt . Errorf ( "invalid Device URL format: %s" , err )
110
+ return status . Newf ( codes . InvalidArgument , "Invalid Device URL format: %s" , err )
113
111
}
114
112
if deviceURI .Scheme == "serial" {
115
113
port = deviceURI .Host + deviceURI .Path
@@ -121,18 +119,18 @@ func runProgramAction(pm *packagemanager.PackageManager,
121
119
fqbnIn = sketch .Metadata .CPU .Fqbn
122
120
}
123
121
if fqbnIn == "" {
124
- return fmt . Errorf ( "no Fully Qualified Board Name provided" )
122
+ return status . New ( codes . InvalidArgument , "No FQBN ( Fully Qualified Board Name) provided" )
125
123
}
126
124
fqbn , err := cores .ParseFQBN (fqbnIn )
127
125
if err != nil {
128
- return fmt .Errorf ( "incorrect FQBN: %s" , err )
126
+ return status . Newf ( codes . InvalidArgument , fmt .Sprintf ( "Invalid FQBN: %s" , err ) )
129
127
}
130
128
logrus .WithField ("fqbn" , fqbn ).Tracef ("Detected FQBN" )
131
129
132
130
// Find target board and board properties
133
131
_ , boardPlatform , board , boardProperties , buildPlatform , err := pm .ResolveFQBN (fqbn )
134
132
if err != nil {
135
- return fmt . Errorf ( "incorrect FQBN: %s" , err )
133
+ return status . Newf ( codes . InvalidArgument , "Could not resolve FQBN: %s" , err )
136
134
}
137
135
logrus .
138
136
WithField ("boardPlatform" , boardPlatform ).
@@ -149,7 +147,7 @@ func runProgramAction(pm *packagemanager.PackageManager,
149
147
programmer = buildPlatform .Programmers [programmerID ]
150
148
}
151
149
if programmer == nil {
152
- return fmt . Errorf ( "programmer '%s' not available" , programmerID )
150
+ return status . Newf ( codes . InvalidArgument , "Programmer '%s' not available" , programmerID )
153
151
}
154
152
}
155
153
@@ -174,7 +172,7 @@ func runProgramAction(pm *packagemanager.PackageManager,
174
172
if t , ok := props .GetOk (toolProperty ); ok {
175
173
uploadToolID = t
176
174
} else {
177
- return fmt . Errorf ( "cannot get programmer tool: undefined '%s' property" , toolProperty )
175
+ return status . Newf ( codes . FailedPrecondition , "Cannot get programmer tool: undefined '%s' property" , toolProperty )
178
176
}
179
177
}
180
178
@@ -190,7 +188,7 @@ func runProgramAction(pm *packagemanager.PackageManager,
190
188
Trace ("Upload tool" )
191
189
192
190
if split := strings .Split (uploadToolID , ":" ); len (split ) > 2 {
193
- return fmt . Errorf ( "invalid 'upload.tool' property: %s" , uploadToolID )
191
+ return status . Newf ( codes . FailedPrecondition , "Invalid 'upload.tool' property: %s" , uploadToolID )
194
192
} else if len (split ) == 2 {
195
193
uploadToolID = split [1 ]
196
194
uploadToolPlatform = pm .GetInstalledPlatformRelease (
@@ -229,7 +227,10 @@ func runProgramAction(pm *packagemanager.PackageManager,
229
227
}
230
228
231
229
if ! uploadProperties .ContainsKey ("upload.protocol" ) && programmer == nil {
232
- return fmt .Errorf ("a programmer is required to upload for this board" )
230
+ err , _ := status .
231
+ Newf (codes .InvalidArgument , "A programmer is required to upload on this board" ).
232
+ WithDetails (& rpc.UploadError {Code : rpc .UploadError_CODE_PROGRAMMER_REQUIRED_FOR_UPLOAD })
233
+ return err
233
234
}
234
235
235
236
// Set properties for verbose upload
@@ -277,13 +278,13 @@ func runProgramAction(pm *packagemanager.PackageManager,
277
278
if ! burnBootloader {
278
279
importPath , sketchName , err := determineBuildPathAndSketchName (importFile , importDir , sketch , fqbn )
279
280
if err != nil {
280
- return errors . Errorf ( "retrieving build artifacts: %s" , err )
281
+ return status . Newf ( codes . Internal , "Error finding build artifacts: %s" , err )
281
282
}
282
283
if ! importPath .Exist () {
283
- return fmt . Errorf ( "compiled sketch not found in %s" , importPath )
284
+ return status . Newf ( codes . Internal , "Compiled sketch not found in %s" , importPath )
284
285
}
285
286
if ! importPath .IsDir () {
286
- return fmt . Errorf ( "expected compiled sketch in directory %s, but is a file instead" , importPath )
287
+ return status . Newf ( codes . Internal , "Expected compiled sketch in directory %s, but is a file instead" , importPath )
287
288
}
288
289
uploadProperties .SetPath ("build.path" , importPath )
289
290
uploadProperties .Set ("build.project_name" , sketchName )
@@ -296,12 +297,12 @@ func runProgramAction(pm *packagemanager.PackageManager,
296
297
// Perform reset via 1200bps touch if requested
297
298
if uploadProperties .GetBoolean ("upload.use_1200bps_touch" ) {
298
299
if port == "" {
299
- return fmt . Errorf ( "no upload port provided " )
300
+ return status . New ( codes . InvalidArgument , "No upload port specified " )
300
301
}
301
302
302
303
ports , err := serial .GetPortsList ()
303
304
if err != nil {
304
- return fmt . Errorf ( "cannot get serial port list: %s" , err )
305
+ return status . Newf ( codes . Internal , "Cannot get serial port list: %s" , err )
305
306
}
306
307
for _ , p := range ports {
307
308
if p == port {
@@ -327,7 +328,7 @@ func runProgramAction(pm *packagemanager.PackageManager,
327
328
328
329
actualPort , err = serialutils .WaitForNewSerialPortOrDefaultTo (actualPort )
329
330
if err != nil {
330
- return errors . WithMessage ( err , "detecting serial port" )
331
+ return status . Newf ( codes . Internal , "Failed detecting serial port: %s" , err )
331
332
}
332
333
}
333
334
}
@@ -345,18 +346,18 @@ func runProgramAction(pm *packagemanager.PackageManager,
345
346
// Run recipes for upload
346
347
if burnBootloader {
347
348
if err := runTool ("erase.pattern" , uploadProperties , outStream , errStream , verbose ); err != nil {
348
- return fmt . Errorf ( " chip erase error : %s" , err )
349
+ return status . Newf ( codes . Internal , "Failed chip erase: %s" , err )
349
350
}
350
351
if err := runTool ("bootloader.pattern" , uploadProperties , outStream , errStream , verbose ); err != nil {
351
- return fmt . Errorf ( " burn bootloader error : %s" , err )
352
+ return status . Newf ( codes . Internal , "Failed to burn bootloader: %s" , err )
352
353
}
353
354
} else if programmer != nil {
354
355
if err := runTool ("program.pattern" , uploadProperties , outStream , errStream , verbose ); err != nil {
355
- return fmt . Errorf ( "programming error : %s" , err )
356
+ return status . Newf ( codes . Internal , "Failed programming : %s" , err )
356
357
}
357
358
} else {
358
359
if err := runTool ("upload.pattern" , uploadProperties , outStream , errStream , verbose ); err != nil {
359
- return fmt . Errorf ( "uploading error : %s" , err )
360
+ return status . Newf ( codes . Internal , "Failed uploading : %s" , err )
360
361
}
361
362
}
362
363
0 commit comments