diff --git a/Cargo.lock b/Cargo.lock index bbce1fb..bbbb428 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,6 +36,22 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "indenter" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" + [[package]] name = "io-kit-sys" version = "0.4.1" @@ -50,6 +66,7 @@ dependencies = [ name = "kulifuli-host" version = "0.1.0" dependencies = [ + "eyre", "serialport", ] @@ -99,6 +116,12 @@ dependencies = [ "libc", ] +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + [[package]] name = "pkg-config" version = "0.3.32" diff --git a/Cargo.toml b/Cargo.toml index 2bc394d..02e58d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,5 @@ version = "0.1.0" edition = "2024" [dependencies] +eyre = "0.6.12" serialport = "4.7.2" diff --git a/src/main.rs b/src/main.rs index 241eae4..221e8d8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,33 +1,48 @@ +use eyre::{Result, bail, ensure, eyre}; use serialport::TTYPort; -use std::io::{Read, Write}; +use std::io::{Read, Write, stdin, stdout}; +use std::str::FromStr; use std::time::Duration; -fn main() { +fn main() -> Result<()> { let mut port = serialport::new("/dev/ttyACM0", 9600) .timeout(Duration::from_secs(3600)) - .open_native() - .unwrap(); - - let duty_cycle = 39; - let bytes_written = port - .write(&[188, 92, 136, 14, 154, 39, 154, 139, duty_cycle]) - .unwrap(); - assert_eq!(bytes_written, 9); + .open_native()?; loop { - if let Some(response_byte) = read_byte(&mut port) { - println!("Response byte: {}", response_byte); + print!("Enter duty cycle: "); + stdout().flush()?; + let mut requested_dc = String::new(); + stdin().read_line(&mut requested_dc)?; + + if let Ok(duty_cycle) = u8::from_str(requested_dc.trim()) + && duty_cycle <= 79 + { + println!("Sending to fan controller..."); + let bytes_written = port.write(&[188, 92, 136, 14, 154, 39, 154, 139, duty_cycle])?; + if bytes_written != 9 { + bail!("Could not write enough bytes to serial device"); + } + println!("Awaiting confirmation..."); + + let response_byte = read_byte(&mut port)?; + if response_byte == duty_cycle { + println!("Duty cycle set succesfully"); + } + } else { + println!("Invalid duty cycle, should be an integer between 0 and 79"); } + println!(); } } -fn read_byte(port: &mut TTYPort) -> Option { +fn read_byte(port: &mut TTYPort) -> Result { let mut response = [0]; let read_result = port.read(&mut response); if let Ok(bytes_read) = read_result { - assert_eq!(bytes_read, 1); - Some(response[0]) + ensure!(bytes_read == 1, "Could not read from serial device"); + Ok(response[0]) } else { - None + Err(eyre!("Could not read from serial device")) } }