use autd3_cpu_wire::payload::ForceFanPayload;
use zerocopy::FromBytes;
use crate::error::Error;
use crate::geometry::Device;
use crate::protocol::{Cmd, PAYLOAD_BYTES};
use super::{Distribution, Operation};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)]
pub struct ForceFan {
pub value: bool,
}
impl crate::sealed::Sealed for ForceFan {}
impl Operation for ForceFan {
fn distribution(&self) -> Distribution {
Distribution::Broadcast
}
fn encode(&self, _device: &Device, out: &mut [u8; PAYLOAD_BYTES]) -> Result<Cmd, Error> {
let (p, _) = ForceFanPayload::mut_from_prefix(&mut out[..]).unwrap();
*p = ForceFanPayload {
value: u8::from(self.value),
};
Ok(Cmd::ForceFan)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_utils::test_device;
#[test]
fn force_fan_encodes_flag() {
let mut out = [0u8; PAYLOAD_BYTES];
let cmd = ForceFan { value: true }
.encode(&test_device(0), &mut out)
.unwrap();
assert_eq!(cmd, Cmd::ForceFan);
assert_eq!(out[0], 1);
let mut out = [0u8; PAYLOAD_BYTES];
ForceFan { value: false }
.encode(&test_device(0), &mut out)
.unwrap();
assert_eq!(out[0], 0);
}
}