diff options
Diffstat (limited to 'lib/data')
-rw-r--r-- | lib/data/data_providers/app_provider.dart | 6 | ||||
-rw-r--r-- | lib/data/data_providers/audio_notifier.dart | 24 | ||||
-rw-r--r-- | lib/data/data_providers/units_notifier.dart | 65 | ||||
-rw-r--r-- | lib/data/data_providers/val_client.dart | 47 | ||||
-rw-r--r-- | lib/data/data_providers/vehicle_notifier.dart | 87 | ||||
-rw-r--r-- | lib/data/models/units.dart | 17 | ||||
-rw-r--r-- | lib/data/models/vehicle.dart | 16 |
7 files changed, 177 insertions, 85 deletions
diff --git a/lib/data/data_providers/app_provider.dart b/lib/data/data_providers/app_provider.dart index 3d00d4c..ee6d29e 100644 --- a/lib/data/data_providers/app_provider.dart +++ b/lib/data/data_providers/app_provider.dart @@ -40,6 +40,7 @@ enum AppState { weather, distanceUnit, tempUnit, + pressureUnit, clock, date, time, @@ -78,9 +79,8 @@ final signalsProvider = StateNotifierProvider<SignalNotifier, Signals>((ref) { return SignalNotifier(const Signals.initial()); }); -final unitStateProvider = StateNotifierProvider<UnitsNotifier, Units>((ref) { - return UnitsNotifier(const Units.initial()); -}); +final unitStateProvider = + NotifierProvider<UnitsNotifier, Units>(UnitsNotifier.new); final audioStateProvider = NotifierProvider<AudioStateNotifier, AudioState>(AudioStateNotifier.new); diff --git a/lib/data/data_providers/audio_notifier.dart b/lib/data/data_providers/audio_notifier.dart index a601095..76b34a7 100644 --- a/lib/data/data_providers/audio_notifier.dart +++ b/lib/data/data_providers/audio_notifier.dart @@ -36,36 +36,36 @@ class AudioStateNotifier extends Notifier<AudioState> { ); } - bool handleSignalsUpdate(EntryUpdate update) { + bool handleSignalUpdate(DataEntry entry) { bool handled = true; - switch (update.entry.path) { + switch (entry.path) { case VSSPath.vehicleMediaVolume: - if (update.entry.value.hasUint32()) { - double value = update.entry.value.uint32.toDouble(); + if (entry.value.hasUint32()) { + double value = entry.value.uint32.toDouble(); state = state.copyWith(volume: value); } break; case VSSPath.vehicleMediaBalance: - if (update.entry.value.hasInt32()) { - double value = (update.entry.value.int32 + 100) / 20.0; + if (entry.value.hasInt32()) { + double value = (entry.value.int32 + 100) / 20.0; state = state.copyWith(balance: value); } break; case VSSPath.vehicleMediaFade: - if (update.entry.value.hasInt32()) { - double value = (update.entry.value.int32 + 100) / 20.0; + if (entry.value.hasInt32()) { + double value = (entry.value.int32 + 100) / 20.0; state = state.copyWith(fade: value); } break; case VSSPath.vehicleMediaTreble: - if (update.entry.value.hasInt32()) { - double value = (update.entry.value.int32 + 100) / 20.0; + if (entry.value.hasInt32()) { + double value = (entry.value.int32 + 100) / 20.0; state = state.copyWith(treble: value); } break; case VSSPath.vehicleMediaBass: - if (update.entry.value.hasInt32()) { - double value = (update.entry.value.int32 + 100) / 20.0; + if (entry.value.hasInt32()) { + double value = (entry.value.int32 + 100) / 20.0; state = state.copyWith(bass: value); } break; diff --git a/lib/data/data_providers/units_notifier.dart b/lib/data/data_providers/units_notifier.dart index f7c25aa..26b79da 100644 --- a/lib/data/data_providers/units_notifier.dart +++ b/lib/data/data_providers/units_notifier.dart @@ -1,13 +1,72 @@ -import '../../export.dart'; +import 'package:flutter_ics_homescreen/export.dart'; +import 'package:protos/val-api.dart'; -class UnitsNotifier extends StateNotifier<Units> { - UnitsNotifier(super.state); +class UnitsNotifier extends Notifier<Units> { + @override + Units build() { + return const Units.initial(); + } + + bool handleSignalUpdate(DataEntry entry) { + bool handled = true; + switch (entry.path) { + case VSSPath.vehicleHmiDistanceUnit: + if (entry.value.hasString()) { + String value = entry.value.string; + DistanceUnit unit = DistanceUnit.kilometers; + if (value != "KILOMETERS") unit = DistanceUnit.miles; + state = state.copyWith(distanceUnit: unit); + } + break; + case VSSPath.vehicleHmiTemperatureUnit: + if (entry.value.hasString()) { + String value = entry.value.string; + TemperatureUnit unit = TemperatureUnit.celsius; + if (value != "C") unit = TemperatureUnit.fahrenheit; + state = state.copyWith(temperatureUnit: unit); + } + break; + case VSSPath.vehicleHmiPressureUnit: + if (entry.value.hasString()) { + String value = entry.value.string; + PressureUnit unit = PressureUnit.kilopascals; + if (value != "KPA") unit = PressureUnit.psi; + state = state.copyWith(pressureUnit: unit); + } + break; + default: + handled = false; + } + return handled; + } void setDistanceUnit(DistanceUnit unit) { state = state.copyWith(distanceUnit: unit); + var valClient = ref.read(valClientProvider); + valClient.setString( + VSSPath.vehicleHmiDistanceUnit, + unit == DistanceUnit.kilometers ? "KILOMETERS" : "MILES", + true, + ); } void setTemperatureUnit(TemperatureUnit unit) { state = state.copyWith(temperatureUnit: unit); + var valClient = ref.read(valClientProvider); + valClient.setString( + VSSPath.vehicleHmiTemperatureUnit, + unit == TemperatureUnit.celsius ? "C" : "F", + true, + ); + } + + void setPressureUnit(PressureUnit unit) { + state = state.copyWith(pressureUnit: unit); + var valClient = ref.read(valClientProvider); + valClient.setString( + VSSPath.vehicleHmiPressureUnit, + unit == PressureUnit.kilopascals ? "KPA" : "PSI", + true, + ); } } diff --git a/lib/data/data_providers/val_client.dart b/lib/data/data_providers/val_client.dart index db962ee..5e7339c 100644 --- a/lib/data/data_providers/val_client.dart +++ b/lib/data/data_providers/val_client.dart @@ -29,15 +29,21 @@ class ValClient { } void run() async { - List<String> fewSignals = VSSPath().getSignalsList(); - var request = SubscribeRequest(); + List<String> signals = VSSPath().getSignalsList(); Map<String, String> metadata = {}; if (config.authorization.isNotEmpty) { metadata = {'authorization': "Bearer ${config.authorization}"}; } - for (int i = 0; i < fewSignals.length; i++) { + + // Initialize signal states + for (int i = 0; i < signals.length; i++) { + get(signals[i]); + } + + var request = SubscribeRequest(); + for (int i = 0; i < signals.length; i++) { var entry = SubscribeEntry(); - entry.path = fewSignals[i]; + entry.path = signals[i]; entry.fields.add(Field.FIELD_PATH); entry.fields.add(Field.FIELD_VALUE); request.entries.add(entry); @@ -48,7 +54,7 @@ class ValClient { responseStream.listen((value) async { for (var update in value.updates) { if (!(update.hasEntry() && update.entry.hasPath())) continue; - handleSignalsUpdate(update); + handleSignalUpdate(update.entry); } }, onError: (stacktrace, errorDescriptor) { debugPrint(stacktrace.toString()); @@ -58,11 +64,14 @@ class ValClient { } } - bool handleSignalsUpdate(EntryUpdate update) { - if (ref.read(vehicleProvider.notifier).handleSignalsUpdate(update)) { + bool handleSignalUpdate(DataEntry entry) { + if (ref.read(vehicleProvider.notifier).handleSignalUpdate(entry)) { + return true; + } + if (ref.read(audioStateProvider.notifier).handleSignalUpdate(entry)) { return true; } - return ref.read(audioStateProvider.notifier).handleSignalsUpdate(update); + return ref.read(unitStateProvider.notifier).handleSignalUpdate(entry); } void setUint32(String path, int value, [bool actuator = true]) async { @@ -114,4 +123,26 @@ class ValClient { } await stub.set(request, options: CallOptions(metadata: metadata)); } + + void get(String path) async { + var entry = EntryRequest()..path = path; + entry.fields.add(Field.FIELD_VALUE); + var request = GetRequest(); + request.entries.add(entry); + Map<String, String> metadata = {}; + if (config.authorization.isNotEmpty) { + metadata = {'authorization': "Bearer ${config.authorization}"}; + } + debugPrint("Getting {path} value"); + var response = + await stub.get(request, options: CallOptions(metadata: metadata)); + if (response.hasError()) { + debugPrint("Get request had error {response.error().reason}"); + return; + } + for (var entry in response.entries) { + if (!entry.hasPath()) continue; + handleSignalUpdate(entry); + } + } } diff --git a/lib/data/data_providers/vehicle_notifier.dart b/lib/data/data_providers/vehicle_notifier.dart index 6fafb8c..fb2de19 100644 --- a/lib/data/data_providers/vehicle_notifier.dart +++ b/lib/data/data_providers/vehicle_notifier.dart @@ -15,99 +15,93 @@ class VehicleNotifier extends Notifier<Vehicle> { state = state.copyWith(speed: newValue); } - bool handleSignalsUpdate(EntryUpdate update) { + bool handleSignalUpdate(DataEntry entry) { bool handled = true; - switch (update.entry.path) { + switch (entry.path) { case VSSPath.vehicleSpeed: - if (update.entry.value.hasFloat()) { - state = state.copyWith(speed: update.entry.value.float); + if (entry.value.hasFloat()) { + state = state.copyWith(speed: entry.value.float); } break; case VSSPath.vehicleInsideTemperature: - if (update.entry.value.hasFloat()) { - state = state.copyWith(insideTemperature: update.entry.value.float); + if (entry.value.hasFloat()) { + state = state.copyWith(insideTemperature: entry.value.float); } break; case VSSPath.vehicleOutsideTemperature: - if (update.entry.value.hasFloat()) { - state = state.copyWith(outsideTemperature: update.entry.value.float); + if (entry.value.hasFloat()) { + state = state.copyWith(outsideTemperature: entry.value.float); } break; case VSSPath.vehicleRange: - if (update.entry.value.hasUint32()) { - state = state.copyWith(range: update.entry.value.uint32); + if (entry.value.hasUint32()) { + state = state.copyWith(range: entry.value.uint32); } break; case VSSPath.vehicleFuelLevel: - if (update.entry.value.hasUint32()) { - state = state.copyWith(fuelLevel: update.entry.value.uint32); + if (entry.value.hasUint32()) { + state = state.copyWith(fuelLevel: entry.value.uint32); } break; case VSSPath.vehicleIsChildLockActiveLeft: - if (update.entry.value.hasBool_12()) { - state = - state.copyWith(isChildLockActiveLeft: update.entry.value.bool_12); + if (entry.value.hasBool_12()) { + state = state.copyWith(isChildLockActiveLeft: entry.value.bool_12); } break; case VSSPath.vehicleIsChildLockActiveRight: - if (update.entry.value.hasBool_12()) { - state = state.copyWith( - isChildLockActiveRight: update.entry.value.bool_12); + if (entry.value.hasBool_12()) { + state = state.copyWith(isChildLockActiveRight: entry.value.bool_12); } break; case VSSPath.vehicleEngineSpeed: - if (update.entry.value.hasFloat()) { - state = state.copyWith(engineSpeed: update.entry.value.float); + if (entry.value.hasFloat()) { + state = state.copyWith(engineSpeed: entry.value.float); } break; case VSSPath.vehicleFrontLeftTire: - if (update.entry.value.hasUint32()) { - state = state.copyWith(frontLeftTire: update.entry.value.uint32); + if (entry.value.hasUint32()) { + state = state.copyWith(frontLeftTire: entry.value.uint32); } break; case VSSPath.vehicleFrontRightTire: - if (update.entry.value.hasUint32()) { - state = state.copyWith(frontRightTire: update.entry.value.uint32); + if (entry.value.hasUint32()) { + state = state.copyWith(frontRightTire: entry.value.uint32); } break; case VSSPath.vehicleRearLeftTire: - if (update.entry.value.hasUint32()) { - state = state.copyWith(rearLeftTire: update.entry.value.uint32); + if (entry.value.hasUint32()) { + state = state.copyWith(rearLeftTire: entry.value.uint32); } break; case VSSPath.vehicleRearRightTire: - if (update.entry.value.hasUint32()) { - state = state.copyWith(rearRightTire: update.entry.value.uint32); + if (entry.value.hasUint32()) { + state = state.copyWith(rearRightTire: entry.value.uint32); } break; case VSSPath.vehicleIsAirConditioningActive: - if (update.entry.value.hasBool_12()) { - state = state.copyWith( - isAirConditioningActive: update.entry.value.bool_12); + if (entry.value.hasBool_12()) { + state = state.copyWith(isAirConditioningActive: entry.value.bool_12); } break; case VSSPath.vehicleIsFrontDefrosterActive: - if (update.entry.value.hasBool_12()) { - state = state.copyWith( - isFrontDefrosterActive: update.entry.value.bool_12); + if (entry.value.hasBool_12()) { + state = state.copyWith(isFrontDefrosterActive: entry.value.bool_12); } break; case VSSPath.vehicleIsRearDefrosterActive: - if (update.entry.value.hasBool_12()) { - state = - state.copyWith(isRearDefrosterActive: update.entry.value.bool_12); + if (entry.value.hasBool_12()) { + state = state.copyWith(isRearDefrosterActive: entry.value.bool_12); } break; case VSSPath.vehicleIsRecirculationActive: - if (update.entry.value.hasBool_12()) { - state = - state.copyWith(isRecirculationActive: update.entry.value.bool_12); + if (entry.value.hasBool_12()) { + state = state.copyWith(isRecirculationActive: entry.value.bool_12); } break; case VSSPath.vehicleFanSpeed: - if (update.entry.value.hasUint32()) { + if (entry.value.hasUint32()) { // Convert 0-100 to local 0-3 setting - var value = update.entry.value.uint32; + var value = entry.value.uint32; var fanSpeed = 0; if (value > 66) fanSpeed = 3; @@ -118,14 +112,13 @@ class VehicleNotifier extends Notifier<Vehicle> { } break; case VSSPath.vehicleDriverTemperature: - if (update.entry.value.hasInt32()) { - state = state.copyWith(driverTemperature: update.entry.value.int32); + if (entry.value.hasInt32()) { + state = state.copyWith(driverTemperature: entry.value.int32); } break; case VSSPath.vehiclePassengerTemperature: - if (update.entry.value.hasInt32()) { - state = - state.copyWith(passengerTemperature: update.entry.value.int32); + if (entry.value.hasInt32()) { + state = state.copyWith(passengerTemperature: entry.value.int32); } break; default: diff --git a/lib/data/models/units.dart b/lib/data/models/units.dart index 9e71213..c299a12 100644 --- a/lib/data/models/units.dart +++ b/lib/data/models/units.dart @@ -4,32 +4,39 @@ enum DistanceUnit { kilometers, miles } enum TemperatureUnit { celsius, fahrenheit } +enum PressureUnit { kilopascals, psi } + @immutable class Units { final DistanceUnit distanceUnit; final TemperatureUnit temperatureUnit; + final PressureUnit pressureUnit; const Units( this.distanceUnit, this.temperatureUnit, + this.pressureUnit, ); const Units.initial() : distanceUnit = DistanceUnit.kilometers, - temperatureUnit = TemperatureUnit.celsius; + temperatureUnit = TemperatureUnit.celsius, + pressureUnit = PressureUnit.kilopascals; Units copyWith({ DistanceUnit? distanceUnit, TemperatureUnit? temperatureUnit, + PressureUnit? pressureUnit, }) { return Units( distanceUnit ?? this.distanceUnit, temperatureUnit ?? this.temperatureUnit, + pressureUnit ?? this.pressureUnit, ); } @override String toString() => - 'Units(distanceUnit: $distanceUnit, temperatureUnit: $temperatureUnit)'; + 'Units(distanceUnit: $distanceUnit, temperatureUnit: $temperatureUnit, pressureUnit: $pressureUnit)'; @override bool operator ==(Object other) { @@ -37,9 +44,11 @@ class Units { return other is Units && other.distanceUnit == distanceUnit && - other.temperatureUnit == temperatureUnit; + other.temperatureUnit == temperatureUnit && + other.pressureUnit == pressureUnit; } @override - int get hashCode => distanceUnit.hashCode ^ temperatureUnit.hashCode; + int get hashCode => + distanceUnit.hashCode ^ temperatureUnit.hashCode ^ pressureUnit.hashCode; } diff --git a/lib/data/models/vehicle.dart b/lib/data/models/vehicle.dart index ad76620..dfeae05 100644 --- a/lib/data/models/vehicle.dart +++ b/lib/data/models/vehicle.dart @@ -57,10 +57,10 @@ class Vehicle { fuelLevel = 0, isChildLockActiveLeft = false, isChildLockActiveRight = true, - frontLeftTire = 33, - frontRightTire = 31, - rearLeftTire = 31, - rearRightTire = 32, + frontLeftTire = 228, + frontRightTire = 214, + rearLeftTire = 214, + rearRightTire = 221, isAirConditioningActive = false, isFrontDefrosterActive = false, isRearDefrosterActive = false, @@ -79,10 +79,10 @@ class Vehicle { fuelLevel = 49, isChildLockActiveLeft = false, isChildLockActiveRight = true, - frontLeftTire = 33, - frontRightTire = 31, - rearLeftTire = 31, - rearRightTire = 32, + frontLeftTire = 228, + frontRightTire = 214, + rearLeftTire = 214, + rearRightTire = 221, isAirConditioningActive = false, isFrontDefrosterActive = false, isRearDefrosterActive = false, |