MotorSignal-App/lib/services/hardware/motorcycle_electrical_servi...

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();
});