use color_eyre::{eyre::eyre, Result}; use gilrs::{ ff::{BaseEffect, BaseEffectType, EffectBuilder, Replay, Ticks}, Gamepad, GamepadId, Gilrs, }; pub struct GamepadManager { pub gilrs: Gilrs, gamepads: Vec, active_gamepad: Option, connected_gamepads: usize, } impl GamepadManager { pub fn new() -> Result { let gilrs = Gilrs::new().map_err(|e| eyre!("Failed to create Gilrs object:\n{:#?}", e))?; Ok(GamepadManager { gilrs, gamepads: vec![], active_gamepad: None, connected_gamepads: 0, }) } pub fn select_gamepad(&mut self, id: impl Into>) { self.active_gamepad = id.into(); } pub fn set_active_gamepad(&mut self, id: GamepadId) { self.active_gamepad = Some(id); tracing::info!("Selected gamepad changed to: {:#?}", self.active_gamepad); } pub fn active_gamepad(&self) -> Result> { match self.active_gamepad { Some(id) => Ok(self.gilrs.gamepad(id)), None => Err(eyre!("No selected gamepad")), } } pub fn gamepads(&self) -> &Vec { &self.gamepads } pub fn connected_gamepads(&self) -> &usize { &self.connected_gamepads } pub fn scan_gamepads(&mut self) { let mut gamepads = vec![]; // Iterate over all connected gamepads for (id, gamepad) in self.gilrs.gamepads() { // println!("{} is {:?}", gamepad.name(), gamepad.power_info()); // println!("Has Force Feedback Enabled ? {}", gamepad.is_ff_supported()); // if gamepad.is_ff_supported() { // test_ff(&mut gilrs, gamepad); // } gamepads.push(id); } self.connected_gamepads = gamepads.len(); self.gamepads = gamepads; } pub fn test_ff(&mut self, gamepad_id: GamepadId) { let gamepad = self.gilrs.gamepad(gamepad_id); let duration: u32 = 1000; let ff_play_ticks = Ticks::from_ms(duration); let effect = EffectBuilder::new() .add_effect(BaseEffect { kind: BaseEffectType::Strong { magnitude: 40_000 }, scheduling: Replay { play_for: ff_play_ticks, with_delay: ff_play_ticks * 2, ..Default::default() }, envelope: Default::default(), }) .add_effect(BaseEffect { kind: BaseEffectType::Weak { magnitude: 40_000 }, scheduling: Replay { after: ff_play_ticks, play_for: ff_play_ticks, ..Default::default() }, envelope: Default::default(), }) .add_gamepad(&gamepad) .finish(&mut self.gilrs) .unwrap(); effect.play().unwrap(); } }