优化获取ECG房颤结果接口
author1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Thu, 11 Jun 2026 07:56:44 +0000 (15:56 +0800)
committer1624952103 <pl@DESKTOP-EN9LKR5.localdomain>
Thu, 11 Jun 2026 07:56:44 +0000 (15:56 +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/PXI_ALG/ECG_AFIB/V2022/pah_ecg_afib_alg.c
code/sdk/zhihui/drivers/ppg/pah831x/PXI_ALG/ECG_AFIB/V2022/pah_ecg_afib_alg.h
code/sdk/zhihui/drivers/ppg/pah831x/pah_sensor/pah831x_main.c
code/sdk/zhihui/drivers/ppg/pah831x/pah_sensor/pah831x_main.h

index ee28809..8ce83b1 100644 (file)
@@ -180,7 +180,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)
+void ppg_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status)
 {
     if (ecg_hr != NULL) {
         *ecg_hr = 0;
@@ -188,9 +188,12 @@ void ppg_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result)
     if (afib_result != NULL) {
         *afib_result = PPG_ECG_AFIB_RESULT_INVALID;
     }
+    if (status != NULL) {
+        *status = PPG_ECG_AFIB_STATUS_IDLE;
+    }
 
 #if defined PPG_PAH831X
-    pah831x_get_ecg_afib(ecg_hr, afib_result);
+    pah831x_get_ecg_afib(ecg_hr, afib_result, status);
 #endif
 }
 
index 423779c..d1bc7ed 100644 (file)
@@ -85,12 +85,18 @@ 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: æ\88¿é¢¤ç»\93论ï¼\8cæµ\8bè¯\95æ\9cªå®\8cæ\88\90时为 0xFF
+ * afib_result: æ\88¿é¢¤ç»\93论ï¼\8cæ\9cªå¼\80å§\8b/æµ\8bé\87\8f中/失败时为 0xFF
  *   0 窦性心律  1 不确定(不规则)  2 可能房颤
- *   3 不确定(信号/特征)  4 心率过低  5 心率过高 */
-void ppg_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result);
+ *   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已停止,疑似信号弱,请重新测试 */
index 5ee975c..f2cfa4c 100644 (file)
@@ -61,6 +61,7 @@ static uint8_t  ReadyFlag = 0;
 static uint8_t  AFIB_ReadyFlag = 0;\r
 static uint8_t  ecg_afib_result = PAH_ECG_AFIB_RESULT_INVALID;\r
 static uint8_t  ecg_afib_hr = 0;\r
+static uint8_t  has_ecg_stop = 0;\r
 static uint16_t ecg_ready_count = 0;\r
 static int32_t  ecg_frame_count = 0;\r
 \r
@@ -295,6 +296,7 @@ static uint8_t run_afib_pxialg(uint32_t duration, const uint32_t* ecg_data, uint
         }else {\r
             if(PXIAFIB_GETEcgStopFlag(_state.pxialg_state_afib) == 1) {//ready sqi > 0, need to stop .\r
                 _state.has_got_AFIB=1;\r
+                has_ecg_stop = 1;\r
                 ecg_afib_algorithm_close();\r
                  ALG_PRINT("ready sqi > 0, need to stop \n");\r
               return 1;\r
@@ -405,6 +407,7 @@ void ecg_afib_algorithm_init(void)
     AFIB_ReadyFlag = 0;\r
     ecg_afib_result = PAH_ECG_AFIB_RESULT_INVALID;\r
     ecg_afib_hr = 0;\r
+    has_ecg_stop = 0;\r
     _state.has_got_AFIB=0;\r
     _state.has_time_out=0;\r
     _state.pxialg_data.frame_count = 0 ;\r
@@ -441,3 +444,22 @@ uint8_t pah_ecg_afib_get_hr(void)
 {\r
     return ecg_afib_hr;\r
 }\r
+\r
+uint8_t pah_ecg_afib_get_status(void)\r
+{\r
+#if defined(ENABLE_PXI_ALG_ECG_AFIB)\r
+    if (!_state.has_got_AFIB) {\r
+        if (_state.pxialg_has_init) {\r
+            return PAH_ECG_AFIB_STATUS_MEASURING;\r
+        }\r
+        return PAH_ECG_AFIB_STATUS_IDLE;\r
+    }\r
+    if (_state.has_time_out || has_ecg_stop ||\r
+        ecg_afib_result == PAH_ECG_AFIB_RESULT_INVALID) {\r
+        return PAH_ECG_AFIB_STATUS_FAILED;\r
+    }\r
+    return PAH_ECG_AFIB_STATUS_SUCCESS;\r
+#else\r
+    return PAH_ECG_AFIB_STATUS_IDLE;\r
+#endif\r
+}\r
index b88020e..2cd1d9f 100644 (file)
@@ -41,8 +41,14 @@ void ecg_afib_algorithm_close(void);
 \r
 #define PAH_ECG_AFIB_RESULT_INVALID  0xFF\r
 \r
+#define PAH_ECG_AFIB_STATUS_IDLE       0  /* 未开始测量 */\r
+#define PAH_ECG_AFIB_STATUS_MEASURING  1  /* 测量中 */\r
+#define PAH_ECG_AFIB_STATUS_FAILED     2  /* 测量失败(ready sqi>0需停止、超时等) */\r
+#define PAH_ECG_AFIB_STATUS_SUCCESS    3  /* 测量成功,afib_result 已有效 */\r
+\r
 uint8_t pah_ecg_afib_get_hr(void);\r
 uint8_t pah_ecg_afib_get_result(void);\r
+uint8_t pah_ecg_afib_get_status(void);\r
 \r
 \r
 #endif  // header guard\r
index 29603f9..8254cab 100644 (file)
@@ -154,6 +154,7 @@ static uint8_t ret_spo2 = 0;
 static uint8_t ret_hrv = 0;\r
 static uint8_t ret_ecg_afib_hr = 0;\r
 static uint8_t ret_ecg_afib_result = PAH_ECG_AFIB_RESULT_INVALID;\r
+static uint8_t ret_ecg_afib_status = PAH_ECG_AFIB_STATUS_IDLE;\r
 static uint8_t ret_ecg_bp_status = PAH_ECG_BP_STATUS_MEASURING;\r
 static uint8_t ret_wear = 0;\r
 static ecg_data_out _ecg_data_out_alg;\r
@@ -1546,6 +1547,7 @@ static void pah831x_ecg_afib_timer_handler(void)
 \r
         ret_ecg_afib_hr = pah_ecg_afib_get_hr();\r
         ret_ecg_afib_result = pah_ecg_afib_get_result();\r
+        ret_ecg_afib_status = pah_ecg_afib_get_status();\r
 \r
         clear_ecg_data_ready();\r
     }\r
@@ -1811,10 +1813,10 @@ void pah831x_ecg_afib_start(void)
 {\r
     ret_ecg_afib_hr = 0;\r
     ret_ecg_afib_result = PAH_ECG_AFIB_RESULT_INVALID;\r
+    ret_ecg_afib_status = PAH_ECG_AFIB_STATUS_MEASURING;\r
+    ecg_afib_algorithm_init();\r
     pah831x_sensor_init();\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
-    ecg_afib_algorithm_init();\r
-\r
 }\r
 \r
 \r
@@ -1872,6 +1874,11 @@ void pah831x_ecg_afib_stop(void)
 {\r
     pah_sensor_stop();\r
     ecg_afib_algorithm_close();\r
+    ecg_afib_algorithm_init();\r
+\r
+    ret_ecg_afib_hr = 0;\r
+    ret_ecg_afib_result = PAH_ECG_AFIB_RESULT_INVALID;\r
+    ret_ecg_afib_status = PAH_ECG_AFIB_STATUS_IDLE;\r
 }\r
 \r
 void pah831x_stress_stop(void)\r
@@ -1980,6 +1987,7 @@ void pah831x_sensor_stop(void)
     ret_wear = 0;\r
     ret_ecg_afib_hr = 0;\r
     ret_ecg_afib_result = PAH_ECG_AFIB_RESULT_INVALID;\r
+    ret_ecg_afib_status = PAH_ECG_AFIB_STATUS_IDLE;\r
     ret_ecg_bp_status = PAH_ECG_BP_STATUS_MEASURING;\r
     history_wear_status = -1;\r
 \r
@@ -2167,7 +2175,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)\r
+void pah831x_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status)\r
 {\r
     if (ecg_hr != NULL) {\r
         *ecg_hr = ret_ecg_afib_hr;\r
@@ -2175,6 +2183,9 @@ void pah831x_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result)
     if (afib_result != NULL) {\r
         *afib_result = ret_ecg_afib_result;\r
     }\r
+    if (status != NULL) {\r
+        *status = ret_ecg_afib_status;\r
+    }\r
 }\r
 \r
 void pah831x_get_ecg_bp(int *sbp, int *dbp, uint8_t *status)\r
index abf2049..b790fb1 100644 (file)
@@ -369,7 +369,7 @@ 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);\r
+void pah831x_get_ecg_afib(uint8_t *ecg_hr, uint8_t *afib_result, uint8_t *status);\r
 \r
 void pah831x_get_ecg_bp(int *sbp, int *dbp, uint8_t *status);\r
 \r