心率:优化心率数据的存储以及更新 1173/1 1173/head
authorCaisking <3449750381@qq.com>
Sat, 12 Oct 2024 12:37:13 +0000 (20:37 +0800)
committerCaisking <3449750381@qq.com>
Sat, 12 Oct 2024 12:37:13 +0000 (20:37 +0800)
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp

index f6bb63b..ea1cf63 100644 (file)
@@ -150,6 +150,11 @@ public:
   uint16_t *GetArrayData();\r
   void SetArrayData();\r
 \r
+  void handleHeartResult();\r
+  void logAndChangeSlice(HeartResult result);\r
+  void handleLowHeartRate();\r
+  void handleHighHeartRate();\r
+\r
 private:\r
   HealthAllDatas healthDatas;\r
   uint16_t pretime{0};\r
@@ -164,8 +169,8 @@ private:
   bool wearStatus{true};\r
   uint16_t index_ = 0;\r
 \r
-  uint16_t displayheart;     // 显示心率\r
-  uint16_t currentheart;     // 保存心率\r
+  uint16_t displayheart = 0;         // 显示心率\r
+  uint16_t currentheart = 0;         // 保存心率\r
   uint16_t displayheart_max = 0; // 显示最大心率\r
   uint16_t displayheart_min = 0; // 显示最小心率\r
 \r
@@ -186,6 +191,10 @@ private:
   HeartCheck checkstate = HeartCheck::RESTSTSTE;      // 目前检测状态\r
 \r
   uint16_t dynamic_heartrate[5]; //动态心率配置项\r
+\r
+  uint8_t heartRemindState{0};\r
+  uint16_t thresholdValue{160};\r
+  uint16_t thresholdState{1};\r
 };\r
 } // namespace OHOS\r
 \r
index 2c17fa1..73d443a 100644 (file)
@@ -29,9 +29,9 @@ extern "C" {
 #endif\r
 \r
 #define MAX_UNWEAR_COUNT 2\r
-#define MAX_VALID_HRS_COUNT 20\r
-#define MAX_DISVALID_HRS_COUNT 10\r
-#define MIN_DISPLAY_HEART 10\r
+#define MAX_VALID_HRS_COUNT 10    //最大有效数\r
+#define MAX_DISVALID_HRS_COUNT 10 //最大无效数\r
+#define MIN_DISPLAY_HEART 50      //最新心率\r
 #define DISPLAY_COUNT 0\r
 #define HEARTTEST 1 //[0 开启测试 1 关闭]\r
 \r
@@ -429,8 +429,9 @@ void HeartModel::Heart_Start() {
     displayheart = 0;\r
     SetResult(HeartResult::NOT_TESTED); // 重置检测\r
     Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
-    ScreenTurnOn(60 * 1000); // 亮屏操作 600000ms 60秒关闭\r
+    // ScreenTurnOn(60 * 1000); // 亮屏操作 600000ms 60秒关闭\r
     sensorstate = true;\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始心率检测");\r
   }\r
 }\r
 \r
@@ -439,15 +440,13 @@ void HeartModel::Heart_Stop() {
   valid_counter_ = 0;\r
   disvalid_counter_ = 0;\r
   unwear_counter_ = 0;\r
-\r
   // display_counter_ = 0; 取消再次检测的--操作\r
   // displayheart = 0;\r
 \r
-  ScreenTurnOff(); //恢复正常亮屏\r
+  // ScreenTurnOff(); //恢复正常亮屏\r
 \r
   /*主界面卡片检测 或者 被动检测*/\r
-  if (checkstate == HeartCheck::PASSIVITY ||\r
-      checkstate == HeartCheck::CARDCHECK) {\r
+  if (checkstate == HeartCheck::PASSIVITY) {\r
     if (heartresult_ == HeartResult::SUCCESS) {\r
       Heart_Save();\r
       /*更新曲线*/\r
@@ -459,12 +458,9 @@ void HeartModel::Heart_Stop() {
     return;\r
   }\r
 \r
-  if (sensorstate) {\r
-    // Heart_Control(HeartState::End,HeartCheck::INITIATIVE);主动检测心率\r
-    // 不需要关闭\r
-    sensorstate = false;\r
-    Heart_Result(); // 处理结果\r
-  }\r
+  sensorstate = false;\r
+  Heart_Result(); // 处理结果\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束");\r
 }\r
 // 保存检测数据\r
 void HeartModel::Heart_Save() {\r
@@ -478,76 +474,61 @@ void HeartModel::Heart_Save() {
                 data.timestamp);\r
 }\r
 \r
-// 显示检测结果// 显示检测结果\r
 void HeartModel::Heart_Result() {\r
-  // 心率提醒(0开 1关)\r
-  uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
+  // 获取心率提醒状态和阈值\r
+  heartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
       ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
-  uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
+  thresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
       ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
 \r
-  if (HeartRemindState) {\r
-    // 检查当前心率是否高于或低于阈值\r
-    uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(\r
+  if (heartRemindState) {\r
+    // 获取当前心率状态\r
+    thresholdState = ConfigModel::GetInstance()->get_configData_int(\r
         ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
 \r
-    if (ThresholdState == 0 && currentheart < ThresholdValue &&\r
-        currentheart != 0) {\r
-      // 当前心率低于阈值\r
-      heartresult_ = HeartResult::LOW_RESULT;\r
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-                    "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d",\r
-                    currentheart, ThresholdValue);\r
-    } else if (ThresholdState == 1 && currentheart > ThresholdValue) {\r
-      // 当前心率高于阈值\r
-      heartresult_ = HeartResult::HIGH_RESULT;\r
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-                    "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d",\r
-                    currentheart, ThresholdValue);\r
+    if (currentheart != 0) {\r
+      if (thresholdState == 0 && currentheart < thresholdValue) {\r
+        // 当前心率低于阈值\r
+        heartresult_ = HeartResult::LOW_RESULT;\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                      "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d",\r
+                      currentheart, thresholdValue);\r
+      } else if (thresholdState == 1 && currentheart > thresholdValue) {\r
+        // 当前心率高于阈值\r
+        heartresult_ = HeartResult::HIGH_RESULT;\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+                      "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d",\r
+                      currentheart, thresholdValue);\r
+      }\r
     }\r
   }\r
 \r
   // 根据结果进行处理\r
+  handleHeartResult();\r
+}\r
+// 处理检测结果\r
+void HeartModel::handleHeartResult() {\r
   switch (heartresult_) {\r
   case HeartResult::SUCCESS:\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:成功");\r
     Heart_Save();\r
-    /*更新曲线*/\r
+    // 更新曲线\r
     GraphicService::GetInstance()->PostGraphicEvent(\r
         std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
     break;\r
 \r
-  case HeartResult::NOT_WORN:     // 未佩戴状态\r
-  case HeartResult::TIMEOUT:      // 超时情况\r
-  case HeartResult::INVALID_DATA: // 无效数据情况\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况",\r
-                  heartresult_ == HeartResult::NOT_WORN\r
-                      ? "未佩戴状态"\r
-                      : heartresult_ == HeartResult::TIMEOUT ? "超时"\r
-                                                             : "无效数据");\r
-    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+  case HeartResult::NOT_WORN:\r
+  case HeartResult::TIMEOUT:\r
+  case HeartResult::INVALID_DATA:\r
+    logAndChangeSlice(heartresult_);\r
     break;\r
 \r
   case HeartResult::LOW_RESULT:\r
-    // 低心率结果处理\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况");\r
-    HealthState lowHealthState;\r
-    lowHealthState.checkType = BLOOD_CHECK;\r
-    lowHealthState.resultStatus = LOW;\r
-    lowHealthState.checkResult = ThresholdValue;\r
-    HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
-    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+    handleLowHeartRate();\r
     break;\r
 \r
   case HeartResult::HIGH_RESULT:\r
-    // 高心率结果处理\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况");\r
-    HealthState highHealthState;\r
-    highHealthState.checkType = BLOOD_CHECK;\r
-    highHealthState.resultStatus = HIGH;\r
-    highHealthState.checkResult = ThresholdValue;\r
-    HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
-    NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+    handleHighHeartRate();\r
     break;\r
 \r
   default:\r
@@ -555,6 +536,30 @@ void HeartModel::Heart_Result() {
     break;\r
   }\r
 }\r
+//进行日志打印与界面切换\r
+void HeartModel::logAndChangeSlice(HeartResult result) {\r
+  const char *resultMsg =\r
+      (result == HeartResult::NOT_WORN)\r
+          ? "未佩戴状态"\r
+          : (result == HeartResult::TIMEOUT) ? "超时" : "无效数据";\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", resultMsg);\r
+  NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+}\r
+// 处理低心率情况\r
+void HeartModel::handleLowHeartRate() {\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况");\r
+  HealthState lowHealthState = {BLOOD_CHECK, LOW, thresholdValue};\r
+  HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
+  NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+}\r
+// 处理高心率情况\r
+void HeartModel::handleHighHeartRate() {\r
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况");\r
+  HealthState highHealthState = {BLOOD_CHECK, HIGH, thresholdValue};\r
+  HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
+  NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+}\r
+// 设置佩戴状态\r
 void HeartModel::SetWearStatus() {\r
   // 如果处于训练模式,提前返回\r
   if (uapi_dev_runtime_get_train_status() == 1)\r
index cf111be..98abd86 100644 (file)
@@ -129,9 +129,6 @@ static void Training_Notify(void *args, const Topic topic, Request *request) {
   }
   //增加训练runtime控制
   if (uapi_dev_runtime_get_train_status() == 0) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                  "uapi_dev_runtime_get_train_status %d",
-                  uapi_dev_runtime_get_train_status());
     return;
   }
   //训练基本信息更新