pub struct ControllerManager {
ctrl: GameControllerSubsystem,
haptic: Rc<HapticSubsystem>,
- pub controllers: Vec<Rc<Controller>>,
+ pub controllers: Vec<Rc<RefCell<Controller>>>,
}
//#[derive(Debug)]
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
}
}