@@ -158,15 +158,9 @@ export class BoardsServiceProvider
158
158
this . lastAvailablePortsOnUpload = undefined ;
159
159
}
160
160
161
- private portToAutoSelectCanBeDerived ( ) : boolean {
162
- return Boolean (
163
- this . lastBoardsConfigOnUpload && this . lastAvailablePortsOnUpload
164
- ) ;
165
- }
166
-
167
161
attemptPostUploadAutoSelect ( ) : void {
168
162
setTimeout ( ( ) => {
169
- if ( this . portToAutoSelectCanBeDerived ( ) ) {
163
+ if ( this . lastBoardsConfigOnUpload && this . lastAvailablePortsOnUpload ) {
170
164
this . attemptAutoSelect ( {
171
165
ports : this . _availablePorts ,
172
166
boards : this . _availableBoards ,
@@ -185,12 +179,12 @@ export class BoardsServiceProvider
185
179
private deriveBoardConfigToAutoSelect (
186
180
newState : AttachedBoardsChangeEvent [ 'newState' ]
187
181
) : void {
188
- if ( ! this . portToAutoSelectCanBeDerived ( ) ) {
182
+ if ( ! this . lastBoardsConfigOnUpload || ! this . lastAvailablePortsOnUpload ) {
189
183
this . boardConfigToAutoSelect = undefined ;
190
184
return ;
191
185
}
192
186
193
- const oldPorts = this . lastAvailablePortsOnUpload ! ;
187
+ const oldPorts = this . lastAvailablePortsOnUpload ;
194
188
const { ports : newPorts , boards : newBoards } = newState ;
195
189
196
190
const appearedPorts =
@@ -205,20 +199,39 @@ export class BoardsServiceProvider
205
199
Port . sameAs ( board . port , port )
206
200
) ;
207
201
208
- const lastBoardsConfigOnUpload = this . lastBoardsConfigOnUpload ! ;
202
+ const lastBoardsConfigOnUpload = this . lastBoardsConfigOnUpload ;
209
203
210
- if (
211
- boardOnAppearedPort &&
212
- lastBoardsConfigOnUpload . selectedBoard &&
213
- Board . sameAs (
204
+ if ( boardOnAppearedPort && lastBoardsConfigOnUpload . selectedBoard ) {
205
+ const boardIsSameHardware = Board . hardwareIdEquals (
214
206
boardOnAppearedPort ,
215
207
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
+
218
231
this . clearBoardDiscoverySnapshot ( ) ;
219
232
220
233
this . boardConfigToAutoSelect = {
221
- selectedBoard : boardOnAppearedPort ,
234
+ selectedBoard : boardToAutoSelect ,
222
235
selectedPort : port ,
223
236
} ;
224
237
return ;
@@ -326,8 +339,10 @@ export class BoardsServiceProvider
326
339
// it is just a FQBN, so we need to find the `selected` board among the `AvailableBoards`
327
340
const selectedAvailableBoard = AvailableBoard . is ( selectedBoard )
328
341
? 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 )
331
346
) ;
332
347
if (
333
348
selectedAvailableBoard &&
@@ -353,9 +368,28 @@ export class BoardsServiceProvider
353
368
354
369
protected tryReconnect ( ) : boolean {
355
370
if ( this . latestValidBoardsConfig && ! this . canUploadTo ( this . boardsConfig ) ) {
371
+ // ** Reconnect to a board unplugged from, and plugged back into the same port
356
372
for ( const board of this . availableBoards . filter (
357
373
( { state } ) => state !== AvailableBoard . State . incomplete
358
374
) ) {
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
+
359
393
if (
360
394
this . latestValidBoardsConfig . selectedBoard . fqbn === board . fqbn &&
361
395
this . latestValidBoardsConfig . selectedBoard . name === board . name &&
@@ -365,12 +399,15 @@ export class BoardsServiceProvider
365
399
return true ;
366
400
}
367
401
}
402
+ // **
368
403
404
+ // ** Reconnect to a board whose port changed due to an upload
369
405
if ( ! this . boardConfigToAutoSelect ) return false ;
370
406
371
407
this . boardsConfig = this . boardConfigToAutoSelect ;
372
408
this . boardConfigToAutoSelect = undefined ;
373
409
return true ;
410
+ // **
374
411
}
375
412
return false ;
376
413
}
0 commit comments