autd3-rs 0.4.0

Core async client library for the AUTD3 phased-array kit.
Documentation
use crate::error::Error;
use crate::geometry::Device;
use crate::mirror::FirmwareState;
use crate::protocol::{Cmd, PAYLOAD_BYTES};

use super::{Distribution, Operation};

#[derive(Clone, Copy, Debug, Default)]
pub struct Clear;

impl Operation for Clear {
    fn distribution(&self) -> Distribution {
        Distribution::Broadcast
    }

    fn encode(&self, _device: &Device, _out: &mut [u8; PAYLOAD_BYTES]) -> Result<Cmd, Error> {
        Ok(Cmd::Clear)
    }

    fn reflect(&self, _device: usize, state: &mut FirmwareState) -> Result<(), Error> {
        *state = FirmwareState::boot_default();
        Ok(())
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::test_utils::test_device;

    #[test]
    fn clear_is_no_payload_broadcast() {
        let mut out = [0xAAu8; PAYLOAD_BYTES];
        let cmd = Clear.encode(&test_device(0), &mut out).unwrap();
        assert_eq!(cmd, Cmd::Clear);
        assert_eq!(Clear.distribution(), Distribution::Broadcast);
    }

    #[test]
    fn clear_resets_mirror_to_boot_default() {
        let mut state = FirmwareState::boot_default();
        state.silencer.apply_completion(10, 40, true);
        state.silencer.note_mod_div(0, 5);
        Clear.reflect(0, &mut state).unwrap();
        assert_eq!(state, FirmwareState::boot_default());
    }
}