调高抬腕亮屏灵敏度,优化心率脱腕提醒速度,添加被动检测runtime,仅在心率周期检测下上报佩戴信息。 1009/1 1009/head
authorpenglei <1624952103@qq.com>
Tue, 24 Sep 2024 12:32:34 +0000 (20:32 +0800)
committerpenglei <1624952103@qq.com>
Tue, 24 Sep 2024 12:32:34 +0000 (20:32 +0800)
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/drivers/peripheral/cywee/src/main_dml.c
code/sdk/drivers/peripheral/ppg/hx3695/hx3695.c
code/sdk/drivers/peripheral/ppg/service/ppg_service.cpp
code/sdk/drivers/peripheral/utils/custom_runtime.c
code/sdk/drivers/peripheral/utils/custom_runtime.h
code/sdk/drivers/peripheral/utils/custom_utils.c

index 549a540..b196301 100644 (file)
@@ -28,7 +28,7 @@
 extern "C" {\r
 #endif\r
 \r
-#define MAX_UNWEAR_COUNT 30\r
+#define MAX_UNWEAR_COUNT 10\r
 #define MAX_VALID_HRS_COUNT 60\r
 #define MAX_DISVALID_HRS_COUNT 70\r
 #define MIN_DISPLAY_HEART 60\r
@@ -399,6 +399,9 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
     heartstate = false;\r
     // 复原检测状态\r
     checkstate = HeartCheck::RESTSTSTE;\r
+    LOS_Msleep(500);\r
+    uapi_dev_runtime_set_hrs_passivity(0);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_dev_runtime_set_hrs_passivity(0)");\r
   } else if (state == HeartState::Start && heartstate == false) {\r
     /*充电状态下不进行检测*/\r
     bool isCharging = get_charge_stat(); // 获取充电状态\r
@@ -411,6 +414,13 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) {
     send_ppg_cmd_msg(md);\r
     heartstate = true;\r
     checkstate = check;\r
+    //被动\r
+    if(checkstate==HeartCheck::PASSIVITY)\r
+    {\r
+        uapi_dev_runtime_set_hrs_passivity(1);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_dev_runtime_set_hrs_passivity(1)");\r
+    }\r
+  \r
   }\r
 }\r
 // 开始检测\r
index 9ae8281..e8b78d0 100644 (file)
@@ -1324,10 +1324,10 @@ int cywee_main_dml(void)
     //设置抬腕功能
     memset(&scl, 0, sizeof(scl));
     scl.iData[0] = 1;
-    scl.iData[1] = 6; //调小抬手反应范围
-    scl.iData[2] = 5;
-    scl.iData[3] = 5;
-    scl.iData[4] = 6; //调小抬手反应范围
+    // scl.iData[1] = 5;
+    // scl.iData[2] = 5;
+    // scl.iData[3] = 5;
+    // scl.iData[4] = 5;
     CWM_SettingControl(SCL_HAND_UPDOWN_CONFIG, &scl);
 
     //配置跑步机模式相关参数(进入跑步机模式自动生效)
index 6c24c0f..76d2ee1 100644 (file)
@@ -124,7 +124,8 @@ uint8_t alg_ram[11 * 1024] __attribute__((aligned(4)));
 ppg_sensor_data_t ppg_s_data;\r
 \r
 static int cywee_data = 0;\r
-static int wear_status = -1;\r
+static int history_wear_status = -1;\r
+static int cywee_wear_status = 0;\r
 \r
 static uint8_t hx3695_chip_id = 0;\r
 \r
@@ -2720,10 +2721,10 @@ static void get_avg_hrs(int32_t hrs)
 \r
 void hx3695_wearstatus_update(void)\r
 {\r
-    if(wear_status != hrsresult.wearstatus)\r
+    if(history_wear_status != cywee_wear_status)\r
     {\r
-        wear_status = hrsresult.wearstatus;\r
-        cywee_data = wear_status;\r
+        history_wear_status = cywee_wear_status;\r
+        cywee_data = history_wear_status;\r
         do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,&cywee_data);\r
     }\r
 }\r
@@ -2883,18 +2884,38 @@ void hx3695_hrs_ppg_Int_handle(void)
     hrsresult.hr_living_std = alg_results.hr_result_std;\r
     hrsresult.wearstatus = hrs_wear_status;\r
 \r
-    if(hrs_wear_status == MSG_HRS_WEAR && hrsresult.hr_living == MSG_LIVING_TRUE)\r
+    if(hrsresult.wearstatus == MSG_HRS_WEAR)\r
     {\r
-        if(hrsresult.lastesthrs > 30 && hrsresult.lastesthrs < 220)\r
-                     get_avg_hrs(hrsresult.lastesthrs);\r
-\r
-        hrsresult.wearstatus = MSG_HRS_WEAR;\r
+        if(hrsresult.hr_living == MSG_LIVING_TRUE)\r
+        {\r
+            if(hrsresult.lastesthrs > 30 && hrsresult.lastesthrs < 220)\r
+                           get_avg_hrs(hrsresult.lastesthrs);\r
+            cywee_wear_status = 1;\r
+        }\r
+        else\r
+        {\r
+            cywee_wear_status = 0;\r
+        }\r
     }\r
     else\r
     {\r
         hrsresult.wearstatus = MSG_HRS_NO_WEAR;\r
         hrsresult.lastesthrs = 0;\r
+        cywee_wear_status = 0;\r
     }\r
+    // PRINT("hrsresult.wearstatus : %d , cywee_wear_status : %d , hr_living : %d \n",hrsresult.wearstatus,cywee_wear_status,hrsresult.hr_living);\r
+    // if(hrs_wear_status == MSG_HRS_WEAR && hrsresult.hr_living == MSG_LIVING_TRUE)\r
+    // {\r
+    //     if(hrsresult.lastesthrs > 30 && hrsresult.lastesthrs < 220)\r
+               //       get_avg_hrs(hrsresult.lastesthrs);\r
+\r
+    //     hrsresult.wearstatus = MSG_HRS_WEAR;\r
+    // }\r
+    // else\r
+    // {\r
+    //     hrsresult.wearstatus = MSG_HRS_NO_WEAR;\r
+    //     hrsresult.lastesthrs = 0;\r
+    // }\r
     hx3695_msg_callback_t func =  hx3695_get_send_msg_callback_func();\r
     if(func != NULL)\r
     {\r
@@ -3671,10 +3692,10 @@ void hx3695_wear_ppg_Int_handle(void)
     hx3695_check_touch_read(&ppg_s_data);\r
     hx3695_wear_status = hx3695_check_touch_send_data(ir_buf,*count);\r
     // PRINT("hx3695_wear_status : %d \r\n",hx3695_wear_status);\r
-    if(wear_status != hx3695_wear_status)\r
+    if(history_wear_status != hx3695_wear_status)\r
     {\r
-        wear_status = hx3695_wear_status;\r
-        cywee_data = wear_status;\r
+        history_wear_status = hx3695_wear_status;\r
+        cywee_data = history_wear_status;\r
         do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,&cywee_data);\r
     }\r
 \r
index 7c7c21c..85a947f 100644 (file)
@@ -284,7 +284,12 @@ static void ppg_service_check_task(void  *arg)
             //do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OPEN_GET_ACC,NULL);
             cmd = "hrs";
             enable = 1;
-            uapi_pm_add_sleep_veto(PM_ID_HEART);
+            uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);
+            if (cnt == 0) 
+            {
+                uapi_pm_add_sleep_veto(PM_ID_HEART);
+            }
+
         }else if (mail == PPG_SERVICE_CMD_TYPE_DO_HRV_TEST){
             cmd = "hrv";
             enable = 1;
@@ -315,13 +320,19 @@ static void ppg_service_check_task(void  *arg)
             wear_mode_state = 0;
         }else if (mail == PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST){
             //do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CLOSE_GET_ACC,NULL);
-            if(uapi_dev_runtime_get_sleep_monitoring_status())//处于睡眠监测 上报活体佩戴
+            //PRINT("uapi_dev_runtime_get_sleep_monitoring_status : %d \n",uapi_dev_runtime_get_sleep_monitoring_status());
+            //PRINT("uapi_dev_runtime_get_hrs_passivity_flag : %d \n",uapi_dev_runtime_get_hrs_passivity_flag());
+            if(uapi_dev_runtime_get_sleep_monitoring_status() && uapi_dev_runtime_get_hrs_passivity_flag())//处于睡眠监测 且在心率周期检测期间 上报活体佩戴 
             {
                 hx3695_wearstatus_update();            
             }
             cmd = "hrs";
             enable = 0;
-            uapi_pm_remove_sleep_veto(PM_ID_HEART);
+            uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART);
+            if (cnt == 1) 
+            {
+                uapi_pm_remove_sleep_veto(PM_ID_HEART);
+            }
         }else if (mail == PPG_SERVICE_CMD_TYPE_STOP_SPO2_TEST){
    
             cmd = "spo2";
index ae68385..c138258 100644 (file)
@@ -84,6 +84,7 @@ typedef struct
     uint8_t absolute_static_state; // 绝对静止状态
     uint8_t checkres_status;//校验文件状态
     uint8_t repair_download_status;//升级下载状态
+    uint8_t hrs_passivity_status;//获取被动心率检测状态
 } runtime_status_t;
 
 
@@ -436,4 +437,15 @@ void uapi_dev_runtime_set_safemode_flag(uint8_t status)
 uint8_t uapi_dev_runtime_get_safemode_flag(void)
 {
     return g_runtime.enter_safemode;
+}
+
+// 设置被动心率检测状态
+void uapi_dev_runtime_set_hrs_passivity(uint8_t status)
+{
+    g_runtime.hrs_passivity_status = status;
+}
+// 获取被动心率检测状态
+uint8_t uapi_dev_runtime_get_hrs_passivity_flag(void)
+{
+    return g_runtime.hrs_passivity_status;
 }
\ No newline at end of file
index 3395e92..a2fd51b 100644 (file)
@@ -216,6 +216,11 @@ void uapi_dev_runtime_set_safemode_flag(uint8_t status);
 // 安全模式
 uint8_t uapi_dev_runtime_get_safemode_flag(void);
 
+
+void uapi_dev_runtime_set_hrs_passivity(uint8_t status);
+// 获取被动心率检测状态
+uint8_t uapi_dev_runtime_get_hrs_passivity_flag(void);
+
 #ifdef __cplusplus
 #if __cplusplus
 }
index 2571b93..c63df94 100644 (file)
@@ -2157,8 +2157,11 @@ errcode_t custom_iic_init(void)
 
 errcode_t custom_i2c_read_regs(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *readData, int readDataSize, int busIndex)
 {
-   
-    uapi_pm_add_sleep_veto(PM_ID_GSENSOR);
+    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_GSENSOR);
+    if (cnt == 0) 
+    {
+        uapi_pm_add_sleep_veto(PM_ID_GSENSOR);
+    }
     
     errcode_t ret;
     uint32_t retry;
@@ -2198,14 +2201,23 @@ errcode_t custom_i2c_read_regs(uint16_t slaveAddr, uint16_t reg, int regLength,
     osal_kfree(write_data);
 error:
 
-    uapi_pm_remove_sleep_veto(PM_ID_GSENSOR);
-    
+    cnt = pm_veto_get_id_cnt(PM_ID_GSENSOR);
+    if (cnt == 1) 
+    {
+        uapi_pm_remove_sleep_veto(PM_ID_GSENSOR);
+    }
+
     return (ret>0) ? ret*-1: ret;
 }
 
 errcode_t custom_i2c_write_reg(uint16_t slaveAddr, uint16_t reg, int regLength, uint8_t *writeData, int writeDataSize, int busIndex)
 {
-    uapi_pm_add_sleep_veto(PM_ID_GSENSOR);
+    uint8_t cnt = pm_veto_get_id_cnt(PM_ID_GSENSOR);
+    if (cnt == 0) 
+    {
+        uapi_pm_add_sleep_veto(PM_ID_GSENSOR);
+    }
+
     errcode_t ret;
     uint32_t retry;
     i2c_data_t data;
@@ -2252,7 +2264,11 @@ errcode_t custom_i2c_write_reg(uint16_t slaveAddr, uint16_t reg, int regLength,
 free_mem:
     osal_kfree(write_data);
 error:
-    uapi_pm_remove_sleep_veto(PM_ID_GSENSOR);
+    cnt = pm_veto_get_id_cnt(PM_ID_GSENSOR);
+    if (cnt == 1) 
+    {
+        uapi_pm_remove_sleep_veto(PM_ID_GSENSOR);
+    }
     return (ret>0) ? ret*-1: ret;
 }