Automotive infotainmentDrawing 28 of 28Role Sole author
Corvette DIN Unit
A full infotainment system for a C6 Corvette double-DIN conversion, styled after BMW iDrive 7/8: Qt 6 and QML running kiosk-mode on an x86 mini-PC, driving a 2560x1600 touchscreen. CarPlay is one tile among many, not the whole product - the unit is useful with no phone attached.
Specification / as recorded
Status
Private build, installed in the car
Role
Sole author
Stack
Qt 6 / QML, C++ services
Platform
Kiosk-mode Ubuntu 24.04 on an x86 mini-PC
Display
2560 x 1600 double-DIN touchscreen
PlatePL-01
TitleHome screen, a live widget grid for media
ViewDetail
Vehicle, phone and CarPlay.
Sheet 02 of 05/Specification
By the numbers
Section
Real or simulated
Media
Real - local library playback, USB and folder scanning
Wi-Fi
Real - NetworkManager
Vehicle gauges
Simulated - no OBD/CAN fitted yet
Radio
Simulated - no tuner fitted yet
Reversing camera
Simulated feed, real steering-linked guideline geometry
Phone
Simulated - demo contacts and call log
CarPlay
Real - launches OpenAuto Pro
Sheet 03 of 05/Honest
A DEMO chip instead of a guess
Building the whole shell before the hardware behind every tile exists meant deciding, up front, what happens to a screen whose sensor isn't wired up yet. The answer here is not to fake it quietly. Every service probes for its hardware at runtime and falls back to a modelled version of the same data if it isn't there, and any screen running on modelled data shows a small DEMO chip so it never implies it is live when it isn't.
That honesty lives in the service layer, not the UI. A simulated property on each service drives the chip, so a screen can't accidentally claim real data by omission. The chips can be hidden in Settings, but the property underneath keeps working either way. As real hardware gets fitted - a tuner, an OBD reader, a reversing camera - the corresponding service starts reporting real data and its chip disappears on its own.
PlatePL-02
TitleVehicle screen in Sport mode
ViewDetail
BMW Sport Displays style arc gauges over live G-force and fluid temperatures.
PlatePL-03
TitleReversing camera screen
ViewDetail
Steering linked guidelines over a simulated feed since no camera is fitted yet.
Sheet 04 of 05/Runtime
One binary, two machines
The whole system runs unmodified on both the Mac I develop on and the mini-PC bolted behind the dash. Simulation is chosen at runtime by each service probing its own hardware, not behind compile-time #ifdefs, so the same binary that renders in a windowed 1280x800 dev build is the one that boots fullscreen on the car PC at 2560x1600 - a true miniature, not a different layout for a different target.
Navigation is one StackView behind a persistent rail. A rail tap replaces the whole stack rather than pushing onto it, so the back stack only ever holds sub-screens of the current section and the rail is always exactly one tap from anywhere, no matter how far a screen has drilled down.
PlatePL-04
TitleRadio screen
ViewDetail
An FM tuner with a frequency ruler, eight presets and a station list.
PlatePL-05
TitlePhone screen
ViewDetail
Pairing, recents and a dialer, all clearly marked DEMO.
Sheet 05 of 05/Design
No drop shadows anywhere
Every color, size and duration comes from one theme singleton, and nothing else in the app declares a color. That is what makes eight full palettes - six BMW-style My Modes, a bronze Corvette mode, a genuinely light Daylight theme, and a warm-amber Night theme with no blue anywhere - a matter of switching one active entry rather than re-skinning each screen by hand.
Depth comes from stacked surface lightness and one-pixel hairlines. There are no drop shadows anywhere, which is BMW's own stated rule for this class of display and also sidesteps effects the target Qt version does not have. Every icon is drawn from SVG path data rather than an icon font or bitmap, so it stays crisp from the dev window up to the full-size touchscreen.