autd3_driver/firmware/v12/
driver.rs1use 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
19pub 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 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}