+
+ pub mov: Stick,
+ pub aim: Stick,
+ pub jump: Button,
+ pub start: Button,
+ pub shoot: Button,
+}
+
+impl Controller {
+ pub fn new(device: Joystick, haptic: Option<Rc<RefCell<Haptic>>>) -> Self {
+ let action_map = get_action_mapping();
+ let device_map = get_device_mapping(&device.name());
+ let mut ctrl = Controller {
+ device,
+ haptic,
+ mov: Default::default(),
+ aim: Default::default(),
+ jump: Default::default(),
+ start: Default::default(),
+ shoot: Default::default(),
+ };
+ ctrl.set_mapping(&action_map, &device_map);
+ ctrl
+ }
+
+ fn set_mapping(&mut self, action: &HashMap<ActionControls, DeviceControls>, device: &HashMap<DeviceControls, u8>) {
+ self.mov.idx = *action.get(&ActionControls::MovementX).map(|i| device.get(i)).flatten().unwrap();
+ self.mov.idy = *action.get(&ActionControls::MovementY).map(|i| device.get(i)).flatten().unwrap();
+ self.aim.idx = *action.get(&ActionControls::AimX).map(|i| device.get(i)).flatten().unwrap();
+ self.aim.idy = *action.get(&ActionControls::AimY).map(|i| device.get(i)).flatten().unwrap();
+ self.jump.id = *action.get(&ActionControls::Jump).map(|i| device.get(i)).flatten().unwrap();
+ self.shoot.id = *action.get(&ActionControls::Shoot).map(|i| device.get(i)).flatten().unwrap();
+ self.start.id = *action.get(&ActionControls::Start).map(|i| device.get(i)).flatten().unwrap();
+ }
+
+ pub fn update(&mut self, dt: Duration) {
+ self.mov.update(&self.device, dt);
+ self.aim.update(&self.device, dt);
+ self.jump.update(&self.device, dt);
+ self.shoot.update(&self.device, dt);
+ self.start.update(&self.device, dt);
+ }
+
+ /// strength [0 - 1]
+ pub fn rumble(&self, strength: f32, duration: Duration) {
+ if let Some(h) = &self.haptic {
+ h.borrow_mut().rumble_play(strength, duration.whole_milliseconds() as u32);
+ }
+ }
+}
+
+fn get_action_mapping() -> HashMap<ActionControls, DeviceControls> {
+ hashmap!(
+ ActionControls::MovementX => DeviceControls::AxisLX,
+ ActionControls::MovementY => DeviceControls::AxisLY,
+ ActionControls::AimX => DeviceControls::AxisRX,
+ ActionControls::AimY => DeviceControls::AxisRY,
+ ActionControls::Jump => DeviceControls::ButtonL1,
+ ActionControls::Shoot => DeviceControls::ButtonR1,
+ ActionControls::Start => DeviceControls::ButtonStart
+ )
+}
+
+fn get_device_mapping(device_name: &str) -> HashMap<DeviceControls, u8> {
+ match device_name {
+ "Sony PLAYSTATION(R)3 Controller" => hashmap!(
+ DeviceControls::AxisLX => 0,
+ DeviceControls::AxisLY => 1,
+ DeviceControls::AxisRX => 3,
+ DeviceControls::AxisRY => 4,
+ DeviceControls::AxisL2 => 2,
+ DeviceControls::AxisR2 => 5,
+ DeviceControls::ButtonA => 0,
+ DeviceControls::ButtonB => 1,
+ DeviceControls::ButtonY => 3,
+ DeviceControls::ButtonX => 2,
+ DeviceControls::ButtonSelect => 8,
+ DeviceControls::ButtonStart => 9,
+ DeviceControls::ButtonHome => 10,
+ DeviceControls::ButtonL3 => 11,
+ DeviceControls::ButtonR3 => 12,
+ DeviceControls::ButtonL1 => 4,
+ DeviceControls::ButtonR1 => 5,
+ DeviceControls::ButtonL2 => 6,
+ DeviceControls::ButtonR2 => 7,
+ DeviceControls::ButtonUp => 13,
+ DeviceControls::ButtonDown => 14,
+ DeviceControls::ButtonLeft => 15,
+ DeviceControls::ButtonRight => 16
+ ),
+ _ => panic!("No controller mapping for device '{}'", device_name)
+ }
+}
+
+//#[derive(Debug)]
+pub struct ControllerManager {
+ pub joystick: JoystickSubsystem,
+ haptic: Rc<HapticSubsystem>,
+ pub controllers: HashMap<u32, Rc<RefCell<Controller>>>,