use serde::{Deserialize, Serialize};
pub(crate) static CENTRAL_MAGIC_NUMBER: u32 = 0xA8912BF0;
pub(crate) static PERIPHERAL_MAGIC_NUMBER: u32 = !CENTRAL_MAGIC_NUMBER;
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct ControlPacket {
pub is_collector: bool,
#[cfg(feature = "statistics")]
pub sequence_number: u32,
}
impl ControlPacket {
pub fn new(
is_collector: bool,
#[cfg(feature = "statistics")] sequence_number: u32,
) -> Self {
Self {
is_collector,
#[cfg(feature = "statistics")]
sequence_number,
}
}
}
#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct PeripheralPacket;
impl PeripheralPacket {
pub fn new() -> Self {
Self
}
}
impl Default for PeripheralPacket {
fn default() -> Self {
Self::new()
}
}
pub(crate) const PERIPHERAL_BEACON_SENTINEL: u8 = 0;
pub(crate) fn serialize_with_magic<'a, T: Serialize>(
packet: &T,
magic: u32,
send_magic: bool,
buf: &'a mut [u8],
) -> Result<&'a [u8], postcard::Error> {
if send_magic {
buf[0..4].copy_from_slice(&magic.to_le_bytes());
let body = postcard::to_slice(packet, &mut buf[4..])?;
let len = 4 + body.len();
Ok(&buf[..len])
} else {
let body = postcard::to_slice(packet, buf)?;
let len = body.len();
Ok(&buf[..len])
}
}
pub(crate) fn parse_with_magic<T: for<'de> Deserialize<'de>>(
data: &[u8],
magic: u32,
expect_magic: bool,
) -> Option<T> {
let body = if expect_magic {
if data.len() < 4 || u32::from_le_bytes(data[0..4].try_into().ok()?) != magic {
return None;
}
&data[4..]
} else {
data
};
postcard::take_from_bytes::<T>(body).ok().map(|(v, _rest)| v)
}