use super::super::dbc_compat::SignalInfo;
#[allow(unused_imports)]
use super::*;
use alloc::vec::Vec;
#[derive(Debug)]
pub(crate) struct MessageBuffer {
pub(crate) signals: Vec<SignalInfo>,
pub(crate) signal_indices: Vec<usize>,
pub(crate) timestamps: Vec<u64>,
pub(crate) raw_values: Vec<Vec<i64>>,
pub(crate) physical_values: Vec<Vec<f64>>,
}
impl MessageBuffer {
pub(crate) fn new(signals: Vec<SignalInfo>, signal_indices: Vec<usize>) -> Self {
let num_signals = signals.len();
Self {
signals,
signal_indices,
timestamps: Vec::new(),
raw_values: (0..num_signals).map(|_| Vec::new()).collect(),
physical_values: (0..num_signals).map(|_| Vec::new()).collect(),
}
}
pub(crate) fn push_physical_indexed(&mut self, timestamp_us: u64, decode_buf: &[f64]) {
self.timestamps.push(timestamp_us);
for (out, &idx) in self
.physical_values
.iter_mut()
.zip(self.signal_indices.iter())
{
out.push(decode_buf.get(idx).copied().unwrap_or(0.0));
}
}
pub(crate) fn push_raw_indexed(&mut self, timestamp_us: u64, decode_buf: &[i64]) {
self.timestamps.push(timestamp_us);
for (out, &idx) in self.raw_values.iter_mut().zip(self.signal_indices.iter()) {
out.push(decode_buf.get(idx).copied().unwrap_or(0));
}
}
pub(crate) fn clear(&mut self) {
self.timestamps.clear();
for v in &mut self.raw_values {
v.clear();
}
for v in &mut self.physical_values {
v.clear();
}
}
pub(crate) fn frame_count(&self) -> usize {
self.timestamps.len()
}
}