quad_gamepad/
lib.rs

1#[cfg(target_os = "linux")]
2extern crate libc;
3
4#[cfg(target_os = "windows")]
5extern crate winapi;
6
7#[cfg(target_os = "macos")]
8extern crate core_foundation;
9#[cfg(target_os = "macos")]
10extern crate libc;
11
12mod mapping;
13mod platform;
14
15pub use self::platform::*;
16
17pub const MAX_DEVICES: usize = 8;
18pub const MAX_DIGITAL: usize = 16;
19pub const MAX_ANALOG: usize = 8;
20
21#[derive(Debug, Clone)]
22pub struct ControllerInfo {
23    pub name: String,
24    pub buttons: Vec<GamepadButton>,
25    pub analog_count: usize,
26}
27
28impl ControllerInfo {
29    pub fn new() -> Self {
30        Self {
31            name: "null".to_owned(),
32            analog_count: 0,
33            buttons: vec![],
34        }
35    }
36}
37
38#[repr(usize)]
39#[derive(Debug, Clone, Copy, PartialEq, Hash)]
40pub enum GamepadButton {
41    /// Also Cross
42    A = 0,
43    /// Also Circle
44    B,
45    /// Also Square
46    X,
47    /// Also Triangle
48    Y,
49    DpadUp,
50    DpadDown,
51    DpadRight,
52    DpadLeft,
53    BumperLeft,
54    BumperRight,
55    ThumbLeft,
56    ThumbRight,
57    Select,
58    Start,
59    Back,
60    Unknown,
61    Max,
62}
63
64#[derive(Debug, Clone, Copy, PartialEq, Eq)]
65pub enum ControllerStatus {
66    Disconnected,
67    Connected,
68}
69
70#[derive(Debug)]
71pub struct ControllerState {
72    pub status: ControllerStatus,
73    pub sequence: usize,
74    pub digital_state_prev: [bool; GamepadButton::Max as usize],
75    pub digital_state: [bool; GamepadButton::Max as usize],
76    pub analog_state: [f32; MAX_ANALOG],
77}
78
79impl ControllerState {
80    pub fn new() -> Self {
81        Self {
82            status: ControllerStatus::Disconnected,
83            sequence: 0,
84            digital_state: [false; GamepadButton::Max as usize],
85            digital_state_prev: [false; GamepadButton::Max as usize],
86            analog_state: [0.0; MAX_ANALOG],
87        }
88    }
89}
90
91const DEFAULT_CONTROLLER_STATE: ControllerState = ControllerState {
92    status: ControllerStatus::Disconnected,
93    sequence: 0,
94    digital_state: [false; GamepadButton::Max as usize],
95    digital_state_prev: [false; GamepadButton::Max as usize],
96    analog_state: [0.0; MAX_ANALOG],
97};