jacdac_rs/service/
button.rs1use super::{
2 reports::{ActionReport, EventReport},
3 serivce_error::ServiceError,
4 service::Service,
5};
6
7#[derive(Debug, Default, Clone, Copy)]
8pub enum ButtonState {
9 #[default]
10 Release,
11 Press,
12}
13
14#[derive(Debug, Default)]
15pub struct Button {
16 state: ButtonState,
17 last_press_time: u32,
18}
19
20impl Button {
21 pub fn state(&self) -> ButtonState {
22 self.state
23 }
24
25 pub fn last_press_time(&self) -> u32 {
26 self.last_press_time
27 }
28}
29
30impl Service for Button {
31 fn handle_event_report(&mut self, event: EventReport) -> Result<(), ServiceError> {
32 match event.code {
33 0x01 => self.state = ButtonState::Press,
34
35 0x02 => match event.payload {
36 Some(payload) => {
37 if payload.len() < 4 {
38 return Err(ServiceError::InvalidPayloadSize(payload.len(), 4));
39 } else {
40 self.last_press_time =
41 u32::from_le_bytes(payload[0..4].try_into().unwrap());
42 self.state = ButtonState::Release;
43 }
44 }
45 None => return Err(ServiceError::InvalidPayloadSize(0, 4)),
46 },
47
48 0x81 => match event.payload {
49 Some(payload) => {
50 if payload.len() < 4 {
51 return Err(ServiceError::InvalidPayloadSize(payload.len(), 4));
52 } else {
53 let _time = u32::from_le_bytes(payload[0..4].try_into().unwrap());
54 }
56 }
57 None => return Err(ServiceError::InvalidPayloadSize(0, 4)),
58 },
59
60 _ => return Err(ServiceError::UnknownEventCode),
61 };
62 Ok(())
63 }
64
65 fn handle_action_report(&mut self, _action: ActionReport) -> Result<(), ServiceError> {
66 unimplemented!()
67 }
68}