83 lines
2.2 KiB
Dart
83 lines
2.2 KiB
Dart
import 'dart:async';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
enum ElectricalHealthStatus {
|
|
normal,
|
|
lowVoltageWarning,
|
|
overchargingWarning,
|
|
chargingSystemAnomaly,
|
|
disconnected,
|
|
}
|
|
|
|
class ElectricalTelemetry {
|
|
final DateTime timestamp;
|
|
final double batteryVoltage; // Volts (e.g. 12.6V resting, 14.2V charging)
|
|
final double? chargingCurrent; // Amps (if sensor supported)
|
|
final ElectricalHealthStatus healthStatus;
|
|
final String? diagnosticMessage;
|
|
|
|
const ElectricalTelemetry({
|
|
required this.timestamp,
|
|
required this.batteryVoltage,
|
|
this.chargingCurrent,
|
|
required this.healthStatus,
|
|
this.diagnosticMessage,
|
|
});
|
|
|
|
bool get isCharging => batteryVoltage >= 13.5;
|
|
bool get isUnderVoltage => batteryVoltage < 11.8;
|
|
bool get isOverVoltage => batteryVoltage > 15.2;
|
|
}
|
|
|
|
abstract class MotorcycleElectricalService {
|
|
Stream<ElectricalTelemetry> get electricalStream;
|
|
ElectricalTelemetry? get latestReading;
|
|
bool get isConnected;
|
|
|
|
Future<bool> connectBleSensor(String deviceAddress);
|
|
Future<void> disconnect();
|
|
}
|
|
|
|
/// Production stub / Mock implementation for pre-sensor readiness
|
|
class MockMotorcycleElectricalService implements MotorcycleElectricalService {
|
|
final _controller = StreamController<ElectricalTelemetry>.broadcast();
|
|
ElectricalTelemetry? _latest;
|
|
bool _connected = false;
|
|
|
|
@override
|
|
Stream<ElectricalTelemetry> get electricalStream => _controller.stream;
|
|
|
|
@override
|
|
ElectricalTelemetry? get latestReading => _latest;
|
|
|
|
@override
|
|
bool get isConnected => _connected;
|
|
|
|
@override
|
|
Future<bool> connectBleSensor(String deviceAddress) async {
|
|
_connected = true;
|
|
_latest = ElectricalTelemetry(
|
|
timestamp: DateTime.now(),
|
|
batteryVoltage: 14.2,
|
|
healthStatus: ElectricalHealthStatus.normal,
|
|
diagnosticMessage: 'Regulator/Rectifier active (14.2V nominal charging)',
|
|
);
|
|
_controller.add(_latest!);
|
|
return true;
|
|
}
|
|
|
|
@override
|
|
Future<void> disconnect() async {
|
|
_connected = false;
|
|
_latest = null;
|
|
}
|
|
|
|
void dispose() {
|
|
_controller.close();
|
|
}
|
|
}
|
|
|
|
final motorcycleElectricalServiceProvider = Provider<MotorcycleElectricalService>((ref) {
|
|
return MockMotorcycleElectricalService();
|
|
});
|