in src/debug/debuggerManager.ts [86:155]
public async resolveOpenOcdOptions(config): Promise<string> {
const board = this._boardManager.currentBoard.key;
const debugConfig = this._debuggerBoardMappings[board];
const dc = DeviceContext.getInstance();
const debuggerConfigured: string = dc.debugger_;
if (!debugConfig) {
throw new Error(`Debug for board ${this._boardManager.currentBoard.name} is not supported by now.`);
}
let resolvedDebugger;
const debuggers = await this.listDebuggers();
if (!debuggers.length) {
throw new Error(`No supported debuggers are connected.`);
}
// rule 1: if this board has debuggers, use its own debugger
if (debugConfig.interface) {
resolvedDebugger = debuggers.find((_debugger) => {
return _debugger.short_name === debugConfig.interface || _debugger.config_file === debugConfig.interface;
});
if (!resolvedDebugger) {
throw new Error(`Debug port for board ${this._boardManager.currentBoard.name} is not connected.`);
}
}
// rule 2: if there is only one debugger, use the only debugger
if (!resolvedDebugger && !debuggerConfigured && debuggers.length === 1) {
resolvedDebugger = debuggers[0];
}
// rule 3: if there is any configuration about debugger, use this configuration
if (!resolvedDebugger && debuggerConfigured) {
resolvedDebugger = debuggers.find((_debugger) => {
return _debugger.short_name === debuggerConfigured || _debugger.config_file === debuggerConfigured;
});
}
if (!resolvedDebugger) {
const chosen = await vscode.window.showQuickPick(<vscode.QuickPickItem[]>debuggers.map((l): vscode.QuickPickItem => {
return {
description: `(0x${l.vid}:0x${l.pid})`,
label: l.name,
};
}).sort((a, b): number => {
return a.label === b.label ? 0 : (a.label > b.label ? 1 : -1);
}), { placeHolder: "Select a debugger" });
if (chosen && chosen.label) {
resolvedDebugger = debuggers.find((_debugger) => _debugger.name === chosen.label);
if (resolvedDebugger) {
dc.debugger_ = resolvedDebugger.config_file;
}
}
if (!resolvedDebugger) {
return "";
}
}
const debugServerPath = config.debugServerPath;
let scriptsFolder = path.join(path.dirname(debugServerPath), "../scripts/");
if (!util.directoryExistsSync(scriptsFolder)) {
scriptsFolder = path.join(path.dirname(debugServerPath), "../share/openocd/scripts/");
}
if (!util.directoryExistsSync(scriptsFolder)) {
throw new Error("Cannot find scripts folder from openocd.");
}
// TODO: need to config gdb port other than hard-coded 3333
if (resolvedDebugger.config_file.includes("jlink")) {
// only swd is supported now
/* tslint:disable:max-line-length*/
return `-s ${scriptsFolder} -f interface/${resolvedDebugger.config_file} -c "transport select swd" -f target/${debugConfig.target} -c "telnet_port disabled" -c "tcl_port disabled"`;
}
/* tslint:disable:max-line-length*/
return `-s ${scriptsFolder} -f interface/${resolvedDebugger.config_file} -f target/${debugConfig.target} -c "telnet_port disabled" -c "tcl_port disabled"`;
}