From 24ccb243d4cbba393c2074de8dc20da9f2429582 Mon Sep 17 00:00:00 2001 From: Mohammad Salameh Date: Sun, 3 Mar 2024 16:17:00 +0300 Subject: [PATCH] fixed Universal AC temperature control --- lib/features/devices/bloc/ac/ac_cubit.dart | 28 +-- lib/features/devices/bloc/devices_cubit.dart | 172 ++++++++++++------ lib/features/devices/model/ac_model.dart | 5 + .../widgets/ACs/ac_interface_temp_unit.dart | 1 + .../view/widgets/ACs/ac_temp_widget.dart | 16 +- .../devices/view/widgets/ACs/acs_list.dart | 27 ++- .../view/widgets/ACs/universal_ac_temp.dart | 8 +- 7 files changed, 156 insertions(+), 101 deletions(-) diff --git a/lib/features/devices/bloc/ac/ac_cubit.dart b/lib/features/devices/bloc/ac/ac_cubit.dart index 99b44c0..6d2472c 100644 --- a/lib/features/devices/bloc/ac/ac_cubit.dart +++ b/lib/features/devices/bloc/ac/ac_cubit.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart'; import 'package:syncrow_app/features/devices/model/ac_model.dart'; +import 'package:syncrow_app/features/devices/model/device_model.dart'; part 'ac_state.dart'; @@ -25,30 +26,15 @@ class AcCubit extends Cubit { } void setTempToAll(double temperature) { - for (var element in DevicesCubit.categories[0].devices) { - if (element is ACModel) { - element.temperature = temperature; + for (DeviceModel ac in DevicesCubit.categories[0].devices) { + if (ac is ACModel) { + setACTemp(ac, temperature); } } + universalACTemp = temperature; emit(ACsTempChanged(temperature)); } - void increaseACTemp(int index) { - var device = DevicesCubit.categories[0].devices[index]; - if (device is ACModel) { - device.temperature += 0.5; - emit(ACsTempChanged(device.temperature)); - } - } - - void decreaseACTemp(int index) { - var device = DevicesCubit.categories[0].devices[index]; - if (device is ACModel) { - device.temperature -= 0.5; - emit(ACsTempChanged(device.temperature)); - } - } - void setACTemp(ACModel model, double temp) { model.temperature = temp; emit(ACsTempChanged(temp)); @@ -62,7 +48,5 @@ class AcCubit extends Cubit { return 0.0; // or any default value you prefer } - static double averageTemp = 0; - - /// implement the fan speed and temp mode change + static double universalACTemp = 20; } diff --git a/lib/features/devices/bloc/devices_cubit.dart b/lib/features/devices/bloc/devices_cubit.dart index c8324a5..3106329 100644 --- a/lib/features/devices/bloc/devices_cubit.dart +++ b/lib/features/devices/bloc/devices_cubit.dart @@ -18,62 +18,8 @@ part 'devices_state.dart'; class DevicesCubit extends Cubit { DevicesCubit() : super(DevicesInitial()); - void changeCategorySwitchValue(DevicesCategoryModel category) { - if (category.devicesStatus != null) { - category.devicesStatus = !category.devicesStatus!; - for (var device in category.devices) { - device.status = category.devicesStatus; - } - } else { - category.devicesStatus = true; - for (var device in category.devices) { - device.status = true; - } - } - - emit(CategorySwitchChanged()); - } - static DevicesCubit get(context) => BlocProvider.of(context); - void turnOnOffDevice(DeviceModel device) { - device.status = !device.status!; - DevicesCategoryModel category = - categories.firstWhere((category) => category.devices.contains(device)); - updateDevicesStatus(category); - emit(DeviceSwitchChanged()); - } - - void updateDevicesStatus(DevicesCategoryModel category) { - bool? tempStatus = category.devices[0].status; - for (var ac in category.devices) { - //check if there any ac have a different status than the initial ==> turn off the universal switch - if (ac.status != tempStatus) { - category.devicesStatus = null; - emit(DeviceSwitchChanged()); - return; - } - category.devicesStatus = tempStatus; - emit(DeviceSwitchChanged()); - } - } - - void turnAllDevicesOff(DevicesCategoryModel category) { - for (var device in category.devices) { - device.status = false; - } - updateDevicesStatus(category); - emit(CategorySwitchChanged()); - } - - void turnAllDevicesOn(DevicesCategoryModel category) { - for (var device in category.devices) { - device.status = true; - } - updateDevicesStatus(category); - emit(CategorySwitchChanged()); - } - static List categories = [ DevicesCategoryModel( devices: [ @@ -84,6 +30,7 @@ class DevicesCubit extends Cubit { temperature: 20, fanSpeed: 0, tempMode: 0, + coolTo: 20, type: '', location: '', image: '', @@ -96,6 +43,33 @@ class DevicesCubit extends Cubit { temperature: 20, fanSpeed: 0, tempMode: 0, + coolTo: 20, + type: '', + location: '', + image: '', + timer: null, + ), + ACModel( + name: "Kitchen AC", + id: '2', + status: false, + temperature: 20, + fanSpeed: 0, + tempMode: 0, + coolTo: 20, + type: '', + location: '', + image: '', + timer: null, + ), + ACModel( + name: "Bathroom AC", + id: '3', + status: false, + temperature: 20, + fanSpeed: 0, + tempMode: 0, + coolTo: 20, type: '', location: '', image: '', @@ -133,6 +107,42 @@ class DevicesCubit extends Cubit { location: '', image: '', ), + LightModel( + name: "Kitchen Light", + id: '2', + status: false, + color: 1, + brightness: 60, + lightingMode: 1, + timer: null, + type: '', + location: '', + image: '', + ), + LightModel( + name: "Bathroom Light", + id: '3', + status: false, + color: 3, + brightness: 80, + lightingMode: 1, + timer: null, + type: '', + location: '', + image: '', + ), + LightModel( + name: "Balcony Light", + id: '4', + status: false, + color: 4, + brightness: 100, + lightingMode: 1, + timer: null, + type: '', + location: '', + image: '', + ), ], icon: Assets.iconsLight, name: 'Lights', @@ -178,6 +188,60 @@ class DevicesCubit extends Cubit { return null; } + void changeCategorySwitchValue(DevicesCategoryModel category) { + if (category.devicesStatus != null) { + category.devicesStatus = !category.devicesStatus!; + for (var device in category.devices) { + device.status = category.devicesStatus; + } + } else { + category.devicesStatus = true; + for (var device in category.devices) { + device.status = true; + } + } + + emit(CategorySwitchChanged()); + } + + void turnOnOffDevice(DeviceModel device) { + device.status = !device.status!; + DevicesCategoryModel category = + categories.firstWhere((category) => category.devices.contains(device)); + updateDevicesStatus(category); + emit(DeviceSwitchChanged()); + } + + void updateDevicesStatus(DevicesCategoryModel category) { + bool? tempStatus = category.devices[0].status; + for (var ac in category.devices) { + //check if there any ac have a different status than the initial ==> turn off the universal switch + if (ac.status != tempStatus) { + category.devicesStatus = null; + emit(DeviceSwitchChanged()); + return; + } + category.devicesStatus = tempStatus; + emit(DeviceSwitchChanged()); + } + } + + void turnAllDevicesOff(DevicesCategoryModel category) { + for (var device in category.devices) { + device.status = false; + } + updateDevicesStatus(category); + emit(CategorySwitchChanged()); + } + + void turnAllDevicesOn(DevicesCategoryModel category) { + for (var device in category.devices) { + device.status = true; + } + updateDevicesStatus(category); + emit(CategorySwitchChanged()); + } + void areAllDevicesOff(DevicesCategoryModel category) { for (var device in category.devices) { if (device.status ?? false) { diff --git a/lib/features/devices/model/ac_model.dart b/lib/features/devices/model/ac_model.dart index db012e8..e81b234 100644 --- a/lib/features/devices/model/ac_model.dart +++ b/lib/features/devices/model/ac_model.dart @@ -7,10 +7,13 @@ class ACModel extends DeviceModel { late int tempMode; + late double coolTo; + ACModel({ required this.temperature, required this.fanSpeed, required this.tempMode, + required this.coolTo, required super.id, required super.name, required super.type, @@ -25,6 +28,7 @@ class ACModel extends DeviceModel { 'temperature': temperature, 'fanSpeed': fanSpeed, 'tempMode': tempMode, + 'coolTo': coolTo, 'id': id, 'name': name, 'status': status, @@ -46,6 +50,7 @@ class ACModel extends DeviceModel { location: json['location'], image: json['image'], timer: json['timer'], + coolTo: json['coolTo'], ); } } diff --git a/lib/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart b/lib/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart index 3859014..0b6887d 100644 --- a/lib/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart +++ b/lib/features/devices/view/widgets/ACs/ac_interface_temp_unit.dart @@ -23,6 +23,7 @@ class AcInterfaceTempUnit extends StatelessWidget { @override Widget build(BuildContext context) { + //TODO: use the coolTo value from the model double coolTo = acModel.temperature; return BlocBuilder( builder: (context, state) { diff --git a/lib/features/devices/view/widgets/ACs/ac_temp_widget.dart b/lib/features/devices/view/widgets/ACs/ac_temp_widget.dart index 22e53b4..c3c4d4c 100644 --- a/lib/features/devices/view/widgets/ACs/ac_temp_widget.dart +++ b/lib/features/devices/view/widgets/ACs/ac_temp_widget.dart @@ -1,21 +1,21 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:syncrow_app/features/devices/bloc/AC/ac_cubit.dart'; -import 'package:syncrow_app/features/shared_widgets/default_container.dart'; +import 'package:syncrow_app/features/devices/bloc/AC/ac_cubit.dart';import 'package:syncrow_app/features/shared_widgets/default_container.dart'; import 'package:syncrow_app/features/shared_widgets/text_widgets/body_large.dart'; import 'package:syncrow_app/utils/context_extension.dart'; import 'package:syncrow_app/utils/resource_manager/color_manager.dart'; import '../../../../../generated/assets.dart'; +import '../../../model/ac_model.dart'; class ACTempWidget extends StatelessWidget { const ACTempWidget( - this.index, { + this.acModel, { super.key, }); - final int index; + final ACModel acModel; @override Widget build(BuildContext context) { @@ -30,7 +30,8 @@ class ACTempWidget extends StatelessWidget { dimension: 24, child: InkWell( onTap: () { - AcCubit.get(context).decreaseACTemp(index); + AcCubit.get(context) + .setACTemp(acModel, acModel.temperature - 0.5); }, child: SvgPicture.asset( Assets.iconsMinus, @@ -38,7 +39,7 @@ class ACTempWidget extends StatelessWidget { ), ), BodyLarge( - text: "${AcCubit.get(context).getTemp(index)}° C", + text: "${acModel.temperature}° C", style: context.bodyLarge.copyWith( color: ColorsManager.primaryColor.withOpacity(0.6), fontSize: 23, @@ -48,7 +49,8 @@ class ACTempWidget extends StatelessWidget { dimension: 24, child: InkWell( onTap: () { - AcCubit.get(context).increaseACTemp(index); + AcCubit.get(context) + .setACTemp(acModel, acModel.temperature + 0.5); }, child: SvgPicture.asset( Assets.iconsPlus, diff --git a/lib/features/devices/view/widgets/ACs/acs_list.dart b/lib/features/devices/view/widgets/ACs/acs_list.dart index cf5c03b..9ec0024 100644 --- a/lib/features/devices/view/widgets/ACs/acs_list.dart +++ b/lib/features/devices/view/widgets/ACs/acs_list.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:syncrow_app/features/devices/bloc/AC/ac_cubit.dart'; import 'package:syncrow_app/features/devices/bloc/devices_cubit.dart'; +import 'package:syncrow_app/features/devices/model/device_category_model.dart'; import 'package:syncrow_app/features/devices/view/widgets/ACs/ac_mode_control_unit.dart'; import 'package:syncrow_app/features/devices/view/widgets/ACs/ac_temp_widget.dart'; import 'package:syncrow_app/features/devices/view/widgets/ACs/universal_ac_temp.dart'; @@ -17,6 +18,7 @@ class ACsList extends StatelessWidget { @override Widget build(BuildContext context) { + DevicesCategoryModel category = DevicesCubit.categories[0]; return SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, @@ -26,7 +28,7 @@ class ACsList extends StatelessWidget { const BodySmall(text: "All ACs"), const SizedBox(height: 5), UniversalSwitch( - category: DevicesCubit.categories[0], + category: category, ), const SizedBox(height: 10), const UniversalACTemp(), @@ -37,8 +39,9 @@ class ACsList extends StatelessWidget { shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), padding: const EdgeInsets.all(0), - itemCount: DevicesCubit.categories[0].devices.length, + itemCount: category.devices.length, itemBuilder: (context, index) { + ACModel ac = category.devices[index] as ACModel; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -46,14 +49,10 @@ class ACsList extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.end, children: [ - BodySmall( - text: - DevicesCubit.categories[0].devices[index].name ?? - ""), + BodySmall(text: category.devices[index].name ?? ""), IconButton( onPressed: () { - var device = - DevicesCubit.categories[0].devices[index]; + var device = category.devices[index]; if (device is ACModel) { AcCubit.get(context).selectAC(device); } @@ -72,20 +71,18 @@ class ACsList extends StatelessWidget { ], ), const SizedBox(height: 5), - if (DevicesCubit.categories[0].devices[index] is ACModel) + if (category.devices[index] is ACModel) DevicesDefaultSwitch( - model: - DevicesCubit.categories[0].devices[index] as ACModel, + model: ac, ), const SizedBox(height: 10), ACTempWidget( - index, + ac, ), const SizedBox(height: 10), - if (DevicesCubit.categories[0].devices[index] is ACModel) + if (category.devices[index] is ACModel) ACModeControlUnit( - model: - DevicesCubit.categories[0].devices[index] as ACModel, + model: ac, ), const SizedBox(height: 10), ], diff --git a/lib/features/devices/view/widgets/ACs/universal_ac_temp.dart b/lib/features/devices/view/widgets/ACs/universal_ac_temp.dart index aede043..aa5d029 100644 --- a/lib/features/devices/view/widgets/ACs/universal_ac_temp.dart +++ b/lib/features/devices/view/widgets/ACs/universal_ac_temp.dart @@ -27,7 +27,8 @@ class UniversalACTemp extends StatelessWidget { dimension: 24, child: InkWell( onTap: () { - AcCubit.get(context).setTempToAll(AcCubit.averageTemp + .5); + AcCubit.get(context) + .setTempToAll(AcCubit.universalACTemp - .5); }, child: SvgPicture.asset( Assets.iconsMinus, @@ -35,7 +36,7 @@ class UniversalACTemp extends StatelessWidget { ), ), BodyLarge( - text: "${AcCubit.averageTemp}° C", + text: "${AcCubit.universalACTemp}° C", style: context.bodyLarge.copyWith( color: ColorsManager.primaryColor.withOpacity(0.6), fontSize: 23, @@ -45,7 +46,8 @@ class UniversalACTemp extends StatelessWidget { dimension: 24, child: InkWell( onTap: () { - AcCubit.get(context).setTempToAll(AcCubit.averageTemp + .5); + AcCubit.get(context) + .setTempToAll(AcCubit.universalACTemp + .5); }, child: SvgPicture.asset( Assets.iconsPlus,