8000 implements the lazy feature (#317) · Netoperz/vscode-arduino@c9f90f5 · GitHub
[go: up one dir, main page]

Skip to content

Commit c9f90f5

Browse files
authored
implements the lazy feature (microsoft#317)
* implements the lazy feature * refine code * refine code for debugger * fix tslint error * active arduino when ino file is open * active arduino when ino file is open * update test case timeout, otherwise the test will fail on mac. * fix a bug when arduino.json is deleted, current board is not updated. * fix a bug when sketch in arduino.json is not specified. * enable logging when vssettings log level is verbose * separate arduino conext as a js module. * don't use static method for ArduinoContext and ArduinoActivator
1 parent c169c0a commit c9f90f5

File tree

11 files changed

+335
-162
lines changed

11 files changed

+335
-162
lines changed

src/arduino/arduinoContentProvider.ts

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
import * as path from "path";
77
import * as Uuid from "uuid/v4";
88
import * as vscode from "vscode";
9+
import ArduinoActivator from "../arduinoActivator";
10+
import ArduinoContext from "../arduinoContext";
911
import * as Constants from "../common/constants";
1012
import * as JSONHelper from "../common/cycle";
1113
import * as Logger from "../logger/logger";
12-
import { ArduinoApp } from "./arduino";
1314
import LocalWebServer from "./localWebServer";
1415
import { VscodeSettings } from "./vscodeSettings";
1516

@@ -18,7 +19,6 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
1819
private _onDidChange = new vscode.EventEmitter<vscode.Uri>();
1920

2021
constructor(
21-
private _arduinoApp: ArduinoApp,
2222
private _extensionPath: string) {
2323
this.initialize();
2424
}
@@ -53,7 +53,10 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
5353
this._webserver.start();
5454
}
5555

56-
public provideTextDocumentContent(uri: vscode.Uri): string {
56+
public async provideTextDocumentContent(uri: vscode.Uri): Promise<string> {
57+
if (!ArduinoContext.initialized) {
58+
await ArduinoActivator.activate();
59+
}
5760
let type = "";
5861
if (uri.toString() === Constants.BOARD_MANAGER_URI.toString()) {
5962
type = "boardmanager";
@@ -105,9 +108,9 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
105108

106109
public async getBoardPackages(req, res) {
107110
const update = (VscodeSettings.getInstance().autoUpdateIndexFiles && req.query.update === "true");
108-
await this._arduinoApp.boardManager.loadPackages(update);
111+
await ArduinoContext.boardManager.loadPackages(update);
109112
return res.json({
110-
platforms: JSONHelper.decycle(this._arduinoApp.boardManager.platforms, undefined),
113+
platforms: JSONHelper.decycle(ArduinoContext.boardManager.platforms, undefined),
111114
});
112115
}
113116

@@ -116,7 +119,7 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
116119
return res.status(400).send("BAD Request! Missing { packageName, arch } parameters!");
117120
} else {
118121
try {
119-
await this._arduinoApp.installBoard(req.body.packageName, req.body.arch, req.body.version);
122+
await ArduinoContext.arduinoApp.installBoard(req.body.packageName, req.body.arch, req.body.version);
120123
return res.json({
121124
status: "OK",
122125
});
@@ -131,7 +134,7 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
131134
return res.status(400).send("BAD Request! Missing { packagePath } parameter!");
132135
} else {
133136
try {
134-
await this._arduinoApp.uninstallBoard(req.body.boardName, req.body.packagePath);
137+
await ArduinoContext.arduinoApp.uninstallBoard(req.body.boardName, req.body.packagePath);
135138
return res.json({
136139
status: "OK",
137140
});
@@ -165,9 +168,9 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
165168

166169
public async getLibraries(req, res) {
167170
const update = (VscodeSettings.getInstance().autoUpdateIndexFiles && req.query.update === "true");
168-
await this._arduinoApp.libraryManager.loadLibraries(update);
171+
await ArduinoContext.arduinoApp.libraryManager.loadLibraries(update);
169172
return res.json({
170-
libraries: this._arduinoApp.libraryManager.libraries,
173+
libraries: ArduinoContext.arduinoApp.libraryManager.libraries,
171174
});
172175
}
173176

@@ -176,7 +179,7 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
176179
return res.status(400).send("BAD Request! Missing { libraryName } parameters!");
177180
} else {
178181
try {
179-
await this._arduinoApp.installLibrary(req.body.libraryName, req.body.version);
182+
await ArduinoContext.arduinoApp.installLibrary(req.body.libraryName, req.body.version);
180183
return res.json({
181184
status: "OK",
182185
});
@@ -191,7 +194,7 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
191194
return res.status(400).send("BAD Request! Missing { libraryPath } parameters!");
192195
} else {
193196
try {
194-
await this._arduinoApp.uninstallLibrary(req.body.libraryName, req.body.libraryPath);
197+
await ArduinoContext.arduinoApp.uninstallLibrary(req.body.libraryName, req.body.libraryPath);
195198
return res.json({
196199
status: "OK",
197200
});
@@ -206,8 +209,8 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
206209
return res.status(400).send("BAD Request! Missing { libraryPath } parameters!");
207210
} else {
208211
try {
209-
await this._arduinoApp.addLibPath(req.body.libraryPath);
210-
await this._arduinoApp.includeLibrary(req.body.libraryPath);
212+
await ArduinoContext.arduinoApp.addLibPath(req.body.libraryPath);
213+
await ArduinoContext.arduinoApp.includeLibrary(req.body.libraryPath);
211214
return res.json({
212215
status: "OK",
213216
});
@@ -219,7 +222,7 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
219222

220223
public async getBoardConfig(req, res) {
221224
return res.json({
222-
configitems: this._arduinoApp.boardManager.currentBoard.configItems,
225+
configitems: ArduinoContext.boardManager.currentBoard.configItems,
223226
});
224227
}
225228

@@ -228,7 +231,7 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
228231
return res.status(400).send("BAD Request! Missing parameters!");
229232
} else {
230233
try {
231-
this._arduinoApp.boardManager.currentBoard.updateConfig(req.body.configId, req.body.optionId);
234+
ArduinoContext.boardManager.currentBoard.updateConfig(req.body.configId, req.body.optionId);
232235
return res.json({
233236
status: "OK",
234237
});
@@ -239,7 +242,7 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
239242
}
240243

241244
public async getExamples(req, res) {
242-
const examples = await this._arduinoApp.exampleManager.loadExamples();
245+
const examples = await ArduinoContext.arduinoApp.exampleManager.loadExamples();
243246
return res.json({
244247
examples,
245248
});
@@ -250,7 +253,7 @@ export class ArduinoContentProvider implements vscode.TextDocumentContentProvide
250253
return res.status(400).send("BAD Request! Missing { examplePath } parameter!");
251254
} else {
252255
try {
253-
this._arduinoApp.openExample(req.body.examplePath);
256+
ArduinoContext.arduinoApp.openExample(req.body.examplePath);
254257
return res.json({
255258
status: "OK",
256259
});

src/arduino/boardManager.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ export class BoardManager {
261261
this._configStatusBar.hide();
262262
}
263263
} else {
264+
this._currentBoard = null;
264265
this._boardStatusBar.text = "<Select Board Type>";
265266
this._configStatusBar.hide();
266267
}

src/arduinoActivator.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*--------------------------------------------------------------------------------------------
2+
* Copyright (C) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*-------------------------------------------------------------------------------------------*/
5+
6+
import { ArduinoApp } from "./arduino/arduino";
7+
import { ArduinoSettings } from "./arduino/arduinoSettings";
8+
import { BoardManager } from "./arduino/boardManager";
9+
import { ExampleManager } from "./arduino/exampleManager";
10+
import { LibraryManager } from "./arduino/libraryManager";
11+
import ArduinoContext from "./arduinoContext";
12+
import { DeviceContext } from "./deviceContext";
13+
14+
class ArduinoActivator {
15+
private _initializePromise: Promise<void>;
16+
public async activate() {
17+
if (this._initializePromise) {
18+
await this._initializePromise;
19+
return;
20+
}
21+
22+
this._initializePromise = (async () => {
23+
const arduinoSettings = new ArduinoSettings();
24+
await arduinoSettings.initialize();
25+
const arduinoApp = new ArduinoApp(arduinoSettings);
26+
await arduinoApp.initialize();
27+
28+
// TODO: After use the device.json config, should remove the dependency on the ArduinoApp object.
29+
const deviceContext = DeviceContext.getInstance();
30+
await deviceContext.loadContext();
31+
// Arduino board manager & library manager
32+
arduinoApp.boardManager = new BoardManager(arduinoSettings, arduinoApp);
33+
ArduinoContext.boardManager = arduinoApp.boardManager;
34+
await arduinoApp.boardManager.loadPackages();
35+
arduinoApp.libraryManager = new LibraryManager(arduinoSettings, arduinoApp);
36+
arduinoApp.exampleManager = new ExampleManager(arduinoSettings, arduinoApp);
37+
ArduinoContext.arduinoApp = arduinoApp;
38+
})();
39+
await this._initializePromise;
40+
}
41+
}
42+
export default new ArduinoActivator();

src/arduinoContext.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*--------------------------------------------------------------------------------------------
2+
* Copyright (C) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*-------------------------------------------------------------------------------------------*/
5+
import { ArduinoApp } from "./arduino/arduino";
6+
import { BoardManager } from "./arduino/boardManager";
7+
import { DebugConfigurator } from "./debug/configurator";
8+
import { DebuggerManager } from "./debug/debuggerManager";
9+
import { DeviceContext } from "./deviceContext";
10+
11+
class ArduinoContext {
12+
public get initialized(): boolean {
13+
return !!this._arduinoApp;
14+
}
15+
16+
public get arduinoApp(): ArduinoApp {
17+
return this._arduinoApp;
18+
}
19+
20+
public set arduinoApp(value: ArduinoApp) {
21+
this._arduinoApp = value;
22+
}
23+
24+
public get boardManager() {
25+
return this._boardManager;
26+
}
27+
28+
public set boardManager(value: BoardManager) {
29+
this._boardManager = value;
30+
}
31+
32+
public get arduinoConfigurator(): DebugConfigurator {
33+
if (this._arduinoConfigurator === null) {
34+
const debuggerManager = new DebuggerManager(
35+
DeviceContext.getInstance().extensionPath,
36+
this.arduinoApp.settings,
37+
this.boardManager);
38+
debuggerManager.initialize();
39+
this._arduinoConfigurator = new DebugConfigurator(
40+
this.arduinoApp, this.arduinoApp.settings
41+
, this.boardManager, debuggerManager);
42+
}
43+
return this._arduinoConfigurator;
44+
}
45+
46+
public set arduinoConfigurator(value: DebugConfigurator) {
47+
this._arduinoConfigurator = value;
48+
}
49+
50+
private _arduinoApp: ArduinoApp = null;
51+
private _arduinoConfigurator: DebugConfigurator = null;
52+
private _boardManager: BoardManager = null;
53+
}
54+
55+
export default new ArduinoContext();

src/debug/configurator.ts

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import * as path from "path";
77
import * as vscode from "vscode";
88

99
import { ArduinoApp } from "../arduino/arduino";
10-
import { ArduinoSettings } from "../arduino/arduinoSettings";
10+
import { IArduinoSettings } from "../arduino/arduinoSettings";
1111
import { BoardManager } from "../arduino/boardManager";
12+
import { VscodeSettings } from "../arduino/vscodeSettings";
1213
import * as platform from "../common/platform";
1314
import * as util from "../common/util";
1415
import { DeviceContext } from "../deviceContext";
@@ -18,20 +19,15 @@ import { DebuggerManager } from "./debuggerManager";
1819
* Automatically generate the Arduino board's debug settings.
1920
*/
2021
export class DebugConfigurator {
21-
private _debuggerManager: DebuggerManager;
2222
constructor(
23-
private _extensionRoot: string,
2423
private _arduinoApp: ArduinoApp,
25-
private _arduinoSettings: ArduinoSettings,
24+
private _arduinoSettings: IArduinoSettings,
2625
private _boardManager: BoardManager,
27-
) {
28-
this._debuggerManager = new DebuggerManager(_extensionRoot, _arduinoSettings, _boardManager);
26+
private _debuggerManager: DebuggerManager,
27+
) {
2928
}
3029

3130
public async run(config) {
32-
if (!this._debuggerManager.initialized) {
33-
this._debuggerManager.initialize();
34-
}
3531
// Default settings:
3632
if (!config.request) {
3733
config = {
@@ -41,9 +37,7 @@ export class DebugConfigurator {
4137
program: "${file}",
4238
cwd: "${workspaceRoot}",
4339
MIMode: "gdb",
44-
logging: {
45-
engineLogging: true,
46-
},
40+
4741
targetArchitecture: "arm",
4842
customLaunchSetupCommands: [
4943
{
@@ -70,9 +64,23 @@ export class DebugConfigurator {
7064
};
7165
}
7266

67+
if (VscodeSettings.getInstance().logLevel === "verbose" && !config.logging) {
68+
config = {
69+
...config, logging: {
70+
engineLogging: true,
71+
},
72+
};
73+
}
74+
75+
if (!this._boardManager.currentBoard) {
76+
vscode.window.showErrorMessage("Please select a board.");
77+
return;
78+
}
79+
7380
if (!this.resolveOpenOcd(config)) {
7481
return;
7582
}
83+
7684
if (!await this.resolveOpenOcdOptions(config)) {
7785
return;
7886
}
@@ -97,6 +105,19 @@ export class DebugConfigurator {
97105
// make a unique temp folder because keeping same temp folder will corrupt the build when board is changed
98106
const outputFolder = path.join(dc.output || `.build`, this._boardManager.currentBoard.board);
99107
util.mkdirRecursivelySync(path.join(vscode.workspace.rootPath, outputFolder));
108+
if (!dc.sketch || !util.fileExistsSync(path.join(vscode.workspace.rootPath, dc.sketch))) {
109+
await dc.resolveMainSketch();
110+
}
111+
112+
if (!dc.sketch) {
113+
vscode.window.showErrorMessage("No sketch file was found. Please specify the sketch in the arduino.json file");
114+
return false;
115+
}
116+
117+
if (!util.fileExistsSync(path.join(vscode.workspace.rootPath, dc.sketch))) {
118+
vscode.window.showErrorMessage(`Cannot find ${dc.sketch}, Please specify the sketch in the arduino.json file`);
119+
return false;
120+
}
100121
config.program = path.join(vscode.workspace.rootPath, outputFolder, `${path.basename(dc.sketch)}.elf`);
101122

102123
// always compile elf to make sure 10000 debug the right elf

src/debug/debuggerManager.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,21 @@ import * as fs from "fs";
22
import * as path from "path";
33
import * as vscode from "vscode";
44

5-
import { ArduinoSettings } from "../arduino/arduinoSettings";
5+
import { IArduinoSettings } from "../arduino/arduinoSettings";
66
import { BoardManager } from "../arduino/boardManager";
77
import * as platform from "../common/platform";
88
import * as util from "../common/util";
99
import { DeviceContext } from "../deviceContext";
1010

1111
export class DebuggerManager {
12-
private _initialized: boolean = false;
1312
private _usbDetector;
1413
private _debugServerPath: string;
1514
private _miDebuggerPath: string;
1615
private _debuggerMappings: any = {};
1716
private _debuggerBoardMappings: any = {};
1817
constructor(
1918
private _extensionRoot: string,
20-
private _arduinoSettings: ArduinoSettings,
19+
private _arduinoSettings: IArduinoSettings,
2120
private _boardManager: BoardManager) {
2221
}
2322

@@ -53,11 +52,8 @@ export class DebuggerManager {
5352
if (!util.fileExistsSync(this._miDebuggerPath)) {
5453
this._miDebuggerPath = "";
5554
}
56-
this._initialized = true;
57-
}
58-
public get initialized(): boolean {
59-
return this._initialized;
6055
}
56+
6157
public get miDebuggerPath(): string {
6258
return this._miDebuggerPath;
6359
}

0 commit comments

Comments
 (0)
0