autd3_driver/firmware/v10/async/
mod.rs

1pub(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}