autd3_driver/firmware/operation/
mod.rs

1mod handler;
2mod implement;
3
4use crate::geometry::Device;
5
6pub use handler::OperationHandler;
7pub use implement::{BoxedDatagram, BoxedOperation, DOperationGenerator, DynOperationGenerator};
8
9#[doc(hidden)]
10pub trait Operation<'a>: Send {
11    type Error: std::error::Error;
12
13    #[must_use]
14    fn required_size(&self, device: &'a Device) -> usize;
15    fn pack(&mut self, device: &'a Device, tx: &mut [u8]) -> Result<usize, Self::Error>;
16    #[must_use]
17    fn is_done(&self) -> bool;
18}
19
20#[inline(always)]
21pub(crate) fn write_to_tx<T: Sized>(tx: &mut [u8], data: T) {
22    unsafe {
23        std::ptr::copy_nonoverlapping(&raw const data as _, tx.as_mut_ptr(), size_of::<T>());
24    }
25}
26
27#[doc(hidden)]
28pub trait OperationGenerator<'a> {
29    type O1: Operation<'a>;
30    type O2: Operation<'a>;
31
32    #[must_use]
33    fn generate(&mut self, device: &'a Device) -> Option<(Self::O1, Self::O2)>;
34}