优化运动心率,血氧检测,修复运动数据异常bug 2061/2 2061/head 2064/target/1
authorpenglei <1624952103@qq.com>
Mon, 11 Aug 2025 10:41:10 +0000 (18:41 +0800)
committerpenglei <1624952103@qq.com>
Mon, 11 Aug 2025 10:41:10 +0000 (18:41 +0800)
code/sdk/application/wearable/fd230/nativeapp/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c
code/sdk/zhihui/drivers/ppg/hx3695/hx3695.c
code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c

index 60b8910..e6d67c4 100644 (file)
@@ -26,7 +26,7 @@
 
 #define MAX_UNWARE_COUNT 10
 #define MAX_VALID_SPO2_COUNT 30
-#define MAX_DISVALID_SPO2_COUNT 100
+#define MAX_DISVALID_SPO2_COUNT 60
 #define BLOOD_TIMER_DATA 1
 
 namespace OHOS {
index 4a83df3..b727ae9 100644 (file)
@@ -257,6 +257,7 @@ void cywee_check_acc(void)
 {
     if(!timeout)
     {
+        // printf("cywee_restart_acc\n");
         cywee_restart_acc();
     }
     else
@@ -1586,6 +1587,9 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) {
 
                 // cywee_func(CYWEE_MSG_TYPE_ACTIVITY_EXTRA_INFO_UPDATE,&c_act_ext_result_t,sizeof(act_ext_result_t));
                 //CustomEventPublish(TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE, &c_act_ext_result_t, sizeof(act_ext_result_t));
+                // CWM_OS_dbgPrintf("PAH:avg_step_freq[%d], avg_step_len[%f],avg_pace[%d], max_step_freq[%d], max_pace[%d]\n",
+                // c_act_ext_result_t.avg_step_freq, c_act_ext_result_t.avg_step_len, c_act_ext_result_t.avg_pace,
+                // c_act_ext_result_t.max_step_freq,c_act_ext_result_t.max_pace);
 
             }else if((int)sensorEVT->fData[0] == 5001)
             {
@@ -1622,7 +1626,7 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) {
                 // cywee_func(CYWEE_MSG_TYPE_ACTIVITY_UPDATE,&c_act_result_t,sizeof(act_result_t));
                 //CustomEventPublish(TOPIC_EVENT_ACTIVITY_UPDATE, &c_act_result_t, sizeof(act_result_t));
                 //CustomEventPublish(TOPIC_EVENT_STEPDATA_UPDATE,&stepcount,sizeof(int)); 
-                // CWM_OS_dbgPrintf("normal mode activit_mode[%d], steps[%d], distance[%d], calories[%d], step frequency[%d], step length[%.2f], pace[%d]\n",
+                // CWM_OS_dbgPrintf("PAH:normal mode activit_mode[%d], steps[%d], distance[%d], calories[%d], step frequency[%d], step length[%.2f], pace[%d]\n",
                 //     c_act_result_t.activity_mode, c_act_result_t.steps, c_act_result_t.distance, c_act_result_t.calories, 
                 //     c_act_result_t.step_frequency,c_act_result_t.step_length, c_act_result_t.pace);
             }
@@ -2138,6 +2142,6 @@ void cywee_get_act_ext_data(act_ext_result_t *data)
 {
     if(data == NULL)
         return;
-    memcpy_s(data,sizeof(act_ext_result_t),&c_act_result_t,sizeof(act_ext_result_t));
+    memcpy_s(data,sizeof(act_ext_result_t),&c_act_ext_result_t,sizeof(act_ext_result_t));
 }
 
index 769ba69..f166ffb 100644 (file)
@@ -132,7 +132,6 @@ uint8_t alg_ram[11 * 1024] __attribute__((aligned(4)));
 //uint8_t alg_ram[10] = {0};\r
 ppg_sensor_data_t ppg_s_data;\r
 \r
-static uint8_t hrs_result = 0;\r
 static int history_wear_status = -1;\r
 static uint8_t wear_status = 0;\r
 static uint8_t spo2_result = 0;\r
@@ -2679,53 +2678,61 @@ void hx3695_ppg_Int_handle(void)
 #endif\r
 }\r
 \r
+#define HRS_WINDOW_SIZE 5\r
 static uint8_t hrs_num = 0;\r
 static int32_t sum_hrs = 0;\r
 static int32_t hrs_data[7] = {0};\r
 static uint8_t left = 0;\r
-static uint8_t right = -1;\r
+static uint8_t right = 0;\r
+static uint8_t avg_hrs = 0;\r
 \r
-static void get_avg_hrs(int32_t hrs)\r
+static void get_avg_hrs(uint8_t hrs)\r
 {\r
-    int32_t min_hrs = 0;\r
-    int32_t max_hrs = 0;\r
-    int32_t avg_hrs = 0;\r
-    if(hrs_num == 7)\r
-    {\r
+\r
+\r
+    if (hrs_num >= HRS_WINDOW_SIZE) {\r
         sum_hrs -= hrs_data[left];\r
-        hrs_data[left] = 0;\r
-        left++;\r
-        left = left % 7;\r
+        left = (left + 1) % HRS_WINDOW_SIZE;\r
         hrs_num--;\r
     }\r
 \r
+    hrs_data[right] = hrs;\r
+    sum_hrs += hrs;\r
+    right = (right + 1) % HRS_WINDOW_SIZE;\r
     hrs_num++;\r
-    right++;\r
-    right = right % 7;\r
 \r
-    hrs_data[right] = hrs;\r
-    sum_hrs += hrs_data[right];   \r
 \r
-    if(hrs_num > 2)\r
+    if (hrs_num > 2) \r
     {\r
-        min_hrs = hrs_data[0];\r
-        max_hrs = hrs_data[0];\r
-        for (int i = 0;i < hrs_num; i++)\r
-        {\r
-            if (hrs_data[i] < min_hrs)\r
-                min_hrs = hrs_data[i];\r
-            if (hrs_data[i] > max_hrs)\r
-                max_hrs = hrs_data[i];\r
+\r
+        uint8_t first_idx = left;\r
+        int32_t min_hrs = hrs_data[first_idx];\r
+        int32_t max_hrs = hrs_data[first_idx];\r
+\r
+\r
+        for (uint8_t i = 0; i < hrs_num; i++) {\r
+            uint8_t current_idx = (left + i) % HRS_WINDOW_SIZE;\r
+            uint8_t current_hrs = hrs_data[current_idx];\r
+\r
+            if (current_hrs < min_hrs) {\r
+                min_hrs = current_hrs;\r
+            }\r
+            if (current_hrs > max_hrs) {\r
+                max_hrs = current_hrs;\r
+            }\r
         }\r
-        avg_hrs = (sum_hrs - max_hrs - min_hrs) / (hrs_num - 2);\r
-        //PRINT("max_hrs[%d],min_hrs[%d],avg_hrs[%d]\n",max_hrs,min_hrs,avg_hrs);\r
-        hrsresult.lastesthrs = avg_hrs;\r
+\r
+        uint8_t valid_count = hrs_num - 2;\r
+        avg_hrs = (sum_hrs - max_hrs - min_hrs) / valid_count;\r
+\r
+        // printf("max_hrs[%d],min_hrs[%d],avg_hrs[%d]\n",max_hrs,min_hrs,avg_hrs);\r
     }\r
 }\r
 \r
+\r
 uint8_t hx3695_get_hrs(void)\r
 {\r
-    return hrs_result;\r
+    return avg_hrs;\r
 }\r
 \r
 uint8_t hx3695_get_spo2(void)\r
@@ -2781,7 +2788,7 @@ void hx3695_unwearstatus_update(void)
   {\r
       wear_status = 0;\r
       hx3695_wearstatus_update();\r
-      hrs_result = 0;\r
+      avg_hrs = 0;\r
 \r
   }\r
 }                              \r
@@ -3033,7 +3040,7 @@ void hx3695_hrs_ppg_Int_handle(void)
     // }\r
 \r
     // PRINT("hrs : %d , wear_status : %d \n",hrsresult.lastesthrs,wear_status);\r
-    hrs_result = hrsresult.lastesthrs;\r
+    avg_hrs = hrsresult.lastesthrs;\r
 \r
     msg_count++;\r
     if(msg_count >= 3)\r
@@ -3042,7 +3049,7 @@ void hx3695_hrs_ppg_Int_handle(void)
 #ifdef SUPPORT_PPG_BLE_SERVICE\r
         if(uapi_dev_runtime_get_hrs_ble_status())\r
         {\r
-            ble_ppgtest_server_send_input_report(&hrs_result,1);\r
+            ble_ppgtest_server_send_input_report(&avg_hrs,1);\r
         }\r
 #endif\r
 \r
@@ -3060,7 +3067,7 @@ void hx3695_hrs_ppg_Int_handle(void)
           if(uapi_dev_runtime_get_train_status())\r
           {\r
               hx3695_wearstatus_update();\r
-              // hrs_result = hrsresult.lastesthrs;\r
+              // avg_hrs = hrsresult.lastesthrs;\r
               // do_cywee_service_check_msg(CYWEE_SERVICE_CMD_HRS_CHANGE,&cywee_data);\r
           }\r
     }\r
@@ -3897,6 +3904,15 @@ void hx3695_control(char *mode,uint8_t enable)
                 hx3695_wearstatus_update();   \r
                 uapi_dev_runtime_set_hrs_passivity(0);//清除被动检测runtime     \r
             }\r
+\r
+            hrs_num = 0;\r
+            sum_hrs = 0;\r
+            memset(hrs_data,0,7);\r
+\r
+            left = 0;\r
+            right = 0;\r
+            avg_hrs = 0;\r
+            wear_cnt = 0;\r
 #endif\r
         }else  if(md == HRV_MODE)\r
         {\r
index 5bb0291..23a53ca 100644 (file)
@@ -19,6 +19,8 @@
 #ifdef SUPPORT_PPG_BLE_SERVICE\r
 #include "ppgBleService.h"\r
 #endif\r
+\r
+#define HRS_WINDOW_SIZE 5\r
 //============================================================================\r
 // Static Global Variable\r
 //============================================================================\r
@@ -85,7 +87,6 @@ static osTimerId_t g_pah8009_timer = NULL;
 \r
 static uint8_t time_cnt = 0;\r
 static uint8_t wear_cnt = 0;\r
-static uint8_t wear_cnt = 0;\r
 \r
 static int history_wear_status = -1;\r
 \r
@@ -96,7 +97,7 @@ static uint8_t hrs_num = 0;
 static int32_t sum_hrs = 0;\r
 static int8_t hrs_data[7] = {0};\r
 static uint8_t left = 0;\r
-static uint8_t right = -1;\r
+static uint8_t right = 0;\r
 static uint8_t avg_hrs = 0;\r
 \r
 static uint8_t timeout = 0;\r
@@ -394,7 +395,7 @@ void pah_sensor_stop(void)
     memset(hrs_data,0,7);\r
 \r
     left = 0;\r
-    right = -1;\r
+    right = 0;\r
     avg_hrs = 0;\r
     wear_cnt = 0;\r
 }\r
@@ -488,40 +489,48 @@ void hr_algorithm_disable(void)
 \r
 static void get_avg_hrs(uint8_t hrs)\r
 {\r
-    int32_t min_hrs = 0;\r
-    int32_t max_hrs = 0;\r
-    if(hrs_num == 5)\r
-    {\r
+\r
+\r
+    if (hrs_num >= HRS_WINDOW_SIZE) {\r
         sum_hrs -= hrs_data[left];\r
-        hrs_data[left] = 0;\r
-        left++;\r
-        left = left % 5;\r
+        left = (left + 1) % HRS_WINDOW_SIZE;\r
         hrs_num--;\r
     }\r
 \r
+    hrs_data[right] = hrs;\r
+    sum_hrs += hrs;\r
+    right = (right + 1) % HRS_WINDOW_SIZE;\r
     hrs_num++;\r
-    right++;\r
-    right = right % 5;\r
 \r
-    hrs_data[right] = hrs;\r
-    sum_hrs += hrs_data[right];   \r
 \r
-    if(hrs_num > 2)\r
+    if (hrs_num > 2) \r
     {\r
-        min_hrs = hrs_data[0];\r
-        max_hrs = hrs_data[0];\r
-        for (int i = 0;i < hrs_num; i++)\r
-        {\r
-            if (hrs_data[i] < min_hrs)\r
-                min_hrs = hrs_data[i];\r
-            if (hrs_data[i] > max_hrs)\r
-                max_hrs = hrs_data[i];\r
+\r
+        uint8_t first_idx = left;\r
+        int32_t min_hrs = hrs_data[first_idx];\r
+        int32_t max_hrs = hrs_data[first_idx];\r
+\r
+\r
+        for (uint8_t i = 0; i < hrs_num; i++) {\r
+            uint8_t current_idx = (left + i) % HRS_WINDOW_SIZE;\r
+            uint8_t current_hrs = hrs_data[current_idx];\r
+\r
+            if (current_hrs < min_hrs) {\r
+                min_hrs = current_hrs;\r
+            }\r
+            if (current_hrs > max_hrs) {\r
+                max_hrs = current_hrs;\r
+            }\r
         }\r
-        avg_hrs = (sum_hrs - max_hrs - min_hrs) / (hrs_num - 2);\r
+\r
+        uint8_t valid_count = hrs_num - 2;\r
+        avg_hrs = (sum_hrs - max_hrs - min_hrs) / valid_count;\r
+\r
         // printf("max_hrs[%d],min_hrs[%d],avg_hrs[%d]\n",max_hrs,min_hrs,avg_hrs);\r
     }\r
 }\r
 \r
+\r
 void hr_alg_task(void)\r
 {\r
     if(Check_alg_enable())\r
@@ -581,18 +590,24 @@ void hr_alg_task(void)
 #ifdef SUPPORT_PPG_SERVICE\r
                 time_cnt++;\r
 \r
-                if(time_cnt > 13)\r
-                {\r
-#ifdef SUPPORT_CYWEE_SERVICE\r
-                    do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CHECK_ACC, NULL); // 检查gsensor是否停止\r
-#endif\r
-                }\r
+//                 if(time_cnt > 15)\r
+//                 {\r
+// #ifdef SUPPORT_CYWEE_SERVICE\r
+//                     do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CHECK_ACC, NULL); // 检查gsensor是否停止\r
+// #endif\r
+//                 }\r
 \r
 \r
                 if(time_cnt >= 20) \r
                 {\r
+                    time_cnt = 0;\r
                     // ppg_msg_callback_t func =  ppg_get_send_msg_callback_func();\r
-\r
+#ifdef SUPPORT_CYWEE_SERVICE\r
+                    // if(uapi_dev_runtime_get_train_status())\r
+                    {\r
+                        do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CHECK_ACC, NULL); // 检查gsensor是否停止\r
+                    }\r
+#endif\r
                     uint8_t data = (uint8_t)hr;\r
 \r
                     if(data > 30 && data < 220)\r
@@ -603,7 +618,6 @@ void hr_alg_task(void)
 \r
                     // data = cywee_wear_status;\r
                     // func(PPG_MSG_TYPE_WEARSTAT_UPDATE, &data, 1);\r
-                    time_cnt = 0;\r
 \r
 #ifdef SUPPORT_PPG_BLE_SERVICE\r
                     if(uapi_dev_runtime_get_hrs_ble_status())\r
@@ -612,12 +626,6 @@ void hr_alg_task(void)
                     }\r
 #endif\r
 \r
-#ifdef SUPPORT_CYWEE_SERVICE\r
-                    // if(uapi_dev_runtime_get_train_status())\r
-                    {\r
-                        do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CHECK_ACC, NULL); // 检查gsensor是否停止\r
-                    }\r
-#endif\r
                 }\r
 \r
                 \r
@@ -942,6 +950,17 @@ void spo2_alg_task(void)
 #ifdef SUPPORT_PPG_SERVICE\r
                 time_cnt++;\r
 \r
+                if(time_cnt >= 20) \r
+                {\r
+                    time_cnt = 0;\r
+                    // ppg_msg_callback_t func =  ppg_get_send_msg_callback_func();\r
+#ifdef SUPPORT_CYWEE_SERVICE\r
+                    // if(uapi_dev_runtime_get_train_status())\r
+                    {\r
+                        do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CHECK_ACC, NULL); // 检查gsensor是否停止\r
+                    }\r
+#endif\r
+                }\r
                 // ppg_msg_callback_t func =  ppg_get_send_msg_callback_func();\r
 \r
                 // if(func != NULL && time_cnt >= 25)\r
@@ -1499,9 +1518,10 @@ static void process(uint64_t timestamp)
             ppg_mems_data.duration = duration;\r
             \r
             ppg_mems_data.ppg_data = ppg_data ;\r
-            ppg_mems_data.touch_flag = touch_flag ;\r
+\r
+            ppg_mems_data.touch_flag = history_wear_status ;\r
             ppg_mems_data.ppg_frame_count = _main.ppg_frame_count;    //SD-revise-20200320\r
-                                        \r
+                              \r
             pah_push(&ppg_mems_data);\r
 \r
 #ifdef PPG_MEMS_Synchronize          \r
@@ -1523,13 +1543,13 @@ static void process(uint64_t timestamp)
     \r
     if (_main.is_Auto_mode || _main.touch_is_enabled)//SD-reivse-20191205\r
     {\r
-        if ( _main.touch_last_is_touched != touch_flag)\r
+        if ( _main.touch_last_is_touched != history_wear_status)\r
         {\r
-            _main.touch_last_is_touched = touch_flag;   \r
+            _main.touch_last_is_touched = history_wear_status;   \r
                 \r
-            report_touch_data(timestamp, &touch_flag);\r
+            report_touch_data(timestamp, &history_wear_status);\r
                 \r
-            bool is_touched = (touch_flag >= 1);\r
+            bool is_touched = (history_wear_status >= 1);\r
 \r
             if (_main.is_Auto_mode && is_touched)//SD-revise-20191205\r
             {             \r
@@ -1758,9 +1778,8 @@ void pah8009_int_handler(void)
 \r
 void pah8009_check_int(void)\r
 {\r
-    if(work_mode != 1)\r
+    if(work_mode > 3 || work_mode < 1)\r
     {\r
-        // printf("work_mode != 1\n");\r
         return;\r
     }\r
 \r