Commit 5dc83081 authored by akari's avatar akari

fix: 修复部分蓝牙逻辑

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