mcu_hi3321_watch/tjd/driver/hr/hx3695/tyhx_spo2_alg.h
2025-05-26 20:15:20 +08:00

131 lines
3.6 KiB
C

#ifndef _SPO2_ALG_H_
#define _SPO2_ALG_H_
#endif
#include <stdint.h>
//version:xiaoche3.3.5
//#include "tyhx_spo2_alg_para.h"
#ifdef SPO2_ALG_LIB
typedef enum {
MSG_SPO2_ALG_NOT_OPEN,
MSG_SPO2_ALG_OPEN,
MSG_SPO2_READY,
MSG_SPO2_ALG_TIMEOUT,
MSG_SPO2_END
} spo2_alg_msg_code_t;
typedef enum {
MSG_SPO2_LIVING_INITIAL,
MSG_SPO2_LIVING_TRUE,
MSG_SPO2_LIVING_FAIL
} spo2_living_code_t;
typedef enum {
SPO2_NORMAL_MODE,
SPO2_ALLDAY_MODE
} spo2_mode_t;
typedef struct {
spo2_alg_msg_code_t spo2_alg_status;
spo2_living_code_t spo2_living_status;
uint32_t data_cnt;
uint8_t spo2_result;
uint8_t hr_result;
uint8_t block_cnt;
uint8_t ir_quality;
uint16_t reliable_score_result;
uint8_t screen_up;
uint8_t motion;
uint8_t poor_signal;
uint8_t signal_snr;
uint32_t signal_std;
} spo2_results_t;
typedef struct {
uint8_t screen_up;
uint8_t motion;
uint8_t poor_signal;
} spo2_gesture_recognize_t;
typedef struct {
uint32_t data_cnt;
uint8_t motion;
uint8_t ir_offset_50;
uint8_t red_offset_50;
uint8_t green_offset_50;
int32_t ir_dc;
int32_t red_dc;
int32_t green_dc;
int32_t ir_ac;
int32_t red_ac;
int32_t green_ac;
int32_t sa_temp;
int32_t gi_temp;
int32_t sa_final;
uint16_t ir_fft_snr;
uint16_t red_fft_snr;
uint8_t count_block;
uint8_t spo2_result;
} spo2_debug_t;
typedef struct {
uint8_t red_offset_idac;
uint8_t ir_offset_idac;
uint8_t green_offset_idac;
uint16_t spo2_start_cnt;
} spo2_agcpara_t;
typedef struct {
uint8_t XCORR_MODE;
uint8_t QUICK_RESULT;
} spo2_switch_t;
typedef struct {
uint8_t SPO2_LOW_XCORR_THRE;
uint8_t SPO2_LOW_SNR_THRE;
uint8_t COUNT_BLOCK_NUM;
uint32_t SPO2_BASE_LINE_INIT;
uint32_t SPO2_SLOPE;
uint16_t SPO2_GSEN_POW_THRE;
} spo2_usuallyadjust_t;
typedef struct {
uint16_t MEAN_NUM;
int32_t SOP2_DEGLITCH_THRE;
int32_t SPO2_REMOVE_JUMP_THRE;
uint16_t SPO2_LOW_CLIP_END_TIME;
uint16_t SPO2_LOW_CLIP_DN;
uint16_t SPO2_NORMAL_CLIP_DN;
uint16_t IR_AC_TOUCH_THRE;
uint16_t IR_FFT_POW_THRE;
uint8_t SPO2_CALI;
uint8_t SLOPE_PARA_MAX;
uint8_t SLOPE_PARA_MIN;
} spo2_barelychange_t;
void tyhx_spo2_set_switch(uint8_t XCORR_MODE,uint8_t QUICK_RESULT);
void tyhx_spo2_para_usuallyadjust(uint8_t SPO2_LOW_XCORR_THRE,uint8_t SPO2_LOW_SNR_THRE,uint8_t COUNT_BLOCK_NUM,uint32_t SPO2_BASE_LINE_INIT,uint32_t SPO2_SLOPE,uint16_t SPO2_GSEN_POW_THRE);
void tyhx_spo2_para_barelychange(uint16_t MEAN_NUM,int32_t SOP2_DEGLITCH_THRE,int32_t SPO2_REMOVE_JUMP_THRE, \
uint16_t SPO2_LOW_CLIP_END_TIME,uint16_t SPO2_LOW_CLIP_DN,uint16_t SPO2_NORMAL_CLIP_DN, \
uint16_t IR_AC_TOUCH_THRE,uint16_t IR_FFT_POW_THRE,uint8_t SPO2_CALI,uint8_t SLOPE_PARA_MAX,uint8_t SLOPE_PARA_MIN);
void tyhx_spo2_set_living(uint8_t living_mode, uint8_t qu_thre, uint8_t st_thre);
void tyhx_spo2_set_mode(spo2_mode_t mode);
bool tyhx_spo2_alg_send_data(int32_t *red_new_raw_data,int32_t *ir_new_raw_data,int32_t *green_new_raw_data,uint8_t R_LEDDAC,uint8_t IR_LEDDAC,uint8_t G_LEDDAC, int16_t *gsen_data_x, int16_t *gsen_data_y, int16_t *gsen_data_z, uint8_t dat_len);
void tyhx_spo2_alg(int32_t red_new_raw_data , int32_t ir_new_raw_data, int32_t green_new_raw_data,uint8_t R_LEDDAC,uint8_t IR_LEDDAC,uint8_t G_LEDDAC);
void tyhx_spo2_alg_close(void);
bool tyhx_spo2_alg_open(void);
bool tyhx_spo2_alg_open_deep(void);
spo2_results_t tyhx_spo2_alg_get_results(void);
spo2_debug_t tyhx_spo2_alg_debug_results(void);
#endif