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