autd3capi_driver/
sender.rs

1use 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}