From b0f8b3742848106b58273fed91b1e7eab578258c Mon Sep 17 00:00:00 2001 From: Artur Gurgul Date: Thu, 25 Sep 2025 19:22:00 +0200 Subject: [PATCH] init --- Cargo.toml | 8 ++++++++ src/main.rs | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ff4c032 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "relay_control" +version = "0.1.0" +edition = "2021" + +[dependencies] +gpio-cdev = "0.6" +clap = { version = "4", features = ["derive"] } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..f9675d8 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,57 @@ +use clap::{Parser, Subcommand}; +use gpio_cdev::{Chip, LineRequestFlags}; +use std::{thread, time::Duration}; + +/// Banana Pi M5 relay controller (gpiochip0 line 68 = CON1-P11). +#[derive(Parser, Debug)] +#[command(author, version, about)] +struct Cli { + #[command(subcommand)] + cmd: Command, +} + +#[derive(Subcommand, Debug)] +enum Command { + /// Turn relay ON (active-low → set line 0) + On, + /// Turn relay OFF (set line 1) + Off, + /// Pulse relay ON for N ms, then OFF + Pulse { + #[arg(long, default_value_t = 500)] + ms: u64, + }, +} + +fn main() -> anyhow::Result<()> { + let cli = Cli::parse(); + + // Open gpiochip0 + let mut chip = Chip::new("/dev/gpiochip0")?; + + // Request line 68 (CON1-P11) as output, default HIGH (relay OFF) + let handle = chip + .get_line(68)? + .request(LineRequestFlags::OUTPUT, 1, "relay_control")?; + + match cli.cmd { + Command::On => { + println!("Relay ON"); + handle.set_value(0)?; + } + Command::Off => { + println!("Relay OFF"); + handle.set_value(1)?; + } + Command::Pulse { ms } => { + println!("Relay ON for {} ms", ms); + handle.set_value(0)?; + thread::sleep(Duration::from_millis(ms)); + println!("Relay OFF"); + handle.set_value(1)?; + } + } + + Ok(()) +} + \ No newline at end of file