@@ -349,12 +349,12 @@ export interface BoardList {
349
349
/**
350
350
* Index of the board+port item that is currently "selected". A board list item is selected, if matches the board+port combination of `boardsConfig`.
351
351
*/
352
- get selectedIndex ( ) : number ;
352
+ readonly selectedIndex : number ;
353
353
354
354
/**
355
355
* Contains all boards recognized from the detected port, and an optional unrecognized one that is derived from the detected port and the `initParam#selectedBoard`.
356
356
*/
357
- get boards ( ) : readonly ( BoardListItemWithBoard | InferredBoardListItem ) [ ] ;
357
+ readonly boards : readonly ( BoardListItemWithBoard | InferredBoardListItem ) [ ] ;
358
358
359
359
/**
360
360
* If `predicate` is not defined, no ports are filtered.
@@ -370,11 +370,6 @@ export interface BoardList {
370
370
Record < 'serial' | 'network' | string , ReturnType < BoardList [ 'ports' ] > >
371
371
> ;
372
372
373
- /**
374
- * What's the default action when the argument item is selected in the UI.
375
- */
376
- // defaultAction(item: BoardListItemUI): BoardListItemAction;
377
-
378
373
/**
379
374
* For dumping the current state of board list for debugging purposes.
380
375
*/
@@ -413,87 +408,25 @@ export function createBoardList(
413
408
items . sort ( boardListItemComparator ) ;
414
409
const selectedIndex = findSelectedIndex ( boardsConfig , items ) ;
415
410
const labels = createBoardListLabels ( boardsConfig , items [ selectedIndex ] ) ;
416
-
417
- const length = items . length ;
418
- let _allPorts : DetectedPort [ ] | undefined ;
419
- const ports = (
420
- predicate : ( detectedPort : DetectedPort ) => boolean = ( ) => true
421
- ) => {
422
- if ( ! _allPorts ) {
423
- _allPorts = [ ] ;
424
- // to keep the order or the detected ports
425
- const visitedPortKeys = new Set < string > ( ) ;
426
- for ( let i = 0 ; i < length ; i ++ ) {
427
- const { port } = items [ i ] ;
428
- const portKey = Port . keyOf ( port ) ;
429
- if ( ! visitedPortKeys . has ( portKey ) ) {
430
- visitedPortKeys . add ( portKey ) ;
431
- const detectedPort = detectedPorts [ portKey ] ;
432
- if ( detectedPort ) {
433
- _allPorts . push ( detectedPort ) ;
434
- }
435
- }
436
- }
437
- }
438
- const ports = _allPorts . filter ( predicate ) ;
439
- const matchingIndex = findMatchingPortIndex (
440
- boardsConfig . selectedPort ,
441
- ports
442
- ) ;
443
- return Object . assign ( ports , { matchingIndex } ) ;
444
- } ;
445
-
446
- let _boards : ( BoardListItemWithBoard | InferredBoardListItem ) [ ] | undefined ;
411
+ const boards = collectBoards ( items ) ;
412
+ const allPorts = collectPorts ( items , detectedPorts ) ;
447
413
return {
448
414
labels,
449
415
items,
450
416
boardsConfig,
451
- get selectedIndex ( ) {
452
- return selectedIndex ;
453
- } ,
454
- get boards ( ) {
455
- if ( ! _boards ) {
456
- _boards = [ ] ;
457
- for ( let i = 0 ; i < length ; i ++ ) {
458
- const item = items [ i ] ;
459
- if ( isInferredBoardListItem ( item ) ) {
460
- _boards . push ( item ) ;
461
- } else if ( item . board ?. fqbn ) {
462
- _boards . push ( < Required < BoardListItem > > item ) ;
463
- }
464
- }
465
- }
466
- return _boards ;
467
- } ,
417
+ boards,
418
+ selectedIndex,
468
419
ports ( predicate ?: ( detectedPort : DetectedPort ) => boolean ) {
469
- return ports ( predicate ) ;
420
+ return filterPorts ( allPorts , boardsConfig . selectedPort , predicate ) ;
470
421
} ,
471
422
portsGroupedByProtocol ( ) {
472
- const result : Record < string , DetectedPort [ ] & { matchingIndex : number } > =
473
- { } ;
474
- const allPorts = ports ( ) ;
475
- for ( const detectedPort of allPorts ) {
476
- const protocol = detectedPort . port . protocol ;
477
- if ( ! result [ protocol ] ) {
478
- result [ protocol ] = Object . assign ( [ ] , {
479
- matchingIndex : - 1 ,
480
- } ) ;
481
- }
482
- const portsOnProtocol = result [ protocol ] ;
483
- portsOnProtocol . push ( detectedPort ) ;
484
- }
485
- const matchItem = allPorts [ allPorts . matchingIndex ] ;
486
- // the cached match index is per all ports. Here, IDE2 needs to adjust the match index per grouped protocol
487
- if ( matchItem ) {
488
- const matchProtocol = matchItem . port . protocol ;
489
- const matchPorts = result [ matchProtocol ] ;
490
- matchPorts . matchingIndex = matchPorts . indexOf ( matchItem ) ;
491
- }
492
- return result ;
423
+ const _allPorts = filterPorts ( allPorts , boardsConfig . selectedPort ) ;
424
+ return portsGroupedByProtocol ( _allPorts ) ;
493
425
} ,
494
426
toString ( ) {
495
427
return JSON . stringify (
496
428
{
429
+ labels,
497
430
detectedPorts,
498
431
boardsConfig,
499
432
items,
@@ -507,6 +440,76 @@ export function createBoardList(
507
440
} ;
508
441
}
509
442
443
+ function portsGroupedByProtocol (
444
+ allPorts : ReturnType < BoardList [ 'ports' ] >
445
+ ) : ReturnType < BoardList [ 'portsGroupedByProtocol' ] > {
446
+ const result : Record < string , DetectedPort [ ] & { matchingIndex : number } > = { } ;
447
+ for ( const detectedPort of allPorts ) {
448
+ const protocol = detectedPort . port . protocol ;
449
+ if ( ! result [ protocol ] ) {
450
+ result [ protocol ] = Object . assign ( [ ] , {
451
+ matchingIndex : - 1 ,
452
+ } ) ;
453
+ }
454
+ const portsOnProtocol = result [ protocol ] ;
455
+ portsOnProtocol . push ( detectedPort ) ;
456
+ }
457
+ const matchItem = allPorts [ allPorts . matchingIndex ] ;
458
+ // the cached match index is per all ports. Here, IDE2 needs to adjust the match index per grouped protocol
459
+ if ( matchItem ) {
460
+ const matchProtocol = matchItem . port . protocol ;
461
+ const matchPorts = result [ matchProtocol ] ;
462
+ matchPorts . matchingIndex = matchPorts . indexOf ( matchItem ) ;
463
+ }
464
+ return result ;
465
+ }
466
+
467
+ function filterPorts (
468
+ allPorts : readonly DetectedPort [ ] ,
469
+ selectedPort : PortIdentifier | undefined ,
470
+ predicate : ( detectedPort : DetectedPort ) => boolean = ( ) => true
471
+ ) : ReturnType < BoardList [ 'ports' ] > {
472
+ const ports = allPorts . filter ( predicate ) ;
473
+ const matchingIndex = findMatchingPortIndex ( selectedPort , ports ) ;
474
+ return Object . assign ( ports , { matchingIndex } ) ;
475
+ }
476
+
477
+ function collectPorts (
478
+ items : readonly BoardListItem [ ] ,
479
+ detectedPorts : DetectedPorts
480
+ ) : DetectedPort [ ] {
481
+ const allPorts : DetectedPort [ ] = [ ] ;
482
+ // to keep the order or the detected ports
483
+ const visitedPortKeys = new Set < string > ( ) ;
484
+ for ( let i = 0 ; i < items . length ; i ++ ) {
485
+ const { port } = items [ i ] ;
486
+ const portKey = Port . keyOf ( port ) ;
487
+ if ( ! visitedPortKeys . has ( portKey ) ) {
488
+ visitedPortKeys . add ( portKey ) ;
489
+ const detectedPort = detectedPorts [ portKey ] ;
490
+ if ( detectedPort ) {
491
+ allPorts . push ( detectedPort ) ;
492
+ }
493
+ }
494
+ }
495
+ return allPorts ;
496
+ }
497
+
498
+ function collectBoards (
499
+ items : readonly BoardListItem [ ]
500
+ ) : readonly ( BoardListItemWithBoard | InferredBoardListItem ) [ ] {
501
+ const boards : ( BoardListItemWithBoard | InferredBoardListItem ) [ ] = [ ] ;
502
+ for ( let i = 0 ; i < items . length ; i ++ ) {
503
+ const item = items [ i ] ;
504
+ if ( isInferredBoardListItem ( item ) ) {
505
+ boards . push ( item ) ;
506
+ } else if ( item . board ?. fqbn ) {
507
+ boards . push ( < Required < BoardListItem > > item ) ;
508
+ }
509
+ }
510
+ return boards ;
511
+ }
512
+
510
513
function findSelectedIndex (
511
514
boardsConfig : BoardsConfig ,
512
515
items : readonly BoardListItem [ ]
0 commit comments