Skip to content

Commit 33dfa47

Browse files
committed
Change board list watcher ouptut formatting
1 parent 61eae53 commit 33dfa47

File tree

3 files changed

+88
-21
lines changed

3 files changed

+88
-21
lines changed

cli/board/list.go

+78-21
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func runListCommand(cmd *cobra.Command, args []string) {
6363
feedback.Errorf("Error detecting boards: %v", err)
6464
os.Exit(errorcodes.ErrGeneric)
6565
}
66-
watchList(inst)
66+
watchList(cmd, inst)
6767
os.Exit(0)
6868
}
6969

@@ -89,45 +89,46 @@ func runListCommand(cmd *cobra.Command, args []string) {
8989
feedback.PrintResult(result{ports})
9090
}
9191

92-
func watchList(inst *rpc.Instance) {
92+
func watchList(cmd *cobra.Command, inst *rpc.Instance) {
9393
pm := commands.GetPackageManager(inst.Id)
9494
eventsChan, err := commands.WatchListBoards(pm)
9595
if err != nil {
9696
feedback.Errorf("Error detecting boards: %v", err)
9797
os.Exit(errorcodes.ErrNetwork)
9898
}
9999

100-
boardPorts := map[string]*commands.BoardPort{}
100+
// This is done to avoid printing the header each time a new event is received
101+
if feedback.GetFormat() == feedback.Text {
102+
t := table.New()
103+
t.SetHeader("Port", "Type", "Event", "Board Name", "FQBN", "Core")
104+
t.SetColumnWidthMode()
105+
feedback.Print(t.Render())
106+
}
107+
101108
for event := range eventsChan {
102-
switch event.Type {
103-
case "add":
104-
boardPorts[event.Port.Address] = &commands.BoardPort{
109+
boards := []*rpc.BoardListItem{}
110+
if event.Type == "add" {
111+
boards, err = board.Identify(pm, &commands.BoardPort{
105112
Address: event.Port.Address,
106113
Label: event.Port.AddressLabel,
107114
Prefs: event.Port.Properties,
108115
IdentificationPrefs: event.Port.IdentificationProperties,
109116
Protocol: event.Port.Protocol,
110117
ProtocolLabel: event.Port.ProtocolLabel,
111-
}
112-
case "remove":
113-
delete(boardPorts, event.Port.Address)
114-
}
115-
116-
ports := []*rpc.DetectedPort{}
117-
for _, p := range boardPorts {
118-
boardList, err := board.Identify(pm, p)
118+
})
119119
if err != nil {
120120
feedback.Errorf("Error identifying board: %v", err)
121121
os.Exit(errorcodes.ErrNetwork)
122122
}
123-
ports = append(ports, &rpc.DetectedPort{
124-
Address: p.Address,
125-
Protocol: p.Protocol,
126-
ProtocolLabel: p.ProtocolLabel,
127-
Boards: boardList,
128-
})
129123
}
130-
feedback.PrintResult(result{ports})
124+
125+
feedback.PrintResult(watchEvent{
126+
Type: event.Type,
127+
Address: event.Port.Address,
128+
Protocol: event.Port.Protocol,
129+
ProtocolLabel: event.Port.ProtocolLabel,
130+
Boards: boards,
131+
})
131132
}
132133
}
133134

@@ -191,3 +192,59 @@ func (dr result) String() string {
191192
}
192193
return t.Render()
193194
}
195+
196+
type watchEvent struct {
197+
Type string `json:"type"`
198+
Address string `json:"address,omitempty"`
199+
Protocol string `json:"protocol,omitempty"`
200+
ProtocolLabel string `json:"protocol_label,omitempty"`
201+
Boards []*rpc.BoardListItem `json:"boards,omitempty"`
202+
}
203+
204+
func (dr watchEvent) Data() interface{} {
205+
return dr
206+
}
207+
208+
func (dr watchEvent) String() string {
209+
t := table.New()
210+
211+
event := map[string]string{
212+
"add": "Connected",
213+
"remove": "Disconnected",
214+
}[dr.Type]
215+
216+
address := fmt.Sprintf("%s://%s", dr.Protocol, dr.Address)
217+
if dr.Protocol == "serial" || dr.Protocol == "" {
218+
address = dr.Address
219+
}
220+
protocol := dr.ProtocolLabel
221+
if boards := dr.Boards; len(boards) > 0 {
222+
sort.Slice(boards, func(i, j int) bool {
223+
x, y := boards[i], boards[j]
224+
return x.GetName() < y.GetName() || (x.GetName() == y.GetName() && x.GetFQBN() < y.GetFQBN())
225+
})
226+
for _, b := range boards {
227+
board := b.GetName()
228+
229+
// to improve the user experience, show on a dedicated column
230+
// the name of the core supporting the board detected
231+
var coreName = ""
232+
fqbn, err := cores.ParseFQBN(b.GetFQBN())
233+
if err == nil {
234+
coreName = fmt.Sprintf("%s:%s", fqbn.Package, fqbn.PlatformArch)
235+
}
236+
237+
t.AddRow(address, protocol, event, board, fqbn, coreName)
238+
239+
// reset address and protocol, we only show them on the first row
240+
address = ""
241+
protocol = ""
242+
}
243+
} else {
244+
board := ""
245+
fqbn := ""
246+
coreName := ""
247+
t.AddRow(address, protocol, event, board, fqbn, coreName)
248+
}
249+
return t.Render()
250+
}

cli/feedback/exported.go

+5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ func SetFormat(f OutputFormat) {
3434
fb.SetFormat(f)
3535
}
3636

37+
// GetFormat returns the currently set output format
38+
func GetFormat() OutputFormat {
39+
return fb.GetFormat()
40+
}
41+
3742
// OutputWriter returns the underlying io.Writer to be used when the Print*
3843
// api is not enough
3944
func OutputWriter() io.Writer {

cli/feedback/feedback.go

+5
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ func (fb *Feedback) SetFormat(f OutputFormat) {
6868
fb.format = f
6969
}
7070

71+
// GetFormat returns the output format currently set
72+
func (fb *Feedback) GetFormat() OutputFormat {
73+
return fb.format
74+
}
75+
7176
// OutputWriter returns the underlying io.Writer to be used when the Print*
7277
// api is not enough.
7378
func (fb *Feedback) OutputWriter() io.Writer {

0 commit comments

Comments
 (0)