From d1f8faeea76e018900f24df1835104505a36464f Mon Sep 17 00:00:00 2001 From: Yuning Zhang Date: Mon, 17 Jul 2017 16:21:20 +0800 Subject: [PATCH 1/4] Make UsbDetector a singleton --- src/extension.ts | 9 +++------ src/serialmonitor/usbDetector.ts | 13 ++++++++++++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 31d74410..fba406a1 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -19,7 +19,6 @@ import * as Logger from "./logger/logger"; import { SerialMonitor } from "./serialmonitor/serialMonitor"; import { UsbDetector } from "./serialmonitor/usbDetector"; -let usbDetector: UsbDetector = null; const status: any = {}; export async function activate(context: vscode.ExtensionContext) { @@ -184,8 +183,8 @@ export async function activate(context: vscode.ExtensionContext) { const completionProvider = new CompletionProvider(); context.subscriptions.push(vscode.languages.registerCompletionItemProvider(ARDUINO_MODE, completionProvider, "<", '"', ".")); - usbDetector = new UsbDetector(context.extensionPath); - usbDetector.startListening(); + UsbDetector.extensionRoot = context.extensionPath; + UsbDetector.getInstance().startListening(); if (vscode.workspace.rootPath && ( util.fileExistsSync(path.join(vscode.workspace.rootPath, ARDUINO_CONFIG_FILE)) @@ -222,8 +221,6 @@ export async function activate(context: vscode.ExtensionContext) { export async function deactivate() { const monitor = SerialMonitor.getInstance(); await monitor.closeSerialMonitor(null, false); - if (usbDetector) { - usbDetector.stopListening(); - } + UsbDetector.getInstance().stopListening(); Logger.traceUserData("deactivate-extension"); } diff --git a/src/serialmonitor/usbDetector.ts b/src/serialmonitor/usbDetector.ts index 8fb57bfe..0a8c971a 100644 --- a/src/serialmonitor/usbDetector.ts +++ b/src/serialmonitor/usbDetector.ts @@ -14,11 +14,22 @@ import { SerialMonitor } from "./serialMonitor"; export class UsbDetector { + public static extensionRoot: string; + + public static getInstance(): UsbDetector { + if (!UsbDetector._instance) { + UsbDetector._instance = new UsbDetector(UsbDetector.extensionRoot); + } + return UsbDetector._instance; + } + + private static _instance: UsbDetector; + private _usbDetector; private _boardDescriptors = null; - constructor( + private constructor( private _extensionRoot: string) { } From 9eb2082867c5238bb6f29c8ac0349baf6f75b7ae Mon Sep 17 00:00:00 2001 From: Yuning Zhang Date: Mon, 17 Jul 2017 16:43:46 +0800 Subject: [PATCH 2/4] Add pause/resume listening in UsbDetector --- src/serialmonitor/usbDetector.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/serialmonitor/usbDetector.ts b/src/serialmonitor/usbDetector.ts index 0a8c971a..95d31dbb 100644 --- a/src/serialmonitor/usbDetector.ts +++ b/src/serialmonitor/usbDetector.ts @@ -117,6 +117,20 @@ export class UsbDetector { } } + public pauseListening() { + if (this._usbDetector) { + this._usbDetector.stopMonitoring(); + } + } + + public resumeListening() { + if (this._usbDetector) { + this._usbDetector.startMonitoring(); + } else { + this.startListening(); + } + } + private switchBoard(bd: IBoard, vid: string, pid: string) { ArduinoContext.boardManager.doChangeBoardType(bd); const monitor = SerialMonitor.getInstance(); From a81390435314321ebcef17b1c98aa945558a7298 Mon Sep 17 00:00:00 2001 From: Yuning Zhang Date: Mon, 17 Jul 2017 16:44:50 +0800 Subject: [PATCH 3/4] Pause usbDetector listening during the upload --- src/arduino/arduino.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/arduino/arduino.ts b/src/arduino/arduino.ts index 4cfcb32c..2acf9a8f 100644 --- a/src/arduino/arduino.ts +++ b/src/arduino/arduino.ts @@ -20,6 +20,7 @@ import { VscodeSettings } from "./vscodeSettings"; import { arduinoChannel } from "../common/outputChannel"; import { SerialMonitor } from "../serialmonitor/serialMonitor"; +import { UsbDetector } from "../serialmonitor/usbDetector"; /** * Represent an Arduino application based on the official Arduino IDE. @@ -114,6 +115,7 @@ export class ArduinoApp { const serialMonitor = SerialMonitor.getInstance(); const needRestore = await serialMonitor.closeSerialMonitor(dc.port); + UsbDetector.getInstance().pauseListening(); await vscode.workspace.saveAll(false); const appPath = path.join(vscode.workspace.rootPath, dc.sketch); @@ -122,6 +124,7 @@ export class ArduinoApp { args.push("--verbose"); } await util.spawn(this._settings.commandPath, arduinoChannel.channel, args).then(async () => { + UsbDetector.getInstance().resumeListening(); if (needRestore) { await serialMonitor.openSerialMonitor(); } From 398a8f3acfe150940f8ad980902bd8e793b3d6e1 Mon Sep 17 00:00:00 2001 From: Yuning Zhang Date: Wed, 19 Jul 2017 11:16:59 +0800 Subject: [PATCH 4/4] Refine code --- src/extension.ts | 2 +- src/serialmonitor/usbDetector.ts | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index fba406a1..d175422e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -183,7 +183,7 @@ export async function activate(context: vscode.ExtensionContext) { const completionProvider = new CompletionProvider(); context.subscriptions.push(vscode.languages.registerCompletionItemProvider(ARDUINO_MODE, completionProvider, "<", '"', ".")); - UsbDetector.extensionRoot = context.extensionPath; + UsbDetector.getInstance().initialize(context.extensionPath); UsbDetector.getInstance().startListening(); if (vscode.workspace.rootPath && ( diff --git a/src/serialmonitor/usbDetector.ts b/src/serialmonitor/usbDetector.ts index 95d31dbb..41c4a6e8 100644 --- a/src/serialmonitor/usbDetector.ts +++ b/src/serialmonitor/usbDetector.ts @@ -14,11 +14,9 @@ import { SerialMonitor } from "./serialMonitor"; export class UsbDetector { - public static extensionRoot: string; - public static getInstance(): UsbDetector { if (!UsbDetector._instance) { - UsbDetector._instance = new UsbDetector(UsbDetector.extensionRoot); + UsbDetector._instance = new UsbDetector(); } return UsbDetector._instance; } @@ -29,8 +27,13 @@ export class UsbDetector { private _boardDescriptors = null; - private constructor( - private _extensionRoot: string) { + private _extensionRoot = null; + + private constructor() { + } + + public initialize(extensionRoot: string) { + this._extensionRoot = extensionRoot; } public async startListening() { @@ -43,6 +46,10 @@ export class UsbDetector { return; } + if (this._extensionRoot === null) { + throw new Error("UsbDetector should be initialized before using."); + } + this._usbDetector.on("add", async (device) => { if (device.vendorId && device.productId) { const deviceDescriptor = this.getUsbDeviceDescriptor(