1
+ import * as fs from "fs" ;
2
+ import * as path from "path" ;
1
3
import * as vscode from "vscode" ;
4
+ import * as util from "../common/util" ;
2
5
import * as constants from "../common/constants" ;
3
6
import { DeviceContext } from "../deviceContext" ;
4
7
import { ArduinoApp } from "./arduino" ;
5
8
import { IArduinoSettings } from "./arduinoSettings" ;
6
9
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
-
24
10
export class ProgrammerManager {
25
11
26
12
private static _programmerManager : ProgrammerManager = null ;
27
13
28
- private _currentprogrammer : ProgrammerList ;
29
-
30
- private _programmervalue : string ;
14
+ private _currentProgrammerName : string ;
31
15
32
16
private _programmerStatusBar : vscode . StatusBarItem ;
17
+
18
+ private _programmers : Map < string , string > ;
33
19
34
20
constructor ( private _settings : IArduinoSettings , private _arduinoApp : ArduinoApp ) {
35
21
this . _programmerStatusBar = vscode . window . createStatusBarItem ( vscode . StatusBarAlignment . Right , constants . statusBarPriority . PROGRAMMER ) ;
@@ -39,68 +25,84 @@ export class ProgrammerManager {
39
25
this . _programmerStatusBar . show ( ) ;
40
26
}
41
27
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
+ } ) ;
44
42
}
45
43
46
44
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
+
51
47
if ( ! chosen ) {
52
48
return ;
53
49
}
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 ;
57
54
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
+ } ) ) ;
59
88
}
60
89
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 ( ) ;
104
106
}
105
107
}
106
108
}
0 commit comments