Skip to content

Commit cee40b3

Browse files
WIP, auto-select with hardwareId
1 parent 25b545d commit cee40b3

File tree

3 files changed

+61
-23
lines changed

3 files changed

+61
-23
lines changed

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

+42-21
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,36 @@ 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.sameDistinctHardwareAs(
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) return;
216+
217+
let boardToAutoSelect = boardOnAppearedPort;
218+
if (boardIsSameHardware && !boardIsSameFqbn) {
219+
const { name, fqbn } = lastBoardsConfigOnUpload.selectedBoard;
220+
221+
boardToAutoSelect = {
222+
...boardToAutoSelect,
223+
name,
224+
fqbn,
225+
};
226+
}
227+
218228
this.clearBoardDiscoverySnapshot();
219229

220230
this.boardConfigToAutoSelect = {
221-
selectedBoard: boardOnAppearedPort,
231+
selectedBoard: boardToAutoSelect,
222232
selectedPort: port,
223233
};
224234
return;
@@ -326,8 +336,10 @@ export class BoardsServiceProvider
326336
// it is just a FQBN, so we need to find the `selected` board among the `AvailableBoards`
327337
const selectedAvailableBoard = AvailableBoard.is(selectedBoard)
328338
? selectedBoard
329-
: this._availableBoards.find((availableBoard) =>
330-
Board.sameAs(availableBoard, selectedBoard)
339+
: this._availableBoards.find(
340+
(availableBoard) =>
341+
Board.sameDistinctHardwareAs(availableBoard, selectedBoard) ||
342+
Board.sameAs(availableBoard, selectedBoard)
331343
);
332344
if (
333345
selectedAvailableBoard &&
@@ -353,24 +365,33 @@ export class BoardsServiceProvider
353365

354366
protected tryReconnect(): boolean {
355367
if (this.latestValidBoardsConfig && !this.canUploadTo(this.boardsConfig)) {
368+
// ** Reconnect to a board unplugged from, and plugged back into the same port
356369
for (const board of this.availableBoards.filter(
357370
({ state }) => state !== AvailableBoard.State.incomplete
358371
)) {
359372
if (
360-
this.latestValidBoardsConfig.selectedBoard.fqbn === board.fqbn &&
361-
this.latestValidBoardsConfig.selectedBoard.name === board.name &&
373+
(Board.sameDistinctHardwareAs(
374+
this.latestValidBoardsConfig.selectedBoard,
375+
board
376+
) ||
377+
(this.latestValidBoardsConfig.selectedBoard.fqbn === board.fqbn &&
378+
this.latestValidBoardsConfig.selectedBoard.name ===
379+
board.name)) &&
362380
Port.sameAs(this.latestValidBoardsConfig.selectedPort, board.port)
363381
) {
364382
this.boardsConfig = this.latestValidBoardsConfig;
365383
return true;
366384
}
367385
}
386+
// **
368387

388+
// ** Reconnect to a board whose port changed due to an upload
369389
if (!this.boardConfigToAutoSelect) return false;
370390

371391
this.boardsConfig = this.boardConfigToAutoSelect;
372392
this.boardConfigToAutoSelect = undefined;
373393
return true;
394+
// **
374395
}
375396
return false;
376397
}

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

+17
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,22 @@ export namespace Board {
553554
return left.name === right.name && left.fqbn === right.fqbn;
554555
}
555556

557+
export function sameDistinctHardwareAs(
558+
left: Board,
559+
right: string | Board
560+
): boolean {
561+
if (Board.is(right) && left.port && right.port) {
562+
const { hardwareId: leftHardwareId } = left.port;
563+
const { hardwareId: rightHardwareId } = right.port;
564+
565+
if (leftHardwareId && rightHardwareId) {
566+
return leftHardwareId === rightHardwareId;
567+
}
568+
}
569+
570+
return false;
571+
}
572+
556573
export function sameAs(left: Board, right: string | Board): boolean {
557574
// How to associate a selected board with one of the available cores: https://typefox.slack.com/archives/CJJHJCJSJ/p1571142327059200
558575
// 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(), // method to be confirmed
332333
};
333-
return port;
334334
}
335335
}
336336

0 commit comments

Comments
 (0)