@@ -18,6 +18,7 @@ package monitor
18
18
import (
19
19
"context"
20
20
"errors"
21
+ "fmt"
21
22
"io"
22
23
"os"
23
24
"sort"
@@ -28,6 +29,7 @@ import (
28
29
"github.com/arduino/arduino-cli/cli/feedback"
29
30
"github.com/arduino/arduino-cli/cli/instance"
30
31
"github.com/arduino/arduino-cli/commands/monitor"
32
+ "github.com/arduino/arduino-cli/configuration"
31
33
"github.com/arduino/arduino-cli/i18n"
32
34
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
33
35
"github.com/arduino/arduino-cli/table"
@@ -39,6 +41,7 @@ var tr = i18n.Tr
39
41
40
42
var portArgs arguments.Port
41
43
var describe bool
44
+ var configs []string
42
45
var silent bool
43
46
44
47
// NewCommand created a new `monitor` command
@@ -54,6 +57,7 @@ func NewCommand() *cobra.Command {
54
57
}
55
58
portArgs .AddToCommand (cmd )
56
59
cmd .Flags ().BoolVar (& describe , "describe" , false , tr ("Show all the settings of the communication port." ))
60
+ cmd .Flags ().StringSliceVarP (& configs , "config" , "c" , []string {}, tr ("Configuration of the port." ))
57
61
cmd .Flags ().BoolVarP (& silent , "silent" , "s" , false , tr ("Run in silent mode, show only monitor input and output." ))
58
62
cmd .MarkFlagRequired ("port" )
59
63
return cmd
@@ -93,10 +97,63 @@ func runMonitorCmd(cmd *cobra.Command, args []string) {
93
97
}
94
98
defer tty .Close ()
95
99
100
+ configuration := & rpc.MonitorPortConfiguration {}
101
+ 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
+ }
111
+ settings := resp .GetSettings ()
112
+ for _ , config := range configs {
113
+ split := strings .SplitN (config , "=" , 2 )
114
+ k := ""
115
+ v := config
116
+ if len (split ) == 2 {
117
+ k = split [0 ]
118
+ v = split [1 ]
119
+ }
120
+
121
+ var setting * rpc.MonitorPortSettingDescriptor
122
+ for _ , s := range settings {
123
+ if k == "" {
124
+ if contains (s .EnumValues , v ) {
125
+ setting = s
126
+ break
127
+ }
128
+ } else {
129
+ if strings .EqualFold (s .SettingId , k ) {
130
+ if ! contains (s .EnumValues , v ) {
131
+ feedback .Error (tr ("invalid port configuration value for %s: %s" , k , v ))
132
+ os .Exit (errorcodes .ErrBadArgument )
133
+ }
134
+ setting = s
135
+ break
136
+ }
137
+ }
138
+ }
139
+ if setting == nil {
140
+ feedback .Error (tr ("invalid port configuration: %s" , config ))
141
+ os .Exit (errorcodes .ErrBadArgument )
142
+ }
143
+ configuration .Settings = append (configuration .Settings , & rpc.MonitorPortSetting {
144
+ SettingId : setting .SettingId ,
145
+ Value : v ,
146
+ })
147
+ if ! silent {
148
+ feedback .Print (fmt .Sprintf ("Set %s to %s" , setting .SettingId , v ))
149
+ }
150
+ }
151
+ }
96
152
portProxy , _ , err := monitor .Monitor (context .Background (), & rpc.MonitorRequest {
97
- Instance : instance ,
98
- Port : port .ToRPC (),
99
- Fqbn : "" ,
153
+ Instance : instance ,
154
+ Port : port .ToRPC (),
155
+ Fqbn : "" ,
156
+ PortConfiguration : configuration ,
100
157
})
101
158
if err != nil {
102
159
feedback .Error (err )
@@ -149,3 +206,12 @@ func (r *detailsResult) String() string {
149
206
}
150
207
return t .Render ()
151
208
}
209
+
210
+ func contains (s []string , searchterm string ) bool {
211
+ for _ , item := range s {
212
+ if strings .EqualFold (item , searchterm ) {
213
+ return true
214
+ }
215
+ }
216
+ return false
217
+ }
0 commit comments