#pragma once #include #include // CRC8 with polynomial 0x07, initial value 0xFF // Used for validating TLV entries in the user signature page uint8_t Crc8(const uint8_t* data, size_t len); // Tag IDs for user signature TLV entries (subset relevant to proximity) enum class SigTag : uint8_t { Invalid = 0xFF, ProxCal = 0x06, HmdSerial = 0x08, // HMD serial for BS1/BS2 detection TrackingSerial = 0x09, ProxThreshold = 0x0B, ProxHysteresis = 0x0C, UserProxTrim = 0x0E, }; // Calibration parameters extracted from user signature flash struct CalibrationData { uint16_t programmed_cal = 0; uint16_t proximity_threshold = 1500; // firmware default: PROX_SENSOR_THRESHOLD uint16_t proximity_hysteresis = 100; // firmware default: PROX_SENSOR_HYSTERESIS int16_t user_trim = 0; // SIGNED -- firmware explicitly notes this char tracking_serial[32] = {}; // lighthouse serial from tag 0x09 (e.g. "LHR-XXXXXXXX") char hmd_serial[32] = {}; // HMD serial from tag 0x08 (e.g. "BS2-XXXXXXXX") }; // Parse calibration data from a 512-byte user signature page (TLV + CRC8 format) // Returns CalibrationData with defaults for any tags not found or with bad CRC CalibrationData ParseCalibration(const uint8_t* sig, size_t sigLen);