autd3_driver/datagram/
output_mask.rs

1use std::convert::Infallible;
2
3use autd3_core::{
4    datagram::{DatagramOption, DatagramS, DeviceFilter, FirmwareLimits, Segment},
5    environment::Environment,
6    geometry::{Device, Geometry, Transducer},
7};
8
9use derive_more::Debug;
10
11/// [`Datagram`] to mask output.
12///
13/// The transducers set to `false` in [`OutputMask`] will not output ultrasound regardless of the intensity settings by [`Gain`], [`FociSTM`], and [`GainSTM`].
14///
15/// # Example
16///
17/// ```
18/// # use autd3_driver::datagram::OutputMask;
19/// OutputMask::new(|_dev| |_tr| true);
20/// ```
21///
22/// [`Datagram`]: autd3_core::datagram::Datagram
23/// [`Gain`]: autd3_core::gain::Gain
24/// [`FociSTM`]: crate::datagram::FociSTM
25/// [`GainSTM`]: crate::datagram::GainSTM
26#[derive(Debug)]
27pub struct OutputMask<F> {
28    #[debug(ignore)]
29    #[doc(hidden)]
30    pub f: F,
31}
32
33impl<FT: Fn(&Transducer) -> bool, F: Fn(&Device) -> FT> OutputMask<F> {
34    /// Creates a new [`OutputMask`].
35    #[must_use]
36    pub const fn new(f: F) -> Self {
37        Self { f }
38    }
39}
40
41pub struct OutputMaskOperationGenerator<F> {
42    pub(crate) f: F,
43    pub(crate) segment: Segment,
44}
45
46impl<FT: Fn(&Transducer) -> bool + Send + Sync, F: Fn(&Device) -> FT> DatagramS for OutputMask<F> {
47    type G = OutputMaskOperationGenerator<F>;
48    type Error = Infallible;
49
50    fn operation_generator_with_segment(
51        self,
52        _: &Geometry,
53        _: &Environment,
54        _: &DeviceFilter,
55        _: &FirmwareLimits,
56        segment: Segment,
57        _: Option<autd3_core::derive::TransitionMode>,
58    ) -> Result<Self::G, Self::Error> {
59        Ok(OutputMaskOperationGenerator { f: self.f, segment })
60    }
61
62    fn option(&self) -> DatagramOption {
63        DatagramOption::default()
64    }
65}