diff options
Diffstat (limited to 'lib/vehicle-signals/vss_provider.dart')
-rw-r--r-- | lib/vehicle-signals/vss_provider.dart | 147 |
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); +}); |