浏览代码

HeartDeviceWorker

Melon 1 年之前
父节点
当前提交
cc6e8f480f
共有 3 个文件被更改,包括 93 次插入27 次删除
  1. 37 0
      lib/devices/heart.dart
  2. 56 0
      lib/models/exams/heart.dart
  3. 0 27
      test/vnote_device_plugin_method_channel_test.dart

+ 37 - 0
lib/devices/heart.dart

@@ -0,0 +1,37 @@
+import 'package:vnote_device_plugin/consts/status.dart';
+import 'package:vnote_device_plugin/consts/types.dart';
+import 'package:vnote_device_plugin/devices/base.dart';
+import 'package:vnote_device_plugin/events/event_type.dart';
+import 'package:vnote_device_plugin/models/exams/heart.dart';
+
+/// 心电
+class HeartDeviceWorker extends DeviceWorkerBase {
+  HeartDeviceWorker({
+    required super.model,
+    required super.mac,
+  }) : super(type: DeviceTypes.HEART) {
+    // injectStatusCallback(VDeviceEventStatus.EXAM_Heart_SUCCESS, _onValue);
+    // injectStatusCallback(VDeviceEventStatus.EXAM_Heart_POINTS, _onPoints);
+    // injectStatusCallback(
+    //     VDeviceEventStatus.EXAM_HeartPROBE_FALLOFF_ERROR, _onFalloffError);
+  }
+
+  /// 实时更新事件
+  final valueUpdateEvent = FEventHandler<HeartExamData>();
+
+  /// 接收结构事件
+  final resultReceivedEvent = FEventHandler<int>();
+
+  /// 测量错误事件
+  final errorEvent = FEventHandler<String>();
+
+  void _onValueUpdate(Map<String, dynamic>? data) {
+    final HeartExamData examData = HeartExamData.fromEventData(data!);
+    valueUpdateEvent.emit(this, examData);
+  }
+
+  void _onFalloffError(Map<String, dynamic>? data) {
+    const String msg = "导联脱落"; // TODO: pick message from data
+    errorEvent.emit(this, msg);
+  }
+}

+ 56 - 0
lib/models/exams/heart.dart

@@ -0,0 +1,56 @@
+/// 心电分析结果枚举
+enum HeartAnalysisResult {
+  /// 正常
+  normal,
+
+  /// 心率过快
+  fast,
+
+  /// 心率过缓
+  slow,
+  //TODO:
+}
+
+/// 心电检测数据
+class HeartExamData {
+  /// 心率
+  final int heartRate;
+
+  /// ECG波点集合
+  final List<int> ecgPoints;
+
+  HeartExamData({
+    required this.heartRate,
+    required this.ecgPoints,
+  });
+
+  factory HeartExamData.fromEventData(Map<String, dynamic> jsonMap) {
+    final pointList =
+        (jsonMap["ECG_POINT"] as List).map((e) => e as int).toList();
+    return HeartExamData(
+      heartRate: jsonMap["HR"],
+      ecgPoints: pointList,
+    );
+  }
+}
+
+/// 心电检测结果
+class HeartExamResult {
+  /// 心率
+  final int heartRate;
+
+  /// 分析结果
+  final HeartAnalysisResult analysis;
+
+  HeartExamResult({
+    required this.heartRate,
+    required this.analysis,
+  });
+
+  factory HeartExamResult.fromEventData(Map<String, dynamic> jsonMap) {
+    return HeartExamResult(
+      heartRate: jsonMap["HR"],
+      analysis: jsonMap["ANALYSIS"],
+    );
+  }
+}

+ 0 - 27
test/vnote_device_plugin_method_channel_test.dart

@@ -1,27 +0,0 @@
-import 'package:flutter/services.dart';
-import 'package:flutter_test/flutter_test.dart';
-import 'package:vnote_device_plugin/vnote_device_plugin_method_channel.dart';
-
-void main() {
-  TestWidgetsFlutterBinding.ensureInitialized();
-
-  MethodChannelVnoteDevicePlugin platform = MethodChannelVnoteDevicePlugin();
-  const MethodChannel channel = MethodChannel('vnote_device_plugin');
-
-  setUp(() {
-    TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(
-      channel,
-      (MethodCall methodCall) async {
-        return '42';
-      },
-    );
-  });
-
-  tearDown(() {
-    TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockMethodCallHandler(channel, null);
-  });
-
-  test('getPlatformVersion', () async {
-    expect(await platform.getPlatformVersion(), '42');
-  });
-}