autd3capi_driver/firmware/fpga/
transition_mode.rs1use autd3::{core::datagram::GPIOIn, driver::ethercat::DcSysTime};
2
3#[repr(u8)]
4#[derive(Debug, Clone, Copy)]
5pub enum TransitionModeTag {
6 SyncIdx = 0,
7 SysTime = 1,
8 Gpio = 2,
9 Ext = 3,
10 Immediate = 4,
11 None = 0xFF,
12}
13
14#[repr(C)]
15pub union TransitionModeValue {
16 pub null: u64,
17 pub sys_time: DcSysTime,
18 pub gpio_in: GPIOIn,
19}
20
21#[repr(C)]
22pub struct TransitionModeWrap {
23 pub tag: TransitionModeTag,
24 pub value: TransitionModeValue,
25}
26
27impl From<TransitionModeWrap> for Option<autd3::core::datagram::TransitionMode> {
28 fn from(mode: TransitionModeWrap) -> Self {
29 match mode.tag {
30 TransitionModeTag::SyncIdx => Some(autd3::core::datagram::TransitionMode::SyncIdx),
31 TransitionModeTag::SysTime => {
32 Some(autd3::core::datagram::TransitionMode::SysTime(unsafe {
33 mode.value.sys_time
34 }))
35 }
36 TransitionModeTag::Gpio => Some(autd3::core::datagram::TransitionMode::GPIO(unsafe {
37 mode.value.gpio_in
38 })),
39 TransitionModeTag::Ext => Some(autd3::core::datagram::TransitionMode::Ext),
40 TransitionModeTag::Immediate => Some(autd3::core::datagram::TransitionMode::Immediate),
41 TransitionModeTag::None => None,
42 }
43 }
44}
45
46impl From<autd3::core::datagram::TransitionMode> for TransitionModeWrap {
47 fn from(transition_mode: autd3::core::datagram::TransitionMode) -> Self {
48 match transition_mode {
49 autd3::core::datagram::TransitionMode::SyncIdx => Self {
50 tag: TransitionModeTag::SyncIdx,
51 value: TransitionModeValue { null: 0 },
52 },
53 autd3::core::datagram::TransitionMode::SysTime(sys_time) => Self {
54 tag: TransitionModeTag::SysTime,
55 value: TransitionModeValue { sys_time },
56 },
57 autd3::core::datagram::TransitionMode::GPIO(gpio) => Self {
58 tag: TransitionModeTag::Gpio,
59 value: TransitionModeValue { gpio_in: gpio },
60 },
61 autd3::core::datagram::TransitionMode::Ext => Self {
62 tag: TransitionModeTag::Ext,
63 value: TransitionModeValue { null: 0 },
64 },
65 autd3::core::datagram::TransitionMode::Immediate => Self {
66 tag: TransitionModeTag::Immediate,
67 value: TransitionModeValue { null: 0 },
68 },
69 }
70 }
71}