Commit 5dc83081 authored by akari's avatar akari

fix: 修复部分蓝牙逻辑

parent 6d1704c6
...@@ -21,7 +21,7 @@ const DeviceControlBO _defaultDeviceControlBO = DeviceControlBO( ...@@ -21,7 +21,7 @@ const DeviceControlBO _defaultDeviceControlBO = DeviceControlBO(
), ),
oxygenConcentration: OxygenConcentrationBO( oxygenConcentration: OxygenConcentrationBO(
currentValue: '--', currentValue: '--',
setValue: '90', setValue: '60',
unit: '%', unit: '%',
isOn: true, isOn: true,
), ),
...@@ -41,10 +41,10 @@ const DeviceControlBO _defaultDeviceControlBO = DeviceControlBO( ...@@ -41,10 +41,10 @@ const DeviceControlBO _defaultDeviceControlBO = DeviceControlBO(
currentMode: WindSpeedMode.sleep, currentMode: WindSpeedMode.sleep,
), ),
nebulizationTime: NebulizationTimeBO( nebulizationTime: NebulizationTimeBO(
setMinutes: '00', setMinutes: '30',
), ),
disinfectionTime: DisinfectionTimeBO( disinfectionTime: DisinfectionTimeBO(
setMinutes: '14', setMinutes: '30',
), ),
openOxygen: OpenOxygenControlBO( openOxygen: OpenOxygenControlBO(
isOn: false, isOn: false,
......
This diff is collapsed.
...@@ -747,7 +747,10 @@ class BleBluetoothManager<T> { ...@@ -747,7 +747,10 @@ class BleBluetoothManager<T> {
} }
static bool _startsWithAny(String value, List<String> prefixes) { static bool _startsWithAny(String value, List<String> prefixes) {
return prefixes.any(value.startsWith); final normalizedValue = value.trim().toUpperCase();
return prefixes.any(
(prefix) => normalizedValue.startsWith(prefix.trim().toUpperCase()),
);
} }
static String _normalizeRemoteIdForSort(String remoteId) { static String _normalizeRemoteIdForSort(String remoteId) {
......
...@@ -10,7 +10,6 @@ import 'package:laki_icu_app/models/bo/monitoring_bo.dart'; ...@@ -10,7 +10,6 @@ import 'package:laki_icu_app/models/bo/monitoring_bo.dart';
import 'cubit/device_control_index_cubit.dart'; import 'cubit/device_control_index_cubit.dart';
import 'cubit/device_control_index_state.dart'; import 'cubit/device_control_index_state.dart';
import 'widgets/device_control_care_panel.dart'; import 'widgets/device_control_care_panel.dart';
import 'widgets/device_control_confirm_dialog.dart';
import 'widgets/device_control_info_panel.dart'; import 'widgets/device_control_info_panel.dart';
import 'widgets/device_control_metric_card.dart'; import 'widgets/device_control_metric_card.dart';
import 'widgets/device_control_mode_panel.dart'; import 'widgets/device_control_mode_panel.dart';
...@@ -163,16 +162,11 @@ class _DeviceControlLayout extends StatelessWidget { ...@@ -163,16 +162,11 @@ class _DeviceControlLayout extends StatelessWidget {
icon: Icons.air, icon: Icons.air,
body: '开启后风扇打开、制冷、加热和\n循环等设备暂停。', body: '开启后风扇打开、制冷、加热和\n循环等设备暂停。',
warning: '*保持设备周围空气相对禁止,严禁烟火', warning: '*保持设备周围空气相对禁止,严禁烟火',
onTap: () { onTap: () => context.read<DeviceControlBloc>().add(
confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(
DeviceControlOpenOxygenSwitchChanged(!isOn), DeviceControlOpenOxygenSwitchChanged(!isOn),
), ),
); );
}, },
);
},
), ),
), ),
SizedBox(height: 24.h), SizedBox(height: 24.h),
......
...@@ -7,7 +7,6 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart'; ...@@ -7,7 +7,6 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart';
import 'package:laki_icu_app/models/bo/device_control_bo.dart'; import 'package:laki_icu_app/models/bo/device_control_bo.dart';
import 'device_control_common.dart'; import 'device_control_common.dart';
import 'device_control_confirm_dialog.dart';
/// 护理等级面板 /// 护理等级面板
class DeviceControlCarePanel extends StatelessWidget { class DeviceControlCarePanel extends StatelessWidget {
...@@ -37,14 +36,9 @@ class DeviceControlCarePanel extends StatelessWidget { ...@@ -37,14 +36,9 @@ class DeviceControlCarePanel extends StatelessWidget {
Expanded( Expanded(
child: GestureDetector( child: GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () { onTap: () => context.read<DeviceControlBloc>().add(
confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(
DeviceControlCareLevelChanged(item.level), DeviceControlCareLevelChanged(item.level),
), ),
);
},
child: Text( child: Text(
item.label, item.label,
textAlign: TextAlign.center, textAlign: TextAlign.center,
...@@ -107,16 +101,11 @@ class _CareLevelBar extends StatelessWidget { ...@@ -107,16 +101,11 @@ class _CareLevelBar extends StatelessWidget {
Expanded( Expanded(
child: GestureDetector( child: GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () { onTap: () => context.read<DeviceControlBloc>().add(
confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(
DeviceControlCareLevelChanged( DeviceControlCareLevelChanged(
_careLevelItems[index].level, _careLevelItems[index].level,
), ),
), ),
);
},
child: Container( child: Container(
height: 20.h, height: 20.h,
decoration: BoxDecoration( decoration: BoxDecoration(
......
...@@ -94,14 +94,19 @@ class DeviceControlPill extends StatelessWidget { ...@@ -94,14 +94,19 @@ class DeviceControlPill extends StatelessWidget {
super.key, super.key,
required this.text, required this.text,
this.active = false, this.active = false,
this.onTap,
}); });
final String text; final String text;
final bool active; final bool active;
final VoidCallback? onTap;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: onTap,
child: Container(
height: 40.h, height: 40.h,
constraints: BoxConstraints(minWidth: 90.w), constraints: BoxConstraints(minWidth: 90.w),
padding: EdgeInsets.symmetric(horizontal: 18.w), padding: EdgeInsets.symmetric(horizontal: 18.w),
...@@ -114,11 +119,6 @@ class DeviceControlPill extends StatelessWidget { ...@@ -114,11 +119,6 @@ class DeviceControlPill extends StatelessWidget {
), ),
borderRadius: BorderRadius.circular(20.r), borderRadius: BorderRadius.circular(20.r),
), ),
child: GestureDetector(
onTap: () {
var key = super.key;
debugPrint("test $key");
},
child: Text( child: Text(
text, text,
style: TextStyle( style: TextStyle(
......
...@@ -13,8 +13,9 @@ class DeviceControlConfirmConfig { ...@@ -13,8 +13,9 @@ class DeviceControlConfirmConfig {
Future<void> confirmDeviceControlChange( Future<void> confirmDeviceControlChange(
BuildContext context, BuildContext context,
VoidCallback onConfirmed, VoidCallback onConfirmed, {
) async { String message = '确认设置当前修改参数',
}) async {
if (!DeviceControlConfirmConfig.enabled) { if (!DeviceControlConfirmConfig.enabled) {
onConfirmed(); onConfirmed();
return; return;
...@@ -23,7 +24,7 @@ Future<void> confirmDeviceControlChange( ...@@ -23,7 +24,7 @@ Future<void> confirmDeviceControlChange(
final confirmed = await showDialog<bool>( final confirmed = await showDialog<bool>(
context: context, context: context,
barrierColor: Colors.black.withValues(alpha: 0.44), barrierColor: Colors.black.withValues(alpha: 0.44),
builder: (_) => const _DeviceControlConfirmDialog(), builder: (_) => _DeviceControlConfirmDialog(message: message),
); );
if (!context.mounted || confirmed != true) return; if (!context.mounted || confirmed != true) return;
...@@ -31,7 +32,9 @@ Future<void> confirmDeviceControlChange( ...@@ -31,7 +32,9 @@ Future<void> confirmDeviceControlChange(
} }
class _DeviceControlConfirmDialog extends StatelessWidget { class _DeviceControlConfirmDialog extends StatelessWidget {
const _DeviceControlConfirmDialog(); const _DeviceControlConfirmDialog({required this.message});
final String message;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -83,8 +86,9 @@ class _DeviceControlConfirmDialog extends StatelessWidget { ...@@ -83,8 +86,9 @@ class _DeviceControlConfirmDialog extends StatelessWidget {
), ),
const Spacer(), const Spacer(),
Text( Text(
'确认设置当前修改参数', message,
maxLines: 1, maxLines: 3,
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle( style: TextStyle(
color: Colors.white, color: Colors.white,
......
...@@ -40,7 +40,12 @@ class DeviceControlMetricCard extends StatelessWidget { ...@@ -40,7 +40,12 @@ class DeviceControlMetricCard extends StatelessWidget {
previous.data.oxygenConcentration.currentValue != previous.data.oxygenConcentration.currentValue !=
current.data.oxygenConcentration.currentValue || current.data.oxygenConcentration.currentValue ||
previous.data.co2Concentration.currentValue != previous.data.co2Concentration.currentValue !=
current.data.co2Concentration.currentValue, current.data.co2Concentration.currentValue ||
previous.data.cabinTemp.isOn != current.data.cabinTemp.isOn ||
previous.data.cabinHumidity.isOn != current.data.cabinHumidity.isOn ||
previous.data.oxygenConcentration.isOn !=
current.data.oxygenConcentration.isOn ||
previous.data.openOxygen.isOn != current.data.openOxygen.isOn,
builder: (context, state) { builder: (context, state) {
final currentValue = isTemperature final currentValue = isTemperature
? state.data.cabinTemp.currentValue ? state.data.cabinTemp.currentValue
...@@ -72,6 +77,19 @@ class DeviceControlMetricCard extends StatelessWidget { ...@@ -72,6 +77,19 @@ class DeviceControlMetricCard extends StatelessWidget {
isOxygen: isOxygen, isOxygen: isOxygen,
isCo2: isCo2, isCo2: isCo2,
); );
final isSwitchOn = isTemperature
? state.data.cabinTemp.isOn
: isHumidity
? state.data.cabinHumidity.isOn
: isOxygen
? state.data.oxygenConcentration.isOn
: false;
final switchEventBuilder = _switchEventBuilder(
isTemperature: isTemperature,
isHumidity: isHumidity,
isOxygen: isOxygen,
);
final displaySetValue = !isCo2 && !isSwitchOn ? '--' : setValue;
return DeviceControlPanelFrame( return DeviceControlPanelFrame(
active: isOxygen, active: isOxygen,
...@@ -86,12 +104,18 @@ class DeviceControlMetricCard extends StatelessWidget { ...@@ -86,12 +104,18 @@ class DeviceControlMetricCard extends StatelessWidget {
child: DeviceControlPanelTitle(_title(metric.label)), child: DeviceControlPanelTitle(_title(metric.label)),
), ),
DeviceControlPill( DeviceControlPill(
text: isOxygen text: isCo2 ? 'PPM' : (isSwitchOn ? 'ON' : 'Off'),
? 'ON' active: !isCo2 && isSwitchOn,
: isCo2 onTap: switchEventBuilder == null
? 'PPM' ? null
: 'Off', : () {
active: isOxygen, confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(
switchEventBuilder(!isSwitchOn),
),
);
},
), ),
], ],
), ),
...@@ -166,7 +190,6 @@ class DeviceControlMetricCard extends StatelessWidget { ...@@ -166,7 +190,6 @@ class DeviceControlMetricCard extends StatelessWidget {
? null ? null
: () => _showSetValueKeyboard( : () => _showSetValueKeyboard(
context, context,
initialValue: setValue,
decimalEnabled: isTemperature, decimalEnabled: isTemperature,
eventBuilder: setValueEventBuilder, eventBuilder: setValueEventBuilder,
), ),
...@@ -174,7 +197,7 @@ class DeviceControlMetricCard extends StatelessWidget { ...@@ -174,7 +197,7 @@ class DeviceControlMetricCard extends StatelessWidget {
padding: padding:
EdgeInsets.symmetric(horizontal: 18.w, vertical: 8.h), EdgeInsets.symmetric(horizontal: 18.w, vertical: 8.h),
child: Text( child: Text(
setValue, displaySetValue,
style: TextStyle( style: TextStyle(
color: isCo2 color: isCo2
? const Color(0xFFFFC400) ? const Color(0xFFFFC400)
...@@ -262,15 +285,31 @@ class DeviceControlMetricCard extends StatelessWidget { ...@@ -262,15 +285,31 @@ class DeviceControlMetricCard extends StatelessWidget {
return null; return null;
} }
static DeviceControlEvent Function(bool isOn)? _switchEventBuilder({
required bool isTemperature,
required bool isHumidity,
required bool isOxygen,
}) {
if (isTemperature) {
return (isOn) => DeviceControlCabinTempSwitchChanged(isOn);
}
if (isHumidity) {
return (isOn) => DeviceControlCabinHumiditySwitchChanged(isOn);
}
if (isOxygen) {
return (isOn) => DeviceControlOxygenConcentrationSwitchChanged(isOn);
}
return null;
}
static Future<void> _showSetValueKeyboard( static Future<void> _showSetValueKeyboard(
BuildContext context, { BuildContext context, {
required String initialValue,
required bool decimalEnabled, required bool decimalEnabled,
required DeviceControlEvent Function(String value) eventBuilder, required DeviceControlEvent Function(String value) eventBuilder,
}) async { }) async {
final result = await NumericKeyboard.show( final result = await NumericKeyboard.show(
context, context,
initialValue: initialValue == '--' ? '' : initialValue, initialValue: '',
decimalEnabled: decimalEnabled, decimalEnabled: decimalEnabled,
); );
if (!context.mounted || result == null) return; if (!context.mounted || result == null) return;
......
...@@ -7,7 +7,6 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart'; ...@@ -7,7 +7,6 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart';
import 'package:laki_icu_app/models/bo/device_control_bo.dart'; import 'package:laki_icu_app/models/bo/device_control_bo.dart';
import 'device_control_common.dart'; import 'device_control_common.dart';
import 'device_control_confirm_dialog.dart';
/// 模式切换面板(外循环/检查灯/照明灯/内循环/蓝光/红光) /// 模式切换面板(外循环/检查灯/照明灯/内循环/蓝光/红光)
class DeviceControlModePanel extends StatelessWidget { class DeviceControlModePanel extends StatelessWidget {
...@@ -95,14 +94,9 @@ class DeviceControlModePanel extends StatelessWidget { ...@@ -95,14 +94,9 @@ class DeviceControlModePanel extends StatelessWidget {
label: item.label, label: item.label,
icon: item.icon, icon: item.icon,
active: item.active, active: item.active,
onTap: () { onTap: () => context.read<DeviceControlBloc>().add(
confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(
item.event, item.event,
), ),
);
},
), ),
), ),
], ],
......
...@@ -7,7 +7,6 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart'; ...@@ -7,7 +7,6 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart';
import 'package:laki_icu_app/utils/numeric_keyboard.dart'; import 'package:laki_icu_app/utils/numeric_keyboard.dart';
import 'device_control_common.dart'; import 'device_control_common.dart';
import 'device_control_confirm_dialog.dart';
/// 设置雾化/消毒时间面板 /// 设置雾化/消毒时间面板
class DeviceControlTimePanel extends StatelessWidget { class DeviceControlTimePanel extends StatelessWidget {
...@@ -82,10 +81,7 @@ class DeviceControlTimePanel extends StatelessWidget { ...@@ -82,10 +81,7 @@ class DeviceControlTimePanel extends StatelessWidget {
final value = result.trim(); final value = result.trim();
if (value.isEmpty) return; if (value.isEmpty) return;
await confirmDeviceControlChange( context.read<DeviceControlBloc>().add(eventBuilder(value));
context,
() => context.read<DeviceControlBloc>().add(eventBuilder(value)),
);
} }
} }
......
...@@ -7,7 +7,6 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart'; ...@@ -7,7 +7,6 @@ import 'package:laki_icu_app/blocs/device_control/device_control_state.dart';
import 'package:laki_icu_app/models/bo/device_control_bo.dart'; import 'package:laki_icu_app/models/bo/device_control_bo.dart';
import 'device_control_common.dart'; import 'device_control_common.dart';
import 'device_control_confirm_dialog.dart';
/// 风速调节面板 /// 风速调节面板
class DeviceControlWindPanel extends StatelessWidget { class DeviceControlWindPanel extends StatelessWidget {
...@@ -34,16 +33,11 @@ class DeviceControlWindPanel extends StatelessWidget { ...@@ -34,16 +33,11 @@ class DeviceControlWindPanel extends StatelessWidget {
label: '睡眠模式', label: '睡眠模式',
icon: Icons.nightlight_round, icon: Icons.nightlight_round,
active: currentMode == WindSpeedMode.sleep, active: currentMode == WindSpeedMode.sleep,
onTap: () { onTap: () => context.read<DeviceControlBloc>().add(
confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(
const DeviceControlWindSpeedModeChanged( const DeviceControlWindSpeedModeChanged(
WindSpeedMode.sleep, WindSpeedMode.sleep,
), ),
), ),
);
},
), ),
), ),
SizedBox(height: 18.h), SizedBox(height: 18.h),
...@@ -52,16 +46,11 @@ class DeviceControlWindPanel extends StatelessWidget { ...@@ -52,16 +46,11 @@ class DeviceControlWindPanel extends StatelessWidget {
label: '舒适模式', label: '舒适模式',
icon: Icons.favorite_border, icon: Icons.favorite_border,
active: currentMode == WindSpeedMode.comfort, active: currentMode == WindSpeedMode.comfort,
onTap: () { onTap: () => context.read<DeviceControlBloc>().add(
confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(
const DeviceControlWindSpeedModeChanged( const DeviceControlWindSpeedModeChanged(
WindSpeedMode.comfort, WindSpeedMode.comfort,
), ),
), ),
);
},
), ),
), ),
SizedBox(height: 18.h), SizedBox(height: 18.h),
...@@ -70,16 +59,11 @@ class DeviceControlWindPanel extends StatelessWidget { ...@@ -70,16 +59,11 @@ class DeviceControlWindPanel extends StatelessWidget {
label: '强劲模式', label: '强劲模式',
icon: Icons.air, icon: Icons.air,
active: currentMode == WindSpeedMode.strong, active: currentMode == WindSpeedMode.strong,
onTap: () { onTap: () => context.read<DeviceControlBloc>().add(
confirmDeviceControlChange(
context,
() => context.read<DeviceControlBloc>().add(
const DeviceControlWindSpeedModeChanged( const DeviceControlWindSpeedModeChanged(
WindSpeedMode.strong, WindSpeedMode.strong,
), ),
), ),
);
},
), ),
), ),
], ],
......
...@@ -612,7 +612,7 @@ class MonitoringIndexCubit extends HydratedCubit<MonitoringIndexState> { ...@@ -612,7 +612,7 @@ class MonitoringIndexCubit extends HydratedCubit<MonitoringIndexState> {
try { try {
await _bluetoothManager.scanForDevices( await _bluetoothManager.scanForDevices(
namePrefixes: const [], namePrefixes: const ['CNA'],
timeout: const Duration(seconds: 10), timeout: const Duration(seconds: 10),
); );
} catch (e) { } catch (e) {
...@@ -916,7 +916,8 @@ class MonitoringIndexCubit extends HydratedCubit<MonitoringIndexState> { ...@@ -916,7 +916,8 @@ class MonitoringIndexCubit extends HydratedCubit<MonitoringIndexState> {
); );
// 按告警标题去重:相同标题 → 原地覆盖;不同标题 → 插入头部 // 按告警标题去重:相同标题 → 原地覆盖;不同标题 → 插入头部
final existingIndex = state.cameraAlerts.indexWhere((a) => a.title == title); final existingIndex =
state.cameraAlerts.indexWhere((a) => a.title == title);
if (existingIndex >= 0) { if (existingIndex >= 0) {
// 已存在相同标题 → 原地替换 // 已存在相同标题 → 原地替换
final updatedAlerts = List<AlertInfoBO>.from(state.cameraAlerts); final updatedAlerts = List<AlertInfoBO>.from(state.cameraAlerts);
...@@ -1361,8 +1362,12 @@ class MonitoringIndexCubit extends HydratedCubit<MonitoringIndexState> { ...@@ -1361,8 +1362,12 @@ class MonitoringIndexCubit extends HydratedCubit<MonitoringIndexState> {
if (client == null || if (client == null ||
!client.isConnected || !client.isConnected ||
deviceSn == null || deviceSn == null ||
deviceSn.isEmpty) return; deviceSn.isEmpty) {
if (alert.alarmId == null) return; return;
}
if (alert.alarmId == null) {
return;
}
try { try {
client.publishCameraAlarmResult( client.publishCameraAlarmResult(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment