Files
2025-11-01 21:48:21 +01:00

56 lines
1.5 KiB
Rust

// Build with: cross build --release --example redstone
use oc2r_core::{DEFAULT_DEVICE_PATH, DeviceBus, Result};
use opencomputers::{RedstoneInterface, 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 Some(mut redstone) = RedstoneInterface::attach(&mut bus)? else {
eprintln!("No redstone interface found on this bus.");
return Ok(());
};
let Ok(side) = Side::from_str(&side_arg) else {
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,
_ => 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");
}