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 A = 0,
43 B,
45 X,
47 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};