48 lines
4.0 KiB
Markdown
48 lines
4.0 KiB
Markdown
# Motorcycle Digital Dashboard - Project Summary
|
|
|
|
This document serves as a comprehensive summary of all features, architecture, and implementations completed for the Flutter Motorcycle Digital Dashboard application.
|
|
|
|
## 🏗️ Architecture & Core Stack
|
|
- **Framework**: Flutter (Dart) - Android first.
|
|
- **State Management**: **Riverpod** (`flutter_riverpod`) used for dependency injection and reactive UI state (e.g., streaming live sensor data).
|
|
- **Local Database**: **Drift** (SQLite) used for robust, relational, and type-safe persistence of ride histories.
|
|
- **Routing**: **GoRouter** utilized with `StatefulShellRoute` to provide a persistent `BottomNavigationBar` across multiple screens.
|
|
|
|
---
|
|
|
|
## 🚀 Features & Implementations
|
|
|
|
### 1. Telemetry & Sensor Integration
|
|
The application interfaces directly with the Android device's hardware to provide real-time telemetry:
|
|
- **LocationService**: Uses `geolocator` to stream precise GPS data (5Hz update interval). It applies aggressive filtering to ignore sudden jumps in speed or poor accuracy readings, providing smooth `speed` (MPH) and `heading` data.
|
|
- **SensorFusionService**: Uses `sensors_plus` to listen to the device's Accelerometer and Gyroscope. It combines the data using a **Complementary Filter** (Alpha = 0.96) to calculate highly accurate **Bank/Lean Angles** and Pitch, effectively canceling out engine vibration and short-term bumps. Also calculates lateral and longitudinal **G-Forces**.
|
|
- **CompassService**: Uses the magnetometer to act as a fallback/secondary heading provider.
|
|
- **Mount Calibration**: A mathematical offset system allows the phone to be mounted at any angle on the motorcycle. The rider can "Zero" the sensors to set the current physical orientation as 0° Lean/Pitch.
|
|
|
|
### 2. Ride State Machine & Automation
|
|
- **RideStateMachine**: A Riverpod `StateNotifier` that automatically transitions between `Idle`, `Ready`, and `Riding` states based on GPS speed.
|
|
- **Automatic Recording**: Starts tracking a "Ride Session" automatically. It continually calculates and stores the rider's maximums (Top Speed, Max Left/Right Lean, Max G-Force) into memory.
|
|
|
|
### 3. Performance Metrics
|
|
- **PerformanceTimerService**: Automatically detects hard acceleration from 0 MPH. Starts a high-resolution timer and stops precisely when the GPS speed crosses 60 MPH and 100 MPH, logging the 0-60 and 0-100 times.
|
|
|
|
### 4. Data Persistence (Drift)
|
|
- **Rides Table**: Stores completed ride sessions (Start/End time, Top Speed, Max Lean Angles, Max Accel/Braking Gs).
|
|
- **PerformanceRuns Table**: Stores 0-60 and 0-100 times linked via foreign key to the specific Ride session.
|
|
|
|
### 5. User Interface (Material 3)
|
|
Designed with extremely high-contrast dark mode for at-a-glance readability while riding.
|
|
- **Dashboard Screen**: Adapts dynamically to Portrait and Landscape mounting. Shows a gigantic Speedometer, current Heading, Lean Angle gauge, and live G-Force metrics.
|
|
- **Map Screen**: Integrates `google_maps_flutter` for full-screen navigation/tracking. Follows the rider's GPS location. Supports toggling between Normal and Satellite views. *(Note: Requires a valid Google Maps API Key in AndroidManifest.xml)*.
|
|
- **History Screen**: A list view populated directly from the Drift database, showing cards for all past rides and their telemetry maximums.
|
|
- **Settings Screen**: Provides a "Calibrate Mount Angle" button to zero the sensors, and a "Clear Ride History" button to wipe the local database.
|
|
|
|
### 6. Police Alert Abstraction
|
|
- Created a `PoliceAlertService` interface. Since Google doesn't provide a native speed-trap API endpoint, this is abstracted out so third-party APIs (like Waze/RadarBot) can be injected in the future. A mock implementation is currently provided.
|
|
|
|
---
|
|
|
|
## 🛠️ Next Steps / Maintenance
|
|
1. **Google Maps API Key**: Replace the `YOUR_API_KEY_HERE` placeholder in `android/app/src/main/AndroidManifest.xml` with a real key from the Google Cloud Console.
|
|
2. **iOS Support**: If ported to iOS in the future, the `Info.plist` will need the corresponding Location, Motion, and Background execution permissions added.
|