@@ -21,36 +21,28 @@ import (
2121 "log"
2222 "os"
2323 "sort"
24- "time"
2524
2625 "github.com/arduino/arduino-cli/arduino/discovery"
26+ "github.com/arduino/arduino-cli/arduino/discovery/discoverymanager"
2727 ui "github.com/gizak/termui/v3"
2828 "github.com/gizak/termui/v3/widgets"
29+ "github.com/sirupsen/logrus"
2930)
3031
3132func main () {
32- discoveries := [] * discovery. PluggableDiscovery {}
33- discEvent := make ( chan * discovery. Event )
33+ logrus . SetLevel ( logrus . ErrorLevel )
34+ dm := discoverymanager . New ( )
3435 for _ , discCmd := range os .Args [1 :] {
35- disc := discovery .New ("" , discCmd )
36- if err := disc .Run (); err != nil {
37- log .Fatal ("Error starting discovery:" , err )
38- }
39- if err := disc .Start (); err != nil {
40- log .Fatal ("Error starting discovery:" , err )
41- }
42- eventChan , err := disc .StartSync (10 )
43- if err != nil {
44- log .Fatal ("Error starting discovery:" , err )
45- }
46- go func () {
47- for msg := range eventChan {
48- discEvent <- msg
49- }
50- }()
51- discoveries = append (discoveries , disc )
36+ disc := discovery .New (discCmd , discCmd )
37+ dm .Add (disc )
5238 }
39+ dm .Start ()
5340
41+ activePorts := map [string ]* discovery.Port {}
42+ watcher , err := dm .Watch ()
43+ if err != nil {
44+ log .Fatalf ("failed to start discvoeries: %v" , err )
45+ }
5446 if err := ui .Init (); err != nil {
5547 log .Fatalf ("failed to initialize termui: %v" , err )
5648 }
@@ -66,15 +58,20 @@ func main() {
6658 updateList := func () {
6759 rows := []string {}
6860 rows = append (rows , "Available ports list:" )
69- for _ , disc := range discoveries {
70- for i , port := range disc .ListCachedPorts () {
71- rows = append (rows , fmt .Sprintf (" [%04d] Address: %s" , i , port .AddressLabel ))
72- rows = append (rows , fmt .Sprintf (" Protocol: %s" , port .ProtocolLabel ))
73- keys := port .Properties .Keys ()
74- sort .Strings (keys )
75- for _ , k := range keys {
76- rows = append (rows , fmt .Sprintf (" %s=%s" , k , port .Properties .Get (k )))
77- }
61+
62+ ids := sort.StringSlice {}
63+ for id := range activePorts {
64+ ids = append (ids , id )
65+ }
66+ ids .Sort ()
67+ for _ , id := range ids {
68+ port := activePorts [id ]
69+ rows = append (rows , fmt .Sprintf ("> Address: %s" , port .AddressLabel ))
70+ rows = append (rows , fmt .Sprintf (" Protocol: %s" , port .ProtocolLabel ))
71+ keys := port .Properties .Keys ()
72+ sort .Strings (keys )
73+ for _ , k := range keys {
74+ rows = append (rows , fmt .Sprintf (" %s=%s" , k , port .Properties .Get (k )))
7875 }
7976 }
8077 l .Rows = rows
@@ -123,20 +120,16 @@ out:
123120 previousKey = e .ID
124121 }
125122
126- case <- discEvent :
123+ case ev := <- watcher .Feed ():
124+ if ev .Type == "add" {
125+ activePorts [ev .Port .Address + "|" + ev .Port .Protocol ] = ev .Port
126+ }
127+ if ev .Type == "remove" {
128+ delete (activePorts , ev .Port .Address + "|" + ev .Port .Protocol )
129+ }
127130 updateList ()
128131 }
129132
130133 ui .Render (l )
131134 }
132-
133- for _ , disc := range discoveries {
134- disc .Quit ()
135- fmt .Println ("Discovery QUITed" )
136- for disc .State () == discovery .Alive {
137- time .Sleep (time .Millisecond )
138- }
139- fmt .Println ("Discovery correctly terminated" )
140- }
141-
142135}
0 commit comments