-
-
Notifications
You must be signed in to change notification settings - Fork 0
Home
An Android telemetry application specifically optimized for the Voge 900DSX (Factory Model Code: LX900-A, also known as DS900X).
The application leverages the fact that this motorcycle shares the BMW F900 architecture and uses the 4M96001 twin-cylinder engine block (manufactured by Loncin), making it compatible with advanced BMW UDS diagnostic protocols.
Test vehicle dash cluster firmware: HW SS621-L8, OS SS621X11-OS-V2.3.2, HMI
SS621X11-HMI-V4.7, MCU SW SS621X11-10. Every PID/DID in Confirmed PIDs was
verified against this exact dash — a different HW/OS/HMI/MCU version on your own bike may behave
differently, especially for signals not yet mapped.
- Setup — Google Maps/Drive API setup, OBD adapter pairing, first run.
- Development Walkthrough — current-state summary of every subsystem.
- Implementation Plan — the architectural decisions/patterns behind them, and why.
- Confirmed PIDs — every OBD-II/UDS request verified working on this bike.
For screenshots of the dashboard UI, see the README in the main repo.
- Live Engine Data (OBD2): Real-time monitoring of Speed, RPM, Gear, Throttle Position, and Front/Rear Brake Pressure (via UDS/Enhanced PIDs) using a Bluetooth ELM327 adapter.
- Physical Analysis (IMU): Real-time Lean Angle and G-Force measurement using the phone's internal sensors and the motorcycle's internal IMU, with a one-tap calibration to zero out the phone's mount tilt.
- Route Tracking (GPS): Visualization of the riding route on a map using Google Maps integration, with a stats overlay (distance, duration, average speed).
- Data Logging (Room DB): Recording all telemetry data (Speed, RPM, Gear, Lean, GPS, etc.) to a local database at 5Hz (5 times per second), independent of whether an OBD2 adapter is connected.
- Auto-Start & Ride Continuation: Optionally starts recording automatically the moment the OBD adapter connects (engine on), and keeps a short stop (red light, fuel stop) inside the same ride instead of splitting it into a new session, based on a configurable grace period.
- Check Engine Diagnostics: Polls MIL status and stored DTCs (OBD Mode 01/03), surfaces a check-engine badge with the fault codes (each with a plain-language explanation), and supports clearing them (Mode 04) behind a confirmation step.
- Connection Health: Detects a dead Bluetooth link (e.g. the adapter losing power when the ignition is switched off) by counting consecutive write failures, instead of leaving the UI stuck showing "OBD Connected" indefinitely.
- Bike Info Tab: Live per-sensor readouts (coolant, fuel level/rate, battery voltage, intake/ambient temp, engine load, intake manifold pressure, catalyst temp, engine runtime, ECU odometer, distance since DTC clear, distance with MIL on), a live sensor map showing every known CAN header/DID with a green/red/gray dot for whether it answered correctly on the current connection, a diagnostic PID sweep tool, and a raw CAN bus monitor for reverse-engineering unmapped signals.
- Diagnostic Sweep Tools: A safe standard-PID support scan (asks the ECU which Mode 01 PIDs it supports), a manufacturer DID sweep across known CAN headers, and an explicitly-gated UDS Extended Diagnostic Session probe (engine-off only, behind a confirmation dialog) for the two still-unmapped brake-related DIDs.
-
Raw CAN Bus Monitor: Passive, read-only capture of the raw CAN bus (
ATMA) with selectable duration (8s up to 5 minutes), automatic recovery from ELM327BUFFER FULLconditions on a busy bus, and a shareable text export — used to reverse-engineer signals that aren't exposed through a normal PID/DID request (e.g. lean angle broadcast by the IMU rather than requested from the ECU). - Modern Dashboard: A card-based, cyan-accented dark UI designed with Jetpack Compose, with an adaptive landscape layout and a screen-rotation lock so the display doesn't flip mid-corner.
- Home Dashboard: Main menu shows your last ride, current fuel level, and an estimated service-interval countdown, plus quick-access shortcuts to Panel/History/Analysis/Bike Info/Settings.
- Ride Management: Rename or delete recorded sessions from the Analysis tab.
- Analysis Charts: Per-ride charts for Speed & RPM, Lean Angle, Lateral/Longitudinal G-Force, and Altitude, alongside session stats (max speed, max lean, max G, etc.) and a sparkline per session in the list.
- Settings Tab: One place for auto-start/ride-continuation, battery-optimization exemption, diagnostic log sharing, and language, instead of scattered across screens.
- Multi-language: Full English/Turkish UI with in-app language switching.
- Cloud Backup & Restore: Backup ride data to Google Drive and restore it back, either merging with what's on the phone or replacing it, via a picker listing all available backups by date.
- Diagnostics Upload: Push the diagnostic log and any CAN monitor/OBD sweep captures to a visible "MotoTelemetryApp Diagnostics" folder in Drive from Settings, so a real-world test can be reviewed remotely without connecting the phone to a computer.
- Language: Kotlin
- UI: Jetpack Compose (Material 3), Vico charts
- Architecture: MVVM (Service → ViewModel → Compose UI, via StateFlow)
- Database: Room Database
- Connectivity: Bluetooth Classic (RFCOMM), OBD-II Mode 01/03/04, and UDS (ISO 14229) Service 0x22 ReadDataByIdentifier
- Location: Google Play Services Fused Location
- Navigation: Jetpack Navigation
- Cloud: Google Drive API
- Lean Angle: For the most accurate measurement using phone sensors, it is recommended to mount the phone vertically and securely on the motorcycle.
- UDS Support: Data like brake pressure and motorcycle lean angle are BMW/Voge-specific PIDs. The readability of this data may vary depending on the quality of your ELM327 adapter.
- CAN sweeps and the security-session probe are engine-off tools. Probing unconfirmed CAN headers or opening a UDS Extended Diagnostic Session changes what the ECU responds to (or its session state) rather than just reading data — only the standard-PID scan and the raw CAN monitor are safe to run with the engine on.
Developed by: Sertel Şekerci