#![warn(missing_docs)]
#![cfg_attr(not(any(feature = "sdl2", feature = "gilrs")), allow(dead_code))]
pub mod analog;
pub mod digital;
pub mod error;
mod backend;
pub use backend::{Axis, Button};
use analog::AnalogInput;
use analog::{AnalogInputValue, Deadzone};
use backend::Backend;
use backend::{ImplementationContext, OwnedImplementationGamepad};
use digital::DigitalInput;
use std::collections::HashMap;
use error::Result;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct GamepadId(backend::ImplementationId);
pub struct Gamepad {
#[allow(dead_code)]
owned_internal_gamepad: Option<OwnedImplementationGamepad>,
pub analog_inputs: AnalogInput<Axis>,
pub digital_inputs: DigitalInput<Button>,
}
impl Gamepad {
fn new(owned_internal_gamepad: Option<OwnedImplementationGamepad>) -> Self {
Self {
owned_internal_gamepad,
analog_inputs: Default::default(),
digital_inputs: Default::default(),
}
}
fn update_inputs(&mut self) {
self.analog_inputs.update();
self.digital_inputs.update();
}
}
pub struct GamepadContext {
gamepad_system: ImplementationContext,
gamepads: HashMap<GamepadId, Gamepad>,
}
impl GamepadContext {
pub fn init() -> Result<Self> {
let gamepad_system = ImplementationContext::new()?;
let gamepads = HashMap::new();
Ok(Self {
gamepad_system,
gamepads,
})
}
pub fn gamepad(&self, id: GamepadId) -> Option<&Gamepad> {
self.gamepads.get(&id)
}
pub fn gamepads(&self) -> impl Iterator<Item = (GamepadId, &Gamepad)> {
self.gamepads.iter().map(|(&id, gamepad)| (id, gamepad))
}
pub fn update(&mut self) -> Result<()> {
self.gamepad_system.update(&mut self.gamepads)
}
pub fn set_deadzone(&mut self, deadzone: f32) {
for (_, gamepad) in self.gamepads.iter_mut() {
let deadzone = Deadzone::from(AnalogInputValue::from(deadzone));
gamepad.analog_inputs.set_deadzone(deadzone);
}
}
pub fn set_digital_deadzone(&mut self, deadzone: f32) {
for (_, gamepad) in self.gamepads.iter_mut() {
let deadzone = Deadzone::from(AnalogInputValue::from(deadzone));
gamepad.analog_inputs.set_digital_deadzone(deadzone);
}
}
}