1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use chrono::{NaiveDate, NaiveTime};

use super::event::Event;
use crate::messages::GetStatusResponse;
use anyhow::Result;

/// Status of a [`Device`]
#[derive(Debug)]
pub struct Status {
    pub device_id: u32,
    pub system_time: NaiveTime,
    pub system_date: NaiveDate,
    pub doors: Vec<bool>,
    pub buttons: Vec<bool>,
    pub relay_state: u8,
    pub input_state: u8,
    pub system_error: u8,
    pub special_info: u8,
    pub sequence_number: u32,
    pub last_event: Option<Event>,
}

impl TryFrom<GetStatusResponse> for Status {
    type Error = anyhow::Error;
    fn try_from(response: GetStatusResponse) -> Result<Self> {
        let event = match response.event_index {
            0 => None,
            x => Some(Event {
                index: x,
                event_type: response.event_type.into(),
                granted: response.granted,
                door: response.door,
                direction: response.direction.into(),
                card_number: response.card_number,
                timestamp: response.timestamp.try_into()?,
                reason: response.reason.into(),
            }),
        };

        Ok(Status {
            device_id: response.device_id,
            system_time: response.system_time.try_into()?,
            system_date: response.system_date.try_into()?,
            doors: vec![
                response.door1_state,
                response.door2_state,
                response.door3_state,
                response.door4_state,
            ],
            buttons: vec![
                response.door1_button,
                response.door2_button,
                response.door3_button,
                response.door4_button,
            ],
            relay_state: response.relay_state,
            input_state: response.input_state,
            system_error: response.system_error,
            special_info: response.special_info,
            sequence_number: response.sequence_id,
            last_event: event,
        })
    }
}