Make setting duty cycle interactive, add error handling

This commit is contained in:
Reinout Meliesie 2025-08-23 20:56:50 +02:00
commit f9a4b88222
Signed by: zedfrigg
GPG key ID: 3AFCC06481308BC6
3 changed files with 55 additions and 16 deletions

23
Cargo.lock generated
View file

@ -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"

View file

@ -4,4 +4,5 @@ version = "0.1.0"
edition = "2024"
[dependencies]
eyre = "0.6.12"
serialport = "4.7.2"

View file

@ -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<u8> {
fn read_byte(port: &mut TTYPort) -> Result<u8> {
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"))
}
}