autd3_driver/datagram/
with_segment.rs

1use autd3_core::datagram::{Datagram, DatagramOption, DatagramS, Segment, TransitionMode};
2
3use derive_more::Deref;
4
5/// A wrapper of [`DatagramS`] to specify the segment to write the data.
6#[derive(Deref, Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub struct WithSegment<D: DatagramS> {
8    #[deref]
9    /// The original [`DatagramS`]
10    pub inner: D,
11    /// The segment to write the data
12    pub segment: Segment,
13    /// The behavior when switching segments
14    pub transition_mode: Option<TransitionMode>,
15}
16
17impl<D: DatagramS> WithSegment<D> {
18    /// Create a new [`WithSegment`].
19    #[must_use]
20    pub const fn new(inner: D, segment: Segment, transition_mode: Option<TransitionMode>) -> Self {
21        Self {
22            inner,
23            segment,
24            transition_mode,
25        }
26    }
27}
28
29impl<D: DatagramS> Datagram for WithSegment<D> {
30    type G = D::G;
31    type Error = D::Error;
32
33    fn operation_generator(
34        self,
35        geometry: &autd3_core::derive::Geometry,
36        parallel: bool,
37    ) -> Result<Self::G, Self::Error> {
38        <D as DatagramS>::operation_generator_with_segment(
39            self.inner,
40            geometry,
41            parallel,
42            self.segment,
43            self.transition_mode,
44        )
45    }
46
47    fn option(&self) -> DatagramOption {
48        <D as DatagramS>::option(&self.inner)
49    }
50}