增加血压校准系数管理 3432/1 3432/head n9
author1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Mon, 1 Jun 2026 06:36:32 +0000 (14:36 +0800)
committer1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Mon, 1 Jun 2026 06:36:32 +0000 (14:36 +0800)
code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c
code/sdk/zhihui/drivers/ppg/hal/ppg_hal.h
code/sdk/zhihui/drivers/ppg/pah831x/pah_sensor/pah831x_main.c
code/sdk/zhihui/drivers/ppg/pah831x/pah_sensor/pah831x_main.h

index eccb764..4ec88b8 100644 (file)
@@ -143,6 +143,20 @@ void ppg_get_bp(int *sbp,int *dbp)
 #endif
 }
 
+void ppg_set_bp_cali_data(int *sbp,int *dbp)
+{
+#if defined PPG_PAH831X
+    pah831x_set_bp_cali_data(sbp,dbp);
+#endif
+}
+
+bool is_ppg_bp_need_cali(void)
+{
+#if defined PPG_PAH831X
+    return is_pah831x_need_cali();
+#endif
+    return 1;
+}
 
 uint8_t ppg_get_wear_status(void)
 {
index 25fd739..9c57121 100644 (file)
@@ -69,6 +69,10 @@ uint8_t ppg_get_factory_log_switch(void);
 uint8_t ppg_get_hrv(void);
 
 void ppg_get_bp(int *sbp,int *dbp);
+void ppg_set_bp_cali_data(int *sbp,int *dbp);
+
+//是否需要血压校准 1是 0否
+bool is_ppg_bp_need_cali(void);
 
 #ifdef __cplusplus
 #if __cplusplus
index eebd3ff..985d06d 100644 (file)
@@ -48,6 +48,7 @@
 #define ENABLE_PRINT_ECG_EVENT_DATA (1)\r
 #define ENABLE_PRINT_TOUCH_EVENT_DATA (1)\r
 \r
+#define FILEPATH "user/userdata/bp_cali_data.bin"\r
 \r
 \r
 //============================================================================\r
@@ -154,6 +155,8 @@ static uint8_t ret_spo2 = 0;
 static uint8_t ret_hrv = 0;\r
 static uint8_t ret_wear = 0;\r
 static ecg_data_out _ecg_data_out_alg;\r
+\r
+static uint8_t bp_cali_cnt = 0;\r
 //void demo_pah831x(void);\r
 \r
 static bool sensor_basic_verification(main_state *this, pah_plat *plat);\r
@@ -1105,8 +1108,8 @@ static int CalValue1_in = 0;
 static uint8_t calibration_mode = ECG_PPG_BP_ESTIMATE;\r
 \r
 // 2. 固定基准参数:静态常量,全程不变\r
-static const uint8_t user_age = 24;\r
-static const float user_height = 173;\r
+static uint8_t user_age = 24;\r
+static uint16_t user_height = 173;\r
 static uint16_t Benchmark_SBP = 135;\r
 static uint16_t Benchmark_DBP = 85;\r
 \r
@@ -1137,16 +1140,19 @@ static void pah831x_ecg_bp_timer_handler(void)
             \r
         }else if(calibration_mode==ECG_PPG_BP_ESTIMATE)\r
         {\r
+\r
+            pah831x_read_calidata();\r
+\r
             //bp_cal_ready = get_bp_cal_data(cali_value);\r
             bp_cal_ready = true  ;//read from flash\r
-            cali_value[0] = 26   ;//read from flash\r
-            cali_value[1] = 9  ;//read from flash\r
-            cali_value[2] = 29   ;//read from flash\r
-            cali_value[3] = 86   ;//read from flash\r
-            cal_sbp_in   = cali_value[0];\r
-            cal_dbp_in   = cali_value[1];\r
-            CalValue_in  = cali_value[2];\r
-            CalValue1_in = cali_value[3];\r
+            // cali_value[0] = 26   ;//read from flash\r
+            // cali_value[1] = 9  ;//read from flash\r
+            // cali_value[2] = 29   ;//read from flash\r
+            // cali_value[3] = 86   ;//read from flash\r
+            // cal_sbp_in   = cali_value[0];\r
+            // cal_dbp_in   = cali_value[1];\r
+            // CalValue_in  = cali_value[2];\r
+            // CalValue1_in = cali_value[3];\r
             got_BP = 0 ;\r
             Benchmark_SBP = 0 ;\r
             Benchmark_DBP = 0 ;\r
@@ -1562,6 +1568,11 @@ void pah831x_ecgbp_stop(void)
 {\r
     pah_sensor_stop();\r
     ecg_bp_algorithm_close();\r
+\r
+    if(calibration_mode == ECG_PPG_BP_CALI)\r
+    {\r
+        pah831x_save_calidata();\r
+    }\r
 }\r
 \r
 void pah831x_ecg_afib_stop(void)\r
@@ -1862,4 +1873,127 @@ uint8_t pah831x_get_hrv(void)
 uint8_t pah831x_get_wear_status(void)\r
 {\r
     return ret_wear;\r
+}\r
+\r
+void pah831x_set_bp_cali_data(int *sbp,int *dbp)\r
+{\r
+    if(sbp == NULL || dbp == NULL)\r
+        return;\r
+\r
+    Benchmark_SBP = *sbp;\r
+    Benchmark_DBP = *dbp;\r
+\r
+    int user_info[5] = {0};\r
+    get_user_info_from_config_model(user_info);\r
+    user_age = user_info[0];\r
+    user_height = user_info[3];\r
+\r
+    // int user_info[5] = {0};\r
+    // get_user_info_from_config_model(user_info);\r
+    // memset(&scl, 0, sizeof(scl));\r
+    // scl.iData[0] = 1;\r
+    // scl.iData[1] = user_info[0];\r
+    // scl.iData[2] = !user_info[1]; //APP 1女 0男\r
+    // scl.iData[3] = user_info[2];\r
+    // scl.iData[4] = user_info[3];\r
+    // scl.iData[5] = user_info[4];\r
+    // CWM_OS_dbgPrintf("set user info : age[%d] , sex[%d] , weight[%d] , height[%d] , method[%d] \r\n",\r
+    // user_info[0],user_info[1],user_info[2],user_info[3],user_info[4]);\r
+}\r
+\r
+void pah831x_read_calidata(void)\r
+{\r
+    // C89 规范:所有变量定义在函数开头\r
+    int cali_data[5] = {0};\r
+    FILE *fp = NULL;\r
+    size_t ret = 0;\r
+\r
+    fp = fopen(FILEPATH, "rb");  // 二进制读取,嵌入式/跨平台更安全\r
+    if (fp == NULL)\r
+    {\r
+        printf("%s fopen failed\n", FILEPATH);\r
+\r
+        cal_sbp_in = 26   ;//read from flash\r
+        cal_dbp_in = 9  ;//read from flash\r
+        CalValue_in = 29   ;//read from flash\r
+        CalValue1_in = 86   ;//read from flash\r
+\r
+        return;\r
+    }\r
+\r
+    // 读取数据,并检查是否读取成功(必须判断返回值)\r
+    ret = fread(cali_data, sizeof(cali_data), 1, fp);\r
+    fclose(fp);  // 先关闭文件,再判断结果\r
+\r
+    // 读取失败:直接返回,不覆盖有效数据\r
+    if (ret != 1)\r
+    {\r
+        printf("read cali data failed!\n");\r
+\r
+        cal_sbp_in = 26   ;//read from flash\r
+        cal_dbp_in = 9  ;//read from flash\r
+        CalValue_in = 29   ;//read from flash\r
+        CalValue1_in = 86   ;//read from flash\r
+\r
+        return;\r
+    }\r
+\r
+    // 数据赋值\r
+    cal_sbp_in  = cali_data[0];\r
+    cal_dbp_in  = cali_data[1];\r
+    CalValue_in = cali_data[2];\r
+    CalValue1_in = cali_data[3];\r
+    bp_cali_cnt = cali_data[4];\r
+\r
+    printf("read cali data success\n");\r
+}\r
+\r
+/**\r
+ * @brief 保存血压校准数据\r
+ */\r
+void pah831x_save_calidata(void)\r
+{\r
+\r
+    if(!cal_sbp_in && !cal_dbp_in && !CalValue_in && !CalValue1_in)\r
+    {\r
+        printf("error cali param!\n");\r
+        return;\r
+    }\r
+\r
+    // C89 规范:所有变量定义在函数开头\r
+    int cali_data[5] = {0};\r
+    FILE *fp = NULL;\r
+    size_t ret = 0;\r
+\r
+    // 填充校准数据\r
+    cali_data[0] = cal_sbp_in;\r
+    cali_data[1] = cal_dbp_in;\r
+    cali_data[2] = CalValue_in;\r
+    cali_data[3] = CalValue1_in;\r
+    cali_data[4] = ++bp_cali_cnt;  // 先保存当前计数值\r
+\r
+    fp = fopen(FILEPATH, "wb");  // 二进制写入,避免文本模式转义\r
+    if (fp == NULL)\r
+    {\r
+        printf("%s fopen failed\n", FILEPATH);\r
+        return;\r
+    }\r
+\r
+    // 写入数据,并检查是否成功\r
+    ret = fwrite(cali_data, sizeof(cali_data), 1, fp);\r
+    fclose(fp);\r
+\r
+    if (ret != 1)\r
+    {\r
+        printf("save cali data failed!\n");\r
+        return;\r
+    }\r
+\r
+}\r
+\r
+bool is_pah831x_need_cali(void)\r
+{\r
+    pah831x_read_calidata();\r
+\r
+    return bp_cali_cnt >= 10 ? 0 : 1;\r
 }
\ No newline at end of file
index 1be7eea..3a62944 100644 (file)
@@ -370,4 +370,12 @@ uint8_t pah831x_get_spo2(void);
 uint8_t pah831x_get_hrv(void);\r
 \r
 \r
-void pah8311_get_bp(int *sbp,int *dbp);
\ No newline at end of file
+void pah8311_get_bp(int *sbp,int *dbp);\r
+\r
+void pah831x_read_calidata(void);\r
+\r
+void pah831x_save_calidata(void);\r
+\r
+void pah831x_set_bp_cali_data(int *sbp,int *dbp);\r
+\r
+bool is_pah831x_need_cali(void);
\ No newline at end of file