autd3_core/firmware/
transition_mode.rs

1use crate::ethercat::DcSysTime;
2
3use super::fpga_gpio::GPIOIn;
4
5const TRANSITION_MODE_SYNC_IDX: u8 = 0x00;
6const TRANSITION_MODE_SYS_TIME: u8 = 0x01;
7const TRANSITION_MODE_GPIO: u8 = 0x02;
8const TRANSITION_MODE_EXT: u8 = 0xF0;
9const TRANSITION_MODE_NONE: u8 = 0xFE;
10const TRANSITION_MODE_IMMEDIATE: u8 = 0xFF;
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
13#[doc(hidden)]
14pub struct TransitionModeParams {
15    pub mode: u8,
16    pub value: u64,
17}
18
19/// Transition mode between segments.
20pub trait TransitionMode: Clone + Copy + Send + Sync {
21    #[doc(hidden)]
22    fn params(self) -> TransitionModeParams;
23}
24
25/// Transition when the sampling index in the destination segment is 0.
26#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
27pub struct SyncIdx;
28impl TransitionMode for SyncIdx {
29    fn params(self) -> TransitionModeParams {
30        TransitionModeParams {
31            mode: TRANSITION_MODE_SYNC_IDX,
32            value: 0,
33        }
34    }
35}
36
37/// Transition when the system time is the specified time.
38#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
39pub struct SysTime(pub DcSysTime);
40impl TransitionMode for SysTime {
41    fn params(self) -> TransitionModeParams {
42        TransitionModeParams {
43            mode: TRANSITION_MODE_SYS_TIME,
44            value: self.0.sys_time(),
45        }
46    }
47}
48
49/// Transition when the specified GPIO pin is high.
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
51pub struct GPIO(pub GPIOIn);
52impl TransitionMode for GPIO {
53    fn params(self) -> TransitionModeParams {
54        TransitionModeParams {
55            mode: TRANSITION_MODE_GPIO,
56            value: self.0 as u64,
57        }
58    }
59}
60
61/// Transition immediately.
62#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
63pub struct Immediate;
64impl TransitionMode for Immediate {
65    fn params(self) -> TransitionModeParams {
66        TransitionModeParams {
67            mode: TRANSITION_MODE_IMMEDIATE,
68            value: 0,
69        }
70    }
71}
72
73/// Transition to the next segment automatically when the data in the current segment is finished.
74#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
75pub struct Ext;
76impl TransitionMode for Ext {
77    fn params(self) -> TransitionModeParams {
78        TransitionModeParams {
79            mode: TRANSITION_MODE_EXT,
80            value: 0,
81        }
82    }
83}
84
85/// Transition later.
86#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
87pub struct Later;
88impl TransitionMode for Later {
89    fn params(self) -> TransitionModeParams {
90        TransitionModeParams {
91            mode: TRANSITION_MODE_NONE,
92            value: 0,
93        }
94    }
95}