Skip to content

Commit af3b268

Browse files
committed
Implement methods to get user fields for board/port combination
1 parent 783e1b8 commit af3b268

File tree

3 files changed

+65
-12
lines changed

3 files changed

+65
-12
lines changed

arduino-ide-extension/src/browser/boards/boards-service-provider.ts

+23-11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
BoardsPackage,
1313
AttachedBoardsChangeEvent,
1414
BoardWithPackage,
15+
BoardUserField,
1516
} from '../../common/protocol';
1617
import { BoardsConfig } from './boards-config';
1718
import { naturalCompare } from '../../common/utils';
@@ -180,8 +181,8 @@ export class BoardsServiceProvider implements FrontendApplicationContribution {
180181
const selectedAvailableBoard = AvailableBoard.is(selectedBoard)
181182
? selectedBoard
182183
: this._availableBoards.find((availableBoard) =>
183-
Board.sameAs(availableBoard, selectedBoard)
184-
);
184+
Board.sameAs(availableBoard, selectedBoard)
185+
);
185186
if (
186187
selectedAvailableBoard &&
187188
selectedAvailableBoard.selected &&
@@ -271,6 +272,18 @@ export class BoardsServiceProvider implements FrontendApplicationContribution {
271272
return boards;
272273
}
273274

275+
async selectedBoardUserFields(): Promise<BoardUserField[]> {
276+
if (!this._boardsConfig.selectedBoard || !this._boardsConfig.selectedPort) {
277+
return [];
278+
}
279+
const fqbn = this._boardsConfig.selectedBoard.fqbn;
280+
if (!fqbn) {
281+
return [];
282+
}
283+
const protocol = this._boardsConfig.selectedPort.protocol;
284+
return await this.boardsService.getBoardUserFields({ fqbn, protocol });
285+
}
286+
274287
/**
275288
* `true` if the `config.selectedBoard` is defined; hence can compile against the board. Otherwise, `false`.
276289
*/
@@ -358,14 +371,14 @@ export class BoardsServiceProvider implements FrontendApplicationContribution {
358371
const timeoutTask =
359372
!!timeout && timeout > 0
360373
? new Promise<void>((_, reject) =>
361-
setTimeout(
362-
() => reject(new Error(`Timeout after ${timeout} ms.`)),
363-
timeout
364-
)
374+
setTimeout(
375+
() => reject(new Error(`Timeout after ${timeout} ms.`)),
376+
timeout
365377
)
378+
)
366379
: new Promise<void>(() => {
367-
/* never */
368-
});
380+
/* never */
381+
});
369382
const waitUntilTask = new Promise<void>((resolve) => {
370383
let candidate = find(what, this.availableBoards);
371384
if (candidate) {
@@ -499,9 +512,8 @@ export class BoardsServiceProvider implements FrontendApplicationContribution {
499512

500513
protected getLastSelectedBoardOnPortKey(port: Port | string): string {
501514
// TODO: we lose the port's `protocol` info (`serial`, `network`, etc.) here if the `port` is a `string`.
502-
return `last-selected-board-on-port:${
503-
typeof port === 'string' ? port : Port.toString(port)
504-
}`;
515+
return `last-selected-board-on-port:${typeof port === 'string' ? port : Port.toString(port)
516+
}`;
505517
}
506518

507519
protected async loadState(): Promise<void> {

arduino-ide-extension/src/common/protocol/boards-service.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ export const BoardsServicePath = '/services/boards-service';
134134
export const BoardsService = Symbol('BoardsService');
135135
export interface BoardsService
136136
extends Installable<BoardsPackage>,
137-
Searchable<BoardsPackage> {
137+
Searchable<BoardsPackage> {
138138
/**
139139
* Deprecated. `getState` should be used to correctly map a board with a port.
140140
* @deprecated
@@ -152,6 +152,7 @@ export interface BoardsService
152152
fqbn: string;
153153
}): Promise<BoardsPackage | undefined>;
154154
searchBoards({ query }: { query?: string }): Promise<BoardWithPackage[]>;
155+
getBoardUserFields(options: { fqbn: string, protocol: string }): Promise<BoardUserField[]>;
155156
}
156157

157158
export interface Port {
@@ -342,6 +343,14 @@ export interface Board {
342343
readonly port?: Port;
343344
}
344345

346+
export interface BoardUserField {
347+
readonly toolId: string;
348+
readonly name: string;
349+
readonly label: string;
350+
readonly secret: boolean;
351+
value: string;
352+
}
353+
345354
export interface BoardWithPackage extends Board {
346355
readonly packageName: string;
347356
readonly packageId: string;

arduino-ide-extension/src/node/boards-service-impl.ts

+32
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
NotificationServiceServer,
1717
AvailablePorts,
1818
BoardWithPackage,
19+
BoardUserField,
1920
} from '../common/protocol';
2021
import {
2122
PlatformInstallRequest,
@@ -36,6 +37,8 @@ import {
3637
import {
3738
ListProgrammersAvailableForUploadRequest,
3839
ListProgrammersAvailableForUploadResponse,
40+
SupportedUserFieldsRequest,
41+
SupportedUserFieldsResponse,
3942
} from './cli-protocol/cc/arduino/cli/commands/v1/upload_pb';
4043
import { InstallWithProgress } from './grpc-installable';
4144

@@ -244,6 +247,35 @@ export class BoardsServiceImpl
244247
return boards;
245248
}
246249

250+
async getBoardUserFields(options: { fqbn: string, protocol: string }): Promise<BoardUserField[]> {
251+
await this.coreClientProvider.initialized;
252+
const coreClient = await this.coreClient();
253+
const { client, instance } = coreClient;
254+
255+
const supportedUserFieldsReq = new SupportedUserFieldsRequest();
256+
supportedUserFieldsReq.setInstance(instance);
257+
supportedUserFieldsReq.setFqbn(options.fqbn);
258+
supportedUserFieldsReq.setProtocol(options.protocol);
259+
260+
const supportedUserFieldsResp = await new Promise<SupportedUserFieldsResponse>(
261+
(resolve, reject) => {
262+
client.supportedUserFields(supportedUserFieldsReq, (err, resp) => {
263+
(!!err ? reject : resolve)(!!err ? err : resp)
264+
})
265+
}
266+
);
267+
return supportedUserFieldsResp.getUserFieldsList().map(e => {
268+
return {
269+
toolId: e.getToolId(),
270+
name: e.getName(),
271+
label: e.getLabel(),
272+
secret: e.getSecret(),
273+
value: "",
274+
};
275+
});
276+
}
277+
278+
247279
async search(options: { query?: string }): Promise<BoardsPackage[]> {
248280
await this.coreClientProvider.initialized;
249281
const coreClient = await this.coreClient();

0 commit comments

Comments
 (0)