Skip to content

Commit c5e0220

Browse files
committed
Added support for reading programmers from the Arduino platforms' programmers.txt file. Also now the last used programmer for the project is reloaded upon project opening.
1 parent e46e8c5 commit c5e0220

File tree

3 files changed

+77
-74
lines changed

3 files changed

+77
-74
lines changed

src/arduino/arduino.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,7 @@ Please make sure the folder is not occupied by other procedures .`);
664664
}
665665

666666
private getProgrammerString(): string {
667-
const selectProgrammer = this.programmerManager.currentProgrammer;
667+
const selectProgrammer = this.programmerManager.currentProgrammerID;
668668
if (!selectProgrammer) {
669669
Logger.notifyUserError("getProgrammerString", new Error(constants.messages.NO_PROGRAMMMER_SELECTED));
670670
return;

src/arduino/programmerManager.ts

+75-73
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,21 @@
1+
import * as fs from "fs";
2+
import * as path from "path";
13
import * as vscode from "vscode";
4+
import * as util from "../common/util";
25
import * as constants from "../common/constants";
36
import { DeviceContext } from "../deviceContext";
47
import { ArduinoApp } from "./arduino";
58
import { IArduinoSettings } from "./arduinoSettings";
69

7-
export enum ProgrammerList {
8-
"AVR ISP",
9-
"AVRISP mkII",
10-
"USBtinyISP",
11-
"ArduinoISP",
12-
"ArduinoISP.org",
13-
"USBasp",
14-
"Parallel Programmer",
15-
"Arduino as ISP",
16-
"Arduino Gemma",
17-
"BusPirate as ISP",
18-
"Atmel STK500 development board",
19-
"Atmel JTAGICE3 (ISP mode)",
20-
"Atmel JTAGICE3 (JTAG mode)",
21-
"Atmel-ICE (AVR)",
22-
}
23-
2410
export class ProgrammerManager {
2511

2612
private static _programmerManager: ProgrammerManager = null;
2713

28-
private _currentprogrammer: ProgrammerList;
29-
30-
private _programmervalue: string;
14+
private _currentProgrammerName: string;
3115

3216
private _programmerStatusBar: vscode.StatusBarItem;
17+
18+
private _programmers: Map<string, string>;
3319

3420
constructor(private _settings: IArduinoSettings, private _arduinoApp: ArduinoApp) {
3521
this._programmerStatusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, constants.statusBarPriority.PROGRAMMER);
@@ -39,68 +25,84 @@ export class ProgrammerManager {
3925
this._programmerStatusBar.show();
4026
}
4127

42-
public get currentProgrammer(): string {
43-
return this._programmervalue;
28+
public get currentProgrammerID(): string {
29+
return this._programmers.get(this._currentProgrammerName);
30+
}
31+
32+
public loadConfig()
33+
{
34+
this.loadProgrammers();
35+
36+
this.updateStatusBar();
37+
38+
const dc = DeviceContext.getInstance();
39+
dc.onDidChange(() => {
40+
this.updateStatusBar();
41+
});
4442
}
4543

4644
public async selectProgrammer() {
47-
const chosen: string | undefined = await vscode.window.showQuickPick(Object.keys(ProgrammerList)
48-
.filter((key) => {
49-
return !isNaN(Number(ProgrammerList[key]));
50-
}), { placeHolder: "Select programmer" });
45+
const chosen: string | undefined = await vscode.window.showQuickPick(Array.from(this._programmers.keys()), { placeHolder: "Select programmer" });
46+
5147
if (!chosen) {
5248
return;
5349
}
54-
this._currentprogrammer = ProgrammerList[chosen];
55-
this.getProgrammer(this._currentprogrammer);
56-
this._programmerStatusBar.text = chosen;
50+
51+
this._currentProgrammerName = chosen;
52+
53+
this._programmerStatusBar.text = this._currentProgrammerName;
5754
const dc = DeviceContext.getInstance();
58-
dc.programmer = chosen;
55+
dc.programmer = this._currentProgrammerName;
56+
}
57+
58+
private loadProgrammers() {
59+
this._programmers = new Map<string, string>();
60+
const boardLineRegex = /([^\.]+)\.(\S+)=(.+)/;
61+
62+
this._arduinoApp.boardManager.platforms.forEach(((plat) => {
63+
if (plat.rootBoardPath === undefined)
64+
return;
65+
66+
const programmmerFilePath = path.join(plat.rootBoardPath, "programmers.txt");
67+
68+
if (util.fileExistsSync(programmmerFilePath)) {
69+
const boardContent = fs.readFileSync(programmmerFilePath, "utf8");
70+
const lines = boardContent.split(/[\r|\r\n|\n]/);
71+
72+
lines.forEach((line) => {
73+
// Ignore comments.
74+
if (line.startsWith("#")) {
75+
return;
76+
}
77+
78+
const match = boardLineRegex.exec(line);
79+
if (match && match.length > 3) {
80+
if (match[2] === "name")
81+
{
82+
this._programmers.set(match[3], match[1])
83+
}
84+
}
85+
});
86+
}
87+
}));
5988
}
6089

61-
public getProgrammer(newProgrammer: ProgrammerList) {
62-
switch (newProgrammer) {
63-
case ProgrammerList["AVR ISP"]:
64-
this._programmervalue = "arduino:avrisp";
65-
break;
66-
case ProgrammerList["AVRISP mkII"]:
67-
this._programmervalue = "arduino:avrispmkii";
68-
break;
69-
case ProgrammerList.USBtinyISP:
70-
this._programmervalue = "arduino:usbtinyisp";
71-
break;
72-
case ProgrammerList.ArduinoISP:
73-
this._programmervalue = "arduino:arduinoisp";
74-
break;
75-
case ProgrammerList.USBasp:
76-
this._programmervalue = "arduino:usbasp";
77-
break;
78-
case ProgrammerList["Parallel Programmer"]:
79-
this._programmervalue = "arduino:parallel";
80-
break;
81-
case ProgrammerList["Arduino as ISP"]:
82-
this._programmervalue = "arduino:arduinoasisp";
83-
break;
84-
case ProgrammerList["Arduino Gemma"]:
85-
this._programmervalue = "arduino:usbGemma";
86-
break;
87-
case ProgrammerList["BusPirate as ISP"]:
88-
this._programmervalue = "arduino:buspirate";
89-
break;
90-
case ProgrammerList["Atmel STK500 development board"]:
91-
this._programmervalue = "arduino:stk500";
92-
break;
93-
case ProgrammerList["Atmel JTAGICE3 (ISP mode)"]:
94-
this._programmervalue = "arduino:jtag3isp";
95-
break;
96-
case ProgrammerList["Atmel JTAGICE3 (JTAG mode)"]:
97-
this._programmervalue = "arduino:jtag3";
98-
break;
99-
case ProgrammerList["Atmel-ICE (AVR)"]:
100-
this._programmervalue = "arduino:atmel_ice";
101-
break;
102-
default:
103-
break;
90+
private updateStatusBar(show: boolean = true): void {
91+
if (show)
92+
{
93+
this._programmerStatusBar.show();
94+
const dc = DeviceContext.getInstance();
95+
const selectedProgrammer = this._programmers.get(dc.programmer);
96+
97+
if (selectedProgrammer) {
98+
this._currentProgrammerName = dc.programmer;
99+
this._programmerStatusBar.text = dc.programmer;
100+
} else {
101+
this._currentProgrammerName = null;
102+
this._programmerStatusBar.text = "<Select Programmer>";
103+
}
104+
} else {
105+
this._programmerStatusBar.hide();
104106
}
105107
}
106108
}

src/arduinoActivator.ts

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class ArduinoActivator {
3939
arduinoApp.libraryManager = new LibraryManager(arduinoSettings, arduinoApp);
4040
arduinoApp.exampleManager = new ExampleManager(arduinoSettings, arduinoApp);
4141
arduinoApp.programmerManager = new ProgrammerManager(arduinoSettings, arduinoApp);
42+
arduinoApp.programmerManager.loadConfig();
4243
ArduinoContext.arduinoApp = arduinoApp;
4344

4445
const exampleProvider = new ExampleProvider(arduinoApp.exampleManager, arduinoApp.boardManager);

0 commit comments

Comments
 (0)