autd3_driver/firmware/driver/async/
mod.rs

1mod 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::*;