autd3capi_def/dynamic_datagram/
mod_delay.rs

1/*
2 * File: mod_delay.rs
3 * Project: dynamic_datagram
4 * Created Date: 06/12/2023
5 * Author: Shun Suzuki
6 * -----
7 * Last Modified: 06/12/2023
8 * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp)
9 * -----
10 * Copyright (c) 2023 Shun Suzuki. All rights reserved.
11 *
12 */
13use 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}