autd3_driver/firmware/driver/async/
mod.rs1mod strategy;
2
3use super::{FPGAState, SenderOption};
4use crate::{error::AUTDDriverError, firmware::version::FirmwareVersion};
5
6use autd3_core::{
7 derive::FirmwareLimits,
8 geometry::Geometry,
9 link::{MsgId, RxMessage},
10};
11
12pub use strategy::TimerStrategy;
13
14#[cfg(feature = "async-trait")]
15mod internal {
16 use super::*;
17
18 #[doc(hidden)]
19 #[autd3_core::async_trait]
20 pub trait Sender<'a, L, S, T>: Send {
21 async fn initialize_devices(self) -> Result<(), AUTDDriverError>;
22 async fn firmware_version(self) -> Result<Vec<FirmwareVersion>, AUTDDriverError>;
23 async fn close(self) -> Result<(), AUTDDriverError>;
24 }
25
26 #[doc(hidden)]
27 #[autd3_core::async_trait]
28 pub trait Driver: Send {
29 type Sender<'a, L, S, T>: Sender<'a, L, S, T>
30 where
31 L: autd3_core::link::AsyncLink + 'a,
32 S: autd3_core::sleep::r#async::Sleep,
33 T: TimerStrategy<S>;
34 type FPGAState: FPGAState;
35
36 fn new() -> Self;
37
38 async fn detect_version<'a, L>(
39 &mut self,
40 _msg_id: &'a mut autd3_core::link::MsgId,
41 _link: &'a mut L,
42 _geometry: &'a autd3_core::derive::Geometry,
43 _sent_flags: &'a mut [bool],
44 _rx: &'a mut [autd3_core::link::RxMessage],
45 ) -> Result<(), AUTDDriverError>
46 where
47 L: autd3_core::link::AsyncLink + 'a,
48 {
49 Ok(())
50 }
51
52 #[allow(clippy::too_many_arguments)]
53 fn sender<'a, L, S, T>(
54 &self,
55 msg_id: &'a mut MsgId,
56 link: &'a mut L,
57 geometry: &'a Geometry,
58 sent_flags: &'a mut [bool],
59 rx: &'a mut [RxMessage],
60 option: SenderOption,
61 timer_strategy: T,
62 ) -> Self::Sender<'a, L, S, T>
63 where
64 L: autd3_core::link::AsyncLink + 'a,
65 S: autd3_core::sleep::r#async::Sleep,
66 T: TimerStrategy<S>;
67 fn firmware_limits(&self) -> FirmwareLimits;
68 }
69}
70
71#[cfg(not(feature = "async-trait"))]
72mod internal {
73 use super::*;
74
75 #[doc(hidden)]
76 pub trait Sender<'a, L, S, T>: Send {
77 fn initialize_devices(
78 self,
79 ) -> impl std::future::Future<Output = Result<(), AUTDDriverError>>;
80 fn firmware_version(
81 self,
82 ) -> impl std::future::Future<Output = Result<Vec<FirmwareVersion>, AUTDDriverError>>;
83 fn close(self) -> impl std::future::Future<Output = Result<(), AUTDDriverError>>;
84 }
85
86 #[doc(hidden)]
87 pub trait Driver {
88 type Sender<'a, L, S, T>: Sender<'a, L, S, T>
89 where
90 L: autd3_core::link::AsyncLink + 'a,
91 S: autd3_core::sleep::r#async::Sleep,
92 T: TimerStrategy<S>;
93 type FPGAState: FPGAState;
94
95 fn new() -> Self;
96
97 fn detect_version<'a, L>(
98 &mut self,
99 _msg_id: &'a mut autd3_core::link::MsgId,
100 _link: &'a mut L,
101 _geometry: &'a autd3_core::derive::Geometry,
102 _sent_flags: &'a mut [bool],
103 _rx: &'a mut [autd3_core::link::RxMessage],
104 ) -> impl std::future::Future<Output = Result<(), AUTDDriverError>>
105 where
106 L: autd3_core::link::AsyncLink + 'a,
107 {
108 async { Ok(()) }
109 }
110
111 #[allow(clippy::too_many_arguments)]
112 fn sender<'a, L, S, T>(
113 &self,
114 msg_id: &'a mut MsgId,
115 link: &'a mut L,
116 geometry: &'a Geometry,
117 sent_flags: &'a mut [bool],
118 rx: &'a mut [RxMessage],
119 option: SenderOption,
120 timer_strategy: T,
121 ) -> Self::Sender<'a, L, S, T>
122 where
123 L: autd3_core::link::AsyncLink + 'a,
124 S: autd3_core::sleep::r#async::Sleep,
125 T: TimerStrategy<S>;
126 fn firmware_limits(&self) -> FirmwareLimits;
127 }
128}
129
130pub use internal::*;