use crate::subdevice_state::SubDeviceState;
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, ethercrab_wire::EtherCrabWireReadWrite)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[wire(bytes = 2)]
pub struct AlControl {
#[wire(bits = 4)]
pub state: SubDeviceState,
#[wire(bits = 1)]
pub error: bool,
#[wire(bits = 1, post_skip = 10)]
pub id_request: bool,
}
impl AlControl {
pub fn new(state: SubDeviceState) -> Self {
Self {
state,
error: false,
id_request: false,
}
}
pub fn reset() -> Self {
Self {
state: SubDeviceState::Init,
error: true,
..Default::default()
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use ethercrab_wire::{EtherCrabWireRead, EtherCrabWireWriteSized};
#[test]
fn al_control() {
let value = AlControl {
state: SubDeviceState::SafeOp,
error: true,
id_request: false,
};
let packed = value.pack();
assert_eq!(packed, [0x04 | 0x10, 0x00]);
}
#[test]
fn unpack() {
let value = AlControl {
state: SubDeviceState::SafeOp,
error: true,
id_request: false,
};
let parsed = AlControl::unpack_from_slice(&[0x04 | 0x10, 0x00]).unwrap();
assert_eq!(value, parsed);
}
#[test]
fn unpack_short() {
let parsed = AlControl::unpack_from_slice(&[0x04 | 0x10]);
assert!(parsed.is_err());
}
}