summaryrefslogtreecommitdiffstats
path: root/lib/vehicle-signals/vss_provider.dart
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vehicle-signals/vss_provider.dart')
-rw-r--r--lib/vehicle-signals/vss_provider.dart147
1 files changed, 147 insertions, 0 deletions
diff --git a/lib/vehicle-signals/vss_provider.dart b/lib/vehicle-signals/vss_provider.dart
new file mode 100644
index 0000000..c3724ca
--- /dev/null
+++ b/lib/vehicle-signals/vss_provider.dart
@@ -0,0 +1,147 @@
+// SPDX-License-Identifier: Apache-2.0
+import 'dart:io';
+import 'package:meta/meta.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:grpc/grpc.dart';
+import 'package:dashboard_app/generated/kuksa/val/v1/val.pbgrpc.dart';
+import 'package:dashboard_app/generated/kuksa/val/v1/types.pb.dart';
+import 'package:dashboard_app/config.dart';
+import 'package:dashboard_app/vehicle-signals/vss_client.dart';
+import 'package:dashboard_app/vehicle-signals/vss_path.dart';
+import 'package:dashboard_app/vehicle-signals/vss_signal_providers.dart';
+
+class DashboardVssClient extends VssClient {
+ @override
+ final List<String> signals = [
+ VSSPath.vehicleSpeed,
+ VSSPath.vehicleEngineSpeed,
+ VSSPath.vehicleFuelLevel,
+ VSSPath.vehicleFrontLeftTire,
+ VSSPath.vehicleFrontRightTire,
+ VSSPath.vehicleRearLeftTire,
+ VSSPath.vehicleRearRightTire,
+ VSSPath.vehicleIsChildLockActiveLeft,
+ VSSPath.vehicleIsChildLockActiveRight,
+ VSSPath.vehicleFuelRate,
+ VSSPath.vehicleInsideTemperature,
+ VSSPath.vehicleOutsideTemperature
+ ];
+
+ DashboardVssClient({required super.config, required super.channel, required super.stub, required super.ref});
+
+ @override
+ void handleSignalUpdates(EntryUpdate update) {
+ switch (update.entry.path) {
+ case VSSPath.vehicleSpeed:
+ if (update.entry.value.hasFloat()) {
+ ref
+ .read(vehicleSignalSpeedProvider.notifier)
+ .update(speed: update.entry.value.float);
+ }
+ break;
+ case VSSPath.vehicleEngineSpeed:
+ if (update.entry.value.hasFloat()) {
+ ref
+ .read(vehicleSignalEngineSpeedProvider.notifier)
+ .update(speed: update.entry.value.float);
+ }
+ break;
+ case VSSPath.vehicleFuelLevel:
+ if (update.entry.value.hasUint32()) {
+ ref
+ .read(vehicleSignalFuelLevelProvider.notifier)
+ .update(level: update.entry.value.uint32);
+ }
+ break;
+ case VSSPath.vehicleFuelRate:
+ if (update.entry.value.hasFloat()) {
+ ref
+ .read(vehicleSignalFuelRateProvider.notifier)
+ .update(rate: update.entry.value.float);
+ }
+ break;
+ case VSSPath.vehicleFrontLeftTire:
+ if (update.entry.value.hasUint32()) {
+ ref
+ .read(vehicleSignalFrontLeftTirePressureProvider.notifier)
+ .update(pressure: update.entry.value.uint32);
+ }
+ break;
+ case VSSPath.vehicleFrontRightTire:
+ if (update.entry.value.hasUint32()) {
+ ref
+ .read(vehicleSignalFrontRightTirePressureProvider.notifier)
+ .update(pressure: update.entry.value.uint32);
+ }
+ break;
+ case VSSPath.vehicleRearLeftTire:
+ if (update.entry.value.hasUint32()) {
+ ref
+ .read(vehicleSignalRearLeftTirePressureProvider.notifier)
+ .update(pressure: update.entry.value.uint32);
+ }
+ break;
+ case VSSPath.vehicleRearRightTire:
+ if (update.entry.value.hasUint32()) {
+ ref
+ .read(vehicleSignalRearRightTirePressureProvider.notifier)
+ .update(pressure: update.entry.value.uint32);
+ }
+ break;
+ case VSSPath.vehicleIsChildLockActiveLeft:
+ if (update.entry.value.hasBool_12()) {
+ ref
+ .read(vehicleSignalLeftChildLockActiveProvider.notifier)
+ .update(engaged: update.entry.value.bool_12);
+ }
+ break;
+ case VSSPath.vehicleIsChildLockActiveRight:
+ if (update.entry.value.hasBool_12()) {
+ ref
+ .read(vehicleSignalRightChildLockActiveProvider.notifier)
+ .update(engaged: update.entry.value.bool_12);
+ }
+ break;
+ case VSSPath.vehicleInsideTemperature:
+ if (update.entry.value.hasFloat()) {
+ ref
+ .read(vehicleSignalInsideTempProvider.notifier)
+ .update(temp: update.entry.value.float);
+ }
+ break;
+ case VSSPath.vehicleOutsideTemperature:
+ if (update.entry.value.hasFloat()) {
+ ref
+ .read(vehicleSignalOutsideTempProvider.notifier)
+ .update(temp: update.entry.value.float);
+ }
+ break;
+ default:
+ print("ERROR: Unexpected path ${update.entry.path}");
+ break;
+ }
+ }
+}
+
+final vssClientProvider = Provider((ref) {
+ var config = ref.read(kuksaConfigProvider);
+ debugPrint("Using ${config.hostname}:${config.port}");
+ ChannelCredentials creds;
+ if (config.use_tls && config.ca_certificate.isNotEmpty) {
+ print("Using TLS");
+ if (config.tls_server_name.isNotEmpty)
+ creds = ChannelCredentials.secure(certificates: config.ca_certificate, authority: config.tls_server_name);
+ else
+ creds = ChannelCredentials.secure(certificates: config.ca_certificate);
+ } else {
+ creds = ChannelCredentials.insecure();
+ }
+ final channel = ClientChannel(config.hostname,
+ port: config.port,
+ options: ChannelOptions(credentials: creds));
+
+ final stub = VALClient(channel);
+
+ return DashboardVssClient(config: config, channel: channel, stub: stub, ref: ref);
+});