From: Tomas Wenström Date: Sun, 10 Jan 2021 14:17:23 +0000 (+0100) Subject: Give added device to any disconnected controller X-Git-Url: http://dolda2000.com/gitweb/?p=kaka%2Frust-sdl-test.git;a=commitdiff_plain;h=ca99d4d7fc9e8e2dde6c4174797196f5c5a4b7e3 Give added device to any disconnected controller --- diff --git a/src/core/app.rs b/src/core/app.rs index b495edb..8c07417 100644 --- a/src/core/app.rs +++ b/src/core/app.rs @@ -182,7 +182,7 @@ impl App { match event { Event::ControllerButtonDown { .. } => { let c = self.ctrl_man.controllers[0].clone(); - c.rumble(0.75, 100); + c.borrow().rumble(1.0, 300); } Event::Quit { .. } | Event::KeyDown { diff --git a/src/core/controller.rs b/src/core/controller.rs index b3f6201..f565070 100644 --- a/src/core/controller.rs +++ b/src/core/controller.rs @@ -10,7 +10,7 @@ use std::rc::Rc; pub struct ControllerManager { ctrl: GameControllerSubsystem, haptic: Rc, - pub controllers: Vec>, + pub controllers: Vec>>, } //#[derive(Debug)] @@ -45,18 +45,34 @@ impl ControllerManager { println!("device added ({})!", id); let mut ctrl = self.ctrl.open(id).unwrap(); println!("opened {}", ctrl.name()); - let haptic = match ctrl.set_rumble(500, 1000, 500) { + + /* + note about set_rumble (for dualshock 3 at least): + the active range for the low frequency is from 65536/4 to 65536 and escalates in large steps throughout the range + the active range for the high frequency is from 256 to 65536 and effect is the same throughout the whole range + */ + let haptic = match ctrl.set_rumble(0, 256, 100) { Ok(_) => self.haptic.open_from_joystick_id(id).ok(), Err(_) => None }; - let c = Rc::new(Controller {id, ctrl, haptic: haptic.map(|h| Rc::new(RefCell::new(h)))}); - c.rumble(0.5, 300); - self.controllers.push(c); + let detached = self.controllers.iter().find(|c| !c.borrow().ctrl.attached()); + match detached { + Some(c) => { + let mut c = c.borrow_mut(); + c.ctrl = ctrl; + c.haptic = haptic.map(|h| Rc::new(RefCell::new(h))); + } + None => { + let c = Rc::new(RefCell::new(Controller {id, ctrl, haptic: haptic.map(|h| Rc::new(RefCell::new(h)))})); + self.controllers.push(c); + } + }; } pub fn remove_device(&mut self, id: i32) { println!("device removed ({})!", id); + // TODO } }