Skip to content

Commit 92e3085

Browse files
committed
Run commands on all LED matrix modules
Signed-off-by: Daniel Schaefer <[email protected]>
1 parent e0f6f3f commit 92e3085

File tree

1 file changed

+90
-80
lines changed

1 file changed

+90
-80
lines changed

inputmodule-control/src/inputmodule.rs

Lines changed: 90 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ use serialport::{SerialPort, SerialPortInfo};
99

1010
use crate::font::{convert_font, convert_symbol};
1111

12-
const EXPECTED_SERIAL_DEVICES: &[&str] = &["/dev/ttyACM0", "/dev/ttyACM1", "COM0", "COM1"];
1312
const FWK_MAGIC: &[u8] = &[0x32, 0xAC];
1413
const FRAMEWORK_VID: u16 = 0x32AC;
1514
const LED_MATRIX_PID: u16 = 0x0020;
@@ -133,29 +132,28 @@ pub struct LedMatrixSubcommand {
133132
#[command(arg_required_else_help = true)]
134133
pub struct B1DisplaySubcommand {}
135134

136-
fn find_serialdev(ports: &[SerialPortInfo], requested: &Option<String>) -> Option<String> {
135+
fn find_serialdevs(ports: &[SerialPortInfo], requested: &Option<String>) -> Vec<String> {
137136
if let Some(requested) = requested {
138137
for p in ports {
139138
if requested == &p.port_name {
140-
return Some(p.port_name.clone());
139+
return vec![p.port_name.clone()];
141140
}
142141
}
142+
vec![]
143143
} else {
144+
let mut compatible_devs = vec![];
144145
// If nothing requested, fall back to a generic one or the first supported Framework USB device
145146
for p in ports {
146147
if let serialport::SerialPortType::UsbPort(usbinfo) = &p.port_type {
147148
if usbinfo.vid == FRAMEWORK_VID
148149
&& [LED_MATRIX_PID, B1_LCD_PID].contains(&usbinfo.pid)
149150
{
150-
return Some(p.port_name.clone());
151+
compatible_devs.push(p.port_name.clone());
151152
}
152153
}
153-
if EXPECTED_SERIAL_DEVICES.contains(&p.port_name.as_str()) {
154-
return Some(p.port_name.clone());
155-
}
156154
}
155+
compatible_devs
157156
}
158-
None
159157
}
160158

161159
/// Commands that interact with serial devices
@@ -167,85 +165,87 @@ pub fn serial_commands(args: &crate::ClapCli) {
167165
println!("{p:?}");
168166
}
169167
}
170-
let serialdev = match &args.command {
168+
let serialdevs = match &args.command {
171169
Some(crate::Commands::LedMatrix(ledmatrix_args)) => {
172-
find_serialdev(&ports, &ledmatrix_args.serial_dev)
170+
find_serialdevs(&ports, &ledmatrix_args.serial_dev)
173171
}
174-
_ => None,
172+
_ => vec![],
175173
};
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() {
182175
println!("Failed to find serial devivce. Please manually specify with --serial-dev");
183176
return;
184177
};
185178

186179
match &args.command {
187180
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+
}
209234
}
235+
// Commands that block and need manual looping
210236
if ledmatrix_args.blinking {
211-
blinking_cmd(&serialdev);
237+
blinking_cmd(&serialdevs);
212238
}
213239
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);
225241
}
226242

227243
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);
233245
}
234246

235247
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);
249249
}
250250
}
251251
Some(crate::Commands::B1Display(_b1display_args)) => {}
@@ -288,6 +288,12 @@ fn pattern_cmd(serialdev: &str, arg: Pattern) {
288288
simple_cmd(serialdev, PATTERN, &[arg as u8]);
289289
}
290290

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+
291297
fn simple_cmd(serialdev: &str, command: u8, args: &[u8]) {
292298
let mut port = serialport::new(serialdev, 115_200)
293299
.timeout(SERIAL_TIMEOUT)
@@ -400,40 +406,40 @@ fn all_brightnesses_cmd(serialdev: &str) {
400406
commit_cols(&mut port);
401407
}
402408

403-
fn blinking_cmd(serialdev: &str) {
409+
fn blinking_cmd(serialdevs: &Vec<String>) {
404410
let duration = Duration::from_millis(500);
405411
loop {
406-
simple_cmd(serialdev, BRIGHTNESS, &[0]);
412+
simple_cmd_multiple(serialdevs, BRIGHTNESS, &[0]);
407413
thread::sleep(duration);
408-
simple_cmd(serialdev, BRIGHTNESS, &[200]);
414+
simple_cmd_multiple(serialdevs, BRIGHTNESS, &[200]);
409415
thread::sleep(duration);
410416
}
411417
}
412418

413-
fn breathing_cmd(serialdev: &str) {
419+
fn breathing_cmd(serialdevs: &Vec<String>) {
414420
loop {
415421
// Go quickly from 250 to 50
416422
for i in 0..10 {
417423
thread::sleep(Duration::from_millis(30));
418-
simple_cmd(serialdev, BRIGHTNESS, &[250 - i * 20]);
424+
simple_cmd_multiple(serialdevs, BRIGHTNESS, &[250 - i * 20]);
419425
}
420426

421427
// Go slowly from 50 to 0
422428
for i in 0..10 {
423429
thread::sleep(Duration::from_millis(60));
424-
simple_cmd(serialdev, BRIGHTNESS, &[50 - i * 5]);
430+
simple_cmd_multiple(serialdevs, BRIGHTNESS, &[50 - i * 5]);
425431
}
426432

427433
// Go slowly from 0 to 50
428434
for i in 0..10 {
429435
thread::sleep(Duration::from_millis(60));
430-
simple_cmd(serialdev, BRIGHTNESS, &[i * 5]);
436+
simple_cmd_multiple(serialdevs, BRIGHTNESS, &[i * 5]);
431437
}
432438

433439
// Go quickly from 50 to 250
434440
for i in 0..10 {
435441
thread::sleep(Duration::from_millis(30));
436-
simple_cmd(serialdev, BRIGHTNESS, &[50 + i * 20]);
442+
simple_cmd_multiple(serialdevs, BRIGHTNESS, &[50 + i * 20]);
437443
}
438444
}
439445
}
@@ -514,7 +520,7 @@ fn display_gray_image_cmd(serialdev: &str, image_path: &str) {
514520
}
515521

516522
/// Display an equlizer looking animation with random values.
517-
fn random_eq_cmd(serialdev: &str) {
523+
fn random_eq_cmd(serialdevs: &Vec<String>) {
518524
loop {
519525
// Lower values more likely, makes it look nicer
520526
//weights = [i*i for i in range(33, 0, -1)]
@@ -525,7 +531,9 @@ fn random_eq_cmd(serialdev: &str) {
525531
.unwrap()
526532
.copied()
527533
.collect::<Vec<_>>();
528-
eq_cmd(serialdev, vals.as_slice());
534+
for serialdev in serialdevs {
535+
eq_cmd(serialdev, vals.as_slice());
536+
}
529537
thread::sleep(Duration::from_millis(200));
530538
}
531539
}
@@ -571,13 +579,15 @@ fn render_matrix(serialdev: &str, matrix: &[[u8; 34]; 9]) {
571579

572580
/// Render the current time and display.
573581
/// Loops forever, updating every second
574-
fn clock_cmd(serialdev: &str) {
582+
fn clock_cmd(serialdevs: &Vec<String>) {
575583
loop {
576584
let date = Local::now();
577585
let current_time = date.format("%H:%M").to_string();
578586
println!("Current Time = {current_time}");
579587

580-
show_string(serialdev, &current_time);
588+
for serialdev in serialdevs {
589+
show_string(serialdev, &current_time);
590+
}
581591
thread::sleep(Duration::from_millis(1000));
582592
}
583593
}

0 commit comments

Comments
 (0)