@@ -16,30 +16,29 @@ import {
16
16
import { UserFieldsDialog } from '../dialogs/user-fields/user-fields-dialog' ;
17
17
import { DisposableCollection , nls } from '@theia/core/lib/common' ;
18
18
import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl' ;
19
+ import { VerifySketch } from './verify-sketch' ;
19
20
20
21
@injectable ( )
21
22
export class UploadSketch extends CoreServiceContribution {
22
23
@inject ( MenuModelRegistry )
23
- protected readonly menuRegistry : MenuModelRegistry ;
24
+ private readonly menuRegistry : MenuModelRegistry ;
24
25
25
26
@inject ( BoardsDataStore )
26
- protected readonly boardsDataStore : BoardsDataStore ;
27
+ private readonly boardsDataStore : BoardsDataStore ;
27
28
28
29
@inject ( BoardsServiceProvider )
29
- protected readonly boardsServiceClientImpl : BoardsServiceProvider ;
30
+ private readonly boardsServiceClientImpl : BoardsServiceProvider ;
30
31
31
32
@inject ( UserFieldsDialog )
32
- protected readonly userFieldsDialog : UserFieldsDialog ;
33
+ private readonly userFieldsDialog : UserFieldsDialog ;
33
34
34
- protected cachedUserFields : Map < string , BoardUserField [ ] > = new Map ( ) ;
35
+ private boardRequiresUserFields = false ;
36
+ private readonly cachedUserFields : Map < string , BoardUserField [ ] > = new Map ( ) ;
37
+ private readonly menuActionsDisposables = new DisposableCollection ( ) ;
35
38
36
- protected readonly onDidChangeEmitter = new Emitter < Readonly < void > > ( ) ;
37
- readonly onDidChange = this . onDidChangeEmitter . event ;
38
-
39
- protected uploadInProgress = false ;
40
- protected boardRequiresUserFields = false ;
41
-
42
- protected readonly menuActionsDisposables = new DisposableCollection ( ) ;
39
+ private readonly onDidChangeEmitter = new Emitter < void > ( ) ;
40
+ private readonly onDidChange = this . onDidChangeEmitter . event ;
41
+ private uploadInProgress = false ;
43
42
44
43
protected override init ( ) : void {
45
44
super . init ( ) ;
@@ -130,7 +129,6 @@ export class UploadSketch extends CoreServiceContribution {
130
129
131
130
override registerMenus ( registry : MenuModelRegistry ) : void {
132
131
this . menuActionsDisposables . dispose ( ) ;
133
-
134
132
this . menuActionsDisposables . push (
135
133
registry . registerMenuAction ( ArduinoMenus . SKETCH__MAIN_GROUP , {
136
134
commandId : UploadSketch . Commands . UPLOAD_SKETCH . id ,
@@ -153,7 +151,7 @@ export class UploadSketch extends CoreServiceContribution {
153
151
new PlaceholderMenuNode (
154
152
ArduinoMenus . SKETCH__MAIN_GROUP ,
155
153
// commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id,
156
- UploadSketch . Commands . UPLOAD_WITH_CONFIGURATION . label ! ,
154
+ UploadSketch . Commands . UPLOAD_WITH_CONFIGURATION . label ,
157
155
{ order : '2' }
158
156
)
159
157
)
@@ -193,13 +191,31 @@ export class UploadSketch extends CoreServiceContribution {
193
191
}
194
192
195
193
async uploadSketch ( usingProgrammer = false ) : Promise < void > {
196
- // even with buttons disabled, better to double check if an upload is already in progress
197
194
if ( this . uploadInProgress ) {
198
195
return ;
199
196
}
200
197
201
- const sketch = await this . sketchServiceClient . currentSketch ( ) ;
202
- if ( ! CurrentSketch . isValid ( sketch ) ) {
198
+ const ref = await this . commandService . executeCommand < VerifySketch . Ref > (
199
+ VerifySketch . Commands . VERIFY_SKETCH . id ,
200
+ false
201
+ ) ;
202
+
203
+ if ( ! ref ) {
204
+ return ;
205
+ }
206
+
207
+ const options = await this . options ( usingProgrammer , ref ) ;
208
+ if ( ! options ) {
209
+ return ;
210
+ }
211
+
212
+ if ( options . userFields . length === 0 && this . boardRequiresUserFields ) {
213
+ this . messageService . error (
214
+ nls . localize (
215
+ 'arduino/sketch/userFieldsNotFoundError' ,
216
+ "Can't find user fields for connected board"
217
+ )
218
+ ) ;
203
219
return ;
204
220
}
205
221
@@ -209,81 +225,14 @@ export class UploadSketch extends CoreServiceContribution {
209
225
this . uploadInProgress = true ;
210
226
this . coreErrorHandler . reset ( ) ;
211
227
this . onDidChangeEmitter . fire ( ) ;
212
- const { boardsConfig } = this . boardsServiceClientImpl ;
213
- const [
214
- fqbn ,
215
- { selectedProgrammer } ,
216
- verify ,
217
- uploadVerbose ,
218
- sourceOverride ,
219
- optimizeForDebug ,
220
- compileVerbose ,
221
- ] = await Promise . all ( [
222
- this . boardsDataStore . appendConfigToFqbn (
223
- boardsConfig . selectedBoard ?. fqbn
224
- ) ,
225
- this . boardsDataStore . getData ( boardsConfig . selectedBoard ?. fqbn ) ,
226
- this . preferences . get ( 'arduino.upload.verify' ) ,
227
- this . preferences . get ( 'arduino.upload.verbose' ) ,
228
- this . sourceOverride ( ) ,
229
- this . commandService . executeCommand < boolean > (
230
- 'arduino-is-optimize-for-debug'
231
- ) ,
232
- this . preferences . get ( 'arduino.compile.verbose' ) ,
233
- ] ) ;
234
-
235
- const verbose = { compile : compileVerbose , upload : uploadVerbose } ;
236
- const board = {
237
- ...boardsConfig . selectedBoard ,
238
- name : boardsConfig . selectedBoard ?. name || '' ,
239
- fqbn,
240
- } ;
241
- let options : CoreService . Upload . Options | undefined = undefined ;
242
- const { selectedPort } = boardsConfig ;
243
- const port = selectedPort ;
244
- const userFields =
245
- this . cachedUserFields . get ( this . selectedFqbnAddress ( ) ) ?? [ ] ;
246
- if ( userFields . length === 0 && this . boardRequiresUserFields ) {
247
- this . messageService . error (
248
- nls . localize (
249
- 'arduino/sketch/userFieldsNotFoundError' ,
250
- "Can't find user fields for connected board"
251
- )
252
- ) ;
253
- return ;
254
- }
228
+ await this . doWithProgress ( {
229
+ progressText : nls . localize ( 'arduino/sketch/uploading' , 'Uploading...' ) ,
230
+ task : ( progressId , coreService ) => {
231
+ return coreService . upload ( { ...options , progressId } ) ;
232
+ } ,
233
+ keepOutput : true ,
234
+ } ) ;
255
235
256
- if ( usingProgrammer ) {
257
- const programmer = selectedProgrammer ;
258
- options = {
259
- sketch,
260
- board,
261
- optimizeForDebug : Boolean ( optimizeForDebug ) ,
262
- programmer,
263
- port,
264
- verbose,
265
- verify,
266
- sourceOverride,
267
- userFields,
268
- } ;
269
- } else {
270
- options = {
271
- sketch,
272
- board,
273
- optimizeForDebug : Boolean ( optimizeForDebug ) ,
274
- port,
275
- verbose,
276
- verify,
277
- sourceOverride,
278
- userFields,
279
- } ;
280
- }
281
- this . outputChannelManager . getChannel ( 'Arduino' ) . clear ( ) ;
282
- if ( usingProgrammer ) {
283
- await this . coreService . uploadUsingProgrammer ( options ) ;
284
- } else {
285
- await this . coreService . upload ( options ) ;
286
- }
287
236
this . messageService . info (
288
237
nls . localize ( 'arduino/sketch/doneUploading' , 'Done uploading.' ) ,
289
238
{ timeout : 3000 }
@@ -295,14 +244,47 @@ export class UploadSketch extends CoreServiceContribution {
295
244
this . onDidChangeEmitter . fire ( ) ;
296
245
}
297
246
}
247
+
248
+ private async options (
249
+ usingProgrammer : boolean ,
250
+ verifyRef : VerifySketch . Ref
251
+ ) : Promise < CoreService . Options . Upload | undefined > {
252
+ const sketch = await this . sketchServiceClient . currentSketch ( ) ;
253
+ if ( ! CurrentSketch . isValid ( sketch ) ) {
254
+ return undefined ;
255
+ }
256
+ const userFields = this . userFields ( ) ;
257
+ const { boardsConfig } = this . boardsServiceClientImpl ;
258
+ const [ fqbn , { selectedProgrammer : programmer } , verify , verbose ] =
259
+ await Promise . all ( [
260
+ verifyRef . fqbn . decorated ,
261
+ this . boardsDataStore . getData ( verifyRef . fqbn . original ) ,
262
+ this . preferences . get ( 'arduino.upload.verify' ) ,
263
+ this . preferences . get ( 'arduino.upload.verbose' ) ,
264
+ ] ) ;
265
+ const port = boardsConfig . selectedPort ;
266
+ return {
267
+ sketch,
268
+ fqbn,
269
+ ...( usingProgrammer && { programmer } ) ,
270
+ port,
271
+ verbose,
272
+ verify,
273
+ userFields,
274
+ } ;
275
+ }
276
+
277
+ private userFields ( ) {
278
+ return this . cachedUserFields . get ( this . selectedFqbnAddress ( ) ) ?? [ ] ;
279
+ }
298
280
}
299
281
300
282
export namespace UploadSketch {
301
283
export namespace Commands {
302
284
export const UPLOAD_SKETCH : Command = {
303
285
id : 'arduino-upload-sketch' ,
304
286
} ;
305
- export const UPLOAD_WITH_CONFIGURATION : Command = {
287
+ export const UPLOAD_WITH_CONFIGURATION : Command & { label : string } = {
306
288
id : 'arduino-upload-with-configuration-sketch' ,
307
289
label : nls . localize (
308
290
'arduino/sketch/configureAndUpload' ,
0 commit comments