Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 43b5d4e

Browse filesBrowse files
Enhance board config auto-selection with hardwareId (arduino#1913)
1 parent fe19e0e commit 43b5d4e
Copy full SHA for 43b5d4e

File tree

3 files changed

+72
-21
lines changed
Filter options

3 files changed

+72
-21
lines changed

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

Copy file name to clipboardExpand all lines: arduino-ide-extension/src/browser/boards/boards-service-provider.ts
+56-19Lines changed: 56 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -158,15 +158,9 @@ export class BoardsServiceProvider
158158
this.lastAvailablePortsOnUpload = undefined;
159159
}
160160

161-
private portToAutoSelectCanBeDerived(): boolean {
162-
return Boolean(
163-
this.lastBoardsConfigOnUpload && this.lastAvailablePortsOnUpload
164-
);
165-
}
166-
167161
attemptPostUploadAutoSelect(): void {
168162
setTimeout(() => {
169-
if (this.portToAutoSelectCanBeDerived()) {
163+
if (this.lastBoardsConfigOnUpload && this.lastAvailablePortsOnUpload) {
170164
this.attemptAutoSelect({
171165
ports: this._availablePorts,
172166
boards: this._availableBoards,
@@ -185,12 +179,12 @@ export class BoardsServiceProvider
185179
private deriveBoardConfigToAutoSelect(
186180
newState: AttachedBoardsChangeEvent['newState']
187181
): void {
188-
if (!this.portToAutoSelectCanBeDerived()) {
182+
if (!this.lastBoardsConfigOnUpload || !this.lastAvailablePortsOnUpload) {
189183
this.boardConfigToAutoSelect = undefined;
190184
return;
191185
}
192186

193-
const oldPorts = this.lastAvailablePortsOnUpload!;
187+
const oldPorts = this.lastAvailablePortsOnUpload;
194188
const { ports: newPorts, boards: newBoards } = newState;
195189

196190
const appearedPorts =
@@ -205,20 +199,39 @@ export class BoardsServiceProvider
205199
Port.sameAs(board.port, port)
206200
);
207201

208-
const lastBoardsConfigOnUpload = this.lastBoardsConfigOnUpload!;
202+
const lastBoardsConfigOnUpload = this.lastBoardsConfigOnUpload;
209203

210-
if (
211-
boardOnAppearedPort &&
212-
lastBoardsConfigOnUpload.selectedBoard &&
213-
Board.sameAs(
204+
if (boardOnAppearedPort && lastBoardsConfigOnUpload.selectedBoard) {
205+
const boardIsSameHardware = Board.hardwareIdEquals(
214206
boardOnAppearedPort,
215207
lastBoardsConfigOnUpload.selectedBoard
216-
)
217-
) {
208+
);
209+
210+
const boardIsSameFqbn = Board.sameAs(
211+
boardOnAppearedPort,
212+
lastBoardsConfigOnUpload.selectedBoard
213+
);
214+
215+
if (!boardIsSameHardware && !boardIsSameFqbn) continue;
216+
217+
let boardToAutoSelect = boardOnAppearedPort;
218+
if (boardIsSameHardware && !boardIsSameFqbn) {
219+
const { name, fqbn } = lastBoardsConfigOnUpload.selectedBoard;
220+
221+
boardToAutoSelect = {
222+
...boardToAutoSelect,
223+
name:
224+
boardToAutoSelect.name === Unknown || !boardToAutoSelect.name
225+
? name
226+
: boardToAutoSelect.name,
227+
fqbn: boardToAutoSelect.fqbn || fqbn,
228+
};
229+
}
230+
218231
this.clearBoardDiscoverySnapshot();
219232

220233
this.boardConfigToAutoSelect = {
221-
selectedBoard: boardOnAppearedPort,
234+
selectedBoard: boardToAutoSelect,
222235
selectedPort: port,
223236
};
224237
return;
@@ -326,8 +339,10 @@ export class BoardsServiceProvider
326339
// it is just a FQBN, so we need to find the `selected` board among the `AvailableBoards`
327340
const selectedAvailableBoard = AvailableBoard.is(selectedBoard)
328341
? selectedBoard
329-
: this._availableBoards.find((availableBoard) =>
330-
Board.sameAs(availableBoard, selectedBoard)
342+
: this._availableBoards.find(
343+
(availableBoard) =>
344+
Board.hardwareIdEquals(availableBoard, selectedBoard) ||
345+
Board.sameAs(availableBoard, selectedBoard)
331346
);
332347
if (
333348
selectedAvailableBoard &&
@@ -353,9 +368,28 @@ export class BoardsServiceProvider
353368

354369
protected tryReconnect(): boolean {
355370
if (this.latestValidBoardsConfig && !this.canUploadTo(this.boardsConfig)) {
371+
// ** Reconnect to a board unplugged from, and plugged back into the same port
356372
for (const board of this.availableBoards.filter(
357373
({ state }) => state !== AvailableBoard.State.incomplete
358374
)) {
375+
if (
376+
Board.hardwareIdEquals(
377+
this.latestValidBoardsConfig.selectedBoard,
378+
board
379+
)
380+
) {
381+
const { name, fqbn } = this.latestValidBoardsConfig.selectedBoard;
382+
this.boardsConfig = {
383+
selectedBoard: {
384+
name: board.name === Unknown || !board.name ? name : board.name,
385+
fqbn: board.fqbn || fqbn,
386+
port: board.port,
387+
},
388+
selectedPort: board.port,
389+
};
390+
return true;
391+
}
392+
359393
if (
360394
this.latestValidBoardsConfig.selectedBoard.fqbn === board.fqbn &&
361395
this.latestValidBoardsConfig.selectedBoard.name === board.name &&
@@ -365,12 +399,15 @@ export class BoardsServiceProvider
365399
return true;
366400
}
367401
}
402+
// **
368403

404+
// ** Reconnect to a board whose port changed due to an upload
369405
if (!this.boardConfigToAutoSelect) return false;
370406

371407
this.boardsConfig = this.boardConfigToAutoSelect;
372408
this.boardConfigToAutoSelect = undefined;
373409
return true;
410+
// **
374411
}
375412
return false;
376413
}

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

Copy file name to clipboardExpand all lines: arduino-ide-extension/src/common/protocol/boards-service.ts
+14Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ export interface Port {
245245
readonly protocol: string;
246246
readonly protocolLabel: string;
247247
readonly properties?: Record<string, string>;
248+
readonly hardwareId?: string;
248249
}
249250
export namespace Port {
250251
export type Properties = Record<string, string>;
@@ -553,6 +554,19 @@ export namespace Board {
553554
return left.name === right.name && left.fqbn === right.fqbn;
554555
}
555556

557+
export function hardwareIdEquals(left: Board, right: Board): boolean {
558+
if (left.port && right.port) {
559+
const { hardwareId: leftHardwareId } = left.port;
560+
const { hardwareId: rightHardwareId } = right.port;
561+
562+
if (leftHardwareId && rightHardwareId) {
563+
return leftHardwareId === rightHardwareId;
564+
}
565+
}
566+
567+
return false;
568+
}
569+
556570
export function sameAs(left: Board, right: string | Board): boolean {
557571
// How to associate a selected board with one of the available cores: https://typefox.slack.com/archives/CJJHJCJSJ/p1571142327059200
558572
// 1. How to use the FQBN if any and infer the package ID from it: https://typefox.slack.com/archives/CJJHJCJSJ/p1571147549069100

‎arduino-ide-extension/src/node/board-discovery.ts

Copy file name to clipboardExpand all lines: arduino-ide-extension/src/node/board-discovery.ts
+2-2Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,14 +323,14 @@ export class BoardDiscovery
323323
}
324324

325325
private fromRpcPort(rpcPort: RpcPort): Port {
326-
const port = {
326+
return {
327327
address: rpcPort.getAddress(),
328328
addressLabel: rpcPort.getLabel(),
329329
protocol: rpcPort.getProtocol(),
330330
protocolLabel: rpcPort.getProtocolLabel(),
331331
properties: Port.Properties.create(rpcPort.getPropertiesMap().toObject()),
332+
hardwareId: rpcPort.getHardwareId(),
332333
};
333-
return port;
334334
}
335335
}
336336

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.