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