1use num_enum::{FromPrimitive, IntoPrimitive};
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IntoPrimitive, FromPrimitive)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize))]
8#[non_exhaustive]
9#[repr(u8)]
10pub enum RotationState {
11 Inactive = 0,
13 Start = 1,
15 Active = 2,
17 Stop = 3,
19 #[num_enum(catch_all)]
21 Other(u8),
22}
23
24#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IntoPrimitive, FromPrimitive)]
26#[cfg_attr(feature = "serde", derive(serde::Serialize))]
27#[non_exhaustive]
28#[repr(u8)]
29pub enum ActivityState {
30 Inactive = 0,
32 Start = 1,
34 Active = 2,
36 Stop = 3,
38 #[num_enum(catch_all)]
40 Other(u8),
41}
42
43#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IntoPrimitive, FromPrimitive)]
45#[cfg_attr(feature = "serde", derive(serde::Serialize))]
46#[non_exhaustive]
47#[repr(u8)]
48pub enum CrownGesture {
49 None = 0,
51 Tap = 1,
53 DoubleTap = 2,
55 #[num_enum(catch_all)]
57 Other(u8),
58}
59
60#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, IntoPrimitive, FromPrimitive)]
62#[cfg_attr(feature = "serde", derive(serde::Serialize))]
63#[non_exhaustive]
64#[repr(u8)]
65pub enum ButtonState {
66 Inactive = 0,
68 Press = 1,
70 ShortPressActive = 2,
72 LongPress = 3,
74 LongPressActive = 4,
76 Release = 5,
78 #[num_enum(catch_all)]
80 Other(u8),
81}
82
83#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
85#[cfg_attr(feature = "serde", derive(serde::Serialize))]
86#[non_exhaustive]
87pub enum CrownEvent {
88 Update(CrownUpdate),
93}
94
95#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
97#[cfg_attr(feature = "serde", derive(serde::Serialize))]
98#[non_exhaustive]
99pub struct CrownUpdate {
100 pub rotation_state: RotationState,
102 pub relative_slot_rotation: i8,
104 pub relative_ratchet_rotation: i8,
106 pub proximity: ActivityState,
108 pub touch: ActivityState,
110 pub gesture: CrownGesture,
112 pub button: ButtonState,
114 pub speed: i16,
116}
117
118pub(super) fn decode_event(sub_id: u8, payload: &[u8; 16]) -> Option<CrownEvent> {
120 match sub_id {
121 0 => Some(CrownEvent::Update(CrownUpdate {
122 rotation_state: RotationState::from(payload[0]),
123 relative_slot_rotation: payload[1] as i8,
124 relative_ratchet_rotation: payload[2] as i8,
125 proximity: ActivityState::from(payload[3]),
126 touch: ActivityState::from(payload[4]),
127 gesture: CrownGesture::from(payload[5]),
128 button: ButtonState::from(payload[6]),
129 speed: i16::from_be_bytes([payload[14], payload[15]]),
130 })),
131 _ => None,
132 }
133}