|
@@ -1,21 +1,8 @@
|
|
|
import 'package:flutter/material.dart';
|
|
|
-import 'package:get/get.dart';
|
|
|
-import 'package:vitalapp/architecture/utils/prompt_box.dart';
|
|
|
-import 'package:vitalapp/components/button.dart';
|
|
|
import 'package:vitalapp/components/dialog_input.dart';
|
|
|
-import 'package:vitalapp/managers/device_controller_manager.dart';
|
|
|
-import 'package:vitalapp/pages/check/widgets/device_controller.dart';
|
|
|
-import 'package:vitalapp/pages/mappers/urine.dart';
|
|
|
-import 'package:vitalapp/pages/medical/widgets/device_status_position.dart';
|
|
|
import 'package:vnote_device_plugin/consts/types.dart';
|
|
|
-import 'package:vitalapp/managers/interfaces/models/device.dart';
|
|
|
import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_card.dart';
|
|
|
import 'package:vitalapp/pages/medical/controller.dart';
|
|
|
-import 'package:vitalapp/pages/medical/models/worker.dart';
|
|
|
-import 'package:vitalapp/pages/medical/widgets/device_status.dart';
|
|
|
-import 'package:vnote_device_plugin/devices/urine.dart';
|
|
|
-import 'package:vnote_device_plugin/models/exams/urine.dart';
|
|
|
-import 'package:fis_common/logger/logger.dart';
|
|
|
|
|
|
/// 尿常规
|
|
|
class ExamUrinalysis extends StatefulWidget {
|
|
@@ -32,17 +19,8 @@ class ExamUrinalysis extends StatefulWidget {
|
|
|
}
|
|
|
|
|
|
class _ExamUrinalysisState extends State<ExamUrinalysis> {
|
|
|
- final controller = Get.find<DeviceController>();
|
|
|
- late DeviceControllerManager urinaly;
|
|
|
- UrineDeviceWorker? worker;
|
|
|
- UrineExamData? urineExamData;
|
|
|
- bool isConnectFail = false;
|
|
|
- bool isAutoTesting = false;
|
|
|
- int errorCount = 0;
|
|
|
String? deviceType = MedicalController.typeConvertMap[DeviceTypes.URINE];
|
|
|
|
|
|
- WorkerStatus connectStatus = WorkerStatus.connecting;
|
|
|
-
|
|
|
List<Map<String, String>> urinalysis = [
|
|
|
{"name": '尿白细胞', "key": 'LEU'},
|
|
|
{"name": '红细胞/潜血', "key": 'BLD'},
|
|
@@ -60,226 +38,33 @@ class _ExamUrinalysisState extends State<ExamUrinalysis> {
|
|
|
Map _value = {};
|
|
|
@override
|
|
|
void initState() {
|
|
|
- initTemperature();
|
|
|
- currentDevice();
|
|
|
+ initUrinalys();
|
|
|
super.initState();
|
|
|
}
|
|
|
|
|
|
- Future<void> currentDevice() async {
|
|
|
- DeviceModel? device = await controller.getDevice(DeviceTypes.URINE);
|
|
|
- if (device == null) {
|
|
|
- connectStatus = WorkerStatus.unboundDevice;
|
|
|
- setState(() {});
|
|
|
- return;
|
|
|
- }
|
|
|
- urinaly =
|
|
|
- DeviceControllerManager(DeviceTypes.URINE, device.model, device.mac);
|
|
|
- worker = urinaly.worker as UrineDeviceWorker;
|
|
|
- connectStatus = urinaly.connectStatus;
|
|
|
- loadListeners();
|
|
|
- worker!.connect();
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> initTemperature() async {
|
|
|
+ Future<void> initUrinalys() async {
|
|
|
await initData();
|
|
|
}
|
|
|
|
|
|
- void loadListeners() {
|
|
|
- if (worker != null) {
|
|
|
- worker!.successEvent.addListener(_onSuccess);
|
|
|
- worker!.connectErrorEvent.addListener(_onConnectFail);
|
|
|
- worker!.connectedEvent.addListener(_onConnectSuccess);
|
|
|
- worker!.disconnectedEvent.addListener(_onDisconnected);
|
|
|
- // worker!.errorEvent.addListener(_onError);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
Future<void> initData() async {
|
|
|
_value = widget.currentValue;
|
|
|
setState(() {});
|
|
|
}
|
|
|
|
|
|
- void releaseListeners() {
|
|
|
- if (worker != null) {
|
|
|
- worker!.connectErrorEvent.removeListener(_onConnectFail);
|
|
|
- worker!.connectedEvent.removeListener(_onConnectSuccess);
|
|
|
- worker!.successEvent.removeListener(_onSuccess);
|
|
|
- worker!.disconnectedEvent.removeListener(_onDisconnected);
|
|
|
- // worker!.errorEvent.removeListener(_onError);
|
|
|
- }
|
|
|
-
|
|
|
- // worker.tempTooLowEvent.removeListener(_onTempTooLowOrTooHeigh);
|
|
|
- // worker.tempTooHighEvent.removeListener(_onTempTooLowOrTooHeigh);
|
|
|
- // controller.deviceCloseSuccessEvent.removeListener(_onDeviceCloseSuccess);
|
|
|
- }
|
|
|
-
|
|
|
- /// 尝试重连
|
|
|
- Future<void> tryReconnect() async {
|
|
|
- //await worker.disconnect();
|
|
|
- //5s后在执行,是为了防止重连与断开事件一直相互触发
|
|
|
- Future.delayed(const Duration(seconds: 5), () async {
|
|
|
- //如果5秒后仍然是未连接状态,则重试连接
|
|
|
- if (connectStatus == WorkerStatus.disconnected ||
|
|
|
- connectStatus == WorkerStatus.connectionFailed ||
|
|
|
- connectStatus == WorkerStatus.connecting) {
|
|
|
- await disconnect();
|
|
|
- await connect();
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> disconnect() async {
|
|
|
- await worker?.disconnect();
|
|
|
- }
|
|
|
-
|
|
|
- Future<void> connect() async {
|
|
|
- await worker?.connect();
|
|
|
- }
|
|
|
-
|
|
|
@override
|
|
|
void dispose() {
|
|
|
- urinaly.dispose();
|
|
|
- releaseListeners();
|
|
|
- disconnect();
|
|
|
- worker?.dispose();
|
|
|
super.dispose();
|
|
|
}
|
|
|
|
|
|
- void _onSuccess(_, UrineExamData e) {
|
|
|
- setState(() {
|
|
|
- // _value = e.toString();
|
|
|
- isAutoTesting = false;
|
|
|
- urineExamData = e;
|
|
|
- _value = UrineExamDataMapper.convertUrineExamDataToMap(urineExamData!);
|
|
|
- widget.urinalysis(_value);
|
|
|
- connectStatus = WorkerStatus.connected;
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- void _onConnectFail(sender, e) {
|
|
|
- print('连接设备失败');
|
|
|
-
|
|
|
- logger.i("设备连接失败:${worker!.mac}");
|
|
|
- if (errorCount < 3) {
|
|
|
- errorCount++;
|
|
|
- tryReconnect();
|
|
|
- } else {
|
|
|
- isConnectFail = true;
|
|
|
- }
|
|
|
-
|
|
|
- connectStatus = WorkerStatus.connectionFailed;
|
|
|
- setState(() {});
|
|
|
- }
|
|
|
-
|
|
|
- void _onConnectSuccess(sender, e) {
|
|
|
- logger.i("设备连接成功:${worker!.mac}");
|
|
|
- isConnectFail = false;
|
|
|
- errorCount = 0;
|
|
|
- connectStatus = WorkerStatus.connected;
|
|
|
- setState(() {});
|
|
|
- }
|
|
|
-
|
|
|
- void _onError(sender, e) async {
|
|
|
- logger.i("测试失败,请确定放好试纸并且试纸已浸湿尿液");
|
|
|
- PromptBox.toast("测试失败,请确定放好试纸并且试纸已浸湿尿液");
|
|
|
- isAutoTesting = false;
|
|
|
- setState(() {});
|
|
|
- }
|
|
|
-
|
|
|
- void _onDisconnected(sender, e) {
|
|
|
- print('设备连接中断 errorCount:$errorCount');
|
|
|
- logger.i("设备连接中断:${worker!.mac} errorCount:$errorCount");
|
|
|
- if (errorCount < 3) {
|
|
|
- errorCount++;
|
|
|
-
|
|
|
- tryReconnect();
|
|
|
- } else {
|
|
|
- isConnectFail = true;
|
|
|
- }
|
|
|
- connectStatus = WorkerStatus.disconnected;
|
|
|
- setState(() {});
|
|
|
- }
|
|
|
-
|
|
|
@override
|
|
|
Widget build(BuildContext context) {
|
|
|
return Stack(
|
|
|
children: [
|
|
|
_buildUrinalysis(),
|
|
|
- if (!isConnectFail)
|
|
|
- DeviceStatusPosition(
|
|
|
- deviceStatus: DeviceStatus(connectStatus: connectStatus),
|
|
|
- )
|
|
|
- else
|
|
|
- _buildErrorButton(),
|
|
|
- // _buildAutoTest(),
|
|
|
],
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- Widget _buildErrorButton() {
|
|
|
- return DeviceStatusPosition(
|
|
|
- deviceStatus: Row(
|
|
|
- children: [
|
|
|
- const Text(
|
|
|
- '请确认设备是否启动',
|
|
|
- style: TextStyle(fontSize: 24, color: Colors.red),
|
|
|
- ),
|
|
|
- IconButton(
|
|
|
- onPressed: () {
|
|
|
- tryReconnect();
|
|
|
- setState(() {
|
|
|
- connectStatus = WorkerStatus.connecting;
|
|
|
- isConnectFail = false;
|
|
|
- });
|
|
|
- },
|
|
|
- icon: const Icon(Icons.refresh),
|
|
|
- iconSize: 32,
|
|
|
- ),
|
|
|
- ],
|
|
|
- ),
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- Widget _buildAutoTest() {
|
|
|
- Widget autoTestStatus;
|
|
|
-
|
|
|
- if (isAutoTesting) {
|
|
|
- autoTestStatus = const SizedBox();
|
|
|
- // CountdownPage(
|
|
|
- // seconds: 60,
|
|
|
- // title: "等待测试",
|
|
|
- // );
|
|
|
- } else {
|
|
|
- autoTestStatus = VButton(
|
|
|
- onTap: () {
|
|
|
- worker!.autoTest();
|
|
|
- isAutoTesting = true;
|
|
|
- _value = {};
|
|
|
- setState(() {});
|
|
|
- },
|
|
|
- child: const Center(
|
|
|
- child: Text(
|
|
|
- "采样",
|
|
|
- style: TextStyle(fontSize: 24),
|
|
|
- ),
|
|
|
- ),
|
|
|
- );
|
|
|
- }
|
|
|
- if (connectStatus == WorkerStatus.connected) {
|
|
|
- return Positioned(
|
|
|
- top: 16,
|
|
|
- left: 120,
|
|
|
- child: SizedBox(
|
|
|
- width: 200,
|
|
|
- height: 50,
|
|
|
- child: autoTestStatus,
|
|
|
- ),
|
|
|
- );
|
|
|
- } else {
|
|
|
- return const SizedBox();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
Widget _buildUrinalysis() {
|
|
|
return ExamCard(
|
|
|
title: '尿常规',
|