bool_oxygen.dart 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:vitalapp/components/dialog_number.dart';
  4. import 'package:vitalapp/pages/medical/widgets/device_status_position.dart';
  5. import 'package:vnote_device_plugin/consts/types.dart';
  6. import 'package:vnote_device_plugin/devices/sp_o2.dart';
  7. import 'package:vnote_device_plugin/models/exams/sp_o2.dart';
  8. import 'package:vitalapp/pages/check/widgets/exam_configurable/exam_card.dart';
  9. import 'package:vitalapp/pages/medical/controller.dart';
  10. import 'package:vitalapp/pages/medical/controllers/oxygen.dart';
  11. import 'package:vitalapp/pages/medical/models/worker.dart';
  12. import 'package:vitalapp/pages/medical/widgets/device_status.dart';
  13. import 'package:vitalapp/pages/medical/widgets/side_bar.dart';
  14. class BloodOxygen extends StatefulWidget {
  15. const BloodOxygen({Key? key}) : super(key: key);
  16. @override
  17. State<BloodOxygen> createState() => _ExamBloodOxygenState();
  18. }
  19. class _ExamBloodOxygenState extends State<BloodOxygen> {
  20. final controller = Get.find<MedicalController>();
  21. late SpO2DeviceController spo2;
  22. SpO2DeviceWorker? worker;
  23. String pulse = '';
  24. String spO2 = '';
  25. int errorCount = 0; //设备重连失败次数
  26. WorkerStatus _connectStatus = WorkerStatus.connecting;
  27. @override
  28. void initState() {
  29. super.initState();
  30. initOxygen();
  31. }
  32. @override
  33. void dispose() {
  34. disconnect();
  35. worker?.dispose();
  36. super.dispose();
  37. }
  38. Future<void> initOxygen() async {
  39. await currentDevice();
  40. await initData();
  41. }
  42. Future<void> currentDevice() async {
  43. final device = await controller.getDevice(DeviceTypes.SPO2);
  44. if (device == null) {
  45. _connectStatus = WorkerStatus.unboundDevice;
  46. setState(() {});
  47. worker = null;
  48. return;
  49. }
  50. spo2 = SpO2DeviceController(device.model, device.mac);
  51. worker = spo2.worker;
  52. _connectStatus = spo2.connectStatus;
  53. loadListeners();
  54. }
  55. Future<void> initData() async {
  56. await controller.readCachedRecord();
  57. pulse = controller.diagnosisDataValue['SpO2']?['Pulse_Frequency'] ?? '';
  58. spO2 = controller.diagnosisDataValue['SpO2']?['Spo2'] ?? '';
  59. setState(() {});
  60. }
  61. void loadListeners() {
  62. worker!.valueUpdateEvent.addListener(_onSuccess);
  63. worker!.connectErrorEvent.addListener(_onConnectFail);
  64. worker!.connectedEvent.addListener(_onConnectSuccess);
  65. worker!.disconnectedEvent.addListener(_onDisconnected);
  66. worker!.connect();
  67. }
  68. void releaseListeners() {
  69. worker!.connectErrorEvent.removeListener(_onConnectFail);
  70. worker!.connectedEvent.removeListener(_onConnectSuccess);
  71. worker!.valueUpdateEvent.removeListener(_onSuccess);
  72. worker!.disconnectedEvent.removeListener(_onDisconnected);
  73. }
  74. Future<void> disconnect() async {
  75. if (worker != null) {
  76. await worker!.disconnect();
  77. releaseListeners();
  78. }
  79. }
  80. void _onSuccess(_, SpO2ExamValue e) {
  81. setState(() {
  82. pulse = e.pulse.toString();
  83. spO2 = e.spO2.toString();
  84. controller.diagnosisDataValue['SpO2'] = {
  85. 'Pulse_Frequency': pulse,
  86. 'Spo2': spO2
  87. };
  88. controller.saveCachedRecord();
  89. _connectStatus = WorkerStatus.connected;
  90. });
  91. }
  92. void _onConnectFail(sender, e) {
  93. print('连接设备失败');
  94. _connectStatus = WorkerStatus.connectionFailed;
  95. setState(() {});
  96. }
  97. void _onConnectSuccess(sender, e) {
  98. _connectStatus = WorkerStatus.connected;
  99. setState(() {});
  100. }
  101. void _onDisconnected(sender, e) {
  102. print('设备连接中断');
  103. _connectStatus = WorkerStatus.disconnected;
  104. setState(() {});
  105. }
  106. Future<void> _inputOxygen(String title) async {
  107. final result = await VDialogNumber(
  108. title: title,
  109. initialValue: spO2,
  110. ).show();
  111. if (result?.isNotEmpty ?? false) {
  112. spO2 = result ?? '';
  113. }
  114. controller.diagnosisDataValue['SpO2'] = {
  115. 'Pulse_Frequency': pulse,
  116. 'Spo2': spO2
  117. };
  118. controller.saveCachedRecord();
  119. setState(() {});
  120. }
  121. Future<void> _inputOxygen1(String title) async {
  122. final result = await VDialogNumber(
  123. title: title,
  124. initialValue: pulse,
  125. ).show();
  126. if (result?.isNotEmpty ?? false) {
  127. pulse = result ?? '';
  128. }
  129. controller.diagnosisDataValue['SpO2'] = {
  130. 'Pulse_Frequency': pulse,
  131. 'Spo2': spO2
  132. };
  133. controller.saveCachedRecord();
  134. setState(() {});
  135. }
  136. Widget _buildErrorButton() {
  137. return DeviceStatusPosition(
  138. deviceStatus: Row(
  139. children: [
  140. const Text(
  141. '请确认设备是否启动',
  142. style: TextStyle(fontSize: 24, color: Colors.red),
  143. ),
  144. const SizedBox(
  145. width: 8,
  146. ),
  147. IconButton(
  148. onPressed: () {
  149. worker?.connect();
  150. setState(() {
  151. _connectStatus = WorkerStatus.connecting;
  152. errorCount = 0;
  153. });
  154. },
  155. icon: const Icon(Icons.refresh),
  156. iconSize: 32,
  157. ),
  158. const SizedBox(
  159. width: 32,
  160. ),
  161. ],
  162. ),
  163. );
  164. }
  165. @override
  166. Widget build(BuildContext context) {
  167. return Stack(
  168. children: [
  169. ExamCard(
  170. content: Column(
  171. mainAxisAlignment: MainAxisAlignment.start,
  172. children: [
  173. SideBar(
  174. title: '血氧饱和度',
  175. value: spO2 == '0' ? '--' : spO2,
  176. unit: '%',
  177. onTap: () async {
  178. await _inputOxygen('血氧饱和度');
  179. },
  180. ),
  181. const Divider(indent: 30),
  182. SideBar(
  183. title: '脉率',
  184. value: pulse == '0' ? '--' : pulse,
  185. unit: 'bpm',
  186. onTap: () async {
  187. await _inputOxygen1('脉率');
  188. },
  189. ),
  190. ],
  191. ),
  192. ),
  193. if (errorCount < 3)
  194. DeviceStatusPosition(
  195. deviceStatus: DeviceStatus(connectStatus: _connectStatus),
  196. ),
  197. if (errorCount >= 3) _buildErrorButton(),
  198. ],
  199. );
  200. }
  201. }