Skip to content

Commit a414c87

Browse files
refine port selection logic & add delayed clean up
1 parent cac5dab commit a414c87

File tree

2 files changed

+51
-28
lines changed

2 files changed

+51
-28
lines changed

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

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ export class BoardsServiceProvider implements FrontendApplicationContribution {
6666
protected _availableBoards: AvailableBoard[] = [];
6767

6868
private lastBoardsConfigOnUpload: BoardsConfig.Config | undefined;
69+
private lastAvailablePortsOnUpload: Port[] | undefined;
6970
private boardConfigToAutoSelect: BoardsConfig.Config | undefined;
7071

7172
/**
@@ -114,24 +115,44 @@ export class BoardsServiceProvider implements FrontendApplicationContribution {
114115
return this._reconciled.promise;
115116
}
116117

117-
public setLastBoardsConfigOnUpload(
118+
public snapshotBoardDiscoveryOnUpload(): void {
119+
this.setLastBoardsConfigOnUpload(this.boardsConfig);
120+
this.setAvailablePortsOnUpload(this._availablePorts);
121+
}
122+
123+
private setLastBoardsConfigOnUpload(
118124
value: BoardsConfig.Config | undefined
119125
): void {
120126
this.lastBoardsConfigOnUpload = value;
121127
}
122128

129+
private setAvailablePortsOnUpload(value: Port[] | undefined): void {
130+
this.lastAvailablePortsOnUpload = value;
131+
}
132+
133+
public forcePostUploadReconnect(): void {
134+
setTimeout(() => {
135+
const newState = {
136+
ports: this._availablePorts,
137+
boards: this._availableBoards,
138+
};
139+
this.deriveBoardConfigToAutoSelect(newState);
140+
if (this.lastBoardsConfigOnUpload) {
141+
this.tryReconnect();
142+
}
143+
}, 2000); // 2 second delay same as IDE 1.8
144+
}
145+
123146
private deriveBoardConfigToAutoSelect(
124-
event: AttachedBoardsChangeEvent
147+
newState: AttachedBoardsChangeEvent['newState']
125148
): void {
126-
if (!this.lastBoardsConfigOnUpload) {
149+
if (!this.lastBoardsConfigOnUpload || !this.lastAvailablePortsOnUpload) {
127150
this.boardConfigToAutoSelect = undefined;
128151
return;
129152
}
130153

131-
const {
132-
oldState: { ports: oldPorts },
133-
newState: { ports: newPorts, boards: newBoards },
134-
} = event;
154+
const oldPorts = this.lastAvailablePortsOnUpload;
155+
const { ports: newPorts, boards: newBoards } = newState;
135156

136157
const appearedPorts =
137158
oldPorts.length > 0
@@ -141,25 +162,28 @@ export class BoardsServiceProvider implements FrontendApplicationContribution {
141162
: newPorts;
142163

143164
if (appearedPorts.length > 0) {
144-
const lastSelectionOnUpload = this.lastBoardsConfigOnUpload;
145-
this.setLastBoardsConfigOnUpload(undefined);
146-
147-
const appearedPort = appearedPorts[0];
165+
for (const port of appearedPorts) {
166+
const boardOnAppearedPort = newBoards.find((board: Board) =>
167+
Port.sameAs(board.port, port)
168+
);
148169

149-
const boardOnAppearedPort = newBoards.find((board: Board) =>
150-
Port.sameAs(board.port, appearedPort)
151-
);
170+
if (
171+
boardOnAppearedPort &&
172+
this.lastBoardsConfigOnUpload.selectedBoard &&
173+
Board.sameAs(
174+
boardOnAppearedPort,
175+
this.lastBoardsConfigOnUpload.selectedBoard
176+
)
177+
) {
178+
this.setLastBoardsConfigOnUpload(undefined);
179+
this.setAvailablePortsOnUpload(undefined);
152180

153-
if (
154-
boardOnAppearedPort &&
155-
lastSelectionOnUpload.selectedBoard &&
156-
Board.sameAs(boardOnAppearedPort, lastSelectionOnUpload.selectedBoard)
157-
) {
158-
this.boardConfigToAutoSelect = {
159-
selectedBoard: boardOnAppearedPort,
160-
selectedPort: appearedPort,
161-
};
162-
return;
181+
this.boardConfigToAutoSelect = {
182+
selectedBoard: boardOnAppearedPort,
183+
selectedPort: port,
184+
};
185+
return;
186+
}
163187
}
164188
}
165189
}
@@ -176,7 +200,7 @@ export class BoardsServiceProvider implements FrontendApplicationContribution {
176200
const { uploadInProgress } = event;
177201

178202
if (!uploadInProgress) {
179-
this.deriveBoardConfigToAutoSelect(event);
203+
this.deriveBoardConfigToAutoSelect(event.newState);
180204
}
181205

182206
this._attachedBoards = event.newState.boards;

arduino-ide-extension/src/browser/contributions/upload-sketch.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,7 @@ export class UploadSketch extends CoreServiceContribution {
190190
// toggle the toolbar button and menu item state.
191191
// uploadInProgress will be set to false whether the upload fails or not
192192
this.uploadInProgress = true;
193-
this.boardsServiceProvider.setLastBoardsConfigOnUpload(
194-
this.boardsServiceProvider.boardsConfig
195-
);
193+
this.boardsServiceProvider.snapshotBoardDiscoveryOnUpload();
196194
this.onDidChangeEmitter.fire();
197195
this.clearVisibleNotification();
198196

@@ -246,6 +244,7 @@ export class UploadSketch extends CoreServiceContribution {
246244
this.handleError(e);
247245
} finally {
248246
this.uploadInProgress = false;
247+
this.boardsServiceProvider.forcePostUploadReconnect();
249248
this.onDidChangeEmitter.fire();
250249
}
251250
}

0 commit comments

Comments
 (0)