use serde::Serialize;
use usbd_hid::descriptor::generator_prelude::*;
#[gen_hid_descriptor(
(collection = APPLICATION, usage_page = GENERIC_DESKTOP, usage = KEYBOARD) = {
(usage_page = KEYBOARD, usage_min = 0xE0, usage_max = 0xE7) = {
#[packed_bits 8] #[item_settings data,variable,absolute] modifier=input;
};
(logical_min = 0,) = {
#[item_settings constant,variable,absolute] reserved=input;
};
(usage_page = LEDS, usage_min = 0x01, usage_max = 0x05) = {
#[packed_bits 5] #[item_settings data,variable,absolute] leds=output;
};
(usage_page = KEYBOARD, usage_min = 0x00, usage_max = 0xDD) = {
#[item_settings data,array,absolute] keycodes=input;
};
}
)]
#[allow(dead_code)]
#[derive(Default)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct KeyboardReport {
pub modifier: u8, pub reserved: u8,
pub leds: u8, pub keycodes: [u8; 6],
}
#[gen_hid_descriptor(
(collection = APPLICATION, usage_page = 0xFF60, usage = 0x61) = {
(usage = 0x62, logical_min = 0x0) = {
#[item_settings data,variable,absolute] input_data=input;
};
(usage = 0x63, logical_min = 0x0) = {
#[item_settings data,variable,absolute] output_data=output;
};
}
)]
#[derive(Default)]
pub struct ViaReport {
pub(crate) input_data: [u8; 32],
pub(crate) output_data: [u8; 32],
}
#[repr(u8)]
#[derive(Debug, Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Serialize)]
pub enum CompositeReportType {
#[default]
None = 0x00,
Mouse = 0x01,
Media = 0x02,
System = 0x03,
}
impl CompositeReportType {
fn from_u8(report_id: u8) -> Self {
match report_id {
0x01 => Self::Mouse,
0x02 => Self::Media,
0x03 => Self::System,
_ => Self::None,
}
}
}
#[gen_hid_descriptor(
(collection = APPLICATION, usage_page = GENERIC_DESKTOP, usage = MOUSE) = {
(collection = PHYSICAL, usage = POINTER) = {
(report_id = 0x01,) = {
(usage_page = BUTTON, usage_min = BUTTON_1, usage_max = BUTTON_8) = {
#[packed_bits 8] #[item_settings data,variable,absolute] buttons=input;
};
(usage_page = GENERIC_DESKTOP,) = {
(usage = X,) = {
#[item_settings data,variable,relative] x=input;
};
(usage = Y,) = {
#[item_settings data,variable,relative] y=input;
};
(usage = WHEEL,) = {
#[item_settings data,variable,relative] wheel=input;
};
};
(usage_page = CONSUMER,) = {
(usage = AC_PAN,) = {
#[item_settings data,variable,relative] pan=input;
};
};
};
};
},
(collection = APPLICATION, usage_page = CONSUMER, usage = CONSUMER_CONTROL) = {
(report_id = 0x02,) = {
(usage_page = CONSUMER, usage_min = 0x00, usage_max = 0x514) = {
#[item_settings data,array,absolute,not_null] media_usage_id=input;
}
};
},
(collection = APPLICATION, usage_page = GENERIC_DESKTOP, usage = SYSTEM_CONTROL) = {
(report_id = 0x03,) = {
(usage_min = 0x81, usage_max = 0xB7, logical_min = 1) = {
#[item_settings data,array,absolute,not_null] system_usage_id=input;
};
};
}
)]
#[derive(Default, Serialize)]
pub struct CompositeReport {
pub(crate) buttons: u8, pub(crate) x: i8,
pub(crate) y: i8,
pub(crate) wheel: i8, pub(crate) pan: i8, pub(crate) media_usage_id: u16,
pub(crate) system_usage_id: u8,
}