@@ -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