#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub struct Setup {
pub request_type: u8,
pub request: u8,
pub value: u16,
pub index: u16,
pub length: u16,
}
impl Setup {
pub fn new(request_type: u8, request: u8, value: u16, index: u16, length: u16) -> Setup {
Setup {
request_type,
request,
value,
index,
length,
}
}
pub fn to_bytes(self) -> [u8; 8] {
let v = self.value.to_le_bytes();
let i = self.index.to_le_bytes();
let l = self.length.to_le_bytes();
[
self.request_type,
self.request,
v[0],
v[1],
i[0],
i[1],
l[0],
l[1],
]
}
pub fn is_in(self) -> bool {
self.request_type & 0x80 != 0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TransferStatus {
Ok,
Stall,
Nak,
NoDevice,
Refused,
Other(u8),
}
impl TransferStatus {
pub fn from_u8(v: u8) -> TransferStatus {
match v {
0x00 => TransferStatus::Ok,
0xFD => TransferStatus::Stall,
0xFE => TransferStatus::Nak,
0xFF => TransferStatus::NoDevice,
0xFC => TransferStatus::Refused,
other => TransferStatus::Other(other),
}
}
pub fn as_u8(self) -> u8 {
match self {
TransferStatus::Ok => 0x00,
TransferStatus::Stall => 0xFD,
TransferStatus::Nak => 0xFE,
TransferStatus::NoDevice => 0xFF,
TransferStatus::Refused => 0xFC,
TransferStatus::Other(v) => v,
}
}
pub fn is_ok(self) -> bool {
matches!(self, TransferStatus::Ok)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TransferOutcome {
pub status: TransferStatus,
pub data: Vec<u8>,
}
impl TransferOutcome {
pub fn is_ok(&self) -> bool {
self.status.is_ok()
}
pub fn data(&self) -> &[u8] {
&self.data
}
pub fn ok_data(self) -> Option<Vec<u8>> {
self.status.is_ok().then_some(self.data)
}
}