心率血氧:优化异常数据存储
authorCaisking <3449750381@qq.com>
Thu, 28 Nov 2024 12:05:08 +0000 (20:05 +0800)
committerCaisking <3449750381@qq.com>
Thu, 28 Nov 2024 12:05:08 +0000 (20:05 +0800)
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/drivers/peripheral/config/include/ConfigModelC.h
code/sdk/drivers/peripheral/config/src/ConfigModel.cpp
code/sdk/drivers/peripheral/utils/custom_utils_at_cmd.c

index 9cf112a..f8d5a61 100644 (file)
@@ -159,12 +159,14 @@ namespace OHOS
     {
         uint16_t MiniBlood = ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_OXYGEN_THRESHOLD_VALUE);
 
-        // 检查当前血氧值并设置结果
-        if (currentspo2 < MiniBlood && currentspo2 != 0)
-        {
-            // 测量结果小于最小血氧值
-            bloodresult_ = BloodResult::LOW_RESULT;
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况, currentspo2 = %d, MiniBlood = %d", currentspo2, MiniBlood);
+        // 检查当前血氧值并设置结果 需要检测成功
+        if(bloodresult_ == BloodResult::SUCCESS){
+            if (currentspo2 < MiniBlood && currentspo2 != 0)
+            {
+                // 测量结果小于最小血氧值
+                bloodresult_ = BloodResult::LOW_RESULT;
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果: 低结果情况, currentspo2 = %d, MiniBlood = %d", currentspo2, MiniBlood);
+            }
         }
 
         // 根据结果进行处理
@@ -197,6 +199,8 @@ namespace OHOS
             healthState.resultStatus = LOW;
             healthState.checkResult = MiniBlood;
             HealthService::GetInstance()->SetHealthCurrent(healthState);
+            //保存异常数据
+            Blood_Save();
             NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);
             break;
         }
index 38ac39b..ee2c95a 100644 (file)
@@ -21,6 +21,7 @@
 #include "uiservice/include/ui_service.h"\r
 #include "wearable_log.h"\r
 #include <algorithm>\r
+\r
 #include <bleEvent.h>\r
 #include <cmsis_os.h>\r
 #include <cmsis_os2.h>\r
@@ -40,6 +41,8 @@
 #include "languagecode/LanguageInit.h"\r
 #include "ui_service.h"\r
 \r
+#include "hx3695.h"\r
+\r
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif\r
@@ -475,6 +478,7 @@ void HeartModel::Heart_Stop() {
     Heart_Control(HeartState::End, HeartCheck::PASSIVITY);\r
     return;\r
   }\r
+  //呼吸训练模式下不进行息屏与保存\r
   if (sensorstate && uapi_dev_runtime_get_respiratory_training_status() != 1) {\r
     // 恢复正常亮屏\r
     HeartModel::GetInstance()->heart_stop_screen60s_timer();\r
@@ -514,34 +518,39 @@ void HeartModel::Heart_Save() {
 }\r
 \r
 void HeartModel::Heart_Result() {\r
-  // 获取心率提醒状态和阈值\r
-  heartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
-      ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
-  thresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
-      ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
-\r
-  if (heartRemindState) {\r
-    // 获取当前心率状态\r
-    thresholdState = ConfigModel::GetInstance()->get_configData_int(\r
-        ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
-\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
+  if (heartresult_ == HeartResult::SUCCESS) {\r
+    // 获取心率提醒状态和阈值\r
+    heartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
+        ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
+    thresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
+        ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
+\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "心率提醒状态:%d,阈值:%d,當前值:%d",\r
+                  heartRemindState, thresholdValue, currentheart);\r
+\r
+    if (heartRemindState) {\r
+      // 获取当前心率状态\r
+      thresholdState = ConfigModel::GetInstance()->get_configData_int(\r
+          ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
+\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
   // 根据结果进行处理\r
   handleHeartResult();\r
 }\r
@@ -565,10 +574,12 @@ void HeartModel::handleHeartResult() {
     break;\r
 \r
   case HeartResult::LOW_RESULT:\r
+    Heart_Save();\r
     handleLowHeartRate();\r
     break;\r
 \r
   case HeartResult::HIGH_RESULT:\r
+    Heart_Save();\r
     handleHighHeartRate();\r
     break;\r
 \r
index 6d998b5..de2fb6a 100644 (file)
@@ -107,8 +107,17 @@ int get_sedentary_time_from_config_model(void);
 int get_sedentary_interval_from_config_model(void);
 bool get_motion_recognition_from_config_model(void);
 int get_config_heart_from_config_model(void);
-//设置睡眠频率
+
+/* ---------------------------------- 健康管理 ---------------------------------- */
+//设置心率周期检测频率
 void set_config_heart(int heartRateDetectionFreq);
+//設置心率最高值
+void set_config_heart_max(int heartRateMax);
+//設置心率最低值
+void set_config_heart_min(int heartRateMin);
+//設置血氧最低值
+void set_config_spo2_min(int spo2Min);
+/* -------------------------------------------------------------------------- */
 
 // sleep mode switch
 void mmi_sleep_mode_switch_read(void);
index 04da1a3..46d350d 100644 (file)
@@ -1472,10 +1472,9 @@ int get_wake_up_time_from_config_model(void)
     wake_up_time = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_GET_UP);
     return wake_up_time;
 }
-
+// 设置心率检测频率
 void set_config_heart(int heartRateDetectionFreq)
 {
-     // 设置心率检测频率
     OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED, heartRateDetectionFreq);
 }
 
@@ -1486,7 +1485,23 @@ int get_config_heart_from_config_model(void)
     time = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_DETECTED);
     return time;
 }
-
+//设置最大心率
+void set_config_heart_max(int heartRateMax) {
+    OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND, 1);
+    OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN, 1);
+    OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE, heartRateMax);
+}
+//设置最小心率
+void set_config_heart_min(int heartRateMin) {
+    OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND, 1);
+    OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN, 0);    
+    OHOS::ConfigModel::GetInstance()->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE, heartRateMin); 
+}
+//设置最小血氧
+void set_config_spo2_min(int spo2Min) {
+    OHOS::ConfigModel::GetInstance()->set_condigData_Int(  
+    OHOS::ConfigModel::CONFIGMODEL_ITEM_OXYGEN_THRESHOLD_VALUE, spo2Min);  
+}
 //获取久坐提醒开关
 int get_sedentary_switch_from_config_model(void)
 {
index 863f798..fdaf34e 100644 (file)
@@ -776,37 +776,44 @@ static uint32_t custom_mem_debug(uint8_t *para, uint32_t paraLen, char *strCommo
         wstp_print("Restoring Factory Settings...\n");
         return ERRCODE_SUCC;
     }
-
-#if 1
-    /*设置心率检测频率*/
-    static uint32_t custom_set_heart(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
-    {
-        UNUSED(strCommonCmd);
+    static uint32_t custom_set_health(uint8_t *para, uint32_t paraLen, char *strCommonCmd) {  
+        UNUSED(strCommonCmd);  
 
         uint8_t argv[CUSTOM_UTILS_MAX_ARGC][CUSTOM_UTILS_MAX_ARGV_LEN] = {0};
         uint32_t argc = 0;
 
-        int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
-        if (ret != CUSTOM_UTILS_SUCCESS)
-        {
-            wstp_print("CUSTOM_UTILSTEST ATCMD Convert Command Failed\n");
-            return ERRCODE_FAIL;
-        }
-
-        if (argc != 1)
-        {
-            wstp_print("CUSTOM_UTILSTEST power_test ATCMD Set Parameter Failed argc %d\r\n");
-            return ERRCODE_FAIL;
-        }
-        int heartRateDetectionFreq = atol((char *)argv[0]);
-
-        // 设置心率检测频率
-        set_config_heart(heartRateDetectionFreq);
-
-        wstp_print("heartRateDetectionFreq is %d\n", heartRateDetectionFreq);
-        return ERRCODE_SUCC;
+        wstp_print("開始設置健康數據\n");
+
+        int ret = ConvertCmdToParam(para, paraLen, argv, &argc);  
+        if (ret != CUSTOM_UTILS_SUCCESS) {  
+            wstp_print("CUSTOM_UTILSTEST ATCMD 转换命令失败\n");  
+            return ERRCODE_FAIL;  
+        }  
+
+        int set_health_type = atol((char *)argv[0]);
+        int data = atol((char *)argv[1]);
+        wstp_print("設置健康數據 %d %d\n", set_health_type, data);
+
+        switch (set_health_type) {  
+            case 0: // 心率检测周期  
+                set_config_heart(data);  
+                break;
+            case 1: // 心率最高值
+                set_config_heart_max(data);  
+                break;
+            case 2: // 心率最低值
+                set_config_heart_min(data);  
+                break;  
+            case 3: // 血氧最低值  
+                set_config_spo2_min(data);  
+                break;  
+            default:  
+                wstp_print("错误:无效的健康类型 %d\n", set_health_type);  
+                return ERRCODE_FAIL;  
+        }  
+
+        return ERRCODE_SUCC; // 成功  
     }
-#endif
 
 static uint32_t custom_get_cywee_chip_info(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
 {
@@ -1513,7 +1520,9 @@ static const at_cmd_table_t g_custom_utils_cmd[] = {
     { (char *)"AT^MEMDEBUG",      custom_mem_debug, (char *)" " },
     
     {(char *)"AT^RESTORE", custom_restore_factory_settings, (char *)" "},
-    {(char *)"AT^SETHEART", custom_set_heart, (char *)" "},
+    {(char *)"AT^SETHEALTH", custom_set_health, (char *)" "},
+
+    
     {(char *)"AT^LSFD", custom_lsfd, (char *)" "},
 
     {(char *)"AT^GETMAC", custom_get_bt_addr, (char *)" "},