62 lines
1.6 KiB
Rust
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");
|
|
}
|