autd3-rs 0.6.1

Core async client library for the AUTD3 phased-array kit.
Documentation
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);
    }
}