Files
oc2r-rust/examples/redstone.rs
2025-10-29 20:35:12 +01:00

62 lines
1.6 KiB
Rust

// Build with: cross build --release --example redstone
use oc2r_rust::{DEFAULT_DEVICE_PATH, DeviceBus, Redstone, Result, Side};
use std::env;
use std::str::FromStr;
fn main() -> Result<()> {
let mut args = env::args().skip(1);
let Some(side_arg) = args.next() else {
print_usage();
return Ok(());
};
let mut bus = DeviceBus::connect(DEFAULT_DEVICE_PATH)?;
let mut redstone = match Redstone::attach(&mut bus)? {
Some(device) => device,
None => {
eprintln!("No redstone interface found on this bus.");
return Ok(());
}
};
let side = match Side::from_str(&side_arg) {
Ok(side) => side,
Err(_) => {
eprintln!("Invalid side: {side_arg}");
return Ok(());
}
};
if let Some(value) = args.next() {
let level = parse_level(&value);
redstone.set_output_level(side, level)?;
}
let input = redstone.input(side)?;
let output = redstone.output(side)?;
println!("in: {}", input.ceil());
println!("out: {}", output.ceil());
Ok(())
}
fn parse_level(value: &str) -> u8 {
let trimmed = value.trim();
if let Ok(num) = trimmed.parse::<u8>() {
return num.min(15);
}
match trimmed.to_ascii_lowercase().as_str() {
"true" | "on" | "yes" => 15,
"false" | "off" | "no" => 0,
_ => 0,
}
}
fn print_usage() {
eprintln!("Usage: redstone <side> [value]");
eprintln!(" side : up|down|north|south|west|east|front|back|left|right");
eprintln!(" value : 0-15, true/on/yes, false/off/no");
}