@@ -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 }
0 commit comments