autd3_driver/firmware/operation/
mod.rs1mod 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}