@@ -9,7 +9,6 @@ use serialport::{SerialPort, SerialPortInfo};
9
9
10
10
use crate :: font:: { convert_font, convert_symbol} ;
11
11
12
- const EXPECTED_SERIAL_DEVICES : & [ & str ] = & [ "/dev/ttyACM0" , "/dev/ttyACM1" , "COM0" , "COM1" ] ;
13
12
const FWK_MAGIC : & [ u8 ] = & [ 0x32 , 0xAC ] ;
14
13
const FRAMEWORK_VID : u16 = 0x32AC ;
15
14
const LED_MATRIX_PID : u16 = 0x0020 ;
@@ -133,29 +132,28 @@ pub struct LedMatrixSubcommand {
133
132
#[ command( arg_required_else_help = true ) ]
134
133
pub struct B1DisplaySubcommand { }
135
134
136
- fn find_serialdev ( ports : & [ SerialPortInfo ] , requested : & Option < String > ) -> Option < String > {
135
+ fn find_serialdevs ( ports : & [ SerialPortInfo ] , requested : & Option < String > ) -> Vec < String > {
137
136
if let Some ( requested) = requested {
138
137
for p in ports {
139
138
if requested == & p. port_name {
140
- return Some ( p. port_name . clone ( ) ) ;
139
+ return vec ! [ p. port_name. clone( ) ] ;
141
140
}
142
141
}
142
+ vec ! [ ]
143
143
} else {
144
+ let mut compatible_devs = vec ! [ ] ;
144
145
// If nothing requested, fall back to a generic one or the first supported Framework USB device
145
146
for p in ports {
146
147
if let serialport:: SerialPortType :: UsbPort ( usbinfo) = & p. port_type {
147
148
if usbinfo. vid == FRAMEWORK_VID
148
149
&& [ LED_MATRIX_PID , B1_LCD_PID ] . contains ( & usbinfo. pid )
149
150
{
150
- return Some ( p. port_name . clone ( ) ) ;
151
+ compatible_devs . push ( p. port_name . clone ( ) ) ;
151
152
}
152
153
}
153
- if EXPECTED_SERIAL_DEVICES . contains ( & p. port_name . as_str ( ) ) {
154
- return Some ( p. port_name . clone ( ) ) ;
155
- }
156
154
}
155
+ compatible_devs
157
156
}
158
- None
159
157
}
160
158
161
159
/// Commands that interact with serial devices
@@ -167,85 +165,87 @@ pub fn serial_commands(args: &crate::ClapCli) {
167
165
println ! ( "{p:?}" ) ;
168
166
}
169
167
}
170
- let serialdev = match & args. command {
168
+ let serialdevs = match & args. command {
171
169
Some ( crate :: Commands :: LedMatrix ( ledmatrix_args) ) => {
172
- find_serialdev ( & ports, & ledmatrix_args. serial_dev )
170
+ find_serialdevs ( & ports, & ledmatrix_args. serial_dev )
173
171
}
174
- _ => None ,
172
+ _ => vec ! [ ] ,
175
173
} ;
176
- let serialdev = if let Some ( serialdev) = serialdev {
177
- if args. verbose {
178
- println ! ( "Selected serialdev: {serialdev:?}" ) ;
179
- }
180
- serialdev
181
- } else {
174
+ if serialdevs. is_empty ( ) {
182
175
println ! ( "Failed to find serial devivce. Please manually specify with --serial-dev" ) ;
183
176
return ;
184
177
} ;
185
178
186
179
match & args. command {
187
180
Some ( crate :: Commands :: LedMatrix ( ledmatrix_args) ) => {
188
- if ledmatrix_args. bootloader {
189
- bootloader_cmd ( & serialdev) ;
190
- }
191
- if let Some ( sleeping_arg) = ledmatrix_args. sleeping {
192
- sleeping_cmd ( & serialdev, sleeping_arg) ;
193
- }
194
- if let Some ( brightness_arg) = ledmatrix_args. brightness {
195
- brightness_cmd ( & serialdev, brightness_arg) ;
196
- }
197
- if let Some ( percentage) = ledmatrix_args. percentage {
198
- assert ! ( percentage <= 100 ) ;
199
- percentage_cmd ( & serialdev, percentage) ;
200
- }
201
- if let Some ( animate_arg) = ledmatrix_args. animate {
202
- animate_cmd ( & serialdev, animate_arg) ;
203
- }
204
- if let Some ( pattern) = ledmatrix_args. pattern {
205
- pattern_cmd ( & serialdev, pattern) ;
206
- }
207
- if ledmatrix_args. all_brightnesses {
208
- all_brightnesses_cmd ( & serialdev) ;
181
+ for serialdev in & serialdevs {
182
+ if args. verbose {
183
+ println ! ( "Selected serialdev: {:?}" , serialdev) ;
184
+ }
185
+
186
+ if ledmatrix_args. bootloader {
187
+ bootloader_cmd ( serialdev) ;
188
+ }
189
+ if let Some ( sleeping_arg) = ledmatrix_args. sleeping {
190
+ sleeping_cmd ( serialdev, sleeping_arg) ;
191
+ }
192
+ if let Some ( brightness_arg) = ledmatrix_args. brightness {
193
+ brightness_cmd ( serialdev, brightness_arg) ;
194
+ }
195
+ if let Some ( percentage) = ledmatrix_args. percentage {
196
+ assert ! ( percentage <= 100 ) ;
197
+ percentage_cmd ( serialdev, percentage) ;
198
+ }
199
+ if let Some ( animate_arg) = ledmatrix_args. animate {
200
+ animate_cmd ( serialdev, animate_arg) ;
201
+ }
202
+ if let Some ( pattern) = ledmatrix_args. pattern {
203
+ pattern_cmd ( serialdev, pattern) ;
204
+ }
205
+ if ledmatrix_args. all_brightnesses {
206
+ all_brightnesses_cmd ( serialdev) ;
207
+ }
208
+ if ledmatrix_args. panic {
209
+ simple_cmd ( serialdev, PANIC , & [ 0x00 ] ) ;
210
+ }
211
+ if let Some ( image_path) = & ledmatrix_args. image_bw {
212
+ display_bw_image_cmd ( serialdev, image_path) ;
213
+ }
214
+
215
+ if let Some ( image_path) = & ledmatrix_args. image_gray {
216
+ display_gray_image_cmd ( serialdev, image_path) ;
217
+ }
218
+
219
+ if let Some ( values) = & ledmatrix_args. eq {
220
+ eq_cmd ( serialdev, values) ;
221
+ }
222
+
223
+ if let Some ( s) = & ledmatrix_args. string {
224
+ show_string ( serialdev, s) ;
225
+ }
226
+
227
+ if let Some ( symbols) = & ledmatrix_args. symbols {
228
+ show_symbols ( serialdev, symbols) ;
229
+ }
230
+
231
+ if ledmatrix_args. version {
232
+ get_device_version ( serialdev) ;
233
+ }
209
234
}
235
+ // Commands that block and need manual looping
210
236
if ledmatrix_args. blinking {
211
- blinking_cmd ( & serialdev ) ;
237
+ blinking_cmd ( & serialdevs ) ;
212
238
}
213
239
if ledmatrix_args. breathing {
214
- breathing_cmd ( & serialdev) ;
215
- }
216
- if ledmatrix_args. panic {
217
- simple_cmd ( & serialdev, PANIC , & [ 0x00 ] ) ;
218
- }
219
- if let Some ( image_path) = & ledmatrix_args. image_bw {
220
- display_bw_image_cmd ( & serialdev, image_path) ;
221
- }
222
-
223
- if let Some ( image_path) = & ledmatrix_args. image_gray {
224
- display_gray_image_cmd ( & serialdev, image_path) ;
240
+ breathing_cmd ( & serialdevs) ;
225
241
}
226
242
227
243
if ledmatrix_args. random_eq {
228
- random_eq_cmd ( & serialdev) ;
229
- }
230
-
231
- if let Some ( values) = & ledmatrix_args. eq {
232
- eq_cmd ( & serialdev, values) ;
244
+ random_eq_cmd ( & serialdevs) ;
233
245
}
234
246
235
247
if ledmatrix_args. clock {
236
- clock_cmd ( & serialdev) ;
237
- }
238
-
239
- if let Some ( s) = & ledmatrix_args. string {
240
- show_string ( & serialdev, s) ;
241
- }
242
-
243
- if let Some ( symbols) = & ledmatrix_args. symbols {
244
- show_symbols ( & serialdev, symbols) ;
245
- }
246
-
247
- if ledmatrix_args. version {
248
- get_device_version ( & serialdev) ;
248
+ clock_cmd ( & serialdevs) ;
249
249
}
250
250
}
251
251
Some ( crate :: Commands :: B1Display ( _b1display_args) ) => { }
@@ -288,6 +288,12 @@ fn pattern_cmd(serialdev: &str, arg: Pattern) {
288
288
simple_cmd ( serialdev, PATTERN , & [ arg as u8 ] ) ;
289
289
}
290
290
291
+ fn simple_cmd_multiple ( serialdevs : & Vec < String > , command : u8 , args : & [ u8 ] ) {
292
+ for serialdev in serialdevs {
293
+ simple_cmd ( serialdev, command, args) ;
294
+ }
295
+ }
296
+
291
297
fn simple_cmd ( serialdev : & str , command : u8 , args : & [ u8 ] ) {
292
298
let mut port = serialport:: new ( serialdev, 115_200 )
293
299
. timeout ( SERIAL_TIMEOUT )
@@ -400,40 +406,40 @@ fn all_brightnesses_cmd(serialdev: &str) {
400
406
commit_cols ( & mut port) ;
401
407
}
402
408
403
- fn blinking_cmd ( serialdev : & str ) {
409
+ fn blinking_cmd ( serialdevs : & Vec < String > ) {
404
410
let duration = Duration :: from_millis ( 500 ) ;
405
411
loop {
406
- simple_cmd ( serialdev , BRIGHTNESS , & [ 0 ] ) ;
412
+ simple_cmd_multiple ( serialdevs , BRIGHTNESS , & [ 0 ] ) ;
407
413
thread:: sleep ( duration) ;
408
- simple_cmd ( serialdev , BRIGHTNESS , & [ 200 ] ) ;
414
+ simple_cmd_multiple ( serialdevs , BRIGHTNESS , & [ 200 ] ) ;
409
415
thread:: sleep ( duration) ;
410
416
}
411
417
}
412
418
413
- fn breathing_cmd ( serialdev : & str ) {
419
+ fn breathing_cmd ( serialdevs : & Vec < String > ) {
414
420
loop {
415
421
// Go quickly from 250 to 50
416
422
for i in 0 ..10 {
417
423
thread:: sleep ( Duration :: from_millis ( 30 ) ) ;
418
- simple_cmd ( serialdev , BRIGHTNESS , & [ 250 - i * 20 ] ) ;
424
+ simple_cmd_multiple ( serialdevs , BRIGHTNESS , & [ 250 - i * 20 ] ) ;
419
425
}
420
426
421
427
// Go slowly from 50 to 0
422
428
for i in 0 ..10 {
423
429
thread:: sleep ( Duration :: from_millis ( 60 ) ) ;
424
- simple_cmd ( serialdev , BRIGHTNESS , & [ 50 - i * 5 ] ) ;
430
+ simple_cmd_multiple ( serialdevs , BRIGHTNESS , & [ 50 - i * 5 ] ) ;
425
431
}
426
432
427
433
// Go slowly from 0 to 50
428
434
for i in 0 ..10 {
429
435
thread:: sleep ( Duration :: from_millis ( 60 ) ) ;
430
- simple_cmd ( serialdev , BRIGHTNESS , & [ i * 5 ] ) ;
436
+ simple_cmd_multiple ( serialdevs , BRIGHTNESS , & [ i * 5 ] ) ;
431
437
}
432
438
433
439
// Go quickly from 50 to 250
434
440
for i in 0 ..10 {
435
441
thread:: sleep ( Duration :: from_millis ( 30 ) ) ;
436
- simple_cmd ( serialdev , BRIGHTNESS , & [ 50 + i * 20 ] ) ;
442
+ simple_cmd_multiple ( serialdevs , BRIGHTNESS , & [ 50 + i * 20 ] ) ;
437
443
}
438
444
}
439
445
}
@@ -514,7 +520,7 @@ fn display_gray_image_cmd(serialdev: &str, image_path: &str) {
514
520
}
515
521
516
522
/// Display an equlizer looking animation with random values.
517
- fn random_eq_cmd ( serialdev : & str ) {
523
+ fn random_eq_cmd ( serialdevs : & Vec < String > ) {
518
524
loop {
519
525
// Lower values more likely, makes it look nicer
520
526
//weights = [i*i for i in range(33, 0, -1)]
@@ -525,7 +531,9 @@ fn random_eq_cmd(serialdev: &str) {
525
531
. unwrap ( )
526
532
. copied ( )
527
533
. collect :: < Vec < _ > > ( ) ;
528
- eq_cmd ( serialdev, vals. as_slice ( ) ) ;
534
+ for serialdev in serialdevs {
535
+ eq_cmd ( serialdev, vals. as_slice ( ) ) ;
536
+ }
529
537
thread:: sleep ( Duration :: from_millis ( 200 ) ) ;
530
538
}
531
539
}
@@ -571,13 +579,15 @@ fn render_matrix(serialdev: &str, matrix: &[[u8; 34]; 9]) {
571
579
572
580
/// Render the current time and display.
573
581
/// Loops forever, updating every second
574
- fn clock_cmd ( serialdev : & str ) {
582
+ fn clock_cmd ( serialdevs : & Vec < String > ) {
575
583
loop {
576
584
let date = Local :: now ( ) ;
577
585
let current_time = date. format ( "%H:%M" ) . to_string ( ) ;
578
586
println ! ( "Current Time = {current_time}" ) ;
579
587
580
- show_string ( serialdev, & current_time) ;
588
+ for serialdev in serialdevs {
589
+ show_string ( serialdev, & current_time) ;
590
+ }
581
591
thread:: sleep ( Duration :: from_millis ( 1000 ) ) ;
582
592
}
583
593
}
0 commit comments