public async startListening()

in src/serialmonitor/usbDetector.ts [45:142]


    public async startListening() {
        const enableUSBDetection = VscodeSettings.getInstance().enableUSBDetection;
        if (os.platform() === "linux" || !enableUSBDetection) {
            return;
        }
        this._usbDetector = require("node-usb-native").detector;

        if (!this._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(
                    util.convertToHex(device.vendorId, 4), // vid and pid both are 2 bytes long.
                    util.convertToHex(device.productId, 4),
                    this._extensionRoot);

                // Not supported device for discovery.
                if (!deviceDescriptor) {
                    return;
                }
                const boardKey = `${deviceDescriptor.package}:${deviceDescriptor.architecture}:${deviceDescriptor.id}`;
                Logger.traceUserData("detected a board", { board: boardKey });
                if (!ArduinoContext.initialized) {
                    await ArduinoActivator.activate();
                }
                if (!SerialMonitor.getInstance().initialized) {
                    SerialMonitor.getInstance().initialize();
                }

                // TODO EW: this is board manager code which should be moved into board manager

                let bd = ArduinoContext.boardManager.installedBoards.get(boardKey);
                const openEditor = vscode.window.activeTextEditor;
                if (ArduinoWorkspace.rootPath && (
                    util.fileExistsSync(path.join(ArduinoWorkspace.rootPath, ARDUINO_CONFIG_FILE))
                    || (openEditor && openEditor.document.fileName.endsWith(".ino")))) {
                if (!bd) {
                    ArduinoContext.boardManager.updatePackageIndex(deviceDescriptor.indexFile).then((shouldLoadPackageContent) => {
                        const ignoreBoards = VscodeSettings.getInstance().ignoreBoards || [];
                        if (ignoreBoards.indexOf(deviceDescriptor.name) >= 0) {
                            return;
                        }
                        vscode.window.showInformationMessage(`Install board package for ${
                                deviceDescriptor.name}`, "Yes", "No", "Don't ask again").then((ans) => {
                            if (ans === "Yes") {
                                ArduinoContext.arduinoApp.installBoard(deviceDescriptor.package, deviceDescriptor.architecture)
                                    .then(() => {
                                        if (shouldLoadPackageContent) {
                                            ArduinoContext.boardManager.loadPackageContent(deviceDescriptor.indexFile);
                                        }
                                        ArduinoContext.boardManager.updateInstalledPlatforms(deviceDescriptor.package, deviceDescriptor.architecture);
                                        bd = ArduinoContext.boardManager.installedBoards.get(boardKey);
                                        this.switchBoard(bd, deviceDescriptor);
                                    });
                            } else if (ans === "Don't ask again") {
                                ignoreBoards.push(deviceDescriptor.name);
                                VscodeSettings.getInstance().ignoreBoards = ignoreBoards;
                            }
                        });
                    });
                } else if (ArduinoContext.boardManager.currentBoard) {
                    const currBoard = ArduinoContext.boardManager.currentBoard;
                    if (currBoard.board !== deviceDescriptor.id
                        || currBoard.platform.architecture !== deviceDescriptor.architecture
                        || currBoard.getPackageName() !== deviceDescriptor.package) {
                        const ignoreBoards = VscodeSettings.getInstance().ignoreBoards || [];
                        if (ignoreBoards.indexOf(deviceDescriptor.name) >= 0) {
                            return;
                        }
                        vscode.window.showInformationMessage(`Detected board ${deviceDescriptor.name}. Would you like to switch to this board type?`,
                            "Yes", "No", "Don't ask again")
                            .then((ans) => {
                                if (ans === "Yes") {
                                    return this.switchBoard(bd, deviceDescriptor);
                                } else if (ans === "Don't ask again") {
                                    ignoreBoards.push(deviceDescriptor.name);
                                    VscodeSettings.getInstance().ignoreBoards = ignoreBoards;
                                }
                            });
                    } else {
                        const monitor = SerialMonitor.getInstance();
                        monitor.selectSerialPort(deviceDescriptor.vid, deviceDescriptor.pid);
                        this.showReadMeAndExample(deviceDescriptor.readme);
                    }
                } else {
                    this.switchBoard(bd, deviceDescriptor);
                }
            }
        }
        });
        this._usbDetector.startMonitoring();
    }