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;
#[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,
})
}
}