kerb 0.1.0

Real-time telemetry from racing simulators — iRacing, Assetto Corsa, AC Evo, Le Mans Ultimate
/// A typed telemetry reading — scalars and fixed-length arrays.
#[derive(Debug, Clone, PartialEq)]
pub enum TelemetryValue {
    Char(u8),
    String(String),
    Text(String),
    Bool(bool),
    Int(i32),
    BitField(u32),
    Float(f32),
    Double(f64),
    BoolArray(Vec<bool>),
    IntArray(Vec<i32>),
    FloatArray(Vec<f32>),
    DoubleArray(Vec<f64>),
}

impl From<f32> for TelemetryValue {
    fn from(v: f32) -> Self {
        TelemetryValue::Float(v)
    }
}
impl From<f64> for TelemetryValue {
    fn from(v: f64) -> Self {
        TelemetryValue::Double(v)
    }
}
impl From<i32> for TelemetryValue {
    fn from(v: i32) -> Self {
        TelemetryValue::Int(v)
    }
}
impl From<u32> for TelemetryValue {
    fn from(v: u32) -> Self {
        TelemetryValue::BitField(v)
    }
}
impl From<u8> for TelemetryValue {
    fn from(v: u8) -> Self {
        TelemetryValue::Int(v as i32)
    }
}
impl From<i8> for TelemetryValue {
    fn from(v: i8) -> Self {
        TelemetryValue::Int(v as i32)
    }
}
impl From<u16> for TelemetryValue {
    fn from(v: u16) -> Self {
        TelemetryValue::Int(v as i32)
    }
}
impl From<i16> for TelemetryValue {
    fn from(v: i16) -> Self {
        TelemetryValue::Int(v as i32)
    }
}
impl From<i64> for TelemetryValue {
    fn from(v: i64) -> Self {
        TelemetryValue::Double(v as f64)
    }
}
impl From<u64> for TelemetryValue {
    fn from(v: u64) -> Self {
        TelemetryValue::Double(v as f64)
    }
}
impl From<bool> for TelemetryValue {
    fn from(v: bool) -> Self {
        TelemetryValue::Bool(v)
    }
}

impl std::fmt::Display for TelemetryValue {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            TelemetryValue::Char(c) => write!(f, "'{}'", *c as char),
            TelemetryValue::String(s) | TelemetryValue::Text(s) => write!(f, "{}", s),
            TelemetryValue::Bool(b) => write!(f, "{}", b),
            TelemetryValue::Int(i) => write!(f, "{}", i),
            TelemetryValue::BitField(u) => write!(f, "0x{:08X}", u),
            TelemetryValue::Float(v) => write!(f, "{:.4}", v),
            TelemetryValue::Double(v) => write!(f, "{:.6}", v),
            TelemetryValue::BoolArray(a) => write!(f, "{:?}", a),
            TelemetryValue::IntArray(a) => write!(f, "{:?}", a),
            TelemetryValue::FloatArray(a) => write!(f, "{:?}", a),
            TelemetryValue::DoubleArray(a) => write!(f, "{:?}", a),
        }
    }
}

/// Metadata for a single telemetry variable (name, type, unit, description).
#[derive(Debug, Clone)]
pub struct VarMeta {
    pub name: String,
    pub type_name: &'static str,
    pub unit: String,
    pub desc: String,
    pub count: u32,
}