Add documentation to usb_hid_item
This commit is contained in:
@ -3,6 +3,34 @@
|
|||||||
|
|
||||||
use core::fmt;
|
use core::fmt;
|
||||||
|
|
||||||
|
/// A single item.
|
||||||
|
///
|
||||||
|
/// There are three categories of items:
|
||||||
|
///
|
||||||
|
/// * Main items (`Input`, `Output`, `Feature`, `Collection`, `EndCollection`)
|
||||||
|
/// * Global items
|
||||||
|
///
|
||||||
|
/// # Main items
|
||||||
|
///
|
||||||
|
/// Main items define or group data fields.
|
||||||
|
/// `Input`, `Output` and `Feature` create new data fields.
|
||||||
|
/// `Collection` and `EndCollection` group data fields.
|
||||||
|
///
|
||||||
|
/// # Global items
|
||||||
|
///
|
||||||
|
/// Global items define properties of all data fields that are subsequently defined.
|
||||||
|
/// Global state can be saved and restored with `Push` and `Pop`.
|
||||||
|
///
|
||||||
|
/// Global items are `UsagePage`, `LogicalMin`, `LogicalMax`, `PhysicalMin`, `PhysicalMax`,
|
||||||
|
/// `UnitExponent`, `Unit`, `ReportSize`, `ReportId`, `ReportCount`.
|
||||||
|
///
|
||||||
|
/// # Local items
|
||||||
|
///
|
||||||
|
/// Local items define properties of the next data item.
|
||||||
|
/// They are flushed after a Main item is encountered.
|
||||||
|
///
|
||||||
|
/// Local items are `Usage16`, `Usage32`, `UsageMin`, `UsageMax`, `DesignatorIndex`,
|
||||||
|
/// `DesignatorMin`, `DesignatorMax`, `StringIndex`, `StringMin`, `StringMax`, `Delimiter`.
|
||||||
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub enum Item<'a> {
|
pub enum Item<'a> {
|
||||||
@ -17,7 +45,7 @@ pub enum Item<'a> {
|
|||||||
LogicalMax(i32),
|
LogicalMax(i32),
|
||||||
PhysicalMin(i32),
|
PhysicalMin(i32),
|
||||||
PhysicalMax(i32),
|
PhysicalMax(i32),
|
||||||
UnitExponential(u32),
|
UnitExponent(u32),
|
||||||
Unit(u32),
|
Unit(u32),
|
||||||
ReportSize(u32),
|
ReportSize(u32),
|
||||||
ReportId(u8),
|
ReportId(u8),
|
||||||
@ -135,7 +163,7 @@ impl<'a> Item<'a> {
|
|||||||
Self::LOGI_MAX => Self::LogicalMax(d32i()?),
|
Self::LOGI_MAX => Self::LogicalMax(d32i()?),
|
||||||
Self::PHYS_MIN => Self::PhysicalMin(d32i()?),
|
Self::PHYS_MIN => Self::PhysicalMin(d32i()?),
|
||||||
Self::PHYS_MAX => Self::PhysicalMax(d32i()?),
|
Self::PHYS_MAX => Self::PhysicalMax(d32i()?),
|
||||||
Self::UNIT_EXP => Self::UnitExponential(d32u()?),
|
Self::UNIT_EXP => Self::UnitExponent(d32u()?),
|
||||||
Self::UNIT => Self::Unit(d32u()?),
|
Self::UNIT => Self::Unit(d32u()?),
|
||||||
Self::REPORT_SIZE => Self::ReportSize(d32u()?),
|
Self::REPORT_SIZE => Self::ReportSize(d32u()?),
|
||||||
Self::REPORT_ID => Self::ReportId(d8()?),
|
Self::REPORT_ID => Self::ReportId(d8()?),
|
||||||
@ -178,9 +206,10 @@ impl<'a> Item<'a> {
|
|||||||
pub struct MainFlags(pub u32);
|
pub struct MainFlags(pub u32);
|
||||||
|
|
||||||
macro_rules! flags {
|
macro_rules! flags {
|
||||||
{ $($flag:ident $bit:literal)* } => {
|
{ $($(#[doc = $doc:literal])* $flag:ident $bit:literal)* } => {
|
||||||
impl MainFlags {
|
impl MainFlags {
|
||||||
$(
|
$(
|
||||||
|
$(#[doc = $doc])*
|
||||||
pub fn $flag(&self) -> bool {
|
pub fn $flag(&self) -> bool {
|
||||||
self.0 & 1 << $bit != 0
|
self.0 & 1 << $bit != 0
|
||||||
}
|
}
|
||||||
@ -198,17 +227,62 @@ macro_rules! flags {
|
|||||||
}
|
}
|
||||||
|
|
||||||
flags! {
|
flags! {
|
||||||
|
/// Whether a value can be modified by the host.
|
||||||
constant 0
|
constant 0
|
||||||
|
/// Whether array or variable fields are used in reports.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// If a device has 50 buttons where each button has 1 state then:
|
||||||
|
///
|
||||||
|
/// * With array data there will be 50 fields of 1 bit each (Report Count = 50, Report Size = 1).
|
||||||
|
/// * With variable data and Report Count = 4, Report Size = 6 there will be 4 fields of 5 bits
|
||||||
|
/// each, where each field points to a single button.
|
||||||
|
///
|
||||||
|
/// This is more efficient for keyboards, where there are many keys but only a few are pressed at
|
||||||
|
/// any time.
|
||||||
variable 1
|
variable 1
|
||||||
|
/// Whether data is absolute or relative.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// Mice return relative position data whereas tablets return absolute position data.
|
||||||
relative 2
|
relative 2
|
||||||
|
/// Whether data may wrap around.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// A wheel's absolute position may be expressed as a value from 1 to 100.
|
||||||
|
/// If the value becomes 101 it is reported as 1.
|
||||||
|
/// If the value becomes 0 it is reported as 100.
|
||||||
wrap 3
|
wrap 3
|
||||||
non_linear 4
|
/// Whether the reported data has been processed such that the relation between the real
|
||||||
no_preferred 5
|
/// and reported value is no longer linear.
|
||||||
null_state 6
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// Acceleration curves, joystick dead zones.
|
||||||
|
nonlinear 4
|
||||||
|
/// Whether the control will return to a default state if not interacted with.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// A button only stays pressed when the user interacts with it.
|
||||||
|
/// A switch stays toggled on or off when the user stops interacting with it.
|
||||||
|
nopreferred 5
|
||||||
|
/// Whether there is a state for a control where it doesn't send meaningful data.
|
||||||
|
null 6
|
||||||
|
/// Whether the value of an output control may change without host interaction.
|
||||||
volatile 7
|
volatile 7
|
||||||
|
/// Whether the control is a bitfield or emits a stream or arbitrary bytes.
|
||||||
|
///
|
||||||
|
/// # Example
|
||||||
|
///
|
||||||
|
/// Bar code reader.
|
||||||
buffered_bytes 8
|
buffered_bytes 8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A collection of items.
|
||||||
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub enum Collection {
|
pub enum Collection {
|
||||||
@ -239,7 +313,9 @@ impl Collection {
|
|||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum ParseError {
|
pub enum ParseError {
|
||||||
|
/// An item is longer than the amount of bytes remaining in the buffer.
|
||||||
Truncated,
|
Truncated,
|
||||||
|
/// An item has an unexpected data value.
|
||||||
UnexpectedData,
|
UnexpectedData,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,6 +335,7 @@ impl<'a> Iterator for Parser<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Parse a Report descriptor.
|
||||||
pub fn parse(data: &[u8]) -> Parser<'_> {
|
pub fn parse(data: &[u8]) -> Parser<'_> {
|
||||||
Parser { data }
|
Parser { data }
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user