Rotating the phone into landscape while leveling used to leave a
portrait-shaped column of controls that needed scrolling to take in.
All three level-integration screens now branch on verticalSizeClass:
the bubble/vehicle status in the device screen and the full alignment
assistant (advice, readings, and wedge heights) lay out side-by-side
instead of stacked, sized to fit without scrolling.
The device screen also measures its actual available height via a
GeometryReader and feeds it to the level display so the bubble/vehicle
graphic scales to fill the landscape screen rather than being capped at
a fixed size, and the connection-status section moves to the bottom of
the list in landscape so it doesn't compete with the display for space.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
App:
- New DeviceRole.solar with its own BLE session/protocol/state
(SolarSession, VanAlignSolarProtocol, SolarState), mirroring the
leveling sensor but deliberately not wired into the Live Activity.
- BluetoothManager now keeps an in-memory history per metric (voltage,
current, power) instead of a single primary-metric series; cleared on
app restart by design, not persisted to disk.
- DeviceDetailView shows a channel picker above the history chart when a
device has more than one chartable metric.
- AddDeviceView recognizes the solar service UUID during setup.
- DemoData gets a simulated solar device so the integration can be
checked in the simulator without hardware.
Firmware:
- Add esp32_ble_solar.yaml (Votronic solar charge controller over BLE)
and simulated variants (esp32_ble_sim.yaml, esp32_ble_solar_sim.yaml)
for testing without a vehicle.
- esp32_ble.yaml: set flash_size/psram for the ESP32-S3 N16R8 module.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>