From 76c74cf99520c0236d988e0be9c5ca695bde2afa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20L=C3=B8vdal?= Date: Thu, 10 Dec 2020 23:26:46 +0100 Subject: [PATCH] Add buildMode argument to upload and uploadUsingProgrammer --- src/arduino/arduino.ts | 82 ++++++++++++++++++++++++------------------ src/extension.ts | 9 ++--- 2 files changed, 52 insertions(+), 39 deletions(-) diff --git a/src/arduino/arduino.ts b/src/arduino/arduino.ts index 09978b60..c81bc6a7 100644 --- a/src/arduino/arduino.ts +++ b/src/arduino/arduino.ts @@ -25,6 +25,11 @@ import { UsbDetector } from "../serialmonitor/usbDetector"; import { makeCompilerParserContext } from "./intellisense"; import { ProgrammerManager } from "./programmerManager"; +export enum BuildMode { + Upload = "Uploading", + UploadProgrammer = "Uploading (programmer)", +}; + /** * Represent an Arduino application based on the official Arduino IDE. */ @@ -99,9 +104,10 @@ export class ArduinoApp { * @param {bool} [compile=true] - Indicates whether to compile the code when using the CLI to upload * @param {bool} [useProgrammer=false] - Indicate whether a specific programmer should be used */ - public async upload(compile: boolean = true, useProgrammer: boolean = false) { + public async upload(buildMode: BuildMode, compile: boolean = true, useProgrammer: boolean = false) { const dc = DeviceContext.getInstance(); const args: string[] = []; + let restoreSerialMonitor: boolean = false; const boardDescriptor = this.getBoardBuildString(); if (!boardDescriptor) { return; @@ -133,38 +139,40 @@ export class ArduinoApp { return; } - if ((!dc.configuration || !/upload_method=[^=,]*st[^,]*link/i.test(dc.configuration)) && !dc.port) { - await selectSerial(); - return; - } + if (buildMode === BuildMode.Upload) { + if ((!dc.configuration || !/upload_method=[^=,]*st[^,]*link/i.test(dc.configuration)) && !dc.port) { + await selectSerial(); + return; + } - if (!compile && !this.useArduinoCli()) { - arduinoChannel.error("This command is only available when using the Arduino CLI"); - return; - } + if (!compile && !this.useArduinoCli()) { + arduinoChannel.error("This command is only available when using the Arduino CLI"); + return; + } - if (!this.useArduinoCli()) { - args.push("--upload"); - } else { - // TODO: add the --clean argument to the cli args when v 0.14 is released (this will clean up the build folder after uploading) - if (compile) { - args.push("compile", "--upload"); + if (!this.useArduinoCli()) { + args.push("--upload"); } else { - args.push("upload"); + // TODO: add the --clean argument to the cli args when v 0.14 is released (this will clean up the build folder after uploading) + if (compile) { + args.push("compile", "--upload"); + } else { + args.push("upload"); + } + args.push("-b", boardDescriptor); } - args.push("-b", boardDescriptor); - } - if (useProgrammer) { - if (this.useArduinoCli()) { - args.push("--programmer", selectProgrammer) - } else { - args.push("--useprogrammer", "--pref", "programmer=arduino:" + selectProgrammer) + if (useProgrammer) { + if (this.useArduinoCli()) { + args.push("--programmer", selectProgrammer) + } else { + args.push("--useprogrammer", "--pref", "programmer=arduino:" + selectProgrammer) + } } - } - if (dc.port) { - args.push("--port", dc.port); + if (dc.port) { + args.push("--port", dc.port); + } } const verbose = VscodeSettings.getInstance().logLevel === "verbose"; @@ -175,7 +183,7 @@ export class ArduinoApp { await vscode.workspace.saveAll(false); arduinoChannel.show(); - arduinoChannel.start(`Upload sketch - ${dc.sketch}`); + arduinoChannel.start(`${buildMode} sketch '${dc.sketch}'`); if (!await this.runPreBuildCommand(dc)) { return; @@ -204,16 +212,20 @@ export class ArduinoApp { // stop serial monitor when everything is prepared and good // what makes restoring of its previous state easier - const restoreSerialMonitor = await SerialMonitor.getInstance().closeSerialMonitor(dc.port); - UsbDetector.getInstance().pauseListening(); + if (buildMode === BuildMode.Upload || buildMode === BuildMode.UploadProgrammer) { + restoreSerialMonitor = await SerialMonitor.getInstance().closeSerialMonitor(dc.port); + UsbDetector.getInstance().pauseListening(); + } // Push sketch as last argument args.push(path.join(ArduinoWorkspace.rootPath, dc.sketch)); const cleanup = async () => { - UsbDetector.getInstance().resumeListening(); - if (restoreSerialMonitor) { - await SerialMonitor.getInstance().openSerialMonitor(); + if (buildMode === BuildMode.Upload || buildMode === BuildMode.UploadProgrammer) { + UsbDetector.getInstance().resumeListening(); + if (restoreSerialMonitor) { + await SerialMonitor.getInstance().openSerialMonitor(); + } } } @@ -223,15 +235,15 @@ export class ArduinoApp { args, ).then(async () => { await cleanup(); - arduinoChannel.end(`Uploaded the sketch: ${dc.sketch}${os.EOL}`); + arduinoChannel.end(`${buildMode} sketch '${dc.sketch}'${os.EOL}`); }, async (reason) => { await cleanup(); const msg = reason.code ? - `Exit with code=${reason.code}${os.EOL}` : + `Exit with code=${reason.code}` : reason.message ? reason.message : JSON.stringify(reason); - arduinoChannel.error(msg); + arduinoChannel.error(`${buildMode} sketch '${dc.sketch}': ${msg}${os.EOL}`); }); } diff --git a/src/extension.ts b/src/extension.ts index b6cf7a78..722a5f2e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -27,6 +27,7 @@ const completionProviderModule = impor("./langService/completionProvider") as ty import * as Logger from "./logger/logger"; const nsatModule = impor("./nsat") as typeof import ("./nsat"); +import { BuildMode } from "./arduino/arduino"; import { SerialMonitor } from "./serialmonitor/serialMonitor"; const usbDetectorModule = impor("./serialmonitor/usbDetector") as typeof import ("./serialmonitor/usbDetector"); @@ -144,7 +145,7 @@ export async function activate(context: vscode.ExtensionContext) { location: vscode.ProgressLocation.Window, title: "Arduino: Uploading...", }, async () => { - await arduinoContextModule.default.arduinoApp.upload(); + await arduinoContextModule.default.arduinoApp.upload(BuildMode.Upload); }); } catch (ex) { } @@ -162,7 +163,7 @@ export async function activate(context: vscode.ExtensionContext) { location: vscode.ProgressLocation.Window, title: "Arduino: Using CLI to upload...", }, async () => { - await arduinoContextModule.default.arduinoApp.upload(false); + await arduinoContextModule.default.arduinoApp.upload(BuildMode.Upload, false); }); } catch (ex) { } @@ -197,7 +198,7 @@ export async function activate(context: vscode.ExtensionContext) { if (!status.compile) { status.compile = "upload"; try { - await arduinoContextModule.default.arduinoApp.upload(true, true); + await arduinoContextModule.default.arduinoApp.upload(BuildMode.UploadProgrammer, true, true); } catch (ex) { } delete status.compile; @@ -210,7 +211,7 @@ export async function activate(context: vscode.ExtensionContext) { if (!status.compile) { status.compile = "cliUpload"; try { - await arduinoContextModule.default.arduinoApp.upload(false, true); + await arduinoContextModule.default.arduinoApp.upload(BuildMode.UploadProgrammer, false, true); } catch (ex) { } delete status.compile;