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;
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
}
#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;
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
}
#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{
* 开始/停止 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
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
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
_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
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
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
\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
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
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
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