jacdac_rs/service/
button.rs

1use 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                        // self.state = ButtonState::Release;
55                    }
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}