优化获取ECG房颤和血压结果接口,增加电极触摸值获取 3460/1 3460/head 3461/target/1
author1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Thu, 11 Jun 2026 10:09:37 +0000 (18:09 +0800)
committer1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Thu, 11 Jun 2026 10:09:37 +0000 (18:09 +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 8ce83b1..df95e00 100644 (file)
@@ -137,7 +137,7 @@ uint8_t ppg_get_hrv(void)
     return hrv;
 }
 
-void ppg_get_ecg_bp(int *sbp, int *dbp, uint8_t *status)
+void ppg_get_ecg_bp(int *sbp, int *dbp, uint8_t *status, uint8_t *touch_flag)
 {
     if (sbp != NULL) {
         *sbp = 0;
@@ -148,9 +148,12 @@ void ppg_get_ecg_bp(int *sbp, int *dbp, uint8_t *status)
     if (status != NULL) {
         *status = PPG_ECG_BP_STATUS_MEASURING;
     }
+    if (touch_flag != NULL) {
+        *touch_flag = 0;
+    }
 
 #if defined PPG_PAH831X
-    pah831x_get_ecg_bp(sbp, dbp, status);
+    pah831x_get_ecg_bp(sbp, dbp, status, touch_flag);
 #endif
 }
 
@@ -180,7 +183,7 @@ uint32_t ppg_read_ecg_raw(int32_t *buf, uint32_t buf_len)
 #endif
 }
 
-void ppg_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status)
+void ppg_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status, uint8_t *touch_flag)
 {
     if (ecg_hr != NULL) {
         *ecg_hr = 0;
@@ -191,9 +194,12 @@ void ppg_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status)
     if (status != NULL) {
         *status = PPG_ECG_AFIB_STATUS_IDLE;
     }
+    if (touch_flag != NULL) {
+        *touch_flag = 0;
+    }
 
 #if defined PPG_PAH831X
-    pah831x_get_ecg_afib(ecg_hr, afib_result, status);
+    pah831x_get_ecg_afib(ecg_hr, afib_result, status, touch_flag);
 #endif
 }
 
index d1bc7ed..3112e9b 100644 (file)
@@ -38,6 +38,15 @@ extern "C" {
 
 #define PPG_ECG_AFIB_RESULT_INVALID  0xFF
 
+#define PPG_ECG_BP_STATUS_MEASURING    0  /* 测量中 */
+#define PPG_ECG_BP_STATUS_WEAK_SIGNAL  1  /* ECG已停止,疑似信号弱,请重新测试 */
+
+#define PPG_ECG_AFIB_STATUS_IDLE       0  /* 未开始测量 */
+#define PPG_ECG_AFIB_STATUS_MEASURING  1  /* 测量中 */
+#define PPG_ECG_AFIB_STATUS_FAILED     2  /* 测量失败(ready sqi>0 停测、超时等) */
+#define PPG_ECG_AFIB_STATUS_SUCCESS    3  /* 测量成功,已出结论 */
+
+
 typedef uint32_t PPG_CMD_TYPE_T ;
 
 typedef enum{
@@ -85,26 +94,20 @@ bool is_ppg_bp_need_cali(void);
  * 开始/停止 ecgbp、ecgafib、ecgraw 时驱动内部自动清缓冲。 */
 uint32_t ppg_read_ecg_raw(int32_t *buf, uint32_t buf_len);
 
-#define PPG_ECG_AFIB_STATUS_IDLE       0  /* 未开始测量 */
-#define PPG_ECG_AFIB_STATUS_MEASURING  1  /* 测量中 */
-#define PPG_ECG_AFIB_STATUS_FAILED     2  /* 测量失败(ready sqi>0 停测、超时等) */
-#define PPG_ECG_AFIB_STATUS_SUCCESS    3  /* 测量成功,已出结论 */
-
 /* 获取 ECG 房颤测试结果。
  * ecg_hr: ECG 心率(bpm),测量过程中持续更新;
  * afib_result: 房颤结论,未开始/测量中/失败时为 0xFF
  *   0 窦性心律  1 不确定(不规则)  2 可能房颤
  *   3 不确定(信号/特征)  4 心率过低  5 心率过高
- * status: 0 未开始  1 测量中  2 测量失败  3 测量成功(已出结论) */
-void ppg_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status);
-
-#define PPG_ECG_BP_STATUS_MEASURING    0  /* 测量中 */
-#define PPG_ECG_BP_STATUS_WEAK_SIGNAL  1  /* ECG已停止,疑似信号弱,请重新测试 */
+ * status: 0 未开始  1 测量中  2 测量失败  3 测量成功(已出结论)
+ * touch_flag:电极触摸标志  0 未触摸  1 已触摸 */
+void ppg_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status, uint8_t *ecg_touch_flag);
 
 /* 获取 ECG 血压测量结果。
  * sbp/dbp: 收缩压/舒张压,未出结果时为 0;
- * status: 0 测量中  1 ECG已停止(疑似信号弱,请重新测试) */
-void ppg_get_ecg_bp(int *sbp, int *dbp, uint8_t *status);
+ * status: 0 测量中  1 ECG已停止(疑似信号弱,请重新测试)
+ * touch_flag: 电极触摸标志 0 未触摸  1 已触摸 */
+void ppg_get_ecg_bp(int *sbp, int *dbp, uint8_t *status, uint8_t *ecg_touch_flag);
 
 #ifdef __cplusplus
 #if __cplusplus
index 8254cab..c282cd1 100644 (file)
@@ -784,7 +784,7 @@ static void send_fifo_data(main_state *this, uint8_t *fifo, uint16_t data_count,
         duration =(uint32_t)(this->task_timestamp - this->prev_task_timestamp );\r
         _ecg_data_out.ecg_data_ready++;\r
         _ecg_data_out.duration = duration;\r
-        _ecg_data_out.is_touched = 1 ;\r
+        _ecg_data_out.is_touched = _state.core.touch_flag ? 1U : 0U;\r
         _ecg_data_out.ch_num = 1  ;\r
         _ecg_data_out.sample_num_per_ch = ecg_sample_num ;\r
         \r
@@ -811,7 +811,7 @@ static void send_fifo_data(main_state *this, uint8_t *fifo, uint16_t data_count,
         duration =(uint32_t)(this->task_timestamp - this->prev_task_timestamp );\r
         _ecg_data_out.ecg_data_ready++;\r
         _ecg_data_out.duration = duration;\r
-        //_ecg_data_out.is_touched = 1 ;\r
+        _ecg_data_out.is_touched = _state.core.touch_flag ? 1U : 0U;\r
         _ecg_data_out.ch_num = 1  ;\r
         _ecg_data_out.sample_num_per_ch = ecg_sample_num ;\r
         _ppg_data_out.ppg_data_ready++;\r
@@ -1021,15 +1021,33 @@ void set_ir_r_led_switch_status(bool status)
     _state.core.ir_r_led_switch_new_status = status;\r
 }\r
 \r
-uint16_t get_pah831x_touch_value()\r
+uint16_t get_pah831x_touch_value(void)\r
 {\r
-    uint16_t pah831x_touch_value = 0 ;\r
+    uint16_t touch_value = 0;\r
 \r
-    pah831x_read_touch_value(&_state.core, &pah831x_touch_value);\r
-    \r
-    return pah831x_touch_value ;\r
+    pah831x_read_touch_value(&_state.core, &touch_value);\r
+    return touch_value;\r
+}\r
+\r
+static void pah831x_fill_ecg_touch_flag(uint8_t *touch_flag)\r
+{\r
+    bool flag = false;\r
+\r
+    if (touch_flag == NULL) {\r
+        return;\r
+    }\r
+\r
+    pah831x_read_touch_flag(&_state.core, &flag);\r
+    *touch_flag = flag ? 1U : 0U;\r
 }\r
 \r
+static void pah831x_reset_ecg_touch_cache(void)\r
+{\r
+    _state.touch_status = TOUCH_STATUS__UNKNOWN;\r
+    _state.core.touch_flag = false;\r
+    _state.core.touch_value = 0;\r
+    _ecg_data_out.is_touched = 0;\r
+}\r
 \r
 static void get_avg_hrs(uint8_t hrs)\r
 {\r
@@ -1768,12 +1786,14 @@ void pah831x_ecg_bp_start(uint8_t cmd)
     if(calibration_mode==ECG_PPG_BP_CALI)\r
     {\r
         pah831x_sensor_init();\r
+        pah831x_reset_ecg_touch_cache();\r
         pah831x_sensor_start(PAH831X_WORK_POLLING, PAH831X_INIT_ALWAYS_RUN, PAH831X_PPG_REG_SETTING_IDLE, PAH831X_ECG_REG_SETTING_2, 128, 3.90625f);\r
         ecg_bp_algorithm_init();\r
         \r
     }else if(calibration_mode==ECG_PPG_BP_ESTIMATE)\r
     {\r
         pah831x_sensor_init();\r
+        pah831x_reset_ecg_touch_cache();\r
         pah831x_sensor_start(PAH831X_WORK_POLLING, PAH831X_INIT_ALWAYS_RUN, PAH831X_PPG_REG_SETTING_IDLE, PAH831X_ECG_REG_SETTING_2, 128, 3.90625f);\r
         ecg_bp_algorithm_init();\r
         //calibration_mode = ECG_PPG_BP_ESTIMATE;\r
@@ -1816,6 +1836,7 @@ void pah831x_ecg_afib_start(void)
     ret_ecg_afib_status = PAH_ECG_AFIB_STATUS_MEASURING;\r
     ecg_afib_algorithm_init();\r
     pah831x_sensor_init();\r
+    pah831x_reset_ecg_touch_cache();\r
     pah831x_sensor_start(PAH831X_WORK_POLLING ,PAH831X_INIT_ALWAYS_RUN,PAH831X_PPG_REG_SETTING_IDLE ,PAH831X_ECG_REG_SETTING_1,256,3.91f  );\r
 }\r
 \r
@@ -1863,6 +1884,7 @@ void pah831x_ecgbp_stop(void)
 \r
     pah_sensor_stop();\r
     ecg_bp_algorithm_close();\r
+    pah831x_reset_ecg_touch_cache();\r
 \r
     if(calibration_mode == ECG_PPG_BP_CALI)\r
     {\r
@@ -1875,6 +1897,7 @@ void pah831x_ecg_afib_stop(void)
     pah_sensor_stop();\r
     ecg_afib_algorithm_close();\r
     ecg_afib_algorithm_init();\r
+    pah831x_reset_ecg_touch_cache();\r
 \r
     ret_ecg_afib_hr = 0;\r
     ret_ecg_afib_result = PAH_ECG_AFIB_RESULT_INVALID;\r
@@ -2175,7 +2198,7 @@ uint8_t pah831x_get_hrv(void)
     return ret_hrv;\r
 }\r
 \r
-void pah831x_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status)\r
+void pah831x_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status, uint8_t *touch_flag)\r
 {\r
     if (ecg_hr != NULL) {\r
         *ecg_hr = ret_ecg_afib_hr;\r
@@ -2186,14 +2209,16 @@ void pah831x_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status
     if (status != NULL) {\r
         *status = ret_ecg_afib_status;\r
     }\r
+    pah831x_fill_ecg_touch_flag(touch_flag);\r
 }\r
 \r
-void pah831x_get_ecg_bp(int *sbp, int *dbp, uint8_t *status)\r
+void pah831x_get_ecg_bp(int *sbp, int *dbp, uint8_t *status, uint8_t *touch_flag)\r
 {\r
     pah_ecg_bp_get_bp(sbp, dbp);\r
     if (status != NULL) {\r
         *status = ret_ecg_bp_status;\r
     }\r
+    pah831x_fill_ecg_touch_flag(touch_flag);\r
 }\r
 \r
 uint8_t pah831x_get_wear_status(void)\r
index b790fb1..d287b01 100644 (file)
@@ -369,9 +369,9 @@ uint8_t pah831x_get_spo2(void);
 \r
 uint8_t pah831x_get_hrv(void);\r
 \r
-void pah831x_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status);\r
+void pah831x_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status, uint8_t *touch_flag);\r
 \r
-void pah831x_get_ecg_bp(int *sbp, int *dbp, uint8_t *status);\r
+void pah831x_get_ecg_bp(int *sbp, int *dbp, uint8_t *status, uint8_t *touch_flag);\r
 \r
 void pah8311_get_bp(int *sbp,int *dbp);\r
 \r