autd3capi_driver/
sender.rs1use autd3::{
2 controller::TimerStrategy,
3 core::sleep::{Sleep, SpinSleeper, SpinStrategy, SpinWaitSleeper, StdSleeper},
4 driver::firmware::driver::{FixedDelay, FixedSchedule},
5};
6
7#[repr(u8)]
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum SleeperTag {
10 Std = 0,
11 Spin = 1,
12 SpinWait = 4,
13}
14
15#[repr(u8)]
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
17pub enum SpinStrategyTag {
18 YieldThread = 0,
19 SpinLoopHint = 1,
20}
21
22impl From<SpinStrategyTag> for SpinStrategy {
23 fn from(value: SpinStrategyTag) -> Self {
24 match value {
25 SpinStrategyTag::YieldThread => SpinStrategy::YieldThread,
26 SpinStrategyTag::SpinLoopHint => SpinStrategy::SpinLoopHint,
27 }
28 }
29}
30impl From<SpinStrategy> for SpinStrategyTag {
31 fn from(value: SpinStrategy) -> Self {
32 match value {
33 SpinStrategy::YieldThread => SpinStrategyTag::YieldThread,
34 SpinStrategy::SpinLoopHint => SpinStrategyTag::SpinLoopHint,
35 _ => unimplemented!(),
36 }
37 }
38}
39
40#[repr(C)]
41#[derive(Debug, Clone, Copy)]
42pub struct SleeperWrap {
43 pub tag: SleeperTag,
44 pub value: u32,
45 pub spin_strategy: SpinStrategyTag,
46}
47
48impl From<SleeperWrap> for Box<dyn Sleep> {
49 fn from(value: SleeperWrap) -> Self {
50 match value.tag {
51 SleeperTag::Std => Box::new(StdSleeper),
52 SleeperTag::Spin => Box::new(
53 SpinSleeper::new(value.value).with_spin_strategy(value.spin_strategy.into()),
54 ),
55 SleeperTag::SpinWait => Box::new(SpinWaitSleeper),
56 }
57 }
58}
59
60#[repr(u8)]
61#[derive(Debug, Clone, Copy, PartialEq, Eq)]
62pub enum TimerStrategyTag {
63 FixedSchedule = 0,
64 FixedDelay = 1,
65}
66
67#[repr(C)]
68#[derive(Debug, Clone, Copy)]
69pub struct TimerStrategyWrap {
70 pub tag: TimerStrategyTag,
71 pub sleep: SleeperWrap,
72}
73
74impl From<TimerStrategyWrap> for Box<dyn TimerStrategy<Box<dyn Sleep>>> {
75 fn from(value: TimerStrategyWrap) -> Self {
76 let sleep = Box::<dyn Sleep>::from(value.sleep);
77 match value.tag {
78 TimerStrategyTag::FixedSchedule => Box::new(FixedSchedule(sleep)),
79 TimerStrategyTag::FixedDelay => Box::new(FixedDelay(sleep)),
80 }
81 }
82}