mod service_specific; mod shared; use std::process::Command; use anyhow::Result; use service_specific::*; use shared::config::Config; fn main() -> Result<()> { let mut port = Port::open(SerialPortSettings { baud_rate: 57600, data_bits: DataBits::Eight, parity: Parity::None, stop_bits: StopBits::One, flow_control: FlowControl::None, timeout: Duration::from_millis(2500), })?; let mut message_builder = MessageBuilder::default(); loop { if let Ok(r) = port.read() { match r { SerialReadResult::Message(msg) => { if let Some(_remaining) = message_builder.check(msg) { debug_assert!(message_builder.is_complete()); println!("{}", message_builder.message()); if let Ok(index) = message_builder.message().parse() { execute_button_press(index)?; } message_builder = MessageBuilder::default(); } } SerialReadResult::Timeout => (), } } } } fn execute_button_press(button_id: usize) -> Result<()> { let config = Config::load_config()?; if button_id < 1 && button_id > 8 { return Ok(()); } if let Some(cmd) = &config.commands[button_id - 1] { if !cmd.is_empty() { println!("cmd: {}", cmd); Command::new(cmd).spawn()?; } } Ok(()) }