use autd3_core::{error::AUTDInternalError, float, modulation::Modulation};
use autd3_traits::Modulation;
#[derive(Modulation)]
pub struct RadiationPressureImpl<M: Modulation> {
m: M,
freq_div: u32,
}
pub trait RadiationPressure<M: Modulation> {
fn with_radiation_pressure(self) -> RadiationPressureImpl<M>;
}
impl<M: Modulation> RadiationPressure<M> for M {
fn with_radiation_pressure(self) -> RadiationPressureImpl<M> {
RadiationPressureImpl {
freq_div: self.sampling_frequency_division(),
m: self,
}
}
}
impl<M: Modulation> Modulation for RadiationPressureImpl<M> {
fn calc(&self) -> Result<Vec<float>, AUTDInternalError> {
Ok(self.m.calc()?.iter().map(|v| v.sqrt()).collect())
}
}