autd3-rs-core 0.9.0

Core types and link abstraction shared across the AUTD3 phased-array sdk crates.
Documentation
use core::num::NonZeroU16;

use crate::params::REP_INFINITE;

#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum LoopBehavior {
    #[default]
    Infinite,
    Finite(NonZeroU16),
}

impl LoopBehavior {
    pub const ONCE: Self = Self::Finite(NonZeroU16::MIN);

    #[must_use]
    pub const fn rep(self) -> u16 {
        match self {
            LoopBehavior::Infinite => REP_INFINITE,
            LoopBehavior::Finite(n) => n.get() - 1,
        }
    }
}

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

    #[test]
    fn rep_conversion() {
        assert_eq!(LoopBehavior::Infinite.rep(), 0xFFFF);
        assert_eq!(LoopBehavior::ONCE.rep(), 0);
        assert_eq!(LoopBehavior::Finite(NonZeroU16::new(10).unwrap()).rep(), 9);
        assert_eq!(
            LoopBehavior::Finite(NonZeroU16::new(0xFFFF).unwrap()).rep(),
            0xFFFE
        );
    }

    #[test]
    fn default_is_infinite() {
        assert_eq!(LoopBehavior::default(), LoopBehavior::Infinite);
    }
}