use super::*;
const CATEGORY_TRANSPORT: u32 = 2;
const CMD_SET_TRANSMIT_MODE: u32 = 0;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum TxPacketFormat {
Unique,
Iec61883,
}
impl Default for TxPacketFormat {
fn default() -> Self {
Self::Iec61883
}
}
fn serialize_tx_packet_format(fmt: &TxPacketFormat) -> u32 {
match fmt {
TxPacketFormat::Unique => 0,
TxPacketFormat::Iec61883 => 1,
}
}
#[cfg(test)]
fn deserialize_tx_packet_format(fmt: &mut TxPacketFormat, val: u32) {
*fmt = match val {
1 => TxPacketFormat::Iec61883,
_ => TxPacketFormat::Unique,
};
}
impl<O, P> EfwWhollyUpdatableParamsOperation<P, TxPacketFormat> for O
where
O: EfwHardwareSpecification,
P: EfwProtocolExtManual,
{
fn update_wholly(proto: &mut P, states: &TxPacketFormat, timeout_ms: u32) -> Result<(), Error> {
assert!(Self::CAPABILITIES
.iter()
.find(|cap| HwCap::ChangeableRespAddr.eq(cap))
.is_some());
let args = [serialize_tx_packet_format(states)];
let mut params = Vec::new();
proto.transaction(
CATEGORY_TRANSPORT,
CMD_SET_TRANSMIT_MODE,
&args,
&mut params,
timeout_ms,
)
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn tx_packet_format_serdes() {
[TxPacketFormat::Unique, TxPacketFormat::Iec61883]
.iter()
.for_each(|fmt| {
let val = serialize_tx_packet_format(fmt);
let mut f = TxPacketFormat::default();
deserialize_tx_packet_format(&mut f, val);
assert_eq!(*fmt, f);
});
}
}