#[allow(unused_imports)]
use super::*;
use crate::DataType;
use crate::blocks::ConversionBlock;
#[derive(Debug, Clone)]
pub struct SignalInfo {
pub name: alloc::string::String,
pub unit: Option<alloc::string::String>,
pub data_type: DataType,
pub bit_count: u32,
pub conversion: Option<ConversionBlock>,
pub min: f64,
pub max: f64,
#[allow(dead_code)] pub factor: f64,
#[allow(dead_code)] pub offset: f64,
pub unsigned: bool,
}
impl SignalInfo {
pub fn from_signal(signal: &dbc_rs::Signal) -> Self {
Self {
name: alloc::string::String::from(signal.name()),
unit: signal.unit().map(alloc::string::String::from),
data_type: signal_to_data_type(signal),
bit_count: signal_to_bit_count(signal),
conversion: signal_to_conversion_with_range(signal),
min: signal.min(),
max: signal.max(),
factor: signal.factor(),
offset: signal.offset(),
unsigned: signal.is_unsigned(),
}
}
#[allow(dead_code)] pub fn needs_conversion(&self) -> bool {
self.conversion.is_some()
}
#[allow(dead_code)] pub fn is_identity(&self) -> bool {
self.factor == 1.0 && self.offset == 0.0
}
#[allow(dead_code)] #[inline]
pub fn raw_to_physical(&self, raw: i64) -> f64 {
self.offset + self.factor * (raw as f64)
}
#[allow(dead_code)] #[inline]
pub fn physical_to_raw(&self, physical: f64) -> i64 {
let raw = (physical - self.offset) / self.factor;
if raw >= 0.0 {
(raw + 0.5) as i64
} else {
(raw - 0.5) as i64
}
}
}