autd3_driver/firmware/v12/
driver.rs

1use autd3_core::{environment::Environment, link::Link, sleep::Sleep};
2
3use crate::{
4    datagram::{
5        Clear, FixedCompletionSteps, Silencer,
6        implements::{Null, Static},
7    },
8    firmware::{
9        driver::{Driver, Sender, TimerStrategy},
10        version::FirmwareVersion,
11    },
12};
13
14use super::fpga::{
15    FOCI_STM_BUF_SIZE_MAX, FOCI_STM_FIXED_NUM_UNIT, FOCI_STM_FIXED_NUM_WIDTH,
16    FOCI_STM_FOCI_NUM_MAX, GAIN_STM_BUF_SIZE_MAX, MOD_BUF_SIZE_MAX,
17};
18
19/// A driver for firmware version 12.
20pub struct V12;
21
22impl<'a, L: Link, S: Sleep, T: TimerStrategy<S>> Sender<'a, L, S, T>
23    for super::transmission::Sender<'a, L, S, T>
24{
25    fn initialize_devices(mut self) -> Result<(), crate::error::AUTDDriverError> {
26        // If the device is used continuously without powering off, the first data may be ignored because the first msg_id equals to the remaining msg_id in the device.
27        // Therefore, send a meaningless data.
28        self.send(crate::datagram::Nop)?;
29
30        self.send((
31            crate::datagram::Clear::new(),
32            crate::datagram::Synchronize::new(),
33        ))
34    }
35
36    fn firmware_version(
37        mut self,
38    ) -> Result<Vec<crate::firmware::version::FirmwareVersion>, crate::error::AUTDDriverError> {
39        use crate::{
40            datagram::FirmwareVersionType::*,
41            firmware::version::{CPUVersion, FPGAVersion, Major, Minor},
42        };
43
44        let cpu_major = self.fetch_firminfo(CPUMajor)?;
45        let cpu_minor = self.fetch_firminfo(CPUMinor)?;
46        let fpga_major = self.fetch_firminfo(FPGAMajor)?;
47        let fpga_minor = self.fetch_firminfo(FPGAMinor)?;
48        let fpga_functions = self.fetch_firminfo(FPGAFunctions)?;
49        self.fetch_firminfo(Clear)?;
50
51        Ok(self
52            .geometry
53            .iter()
54            .map(|dev| FirmwareVersion {
55                idx: dev.idx(),
56                cpu: CPUVersion {
57                    major: Major(cpu_major[dev.idx()]),
58                    minor: Minor(cpu_minor[dev.idx()]),
59                },
60                fpga: FPGAVersion {
61                    major: Major(fpga_major[dev.idx()]),
62                    minor: Minor(fpga_minor[dev.idx()]),
63                    function_bits: fpga_functions[dev.idx()],
64                },
65            })
66            .collect())
67    }
68
69    fn close(mut self) -> Result<(), crate::error::AUTDDriverError> {
70        [
71            self.send(Silencer {
72                config: FixedCompletionSteps {
73                    strict: false,
74                    ..Default::default()
75                },
76            }),
77            self.send((Static::default(), Null)),
78            self.send(Clear {}),
79            Ok(self.link.close()?),
80        ]
81        .into_iter()
82        .try_fold((), |_, x| x)
83    }
84}
85
86impl Driver for V12 {
87    type Sender<'a, L, S, T>
88        = super::transmission::Sender<'a, L, S, T>
89    where
90        L: autd3_core::link::Link + 'a,
91        S: autd3_core::sleep::Sleep,
92        T: TimerStrategy<S>;
93    type FPGAState = super::fpga::FPGAState;
94
95    fn new() -> Self {
96        Self
97    }
98
99    fn firmware_limits(&self) -> autd3_core::derive::FirmwareLimits {
100        autd3_core::derive::FirmwareLimits {
101            mod_buf_size_max: MOD_BUF_SIZE_MAX as _,
102            gain_stm_buf_size_max: GAIN_STM_BUF_SIZE_MAX as _,
103            foci_stm_buf_size_max: FOCI_STM_BUF_SIZE_MAX as _,
104            num_foci_max: FOCI_STM_FOCI_NUM_MAX as _,
105            foci_stm_fixed_num_unit: FOCI_STM_FIXED_NUM_UNIT,
106            foci_stm_fixed_num_width: FOCI_STM_FIXED_NUM_WIDTH as _,
107        }
108    }
109
110    fn sender<'a, L, S, T>(
111        &self,
112        msg_id: &'a mut autd3_core::link::MsgId,
113        link: &'a mut L,
114        geometry: &'a autd3_core::derive::Geometry,
115        sent_flags: &'a mut [bool],
116        rx: &'a mut [autd3_core::link::RxMessage],
117        env: &'a Environment,
118        option: crate::firmware::driver::SenderOption,
119        timer_strategy: T,
120    ) -> Self::Sender<'a, L, S, T>
121    where
122        L: autd3_core::link::Link + 'a,
123        S: autd3_core::sleep::Sleep,
124        T: TimerStrategy<S>,
125    {
126        Self::Sender {
127            msg_id,
128            link,
129            geometry,
130            sent_flags,
131            rx,
132            env,
133            option,
134            timer_strategy,
135            _phantom: std::marker::PhantomData,
136        }
137    }
138}