use crate::hardware::timers;
use stm32h7xx_hal as hal;
pub struct Timestamper {
timer: timers::PounderTimestampTimer,
capture_channel: timers::tim8::Channel1InputCapture,
}
impl Timestamper {
pub fn new(
mut timestamp_timer: timers::PounderTimestampTimer,
capture_channel: timers::tim8::Channel1,
sampling_timer: &mut timers::SamplingTimer,
_clock_input: hal::gpio::gpioa::PA0<hal::gpio::Alternate<3>>,
batch_size: usize,
) -> Self {
sampling_timer.generate_trigger(timers::TriggerGenerator::ComparePulse);
timestamp_timer.set_trigger_source(timers::TriggerSource::Trigger1);
let mut input_capture = capture_channel
.into_input_capture(timers::tim8::CaptureSource1::Trc);
let prescaler = match batch_size {
1 => timers::Prescaler::Div1,
2 => timers::Prescaler::Div2,
4 => timers::Prescaler::Div4,
8 => timers::Prescaler::Div8,
_ => panic!("Batch size does not support DDS timestamping"),
};
input_capture.configure_prescaler(prescaler);
Self {
timer: timestamp_timer,
capture_channel: input_capture,
}
}
pub fn start(&mut self) {
self.capture_channel.enable();
}
pub fn update_period(&mut self, period: u16) {
self.timer.set_period_ticks(period);
}
pub fn latest_timestamp(&mut self) -> Result<Option<u16>, Option<u16>> {
self.capture_channel.latest_capture()
}
}