controller.dart 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import 'package:fis_jsonrpc/rpc.dart';
  2. import 'package:get/get.dart';
  3. import 'package:vitalapp/architecture/defines.dart';
  4. import 'package:vitalapp/managers/device_controller_manager.dart';
  5. import 'package:vitalapp/managers/interfaces/device.dart';
  6. import 'package:vitalapp/managers/interfaces/models/device.dart';
  7. import 'package:vitalapp/pages/controllers/blue_location_mixin.dart';
  8. import 'package:vitalapp/pages/medical/models/worker.dart';
  9. import 'package:vitalapp/pages/patient/card_reader/controller.dart';
  10. import 'package:vnote_device_plugin/consts/types.dart';
  11. import 'package:vnote_device_plugin/devices/ic_reader.dart';
  12. import 'package:vnote_device_plugin/models/exams/ic_reader.dart';
  13. import 'package:fis_common/logger/logger.dart';
  14. class BluetoothCardReaderController extends FControllerBase
  15. with BluetoothAndLocationMixin {
  16. BluetoothCardReaderController();
  17. ICReaderDeviceWorker? worker;
  18. DeviceControllerManager? icReader;
  19. WorkerStatus connectStatus = WorkerStatus.connecting;
  20. /// 是否连接中
  21. bool get isCardReaderConnecting => connectStatus == WorkerStatus.connecting;
  22. /// 是否已连接
  23. bool get isCardReaderConnected => connectStatus == WorkerStatus.connected;
  24. final _deviceManager = Get.find<IDeviceManager>();
  25. // _initData() async {
  26. // bool result = await Idread.init();
  27. // if (result) {
  28. // bool start = await Idread.startRead();
  29. // if (start) {
  30. // Idread.dataStreamListen((data) {
  31. // if (data is IdCardInfoModel) {
  32. // onReadInfo(data);
  33. // }
  34. // });
  35. // }
  36. // }
  37. // isCardReaderConnected = result;
  38. // update(["bluetooth_card_reader"]);
  39. // }
  40. Future<DeviceModel?> getDevice(String type) async {
  41. List<DeviceModel> devices = await _deviceManager.getDeviceList();
  42. return devices.firstWhereOrNull((element) => element.type == type);
  43. }
  44. connectDevice() async {
  45. logger.i('BluetoothCardReaderController connectDevice');
  46. DeviceModel? device = await getDevice(DeviceTypes.IC_READER);
  47. if (device == null) {
  48. logger.i('BluetoothCardReaderController device is null');
  49. connectStatus = WorkerStatus.unboundDevice;
  50. worker = null;
  51. return;
  52. }
  53. logger.i('BluetoothCardReaderController device is not null');
  54. if (icReader != null) {
  55. icReader!.dispose();
  56. releaseListeners();
  57. await Future.delayed(const Duration(milliseconds: 500)); // 等待上一个reader释放
  58. }
  59. icReader = DeviceControllerManager(
  60. DeviceTypes.IC_READER, device.model, device.mac);
  61. logger.i(
  62. 'BluetoothCardReaderController icReader: ${device.model}, ${device.mac} .');
  63. worker = icReader?.worker as ICReaderDeviceWorker;
  64. logger.i('BluetoothCardReaderController get worker');
  65. loadListeners();
  66. connectStatus = icReader!.connectStatus;
  67. update(["bluetooth_card_reader"]);
  68. }
  69. Future<void> icReaderDevice() async {
  70. // await checkDeviceConnectEnv();
  71. logger.i('BluetoothCardReaderController icReaderDevice');
  72. await connectDevice();
  73. }
  74. void loadListeners() {
  75. logger.i('BluetoothCardReaderController loadListeners');
  76. worker?.successEvent.addListener(_onSuccess);
  77. worker!.connectErrorEvent.addListener(_onConnectFail);
  78. worker!.connectedEvent.addListener(_onConnectSuccess);
  79. worker!.disconnectedEvent.addListener(_onDisconnected);
  80. worker!.connect();
  81. }
  82. void releaseListeners() {
  83. worker!.successEvent.removeListener(_onSuccess);
  84. worker!.connectErrorEvent.removeListener(_onConnectFail);
  85. worker!.connectedEvent.removeListener(_onConnectSuccess);
  86. worker!.disconnectedEvent.removeListener(_onDisconnected);
  87. }
  88. /// 读取到数据的回调
  89. void onReadInfo(ICReaderExamData data) {
  90. final result = CardReaderResult(
  91. success: true,
  92. cardNo: data.cardNo,
  93. name: data.name,
  94. nation: data.nation,
  95. gender: data.gender == '男' ? GenderEnum.Male : GenderEnum.Female,
  96. birthday: DateTime.parse(data.birthday),
  97. address: data.address,
  98. );
  99. Get.back(
  100. result: result,
  101. );
  102. }
  103. void _onSuccess(_, ICReaderExamData e) {
  104. logger.i('读卡成功 ${e.name}');
  105. onReadInfo(e);
  106. connectStatus = WorkerStatus.connected;
  107. update(["bluetooth_card_reader"]);
  108. }
  109. void _onConnectFail(sender, e) {
  110. print('连接设备失败');
  111. logger.i('BluetoothCardReaderController 连接设备失败');
  112. connectStatus = WorkerStatus.connectionFailed;
  113. update(["bluetooth_card_reader"]);
  114. }
  115. void _onConnectSuccess(sender, e) {
  116. logger.i('BluetoothCardReaderController connectStatus:$connectStatus 连接成功');
  117. logger.i('BluetoothCardReaderController _onConnectSuccess');
  118. connectStatus = WorkerStatus.connected;
  119. update(["bluetooth_card_reader"]);
  120. }
  121. void _onDisconnected(sender, e) {
  122. print('设备连接中断');
  123. logger.i('BluetoothCardReaderController 设备连接中断');
  124. connectStatus = WorkerStatus.disconnected;
  125. update(["bluetooth_card_reader"]);
  126. }
  127. @override
  128. void onReady() {
  129. super.onReady();
  130. icReaderDevice();
  131. }
  132. @override
  133. void onClose() {
  134. if (worker != null) {
  135. releaseListeners();
  136. worker!.disconnect();
  137. worker!.dispose();
  138. worker = null;
  139. }
  140. super.onClose();
  141. }
  142. }