autd3_driver/firmware/v10/async/
mod.rs1pub(crate) mod sender;
2
3use super::V10;
4use crate::{
5 datagram::{
6 Clear, FixedCompletionSteps, Silencer,
7 implements::{Null, Static},
8 },
9 firmware::{
10 driver::r#async::{Driver, Sender, TimerStrategy},
11 version::FirmwareVersion,
12 },
13};
14use autd3_core::{environment::Environment, link::AsyncLink, sleep::r#async::Sleep};
15
16#[cfg_attr(feature = "async-trait", autd3_core::async_trait)]
17impl<'a, L: AsyncLink, S: Sleep, T: TimerStrategy<S>> Sender<'a, L, S, T>
18 for sender::Sender<'a, L, S, T>
19{
20 async fn initialize_devices(mut self) -> Result<(), crate::error::AUTDDriverError> {
21 self.send(crate::datagram::ReadsFPGAState::new(|_| false))
22 .await?;
23
24 self.send((
25 crate::datagram::Clear::new(),
26 crate::datagram::Synchronize::new(),
27 ))
28 .await
29 }
30
31 async fn firmware_version(
32 mut self,
33 ) -> Result<Vec<crate::firmware::version::FirmwareVersion>, crate::error::AUTDDriverError> {
34 use crate::{
35 datagram::FirmwareVersionType::*,
36 firmware::version::{CPUVersion, FPGAVersion, Major, Minor},
37 };
38
39 let cpu_major = self.fetch_firminfo(CPUMajor).await?;
40 let cpu_minor = self.fetch_firminfo(CPUMinor).await?;
41 let fpga_major = self.fetch_firminfo(FPGAMajor).await?;
42 let fpga_minor = self.fetch_firminfo(FPGAMinor).await?;
43 let fpga_functions = self.fetch_firminfo(FPGAFunctions).await?;
44 self.fetch_firminfo(Clear).await?;
45
46 Ok(self
47 .geometry
48 .iter()
49 .map(|dev| FirmwareVersion {
50 idx: dev.idx(),
51 cpu: CPUVersion {
52 major: Major(cpu_major[dev.idx()]),
53 minor: Minor(cpu_minor[dev.idx()]),
54 },
55 fpga: FPGAVersion {
56 major: Major(fpga_major[dev.idx()]),
57 minor: Minor(fpga_minor[dev.idx()]),
58 function_bits: fpga_functions[dev.idx()],
59 },
60 })
61 .collect())
62 }
63
64 async fn close(mut self) -> Result<(), crate::error::AUTDDriverError> {
65 [
66 self.send(Silencer {
67 config: FixedCompletionSteps {
68 strict: false,
69 ..Default::default()
70 },
71 })
72 .await,
73 self.send((Static::default(), Null)).await,
74 self.send(Clear {}).await,
75 Ok(self.link.close().await?),
76 ]
77 .into_iter()
78 .try_fold((), |_, x| x)
79 }
80}
81
82#[cfg_attr(feature = "async-trait", autd3_core::async_trait)]
83impl Driver for V10 {
84 type Sender<'a, L, S, T>
85 = sender::Sender<'a, L, S, T>
86 where
87 L: autd3_core::link::AsyncLink + 'a,
88 S: autd3_core::sleep::r#async::Sleep,
89 T: TimerStrategy<S>;
90 type FPGAState = super::fpga::FPGAState;
91
92 fn new() -> Self {
93 Self
94 }
95
96 fn firmware_limits(&self) -> autd3_core::derive::FirmwareLimits {
97 <Self as super::super::driver::Driver>::firmware_limits(self)
98 }
99
100 fn sender<'a, L, S, T>(
101 &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 option: crate::firmware::driver::SenderOption,
109 timer_strategy: T,
110 ) -> Self::Sender<'a, L, S, T>
111 where
112 L: autd3_core::link::AsyncLink + 'a,
113 S: autd3_core::sleep::r#async::Sleep,
114 T: TimerStrategy<S>,
115 {
116 Self::Sender {
117 msg_id,
118 link,
119 geometry,
120 env,
121 sent_flags,
122 rx,
123 option,
124 timer_strategy,
125 _phantom: std::marker::PhantomData,
126 }
127 }
128}