use crate::{defined::float, error::AUTDInternalError, fpga::FPGA_SUB_CLK_FREQ};
pub trait ModulationProperty {
fn sampling_frequency(&self) -> float {
FPGA_SUB_CLK_FREQ as float / self.sampling_frequency_division() as float
}
fn sampling_frequency_division(&self) -> u32;
fn sampling_period(&self) -> std::time::Duration {
std::time::Duration::from_nanos((1000000000. / self.sampling_frequency()) as u64)
}
}
#[allow(clippy::len_without_is_empty)]
pub trait Modulation: ModulationProperty {
fn calc(&self) -> Result<Vec<float>, AUTDInternalError>;
fn len(&self) -> Result<usize, AUTDInternalError> {
self.calc().map(|v| v.len())
}
}
impl ModulationProperty for Box<dyn Modulation> {
fn sampling_frequency(&self) -> float {
self.as_ref().sampling_frequency()
}
fn sampling_frequency_division(&self) -> u32 {
self.as_ref().sampling_frequency_division()
}
fn sampling_period(&self) -> std::time::Duration {
self.as_ref().sampling_period()
}
}
impl Modulation for Box<dyn Modulation> {
fn calc(&self) -> Result<Vec<float>, AUTDInternalError> {
self.as_ref().calc()
}
fn len(&self) -> Result<usize, AUTDInternalError> {
self.as_ref().len()
}
}