The replay loop advanced the cursor by one sample every 50 ms / speed, assuming a uniform 20 Hz stream. Recorded telemetry is not always uniform (segment breaks and GPS-loss gaps up to 5 s), so the rider marker drifted out of sync with the elapsed-time readout — which is derived from real timestamps — and "1x" did not match real time across gaps. Make playback timestamp-driven: - Add advancePlaybackIndex(points, fromIndex, budgetMs): a pure helper that consumes a budget of virtual recorded time, advancing by the real delta between samples so the marker tracks the elapsed-time clock. Disconnected transitions (per areTelemetryPointsConnected) are compressed to a single 50 ms step so playback never stalls across multi-second dead time. No coordinates are altered. - Drive the rAF loop with frameDelta * playbackSpeed plus carry-over, resuming from an index ref so manual scrubs are honored. Verified sound without changes: SHA-256-checked R2/inline telemetry load, CSV/GPX parse and export integrity, loading/error/empty overlays, and tile-provider fallback. Tests: advancePlaybackIndex covers uniform cadence, carry-over, gap compression, end-clamp, and empty input. Existing replay/export/corner tests remain green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |
||
|---|---|---|
| .agents/skills | ||
| .continue/mcpServers | ||
| .github | ||
| .token-optimizer/wiki | ||
| .wrangler/cache | ||
| android | ||
| assets | ||
| backend/motorsignal_api | ||
| cloudflare/motorsignal-r2-worker | ||
| docs | ||
| field_test_export_ride3_unzipped | ||
| field_test_export_ride4_unzipped | ||
| field_test_export_unzipped/field_test_session | ||
| firebase/emulator-tests | ||
| integration_test | ||
| ios | ||
| lib | ||
| linux | ||
| macos | ||
| patrol_test | ||
| qa_screenshots | ||
| ride_logs | ||
| scripts | ||
| server/waze_relay | ||
| test | ||
| tool | ||
| tools | ||
| web | ||
| website | ||
| windows | ||
| .firebaserc | ||
| .gitattributes | ||
| .gitignore | ||
| .metadata | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| GEMINI.md | ||
| PRODUCT.md | ||
| README.md | ||
| analysis_options.yaml | ||
| field_test_export.zip | ||
| field_test_export_ride3.zip | ||
| field_test_export_ride4.zip | ||
| firebase.emulator.json | ||
| firebase.json | ||
| firestore.indexes.json | ||
| firestore.rules | ||
| fix_exceptions.dart | ||
| generate_icon.dart | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| release_manifest.json | ||
| serve_apk.js | ||
| skills-lock.json | ||
README.md
Motorcycle Digital Dashboard 🏍️
A high-performance, dark-themed telemetry and analytics dashboard for motorcycles, built with Flutter.
Features
- Real-time Telemetry: Uses GPS and IMU sensors to calculate speed, lean angle (bank), and acceleration/braking G-forces.
- Automatic Ride Recording: Automatically starts tracking when movement is detected and logs your trip.
- Performance Analysis: Automatically measures 0-60 MPH and 0-100 MPH acceleration times.
- Ride History & Replay: View past rides, replay telemetry synchronized with a Google Map.
- Audio Alerts: Text-to-speech alerts for milestones and ride states to keep your eyes on the road.
- Data Export: Export your ride telemetry to
.csvor.gpxfor external analysis.
Setup & Building
- Ensure you have the Flutter SDK installed.
- Clone this repository.
- Run
flutter pub getto fetch dependencies. - Add your Google Maps API key in
android/app/src/main/AndroidManifest.xml(replaceYOUR_API_KEY_HERE). - Run
flutter runorflutter build apk.
Architecture
- Framework: Flutter (Material 3).
- State Management: Riverpod for reactive UI state.
- Database: Drift (SQLite) for robust, local storage.
- Sensor Fusion: Complementary filter combining accelerometer and gyroscope for precise lean angles.
Documentation
The active documentation map and dated evidence archive are indexed in docs/README.md.
Disclaimer
This application relies on the accuracy of your smartphone's internal sensors. It should be securely mounted to the motorcycle using a rigid mount. Do not interact with the screen while riding. Ride safely!