pub const SHORT_REPORT_ID: u8 = 0x10;
pub const SHORT_REPORT_LENGTH: usize = 7;
pub const LONG_REPORT_ID: u8 = 0x11;
pub const LONG_REPORT_LENGTH: usize = 20;
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub enum HidppMessage {
Short([u8; SHORT_REPORT_LENGTH - 1]),
Long([u8; LONG_REPORT_LENGTH - 1]),
}
impl HidppMessage {
#[must_use]
pub fn read_raw(data: &[u8]) -> Option<Self> {
let (&report_id, rest) = data.split_first()?;
if report_id == SHORT_REPORT_ID
&& let Some((&payload, [])) = rest.split_first_chunk()
{
Some(HidppMessage::Short(payload))
} else if report_id == LONG_REPORT_ID
&& let Some((&payload, [])) = rest.split_first_chunk()
{
Some(HidppMessage::Long(payload))
} else {
None
}
}
pub fn write_raw(&self, buf: &mut [u8]) -> usize {
match self {
Self::Short(payload) => {
buf[0] = SHORT_REPORT_ID;
buf[1..SHORT_REPORT_LENGTH].copy_from_slice(payload);
SHORT_REPORT_LENGTH
}
Self::Long(payload) => {
buf[0] = LONG_REPORT_ID;
buf[1..LONG_REPORT_LENGTH].copy_from_slice(payload);
LONG_REPORT_LENGTH
}
}
}
pub(super) fn header(&self) -> (u8, u8, u8) {
let payload: &[u8] = match self {
Self::Short(payload) => payload,
Self::Long(payload) => payload,
};
(payload[0], payload[1], payload[2])
}
#[must_use]
pub(super) fn widened(self) -> Self {
match self {
Self::Short(payload) => {
let mut long = [0u8; LONG_REPORT_LENGTH - 1];
long[..payload.len()].copy_from_slice(&payload);
Self::Long(long)
}
long @ Self::Long(_) => long,
}
}
}