timex_datalink/protocol_3/
alarm.rs1use crate::PacketGenerator;
6use crate::helpers::crc_packets_wrapper;
7use crate::char_encoders::CharString;
8
9pub struct Alarm {
13 pub number: u8,
15
16 pub audible: bool,
18
19 pub hour: u8,
21
22 pub minute: u8,
24
25 pub message: CharString<8>,
27}
28
29impl PacketGenerator for Alarm {
30 fn packets(&self) -> Vec<Vec<u8>> {
31 const CPACKET_ALARM: u8 = 0x50;
33
34 let mut raw_packet = Vec::with_capacity(16);
36 raw_packet.push(CPACKET_ALARM); raw_packet.push(self.number); raw_packet.push(self.hour); raw_packet.push(self.minute); raw_packet.push(0); raw_packet.push(0); for &byte in self.message.as_bytes() {
45 raw_packet.push(byte);
46 }
47
48 raw_packet.push(if self.audible { 1 } else { 0 });
50
51 crc_packets_wrapper::wrap_packets_with_crc(vec![raw_packet])
53 }
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn test_alarm_basic() {
62 let alarm = Alarm {
63 number: 1,
64 audible: true,
65 hour: 9,
66 minute: 0,
67 message: CharString::new("Wake up", true),
68 };
69
70 #[rustfmt::skip]
72 let expected = vec![vec![
73 18, 80, 1, 9, 0, 0, 0, 32, 10, 20, 14, 36, 30, 25, 36, 1, 32, 240
74 ]];
75
76 assert_eq!(alarm.packets(), expected);
77 }
78
79 #[test]
80 fn test_alarm_silent() {
81 let alarm = Alarm {
82 number: 3,
83 audible: false,
84 hour: 9,
85 minute: 10,
86 message: CharString::new("Get up", true),
87 };
88
89 #[rustfmt::skip]
91 let expected = vec![vec![
92 18, 80, 3, 9, 10, 0, 0, 16, 14, 29, 36, 30, 25, 36, 36, 0, 191, 169
93 ]];
94
95 assert_eq!(alarm.packets(), expected);
96 }
97}