1use async_trait::async_trait;
2use auto_impl::auto_impl;
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
7pub enum Button {
8 South,
9 East,
10 North,
11 West,
12 LeftTrigger,
13 LeftTrigger2,
14 RightTrigger,
15 RightTrigger2,
16 Select,
17 Start,
18 Mode,
19 LeftThumb,
20 RightThumb,
21 DPadUp,
22 DPadDown,
23 DPadLeft,
24 DPadRight,
25 Unknown,
26}
27
28#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
29pub enum Axis {
30 LeftStickX,
31 LeftStickY,
32 LeftTrigger,
33 RightStickX,
34 RightStickY,
35 RightTrigger,
36 DPadX,
37 DPadY,
38 Unknown,
39}
40
41#[derive(Debug, Clone)]
42pub enum GamepadEvent {
43 ButtonPressed(Button),
44 ButtonReleased(Button),
45 AxisChanged(Axis, f64),
46 Connected,
47 Disconnected,
48 Unknown,
49}
50
51#[async_trait]
52#[auto_impl(Box, Arc)]
53pub trait Gamepad: Send + Sync {
54 async fn next_event(&self) -> GamepadEvent;
55 fn stop(&self);
56}