diff --git a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts index 079a4a86..c50379e4 100644 --- a/arduino-ide-extension/src/browser/contributions/upload-sketch.ts +++ b/arduino-ide-extension/src/browser/contributions/upload-sketch.ts @@ -86,29 +86,45 @@ export class UploadSketch extends SketchContribution { if (!boardsConfig || !boardsConfig.selectedBoard) { throw new Error('No boards selected. Please select a board.'); } - const { selectedPort } = boardsConfig; - if (!selectedPort) { - throw new Error('No ports selected. Please select a port.'); - } if (!boardsConfig.selectedBoard.fqbn) { throw new Error(`No core is installed for the '${boardsConfig.selectedBoard.name}' board. Please install the core.`); } - const [fqbn, data] = await Promise.all([ + + const [fqbn, { selectedProgrammer }] = await Promise.all([ this.boardsDataStore.appendConfigToFqbn(boardsConfig.selectedBoard.fqbn), this.boardsDataStore.getData(boardsConfig.selectedBoard.fqbn) ]); - this.outputChannelManager.getChannel('Arduino: upload').clear(); - const programmer = usingProgrammer ? data.selectedProgrammer : undefined; - if (usingProgrammer && !programmer) { - this.messageService.warn('Programmer is not selected. Uploading without programmer.', { timeout: 2000 }); + + let options: CoreService.Upload.Options | undefined = undefined; + const sketchUri = uri; + const optimizeForDebug = this.editorMode.compileForDebug; + + if (usingProgrammer) { + const programmer = selectedProgrammer; + if (!programmer) { + throw new Error('Programmer is not selected. Please select a programmer.'); + } + options = { + sketchUri, + fqbn, + optimizeForDebug, + programmer + }; + } else { + const { selectedPort } = boardsConfig; + if (!selectedPort) { + throw new Error('No ports selected. Please select a port.'); + } + const port = selectedPort.address; + options = { + sketchUri, + fqbn, + optimizeForDebug, + port + }; } - await this.coreService.upload({ - sketchUri: uri, - fqbn, - port: selectedPort.address, - optimizeForDebug: this.editorMode.compileForDebug, - programmer - }); + this.outputChannelManager.getChannel('Arduino: upload').clear(); + await this.coreService.upload(options); this.messageService.info('Done uploading.', { timeout: 1000 }); } catch (e) { this.messageService.error(e.toString()); diff --git a/arduino-ide-extension/src/common/protocol/core-service.ts b/arduino-ide-extension/src/common/protocol/core-service.ts index a6baa0b4..1a0c6edc 100644 --- a/arduino-ide-extension/src/common/protocol/core-service.ts +++ b/arduino-ide-extension/src/common/protocol/core-service.ts @@ -20,14 +20,13 @@ export namespace CoreService { readonly sketchUri: string; readonly fqbn: string; readonly optimizeForDebug: boolean; - readonly programmer?: Programmer | undefined; } } export namespace Upload { - export interface Options extends Compile.Options { - readonly port: string; - } + export type Options = + Compile.Options & Readonly<{ port: string }> | + Compile.Options & Readonly<{ programmer: Programmer }>; } } diff --git a/arduino-ide-extension/src/node/core-service-impl.ts b/arduino-ide-extension/src/node/core-service-impl.ts index c19da8d6..0c1127bc 100644 --- a/arduino-ide-extension/src/node/core-service-impl.ts +++ b/arduino-ide-extension/src/node/core-service-impl.ts @@ -61,9 +61,6 @@ export class CoreServiceImpl implements CoreService { compilerReq.setPreprocess(false); compilerReq.setVerbose(true); compilerReq.setQuiet(false); - if (options.programmer) { - compilerReq.setProgrammer(options.programmer.id); - } const result = client.compile(compilerReq); try { @@ -106,8 +103,9 @@ export class CoreServiceImpl implements CoreService { uploadReq.setInstance(instance); uploadReq.setSketchPath(sketchpath); uploadReq.setFqbn(fqbn); - uploadReq.setPort(options.port); - if (options.programmer) { + if ('port' in options) { + uploadReq.setPort(options.port); + } else { uploadReq.setProgrammer(options.programmer.id); } const result = client.upload(uploadReq);