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();
}