提高ppg优先级,优化心率计算 3214/1
author1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Thu, 12 Feb 2026 10:03:16 +0000 (18:03 +0800)
committer1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Thu, 12 Feb 2026 10:03:16 +0000 (18:03 +0800)
code/sdk/zhihui/drivers/ppg/hx3695/hx3695.c
code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp

index ebdb546..26553a2 100644 (file)
@@ -69,7 +69,7 @@ static uint8_t living_status = 0;
 static gsenson_t gsensordata[32];\r
 #endif\r
 \r
-#define HRS_WINDOW_SIZE 5\r
+#define HRS_WINDOW_SIZE 7\r
 static uint8_t hrs_num = 0;\r
 static int32_t sum_hrs = 0;\r
 static int32_t hrs_data[7] = {0};\r
@@ -81,6 +81,8 @@ static uint8_t time_cnt = 0;
 // static uint8_t wear_cnt = 0;\r
 static uint32_t last_system_time = 0;\r
 \r
+static uint8_t last_hrs = 0;\r
+\r
 uint8_t alg_ram[11 * 1024] __attribute__((aligned(4)));\r
 \r
 \r
@@ -1364,6 +1366,19 @@ static void get_avg_hrs(uint8_t hrs)
         uint8_t valid_count = hrs_num - 2;\r
         avg_hrs = (sum_hrs - max_hrs - min_hrs) / valid_count;\r
 \r
+\r
+        if (last_hrs >= 30 && last_hrs <= 210) \r
+        {\r
+            int16_t diff = avg_hrs - last_hrs;\r
+            if (abs(diff) > 10) \r
+            {\r
+                if (diff > 0) \r
+                    avg_hrs = last_hrs + 5;\r
+                else \r
+                    avg_hrs = last_hrs - 5;\r
+            }\r
+        }\r
+        last_hrs = avg_hrs;\r
         // printf("max_hrs[%d],min_hrs[%d],avg_hrs[%d]\n",max_hrs,min_hrs,avg_hrs);\r
     }\r
 }\r
@@ -1460,52 +1475,58 @@ void hx3695_alg_send_data(ppg_sensor_data_t *ppg_sensor_dat, WORK_MODE_T mode, u
                        DEBUG_PRINTF("HRS: %d %d\r\n",hrs_result.data_cnt, hrs_result.hr_result);\r
                        // printf("hr:%d, living:%d, wear_status:%d\n", hrs_result.hr_result,hrs_result.living_status,wear_status);\r
    \r
-            if(uapi_dev_runtime_get_train_status())\r
-            {\r
-                if(hrs_result.hr_result >= 30 && hrs_result.hr_result <= 210)\r
-                    get_avg_hrs(hrs_result.hr_result);\r
-            }\r
-            else\r
+            time_cnt++;\r
+\r
+            if(time_cnt >= 3)\r
             {\r
-                if(hrs_result.living_status == MSG_LIVING_TRUE)\r
+                time_cnt = 0;\r
+                if(uapi_dev_runtime_get_train_status())\r
                 {\r
-                    living_wear_cnt = 0;\r
-\r
                     if(hrs_result.hr_result >= 30 && hrs_result.hr_result <= 210)\r
                         get_avg_hrs(hrs_result.hr_result);\r
-\r
-                    living_status = 1;\r
-                    #ifdef SUPPORT_CYWEE_SERVICE\r
-                    cywee_wear_status_update(&living_status);\r
-                    #endif\r
                 }\r
-                else if(hrs_result.living_status == MSG_LIVING_FAIL)\r
+                else\r
                 {\r
-                    living_wear_cnt++;\r
-                    if(living_wear_cnt >= 5)\r
+                    if(hrs_result.living_status == MSG_LIVING_TRUE)\r
                     {\r
-                        avg_hrs = 0;\r
-                        living_status = 2;\r
-                        wear_status = 0;\r
-                        wear_status_pre = 0;\r
-                        // hx3695_unwearstatus_update();\r
+                        living_wear_cnt = 0;\r
 \r
+                        if(hrs_result.hr_result >= 30 && hrs_result.hr_result <= 210)\r
+                            get_avg_hrs(hrs_result.hr_result);\r
+\r
+                        living_status = 1;\r
                         #ifdef SUPPORT_CYWEE_SERVICE\r
                         cywee_wear_status_update(&living_status);\r
                         #endif\r
+                    }\r
+                    else if(hrs_result.living_status == MSG_LIVING_FAIL)\r
+                    {\r
+                        living_wear_cnt++;\r
+                        if(living_wear_cnt >= 5)\r
+                        {\r
+                            avg_hrs = 0;\r
+                            living_status = 2;\r
+                            wear_status = 0;\r
+                            wear_status_pre = 0;\r
+                            // hx3695_unwearstatus_update();\r
+\r
+                            #ifdef SUPPORT_CYWEE_SERVICE\r
+                            cywee_wear_status_update(&living_status);\r
+                            #endif\r
+                            living_wear_cnt = 0;\r
+                        }\r
+                    }\r
+                    else\r
+                    {\r
                         living_wear_cnt = 0;\r
+                        living_status = 0;\r
                     }\r
                 }\r
-                else\r
-                {\r
-                    living_wear_cnt = 0;\r
-                    living_status = 0;\r
-                }\r
             }\r
-            time_cnt++;\r
+            // time_cnt++;\r
             // if(time_cnt >= 3)\r
             {\r
-                time_cnt = 0;\r
+                // time_cnt = 0;\r
 #ifdef SUPPORT_PPG_BLE_SERVICE \r
 #if 0\r
 \r
index cf3beb6..07c93b3 100644 (file)
@@ -229,7 +229,7 @@ errcode_t uapi_ppg_service_init(void)
     taskcfg.create_queue_handle = create_ppg_queue;
     taskcfg.attr.name="ppg_service";
 
-    taskcfg.attr.priority = osPriorityAboveNormal2;
+    taskcfg.attr.priority = osPriorityAboveNormal3;
 
     taskcfg.attr.stack_size = PPG_SERVICE_TASK_SIZE;
     taskcfg.func = ppg_service_check_task;