diff --git a/lib/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_event.dart b/lib/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_event.dart index f70e7f3a..08a01615 100644 --- a/lib/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_event.dart +++ b/lib/pages/device_managment/flush_mounted_presence_sensor/bloc/flush_mounted_presence_sensor_event.dart @@ -24,11 +24,10 @@ class FlushMountedPresenceSensorChangeValueEvent extends FlushMountedPresenceSensorEvent { final int value; final String code; - final bool isBatchControl; + const FlushMountedPresenceSensorChangeValueEvent({ required this.value, required this.code, - this.isBatchControl = false, }); @override diff --git a/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_batch_control_view.dart b/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_batch_control_view.dart index 78db6e2e..2860e5cc 100644 --- a/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_batch_control_view.dart +++ b/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_batch_control_view.dart @@ -75,7 +75,7 @@ class FlushMountedPresenceSensorBatchControlView extends StatelessWidget ), ), PresenceUpdateData( - value: (model.nearDetection / 100).toDouble(), + value: (model.nearDetection / 100).clamp(0.0, double.infinity), title: 'Nearest Detect Dist:', description: 'm', minValue: 0.0, @@ -92,7 +92,7 @@ class FlushMountedPresenceSensorBatchControlView extends StatelessWidget ), ), PresenceUpdateData( - value: (model.farDetection / 100).toDouble(), + value: (model.farDetection / 100).clamp(0.0, double.infinity), title: 'Max Detect Dist:', description: 'm', minValue: 0.0, @@ -109,7 +109,7 @@ class FlushMountedPresenceSensorBatchControlView extends StatelessWidget ), ), PresenceUpdateData( - value: model.presenceDelay.toDouble(), + value: model.sensiReduce.toDouble(), title: 'Trigger Level:', minValue: 0, maxValue: 3, @@ -117,7 +117,7 @@ class FlushMountedPresenceSensorBatchControlView extends StatelessWidget action: (int value) => context.read().add( FlushMountedPresenceSensorBatchControlEvent( deviceIds: devicesIds, - code: FlushMountedPresenceSensorModel.codePresenceDelay, + code: FlushMountedPresenceSensorModel.codeSensiReduce, value: value, ), ), @@ -137,19 +137,21 @@ class FlushMountedPresenceSensorBatchControlView extends StatelessWidget ), ), PresenceUpdateData( - value: (model.sensiReduce.toDouble()), + value: (model.presenceDelay / 10).toDouble(), title: 'Target Confirm Time:', description: 's', - minValue: 0, - maxValue: 3, - steps: 1, - action: (int value) => context.read().add( - FlushMountedPresenceSensorBatchControlEvent( - deviceIds: devicesIds, - code: FlushMountedPresenceSensorModel.codeSensiReduce, - value: value, - ), - ), + minValue: 0.0, + maxValue: 0.5, + steps: 0.1, + valuesPercision: 1, + action: (double value) => + context.read().add( + FlushMountedPresenceSensorBatchControlEvent( + deviceIds: devicesIds, + code: FlushMountedPresenceSensorModel.codePresenceDelay, + value: (value * 10).toInt(), + ), + ), ), PresenceUpdateData( value: ((model.noneDelay / 10).toDouble()), diff --git a/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart b/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart index f0815c60..08ad809d 100644 --- a/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart +++ b/lib/pages/device_managment/flush_mounted_presence_sensor/views/flush_mounted_presence_sensor_control_view.dart @@ -15,7 +15,7 @@ import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_la class FlushMountedPresenceSensorControlView extends StatelessWidget with HelperResponsiveLayout { - const FlushMountedPresenceSensorControlView({super.key, required this.device}); + const FlushMountedPresenceSensorControlView({required this.device, super.key}); final AllDevicesModel device; @@ -113,7 +113,7 @@ class FlushMountedPresenceSensorControlView extends StatelessWidget ), ), PresenceUpdateData( - value: (model.nearDetection / 100).toDouble(), + value: (model.nearDetection / 100).clamp(0.0, double.infinity), title: 'Nearest Detect Dist:', description: 'm', minValue: 0.0, @@ -129,7 +129,7 @@ class FlushMountedPresenceSensorControlView extends StatelessWidget ), ), PresenceUpdateData( - value: (model.farDetection / 100).toDouble(), + value: (model.farDetection / 100).clamp(0.0, double.infinity), title: 'Max Detect Dist:', description: 'm', minValue: 0.0, @@ -145,20 +145,20 @@ class FlushMountedPresenceSensorControlView extends StatelessWidget ), ), PresenceUpdateData( - value: (model.presenceDelay.toDouble()), + value: model.sensiReduce.toDouble(), title: 'Trigger Level:', minValue: 0, maxValue: 3, steps: 1, action: (int value) => context.read().add( FlushMountedPresenceSensorChangeValueEvent( - code: FlushMountedPresenceSensorModel.codePresenceDelay, + code: FlushMountedPresenceSensorModel.codeSensiReduce, value: value, ), ), ), PresenceUpdateData( - value: (model.occurDistReduce.toDouble()), + value: model.occurDistReduce.toDouble(), title: 'Indent Level:', minValue: 0, maxValue: 3, @@ -171,21 +171,23 @@ class FlushMountedPresenceSensorControlView extends StatelessWidget ), ), PresenceUpdateData( - value: (model.sensiReduce.toDouble()), + value: (model.presenceDelay / 10).toDouble(), + valuesPercision: 1, title: 'Target Confirm Time:', description: 's', - minValue: 0, - maxValue: 3, - steps: 1, - action: (int value) => context.read().add( - FlushMountedPresenceSensorChangeValueEvent( - code: FlushMountedPresenceSensorModel.codeSensiReduce, - value: value, - ), - ), + minValue: 0.0, + maxValue: 0.5, + steps: 0.1, + action: (double value) => + context.read().add( + FlushMountedPresenceSensorChangeValueEvent( + code: FlushMountedPresenceSensorModel.codePresenceDelay, + value: (value * 10).toInt(), + ), + ), ), PresenceUpdateData( - value: ((model.noneDelay / 10).toDouble()), + value: (model.noneDelay / 10).toDouble(), description: 's', title: 'Disappe Delay:', minValue: 20, diff --git a/lib/services/batch_control_devices_service.dart b/lib/services/batch_control_devices_service.dart index de5af9ee..f78cdef4 100644 --- a/lib/services/batch_control_devices_service.dart +++ b/lib/services/batch_control_devices_service.dart @@ -46,14 +46,14 @@ final class DebouncedBatchControlDevicesService final BatchControlDevicesService decoratee; final Duration debounceDuration; - final _pendingRequests = <(List uuids, String code, Object value)>[]; - var _isProcessing = false; - DebouncedBatchControlDevicesService({ required this.decoratee, - this.debounceDuration = const Duration(milliseconds: 800), + this.debounceDuration = const Duration(milliseconds: 1500), }); + final _pendingRequests = <(List uuids, String code, Object value)>[]; + var _isProcessing = false; + @override Future batchControlDevices({ required List uuids, @@ -68,16 +68,26 @@ final class DebouncedBatchControlDevicesService await Future.delayed(debounceDuration); - final lastRequest = _pendingRequests.last; + final groupedRequests = + uuids, String code, Object value)>{}; + for (final request in _pendingRequests) { + final (_, requestCode, requestValue) = request; + groupedRequests[requestCode] = request; + } _pendingRequests.clear(); try { - final (lastRequestUuids, lastRequestCode, lastRequestValue) = lastRequest; - return decoratee.batchControlDevices( - uuids: lastRequestUuids, - code: lastRequestCode, - value: lastRequestValue, - ); + var allSuccessful = true; + for (final request in groupedRequests.values) { + final (lastRequestUuids, lastRequestCode, lastRequestValue) = request; + final success = await decoratee.batchControlDevices( + uuids: lastRequestUuids, + code: lastRequestCode, + value: lastRequestValue, + ); + if (!success) allSuccessful = false; + } + return allSuccessful; } finally { _isProcessing = false; } diff --git a/lib/services/control_device_service.dart b/lib/services/control_device_service.dart index 9913b52e..49463306 100644 --- a/lib/services/control_device_service.dart +++ b/lib/services/control_device_service.dart @@ -40,7 +40,7 @@ final class DebouncedControlDeviceService implements ControlDeviceService { DebouncedControlDeviceService({ required this.decoratee, - this.debounceDuration = const Duration(milliseconds: 800), + this.debounceDuration = const Duration(milliseconds: 1500), }); final _pendingRequests = <(String deviceUuid, Status status)>[]; @@ -59,15 +59,24 @@ final class DebouncedControlDeviceService implements ControlDeviceService { await Future.delayed(debounceDuration); - final lastRequest = _pendingRequests.last; + final groupedRequests = {}; + for (final request in _pendingRequests) { + final (_, requestStatus) = request; + groupedRequests[requestStatus.code] = request; + } _pendingRequests.clear(); try { - final (lastRequestDeviceUuid, lastRequestStatus) = lastRequest; - return decoratee.controlDevice( - deviceUuid: lastRequestDeviceUuid, - status: lastRequestStatus, - ); + var allSuccessful = true; + for (final request in groupedRequests.values) { + final (lastRequestDeviceUuid, lastRequestStatus) = request; + final success = await decoratee.controlDevice( + deviceUuid: lastRequestDeviceUuid, + status: lastRequestStatus, + ); + if (!success) allSuccessful = false; + } + return allSuccessful; } finally { _isProcessing = false; }