public async resolveOpenOcdOptions()

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"`;
    }