diff --git a/lib/database/tables.dart b/lib/database/tables.dart index aa99a7c..2a4ed37 100644 --- a/lib/database/tables.dart +++ b/lib/database/tables.dart @@ -2,6 +2,9 @@ import 'package:drift/drift.dart'; class Rides extends Table { IntColumn get id => integer().autoIncrement()(); + /// Stable MotorCloud identity. Generated once when a ride is created and + /// preserved across local database IDs, reinstalls/restores, and sync retries. + TextColumn get cloudRideId => text().nullable().unique()(); DateTimeColumn get startTime => dateTime()(); DateTimeColumn get endTime => dateTime().nullable()(); RealColumn get distanceMiles => real().withDefault(const Constant(0.0))(); @@ -12,17 +15,15 @@ class Rides extends Table { RealColumn get maxBrakingG => real().withDefault(const Constant(0.0))(); RealColumn get best0to60Ms => real().nullable()(); RealColumn get best0to100Ms => real().nullable()(); - - // Phase 2 additions - RealColumn get distance => real().withDefault(const Constant(0.0))(); // Total distance (e.g., meters) - IntColumn get movingTime => integer().withDefault(const Constant(0))(); // seconds - IntColumn get stoppedTime => integer().withDefault(const Constant(0))(); // seconds + + RealColumn get distance => real().withDefault(const Constant(0.0))(); + IntColumn get movingTime => integer().withDefault(const Constant(0))(); + IntColumn get stoppedTime => integer().withDefault(const Constant(0))(); RealColumn get averageSpeed => real().withDefault(const Constant(0.0))(); RealColumn get topSpeed => real().withDefault(const Constant(0.0))(); RealColumn get elevationGain => real().withDefault(const Constant(0.0))(); RealColumn get elevationLoss => real().withDefault(const Constant(0.0))(); - // Phase 3 additions: Motorcycle association IntColumn get motorcycleId => integer().nullable()(); IntColumn get motorcycleYear => integer().nullable()(); TextColumn get motorcycleMake => text().nullable()(); @@ -34,14 +35,12 @@ class TelemetrySamples extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get rideId => integer().references(Rides, #id)(); DateTimeColumn get timestamp => dateTime()(); - RealColumn get latitude => real().nullable()(); RealColumn get longitude => real().nullable()(); RealColumn get altitude => real().nullable()(); - RealColumn get speed => real().nullable()(); // MPH + RealColumn get speed => real().nullable()(); RealColumn get heading => real().nullable()(); RealColumn get gpsAccuracy => real().nullable()(); - RealColumn get leanAngle => real().nullable()(); RealColumn get pitchAngle => real().nullable()(); RealColumn get accelX => real().nullable()(); @@ -55,7 +54,7 @@ class RideEvents extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get rideId => integer().references(Rides, #id)(); DateTimeColumn get timestamp => dateTime()(); - TextColumn get eventType => text()(); // e.g. "Hard Braking", "Extreme Corner" + TextColumn get eventType => text()(); RealColumn get value => real()(); RealColumn get latitude => real().nullable()(); RealColumn get longitude => real().nullable()(); @@ -64,7 +63,7 @@ class RideEvents extends Table { class PerformanceRuns extends Table { IntColumn get id => integer().autoIncrement()(); IntColumn get rideId => integer().references(Rides, #id).nullable()(); - TextColumn get type => text()(); // "0-60" or "0-100" + TextColumn get type => text()(); RealColumn get timeMs => real()(); RealColumn get topSpeedReached => real()(); DateTimeColumn get timestamp => dateTime()(); @@ -148,66 +147,7 @@ class FieldTestSummaries extends Table { RealColumn get validPercentage => real().withDefault(const Constant(0.0))(); RealColumn get suspectPercentage => real().withDefault(const Constant(0.0))(); RealColumn get rejectedPercentage => real().withDefault(const Constant(0.0))(); - IntColumn get gpsFixCount => integer().withDefault(const Constant(0))(); - IntColumn get gpsStaleEventCount => integer().withDefault(const Constant(0))(); - IntColumn get gpsJumpRejectCount => integer().withDefault(const Constant(0))(); - IntColumn get maxGpsAgeMs => integer().nullable()(); - RealColumn get averageGpsAccuracy => real().nullable()(); - RealColumn get worstGpsAccuracy => real().nullable()(); - IntColumn get telemetryGapCount => integer().withDefault(const Constant(0))(); - IntColumn get maxTelemetryGapMs => integer().nullable()(); - IntColumn get imuSaturationCount => integer().withDefault(const Constant(0))(); - RealColumn get maxSpeedMph => real().nullable()(); - RealColumn get maxLeanAngle => real().nullable()(); - RealColumn get maxLongitudinalG => real().nullable()(); - RealColumn get maxLateralG => real().nullable()(); - IntColumn get accelerationEventCount => integer().withDefault(const Constant(0))(); - IntColumn get brakingEventCount => integer().withDefault(const Constant(0))(); - IntColumn get zeroTo60Count => integer().withDefault(const Constant(0))(); - IntColumn get zeroTo100Count => integer().withDefault(const Constant(0))(); - RealColumn get bestZeroTo60 => real().nullable()(); - RealColumn get bestZeroTo100 => real().nullable()(); - IntColumn get databaseSamplesWritten => integer().withDefault(const Constant(0))(); - IntColumn get databaseSamplesLost => integer().withDefault(const Constant(0))(); - IntColumn get eventCount => integer().withDefault(const Constant(0))(); - RealColumn get overallConfidence => real().nullable()(); - IntColumn get rideQualityScore => integer().withDefault(const Constant(0))(); - TextColumn get rideQualityRating => text().withDefault(const Constant('INVALID'))(); - BoolColumn get wasRecoveredAfterCrash => boolean().withDefault(const Constant(false))(); - BoolColumn get wasInterrupted => boolean().withDefault(const Constant(false))(); - TextColumn get exportIntegrity => text().nullable()(); -} - -class FieldTestGpsRecords extends Table { - IntColumn get id => integer().autoIncrement()(); - IntColumn get sessionId => integer().references(FieldTestSessions, #id)(); - DateTimeColumn get timestamp => dateTime()(); - RealColumn get latitude => real()(); - RealColumn get longitude => real()(); - RealColumn get altitude => real().nullable()(); - RealColumn get rawSpeed => real().nullable()(); - RealColumn get filteredSpeed => real().nullable()(); - RealColumn get heading => real().nullable()(); - RealColumn get accuracy => real().nullable()(); - TextColumn get gpsHealth => text()(); - BoolColumn get accepted => boolean()(); - TextColumn get rejectionReason => text().nullable()(); -} - -class FieldTestImuRecords extends Table { - IntColumn get id => integer().autoIncrement()(); - IntColumn get sessionId => integer().references(FieldTestSessions, #id)(); - DateTimeColumn get timestamp => dateTime()(); - RealColumn get accelerometerX => real().nullable()(); - RealColumn get accelerometerY => real().nullable()(); - RealColumn get accelerometerZ => real().nullable()(); - RealColumn get gyroX => real().nullable()(); - RealColumn get gyroY => real().nullable()(); - RealColumn get gyroZ => real().nullable()(); - RealColumn get roll => real().nullable()(); - RealColumn get pitch => real().nullable()(); - RealColumn get longitudinalG => real().nullable()(); - RealColumn get lateralG => real().nullable()(); - RealColumn get filteredLongitudinalG => real().nullable()(); - RealColumn get filteredLateralG => real().nullable()(); + RealColumn get rideQualityScore => real().withDefault(const Constant(100.0))(); + TextColumn get rideQualityRating => text().withDefault(const Constant('EXCELLENT'))(); + TextColumn get summaryJson => text().nullable()(); }