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