Skip to content

Commit 43b5d4e

Browse files
Enhance board config auto-selection with hardwareId (#1913)
1 parent fe19e0e commit 43b5d4e

File tree

3 files changed

+72
-21
lines changed

3 files changed

+72
-21
lines changed

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

+56-19
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
}

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

+14
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

Diff for: arduino-ide-extension/src/node/board-discovery.ts

+2-2
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)