From e282ef4ccd8881c8465b83843d46dd1ce27419cb Mon Sep 17 00:00:00 2001 From: Marc Riera Date: Sat, 18 Feb 2023 10:46:10 +0100 Subject: [PATCH] Implement controller model check --- src/main.rs | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7f7e146..0b5c877 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,7 @@ +use std::fs::File; +use std::io::Write; +use std::time::{Duration, Instant}; +use std::thread::sleep; use evdev_rs::Device; use evdev_rs::InputEvent; use evdev_rs::ReadFlag; @@ -20,25 +24,66 @@ struct Controller { button_right: bool, } +#[derive(PartialEq)] +enum ControllerModel { + NONE, + DGOC44U, + TYPE2, +} + fn main() { let d1 = Device::new_from_path("/dev/input/event1").unwrap(); let d2 = Device::new_from_path("/dev/input/event2").unwrap(); let mut controller: Controller = Default::default(); + let mut controller_model: ControllerModel = ControllerModel::NONE; + + // Save current time and 5 seconds in the future to check for pressed buttons later + let start_time = Instant::now(); + let init_time = start_time + Duration::from_secs(5); + + // Turn on door light to indicate selection mode + set_door(true); + println!("Hold a button to select the controller model..."); loop { + // Process events from both input devices for device in [&d1, &d2] { let ev = device.next_event(ReadFlag::NORMAL).map(|val| val.1); - match ev { Ok(ev) => read_input(ev, &mut controller), Err(_e) => (), } } + + // If init time has passed, try to select model or quit + if controller_model == ControllerModel::NONE && Instant::now() >= init_time { + if controller.button_right { + controller_model = ControllerModel::DGOC44U; + println!("Selected controller DGOC44-U, starting gadget..."); + } + else if controller.button_left { + controller_model = ControllerModel::TYPE2; + println!("Selected controller TCPP-20009, starting gadget..."); + } + else + { + // Turn off door light and quit + set_door(false); + println!("No controller selected, exiting..."); + break; + } + // Turn off door light and vibrate to end selection mode + set_door(false); + set_rumble(true); + sleep(Duration::from_millis(500)); + set_rumble(false); + } } } fn read_input(event: InputEvent, controller: &mut Controller) { + // Save input status to object for easier processing match event.event_code{ EventCode::EV_KEY(EV_KEY::KEY_0)=>if event.value == 1 {controller.power = 0}, EventCode::EV_KEY(EV_KEY::KEY_1)=>if event.value == 1 {controller.power = 1}, @@ -68,4 +113,16 @@ fn read_input(event: InputEvent, controller: &mut Controller) { EventCode::EV_KEY(EV_KEY::KEY_RIGHT)=>controller.button_right = event.value != 0, _=>(), } -} \ No newline at end of file +} + +fn set_door(status: bool) -> std::io::Result<()> { + let mut out = File::create("/sys/class/leds/led2/brightness")?; + out.write(if status {b"1"} else {b"0"})?; + Ok(()) +} + +fn set_rumble(status: bool) -> std::io::Result<()> { + let mut out = File::create("/sys/class/leds/led1/brightness")?; + out.write(if status {b"1"} else {b"0"})?; + Ok(()) +}