The mounting system uses three 3D-printed parts: a main mounting plate, a backplate, and a rear cover. The mounting plate attaches to the factory dashboard using the original inclinometer mounting holes. A 12V-to-usb C converter mounts on the backplate, with the rear cover securing it in place. The assembly is completely done by fasteners. Power connects to the vehicle's auxiliary cigarette lighter circuit. Cable routing runs through the center console. Parts were printed in ASA.

I used a prebuilt waveshare module and the converter to usb C as basis, I didnt want to redevelop the entire hardware, but that might be something to do in the future

The firmware runs on FreeRTOS with four user tasks: QMI sensor task (Priority 10, 25Hz polling), Display task (Priority 2, LVGL rendering), WiFi Manager (Priority 2, 1-second scanning cycle), and OTA task (Priority 5, on-demand). 

The QMI task reads the IMU and writes roll/pitch data to a queue. 

The Display task reads from this queue non-blocking. Sensor data persists as std::optional<RollPitch> in NVS flash for calibration offsets, loaded at startup via getStoredOffset().value_or(RollPitch{0,0,0}).

 WiFi uses a state machine with states: INIT, READY_TO_PROVISION, PROVISIONING, PROVISIONED, READY_TO_CONNECT, SCANNING, CONNECTING, CONNECTED, and DISCONNECTED. 

OTA updates pull firmware over HTTPS and use dual-partition swapping. 

All inter-component communication uses non-blocking queues or callbacks. UI is generated from SquareLine Studio and exported as LVGL-compatible C code.