Skip to content

Commit c60ea5e

Browse files
cmagliesilvanocerza
authored andcommitted
Various minor refactors (arduino#1501)
* Factored pluggable monitor creation * Factored out code duplication * EnumerateMonitorPortSettings does require only protocol * Monitor.Open does require only address and protocol * Added GetPortAddressAndProtocol helper * fix i18n * Apply suggestions from code review Co-authored-by: Silvano Cerza <[email protected]>
1 parent b5e667c commit c60ea5e

File tree

10 files changed

+127
-125
lines changed

10 files changed

+127
-125
lines changed

Diff for: arduino/monitor/monitor.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"github.com/arduino/arduino-cli/cli/globals"
3030
"github.com/arduino/arduino-cli/executils"
3131
"github.com/arduino/arduino-cli/i18n"
32-
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
3332
"github.com/sirupsen/logrus"
3433
)
3534

@@ -264,9 +263,9 @@ func (mon *PluggableMonitor) Configure(param, value string) error {
264263
}
265264

266265
// Open connects to the given Port. A communication channel is opened
267-
func (mon *PluggableMonitor) Open(port *rpc.Port) (io.ReadWriter, error) {
268-
if port.Protocol != mon.supportedProtocol {
269-
return nil, fmt.Errorf("invalid monitor protocol '%s': only '%s' is accepted", port.Protocol, mon.supportedProtocol)
266+
func (mon *PluggableMonitor) Open(portAddress, portProtocol string) (io.ReadWriter, error) {
267+
if portProtocol != mon.supportedProtocol {
268+
return nil, fmt.Errorf("invalid monitor protocol '%s': only '%s' is accepted", portProtocol, mon.supportedProtocol)
270269
}
271270

272271
tcpListener, err := net.Listen("tcp", "127.0.0.1:")
@@ -276,7 +275,7 @@ func (mon *PluggableMonitor) Open(port *rpc.Port) (io.ReadWriter, error) {
276275
defer tcpListener.Close()
277276
tcpListenerPort := tcpListener.Addr().(*net.TCPAddr).Port
278277

279-
if err := mon.sendCommand(fmt.Sprintf("OPEN 127.0.0.1:%d %s\n", tcpListenerPort, port.Address)); err != nil {
278+
if err := mon.sendCommand(fmt.Sprintf("OPEN 127.0.0.1:%d %s\n", tcpListenerPort, portAddress)); err != nil {
280279
return nil, err
281280
}
282281
if _, err := mon.waitMessage(time.Second*10, "open"); err != nil {

Diff for: arduino/monitor/monitor_test.go

+3-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"testing"
2525
"time"
2626

27-
"github.com/arduino/arduino-cli/arduino/discovery"
2827
"github.com/arduino/arduino-cli/executils"
2928
"github.com/arduino/go-paths-helper"
3029
"github.com/stretchr/testify/require"
@@ -59,12 +58,11 @@ func TestDummyMonitor(t *testing.T) {
5958
err = mon.Configure("speed", "38400")
6059
require.NoError(t, err)
6160

62-
port := &discovery.Port{Address: "/dev/ttyACM0", Protocol: "test"}
63-
rw, err := mon.Open(port.ToRPC())
61+
rw, err := mon.Open("/dev/ttyACM0", "test")
6462
require.NoError(t, err)
6563

6664
// Double open -> error: port already opened
67-
_, err = mon.Open(port.ToRPC())
65+
_, err = mon.Open("/dev/ttyACM0", "test")
6866
require.Error(t, err)
6967

7068
// Write "TEST"
@@ -93,7 +91,7 @@ func TestDummyMonitor(t *testing.T) {
9391
time.Sleep(100 * time.Millisecond)
9492
require.Equal(t, int32(1), atomic.LoadInt32(&completed))
9593

96-
rw, err = mon.Open(port.ToRPC())
94+
rw, err = mon.Open("/dev/ttyACM0", "test")
9795
require.NoError(t, err)
9896
n, err = rw.Write([]byte("TEST"))
9997
require.NoError(t, err)

Diff for: cli/arguments/port.go

+15
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,21 @@ func (p *Port) AddToCommand(cmd *cobra.Command) {
4646
cmd.Flags().DurationVar(&p.timeout, "discovery-timeout", 5*time.Second, tr("Max time to wait for port discovery, e.g.: 30s, 1m"))
4747
}
4848

49+
// GetPortAddressAndProtocol returns only the port address and the port protocol
50+
// without any other port metadata obtained from the discoveries. This method allows
51+
// to bypass the discoveries unless the protocol is not specified: in this
52+
// case the discoveries are needed to autodetect the protocol.
53+
func (p *Port) GetPortAddressAndProtocol(instance *rpc.Instance, sk *sketch.Sketch) (string, string, error) {
54+
if p.protocol != "" {
55+
return p.address, p.protocol, nil
56+
}
57+
port, err := p.GetPort(instance, sk)
58+
if err != nil {
59+
return "", "", err
60+
}
61+
return port.Address, port.Protocol, nil
62+
}
63+
4964
// GetPort returns the Port obtained by parsing command line arguments.
5065
// The extra metadata for the ports is obtained using the pluggable discoveries.
5166
func (p *Port) GetPort(instance *rpc.Instance, sk *sketch.Sketch) (*discovery.Port, error) {

Diff for: cli/monitor/monitor.go

+14-23
Original file line numberDiff line numberDiff line change
@@ -70,23 +70,23 @@ func runMonitorCmd(cmd *cobra.Command, args []string) {
7070
quiet = true
7171
}
7272

73-
port, err := portArgs.GetPort(instance, nil)
73+
portAddress, portProtocol, err := portArgs.GetPortAddressAndProtocol(instance, nil)
7474
if err != nil {
7575
feedback.Error(err)
7676
os.Exit(errorcodes.ErrGeneric)
7777
}
7878

79+
enumerateResp, err := monitor.EnumerateMonitorPortSettings(context.Background(), &rpc.EnumerateMonitorPortSettingsRequest{
80+
Instance: instance,
81+
PortProtocol: portProtocol,
82+
Fqbn: "",
83+
})
84+
if err != nil {
85+
feedback.Error(tr("Error getting port settings details: %s", err))
86+
os.Exit(errorcodes.ErrGeneric)
87+
}
7988
if describe {
80-
res, err := monitor.EnumerateMonitorPortSettings(context.Background(), &rpc.EnumerateMonitorPortSettingsRequest{
81-
Instance: instance,
82-
Port: port.ToRPC(),
83-
Fqbn: "",
84-
})
85-
if err != nil {
86-
feedback.Error(tr("Error getting port settings details: %s"), err)
87-
os.Exit(errorcodes.ErrGeneric)
88-
}
89-
feedback.PrintResult(&detailsResult{Settings: res.Settings})
89+
feedback.PrintResult(&detailsResult{Settings: enumerateResp.Settings})
9090
return
9191
}
9292

@@ -99,15 +99,6 @@ func runMonitorCmd(cmd *cobra.Command, args []string) {
9999

100100
configuration := &rpc.MonitorPortConfiguration{}
101101
if len(configs) > 0 {
102-
resp, err := monitor.EnumerateMonitorPortSettings(context.Background(), &rpc.EnumerateMonitorPortSettingsRequest{
103-
Instance: instance,
104-
Port: port.ToRPC(),
105-
Fqbn: "",
106-
})
107-
if err != nil {
108-
feedback.Error(err)
109-
os.Exit(errorcodes.ErrGeneric)
110-
}
111102
for _, config := range configs {
112103
split := strings.SplitN(config, "=", 2)
113104
k := ""
@@ -118,7 +109,7 @@ func runMonitorCmd(cmd *cobra.Command, args []string) {
118109
}
119110

120111
var setting *rpc.MonitorPortSettingDescriptor
121-
for _, s := range resp.GetSettings() {
112+
for _, s := range enumerateResp.GetSettings() {
122113
if k == "" {
123114
if contains(s.EnumValues, v) {
124115
setting = s
@@ -151,7 +142,7 @@ func runMonitorCmd(cmd *cobra.Command, args []string) {
151142
}
152143
portProxy, _, err := monitor.Monitor(context.Background(), &rpc.MonitorRequest{
153144
Instance: instance,
154-
Port: port.ToRPC(),
145+
Port: &rpc.Port{Address: portAddress, Protocol: portProtocol},
155146
Fqbn: "",
156147
PortConfiguration: configuration,
157148
})
@@ -178,7 +169,7 @@ func runMonitorCmd(cmd *cobra.Command, args []string) {
178169
}()
179170

180171
if !quiet {
181-
feedback.Print(tr("Connected to %s! Press CTRL-C to exit.", port.String()))
172+
feedback.Print(tr("Connected to %s! Press CTRL-C to exit.", portAddress))
182173
}
183174

184175
// Wait for port closed

Diff for: commands/monitor/monitor.go

+28-20
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,11 @@ func Monitor(ctx context.Context, req *rpc.MonitorRequest) (*PortProxy, *pluggab
5959
return nil, nil, &commands.InvalidInstanceError{}
6060
}
6161

62-
monitorRef, err := findMonitorForProtocolAndBoard(pm, req.GetPort(), req.GetFqbn())
62+
m, err := findMonitorForProtocolAndBoard(pm, req.GetPort().GetProtocol(), req.GetFqbn())
6363
if err != nil {
6464
return nil, nil, err
6565
}
6666

67-
tool := pm.FindMonitorDependency(monitorRef)
68-
if tool == nil {
69-
return nil, nil, &commands.MonitorNotFoundError{Monitor: monitorRef.String()}
70-
}
71-
72-
m := pluggableMonitor.New(monitorRef.Name, tool.InstallDir.Join(monitorRef.Name).String())
73-
7467
if err := m.Run(); err != nil {
7568
return nil, nil, &commands.FailedMonitorError{Cause: err}
7669
}
@@ -80,7 +73,7 @@ func Monitor(ctx context.Context, req *rpc.MonitorRequest) (*PortProxy, *pluggab
8073
return nil, nil, &commands.FailedMonitorError{Cause: err}
8174
}
8275

83-
monIO, err := m.Open(req.GetPort())
76+
monIO, err := m.Open(req.GetPort().GetAddress(), req.GetPort().GetProtocol())
8477
if err != nil {
8578
return nil, nil, &commands.FailedMonitorError{Cause: err}
8679
}
@@ -95,15 +88,13 @@ func Monitor(ctx context.Context, req *rpc.MonitorRequest) (*PortProxy, *pluggab
9588
}, descriptor, nil
9689
}
9790

98-
func findMonitorForProtocolAndBoard(pm *packagemanager.PackageManager, port *rpc.Port, fqbn string) (*cores.MonitorDependency, error) {
99-
if port == nil {
100-
return nil, &commands.MissingPortError{}
101-
}
102-
protocol := port.GetProtocol()
91+
func findMonitorForProtocolAndBoard(pm *packagemanager.PackageManager, protocol, fqbn string) (*pluggableMonitor.PluggableMonitor, error) {
10392
if protocol == "" {
10493
return nil, &commands.MissingPortProtocolError{}
10594
}
10695

96+
var monitorDepOrRecipe *cores.MonitorDependency
97+
10798
// If a board is specified search the monitor in the board package first
10899
if fqbn != "" {
109100
fqbn, err := cores.ParseFQBN(fqbn)
@@ -115,16 +106,33 @@ func findMonitorForProtocolAndBoard(pm *packagemanager.PackageManager, port *rpc
115106
if err != nil {
116107
return nil, &commands.UnknownFQBNError{Cause: err}
117108
}
109+
118110
if mon, ok := boardPlatform.Monitors[protocol]; ok {
119-
return mon, nil
111+
monitorDepOrRecipe = mon
120112
}
121113
}
122114

123-
// Otherwise look in all package for a suitable monitor
124-
for _, platformRel := range pm.InstalledPlatformReleases() {
125-
if mon, ok := platformRel.Monitors[protocol]; ok {
126-
return mon, nil
115+
if monitorDepOrRecipe == nil {
116+
// Otherwise look in all package for a suitable monitor
117+
for _, platformRel := range pm.InstalledPlatformReleases() {
118+
if mon, ok := platformRel.Monitors[protocol]; ok {
119+
monitorDepOrRecipe = mon
120+
break
121+
}
127122
}
128123
}
129-
return nil, &commands.NoMonitorAvailableForProtocolError{Protocol: protocol}
124+
125+
if monitorDepOrRecipe == nil {
126+
return nil, &commands.NoMonitorAvailableForProtocolError{Protocol: protocol}
127+
}
128+
129+
tool := pm.FindMonitorDependency(monitorDepOrRecipe)
130+
if tool == nil {
131+
return nil, &commands.MonitorNotFoundError{Monitor: monitorDepOrRecipe.String()}
132+
}
133+
134+
return pluggableMonitor.New(
135+
monitorDepOrRecipe.Name,
136+
tool.InstallDir.Join(monitorDepOrRecipe.Name).String(),
137+
), nil
130138
}

Diff for: commands/monitor/settings.go

+1-8
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,11 @@ func EnumerateMonitorPortSettings(ctx context.Context, req *rpc.EnumerateMonitor
3030
return nil, &commands.InvalidInstanceError{}
3131
}
3232

33-
monitorRef, err := findMonitorForProtocolAndBoard(pm, req.GetPort(), req.GetFqbn())
33+
m, err := findMonitorForProtocolAndBoard(pm, req.GetPortProtocol(), req.GetFqbn())
3434
if err != nil {
3535
return nil, err
3636
}
3737

38-
tool := pm.FindMonitorDependency(monitorRef)
39-
if tool == nil {
40-
return nil, &commands.MonitorNotFoundError{Monitor: monitorRef.String()}
41-
}
42-
43-
m := pluggableMonitor.New(monitorRef.Name, tool.InstallDir.Join(monitorRef.Name).String())
44-
4538
if err := m.Run(); err != nil {
4639
return nil, &commands.FailedMonitorError{Cause: err}
4740
}

Diff for: i18n/data/en.po

+16-16
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ msgstr "Configuring platform."
427427
msgid "Connected"
428428
msgstr "Connected"
429429

430-
#: cli/monitor/monitor.go:181
430+
#: cli/monitor/monitor.go:172
431431
msgid "Connected to %s! Press CTRL-C to exit."
432432
msgstr "Connected to %s! Press CTRL-C to exit."
433433

@@ -504,7 +504,7 @@ msgstr "Debugging not supported for board %s"
504504
msgid "Debugging supported:"
505505
msgstr "Debugging supported:"
506506

507-
#: cli/monitor/monitor.go:199
507+
#: cli/monitor/monitor.go:190
508508
msgid "Default"
509509
msgstr "Default"
510510

@@ -790,7 +790,7 @@ msgstr "Error getting information for library %s"
790790
msgid "Error getting libraries info: %v"
791791
msgstr "Error getting libraries info: %v"
792792

793-
#: cli/monitor/monitor.go:86
793+
#: cli/monitor/monitor.go:85
794794
msgid "Error getting port settings details: %s"
795795
msgstr "Error getting port settings details: %s"
796796

@@ -1138,7 +1138,7 @@ msgstr "Global variables use {0} bytes of dynamic memory."
11381138

11391139
#: cli/core/list.go:84
11401140
#: cli/core/search.go:114
1141-
#: cli/monitor/monitor.go:199
1141+
#: cli/monitor/monitor.go:190
11421142
#: cli/outdated/outdated.go:62
11431143
msgid "ID"
11441144
msgstr "ID"
@@ -1475,7 +1475,7 @@ msgstr "Missing sketch path"
14751475
msgid "Monitor '%s' not found"
14761476
msgstr "Monitor '%s' not found"
14771477

1478-
#: cli/monitor/monitor.go:147
1478+
#: cli/monitor/monitor.go:138
14791479
msgid "Monitor port settings:"
14801480
msgstr "Monitor port settings:"
14811481

@@ -1731,8 +1731,8 @@ msgstr "Platform size (bytes):"
17311731
msgid "Port"
17321732
msgstr "Port"
17331733

1734-
#: cli/monitor/monitor.go:168
1735-
#: cli/monitor/monitor.go:175
1734+
#: cli/monitor/monitor.go:159
1735+
#: cli/monitor/monitor.go:166
17361736
msgid "Port closed:"
17371737
msgstr "Port closed:"
17381738

@@ -1873,7 +1873,7 @@ msgstr "Sets a setting value."
18731873
msgid "Sets where to save the configuration file."
18741874
msgstr "Sets where to save the configuration file."
18751875

1876-
#: cli/monitor/monitor.go:199
1876+
#: cli/monitor/monitor.go:190
18771877
msgid "Setting"
18781878
msgstr "Setting"
18791879

@@ -2348,7 +2348,7 @@ msgstr "VERSION"
23482348
msgid "VERSION_NUMBER"
23492349
msgstr "VERSION_NUMBER"
23502350

2351-
#: cli/monitor/monitor.go:199
2351+
#: cli/monitor/monitor.go:190
23522352
msgid "Values"
23532353
msgstr "Values"
23542354

@@ -2503,7 +2503,7 @@ msgstr "cleaning build path"
25032503
msgid "command"
25042504
msgstr "command"
25052505

2506-
#: arduino/monitor/monitor.go:150
2506+
#: arduino/monitor/monitor.go:149
25072507
msgid "command '%[1]s' failed: %[2]s"
25082508
msgstr "command '%[1]s' failed: %[2]s"
25092509

@@ -2516,7 +2516,7 @@ msgstr "command '%[1]s' failed: %[2]s"
25162516
msgid "command failed: %s"
25172517
msgstr "command failed: %s"
25182518

2519-
#: arduino/monitor/monitor.go:147
2519+
#: arduino/monitor/monitor.go:146
25202520
msgid "communication out of sync, expected '%[1]s', received '%[2]s'"
25212521
msgstr "communication out of sync, expected '%[1]s', received '%[2]s'"
25222522

@@ -2855,11 +2855,11 @@ msgstr "invalid platform archive size: %s"
28552855
msgid "invalid pluggable monitor reference: %s"
28562856
msgstr "invalid pluggable monitor reference: %s"
28572857

2858-
#: cli/monitor/monitor.go:130
2858+
#: cli/monitor/monitor.go:121
28592859
msgid "invalid port configuration value for %s: %s"
28602860
msgstr "invalid port configuration value for %s: %s"
28612861

2862-
#: cli/monitor/monitor.go:139
2862+
#: cli/monitor/monitor.go:130
28632863
msgid "invalid port configuration: %s"
28642864
msgstr "invalid port configuration: %s"
28652865

@@ -3106,11 +3106,11 @@ msgstr "pluggable discovery already added: %s"
31063106
msgid "port"
31073107
msgstr "port"
31083108

3109-
#: cli/arguments/port.go:122
3109+
#: cli/arguments/port.go:137
31103110
msgid "port not found: %[1]s %[2]s"
31113111
msgstr "port not found: %[1]s %[2]s"
31123112

3113-
#: arduino/monitor/monitor.go:239
3113+
#: arduino/monitor/monitor.go:238
31143114
msgid "protocol version not supported: requested %[1]d, got %[2]d"
31153115
msgstr "protocol version not supported: requested %[1]d, got %[2]d"
31163116

@@ -3300,7 +3300,7 @@ msgstr "the platform has no releases"
33003300
msgid "the server responded with status %s"
33013301
msgstr "the server responded with status %s"
33023302

3303-
#: arduino/monitor/monitor.go:140
3303+
#: arduino/monitor/monitor.go:139
33043304
msgid "timeout waiting for message"
33053305
msgstr "timeout waiting for message"
33063306

0 commit comments

Comments
 (0)