From c3792b3ba00cab8f51e0e8a18083383ce6fa9220 Mon Sep 17 00:00:00 2001 From: Alberto Iannaccone Date: Tue, 14 Dec 2021 18:02:05 +0100 Subject: [PATCH] close serial port connection before flashing firmware --- .../node/arduino-firmware-uploader-impl.ts | 35 +++++++++++++------ .../src/node/arduino-ide-backend-module.ts | 21 +++++------ 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts b/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts index 5099147d1..d4150ea73 100644 --- a/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts +++ b/arduino-ide-extension/src/node/arduino-firmware-uploader-impl.ts @@ -4,6 +4,7 @@ import { } from '../common/protocol/arduino-firmware-uploader'; import { injectable, inject, named } from 'inversify'; import { ExecutableService } from '../common/protocol'; +import { SerialService } from '../common/protocol/serial-service'; import { getExecPath, spawnCommand } from './exec-util'; import { ILogger } from '@theia/core/lib/common/logger'; @@ -18,6 +19,9 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { @named('fwuploader') protected readonly logger: ILogger; + @inject(SerialService) + protected readonly serialService: SerialService; + protected onError(error: any): void { this.logger.error(error); } @@ -66,15 +70,26 @@ export class ArduinoFirmwareUploaderImpl implements ArduinoFirmwareUploader { } async flash(firmware: FirmwareInfo, port: string): Promise { - return await this.runCommand([ - 'firmware', - 'flash', - '--fqbn', - firmware.board_fqbn, - '--address', - port, - '--module', - `${firmware.module}@${firmware.firmware_version}`, - ]); + let output; + try { + this.serialService.uploadInProgress = true; + await this.serialService.disconnect(); + output = await this.runCommand([ + 'firmware', + 'flash', + '--fqbn', + firmware.board_fqbn, + '--address', + port, + '--module', + `${firmware.module}@${firmware.firmware_version}`, + ]); + } catch (e) { + throw e; + } finally { + this.serialService.uploadInProgress = false; + this.serialService.connectSerialIfRequired(); + return output; + } } } diff --git a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts index a75dc6d78..5fcfd01ed 100644 --- a/arduino-ide-extension/src/node/arduino-ide-backend-module.ts +++ b/arduino-ide-extension/src/node/arduino-ide-backend-module.ts @@ -203,7 +203,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // #endregion Theia customizations - // Monitor client provider per connected frontend. + // Serial client provider per connected frontend. bind(ConnectionContainerModule).toConstantValue( ConnectionContainerModule.create(({ bind, bindBackendService }) => { bind(MonitorClientProvider).toSelf().inSingletonScope(); @@ -260,17 +260,14 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ) .inSingletonScope(); - bind(ArduinoFirmwareUploaderImpl).toSelf().inSingletonScope(); - bind(ArduinoFirmwareUploader).toService(ArduinoFirmwareUploaderImpl); - bind(BackendApplicationContribution).toService(ArduinoFirmwareUploaderImpl); - bind(ConnectionHandler) - .toDynamicValue( - (context) => - new JsonRpcConnectionHandler(ArduinoFirmwareUploaderPath, () => - context.container.get(ArduinoFirmwareUploader) - ) - ) - .inSingletonScope(); + // Singleton per BE, each FE connection gets its proxy. + bind(ConnectionContainerModule).toConstantValue( + ConnectionContainerModule.create(({ bind, bindBackendService }) => { + bind(ArduinoFirmwareUploaderImpl).toSelf().inSingletonScope(); + bind(ArduinoFirmwareUploader).toService(ArduinoFirmwareUploaderImpl); + bindBackendService(ArduinoFirmwareUploaderPath, ArduinoFirmwareUploader); + }) + ); // Logger for the Arduino daemon bind(ILogger)