use std::sync::Arc;
use rill_core::math::Transcendental;
use rill_core::queues::spsc::SpscQueue;
use rill_core::queues::TelemetryBlock;
pub struct TelemetryCollector<T: Transcendental, const BUF_SIZE: usize, const QUEUE_CAP: usize> {
queue: Arc<SpscQueue<TelemetryBlock<T, BUF_SIZE>, QUEUE_CAP>>,
callback: Box<dyn FnMut(TelemetryBlock<T, BUF_SIZE>)>,
}
impl<T: Transcendental, const BUF_SIZE: usize, const QUEUE_CAP: usize>
TelemetryCollector<T, BUF_SIZE, QUEUE_CAP>
{
pub fn new(
queue: Arc<SpscQueue<TelemetryBlock<T, BUF_SIZE>, QUEUE_CAP>>,
callback: impl FnMut(TelemetryBlock<T, BUF_SIZE>) + 'static,
) -> Self {
Self {
queue,
callback: Box::new(callback),
}
}
pub fn poll(&mut self) -> usize {
let mut count = 0;
while let Some(frame) = self.queue.pop() {
(self.callback)(frame);
count += 1;
}
count
}
pub fn poll_n(&mut self, max: usize) -> usize {
let mut count = 0;
while count < max {
match self.queue.pop() {
Some(frame) => {
(self.callback)(frame);
count += 1;
}
None => break,
}
}
count
}
pub fn available(&self) -> usize {
self.queue.len()
}
pub fn into_queue(self) -> Arc<SpscQueue<TelemetryBlock<T, BUF_SIZE>, QUEUE_CAP>> {
self.queue
}
}