autd3_driver/datagram/
with_segment.rs

1use autd3_core::{
2    datagram::{
3        Datagram, DatagramOption, DatagramS, DeviceFilter, Inspectable, InspectionResult, Segment,
4        TransitionMode,
5    },
6    derive::FirmwareLimits,
7    environment::Environment,
8    geometry::Geometry,
9};
10
11use derive_more::Deref;
12
13/// A wrapper of [`DatagramS`] to specify the segment to write the data.
14#[derive(Deref, Debug, Clone, Copy, PartialEq, Eq, Hash)]
15pub struct WithSegment<D: DatagramS> {
16    #[deref]
17    /// The original [`DatagramS`]
18    pub inner: D,
19    /// The segment to write the data
20    pub segment: Segment,
21    /// The behavior when switching segments
22    pub transition_mode: Option<TransitionMode>,
23}
24
25impl<D: DatagramS> WithSegment<D> {
26    /// Create a new [`WithSegment`].
27    #[must_use]
28    pub const fn new(inner: D, segment: Segment, transition_mode: Option<TransitionMode>) -> Self {
29        Self {
30            inner,
31            segment,
32            transition_mode,
33        }
34    }
35}
36
37impl<D: DatagramS> Datagram for WithSegment<D> {
38    type G = D::G;
39    type Error = D::Error;
40
41    fn operation_generator(
42        self,
43        geometry: &Geometry,
44        env: &Environment,
45        filter: &DeviceFilter,
46        limits: &FirmwareLimits,
47    ) -> Result<Self::G, Self::Error> {
48        <D as DatagramS>::operation_generator_with_segment(
49            self.inner,
50            geometry,
51            env,
52            filter,
53            limits,
54            self.segment,
55            self.transition_mode,
56        )
57    }
58
59    fn option(&self) -> DatagramOption {
60        <D as DatagramS>::option(&self.inner)
61    }
62}
63
64#[doc(hidden)]
65pub trait InspectionResultWithSegment {
66    fn with_segment(self, segment: Segment, transition_mode: Option<TransitionMode>) -> Self;
67}
68
69impl<D> Inspectable for WithSegment<D>
70where
71    D: Inspectable + DatagramS,
72    D::Result: InspectionResultWithSegment,
73    <D as DatagramS>::Error: From<<D as Datagram>::Error>,
74{
75    type Result = D::Result;
76
77    fn inspect(
78        self,
79        geometry: &Geometry,
80        env: &Environment,
81        filter: &DeviceFilter,
82        limits: &FirmwareLimits,
83    ) -> Result<InspectionResult<Self::Result>, Self::Error> {
84        Ok(self
85            .inner
86            .inspect(geometry, env, filter, limits)?
87            .modify(|t| t.with_segment(self.segment, self.transition_mode)))
88    }
89}