1#![no_std]
17
18#[cfg(feature = "alloc")]
19extern crate alloc;
20
21#[repr(u8)]
28pub enum LiteMessageType {
29 Hello = 0x01,
30 Welcome = 0x02,
31 Set = 0x21,
32 Publish = 0x20,
33 Ping = 0x41,
34 Pong = 0x42,
35}
36
37#[repr(C, packed)]
39pub struct LiteHeader {
40 pub magic: u8, pub msg_type: u8, pub address: u16, }
44
45#[repr(C, packed)]
47pub struct LiteSetMessage {
48 pub header: LiteHeader,
49 pub value: i32, }
51
52pub fn encode_lite_set(address: u16, value: i32, buf: &mut [u8]) -> usize {
54 if buf.len() < 8 {
55 return 0;
56 }
57
58 buf[0] = 0x53; buf[1] = LiteMessageType::Set as u8;
60 buf[2] = (address >> 8) as u8;
61 buf[3] = address as u8;
62 buf[4] = (value >> 24) as u8;
63 buf[5] = (value >> 16) as u8;
64 buf[6] = (value >> 8) as u8;
65 buf[7] = value as u8;
66
67 8
68}
69
70pub fn decode_lite_header(buf: &[u8]) -> Option<(LiteMessageType, u16)> {
72 if buf.len() < 4 || buf[0] != 0x53 {
73 return None;
74 }
75
76 let msg_type = match buf[1] {
77 0x01 => LiteMessageType::Hello,
78 0x02 => LiteMessageType::Welcome,
79 0x21 => LiteMessageType::Set,
80 0x20 => LiteMessageType::Publish,
81 0x41 => LiteMessageType::Ping,
82 0x42 => LiteMessageType::Pong,
83 _ => return None,
84 };
85
86 let address = ((buf[2] as u16) << 8) | (buf[3] as u16);
87
88 Some((msg_type, address))
89}