From dfb33a3da2bd5b273f0c685fb835129c6de88ebc Mon Sep 17 00:00:00 2001 From: Alex van de Sandt Date: Sun, 28 Dec 2025 13:50:58 -0600 Subject: [PATCH] Decode remaining bitfields --- src/telemetry/bitfields.rs | 111 +++++++++++++++++++++++++++++++++---- src/telemetry/sample.rs | 2 +- 2 files changed, 102 insertions(+), 11 deletions(-) diff --git a/src/telemetry/bitfields.rs b/src/telemetry/bitfields.rs index 99def50..94d5694 100644 --- a/src/telemetry/bitfields.rs +++ b/src/telemetry/bitfields.rs @@ -1,13 +1,21 @@ #[derive(Clone, Copy, Debug)] pub enum Bitfield { EngineWarnings(EngineWarnings), + Flags(Flags), + CameraState(CameraState), + PitServiceFlags(PitServiceFlags), + PaceFlags(PaceFlags), Unknown(u32), } impl Bitfield { - pub(crate) fn parse(val: u32, unit: &str) -> Self { + pub(crate) fn parse_unit(val: u32, unit: &str) -> Self { match unit { "irsdk_EngineWarnings" => Self::engine_warnings(val), + "irsdk_Flags" => Self::flags(val), + "irsdk_CameraState" => Self::camera_state(val), + "irsdk_PitSvFlags" => Self::pit_service_flags(val), + "irsdk_PaceFlags" => Self::pace_flags(val), _ => Self::Unknown(val), } } @@ -15,6 +23,22 @@ impl Bitfield { fn engine_warnings(raw: u32) -> Self { Self::EngineWarnings(EngineWarnings(raw)) } + + fn flags(raw: u32) -> Self { + Self::Flags(Flags(raw)) + } + + fn camera_state(raw: u32) -> Self { + Self::CameraState(CameraState(raw)) + } + + fn pit_service_flags(raw: u32) -> Self { + Self::PitServiceFlags(PitServiceFlags(raw)) + } + + fn pace_flags(raw: u32) -> Self { + Self::PaceFlags(PaceFlags(raw)) + } } /// Defines a tuple struct holding a `u32`, where each bit in the value may represent a different @@ -47,14 +71,81 @@ macro_rules! bitfield { bitfield! { EngineWarnings { - 1 => water_temp, - 2 => fuel_pressure, - 3 => oil_pressure, - 4 => engine_stalled, - 5 => pit_speed_limiter, - 6 => rev_limiter, - 7 => oil_temp, - 8 => mandatory_repairs, - 9 => optional_repairs, + 0 => water_temp, + 1 => fuel_pressure, + 2 => oil_pressure, + 3 => engine_stalled, + 4 => pit_speed_limiter, + 5 => rev_limiter, + 6 => oil_temp, + 7 => mandatory_repairs, + 8 => optional_repairs, + } +} + +bitfield! { + Flags { + 0 => checkered, + 1 => white, + 2 => green, + 3 => yellow, + 4 => red, + 5 => blue, + 6 => debris, + 7 => crossed, + 8 => yellow_waving, + 9 => one_lap_to_green, + 10 => green_held, + 11 => ten_to_go, + 12 => five_to_go, + 13 => random_waving, + 14 => caution, + 15 => caution_waving, + + 16 => black, + 17 => disqualify, + 18 => servicible, + 19 => furled, + 20 => repair, + 21 => disqualified, + + 28 => start_lights_hidden, + 29 => start_lights_ready, + 30 => start_lights_set, + 31 => start_lights_go, + } +} + +bitfield! { + CameraState { + 0 => is_session_screen, + 1 => is_scenic_active, + 3 => camera_tool_active, + 4 => ui_hidden, + 5 => use_auto_shot_selection, + 6 => use_temporary_edits, + 7 => use_key_acceleration, + 8 => use_key_10x_acceleration, + 9 => use_mouse_aim_mode, + } +} + +bitfield! { + PitServiceFlags { + 0 => lf_tire_change, + 1 => rf_tire_change, + 2 => lr_tire_change, + 3 => rr_tire_change, + 4 => fill_fuel, + 5 => take_winshield_tearoff, + 6 => fast_repair, + } +} + +bitfield! { + PaceFlags { + 0 => end_of_line, + 1 => free_pass, + 2 => waved_around, } } diff --git a/src/telemetry/sample.rs b/src/telemetry/sample.rs index 0f5d8b5..f20ebac 100644 --- a/src/telemetry/sample.rs +++ b/src/telemetry/sample.rs @@ -32,7 +32,7 @@ impl<'data> Sample<'data> { VarType::Bool => Value::Bool(slice[0] != 0), VarType::Int => Value::Int(align_cast(slice)), VarType::Bitfield => { - let b = Bitfield::parse(align_cast(slice), var.unit.as_str()); + let b = Bitfield::parse_unit(align_cast(slice), var.unit.as_str()); Value::Bitfield(b) } VarType::Float => Value::Float(align_cast(slice)), -- 2.51.2