diff options
-rw-r--r-- | lib/core/constants/vss_path.dart | 6 | ||||
-rw-r--r-- | lib/data/data_providers/vehicle_notifier.dart | 10 | ||||
-rw-r--r-- | lib/data/models/vehicle.dart | 52 | ||||
-rw-r--r-- | lib/presentation/screens/hvac/hvac_content.dart | 41 | ||||
-rw-r--r-- | lib/presentation/screens/hvac/widgets/fan_speed_controls.dart | 3 | ||||
-rw-r--r-- | lib/presentation/screens/hvac/widgets/temperature_control.dart | 70 |
6 files changed, 97 insertions, 85 deletions
diff --git a/lib/core/constants/vss_path.dart b/lib/core/constants/vss_path.dart index 2147b75..99f3d60 100644 --- a/lib/core/constants/vss_path.dart +++ b/lib/core/constants/vss_path.dart @@ -1,5 +1,7 @@ class VSSPath { static const String vehicleSpeed = 'Vehicle.Speed'; + static const String vehicleEngineSpeed = + 'Vehicle.Powertrain.CombustionEngine.Speed'; static const String vehicleInsideTemperature = 'Vehicle.Cabin.HVAC.AmbientAirTemperature'; static const String vehicleOutsideTemperature = @@ -13,8 +15,6 @@ class VSSPath { 'Vehicle.Cabin.Door.Row2.DriverSide.IsChildLockActive'; static const String vehicleIsChildLockActiveRight = 'Vehicle.Cabin.Door.Row2.PassengerSide.IsChildLockActive'; - static const String vehicleEngineSpeed = - 'Vehicle.Powertrain.CombustionEngine.Speed'; static const String vehicleFrontLeftTire = 'Vehicle.Chassis.Axle.Row1.Wheel.Left.Tire.Pressure'; static const String vehicleFrontRightTire = @@ -41,6 +41,7 @@ class VSSPath { List<String> getSignalsList() { return const [ vehicleSpeed, + vehicleEngineSpeed, vehicleInsideTemperature, vehicleOutsideTemperature, vehicleRange, @@ -48,7 +49,6 @@ class VSSPath { vehicleMediaVolume, vehicleIsChildLockActiveLeft, vehicleIsChildLockActiveRight, - vehicleEngineSpeed, vehicleFrontLeftTire, vehicleFrontRightTire, vehicleRearLeftTire, diff --git a/lib/data/data_providers/vehicle_notifier.dart b/lib/data/data_providers/vehicle_notifier.dart index 1b2a31a..3a385a3 100644 --- a/lib/data/data_providers/vehicle_notifier.dart +++ b/lib/data/data_providers/vehicle_notifier.dart @@ -352,7 +352,7 @@ class VehicleNotifier extends StateNotifier<Vehicle> { isChildLockActiveRight: !state.isChildLockActiveRight); break; default: - debugPrint("ERROR: Unexpected side value $side}"); + debugPrint("ERROR: Unexpected side value ${side}"); break; } } catch (e) { @@ -391,7 +391,7 @@ class VehicleNotifier extends StateNotifier<Vehicle> { state = state.copyWith(passengerTemperature: value); break; default: - debugPrint("ERROR: Unexpected side value $side}"); + debugPrint("ERROR: Unexpected side value ${side}"); break; } } catch (e) { @@ -399,6 +399,10 @@ class VehicleNotifier extends StateNotifier<Vehicle> { } } + void setTemperatureSynced(bool newValue) { + state = state.copyWith(temperatureSynced: newValue); + } + void updateFanSpeed(int newValue) { // Convert local 0-3 setting to the 0-100 the VSS signal expects var targetFanSpeed = 0; @@ -465,7 +469,7 @@ class VehicleNotifier extends StateNotifier<Vehicle> { isRecirculationActive: !state.isRecirculationActive); break; default: - debugPrint("ERROR: Unexpected mode value $mode}"); + debugPrint("ERROR: Unexpected mode value ${mode}"); break; } } catch (e) { diff --git a/lib/data/models/vehicle.dart b/lib/data/models/vehicle.dart index 67ef693..2dea928 100644 --- a/lib/data/models/vehicle.dart +++ b/lib/data/models/vehicle.dart @@ -5,6 +5,7 @@ import '../../export.dart'; @immutable class Vehicle { final double speed; + final double engineSpeed; final double insideTemperature; final double outsideTemperature; final int range; @@ -12,7 +13,6 @@ class Vehicle { final int mediaVolume; final bool isChildLockActiveLeft; final bool isChildLockActiveRight; - final double engineSpeed; final int frontLeftTire; final int frontRightTire; final int rearLeftTire; @@ -24,9 +24,11 @@ class Vehicle { final int fanSpeed; final int driverTemperature; final int passengerTemperature; + final bool temperatureSynced; const Vehicle( this.speed, + this.engineSpeed, this.insideTemperature, this.outsideTemperature, this.range, @@ -34,7 +36,6 @@ class Vehicle { this.mediaVolume, this.isChildLockActiveLeft, this.isChildLockActiveRight, - this.engineSpeed, this.frontLeftTire, this.frontRightTire, this.rearLeftTire, @@ -43,13 +44,15 @@ class Vehicle { this.isFrontDefrosterActive, this.isRearDefrosterActive, this.isRecirculationActive, - this.fanSpeed, - this.driverTemperature, - this.passengerTemperature, + this.fanSpeed, + this.driverTemperature, + this.passengerTemperature, + this.temperatureSynced, ); const Vehicle.initial() : speed = 0, + engineSpeed = 0, insideTemperature = 0, outsideTemperature = 0, range = 0, @@ -57,7 +60,6 @@ class Vehicle { mediaVolume = 50, isChildLockActiveLeft = false, isChildLockActiveRight = true, - engineSpeed = 0, frontLeftTire = 33, frontRightTire = 31, rearLeftTire = 31, @@ -68,10 +70,12 @@ class Vehicle { isRecirculationActive = false, fanSpeed = 0, driverTemperature = 26, - passengerTemperature = 26; + passengerTemperature = 26, + temperatureSynced = true; const Vehicle.initialForDebug() : speed = 60, + engineSpeed = 6500, insideTemperature = 25, outsideTemperature = 32.0, range = 21, @@ -79,7 +83,6 @@ class Vehicle { mediaVolume = 50, isChildLockActiveLeft = false, isChildLockActiveRight = true, - engineSpeed = 6500, frontLeftTire = 33, frontRightTire = 31, rearLeftTire = 31, @@ -90,10 +93,12 @@ class Vehicle { isRecirculationActive = false, fanSpeed = 0, driverTemperature = 26, - passengerTemperature = 26; + passengerTemperature = 26, + temperatureSynced = true; Vehicle copyWith( {double? speed, + double? engineSpeed, double? insideTemperature, double? outsideTemperature, int? range, @@ -101,7 +106,6 @@ class Vehicle { int? mediaVolume, bool? isChildLockActiveLeft, bool? isChildLockActiveRight, - double? engineSpeed, int? frontLeftTire, int? frontRightTire, int? rearLeftTire, @@ -110,12 +114,14 @@ class Vehicle { bool? isFrontDefrosterActive, bool? isRearDefrosterActive, bool? isRecirculationActive, - int? fanSpeed, - int? driverTemperature, - int? passengerTemperature, + int? fanSpeed, + int? driverTemperature, + int? passengerTemperature, + bool? temperatureSynced, }) { return Vehicle( speed ?? this.speed, + engineSpeed ?? this.engineSpeed, insideTemperature ?? this.insideTemperature, outsideTemperature ?? this.outsideTemperature, range ?? this.range, @@ -123,7 +129,6 @@ class Vehicle { mediaVolume ?? this.mediaVolume, isChildLockActiveLeft ?? this.isChildLockActiveLeft, isChildLockActiveRight ?? this.isChildLockActiveRight, - engineSpeed ?? this.engineSpeed, frontLeftTire ?? this.frontLeftTire, frontRightTire ?? this.frontRightTire, rearLeftTire ?? this.rearLeftTire, @@ -132,15 +137,17 @@ class Vehicle { isFrontDefrosterActive ?? this.isFrontDefrosterActive, isRearDefrosterActive ?? this.isRearDefrosterActive, isRecirculationActive ?? this.isRecirculationActive, - fanSpeed ?? this.fanSpeed, - driverTemperature ?? this.driverTemperature, - passengerTemperature ?? this.passengerTemperature, + fanSpeed ?? this.fanSpeed, + driverTemperature ?? this.driverTemperature, + passengerTemperature ?? this.passengerTemperature, + temperatureSynced ?? this.temperatureSynced, ); } Map<String, dynamic> toMap() { return { 'speed': speed, + 'engineSpeed': engineSpeed, 'insideTemperature': insideTemperature, 'outsideTemperature': outsideTemperature, 'range': range, @@ -148,7 +155,6 @@ class Vehicle { 'mediaVolume': mediaVolume, 'isChildLockActiveLeft': isChildLockActiveLeft, 'isChildLockActiveRight': isChildLockActiveRight, - 'engineSpeed': engineSpeed, 'frontLeftTire': frontLeftTire, 'frontRightTire': frontRightTire, 'rearLeftTire': rearLeftTire, @@ -160,12 +166,14 @@ class Vehicle { 'fanSpeed': fanSpeed, 'driverTemperature': driverTemperature, 'passengerTemperature': passengerTemperature, + 'temperatureSynced': temperatureSynced, }; } factory Vehicle.fromMap(Map<String, dynamic> map) { return Vehicle( map['speed']?.toDouble() ?? 0.0, + map['engineSpeed']?.toDouble() ?? 0.0, map['insideTemperature']?.toDouble() ?? 0.0, map['outsideTemperature']?.toDouble() ?? 0.0, map['range']?.toInt() ?? 0, @@ -173,7 +181,6 @@ class Vehicle { map['mediaVolume']?.toInt() ?? 0, map['isChildLockActiveLeft'] ?? false, map['isChildLockActiveRight'] ?? false, - map['engineSpeed']?.toInt() ?? 0, map['frontLeftTire']?.toInt() ?? 0, map['frontRightTire']?.toInt() ?? 0, map['rearLeftTire']?.toInt() ?? 0, @@ -185,6 +192,7 @@ class Vehicle { map['fanSpeed'] ?? 0, map['driverTemperature'] ?? 0, map['passengerTemperature'] ?? 0, + map['temperatureSynced'] ?? false, ); } @@ -222,7 +230,8 @@ class Vehicle { other.isRecirculationActive == isRecirculationActive && other.fanSpeed == fanSpeed && other.driverTemperature == driverTemperature && - other.passengerTemperature == passengerTemperature; + other.passengerTemperature == passengerTemperature && + other.temperatureSynced == temperatureSynced; } @override @@ -246,7 +255,8 @@ class Vehicle { isRecirculationActive.hashCode ^ fanSpeed.hashCode ^ driverTemperature.hashCode ^ - passengerTemperature.hashCode; + passengerTemperature.hashCode ^ + temperatureSynced.hashCode; } // } // / class VehicleNotifier extends StateNotifier<Vehicle> { diff --git a/lib/presentation/screens/hvac/hvac_content.dart b/lib/presentation/screens/hvac/hvac_content.dart index 73fd439..e541efd 100644 --- a/lib/presentation/screens/hvac/hvac_content.dart +++ b/lib/presentation/screens/hvac/hvac_content.dart @@ -13,15 +13,8 @@ class HVACState extends ConsumerState<HVAC> { bool isFanFocusLeftBottomSelected = true; bool isFanFocusRightBottomSelected = false; - late bool isACSelected; - bool isSYNCSelected = true; - late bool isFrontDefrostSelected; bool isAutoSelected = true; - late bool isRecirculationSelected; - late bool isRearDefrostSelected; - int temperatureLeft = 26; - int temperatureRight = 26; @override void initState() { super.initState(); @@ -52,14 +45,12 @@ class HVACState extends ConsumerState<HVAC> { @override Widget build(BuildContext context) { - final vehicle = ref.watch(vehicleProvider.select((vehicle) => vehicle)); - isACSelected = vehicle.isAirConditioningActive; - isFrontDefrostSelected = vehicle.isFrontDefrosterActive; - isRearDefrostSelected = vehicle.isRearDefrosterActive; - isRecirculationSelected = vehicle.isRecirculationActive; + bool isACSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.isAirConditioningActive)); + bool isFrontDefrostSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.isFrontDefrosterActive)); + bool isRearDefrostSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.isRearDefrosterActive)); + bool isRecirculationSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.isRecirculationActive)); + bool isSYNCSelected = ref.watch(vehicleProvider.select((vehicle) => vehicle.temperatureSynced)); Size size = MediaQuery.sizeOf(context); - temperatureLeft = vehicle.driverTemperature; - temperatureRight = vehicle.passengerTemperature; return Column( crossAxisAlignment: CrossAxisAlignment.stretch, @@ -155,14 +146,8 @@ class HVACState extends ConsumerState<HVAC> { Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - TemperatureControl( - temperature: temperatureLeft, - side: Side.left, - ), - TemperatureControl( - temperature: temperatureRight, - side: Side.right, - ) + TemperatureControl(side: Side.left), + TemperatureControl(side: Side.right) ], ), const SizedBox( @@ -190,9 +175,15 @@ class HVACState extends ConsumerState<HVAC> { )), ClimateControls( onPressed: () { - setState(() { - isSYNCSelected = !isSYNCSelected; - }); + if (!isSYNCSelected) { + int temperature = ref.read(vehicleProvider.select((vehicle) => vehicle.driverTemperature)); + ref + .read(vehicleProvider.notifier) + .setTemperature(side: Side.right, value: temperature); + } + ref + .read(vehicleProvider.notifier) + .setTemperatureSynced(!isSYNCSelected); }, isSelected: isSYNCSelected, child: Text( diff --git a/lib/presentation/screens/hvac/widgets/fan_speed_controls.dart b/lib/presentation/screens/hvac/widgets/fan_speed_controls.dart index ac813ca..e9a9719 100644 --- a/lib/presentation/screens/hvac/widgets/fan_speed_controls.dart +++ b/lib/presentation/screens/hvac/widgets/fan_speed_controls.dart @@ -69,8 +69,7 @@ class FanSpeedControlsState extends ConsumerState<FanSpeedControls> double iconSize = 80; - final vehicle = ref.watch(vehicleProvider.select((vehicle) => vehicle)); - selectedFanSpeed = vehicle.fanSpeed; + int selectedFanSpeed = ref.watch(vehicleProvider.select((vehicle) => vehicle.fanSpeed)); controlProgress = selectedFanSpeed * 0.3; return Stack( diff --git a/lib/presentation/screens/hvac/widgets/temperature_control.dart b/lib/presentation/screens/hvac/widgets/temperature_control.dart index 77d6dbc..31875ca 100644 --- a/lib/presentation/screens/hvac/widgets/temperature_control.dart +++ b/lib/presentation/screens/hvac/widgets/temperature_control.dart @@ -6,8 +6,7 @@ enum Side { left, right } class TemperatureControl extends ConsumerStatefulWidget { const TemperatureControl( - {super.key, required this.temperature, required this.side}); - final int temperature; + {super.key, required this.side}); final Side side; @override @@ -16,48 +15,57 @@ class TemperatureControl extends ConsumerStatefulWidget { class TemperatureControlState extends ConsumerState<TemperatureControl> { late Timer tempButtonTimer; - int temperature = 0; bool isUpButtonHighlighted = false; bool isDownButtonHighlighted = false; - @override - void initState() { - super.initState(); - setState(() { - temperature = widget.temperature; - }); - } - onPressed({required String type, required Side side}) { - setState(() { - if (type == "add") { - temperature = temperature + 1; - } else if (type == "subtract") { - temperature = temperature - 1; - } - // limit the temperature to 60-100F - if (temperature <= 15) { - temperature = 15; - } else if (temperature >= 38) { - temperature = 38; - } - if (widget.side == Side.left) { + int temperature = 0; + if (side == Side.left) { + temperature = ref.read(vehicleProvider.select((vehicle) => vehicle.driverTemperature)); + } else { + temperature = ref.read(vehicleProvider.select((vehicle) => vehicle.passengerTemperature)); + } + if (type == "add") { + temperature = temperature + 1; + } else if (type == "subtract") { + temperature = temperature - 1; + } + // limit the temperature to 60-100F + if (temperature <= 15) { + temperature = 15; + } else if (temperature >= 38) { + temperature = 38; + } + bool isSynced = ref.read(vehicleProvider.select((vehicle) => vehicle.temperatureSynced)); + if (widget.side == Side.left) { + ref + .read(vehicleProvider.notifier) + .setTemperature(side: Side.left, value: temperature); + if (isSynced) { ref .read(vehicleProvider.notifier) - .setTemperature(side: Side.left, value: temperature); - } else { + .setTemperature(side: Side.right, value: temperature); + } + } else { + if (isSynced) { ref .read(vehicleProvider.notifier) - .setTemperature(side: Side.right, value: temperature); + .setTemperatureSynced(false); } - }); + ref + .read(vehicleProvider.notifier) + .setTemperature(side: Side.right, value: temperature); + } } @override Widget build(BuildContext context) { - //final temperature = ref.watch(vehicleProvider.select((vehicle) => vehicle)); - // final outsideTemperature = ref - // .watch(vehicleProvider.select((vehicle) => vehicle.outsideTemperature)); + int temperature = 0; + if (widget.side == Side.left) { + temperature = ref.watch(vehicleProvider.select((vehicle) => vehicle.driverTemperature)); + } else { + temperature = ref.watch(vehicleProvider.select((vehicle) => vehicle.passengerTemperature)); + } final tempUnit = ref.watch(unitStateProvider.select((unit) => unit.temperatureUnit)); |