autd3-rs 0.9.0

Core async client library for the AUTD3 phased-array kit.
Documentation
use autd3_rs_core::value::{DcSysTime, GpioIn};

use super::params::{
    TRANSITION_MODE_EXT, TRANSITION_MODE_GPIO, TRANSITION_MODE_IMMEDIATE, TRANSITION_MODE_NONE,
    TRANSITION_MODE_SYNC_IDX, TRANSITION_MODE_SYS_TIME,
};

#[repr(u8)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum Segment {
    #[default]
    S0 = 0,
    S1 = 1,
}

impl Segment {
    #[must_use]
    pub const fn as_u8(self) -> u8 {
        self as u8
    }
}

#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub enum TransitionMode {
    SyncIdx,
    SysTime(DcSysTime),
    Gpio(GpioIn),
    Ext,
    #[default]
    Immediate,
    Later,
}

impl TransitionMode {
    #[must_use]
    pub const fn as_u8(self) -> u8 {
        match self {
            TransitionMode::SyncIdx => TRANSITION_MODE_SYNC_IDX,
            TransitionMode::SysTime(_) => TRANSITION_MODE_SYS_TIME,
            TransitionMode::Gpio(_) => TRANSITION_MODE_GPIO,
            TransitionMode::Ext => TRANSITION_MODE_EXT,
            TransitionMode::Immediate => TRANSITION_MODE_IMMEDIATE,
            TransitionMode::Later => TRANSITION_MODE_NONE,
        }
    }

    #[must_use]
    pub const fn value(self) -> u64 {
        match self {
            TransitionMode::SysTime(t) => t.sys_time(),
            TransitionMode::Gpio(g) => g.as_u8() as u64,
            _ => 0,
        }
    }

    #[must_use]
    pub const fn is_later(self) -> bool {
        matches!(self, TransitionMode::Later)
    }
}

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

    #[test]
    fn transition_mode_wire_bytes_match_legacy() {
        assert_eq!(TransitionMode::SyncIdx.as_u8(), 0x00);
        assert_eq!(TransitionMode::SysTime(DcSysTime::ZERO).as_u8(), 0x01);
        assert_eq!(TransitionMode::Gpio(GpioIn::I0).as_u8(), 0x02);
        assert_eq!(TransitionMode::Ext.as_u8(), 0xF0);
        assert_eq!(TransitionMode::Later.as_u8(), 0xFE);
        assert_eq!(TransitionMode::Immediate.as_u8(), 0xFF);
    }

    #[test]
    fn transition_mode_values() {
        assert_eq!(TransitionMode::SyncIdx.value(), 0);
        assert_eq!(
            TransitionMode::SysTime(DcSysTime::from_nanos(0x0123_4567_89AB_CDEF)).value(),
            0x0123_4567_89AB_CDEF
        );
        assert_eq!(TransitionMode::Gpio(GpioIn::I3).value(), 3);
        assert_eq!(TransitionMode::Ext.value(), 0);
        assert_eq!(TransitionMode::Immediate.value(), 0);
        assert_eq!(TransitionMode::Later.value(), 0);
    }

    #[test]
    fn only_later_is_later() {
        assert!(TransitionMode::Later.is_later());
        assert!(!TransitionMode::Immediate.is_later());
    }

    #[test]
    fn segment_wire_bytes() {
        assert_eq!(Segment::S0.as_u8(), 0);
        assert_eq!(Segment::S1.as_u8(), 1);
        assert_eq!(Segment::default(), Segment::S0);
    }
}