autd3capi_def/dynamic_datagram/
mod_delay.rs1use std::{collections::HashMap, time::Duration};
14
15use super::DynamicDatagram;
16use autd3::prelude::*;
17use autd3_driver::{
18 error::AUTDInternalError,
19 operation::{ConfigureModDelayOp, Operation},
20};
21
22type Op = ConfigureModDelayOp<Box<dyn Fn(&Device, &Transducer) -> u16>>;
23
24pub struct DynamicConfigureModDelay {
25 map: HashMap<(usize, usize), u16>,
26}
27
28impl DynamicConfigureModDelay {
29 pub fn new(map: HashMap<(usize, usize), u16>) -> Self {
30 Self { map }
31 }
32}
33
34pub struct DynamicConfigureModDelayOp {
35 op: Op,
36}
37
38impl Operation for DynamicConfigureModDelayOp {
39 fn pack(&mut self, device: &Device, tx: &mut [u8]) -> Result<usize, AUTDInternalError> {
40 self.op.pack(device, tx)
41 }
42
43 fn required_size(&self, device: &Device) -> usize {
44 self.op.required_size(device)
45 }
46
47 fn init(&mut self, geometry: &Geometry) -> Result<(), AUTDInternalError> {
48 self.op.init(geometry)
49 }
50
51 fn remains(&self, device: &Device) -> usize {
52 self.op.remains(device)
53 }
54
55 fn commit(&mut self, device: &Device) {
56 self.op.commit(device)
57 }
58}
59
60impl DynamicDatagram for DynamicConfigureModDelay {
61 fn operation(&mut self) -> Result<(Box<dyn Operation>, Box<dyn Operation>), AUTDInternalError> {
62 let map = self.map.clone();
63 Ok((
64 Box::new(DynamicConfigureModDelayOp {
65 op: ConfigureModDelayOp::new(Box::new(move |device, transducer| {
66 map.get(&(device.idx(), transducer.idx()))
67 .cloned()
68 .unwrap_or(0)
69 })),
70 }),
71 Box::<autd3_driver::operation::NullOp>::default(),
72 ))
73 }
74
75 fn timeout(&self) -> Option<Duration> {
76 None
77 }
78}