Make setting duty cycle interactive, add error handling
This commit is contained in:
parent
94487b0903
commit
f9a4b88222
3 changed files with 55 additions and 16 deletions
23
Cargo.lock
generated
23
Cargo.lock
generated
|
@ -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"
|
||||
|
|
|
@ -4,4 +4,5 @@ version = "0.1.0"
|
|||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
eyre = "0.6.12"
|
||||
serialport = "4.7.2"
|
||||
|
|
47
src/main.rs
47
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<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"))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue