can_network:
  frames:
    - id: "0x108"
      name: "EngineStatus"
      dlc: 8
      description: "Powertrain status frame with engine state, RPM, speed and trip distance."
      signals:
        - name: "EngineStateCode"
          byte: 0
          mask: 0xFF
          description: "State byte from examples 0x00 off, 0x01 ignition on, 0x11 running decel, 0x12 running accel."
          value_mapping:
            0: "Engine off"
            1: "Ignition on, engine off"
            17: "Engine running, RPM decreasing"
            18: "Engine running, RPM increasing"
        - name: "EngineRPMRaw"
          byte: 1
          byte_count: 2
          mask: 0xFFFF
          factor: 0.25
          endian: big
          unit: "rpm"
          description: >
            Per xymetox.github.io 0x108: 16-bit tachometer at bytes 1-2, RPM = raw / 4.
            Wire order is big-endian (byte 1 = high, byte 2 = low).
        - name: "VehicleSpeedRaw"
          byte: 4
          byte_count: 1
          mask: 0xFF
          factor: 2
          unit: "km/h"
          description: >
            Vectra LS-CAN packed speed: km/h = (byte4 × 2) + (byte5 >> 7).
            This signal exposes byte4 × 2; UI may add byte5 bit 7 for the full value.
            Do not decode byte 5 as a second speed byte (0x80 trip flags cause bogus readings).
        - name: "TripDistanceSinceResetRaw"
          byte: 6
          byte_count: 2
          mask: 0xFFFF
          unit: "unknown"
          description: "Pattern 0x000000000000YYYY."
      examples:
        - value: "0x0000000000000000"
          description: "Engine off"
        - value: "0x0100000000000000"
          description: "Engine off, ignition on"
        - value: "0x1100000000000000"
          description: "Engine running, RPM decreasing"
        - value: "0x1200000000000000"
          description: "Engine running, RPM increasing"

    - id: "0x350"
      name: "ExternalLightStatus"
      dlc: 2
      description: "Exterior lighting and ignition flags."
      signals:
        - name: "IgnitionOn"
          byte: 0
          mask: 0x80
          description: "Set in examples 0x8xxx."
        - name: "HighBeamOn"
          byte: 0
          mask: 0x40
          description: "Set in example 0xC400."
        - name: "PositionLightsOn"
          byte: 0
          mask: 0x04
          description: "Set in example 0x8400."
        - name: "ReverseLightOn"
          byte: 0
          mask: 0x10
          description: "Set in example 0x1000."
      examples:
        - value: "0x8000"
          description: "Ignition on, all lights off"
        - value: "0x8400"
          description: "Ignition on, stationary headlights on"
        - value: "0xC400"
          description: "Ignition on, high beams on"
        - value: "0x1000"
          description: "Reverse lights on"

    - id: "0x23A"
      name: "LightSwitchStatus"
      dlc: 2
      description: "Driver light switch positions."
      signals:
        - name: "ParkingLightsRequest"
          byte: 1
          mask: 0x20
          description: "Set in 0x0028."
        - name: "LowBeamRequest"
          byte: 1
          mask: 0x80
          description: "Additional bit set from 0x0028 to 0x00A8."
        - name: "FrontFogButtonPressed"
          byte: 1
          mask: 0x10
          description: "Set in 0x0010."
      examples:
        - value: "0x0000"
          description: "All lights off"
        - value: "0x0028"
          description: "Postojowe"
        - value: "0x00A8"
          description: "Krotkie"
        - value: "0x0010"
          description: "Wcisniety przeciwmgielny przedni"

    - id: "0x235"
      name: "InteriorLightStatus"
      dlc: 2
      description: "Interior illumination dimmer level."
      signals:
        - name: "InteriorBrightnessRaw"
          byte: 1
          mask: 0xFF
          unit: "raw"
          description: "Byte from 0x0004 (low) to 0x00FF (max)."
      examples:
        - value: "0x0000"
          description: "All lights off"
        - value: "0x0004"
          description: "Brightness min"
        - value: "0x00FF"
          description: "Brightness max"

    - id: "0x260"
      name: "BlinkerStatus"
      dlc: 3
      description: "Turn indicator operating mode."
      signals:
        - name: "BlinkerModeCode"
          byte: 0
          mask: 0xFF
          description: "Mode byte from examples xx4080."
          value_mapping:
            0: "No blinkers"
            37: "Left blinker"
            58: "Right blinker"
            31: "Hazard lights"
        - name: "FrameMarker1"
          byte: 1
          mask: 0xFF
          description: "Constant 0x40 in observed samples."
        - name: "FrameMarker2"
          byte: 2
          mask: 0xFF
          description: "Constant 0x80 in observed samples."
      examples:
        - value: "0x004080"
          description: "No blinkers"
        - value: "0x254080"
          description: "Left blinker"
        - value: "0x3A4080"
          description: "Right blinker"
        - value: "0x1F4080"
          description: "Both blinkers - hazard lights on"

    - id: "0x175"
      name: "CIMButtonStatus"
      dlc: 8
      description: "Column integration module inputs (wipers, stalk, steering-wheel buttons)."
      signals:
        - name: "HighBeamToggle"
          byte: 0
          mask: 0x20
          description: "Set in 0x2000000000000000."
        - name: "HighBeamMomentary"
          byte: 0
          mask: 0x08
          description: "Set in 0x0800000000000000."
        - name: "FrontWashWipe"
          byte: 0
          mask: 0x04
          description: "Set in 0x0400000000000000."
        - name: "WiperSpeedCode"
          byte: 4
          mask: 0xFF
          description: "Byte values 0x33, 0x66, 0x99, 0xCC encode speed levels 1..4."
          value_mapping:
            51: "Speed 1"
            102: "Speed 2"
            153: "Speed 3"
            204: "Speed 4"
        - name: "WiperModeCode"
          byte: 1
          byte_count: 2
          mask: 0xFFFF
          description: >
            Wiper mode in bytes 1–2 (data[1] is the 2nd byte in serial/SD log).
            Example 0x00A0040000000000 → bus bytes 00,A0,04,…; decoded raw = 0x04A0
            (byte1 + byte2<<8, not the A0|04 order in the 64-bit hex string).
            While cyclic runs, byte2 may be 00 (raw 0x00A0); UI may match on data[1] only.
          value_mapping:
            1040: "Single"
            1184: "Cyclic"
            160: "Cyclic run"
            1200: "Constant"
            1232: "Constant fast"
        - name: "BlinkerStalkPress"
          byte: 2
          mask: 0x30
          description: "Left/right press in 0x0000100000000000 / 0x0000200000000000 (byte 2, not 3)."
          value_mapping:
            1: "Left"
            2: "Right"
        - name: "SteeringWheelButtonCode"
          byte: 3
          mask: 0x0F
          description: "Button ID in 0x000000XX00000000."
          value_mapping:
            1: "Plus"
            2: "Minus"
            3: "Circle"
            4: "Right arrow"
            5: "Left arrow"
            6: "Up arrow"
      examples:
        - value: "0x0000000033000000"
          description: "wiper speed 1"
        - value: "0x0000000066000000"
          description: "wiper speed 2"
        - value: "0x0000000099000000"
          description: "wiper speed 3"
        - value: "0x00000000CC000000"
          description: "wiper speed 4"
        - value: "0x2000000000000000"
          description: "High beam toggled on"
        - value: "0x0800000000000000"
          description: "High beam momentary on"
        - value: "0x0400000000000000"
          description: "Front windshield fluid + wiper on"
        - value: "0x0010040000000000"
          description: "Front windshield wiper single"
        - value: "0x00A0040000000000"
          description: "Front windshield wiper cyclic"
        - value: "0x00B0040000000000"
          description: "Front windshield wiper constant, speed 1"
        - value: "0x00D0040000000000"
          description: "Front windshield wiper constant, speed 2"
        - value: "0x0000100000000000"
          description: "Left blinker press"
        - value: "0x0000200000000000"
          description: "Right blinker press"
        - value: "0x0000000100000000"
          description: "Steering wheel button plus"
        - value: "0x0000000200000000"
          description: "Steering wheel button minus"
        - value: "0x0000000300000000"
          description: "Steering wheel button circle"
        - value: "0x0000000400000000"
          description: "Steering wheel button right arrow"
        - value: "0x0000000500000000"
          description: "Steering wheel button left arrow"
        - value: "0x0000000600000000"
          description: "Steering wheel button up arrow"

    - id: "0x155"
      name: "ClimateControlStatus"
      dlc: 3
      description: "A/C compressor state and pressure."
      signals:
        - name: "ClimateControlOn"
          byte: 0
          mask: 0x80
          description: "Set in 0x8000002E."
        - name: "PressureRaw"
          byte: 2
          mask: 0xFF
          description: "Low byte pressure value from example 0x..2E."
      examples:
        - value: "0x00002E"
          description: "Pressure"
        - value: "0x80002E"
          description: "Turned on + pressure"

    - id: "0x415"
      name: "PassengerWindowStatus"
      dlc: 5
      description: "Passenger window direction and position/progress bytes."
      signals:
        - name: "WindowMotionCode"
          byte: 1
          mask: 0xFF
          value_mapping:
            0: "Idle"
            2: "Moving up"
            4: "Moving down"
        - name: "WindowPositionRaw"
          byte: 3
          byte_count: 2
          mask: 0xFFFF
          description: "Tail bytes observed as 0xEC41 during motion."
      examples:
        - value: "0x0000000000"
          description: "Idle"
        - value: "0x000200EC41"
          description: "Moving up"
        - value: "0x000400EC41"
          description: "Moving down"

    - id: "0x420"
      name: "PassengerDoorModuleButtonStatus"
      dlc: 5
      description: "Passenger module button events (trunk and central locking controls)."
      signals:
        - name: "DoorModuleBaseState"
          byte: 2
          mask: 0xFF
          description: "Baseline byte appears as 0x10 in all shown samples."
        - name: "ButtonEventCode"
          byte: 1
          mask: 0xFF
          value_mapping:
            0: "Idle"
            8: "Trunk button pressed"
            32: "Door control event A"
            64: "Door control event B"
      examples:
        - value: "0x0000100000"
          description: "Idle"
        - value: "0x0008100000"
          description: "Trunk button pressed"
        - value: "0x0020100000"
          description: "Open/close doors?"
        - value: "0x0040100000"
          description: "Open/close doors?"

    - id: "0x405"
      name: "DriverDoorModuleButtonStatus"
      dlc: 6
      description: "Driver module button and lock state events."
      signals:
        - name: "DriverModuleEventField"
          byte: 2
          byte_count: 2
          mask: 0xFFFF
          description: "Middle bytes vary by action (idle/trunk/lock)."
        - name: "TrunkButtonPressed"
          byte: 3
          mask: 0x04
          description: "Set in 0x000000040000."
        - name: "DoorsLocked"
          byte: 2
          mask: 0x41
          description: "Set in 0x000041000000."
      examples:
        - value: "0x000010000000"
          description: "Idle"
        - value: "0x000000040000"
          description: "Trunk button pressed"
        - value: "0x000010000000"
          description: "Closing?"
        - value: "0x000041000000"
          description: "Doors locked"

    - id: "0x230"
      name: "DoorOpenStatus"
      dlc: 5
      description: "Door/trunk ajar and lock-related status bits."
      signals:
        - name: "DriverDoorOpen"
          byte: 2
          mask: 0x40
          description: "Set in 0x0000400000."
        - name: "PassengerDoorOpen"
          byte: 2
          mask: 0x10
          description: "Set in 0x0000100000."
        - name: "TrunkOpen"
          byte: 2
          mask: 0x04
          description: "Set in 0x0000040000."
        - name: "LeftRearDoorOpen"
          byte: 1
          mask: 0x40
          description: "Set in 0x0040000000."
        - name: "RightRearDoorOpen"
          byte: 1
          mask: 0x10
          description: "Set in 0x0010000000."
        - name: "LockStateCode"
          byte: 0
          mask: 0xFF
          description: "Top byte changes in lock operation example 0x4510000000."
      examples:
        - value: "0x0000000000"
          description: "Idle, doors closed and unlocked"
        - value: "0x0000400000"
          description: "Driver door open"
        - value: "0x0000100000"
          description: "Passenger door open"
        - value: "0x0000040000"
          description: "Trunk open"
        - value: "0x0040000000"
          description: "Left rear door open"
        - value: "0x0010000000"
          description: "Right rear door open"
        - value: "0x4510000000"
          description: "All doors locked using button"

    - id: "0x090"
      dlc: 2
      examples:
        - value: "0x2200"
          description: "Observed sample 1"
        - value: "0x0200"
          description: "Observed sample 2"

    - id: "0x100"
      name: "BusWakeUp"
      dlc: 0
      description: "Bus wake-up frame on unlock or module init; empty payload."
      examples:
        - value: "0x"
          description: "Observed sample 1"

    - id: "0x115"
      name: "BrakeOrLightSwitch"
      dlc: 3
      description: "Brake switch or exterior light state; period ~1000 ms"
      examples:
        - value: "0x20FEE0"
          description: "Observed sample 1"
        - value: "0x20FF60"
          description: "Observed sample 2"
        - value: "0x20FEB0"
          description: "Observed sample 3"
        - value: "0x20FF30"
          description: "Observed sample 4"

    - id: "0x130"
      name: "FuelInjectionCounter"
      dlc: 5
      description: "Cumulative fuel-injection pulse counter"
      signals:
        - name: "InjectionPulseCounterRaw"
          byte: 2
          byte_count: 2
          mask: 0xFFFF
          endian: big
          factor: 0.03054
          unit: "ml"
          description: "16-bit pulse counter at bytes 2-3; volume ≈ raw * 0.03054 ml per tick."
      examples:
        - value: "0x0000A27579"
          description: "Observed sample 1"
        - value: "0x0000A87579"
          description: "Observed sample 2"
        - value: "0x0000AE7579"
          description: "Observed sample 3"
        - value: "0x0000B37579"
          description: "Observed sample 4"

    - id: "0x135"
      name: "CentralLockButtons"
      dlc: 4
      description: "Central locking button events from cabin or keyfob"
      signals:
        - name: "LockButtonEventCode"
          byte: 0
          mask: 0xFF
          description: "Button state in byte 0."
          value_mapping:
            188: "Close pressed"
            124: "Open pressed"
            60: "Released"
        - name: "KeyfobSource"
          byte: 2
          mask: 0xFF
          description: "Byte 2 = 0x06 when event originates from keyfob (0x00 from cabin)."
        - name: "KeyIdRaw"
          byte: 2
          byte_count: 2
          mask: 0xFFFF
          endian: big
          description: "Key identifier in bytes 2-3."
      examples:
        - value: "0xBC81EC41"
          description: "Close pressed"
        - value: "0x3C81EC41"
          description: "Released"
        - value: "0x7C81EC41"
          description: "Open pressed"
        - value: "0x4103EC41"
          description: "Keyfob event (byte2 = 0x03)"

    - id: "0x140"
      dlc: 1
      examples:
        - value: "0x00"
          description: "Observed sample 1"
        - value: "0x80"
          description: "Observed sample 2"

    - id: "0x145"
      name: "EngineData"
      dlc: 8
      description: "Supplementary engine run-state, coolant and cruise-control data."
      signals:
        - name: "WinterMode"
          byte: 0
          mask: 0x04
          description: "Winter mode active when bit set (0x04 on, 0x00 off)."
        - name: "EnginePhaseCode"
          byte: 0
          mask: 0xFF
          description: "Engine phase nibble patterns."
          value_mapping:
            0: "Running"
            32: "Ignition on, engine off"
            64: "Starting"
            96: "Starting"
        - name: "RunState"
          byte: 1
          mask: 0xFF
          description: "Primary run-state byte."
          value_mapping:
            0: "Off"
            1: "Running"
            128: "Starting"
            129: "Starting"
        - name: "RunState2"
          byte: 2
          mask: 0xFF
          description: "Secondary run-state byte."
          value_mapping:
            1: "Off"
            16: "Running"
        - name: "CoolantTempRaw"
          byte: 3
          mask: 0xFF
          offset: -40
          unit: "°C"
          description: "Coolant temperature; °C = raw − 40."
        - name: "RunState3"
          byte: 4
          mask: 0xFF
          description: "Tertiary run-state byte."
          value_mapping:
            0: "Off"
            160: "Running"
        - name: "CruiseControlState"
          byte: 5
          mask: 0xFF
          description: "Cruise control activity."
          value_mapping:
            4: "Inactive"
            6: "Active"
      examples:
        - value: "0x0000C05D00000000"
          description: "Observed sample 1"
        - value: "0x0000C05E00000000"
          description: "Observed sample 2"
        - value: "0x0000C05F00000000"
          description: "Observed sample 3"
        - value: "0x0000C06000000000"
          description: "Observed sample 4"


    - id: "0x190"
      name: "Mileage"
      dlc: 5
      description: "Odometer reading; period ~1000 ms."
      signals:
        - name: "OdometerRaw"
          byte: 1
          byte_count: 4
          mask: 0xFFFFFFFF
          endian: big
          factor: 0.015625
          unit: "km"
          description: >
            Vectra 0x190: 32-bit odometer in bytes 1-4 (big-endian).
            km = raw / 64 (e.g. 0x0140FE80 → 328698 km).
      examples:
        - value: "0x000140FE80"
          description: "328698 km total"
        - value: "0x000140FEC0"
          description: "28701 km total"

    - id: "0x220"
      dlc: 1
      examples:
        - value: "0x18"
          description: "Observed sample 1"
        - value: "0x08"
          description: "Observed sample 2"
        - value: "0x14"
          description: "Observed sample 3"

    - id: "0x270"
      dlc: 5
      examples:
        - value: "0x69051E0133"
          description: "Observed sample 1"

    - id: "0x315"
      dlc: 1
      examples:
        - value: "0x00"
          description: "Observed sample 1"

    - id: "0x330"
      dlc: 1
      examples:
        - value: "0x0F"
          description: "Observed sample 1"

    - id: "0x340"
      dlc: 2
      examples:
        - value: "0x0040"
          description: "Observed sample 1"

    - id: "0x360"
      name: "ClutchStatus"
      dlc: 3
      description: "Clutch pedal position."
      signals:
        - name: "ClutchPressed"
          byte: 2
          mask: 0x40
          description: "Clutch pressed when byte 2 = 0x40; released when 0x00."
      examples:
        - value: "0x400000"
          description: "Clutch pressed"
        - value: "0x400040"
          description: "Observed sample 2"

    - id: "0x370"
      name: "HandbrakeStatus"
      dlc: 3
      description: "Handbrake (parking brake) position."
      signals:
        - name: "HandbrakeUp"
          byte: 1
          mask: 0x01
          description: "Handbrake lever up when bit 0 of byte 1 is set."
      examples:
        - value: "0x000000"
          description: "Observed sample 1"
        - value: "0x008000"
          description: "Observed sample 2"

    - id: "0x440"
      name: "SystemTime"
      dlc: 8
      description: "Vehicle clock time; period ~1000 ms."
      signals:
        - name: "ClockHours"
          byte: 0
          mask: 0xFF
          unit: "h"
          description: "Hour of day in byte 0."
        - name: "ClockMinutes"
          byte: 1
          mask: 0xFF
          unit: "min"
          description: "Minutes in byte 1."
        - name: "ClockSecondsRaw"
          byte: 2
          mask: 0xFF
          factor: 0.25
          unit: "s"
          description: "Seconds in byte 2; s = raw / 4."
      examples:
        - value: "0x9844701E0008601A"
          description: "Observed sample 1"
        - value: "0x9844741E0008601A"
          description: "Observed sample 2"
        - value: "0x98447C1E0008601A"
          description: "Observed sample 3"
        - value: "0x9844801E0008601A"
          description: "Observed sample 4"

    - id: "0x445"
      name: "OutdoorTemperature"
      dlc: 2
      description: "Ambient (outdoor) temperature; period ~1000 ms."
      signals:
        - name: "OutdoorTempRaw"
          byte: 1
          mask: 0xFF
          factor: 0.5
          offset: -40
          unit: "°C"
          description: "Outdoor temperature in byte 1; °C = raw / 2 − 40."
      examples:
        - value: "0x007E"
          description: "Observed sample 1 (~23.0 °C)"
        - value: "0x007F"
          description: "Observed sample 2 (~23.5 °C)"
        - value: "0x007D"
          description: "Observed sample 3 (~22.5 °C)"
        - value: "0x007C"
          description: "Observed sample 4 (~22.0 °C)"

    - id: "0x500"
      name: "BatteryVoltage"
      dlc: 2
      description: "Battery voltage; period ~1500 ms."
      signals:
        - name: "BatteryVoltageRaw"
          byte: 1
          mask: 0xFF
          factor: 0.125
          unit: "V"
          description: "Voltage in byte 1; V = raw / 8 (e.g. 0x5C → 11.5 V)."
      examples:
        - value: "0x005C"
          description: "11.5 V"

    - id: "0x525"
      dlc: 1
      examples:
        - value: "0x00"
          description: "Observed sample 1"
        - value: "0x80"
          description: "Observed sample 2"

    - id: "0x621"
      dlc: 8
      examples:
        - value: "0x0048500000000000"
          description: "Observed sample 1"

    - id: "0x622"
      dlc: 8
      examples:
        - value: "0x0000400000000000"
          description: "Observed sample 1"
        - value: "0x0008400000000000"
          description: "Observed sample 2"
        - value: "0x0100200000000000"
          description: "Observed sample 3"
        - value: "0x0008600000000000"
          description: "Observed sample 4"

    - id: "0x624"
      dlc: 8
      examples:
        - value: "0x0000100000000000"
          description: "Observed sample 1"

    - id: "0x625"
      dlc: 8
      examples:
        - value: "0x0000100000000000"
          description: "Observed sample 1"

    - id: "0x626"
      dlc: 8
      examples:
        - value: "0x0011000000000000"
          description: "Observed sample 1"

    - id: "0x628"
      dlc: 8
      examples:
        - value: "0x0008000000000000"
          description: "Observed sample 1"

    - id: "0x629"
      dlc: 8
      examples:
        - value: "0x0008000000000000"
          description: "Observed sample 1"
        - value: "0x0000100000000000"
          description: "Observed sample 2"
