mirror of
https://github.com/SyncrowIOT/syncrow-app.git
synced 2025-07-15 09:45:22 +00:00

- Refactor device control logic in the app to improve readability and maintainability. - Add temperature modes (hot, cold, wind) and fan speeds (auto, low, middle, high) enums. - Update icon mappings and utility functions for temperature modes and fan speeds.
201 lines
6.1 KiB
Dart
201 lines
6.1 KiB
Dart
//ignore_for_file: constant_identifier_names
|
|
import 'package:syncrow_app/features/devices/model/function_model.dart';
|
|
import 'package:syncrow_app/generated/assets.dart';
|
|
|
|
abstract class Constants {
|
|
static const String languageCode = "en";
|
|
|
|
static const String countryCode = "US";
|
|
|
|
static const double appBarHeightPercentage = 0.12;
|
|
static const double bottomNavBarHeightPercentage = 0.1175;
|
|
static late double appBarHeight;
|
|
static late double bottomNavBarHeight;
|
|
|
|
static const double defaultPadding = 16;
|
|
|
|
static const String token = '';
|
|
}
|
|
|
|
enum DeviceType {
|
|
AC,
|
|
LightBulb,
|
|
DoorLock,
|
|
Curtain,
|
|
Blind,
|
|
ThreeGang,
|
|
Gateway,
|
|
CeilingSensor,
|
|
WallSensor,
|
|
Other,
|
|
}
|
|
|
|
// Map<String, DeviceType> devicesTypesMap = {
|
|
// "AC": DeviceType.AC,
|
|
// "LB": DeviceType.LightBulb,
|
|
// "DL": DeviceType.DoorLock,
|
|
// "WC": DeviceType.Curtain,
|
|
// "WB": DeviceType.Blind,
|
|
// "3G": DeviceType.ThreeGang,
|
|
// "GW": DeviceType.Gateway,
|
|
// "CPS": DeviceType.CeilingSensor,
|
|
// "WPS": DeviceType.WallSensor,
|
|
// "Other": DeviceType.Other,
|
|
// };
|
|
//AC wzdcrqh0
|
|
// GW wp8ticoo2bhumwgb
|
|
// CPS d3ci7gcn
|
|
// DL awu7anehyu5q1iu8
|
|
// WPS awarhusb
|
|
// 3G 1a6vgvyi
|
|
|
|
Map<String, DeviceType> devicesTypesMap = {
|
|
"wzdcrqh0": DeviceType.AC,
|
|
"wp8ticoo2bhumwgb": DeviceType.Gateway,
|
|
"d3ci7gcn": DeviceType.CeilingSensor,
|
|
"awu7anehyu5q1iu8": DeviceType.DoorLock,
|
|
"awarhusb": DeviceType.WallSensor,
|
|
"1a6vgvyi": DeviceType.ThreeGang,
|
|
};
|
|
Map<DeviceType, List<FunctionModel>> devicesFunctionsMap = {
|
|
DeviceType.AC: [
|
|
FunctionModel(code: 'switch', type: 'Boolean', values: '{}'),
|
|
FunctionModel(
|
|
code: 'mode', type: 'Enum', values: '{"range":["cold","hot","wind"]}'),
|
|
FunctionModel(
|
|
code: 'temp_set',
|
|
type: 'Integer',
|
|
values: '{"unit":"℃","min":200,"max":300,"scale":1,"step":5}'),
|
|
FunctionModel(
|
|
code: 'level',
|
|
type: 'Enum',
|
|
values: '{"range":["low","middle","high","auto"]}'),
|
|
FunctionModel(code: 'child_lock', type: 'Boolean', values: '{}'),
|
|
],
|
|
DeviceType.Gateway: [
|
|
FunctionModel(code: 'switch_alarm_sound', type: 'Boolean', values: '{}'),
|
|
FunctionModel(
|
|
code: 'master_state',
|
|
type: 'Enum',
|
|
values: '{"range":["normal","alarm"]}'),
|
|
FunctionModel(code: 'factory_reset', type: 'Boolean', values: '{}'),
|
|
FunctionModel(
|
|
code: 'alarm_active', type: 'String', values: '{"maxlen":255}'),
|
|
],
|
|
DeviceType.CeilingSensor: [
|
|
FunctionModel(
|
|
code: 'sensitivity',
|
|
type: 'Integer',
|
|
values: '{"unit":"","min":1,"max":10,"scale":0,"step":1}'),
|
|
],
|
|
DeviceType.DoorLock: [
|
|
FunctionModel(code: 'remote_no_pd_setkey', type: 'Raw', values: '{}'),
|
|
FunctionModel(code: 'remote_no_dp_key', type: 'Raw', values: '{}'),
|
|
FunctionModel(code: 'normal_open_switch', type: 'Boolean', values: '{}'),
|
|
],
|
|
DeviceType.WallSensor: [
|
|
FunctionModel(
|
|
code: 'far_detection',
|
|
type: 'Integer',
|
|
values: '{"unit":"cm","min":75,"max":600,"scale":0,"step":75}'),
|
|
FunctionModel(
|
|
code: 'presence_time',
|
|
type: 'Integer',
|
|
values: '{"unit":"Min","min":0,"max":65535,"scale":0,"step":1}'),
|
|
FunctionModel(
|
|
code: 'motion_sensitivity_value',
|
|
type: 'Integer',
|
|
values: '{"unit":"","min":1,"max":5,"scale":0,"step":1}'),
|
|
FunctionModel(
|
|
code: 'motionless_sensitivity',
|
|
type: 'Integer',
|
|
values: '{"unit":"","min":1,"max":5,"scale":0,"step":1}'),
|
|
FunctionModel(code: 'indicator', type: 'Boolean', values: '{}'),
|
|
],
|
|
DeviceType.ThreeGang: [
|
|
FunctionModel(code: 'switch_1', type: 'Boolean', values: '{}'),
|
|
FunctionModel(code: 'switch_2', type: 'Boolean', values: '{}'),
|
|
FunctionModel(code: 'switch_3', type: 'Boolean', values: '{}'),
|
|
FunctionModel(
|
|
code: 'countdown_1',
|
|
type: 'Integer',
|
|
values: '{"unit":"s","min":0,"max":43200,"scale":0,"step":1}'),
|
|
FunctionModel(
|
|
code: 'countdown_2',
|
|
type: 'Integer',
|
|
values: '{"unit":"s","min":0,"max":43200,"scale":0,"step":1}'),
|
|
FunctionModel(
|
|
code: 'countdown_3',
|
|
type: 'Integer',
|
|
values: '{"unit":"s","min":0,"max":43200,"scale":0,"step":1}'),
|
|
],
|
|
};
|
|
|
|
enum TempModes { hot, cold, wind }
|
|
|
|
enum FanSpeeds { auto, low, middle, high }
|
|
|
|
final Map<FanSpeeds, String> fanSpeedsIconMap = {
|
|
FanSpeeds.auto: Assets.iconsFan0,
|
|
FanSpeeds.low: Assets.iconsFan1,
|
|
FanSpeeds.middle: Assets.iconsFan2,
|
|
FanSpeeds.high: Assets.iconsFan3,
|
|
};
|
|
|
|
final Map<TempModes, String> tempModesIconMap = {
|
|
TempModes.hot: Assets.iconsSunnyMode,
|
|
TempModes.cold: Assets.iconsColdMode,
|
|
TempModes.wind: Assets.iconsWindyMode,
|
|
};
|
|
|
|
final Map<String, FanSpeeds> fanSpeedsMap = {
|
|
'auto': FanSpeeds.auto,
|
|
'low': FanSpeeds.low,
|
|
'middle': FanSpeeds.middle,
|
|
'high': FanSpeeds.high,
|
|
};
|
|
|
|
final Map<String, TempModes> tempModesMap = {
|
|
'hot': TempModes.hot,
|
|
'cold': TempModes.cold,
|
|
'wind': TempModes.wind,
|
|
};
|
|
|
|
final Map<FanSpeeds, String> reversedFanSpeedsMap =
|
|
fanSpeedsMap.map((key, value) => MapEntry(value, key));
|
|
|
|
final Map<TempModes, String> reversedTempModesMap =
|
|
tempModesMap.map((key, value) => MapEntry(value, key));
|
|
|
|
String getNextFanSpeedKey(FanSpeeds currentFanSpeed) {
|
|
const List<FanSpeeds> speeds = FanSpeeds.values;
|
|
final int currentIndex = speeds.indexOf(currentFanSpeed);
|
|
|
|
// Return null if currentFanSpeed is the last value
|
|
if (currentIndex == speeds.length - 1) {
|
|
return reversedFanSpeedsMap[FanSpeeds.auto]!;
|
|
}
|
|
|
|
final FanSpeeds nextSpeed = speeds[currentIndex + 1];
|
|
return reversedFanSpeedsMap[nextSpeed]!;
|
|
}
|
|
|
|
K? getNextItem<K, V>(Map<K, V> map, V value) {
|
|
// Iterate over the map entries
|
|
for (var entry in map.entries) {
|
|
// If the current value matches the provided value
|
|
if (entry.value == value) {
|
|
// Get the index of the current entry
|
|
final index = map.keys.toList().indexOf(entry.key);
|
|
// If the index is not the last item, return the next item
|
|
if (index < map.length - 1) {
|
|
return map.keys.elementAt(index + 1);
|
|
}
|
|
// If it's the last item, return null
|
|
return map.keys.elementAt(0);
|
|
}
|
|
}
|
|
// If the value is not found, return null
|
|
return null;
|
|
}
|