血氧心率驱动修改
authorpenglei <1624952103@qq.com>
Fri, 22 Mar 2024 11:21:33 +0000 (19:21 +0800)
committerpenglei <1624952103@qq.com>
Fri, 22 Mar 2024 11:21:33 +0000 (19:21 +0800)
code/sdk/drivers/peripheral/ppg/hx3695/hx3695.c
code/sdk/drivers/peripheral/ppg/hx3695/hx3695.h
code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hrs_agc.c
code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hrs_agc.h
code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hrs_custom.c
code/sdk/drivers/peripheral/ppg/hx3695/hx3695_spo2_agc.c
code/sdk/drivers/peripheral/ppg/hx3695/hx3695_spo2_agc.h

index 2a67dee..4db8ed6 100644 (file)
@@ -5,7 +5,7 @@
 #include <math.h>\r
 \r
 #include "tyhx_hrs_custom.h"\r
-// #include "tyhx_mems.h"\r
+//#include "tyhx_mems.h"\r
 \r
 #ifdef CHIP_HX3695\r
 #include "hx3695.h"\r
 #include "hx3695_check_touch.h"\r
 #endif\r
 #include "hx3695_factory_test.h"\r
+//#include "app_ble_factory_test.h"\r
+\r
+// #include "ui.h"\r
+// #include "app_heart_rate.h"\r
+// #include "lv_dev.h"\r
+// #include "app_task.h"\r
 \r
 FT_CUSTOM_RESULTS_t hrsresult ={0};\r
 \r
@@ -32,6 +38,7 @@ int16_t gsen_fifo_x[64]={0};
 int16_t gsen_fifo_y[64]={0};\r
 int16_t gsen_fifo_z[64]={0};\r
 \r
+\r
 #ifdef SPO2_VECTOR\r
 #include "spo2_vec.h"\r
 uint32_t spo2_send_cnt = 0;\r
@@ -50,7 +57,8 @@ int32_t PPG_buf_vec[8];
 #ifdef HRV_TESTVEC\r
 #include "hrv_testvec.h"\r
 #endif\r
-\r
+// #include "sys_init.h"\r
+// #include "cwm_api.h"\r
 int32_t s_buf[256];\r
 uint32_t cnt_num = 0;\r
 uint32_t  phase3_rdy_num = 0;\r
@@ -59,9 +67,10 @@ uint8_t hrs_phase_num= 3;
 uint8_t spo2_phase_num= 4;\r
 uint8_t hrv_phase_num = 4;\r
 extern uint8_t data_count;\r
-// extern uint8_t hr_no_living_dur;\r
-uint8_t hr_no_living_dur;\r
-// extern int tyhx_long_timer_tick;    \r
+extern uint8_t hr_no_living_dur;\r
+extern uint8_t spo2_no_living_dur;\r
+\r
+extern int tyhx_long_timer_tick;       \r
 //spo2 agc\r
 const uint8_t  hx3695_spo2_agc_red_idac = RED_AGC_OFFSET;\r
 const uint8_t  hx3695_spo2_agc_ir_idac = IR_AGC_OFFSET;\r
@@ -87,18 +96,19 @@ const uint8_t gsen_lv_val = 0;
 uint8_t read_fifo_first_flg = 0;\r
 \r
 //HRS_INFRARED_THRES\r
-const int32_t  hrs_ir_unwear_thres = 4000;\r
-const int32_t  hrs_ir_wear_thres = 5000;\r
+const int32_t  hrs_ir_unwear_thres = 8000;\r
+const int32_t  hrs_ir_wear_thres = 10000;\r
 //HRV_INFRARED_THRES\r
-const int32_t  hrv_ir_unwear_thres = 4000;      //demo143b  25000\r
-const int32_t  hrv_ir_wear_thres = 5000;\r
+const int32_t  hrv_ir_unwear_thres = 8000;      //demo143b  25000\r
+const int32_t  hrv_ir_wear_thres = 10000;\r
 //SPO2_INFRARED_THRES\r
-const int32_t  spo2_ir_unwear_thres = 4000;     //demo143b  25000   30000\r
-const int32_t  spo2_ir_wear_thres = 5000;\r
+const int32_t  spo2_ir_unwear_thres = 8000;     //demo143b  25000   30000\r
+const int32_t  spo2_ir_wear_thres = 10000;\r
 const uint8_t  spo2_ir_wear_offset = 15;\r
 //CHECK_WEAR_MODE_THRES\r
-const int32_t  check_mode_unwear_thre = 20000;\r
-const int32_t  check_mode_wear_thre = 30000;\r
+const int32_t  check_mode_unwear_thre = 8000;\r
+const int32_t  check_mode_wear_thre = 10000;\r
+\r
 \r
 uint8_t alg_ram[11 * 1024] __attribute__((aligned(4)));\r
 //uint8_t alg_ram[10] = {0};\r
@@ -114,7 +124,7 @@ const  uint8_t   QUICK_RESULT = 1;                //come out the spo2 result qui
 const  uint16_t  MEAN_NUM = 32;                  //the length of smooth-average ;the value of MEAN_NUM can be given only 256 and 512\r
 const  uint8_t   G_SENSOR = 0;                      //if =1, open the gsensor mode\r
 const  uint8_t   SPO2_GSEN_POW_THRE = 150;         //gsen pow judge move, range:0-200;\r
-const  uint32_t  SPO2_BASE_LINE_INIT = 135500;    //spo2 baseline init, = 103000 + ratio(a variable quantity,depends on different cases)*SPO2_SLOPE\r
+const  uint32_t  SPO2_BASE_LINE_INIT = 138000;    //spo2 baseline init, = 103000 + ratio(a variable quantity,depends on different cases)*SPO2_SLOPE\r
 const  int32_t   SOP2_DEGLITCH_THRE = 100000;     //remove signal glitch over this threshold\r
 const  int32_t   SPO2_REMOVE_JUMP_THRE = 50000;  //remove signal jump over this threshold\r
 const  uint32_t  SPO2_SLOPE = 50000;              //increase this slope, spo2 reduce more\r
@@ -139,8 +149,6 @@ static int32_t ir_jump_delta = 0;
 static int32_t cali_data_cnt = 0;\r
 #endif\r
 \r
-\r
-\r
 // us 延时函数, 客户需填写\r
 void hx3695_delay_us(uint32_t us)\r
 {\r
@@ -171,14 +179,80 @@ uint8_t hx3695_read_reg(uint8_t addr)
 }\r
 \r
 // i2c 连读函数, 客户需填写\r
-bool hx3695_brust_read_reg(uint8_t addr, uint8_t *buf, uint8_t length)\r
+bool hx3695_brust_read_reg(uint8_t addr, uint8_t *buf, uint16_t length)\r
 {\r
     //TYHX_LOG("brust read\r\n");\r
     tyhx_read_regs(addr,buf,length);\r
     return true;\r
 }\r
 \r
-\r
+void Efuse_Mode_Check(void)\r
+{\r
+#if    1//def TEST_RELEASE_USE\r
+       PRINT("@@@@@@@@@ Efuse_Mode_Check\r\n");\r
+    uint8_t REG_50_E, REG_51_E, REG_52_E, REG_53_E;\r
+       \r
+       hx3695_write_reg(0x5c, 0x08) ; //0x5c\r
+       hx3695_write_reg(0x5d, 0x02) ; //0x5d\r
+       hx3695_delay_us(10);\r
+       \r
+       hx3695_write_reg(0x5a,0x10);  //0x5A\r
+       \r
+       hx3695_write_reg(0x5b,0x04);\r
+       hx3695_write_reg(0x5b,0x00);\r
+    hx3695_delay_us(10);\r
+       hx3695_write_reg(0x5b,0x44);\r
+       hx3695_write_reg(0x5b,0x40);\r
+       \r
+       REG_50_E = hx3695_read_reg(0x50);\r
+       REG_51_E = hx3695_read_reg(0x51);\r
+       REG_52_E = hx3695_read_reg(0x52);\r
+       REG_53_E = hx3695_read_reg(0x53);\r
+               \r
+    hx3695_write_reg(0x5a,0x20);  //0x5A\r
+    hx3695_write_reg(0x50,REG_50_E);\r
+    hx3695_write_reg(0x51,REG_51_E);\r
+    hx3695_write_reg(0x52,REG_52_E);\r
+    hx3695_write_reg(0x53,REG_53_E);\r
+\r
+    TYHX_LOG("EFUSE MC2: 0x50=0x%2x  0x51= 0x%2x  0x52= 0x%2x  0x53= 0x%2x \r\n",REG_50_E,REG_51_E,REG_52_E,REG_53_E);\r
+   \r
+       hx3695_write_reg(0x5a,0x00);    \r
+    hx3695_write_reg(0x5c,0x00); //0x5c\r
+    hx3695_write_reg(0x5d,0x00); //0x5d\r
+#endif     \r
+}\r
+bool Efuse_judge(void)\r
+{\r
+     uint8_t REG_50, REG_51, REG_52, REG_53,REG_50_A;\r
+    \r
+     REG_50 = hx3695_read_reg(0x50);   //32k\r
+     REG_51 = hx3695_read_reg(0x51);\r
+        REG_52 = hx3695_read_reg(0x52);        \r
+     REG_53 = hx3695_read_reg(0x53);   //bit<7>  efuse trim flg ==1\r
+  \r
+//     hx3695_write_reg(0x5d,0x00);     \r
+//     hx3695_write_reg(0x5a,0x20);  \r
+//     REG_50_A=REG_50+1;\r
+//     hx3695_write_reg(0x50,REG_50_A);  //  REG_50+1    \r
+//     TYHX_LOG("EFUSE 0x50=%x  \r\n",REG_50_A);\r
+//     hx3695_write_reg(0x50,REG_51);     \r
+//     hx3695_write_reg(0x50,REG_52); \r
+//     hx3695_write_reg(0x50,REG_53); \r
+    \r
+       TYHX_LOG("EFUSE MC1 :0x50=0x%2x  0x51= 0x%2x  0x52= 0x%2x  0x53= 0x%2x  \r\n",REG_50,REG_51,REG_52,REG_53);\r
+    if ((REG_50 == 0x40) && (REG_51 ==0x50) && (REG_52 ==0x10) && (REG_53 ==0x22))\r
+    {             \r
+        Efuse_Mode_Check();        \r
+        TYHX_LOG("this chip is before MC \r\n");        \r
+    }\r
+    else\r
+    {\r
+        TYHX_LOG("EFUSE MC3 :0x50=0x%2x  0x51= 0x%2x  0x52= 0x%2x  0x53= 0x%2x  \r\n",REG_50,REG_51,REG_52,REG_53);\r
+        TYHX_LOG("this chip is after MC \r\n");\r
+    }\r
+       return true;\r
+}\r
 \r
 uint32_t hx3695_timers_start(void)\r
 {\r
@@ -248,88 +322,25 @@ void hx3695_gpioint_cfg(bool en)
 }\r
 #endif\r
 \r
-\r
-\r
-#define RA_MEM_WRDATA_7_0           0x50\r
-#define RA_MEM_WRDATA_15_8          0x51\r
-#define RA_MEM_WRDATA_23_16         0x52\r
-#define RA_MEM_WRDATA_31_24         0x53\r
-#define RA_MEM_WRDATA_39_32         0x54\r
-#define RA_MEM_WRDATA_47_40         0x55\r
-#define RA_MEM_WRDATA_55_48         0x56\r
-#define RA_MEM_WRDATA_63_56         0x57\r
-#define RA_MEM_PWE_PULSE_CYCLE7_0   0x58\r
-#define RA_MEM_PWE_PULSE_CYCLE10_8  0x59\r
-#define RA_MEM_GLOBAL_CTRL          0x5A\r
-#define RA_MEM_MANNUAL_CTRL         0x5B\r
-#define RA_DEBUG_CFG0               0x5C\r
-#define RA_DEBUG_CFG1               0x5D\r
-\r
-uint8_t REG_50_E, REG_51_E, REG_52_E, REG_53_E;\r
-\r
-void Efuse_Mode_Check(void)\r
-{\r
-        uint8_t  efuse0, efuse1, efuse2, efuse3;\r
-       \r
-       hx3695_write_reg(RA_DEBUG_CFG0, 0x8) ; //0x5c\r
-       hx3695_write_reg(RA_DEBUG_CFG1, 0x2) ;   //0x5d\r
-       hx3695_delay_us(1000);\r
-       \r
-         hx3695_write_reg(RA_MEM_GLOBAL_CTRL,0x10);  //0x5A\r
-//       delay_us(2000);\r
-       \r
-         hx3695_write_reg(RA_MEM_MANNUAL_CTRL,0x04);\r
-         hx3695_write_reg(RA_MEM_MANNUAL_CTRL,0x00);\r
-       \r
-         hx3695_write_reg(RA_MEM_MANNUAL_CTRL,0x44);\r
-         hx3695_write_reg(RA_MEM_MANNUAL_CTRL,0x40);\r
-       \r
-         REG_50_E = hx3695_read_reg(0x50);\r
-         REG_51_E = hx3695_read_reg(0x51);\r
-         REG_52_E = hx3695_read_reg(0x52);\r
-         REG_53_E = hx3695_read_reg(0x53);\r
-\r
-//       AGC_LOG("0x50=0x%x\r\n", REG_50_E);\r
-//             hal_gpt_delay_ms(100);\r
-//             AGC_LOG("0x51=0x%x\r\n",  REG_51_E);\r
-//             hal_gpt_delay_ms(100);\r
-//             AGC_LOG("0x52=0x%x\r\n",  REG_52_E);\r
-//             hal_gpt_delay_ms(100);\r
-//             AGC_LOG("0x53=0x%x\r\n",  REG_53_E);\r
-//             hal_gpt_delay_ms(100);\r
-               \r
-               hx3695_write_reg(RA_MEM_GLOBAL_CTRL,0x20);  //0x5A\r
-               hx3695_write_reg(0x50,REG_50_E);\r
-               hx3695_write_reg(0x51,REG_51_E);\r
-               hx3695_write_reg(0x52,REG_52_E);\r
-               hx3695_write_reg(0x53,REG_53_E);\r
-\r
-       \r
-         hx3695_write_reg(RA_MEM_GLOBAL_CTRL,0x0);\r
-               \r
-               hx3695_write_reg(RA_DEBUG_CFG0, 0x0); //0x5c\r
-    hx3695_write_reg(RA_DEBUG_CFG1, 0x0);   //0x5d\r
-\r
-}\r
 bool hx3695_chip_check(void)\r
 {\r
     uint8_t i = 0;\r
     uint8_t chip_id = 0;\r
     for(i=0; i<5; i++)\r
     {\r
-        hx3695_write_reg(0x5c, 0x00);\r
+        hx3695_ppg_on();\r
         hx3695_delay_ms(5);\r
         chip_id = hx3695_read_reg(0x00);\r
 \r
         if (chip_id == 0x65)\r
         {\r
-            TYHX_LOG("hx3695_chip_check ok  chip_id: 0x%x \r\n",chip_id);\r
-                       Efuse_Mode_Check();\r
+            printf("hx3695_chip_check ok  chip_id: 0x%x \r\n",chip_id);\r
+                       //Efuse_Mode_Check();\r
             return true;\r
         }\r
     }\r
 \r
-    TYHX_LOG(" hx3695_chip_check fail!  chip_id: 0x%x \r\n", chip_id);\r
+    printf(" hx3695_chip_check fail!  chip_id: 0x%x \r\n", chip_id);\r
 \r
     return false;\r
 }\r
@@ -340,18 +351,17 @@ uint8_t hx3695_get_chip_id(void)
     uint8_t chip_id = 0;\r
     for(i=0; i<5; i++)\r
     {\r
-        hx3695_write_reg(0x5c, 0x00);\r
-        hx3695_delay_ms(5);\r
+        hx3695_ppg_on();\r
         chip_id = hx3695_read_reg(0x00);\r
 \r
         if (chip_id == 0x65)\r
         {\r
-            TYHX_LOG("hx3695_chip_check ok  chip_id: 0x%x \r\n",chip_id);\r
+            printf("hx3695_chip_check ok  chip_id: 0x%x \r\n",chip_id);\r
             return chip_id;\r
         }\r
     }\r
 \r
-    TYHX_LOG(" hx3695_chip_check fail!  chip_id: 0x%x \r\n", chip_id);\r
+    printf(" hx3695_chip_check fail!  chip_id: 0x%x \r\n", chip_id);\r
 \r
     return chip_id;\r
 }\r
@@ -370,11 +380,11 @@ uint8_t hx3695_read_fifo_size(void)
 \r
 uint16_t hx3695_read_fifo_data(int32_t *buf, uint8_t phase_num, uint8_t sig)\r
 {\r
-    uint8_t data_flg_start = 0;\r
-               uint8_t data_flg_end = 0;\r
+        uint8_t data_flg_start = 0;\r
+        uint8_t data_flg_end = 0;\r
 //    int32_t data;\r
-    uint8_t databuf[3];\r
-    uint32_t ii=0;\r
+        uint8_t databuf[3];\r
+        uint32_t ii=0;\r
                uint16_t data_len_h = 0;\r
                uint16_t data_len_l = 0;\r
                uint16_t fifo_data_length = 0;\r
@@ -386,13 +396,13 @@ uint16_t hx3695_read_fifo_data(int32_t *buf, uint8_t phase_num, uint8_t sig)
                data_len_h = hx3695_read_reg(0x21);\r
                data_len_l = hx3695_read_reg(0x20);\r
                fifo_data_length = (((data_len_h&0x01)<<8)|data_len_l);\r
-//       AGC_LOG("fifo_data_length =  %d\r\n", fifo_data_length);      \r
+//       SEGGER_RTT_printf(0,"fifo_data_length =  %d\r\n", fifo_data_length);  \r
                if(fifo_data_length<2*phase_num)\r
                {\r
                        return 0;\r
                }\r
                fifo_read_length = ((fifo_data_length-phase_num)/phase_num)*phase_num;\r
-//             AGC_LOG("fifo_data_length_change =  %d\r\n", fifo_read_length);\r
+//             SEGGER_RTT_printf(0,"fifo_data_length_change =  %d\r\n", fifo_read_length);\r
                fifo_read_bytes = fifo_read_length*3;\r
                if(read_fifo_first_flg == 1)\r
                {\r
@@ -402,7 +412,7 @@ uint16_t hx3695_read_fifo_data(int32_t *buf, uint8_t phase_num, uint8_t sig)
                hx3695_brust_read_reg(0x22, fifo_data_buf, fifo_read_bytes);    \r
 //                                                     for(ii=0; ii<fifo_read_bytes; ii++)\r
 //                                                     {\r
-//                                                             AGC_LOG("%d/%d, %d\r\n", ii+1,fifo_read_bytes,fifo_data_buf[ii]);                               \r
+//                                                             SEGGER_RTT_printf(0,"%d/%d, %d\r\n", ii+1,fifo_read_bytes,fifo_data_buf[ii]);                           \r
 //                                                     }\r
                for(ii=0; ii<fifo_read_length; ii++)\r
                {\r
@@ -421,7 +431,7 @@ uint16_t hx3695_read_fifo_data(int32_t *buf, uint8_t phase_num, uint8_t sig)
                                        buf[ii] = (int32_t)(fifo_data_buf[ii*3]|(fifo_data_buf[ii*3+1]<<8)|((fifo_data_buf[ii*3+2]&0x1f)<<16));\r
                                }\r
                        }\r
-                       AGC_LOG("fifo_length =  %d/%d, %d %d\r\n", ii+1,fifo_read_length,buf[ii],fifo_data_buf[ii*3+2]>>5);                             \r
+                       SEGGER_RTT_printf(0,"fifo_length =  %d/%d, %d %d\r\n", ii+1,fifo_read_length,buf[ii],fifo_data_buf[ii*3+2]>>5);                         \r
                }\r
                data_flg_start = fifo_data_buf[2]>>5;\r
                data_flg_end = fifo_data_buf[fifo_read_bytes-1]>>5;\r
@@ -446,7 +456,7 @@ uint16_t hx3695_read_fifo_data(int32_t *buf, uint8_t phase_num, uint8_t sig)
                }   \r
                for(ii=0; ii<fifo_out_length; ii++)\r
                {\r
-//                     AGC_LOG("fifo_buf  %d/%d, %d\r\n", ii+1,fifo_out_length,buf[ii]);                               \r
+//                     SEGGER_RTT_printf(0,"fifo_buf  %d/%d, %d\r\n", ii+1,fifo_out_length,buf[ii]);                           \r
                }\r
                fifo_out_length = fifo_out_length+phase_num-data_flg_end - 1;\r
                fifo_out_count = fifo_out_length/phase_num;\r
@@ -466,12 +476,12 @@ void hx3695_ppg_off(void)
 {\r
 \r
     hx3695_delay_ms(5);\r
-    hx3695_write_reg(0x5c, 0x02);\r
+    hx3695_write_reg(0x02, 0x01);\r
 }\r
 \r
 void hx3695_ppg_on(void)\r
 {\r
-    hx3695_write_reg(0x5c, 0x00);\r
+    hx3695_write_reg(0x02, 0x00);\r
     hx3695_delay_ms(5);\r
 }\r
 \r
@@ -500,14 +510,14 @@ void hx3695_data_reset(void)
 void hx3695_hrs_ppg_init(void) // ppg fs=25hz, phase conversion ready interupt en\r
 {\r
     uint16_t sample_rate = 25;                  /*config the data rate of chip alps2_fm ,uint is Hz*/\r
-    uint32_t prf_clk_num = 32000/sample_rate;   /*period in clk num, num = Fclk/fs */\r
+    uint32_t prf_clk_num = 32000/sample_rate*24/25;   /*period in clk num, num = Fclk/fs */\r
          \r
-//       uint16_t fifo_watermark= 81 ;\r
+       uint16_t fifo_watermark= 81 ;\r
     uint8_t adc_rst_post_num=0;       /* 00=16,01=32,10=64,11=128*/      \r
-         uint8_t samp_delay_leden_num = 0; /* 00=8,01=16,10=32,11=64*/ \r
+    uint8_t samp_delay_leden_num = 0; /* 00=8,01=16,10=32,11=64*/ \r
     uint8_t samp_copy_avg = 0;        /* 0=1, 1=2, 2=4 ,3=8, 4=16*/\r
     uint8_t data_avg_num = 0;         /* 0 = 1 ; 1 = 2; 2 =4 ; 3 =8 ; 4 =16 ;*/\r
-         uint8_t phase7_8_internal = 0;    /* phase7 and phase8 prf internal cfg */\r
+    uint8_t phase7_8_internal = 0;    /* phase7 and phase8 prf internal cfg */\r
                \r
     uint8_t phase1_enable = 1;     /*phase1_enable  , 1 mean enable ; 0 mean disable */ \r
     uint8_t phase2_enable = 1;     /*phase2_enable  , 1 mean enable ; 0 mean disable */ \r
@@ -516,97 +526,85 @@ void hx3695_hrs_ppg_init(void) // ppg fs=25hz, phase conversion ready interupt e
     uint8_t phase5_enable = 1;     /*phase5_enable  , 1 mean enable ; 0 mean disable */ \r
     uint8_t phase6_enable = 1;     /*phase6_enable  , 1 mean enable ; 0 mean disable */ \r
     uint8_t phase7_enable = 1;     /*phase7_enable  , 1 mean enable ; 0 mean disable */        \r
-         uint8_t phase8_enable = 1;     /*phase8_enable  , 1 mean enable ; 0 mean disable */ \r
+    uint8_t phase8_enable = 1;     /*phase8_enable  , 1 mean enable ; 0 mean disable */ \r
 \r
     uint8_t phase1_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
     uint8_t phase2_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
     uint8_t phase3_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
     uint8_t phase4_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
-               uint8_t phase5_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
-         uint8_t phase6_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
-               uint8_t phase7_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
-               uint8_t phase8_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
-                        \r
-         uint8_t phase1_mux_sel = 0;    /* sel phase1*/\r
-               uint8_t phase2_mux_sel = 1;    /* sel phase2*/\r
-               uint8_t phase3_mux_sel = 2;    /* sel phase3*/\r
-               uint8_t phase4_mux_sel = 3;    /* sel phase4*/\r
-               uint8_t phase5_mux_sel = 4;    /* sel phase5*/\r
-               uint8_t phase6_mux_sel = 5;    /* sel phase6*/\r
-               uint8_t phase7_mux_sel = 6;    /* sel phase7*/\r
-               uint8_t phase8_mux_sel = 7;    /* sel phase8*/\r
+    uint8_t phase5_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
+    uint8_t phase6_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
+    uint8_t phase7_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
+    uint8_t phase8_adc_osr = 3;    /* 0 = 128 ; 1 = 256 ; 2 = 512 ; 3 = 1024 ; 4 = 2048*/\r
+         \r
+    uint8_t phase1_mux_sel = 0;    /* sel phase1*/\r
+    uint8_t phase2_mux_sel = 1;    /* sel phase2*/\r
+    uint8_t phase3_mux_sel = 2;    /* sel phase3*/\r
+    uint8_t phase4_mux_sel = 3;    /* sel phase4*/\r
+    uint8_t phase5_mux_sel = 4;    /* sel phase5*/\r
+    uint8_t phase6_mux_sel = 5;    /* sel phase6*/\r
+    uint8_t phase7_mux_sel = 6;    /* sel phase7*/\r
+    uint8_t phase8_mux_sel = 7;    /* sel phase8*/\r
        \r
 \r
-         uint8_t phase1_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
+    uint8_t phase1_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase1_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
-               uint8_t phase1_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
+    uint8_t phase1_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase1_led_drv1_cha_sel = 0;     /* 1 = ldr1  NG; 2 = ldr2   GR; 4 = ldr3  IR; 8 = ldr4 RED; */\r
     uint8_t phase1_led_drv2_cha_sel = 0;    /*ldr5:0x20  ldr6: 0x40 red    ldr8 0x80  ir      */\r
-               uint8_t phase1_pd_sel = 0x0F;   //0x03       /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+       uint8_t phase1_pd_sel = HRS_PD;   //0x03       /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase1_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
-               uint8_t phase1_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
+    uint8_t phase1_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase1_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
-               uint8_t phase1_ldr2_cur = 0;\r
-//             uint8_t phase1_of_idac1_cur = 0;\r
-//    uint8_t phase1_of_idac2_cur = 0;\r
+    uint8_t phase1_ldr2_cur = 0;\r
     uint8_t phase1_ad_inr_ctrl = 3;\r
     uint8_t phase1_ad_of_idac_ctrl = 0;\r
-//    uint8_t afe_offset  =  0;\r
-    uint8_t phase1_led_en = 1;      /* phase1 led enable*/\r
-               \r
-               uint8_t phase1_dsp_mov_avg_num = 0; /* 0=bypass ; 1=2 ; 2=4 ; 3=8 */\r
+    uint8_t phase1_led_en = 1;      /* phase1 led enable*/             \r
+    uint8_t phase1_dsp_mov_avg_num = 0; /* 0=bypass ; 1=2 ; 2=4 ; 3=8 */\r
     uint8_t phase1_dsp_iir_lp_coeff = 0; /* 0=bypass ; 1=1/2 ; 2=1/4 ; 3=1/8 ,...,7=1/128 */\r
 \r
 \r
 \r
-         uint8_t phase2_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
+    uint8_t phase2_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase2_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
-               uint8_t phase2_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
-    uint8_t phase2_led_drv1_cha_sel = 0x50;   //0x10  //GREEN_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
+    uint8_t phase2_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
+    uint8_t phase2_led_drv1_cha_sel = GREEN_LED_SLE;   //0x10  //GREEN_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase2_led_drv2_cha_sel = 0;\r
-               uint8_t phase2_pd_sel = 0x0F;  //0x0C  //0x03   /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase2_pd_sel = HRS_PD;  //0x0C  //0x03   /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase2_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
-               uint8_t phase2_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
+    uint8_t phase2_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase2_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
-               uint8_t phase2_ldr2_cur = 0;\r
-//             uint8_t phase2_of_idac1_cur = 0;\r
-//    uint8_t phase2_of_idac2_cur = 0;\r
+    uint8_t phase2_ldr2_cur = 0;\r
     uint8_t phase2_ad_inr_ctrl = 3;\r
     uint8_t phase2_ad_of_idac_ctrl = 0;\r
-//    uint8_t phase2_afe_offset  =  0;\r
-    uint8_t phase2_led_en = 1;      /* phase1 led enable*/\r
-               \r
-               uint8_t phase2_dsp_mov_avg_num = 0; /* 0=bypass ; 1=2 ; 2=4 ; 3=8 */\r
+    uint8_t phase2_led_en = 1;      /* phase1 led enable*/             \r
+    uint8_t phase2_dsp_mov_avg_num = 0; /* 0=bypass ; 1=2 ; 2=4 ; 3=8 */\r
     uint8_t phase2_dsp_iir_lp_coeff = 0; /* 0=bypass ; 1=1/2 ; 2=1/4 ; 3=1/8 ,...,7=1/128 */\r
 \r
                \r
     uint8_t phase3_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase3_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
-               uint8_t phase3_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
+    uint8_t phase3_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase3_led_drv1_cha_sel = 0;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase3_led_drv2_cha_sel = 0;\r
-               uint8_t phase3_pd_sel = 0x0F;   //0x03       /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase3_pd_sel = HRS_PD;   //0x03       /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase3_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
-               uint8_t phase3_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
+    uint8_t phase3_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase3_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
-               uint8_t phase3_ldr2_cur = 0;\r
-//             uint8_t phase3_of_idac1_cur = 0;\r
-//    uint8_t phase3_of_idac2_cur = 0;\r
+    uint8_t phase3_ldr2_cur = 0;\r
     uint8_t phase3_ad_inr_ctrl = 3;\r
     uint8_t phase3_ad_of_idac_ctrl = 0;\r
-//    uint8_t phase3_afe_offset  =  0;\r
-    uint8_t phase3_led_en = 1;      /* phase1 led enable*/\r
-               \r
-               uint8_t phase3_dsp_mov_avg_num = 0; /* 0=bypass ; 1=2 ; 2=4 ; 3=8 */\r
+    uint8_t phase3_led_en = 1;      /* phase1 led enable*/             \r
+    uint8_t phase3_dsp_mov_avg_num = 0; /* 0=bypass ; 1=2 ; 2=4 ; 3=8 */\r
     uint8_t phase3_dsp_iir_lp_coeff = 0; /* 0=bypass ; 1=1/2 ; 2=1/4 ; 3=1/8 ,...,7=1/128 */\r
 \r
                \r
     uint8_t phase4_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase4_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
-               uint8_t phase4_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
+    uint8_t phase4_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase4_led_drv1_cha_sel = 0;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase4_led_drv2_cha_sel = 0;\r
-               uint8_t phase4_pd_sel = 0x0F;   //0x0C   /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase4_pd_sel = HRS_PD;   //0x0C   /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase4_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase4_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase4_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -624,9 +622,9 @@ void hx3695_hrs_ppg_init(void) // ppg fs=25hz, phase conversion ready interupt e
     uint8_t phase5_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase5_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
                uint8_t phase5_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
-    uint8_t phase5_led_drv1_cha_sel = 0x50;   //0x10  /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
+    uint8_t phase5_led_drv1_cha_sel = 0;   //0x10  /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase5_led_drv2_cha_sel = 0;\r
-               uint8_t phase5_pd_sel = 0x0F;   //0x0C    /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase5_pd_sel = HRS_PD;   //0x0C    /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase5_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase5_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase5_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -646,7 +644,7 @@ void hx3695_hrs_ppg_init(void) // ppg fs=25hz, phase conversion ready interupt e
                uint8_t phase6_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase6_led_drv1_cha_sel = 0;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase6_led_drv2_cha_sel = 0;\r
-               uint8_t phase6_pd_sel = 0x0F; //0x0C     /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase6_pd_sel = HRS_PD; //0x0C     /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase6_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase6_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase6_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -666,7 +664,7 @@ void hx3695_hrs_ppg_init(void) // ppg fs=25hz, phase conversion ready interupt e
                uint8_t phase7_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase7_led_drv1_cha_sel = 0;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase7_led_drv2_cha_sel = 0;\r
-               uint8_t phase7_pd_sel = 0x02;  //0x0C     /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase7_pd_sel = SPO2_PD;  //0x0C     /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase7_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase7_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase7_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -684,9 +682,9 @@ void hx3695_hrs_ppg_init(void) // ppg fs=25hz, phase conversion ready interupt e
     uint8_t phase8_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase8_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
                uint8_t phase8_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
-    uint8_t phase8_led_drv1_cha_sel = 0x20; //0x40  //IR_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
+    uint8_t phase8_led_drv1_cha_sel = IR_LED_SLE; //0x40  //IR_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase8_led_drv2_cha_sel = 0;\r
-               uint8_t phase8_pd_sel = 0x02;  //0x0C     /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase8_pd_sel = SPO2_PD;  //0x0C     /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase8_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase8_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase8_ldr1_cur = 32;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -883,15 +881,13 @@ void hx3695_hrs_ppg_init(void) // ppg fs=25hz, phase conversion ready interupt e
                hx3695_write_reg(0X6c, 0X00);   \r
                hx3695_write_reg(0X6d, 0X37);   \r
                hx3695_write_reg(0X6e, 0X82);   \r
-               hx3695_write_reg(0X6f, 0X08);\r
+    hx3695_write_reg(0X6f, 0X00);\r
 /////////FIFO and adc conversion ready config////////\r
 /////////FIFO and adc conversion ready config////////\r
 #if defined(PPG_INT_MODE)\r
                hx3695_write_reg(0X1b, 0x92);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\\r
-                                        0011=p4;0100=p5;0101=p6;0110=p7;\\r
-                                        bits<7> fifo enble\r
+                                     0011=p4;0100=p5;0101=p6;0110=p7;\ bits<7> fifo enble\r
                 hx3695_write_reg(0X33, 0x83);   // int width                                                                                                                                           \r
-     hx3695_write_reg(0X21, 0x00);   // fifo int sel,00=FIFO INT config clear\r
                 hx3695_write_reg(0X38, 0x01);   // int sel,00=close almost full int,04=enable almost full int\r
 #elif defined(INT_MODE)               //FIFO_ALL_MOST_FULL)\r
                 hx3695_write_reg(0X1b, 0x92);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\\r
@@ -900,13 +896,11 @@ void hx3695_hrs_ppg_init(void) // ppg fs=25hz, phase conversion ready interupt e
                 hx3695_write_reg(0X1c, (fifo_watermark&0xff));   //fifo_watermark\r
                 hx3695_write_reg(0X1d, fifo_watermark<<8);       //bit<0>=fifo_watermark[8]  \r
                 hx3695_write_reg(0X33, 0x83);   // int width   \r
-                hx3695_write_reg(0X21, 0x00);   // fifo int sel,00=FIFO INT config clear\r
      hx3695_write_reg(0X38, 0x04);   // int sel,00=close almost full int,04=enable almost full int\r
 \r
 #else\r
-                hx3695_write_reg(0X1b, 0x92);    // bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\r
-                                        // 0011=p4;0100=p5;0101=p6;0110=p7;\r
-                                        // bits<7> fifo enble                                                                          \r
+                hx3695_write_reg(0X1b, 0x92);    \r
+                                                                                       \r
      hx3695_write_reg(0X38, 0x01);   // int sel,00=close almost full int,04=enable almost full int\r
      \r
 #endif\r
@@ -930,9 +924,9 @@ void hx3695_hrs_ppg_init(void) // ppg fs=25hz, phase conversion ready interupt e
 void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion ready interupt en\r
 {\r
      uint16_t sample_rate = 25;                  /*config the data rate of chip alps2_fm ,uint is Hz*/\r
-    uint32_t prf_clk_num = 32000/sample_rate;   /*period in clk num, num = Fclk/fs */\r
+    uint32_t prf_clk_num = 32000/sample_rate*24/25;   /*period in clk num, num = Fclk/fs */\r
          \r
-//       uint16_t fifo_watermark= 250 ;\r
+       uint16_t fifo_watermark= 250 ;\r
     uint8_t adc_rst_post_num=0;       /* 00=16,01=32,10=64,11=128*/      \r
          uint8_t samp_delay_leden_num = 0; /* 00=8,01=16,10=32,11=64*/ \r
     uint8_t samp_copy_avg = 0;        /* 0=1, 1=2, 2=4 ,3=8, 4=16*/\r
@@ -974,7 +968,7 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
                uint8_t phase1_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase1_led_drv1_cha_sel = 0;     /* 1 = ldr1  NG; 2 = ldr2   GR; 4 = ldr3  IR; 8 = ldr4 RED; */\r
     uint8_t phase1_led_drv2_cha_sel = 0;    /*ldr5:0x20  ldr6: 0x40 red    ldr8 0x80  ir      */\r
-               uint8_t phase1_pd_sel = 0x0a;          /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase1_pd_sel = SPO2_PD;          /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase1_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase1_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase1_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -994,9 +988,9 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
          uint8_t phase2_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase2_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
                uint8_t phase2_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
-    uint8_t phase2_led_drv1_cha_sel = 0X50;   //GREEN_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
+    uint8_t phase2_led_drv1_cha_sel = GREEN_LED_SLE;   //GREEN_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase2_led_drv2_cha_sel = 0x00;\r
-               uint8_t phase2_pd_sel = 0x0a;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase2_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase2_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase2_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase2_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1017,7 +1011,7 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
                uint8_t phase3_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase3_led_drv1_cha_sel = 0;    //RED_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase3_led_drv2_cha_sel = 0;\r
-               uint8_t phase3_pd_sel = 0x0a;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase3_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase3_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase3_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase3_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1036,9 +1030,9 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
     uint8_t phase4_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase4_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
                uint8_t phase4_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
-    uint8_t phase4_led_drv1_cha_sel = 0x80; //0x20   //IR_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
+    uint8_t phase4_led_drv1_cha_sel = RED_LED_SLE; //0x20   //IR_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase4_led_drv2_cha_sel = 0;\r
-               uint8_t phase4_pd_sel = 0x0a;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase4_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase4_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase4_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase4_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1058,7 +1052,7 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
                uint8_t phase5_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase5_led_drv1_cha_sel = 0x00;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase5_led_drv2_cha_sel = 0;\r
-               uint8_t phase5_pd_sel = 0x0a;      /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase5_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase5_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase5_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase5_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1076,9 +1070,9 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
     uint8_t phase6_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase6_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
                uint8_t phase6_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
-    uint8_t phase6_led_drv1_cha_sel = 0x20;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
+    uint8_t phase6_led_drv1_cha_sel = IR_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase6_led_drv2_cha_sel = 0;\r
-               uint8_t phase6_pd_sel = 0x0a;      /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase6_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase6_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase6_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase6_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1098,7 +1092,7 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
                uint8_t phase7_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase7_led_drv1_cha_sel = 0;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase7_led_drv2_cha_sel = 0;\r
-               uint8_t phase7_pd_sel = 0x02;      /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase7_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase7_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase7_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase7_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1116,12 +1110,12 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
     uint8_t phase8_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase8_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
                uint8_t phase8_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
-    uint8_t phase8_led_drv1_cha_sel = 0x20;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
+    uint8_t phase8_led_drv1_cha_sel = IR_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase8_led_drv2_cha_sel = 0;\r
-               uint8_t phase8_pd_sel = 0x02;      /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase8_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase8_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase8_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
-    uint8_t phase8_ldr1_cur = 20;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
+    uint8_t phase8_ldr1_cur = 32;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
                uint8_t phase8_ldr2_cur = 0;\r
 //             uint8_t phase8_of_idac1_cur = 0;\r
 //    uint8_t phase8_of_idac2_cur = 0;\r
@@ -1312,15 +1306,13 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
                hx3695_write_reg(0X6c, 0X00);   \r
                hx3695_write_reg(0X6d, 0X37);   \r
                hx3695_write_reg(0X6e, 0X82);   \r
-               hx3695_write_reg(0X6f, 0X08);\r
+    hx3695_write_reg(0X6f, 0X00);\r
 /////////FIFO and adc conversion ready config////////\r
 /////////FIFO and adc conversion ready config////////\r
 #if defined(PPG_INT_MODE)\r
                hx3695_write_reg(0X1b, 0x92);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\\r
-                                        0011=p4;0100=p5;0101=p6;0110=p7;\\r
-                                        bits<7> fifo enble\r
+                                0011=p4;0100=p5;0101=p6;0110=p7;\  bits<7> fifo enble\r
                 hx3695_write_reg(0X33, 0x83);   // int width                                                                                                                                           \r
-     hx3695_write_reg(0X21, 0x00);   // fifo int sel,00=FIFO INT config clear\r
                 hx3695_write_reg(0X38, 0x08);   // int sel,00=close almost full int,04=enable almost full int\r
 #elif defined(INT_MODE)             //(FIFO_ALL_MOST_FULL)\r
                 hx3695_write_reg(0X1b, 0x92);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\\r
@@ -1332,9 +1324,7 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
      hx3695_write_reg(0X38, 0x04);   // int sel,00=close almost full int,04=enable almost full int\r
 \r
 #else\r
-               hx3695_write_reg(0X1b, 0x91);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\r
-                                        // 0011=p4;0100=p5;0101=p6;0110=p7;\r
-                                        // bits<7> fifo enble  \r
+               hx3695_write_reg(0X1b, 0x91);\r
      hx3695_write_reg(0X36, 0x00);                                                                                                                                                             \r
                                                                                                                                                \r
      hx3695_write_reg(0X38, 0x00);   // int sel,00=close almost full int,01= prf int  04=enable almost full int\r
@@ -1363,15 +1353,15 @@ void hx3695_spo2_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion
 void hx3695_hrv_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion ready interupt en\r
 {\r
    uint16_t sample_rate = 125;                  /*config the data rate of chip alps2_fm ,uint is Hz*/\r
-    uint32_t prf_clk_num = 32000/sample_rate;   /*period in clk num, num = Fclk/fs */\r
+    uint32_t prf_clk_num = 32000/sample_rate*24/25;  /*period in clk num, num = Fclk/fs */\r
          \r
-;\r
     uint8_t adc_rst_post_num=0;       /* 00=16,01=32,10=64,11=128*/      \r
          uint8_t samp_delay_leden_num = 0; /* 00=8,01=16,10=32,11=64*/ \r
     uint8_t samp_copy_avg = 0;        /* 0=1, 1=2, 2=4 ,3=8, 4=16*/\r
     uint8_t data_avg_num = 0;         /* 0 = 1 ; 1 = 2; 2 =4 ; 3 =8 ; 4 =16 ;*/\r
          uint8_t phase7_8_internal = 0;    /* phase7 and phase8 prf internal cfg */\r
        \r
+    uint16_t fifo_watermark= 164 ;\r
        uint8_t phase1_enable = 1;     /*phase1_enable  , 1 mean enable ; 0 mean disable */ \r
     uint8_t phase2_enable = 1;     /*phase2_enable  , 1 mean enable ; 0 mean disable */ \r
     uint8_t phase3_enable = 1;     /*phase3_enable  , 1 mean enable ; 0 mean disable */ \r
@@ -1743,7 +1733,7 @@ void hx3695_hrv_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion r
                hx3695_write_reg(0X6c, 0X00);   \r
                hx3695_write_reg(0X6d, 0X37);   \r
                hx3695_write_reg(0X6e, 0X82);   \r
-               hx3695_write_reg(0X6f, 0X08);\r
+    hx3695_write_reg(0X6f, 0X00);\r
 /////////FIFO and adc conversion ready config////////\r
 /////////FIFO and adc conversion ready config////////\r
 #if defined(PPG_INT_MODE)\r
@@ -1751,7 +1741,6 @@ void hx3695_hrv_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion r
                                         0011=p4;0100=p5;0101=p6;0110=p7;\\r
                                         bits<7> fifo enble\r
                 hx3695_write_reg(0X33, 0x83);   // int width                                                                                                                                           \r
-     hx3695_write_reg(0X21, 0x00);   // fifo int sel,00=FIFO INT config clear\r
                 hx3695_write_reg(0X38, 0x08);   // int sel,00=close almost full int,04=enable almost full int\r
 #elif defined(INT_MODE)             //(FIFO_ALL_MOST_FULL)\r
                 hx3695_write_reg(0X1b, 0x90);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\\r
@@ -1763,9 +1752,9 @@ void hx3695_hrv_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion r
      hx3695_write_reg(0X38, 0x04);   // int sel,00=close almost full int,04=enable almost full int\r
 \r
 #else\r
-               hx3695_write_reg(0X1b, 0x90);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\r
-                                        // 0011=p4;0100=p5;0101=p6;0110=p7;\r
-                                        // bits<7> fifo enble  \r
+               hx3695_write_reg(0X1b, 0x90);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\\r
+                                        0011=p4;0100=p5;0101=p6;0110=p7;\\r
+                                        bits<7> fifo enble     \r
      hx3695_write_reg(0X36, 0x00);                                                                                                                                                             \r
                                                                                                                                                \r
      hx3695_write_reg(0X38, 0x00);   // int sel,00=close almost full int,01= prf int  04=enable almost full int\r
@@ -1791,10 +1780,10 @@ void hx3695_hrv_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion r
 #ifdef CHECK_TOUCH_LIB\r
 void hx3695_check_touch_init(void) //\r
 {     \r
-         uint16_t sample_rate = 25;                  /*config the data rate of chip alps2_fm ,uint is Hz*/\r
-    uint32_t prf_clk_num = 32000/sample_rate;   /*period in clk num, num = Fclk/fs */\r
+         uint16_t sample_rate = 5;                  /*config the data rate of chip alps2_fm ,uint is Hz*/\r
+    uint32_t prf_clk_num = 32000/sample_rate*24/25;   /*period in clk num, num = Fclk/fs */\r
          \r
-//       uint16_t fifo_watermark= 250 ;\r
+    uint16_t fifo_watermark= 250 ;\r
     uint8_t adc_rst_post_num= 0;       /* 00=16,01=32,10=64,11=128*/      \r
          uint8_t samp_delay_leden_num = 0; /* 00=8,01=16,10=32,11=64*/ \r
     uint8_t samp_copy_avg = 0;        /* 0=1, 1=2, 2=4 ,3=8, 4=16*/\r
@@ -1836,7 +1825,7 @@ void hx3695_check_touch_init(void) //
                uint8_t phase1_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase1_led_drv1_cha_sel = 0;     /* 1 = ldr1  NG; 2 = ldr2   GR; 4 = ldr3  IR; 8 = ldr4 RED; */\r
     uint8_t phase1_led_drv2_cha_sel = 0;    /*ldr5:0x20  ldr6: 0x40 red    ldr8 0x80  ir      */\r
-               uint8_t phase1_pd_sel = 0x0c;          /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase1_pd_sel = SPO2_PD;          /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase1_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase1_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase1_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1858,7 +1847,7 @@ void hx3695_check_touch_init(void) //
                uint8_t phase2_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase2_led_drv1_cha_sel = 0;   //GREEN_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase2_led_drv2_cha_sel = 0;\r
-               uint8_t phase2_pd_sel = 0x0c;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase2_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase2_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase2_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase2_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1879,7 +1868,7 @@ void hx3695_check_touch_init(void) //
                uint8_t phase3_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase3_led_drv1_cha_sel = 0;     //RED_LED_SLE;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase3_led_drv2_cha_sel = 0;\r
-               uint8_t phase3_pd_sel = 0x0c;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase3_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase3_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase3_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase3_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1900,7 +1889,7 @@ void hx3695_check_touch_init(void) //
                uint8_t phase4_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase4_led_drv1_cha_sel = 0;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase4_led_drv2_cha_sel = 0;\r
-               uint8_t phase4_pd_sel = 0x0c;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
+               uint8_t phase4_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; 4 = pd3*/\r
     uint8_t phase4_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase4_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase4_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1920,7 +1909,7 @@ void hx3695_check_touch_init(void) //
                uint8_t phase5_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase5_led_drv1_cha_sel = 0;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase5_led_drv2_cha_sel = 0;\r
-               uint8_t phase5_pd_sel = 4;      /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase5_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase5_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase5_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase5_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1937,7 +1926,7 @@ void hx3695_check_touch_init(void) //
 \r
     uint8_t phase6_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase6_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
-               uint8_t phase6_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
+               uint8_t phase6_tia_cap = SPO2_PD;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase6_led_drv1_cha_sel = 0;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase6_led_drv2_cha_sel = 0;\r
                uint8_t phase6_pd_sel = 4;      /* 1 = pd1; 2 = pd2; */\r
@@ -1960,7 +1949,7 @@ void hx3695_check_touch_init(void) //
                uint8_t phase7_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
     uint8_t phase7_led_drv1_cha_sel = 0;     /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase7_led_drv2_cha_sel = 0;\r
-               uint8_t phase7_pd_sel = 0x00;      /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase7_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase7_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase7_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
     uint8_t phase7_ldr1_cur = 0;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
@@ -1978,12 +1967,12 @@ void hx3695_check_touch_init(void) //
     uint8_t phase8_inner_avg = 0;   /* phase1 adc avg num 0=1, 1=2, 2=4, 3=8 , 4=16*/\r
     uint8_t phase8_tia_res = 0;     /* 0= 10K; 1= 20k; 2= 50k; 3= 100k; 4= 150k; 5= 200k; 6= 500k; 7= 1M*/\r
                uint8_t phase8_tia_cap = 4;     /* 0= ; 1= ; 2= ; 3= ; 4= ; 5= ; 6= ; 7= */\r
-    uint8_t phase8_led_drv1_cha_sel = 0x20;//0x40;    //IR_LED_SLE    /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
+    uint8_t phase8_led_drv1_cha_sel = IR_LED_SLE;//0x40;    //IR_LED_SLE    /* 1 = ldr1; 2 = ldr2; 4 = ldr3; 8 = ldr4 ; */\r
     uint8_t phase8_led_drv2_cha_sel = 0;\r
-               uint8_t phase8_pd_sel = 0x0c;      /* 1 = pd1; 2 = pd2; */\r
+               uint8_t phase8_pd_sel = SPO2_PD;      /* 1 = pd1; 2 = pd2; */\r
     uint8_t phase8_als_offset_idac = 0; /* 0~255 = 0 ~ 128ua , step = 0.5ua */\r
                uint8_t phase8_led_offset_idac = 0; /* 0~255 = 0 ~ 64ua , step = 0.25ua */\r
-    uint8_t phase8_ldr1_cur = 20;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
+    uint8_t phase8_ldr1_cur = 32;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
                uint8_t phase8_ldr2_cur = 0;\r
 //             uint8_t phase8_of_idac1_cur = 0;\r
 //    uint8_t phase8_of_idac2_cur = 0;\r
@@ -2174,7 +2163,7 @@ void hx3695_check_touch_init(void) //
                hx3695_write_reg(0X6c, 0X00);   \r
                hx3695_write_reg(0X6d, 0X37);   \r
                hx3695_write_reg(0X6e, 0X82);   \r
-               hx3695_write_reg(0X6f, 0X08);\r
+    hx3695_write_reg(0X6f, 0X00);\r
 /////////FIFO and adc conversion ready config////////\r
 /////////FIFO and adc conversion ready config////////\r
 #if defined(PPG_INT_MODE)\r
@@ -2182,8 +2171,7 @@ void hx3695_check_touch_init(void) //
                                         0011=p4;0100=p5;0101=p6;0110=p7;\\r
                                         bits<7> fifo enble\r
                 hx3695_write_reg(0X33, 0x83);   // int width                                                                                                                                           \r
-     hx3695_write_reg(0X21, 0x00);   // fifo int sel,00=FIFO INT config clear\r
-                hx3695_write_reg(0X38, 0x08);   // int sel,00=close almost full int,04=enable almost full int\r
+    hx3695_write_reg(0X38, 0x01);   // int sel,00=close almost full int,04=enable almost full int\r
 #elif defined(INT_MODE)             //(FIFO_ALL_MOST_FULL)\r
                 hx3695_write_reg(0X1b, 0x92);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\\r
                                         0011=p4;0100=p5;0101=p6;0110=p7;\\r
@@ -2194,10 +2182,9 @@ void hx3695_check_touch_init(void) //
      hx3695_write_reg(0X38, 0x04);   // int sel,00=close almost full int,04=enable almost full int\r
 \r
 #else\r
-               hx3695_write_reg(0X1b, 0x92);// bits<3:0> fifo data sel, 0000 = p1;0001= p2;0010=p3;\r
-                                        // 0011=p4;0100=p5;0101=p6;0110=p7;\r
-                                        // bits<7> fifo enble  \r
-     hx3695_write_reg(0X36, 0x00);                       //intrupt                                                                                                                                     \r
+               hx3695_write_reg(0X1b, 0x92);\r
+\r
+     hx3695_write_reg(0X36, 0x00);                                                                                                                     \r
                                                                                                                                                \r
      hx3695_write_reg(0X38, 0x00);   // int sel,00=close almost full int,01= prf int  04=enable almost full int\r
 \r
@@ -2223,8 +2210,13 @@ void hx3695_check_touch_init(void) //
 bool hx3695_init(WORK_MODE_T mode)\r
 {\r
   hx3695_msg_callback_t func;\r
-       TYHX_LOG(" hx3695_init mode : %d \n", mode);\r
+\r
+       TYHX_LOG("this chip hx3695_init  mode: %d !! \r\n", mode);\r
        \r
+       hx3695_ppg_on();\r
+\r
+    Efuse_judge();  //MC前后芯片判断\r
+    //    Efuse_Mode_Check();\r
     work_mode_flag = mode;\r
     hx3695_data_reset();\r
     hx3695_vin_check(3800);\r
@@ -2233,9 +2225,7 @@ bool hx3695_init(WORK_MODE_T mode)
     case HRS_MODE:\r
                TYHX_LOG(" hx3695_init mode : HRS_MODE \n");\r
 #ifdef HRS_ALG_LIB\r
-               tyhx_hrs_set_alg_para(NORMAL_MODE, 150, 1);\r
-\r
-               tyhx_hrs_set_living(1, 15, 30);\r
+                               tyhx_hrs_set_living(1, 10, 30);\r
         if(hx3695_hrs_enable()== SENSOR_OP_FAILED)\r
         {\r
             return false;\r
@@ -2262,7 +2252,7 @@ bool hx3695_init(WORK_MODE_T mode)
         tyhx_spo2_para_barelychange(MEAN_NUM,SOP2_DEGLITCH_THRE,SPO2_REMOVE_JUMP_THRE, \\r
                                     SPO2_LOW_CLIP_END_TIME,SPO2_LOW_CLIP_DN,SPO2_NORMAL_CLIP_DN, \\r
                                     IR_AC_TOUCH_THRE,IR_FFT_POW_THRE,SPO2_CALI,SLOPE_PARA_MAX,SLOPE_PARA_MIN);\r
-                               tyhx_spo2_set_living(1, 15, 30);\r
+                               tyhx_spo2_set_living(1, 7, 20);\r
         if(hx3695_spo2_enable()== SENSOR_OP_FAILED)\r
         {\r
             return false;\r
@@ -2315,9 +2305,6 @@ bool hx3695_init(WORK_MODE_T mode)
           func(HX3695_MSG_TYPE_LEAKLIGHT_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
         }\r
         break;\r
-        return true;\r
-\r
-        break;\r
 \r
     case FT_GRAY_CARD_MODE:\r
         if (!hx3695_chip_check())\r
@@ -2340,17 +2327,24 @@ bool hx3695_init(WORK_MODE_T mode)
         break;\r
 \r
     case FT_SINGLE_CHECK_MODE:\r
+         if (!hx3695_chip_check())\r
+        {\r
+            AGC_LOG("hx3695 check id failed!\r\n");\r
+            return false;\r
+        }\r
         hx3695_factroy_test(SINGLE_CHECK_TEST);\r
         break;\r
 \r
     case FT_LED_OFF_MODE:\r
         hx3695_factroy_test(LED_OFF_TEST);\r
         break;\r
-\r
+     \r
     case FT_WEAR_MODE:\r
         hx3695_factroy_test(WEAR_MODE_TEST);\r
         break;\r
-\r
+  //  case NEW_PPG_TEST_MODE:\r
+  //       hx3695_factroy_test(NEW_PPG_TEST);\r
+  //       break;\r
     case LAB_TEST_MODE:\r
 #ifdef LAB_TEST\r
         if(hx3695_lab_test_enable()== SENSOR_OP_FAILED)\r
@@ -2368,6 +2362,7 @@ bool hx3695_init(WORK_MODE_T mode)
 \r
 void hx3695_agc_Int_handle(void)\r
 {\r
+       TYHX_LOG(" hx3695_init mode : HRS_MODE \n");\r
     switch (work_mode_flag)\r
     {\r
     case HRS_MODE:\r
@@ -2418,48 +2413,130 @@ void agc_timeout_handler(void * p_context)
 #endif\r
 }\r
 \r
+static uint32_t ft_ppg_green = 0;\r
+static uint32_t ft_ppg_iir = 0;\r
 \r
 void hx3695_factory_test_process(uint8_t data[], uint8_t mode, uint8_t* ppg_src)\r
 {\r
        extern bool factory_test_flag;\r
-       extern bool factory_test_aging;\r
        extern bool factory_test_sensor_on;\r
-       if(factory_test_flag == false || factory_test_aging != false) return;\r
+       extern bool factory_test_aging;\r
+               \r
+       if(factory_test_flag == false) return;\r
        if(factory_test_sensor_on == true ) return;\r
        \r
        static uint8_t ppg_data[15] = {0};\r
+       uint32_t test = 0;\r
+//     uint32_t green = 0;\r
+//     uint32_t red = 0;\r
+//     uint32_t iir = 0;\r
 \r
-       if(ppg_src == NULL)\r
+       if(data != NULL && ppg_src == NULL)\r
        {\r
                memcpy(ppg_data, data, 3);\r
                return;\r
        }\r
-               \r
-       // switch(mode)\r
-       // {\r
-       //      case APP_FACTORY_TEST_HR_START:\r
-       //              memcpy((void *)&ppg_data[3], ppg_src, 4);\r
-       //              factory_test_send_data(ppg_data, 7);\r
-       //      break;\r
-       //      case APP_FACTORY_TEST_SPO2_START:\r
-       //              memcpy((void *)&ppg_data[3], ppg_src, 4);\r
-       //              factory_test_send_data(ppg_data, 7);\r
-       //      break;\r
-       //      case APP_FACTORY_TEST_LEAKING_START:\r
-       //              memcpy((void *)&ppg_data[3], ppg_src, 12);\r
-       //              factory_test_send_data(ppg_data, 15);\r
-       //      break;\r
-       //      case APP_FACTORY_TEST_GRAY_CARD:\r
-       //              memcpy((void *)&ppg_data[3], ppg_src, 12);\r
-       //              factory_test_send_data(ppg_data, 15);\r
-       //      break;\r
-       //      default:\r
-       //      break;\r
-       // }\r
+//     switch(mode)\r
+//     {\r
+//             case APP_FACTORY_TEST_HR_START:\r
+//                     ppg_data[3] = *(ppg_src + 3);\r
+//                     ppg_data[4] = *(ppg_src + 2);\r
+//                     ppg_data[5] = *(ppg_src + 1);\r
+//                     ppg_data[6] = *(ppg_src + 0);\r
+                       \r
+//                     ppg_data[7] = *(ppg_src + 7);\r
+//                     ppg_data[8] = *(ppg_src + 6);\r
+//                     ppg_data[9] = *(ppg_src + 5);\r
+//                     ppg_data[10] = *(ppg_src + 4);\r
+\r
+//                     ppg_data[11] = *(ppg_src + 11);\r
+//                     ppg_data[12] = *(ppg_src + 10);\r
+//                     ppg_data[13] = *(ppg_src + 9);\r
+//                     ppg_data[14] = *(ppg_src + 8);\r
+                       \r
+//                     factory_test_send_data(ppg_data, 15);\r
+//             break;\r
+//             case APP_FACTORY_TEST_SPO2_START:\r
+//                     ppg_data[3] = *(ppg_src + 3);\r
+//                     ppg_data[4] = *(ppg_src + 2);\r
+//                     ppg_data[5] = *(ppg_src + 1);\r
+//                     ppg_data[6] = *(ppg_src + 0);\r
+                       \r
+//                     ppg_data[7] = *(ppg_src + 7);\r
+//                     ppg_data[8] = *(ppg_src + 6);\r
+//                     ppg_data[9] = *(ppg_src + 5);\r
+//                     ppg_data[10] = *(ppg_src + 4);\r
+\r
+//                     ppg_data[11] = *(ppg_src + 11);\r
+//                     ppg_data[12] = *(ppg_src + 10);\r
+//                     ppg_data[13] = *(ppg_src + 9);\r
+//                     ppg_data[14] = *(ppg_src + 8);          \r
+\r
+//                     factory_test_send_data(ppg_data, 15);\r
+//             break;\r
+//             case APP_FACTORY_TEST_LEAKING_START:\r
+// //                  memcpy((void *)&ppg_data[3], ppg_src, 12);\r
+\r
+//                     ppg_data[3] = *(ppg_src + 3);\r
+//                     ppg_data[4] = *(ppg_src + 2);\r
+//                     ppg_data[5] = *(ppg_src + 1);\r
+//                     ppg_data[6] = *(ppg_src + 0);\r
+                       \r
+//                     ppg_data[7] = *(ppg_src + 7);\r
+//                     ppg_data[8] = *(ppg_src + 6);\r
+//                     ppg_data[9] = *(ppg_src + 5);\r
+//                     ppg_data[10] = *(ppg_src + 4);\r
+\r
+//                     ppg_data[11] = *(ppg_src + 11);\r
+//                     ppg_data[12] = *(ppg_src + 10);\r
+//                     ppg_data[13] = *(ppg_src + 9);\r
+//                     ppg_data[14] = *(ppg_src + 8);\r
+\r
+\r
+//                     gui_send_message_by_data(MSG_FACTORY_TEST_UPDATE_HR, ppg_src, 12);\r
+//                     if(factory_test_aging) break;\r
+//                     factory_test_send_data(ppg_data, 15);\r
+//             break;\r
+//             case APP_FACTORY_TEST_GRAY_CARD:\r
+//             {\r
+// //                  memcpy((void *)&ppg_data[3], ppg_src, 12);\r
+//                     ppg_data[3] = *(ppg_src + 3);\r
+//                     ppg_data[4] = *(ppg_src + 2);\r
+//                     ppg_data[5] = *(ppg_src + 1);\r
+//                     ppg_data[6] = *(ppg_src + 0);\r
+                       \r
+//                     ppg_data[7] = *(ppg_src + 7);\r
+//                     ppg_data[8] = *(ppg_src + 6);\r
+//                     ppg_data[9] = *(ppg_src + 5);\r
+//                     ppg_data[10] = *(ppg_src + 4);\r
+\r
+//                     ppg_data[11] = *(ppg_src + 11);\r
+//                     ppg_data[12] = *(ppg_src + 10);\r
+//                     ppg_data[13] = *(ppg_src + 9);\r
+//                     ppg_data[14] = *(ppg_src + 8);\r
+                       \r
+//                     gui_send_message_by_data(MSG_FACTORY_TEST_UPDATE_HR, ppg_src, 12);\r
+//                     if(factory_test_aging) break;\r
+//                     factory_test_send_data(ppg_data, 15);\r
+//             }       \r
+//             break;\r
+//             default:\r
+//             break;\r
+//     }\r
 }\r
 \r
+\r
+typedef struct { \r
+    int32_t gr_data_final;\r
+    int32_t red_data_final;\r
+    int32_t ir_data_final;\r
+} ft_test_result_t;\r
+\r
+\r
 void heart_rate_meas_timeout_handler(void * p_context)\r
 {\r
+       TYHX_LOG(" heart_rate_meas_timeout_handler  mode: %d \n", work_mode_flag);\r
+       \r
     switch(work_mode_flag)\r
     {\r
     case HRS_MODE:\r
@@ -2481,6 +2558,7 @@ void heart_rate_meas_timeout_handler(void * p_context)
         break;\r
 \r
     case WEAR_MODE:\r
+//             PRINT("@@@@@@@@@ WEAR_MODE $$$$$$$$$\r\n");\r
 #ifdef CHECK_TOUCH_LIB\r
         hx3695_wear_ppg_Int_handle();\r
 #endif\r
@@ -2498,8 +2576,11 @@ void heart_rate_meas_timeout_handler(void * p_context)
 #endif\r
 \r
        case FT_LEAK_LIGHT_MODE:\r
+       {\r
                hx3695_factroy_test(LEAK_LIGHT_TEST);\r
                break;\r
+       }\r
+               break;\r
        \r
        case FT_GRAY_CARD_MODE:\r
        {\r
@@ -2563,17 +2644,7 @@ void hx3695_ppg_Int_handle(void)
 /*TYHX 心率模式下 读取PPG, 默认320ms*/\r
 hrs_sensor_data_t   hrs_s_dat;\r
 //hx3695_results_t    alg_results_pre;\r
-/***\r
- * typedef struct {\r
-       hrs_alg_msg_code_t  hrs_alg_status;\r
-    living_msg_code_t   living_status;\r
-       uint32_t            data_cnt;\r
-       uint8_t             hr_result;\r
-       uint16_t            cal_result;\r
-       uint8_t             hr_result_qual;\r
-    uint32_t            hr_result_std;\r
-} hrs_results_t;\r
-*/\r
+\r
 void hx3695_hrs_ppg_Int_handle(void)\r
 {\r
     uint8_t     ii=0;\r
@@ -2587,8 +2658,8 @@ void hx3695_hrs_ppg_Int_handle(void)
     int16_t    gsen_fifo_y_send[32]= {0};\r
     int16_t    gsen_fifo_z_send[32]= {0};\r
                \r
-               HRS_CAL_SET_T cal;\r
-    cal = get_hrs_agc_status();\r
+                       HRS_CAL_SET_T cal;\r
+        cal = get_hrs_agc_status();\r
 \r
 #ifdef HR_VECTOR\r
     for(ii=0; ii<8; ii++)\r
@@ -2603,75 +2674,134 @@ void hx3695_hrs_ppg_Int_handle(void)
     tyhx_hrs_alg_send_data(PPG_buf_vec,*count, gsen_fifo_x_send, gsen_fifo_y_send, gsen_fifo_z_send);\r
 \r
 #else\r
+    \r
     if(hx3695_hrs_read(&hrs_s_dat) == 0)\r
     {\r
-       AGC_LOG("hx3695_hrs_read(&hrs_s_dat) == 0\r\n");\r
         return;\r
     }\r
                \r
 #ifndef GSEN_40MS_TIMMER\r
-    readFifoByHrsModule();\r
+    //readFifoByHrsModule();\r
 #endif\r
 //     DEBUG_PRINTF("\r\nsend  jlink cnt=%d\r\n",*count);              \r
-               \r
-    for(ii=0; ii<*count; ii++)\r
-    {\r
-        gsen_fifo_x_send[ii] = gsen_fifo_x[32-*count+ii];\r
-        gsen_fifo_y_send[ii] = gsen_fifo_y[32-*count+ii];\r
-        gsen_fifo_z_send[ii] = gsen_fifo_z[32-*count+ii];\r
-\r
-//                     DEBUG_PRINTF("gr,ir,gsen:%d/%d %d %d %d %d %d %d\r\n" ,1+ii,*count,PPG_buf[ii],ir_buf[0],gsen_fifo_x[ii],gsen_fifo_y[ii],gsen_fifo_z[ii],ppg_s_data.green_cur);\r
-    }\r
+/* gsensor 屏蔽 */\r
+//     for(ii=0; ii<*count; ii++)\r
+//     {\r
+//             #if 0\r
+//         gsen_fifo_x_send[ii] = gsen_fifo_x[32-*count+ii];\r
+//         gsen_fifo_y_send[ii] = gsen_fifo_y[32-*count+ii];\r
+//         gsen_fifo_z_send[ii] = gsen_fifo_z[32-*count+ii];\r
+\r
+//             PRINT("hx3695 gr,ir,gsen:%d/%d %d %d %d %d %d %d\r\n" ,\r
+//                     1+ii,*count,PPG_buf[ii],ir_buf[0],gsen_fifo_x[ii],gsen_fifo_y[ii],gsen_fifo_z[ii],cal.Group1_Cur);\r
+//             #else\r
+//             accel_data_struct_t accel_raw_data = {0};\r
+//             queue_output(&accel_raw_data);\r
+//         gsen_fifo_x_send[ii] = accel_raw_data.x;\r
+//         gsen_fifo_y_send[ii] = accel_raw_data.y;\r
+//         gsen_fifo_z_send[ii] = accel_raw_data.z;\r
+// //          PRINT("hx3695 gr,ir,gsen:%d/%d %d %d %d %d %d %d\r\n" ,\r
+// //                  1+ii,*count,PPG_buf[ii], ir_buf[0], gsen_fifo_x_send[ii], gsen_fifo_y_send[ii], gsen_fifo_z_send[ii], cal.Group1_Cur);\r
+//             printf("FFF==> hr  PPG_buf : %d,  %d,  PPG_buf: %d,  ir_buf: %d \n", 1+ii, *count, PPG_buf[ii], ir_buf[0]);\r
+               \r
+//             #endif\r
+//     }\r
+//     ft_ppg_green = hrs_s_dat.green_data[0];\r
+       // ft_test_result_t result = {0};\r
+       // result.gr_data_final = hrs_s_dat.green_data[0];\r
+       // result.ir_data_final = hrs_s_dat.ir_data[0];\r
+       // hx3695_factory_test_process(NULL, APP_FACTORY_TEST_HR_START, &result);\r
 \r
     hrs_wear_status = hx3695_hrs_get_wear_status();\r
-       AGC_LOG("hrs_wear_status:    %d !!\r\n", hrs_wear_status);\r
+       PRINT("hrs_wear_status:    %d !!\r\n", hrs_wear_status);\r
+       \r
     if(hrs_wear_status == MSG_HRS_WEAR)\r
     {\r
-        tyhx_hrs_alg_send_data(PPG_buf, *count, gsen_fifo_x_send, gsen_fifo_y_send, gsen_fifo_z_send, cal.Group1_Ledidac);\r
+        tyhx_hrs_alg_send_data(PPG_buf, *count, gsen_fifo_x_send, gsen_fifo_y_send, \r
+                       gsen_fifo_z_send, cal.Group1_Ledidac);\r
     }\r
 #endif\r
 \r
-    alg_results = tyhx_hrs_alg_get_results();\r
-    hrsresult.lastesthrs = alg_results.hr_result;\r
-               hrsresult.hr_living =  alg_results.living_status;\r
-               hrsresult.hr_living_qu = alg_results.hr_result_qual;\r
-         hrsresult.hr_living_std = alg_results.hr_result_std;\r
+\r
+/*屏蔽*/\r
+//     for(ii=0; ii<*count; ii++)\r
+//        {\r
+//        #if 0\r
+//                gsen_fifo_x_send[ii] = gsen_fifo_x[32-*count+ii];\r
+//                gsen_fifo_y_send[ii] = gsen_fifo_y[32-*count+ii];\r
+//                gsen_fifo_z_send[ii] = gsen_fifo_z[32-*count+ii];\r
+       \r
+//                PRINT("hx3695 gr,ir,gsen:%d/%d %d %d %d %d %d %d\r\n" ,\r
+//                        1+ii,*count,PPG_buf[ii],ir_buf[0],gsen_fifo_x[ii],gsen_fifo_y[ii],gsen_fifo_z[ii],cal.Group1_Cur);\r
+//        #else\r
+// //             accel_data_struct_t accel_raw_data = {0};\r
+// //             queue_output(&accel_raw_data);\r
+// //             gsen_fifo_x_send[ii] = accel_raw_data.x;\r
+// //             gsen_fifo_y_send[ii] = accel_raw_data.y;\r
+// //             gsen_fifo_z_send[ii] = accel_raw_data.z;\r
+// //             PRINT("hx3695 gr,ir,gsen:%d/%d %d %d %d %d %d %d hr==%d\r\n" ,\r
+// //                     1+ii,*count,PPG_buf[ii], ir_buf[0], gsen_fifo_x_send[ii], gsen_fifo_y_send[ii], gsen_fifo_z_send[ii], cal.Group1_Cur,alg_results.hr_result);\r
+//        #endif\r
+//        }\r
+       \r
+       uint8_t curr_wear = 1;\r
+       //uint8_t last_wear = cwm_get_wear_status();\r
+\r
+  alg_results = tyhx_hrs_alg_get_results();\r
+  hrsresult.lastesthrs = alg_results.hr_result;\r
+       hrsresult.hr_living = alg_results.living_status;\r
+       hrsresult.hr_living_qu = alg_results.hr_result_qual;\r
+       hrsresult.hr_living_std = alg_results.hr_result_std;\r
                \r
-    AGC_LOG("hx3695 data_cnt: %d,  hr_living: %d, hr_living_qu: %d, hr_living_std: %d, hr_result:%d \r\n",\r
-    alg_results.data_cnt,  hrsresult.hr_living, hrsresult.hr_living_qu, hrsresult.hr_living_std, hrsresult.lastesthrs);\r
+    PRINT("hx3695 data_cnt: %d,  hr_living: %d, hr_living_qu: %d, hr_living_std: %d, hr_result:%d \r\n",\r
+               alg_results.data_cnt,  hrsresult.hr_living, hrsresult.hr_living_qu, hrsresult.hr_living_std, hrsresult.lastesthrs);\r
        if(hrs_wear_status == MSG_HRS_WEAR && hrsresult.hr_living == MSG_LIVING_TRUE)\r
     {\r
 //             app_hr_reset_stop_timer();\r
                if(alg_results.hr_result)\r
                {\r
                        \r
-                       // app_hr_cal_hr_values(alg_results.hr_result);\r
-                       // AGC_LOG("app_hr_cal_hr_values tick:%d hr:%d", xTaskGetTickCount(), alg_results.hr_result);\r
-                       AGC_LOG("app_hr_cal_hr_values  hr:%d",  alg_results.hr_result);\r
+                       //app_hr_cal_hr_values(alg_results.hr_result);\r
+                       //PRINT("app_hr_cal_hr_values tick:%d hr:%d", xTaskGetTickCount(), alg_results.hr_result);\r
+                       //cwm_hr_input(alg_results.hr_result);\r
                        //hr_sensor_notify_factory_test();\r
                }\r
                hr_no_living_dur = 0;\r
+               curr_wear = 1;\r
     }\r
        else if(hrs_wear_status == MSG_HRS_WEAR && hrsresult.hr_living != MSG_LIVING_TRUE)\r
        {\r
-               // if (++hr_no_living_dur > 12 * 1000 / tyhx_long_timer_tick)\r
+               if (++hr_no_living_dur > 12 * 1000 / tyhx_long_timer_tick)\r
                {\r
-                       // hr_stop_detect();\r
-                       // AGC_LOG("tyhx_hrs_module_start(WEAR_MODE)  wear:%d liv:%d", hrs_wear_status, hrsresult.hr_living);\r
-                       // hr_no_living_dur = 0;\r
+                       //hr_stop_detect();\r
+                       PRINT("MSG_HRS_WEAR:%d liv:%d", hrs_wear_status, hrsresult.hr_living);\r
+                       hr_no_living_dur = 0;\r
+                       curr_wear = 0;\r
                }\r
        }\r
        else if(hrs_wear_status == MSG_HRS_NO_WEAR || hrsresult.hr_living == MSG_LIVING_FAIL)\r
        {\r
-               // hr_stop_detect();\r
-               AGC_LOG("tyhx_hrs_module_start(WEAR_MODE)  wear:%d liv:%d", hrs_wear_status, hrsresult.hr_living);\r
+               //hr_stop_detect();\r
+               PRINT("MSG_HRS_NO_WEAR:%d liv:%d", hrs_wear_status, hrsresult.hr_living);\r
                hr_no_living_dur = 0;\r
+               curr_wear = 0;\r
+       }\r
+       \r
+       //cwm_off_body_detect(curr_wear);\r
+\r
+       #if defined(GSENSOR_LOG_NOTIFY) && GSENSOR_LOG_NOTIFY == 1 || defined(HRS_BLE_APP)\r
+       \r
+       if (last_wear!=curr_wear)\r
+       {\r
+               gui_send_message_by_data(MSG_HR_WEAR_STATUS_UPDATE, &curr_wear, 1);\r
        }\r
+       #endif\r
+\r
 #ifdef BP_CUSTDOWN_ALG_LIB\r
     bp_results_t    bp_alg_results;\r
     bp_alg_results = tyhx_alg_get_bp_results();\r
 #endif\r
- \r
+\r
 ////////////////////////////////////////BLE+DISPLAY/////////////////////////////////\r
 \r
 \r
@@ -2690,7 +2820,7 @@ void hx3695_hrs_ppg_Int_handle(void)
             rawdata.gsensor_z = gsen_fifo_z_send[ii];\r
             rawdata.red_cur = cal.Group1_Cur;\r
             rawdata.ir_cur = cal.Group1_Ledidac;\r
-            \r
+//            PRINT("@@@@@@@@@ HRS_BLE_APP gsen:%d %d %d\r\n", rawdata.gsensor_x, rawdata.gsensor_y, rawdata.gsensor_z);\r
             ble_rawdata_vector_push(rawdata);\r
         }\r
     }\r
@@ -2728,7 +2858,7 @@ void hx3695_living_Int_handle(void)
     }\r
                \r
 #ifndef GSEN_40MS_TIMMER\r
-    readFifoByHrsModule();\r
+//    readFifoByHrsModule();\r
 #endif\r
        DEBUG_PRINTF("\r\nsend  jlink cnt=%d\r\n",*count);      \r
                \r
@@ -2904,28 +3034,6 @@ int32_t hx3695_ir_data_cali(int32_t ir_new_raw_data)
 //#ifdef SPO2_ALG_LIB\r
 spo2_sensor_data_t spo2_s_dat;\r
 \r
-/****\r
- * \r
-typedef struct {\r
-    spo2_alg_msg_code_t                spo2_alg_status;\r
-    spo2_living_code_t      spo2_living_status;\r
-    uint32_t           data_cnt;\r
-    uint8_t                    spo2_result;\r
-    uint8_t                    hr_result;\r
-    uint8_t                    block_cnt;\r
-    uint8_t                    ir_quality;\r
-    uint16_t           reliable_score_result;\r
-\r
-    uint8_t                    screen_up;\r
-    uint8_t                    motion;\r
-    uint8_t                    poor_signal;\r
-    \r
-    uint8_t         signal_snr;\r
-    uint32_t        signal_std;\r
-    \r
-} spo2_results_t;\r
-\r
-*/\r
 /*TYHX 血氧模式下 读取PPG, 默认320ms*/\r
 void hx3695_spo2_ppg_Int_handle(void)\r
 {\r
@@ -2963,28 +3071,85 @@ void hx3695_spo2_ppg_Int_handle(void)
                \r
                \r
 #ifndef GSEN_40MS_TIMMER\r
-    readFifoByHrsModule();\r
+//    readFifoByHrsModule();\r
 #endif\r
         DEBUG_PRINTF("\r\n send1  jlink cnt=%d\r\n",*count);   \r
+  \r
+  /*屏蔽*/\r
+//     for(ii=0; ii<*count; ii++)\r
+//     {\r
+//         gsen_fifo_x_send[ii] = gsen_fifo_x[32-*count+ii];\r
+//         gsen_fifo_y_send[ii] = gsen_fifo_y[32-*count+ii];\r
+//         gsen_fifo_z_send[ii] = gsen_fifo_z[32-*count+ii];\r
+// //          PRINT("hx3695  data: %d/%d %d %d %d %d %d %d\r\n" ,\r
+// //                  1+ii,*count,red_buf[ii],ir_buf[ii],green_buf[ii],gsen_fifo_x[ii],gsen_fifo_y[ii],gsen_fifo_z[ii]);\r
+// //          printf("FFF==>spo2  red_buf : %d,  %d,  %d,     %d \n", 1+ii, *count, red_buf[ii], ir_buf[0]);\r
                \r
-    for(ii=0; ii<*count; ii++)\r
-    {\r
-        gsen_fifo_x_send[ii] = gsen_fifo_x[32-*count+ii];\r
-        gsen_fifo_y_send[ii] = gsen_fifo_y[32-*count+ii];\r
-        gsen_fifo_z_send[ii] = gsen_fifo_z[32-*count+ii];\r
-        //DEBUG_PRINTF("%d/%d %d %d %d %d %d %d\r\n" ,1+ii,*count,red_buf[ii],ir_buf[ii],green_buf[ii],gsen_fifo_x[ii],gsen_fifo_y[ii],gsen_fifo_z[ii]);\r
-               // hx3695_factory_test_process(NULL, APP_FACTORY_TEST_SPO2_START, (uint8_t *)&red_buf[ii]);\r
 \r
-    }\r
-    AGC_LOG("hx3695 current value: %d %d %d %d %d %d\r\n", cal.R_LED, cal.IR_LED1, cal.G_LED, cal.R_LEDDAC, cal.IR_LEDDAC1, cal.G_LEDDAC);\r
+//     }\r
+\r
+//     ft_ppg_iir = spo2_s_dat.red_data[0];\r
+//     hx3695_factory_test_process(NULL, APP_FACTORY_TEST_SPO2_START, &ft_ppg_iir);\r
+\r
+       ft_test_result_t result = {0};\r
+       result.gr_data_final = spo2_s_dat.green_data[0];\r
+       result.red_data_final = spo2_s_dat.red_data[0];\r
+       result.ir_data_final = spo2_s_dat.ir_data1[0];\r
+       //hx3695_factory_test_process(NULL, APP_FACTORY_TEST_SPO2_START, &result);\r
+\r
+       \r
+    PRINT("hx3695 current value: %d %d %d %d %d %d\r\n", cal.R_LED, cal.IR_LED1, cal.G_LED, cal.R_LEDDAC, cal.IR_LEDDAC1, cal.G_LEDDAC);\r
     spo2_wear_status = hx3695_spo2_get_wear_status();\r
+    PRINT("spo2_wear_status : %d\r\n",spo2_wear_status);\r
     if(spo2_wear_status == MSG_SPO2_WEAR)\r
     {\r
-        tyhx_spo2_alg_send_data(red_buf, ir_buf, green_buf, cal.R_LEDDAC, cal.IR_LEDDAC1, cal.G_LEDDAC, gsen_fifo_x_send, gsen_fifo_y_send, gsen_fifo_z_send, *count);\r
+        tyhx_spo2_alg_send_data(red_buf, ir_buf, green_buf, cal.R_LEDDAC, cal.IR_LEDDAC1, cal.G_LEDDAC, \r
+                         gsen_fifo_x_send, gsen_fifo_y_send, gsen_fifo_z_send, *count);\r
     }\r
 #endif\r
 \r
     spo2_alg_results = tyhx_spo2_alg_get_results();\r
+//------------------------adjust-------------------\r
+//    DEBUG_PRINTF("block_cnt: %d, data_cnt:%d, hr_result:%d,ir_quality:%d,motion:%d,poor_signal:%d,reliable_score_result:%d,screen_up:%d,spo2_result:%d\r\n",spo2_alg_results.block_cnt,spo2_alg_results.data_cnt,spo2_alg_results.hr_result,spo2_alg_results.ir_quality,spo2_alg_results.motion,spo2_alg_results.poor_signal,spo2_alg_results.reliable_score_result,spo2_alg_results.screen_up,spo2_alg_results.spo2_result);\r
+\r
+    hrsresult.lastestspo2 = spo2_alg_results.spo2_result;\r
+       hrsresult.lastesthrs = spo2_alg_results.hr_result;\r
+       uint8_t curr_wear = 1;\r
+       //uint8_t last_wear = cwm_get_wear_status();\r
+       if(spo2_wear_status == MSG_SPO2_WEAR && spo2_alg_results.spo2_living_status == MSG_SPO2_LIVING_TRUE)\r
+    {\r
+       //store_latest_spo2(hrsresult.lastestspo2);\r
+               //app_hr_cal_hr_values(hrsresult.lastesthrs);\r
+               //cwm_hr_input(hrsresult.lastesthrs);\r
+               spo2_no_living_dur = 0;\r
+               curr_wear = 1;\r
+    }\r
+       else if(spo2_wear_status == MSG_SPO2_WEAR && spo2_alg_results.spo2_living_status != MSG_SPO2_LIVING_TRUE)\r
+       {\r
+               if (++spo2_no_living_dur > 12 * 1000 / tyhx_long_timer_tick)\r
+               {\r
+                       //gui_send_msg_by_evt(MSG_SPO2_MEASURE_CANCEL);\r
+                       PRINT("MSG_SPO2_WEAR:%d liv:%d", spo2_wear_status, spo2_alg_results.spo2_living_status);\r
+                       spo2_no_living_dur = 0;\r
+                       curr_wear = 0;\r
+               }\r
+       }\r
+       else if(spo2_wear_status == MSG_SPO2_NO_WEAR || spo2_alg_results.spo2_living_status == MSG_SPO2_LIVING_FAIL)\r
+       {\r
+               //gui_send_msg_by_evt(MSG_SPO2_MEASURE_CANCEL);\r
+               PRINT("MSG_SPO2_NO_WEAR:%d liv:%d", spo2_wear_status, spo2_alg_results.spo2_living_status);\r
+               spo2_no_living_dur = 0;\r
+               curr_wear = 0;\r
+       }\r
+       //cwm_off_body_detect(curr_wear);\r
+       #if defined(GSENSOR_LOG_NOTIFY) && GSENSOR_LOG_NOTIFY == 1 || defined(HRS_BLE_APP)\r
+       if (last_wear!=curr_wear)\r
+       {\r
+               gui_send_message_by_data(MSG_HR_WEAR_STATUS_UPDATE, &curr_wear, 1);\r
+       }\r
+       #endif\r
+/////////////////////////////////////////BLE+DISPLAY//////////////////////////////////////////\r
+  spo2_alg_results = tyhx_spo2_alg_get_results();\r
 //------------------------adjust-------------------\r
     DEBUG_PRINTF("block_cnt: %d, data_cnt:%d, hr_result:%d,ir_quality:%d,motion:%d,poor_signal:%d,reliable_score_result:%d,screen_up:%d,spo2_result:%d\r\n",spo2_alg_results.block_cnt,spo2_alg_results.data_cnt,spo2_alg_results.hr_result,spo2_alg_results.ir_quality,spo2_alg_results.motion,spo2_alg_results.poor_signal,spo2_alg_results.reliable_score_result,spo2_alg_results.screen_up,spo2_alg_results.spo2_result);\r
 \r
@@ -3005,7 +3170,6 @@ void hx3695_spo2_ppg_Int_handle(void)
     }\r
 \r
 \r
-/////////////////////////////////////////BLE+DISPLAY//////////////////////////////////////////\r
 \r
 \r
 #ifdef HRS_BLE_APP\r
@@ -3024,7 +3188,7 @@ void hx3695_spo2_ppg_Int_handle(void)
             rawdata.ir_raw_data = ir_buf[ii];\r
 #endif\r
             rawdata.vector_flag = SPO2_VECTOR_FLAG;\r
-            rawdata.data_cnt = cal.G_LEDDAC;\r
+            rawdata.data_cnt = cal.G_LED;\r
             rawdata.hr_result = spo2_alg_results.spo2_result;\r
             rawdata.gsensor_x = (int16_t)(green_buf[ii]>>5);\r
             rawdata.gsensor_y = cal.R_LEDDAC;\r
@@ -3070,18 +3234,18 @@ void hx3695_hrspo2_ppg_Int_handle(void)
     }\r
                \r
 #ifndef GSEN_40MS_TIMMER\r
-    readFifoByHrsModule();\r
+//readFifoByHrsModule();\r
 #endif\r
        DEBUG_PRINTF("\r\nsend  jlink cnt=%d\r\n",*count);              \r
                \r
                \r
-    for(ii=0; ii<*count; ii++)\r
-    {\r
-        gsen_fifo_x_send[ii] = gsen_fifo_x[32-*count+ii];\r
-        gsen_fifo_y_send[ii] = gsen_fifo_y[32-*count+ii];\r
-        gsen_fifo_z_send[ii] = gsen_fifo_z[32-*count+ii];\r
+    // for(ii=0; ii<*count; ii++)\r
+    // {\r
+    //     gsen_fifo_x_send[ii] = gsen_fifo_x[32-*count+ii];\r
+    //     gsen_fifo_y_send[ii] = gsen_fifo_y[32-*count+ii];\r
+    //     gsen_fifo_z_send[ii] = gsen_fifo_z[32-*count+ii];\r
 \r
-    }\r
+    // }\r
     spo2_wear_status = hx3695_spo2_get_wear_status();\r
     if(spo2_wear_status == MSG_SPO2_WEAR)\r
     {\r
@@ -3158,7 +3322,7 @@ void hx3695_hrv_ppg_Int_handle(void)
     }\r
                \r
 #ifndef GSEN_40MS_TIMMER\r
-    readFifoByHrsModule();\r
+//    readFifoByHrsModule();\r
 #endif\r
        DEBUG_PRINTF("\r\nsend  jlink cnt=%d\r\n",*count);                              \r
        \r
@@ -3216,27 +3380,23 @@ void hx3695_hrv_ppg_Int_handle(void)
 #ifdef CHECK_TOUCH_LIB\r
 void hx3695_wear_ppg_Int_handle(void)\r
 {\r
+//     PRINT("hx3695_wear_ppg_Int_handle  wearstatus = %d\r\n", hrsresult.wearstatus);\r
+       \r
     uint8_t *count = &(ppg_s_data.count);\r
     int32_t *ir_buf = &(ppg_s_data.ir_data[0]);\r
     hx3695_wear_msg_code_t hx3695_wear_status;\r
        \r
     hx3695_check_touch_read(&ppg_s_data);\r
+       \r
     hx3695_wear_status = hx3695_check_touch_send_data(ir_buf,*count);\r
     hrsresult.wearstatus = hx3695_wear_status;\r
+\r
        extern uint8_t notouch_cnt;\r
        extern uint8_t touch_cnt;\r
+       \r
+//     PRINT("===> touch_cnt: %d, notouch_cnt: %d, wear status: %d,   \r\n", touch_cnt, notouch_cnt, hx3695_wear_status);\r
 \r
-       if (hrsresult.wearstatus)\r
-       {\r
-               cwm_gsensor_enable();\r
-       }\r
-       else\r
-       {\r
-               cwm_gsensor_disable();\r
-       }\r
-//     AGC_LOG("===> touch_cnt: %d, notouch_cnt: %d, wear status: %d,   \r\n", touch_cnt, notouch_cnt, hx3695_wear_status);\r
-\r
-//     AGC_LOG("hx3695_wear_ppg_Int_handle  wearstatus = %d\r\n", hrsresult.wearstatus);\r
+//     PRINT("hx3695_wear_ppg_Int_handle  wearstatus = %d\r\n", hrsresult.wearstatus);\r
        \r
 //    for(int i=0;i<*count;i++)\r
 //    {\r
index 7e91109..b35d7a2 100644 (file)
@@ -24,17 +24,17 @@ NEW_GSEN_SCHME     DEMO调试使用, 客户关闭
 */\r
 #define HRS_ALG_LIB   \r
 #define SPO2_ALG_LIB\r
-// #define HRV_ALG_LIB\r
-// #define CHECK_TOUCH_LIB\r
+//#define HRV_ALG_LIB\r
+#define CHECK_TOUCH_LIB\r
 //#define CHECK_LIVING_LIB\r
-#define BP_CUSTDOWN_ALG_LIB\r
+//#define BP_CUSTDOWN_ALG_LIB\r
 \r
 //**************** read_data_mode ******************//\r
 #define TIMMER_MODE           //timmer read fifo\r
 //#define INT_MODE                             //fifo_all_most_full\r
 \r
 //****************** gsen_cgf *********************//\r
-// #define GSEN_40MS_TIMMER\r
+//#define GSEN_40MS_TIMMER\r
 //#define NEW_GSEN_SCHME\r
 \r
 //****************** other_cgf ********************//\r
@@ -53,27 +53,23 @@ NEW_GSEN_SCHME     DEMO调试使用, 客户关闭
 \r
 //****************** print_swi ********************//\r
 #define HRS_DEBUG\r
-#define AGC_DEBUG\r
+//#define AGC_DEBUG\r
 \r
 //**************************************************//\r
-#include "debug_print.h"\r
+#define PREFIX_PRINTF(_message,...) //printf(_message,##__VA_ARGS__)\r
+\r
+#define SEGGER_RTT_printf(_message, ...) //printf(_message,##__VA_ARGS__)\r
 \r
 #ifdef AGC_DEBUG\r
-#define AGC_LOG(fmt, ...)                    \\r
-    do {                                      \\r
-        PRINT(fmt" ", ##__VA_ARGS__);     \\r
-    } while (0)\r
+#define  AGC_LOG(...)     SEGGER_RTT_printf(0,__VA_ARGS__)\r
 #else\r
-#define         AGC_LOG(...)\r
+#define         AGC_LOG(...)   PREFIX_PRINTF("hx3695 agc=>"__VA_ARGS__)\r
 #endif\r
 \r
 #ifdef HRS_DEBUG\r
-#define DEBUG_PRINTF(fmt, ...)                    \\r
-    do {                                      \\r
-        PRINT(fmt" ", ##__VA_ARGS__);     \\r
-    } while (0)\r
+#define  DEBUG_PRINTF(...)     SEGGER_RTT_printf(0,__VA_ARGS__)\r
 #else\r
-#define         DEBUG_PRINTF(...)\r
+#define         DEBUG_PRINTF(...)  PREFIX_PRINTF("hx3695 debug=>"__VA_ARGS__)\r
 #endif\r
 \r
 \r
@@ -83,18 +79,18 @@ NEW_GSEN_SCHME     DEMO调试使用, 客户关闭
        #define LIS3DH_IIC_CLK   18\r
        #define LIS3DH_IIC_SDA   16\r
        #define EXT_INT_PIN      1\r
-       #define GREEN_LED_SLE    0x10\r
-       #define RED_LED_SLE      0x20\r
-       #define IR_LED_SLE       0x40\r
+       #define GREEN_LED_SLE    0x50  //demo 0x10  evb 2\r
+       #define RED_LED_SLE      0x80  //demo 0x20  evb 4 \r
+       #define IR_LED_SLE       0x20  //demo 0x40  evb 1\r
        #define RED_AGC_OFFSET   64   //32\r
        #define IR_AGC_OFFSET    64   //32\r
-       #define GREEN_AGC_OFFSET 4   //10\r
-       #define HR_GREEN_AGC_OFFSET 20\r
-       #define HR_GREEN1_AGC_OFFSET 24\r
-       #define HR_GREEN2_AGC_OFFSET 24\r
-       #define HR_GREEN3_AGC_OFFSET 24\r
-       \r
-       \r
+       #define GREEN_AGC_OFFSET 20   //10\r
+       #define HR_GREEN_AGC_OFFSET 48\r
+       #define HR_GREEN1_AGC_OFFSET 48\r
+       #define HR_GREEN2_AGC_OFFSET 48\r
+       #define HR_GREEN3_AGC_OFFSET 48\r
+       #define HRS_PD   0x0F   //  PD1:1    PD2:2    PD3:4   PD4:8\r
+  #define SPO2_PD   0x02   //  PD1:1    PD2:2    PD3:4   PD4:8\r
        \r
        #define BIG_SCREEN\r
        \r
@@ -173,20 +169,21 @@ typedef enum {
 } SENSOR_TYPE_T;\r
 \r
 typedef enum {    \r
-       HRS_MODE, \r
-       SPO2_MODE,\r
-       HRSPO2_MODE,\r
-       WEAR_MODE,\r
-       HRV_MODE,\r
-       LIVING_MODE,\r
-       LAB_TEST_MODE,\r
-       FT_LEAK_LIGHT_MODE,\r
-       FT_GRAY_CARD_MODE,\r
-       FT_INT_TEST_MODE,\r
+       HRS_MODE,  // 0\r
+       SPO2_MODE,  // 1\r
+       HRSPO2_MODE,  // 2\r
+       WEAR_MODE,  //3\r
+       HRV_MODE,  // 4\r
+       LIVING_MODE,  // 5\r
+       LAB_TEST_MODE,  // 6\r
+       FT_LEAK_LIGHT_MODE,  // 7\r
+       FT_GRAY_CARD_MODE,  // 8\r
+       FT_INT_TEST_MODE,  // 9\r
        FT_SINGLE_CHECK_MODE,\r
-  FT_LED_OFF_MODE,\r
-  FT_WEAR_MODE,\r
-  NULL_MODE,\r
+    FT_LED_OFF_MODE,\r
+    FT_WEAR_MODE,\r
+    NEW_PPG_TEST_MODE,\r
+    NULL_MODE,\r
 } WORK_MODE_T;\r
 \r
 \r
@@ -247,7 +244,7 @@ void hx3695_delay_us(uint32_t us);
 void hx3695_delay_ms(uint32_t ms);\r
 bool hx3695_write_reg(uint8_t addr, uint8_t data); \r
 uint8_t hx3695_read_reg(uint8_t addr); \r
-bool hx3695_brust_read_reg(uint8_t addr , uint8_t *buf, uint8_t length);\r
+bool hx3695_brust_read_reg(uint8_t addr , uint8_t *buf, uint16_t length);\r
 bool hx3695_chip_check(void);\r
 uint8_t hx3695_read_fifo_size(void);\r
 uint16_t hx3695_read_fifo_data(int32_t *s_buf, uint8_t size, uint8_t phase_num);\r
@@ -271,6 +268,7 @@ void hx3695_hrv_ppg_Int_handle(void);
 void hx3695_living_Int_handle(void);\r
 void hx3695_hrspo2_ppg_Int_handle(void);\r
 \r
+\r
 void hx3695_ppg_Int_handle(void);\r
 uint32_t hx3695_timers_start(void);\r
 uint32_t hx3695_timers_stop(void);\r
@@ -280,9 +278,9 @@ uint32_t hx3695_gpioint_enable(void);
 uint32_t hx3695_gpioint_disable(void);\r
 uint32_t gsen_read_timers_start(void);\r
 uint32_t gsen_read_timers_stop(void);\r
-\r
+bool Efuse_judge(void);\r
 void hx3695_vin_check(uint16_t led_vin);\r
-\r
+void nrf_gpioint_handle(void);\r
 #ifdef LAB_TEST\r
 void hx3695_lab_test_init(void);\r
 void hx3695_test_alg_cfg(void);\r
@@ -295,7 +293,9 @@ bool hx3695_living_send_data(int32_t *new_raw_data, uint8_t dat_len, int16_t *gs
 hx3695_living_results_t hx3695_living_get_results(void);\r
 void agc_timeout_handler(void * p_context);\r
 void heart_rate_meas_timeout_handler(void * p_context);\r
+void Efuse_Mode_Check(void);\r
 \r
 #include "hx3695_hal.h"\r
 \r
+\r
 #endif\r
index 5fa347d..98b7a7a 100644 (file)
@@ -10,6 +10,8 @@
 #include "hx3695.h"\r
 #include "hx3695_hrs_agc.h"\r
 #include "tyhx_hrs_alg.h"\r
+//#include "lv_dev.h"\r
+\r
 \r
 #ifdef HRS_ALG_LIB\r
 extern const uint8_t  hx3695_hrs_agc_idac;\r
@@ -113,8 +115,7 @@ hrs_wear_msg_code_t hx3695_hrs_wear_mode_check(WORK_MODE_T mode, int32_t infrare
             hrs_wear_status = MSG_HRS_NO_WEAR;                \r
         }      \r
     }   \r
-//   AGC_LOG("hrs ir_data: %d, hrs_wear_status_pre=%d, hrs_wear_status=%d\r\n",\r
-                          // infrared_data,hrs_wear_status_pre,hrs_wear_status);\r
+\r
     if(mode == WEAR_MODE)\r
     {\r
         return hrs_wear_status;\r
@@ -240,8 +241,8 @@ void PPG_hrs_Calibration_Routine(HRS_CAL_SET_T *calR, int32_t g1_led,int32_t g2_
 //              }\r
 //                                             }       \r
                                                                                        \r
-                                                       calR->Group1_RF = 5;\r
-                                                       calR->Group2_RF = 5;\r
+                                                       calR->Group1_RF = 3;\r
+                                                       calR->Group2_RF = 3;\r
 //              calR->Group3_RF = 6;\r
                                                                                                                                                                        \r
               calR->flag = CAL_FLG_LED_DR|CAL_FLG_LED_DAC|CAL_FLG_AMB_DAC|CAL_FLG_RF;           \r
@@ -438,7 +439,7 @@ HRS_CAL_SET_T   PPG_hrs_agc(void)
 void hx3695_hrs_cal_init(void)\r
 {\r
     uint16_t sample_rate = 200;     //200                  /*config the data rate of chip alps2_fm ,uint is Hz*/\r
-    uint32_t prf_clk_num = 32000/sample_rate;        /*period in clk num, num = Fclk/fs */\r
+    uint32_t prf_clk_num = 32000/sample_rate*24/25;        /*period in clk num, num = Fclk/fs */\r
                uint8_t data_avg_num = 0;\r
     hx3695_write_reg(0X2a, (uint8_t)prf_clk_num);    // prf bit<7:0>\r
     hx3695_write_reg(0X2b, (uint8_t)(prf_clk_num>>8)); // prf bit<15:8>\r
@@ -465,7 +466,7 @@ void hx3695_hrs_cal_init(void)
 void hx3695_hrs_cal_off(void)\r
 {\r
     uint16_t sample_rate = 25;                       /*config the data rate of chip alps2_fm ,uint is Hz*/\r
-    uint32_t prf_clk_num = 32000/sample_rate;        /*period in clk num, num = Fclk/fs */\r
+    uint32_t prf_clk_num = 32000/sample_rate*24/25;       /*period in clk num, num = Fclk/fs */\r
                uint8_t  data_avg_num = 0;\r
     hx3695_write_reg(0X2a, (uint8_t)prf_clk_num);    // prf bit<7:0>\r
     hx3695_write_reg(0X2b, (uint8_t)(prf_clk_num>>8)); // prf bit<15:8>\r
@@ -489,7 +490,7 @@ void hx3695_hrs_cal_off(void)
     hx3695_write_reg(0x5c,0x08); //Chip state machine work normal\r
                hx3695_delay_ms(5);\r
                read_fifo_first_flg = 1;\r
-//             AGC_LOG("caloff_fifo:  %d\r\n", (fifo_data_temp[0]|(fifo_data_temp[1]<<8)|(fifo_data_temp[2]<<16)));\r
+//             SEGGER_RTT_printf(0,"caloff_fifo:  %d\r\n", (fifo_data_temp[0]|(fifo_data_temp[1]<<8)|(fifo_data_temp[2]<<16)));\r
 }\r
 \r
 void read_hrs_data_packet(int32_t *s_buf)\r
@@ -514,7 +515,7 @@ void read_hrs_data_packet(int32_t *s_buf)
                s_buf[6] = ((databuf4[0])|(databuf4[1]<<8)|(databuf4[2]<<16));  \r
     s_buf[7] = ((databuf4[3])|(databuf4[4]<<8)|(databuf4[5]<<16));\r
                \r
-//             AGC_LOG("phase7_data:  %d, phase8_data:  %d\r\n", s_buf[6],s_buf[7]);\r
+//             SEGGER_RTT_printf(0,"phase7_data:  %d, phase8_data:  %d\r\n", s_buf[6],s_buf[7]);\r
                \r
 }\r
 \r
@@ -551,15 +552,15 @@ void hx3695_hrs_read_data_packet(int32_t *buf)
                \r
 //             TYHX_LOG("tyhx_here ! \r\n");\r
                \r
-//             AGC_LOG("P1~P4: %x,   %x    %x,   %x  \r\n", P1,P2,P3,P4);              \r
+//             SEGGER_RTT_printf(0,"P1~P4: %x,   %x    %x,   %x  \r\n", P1,P2,P3,P4);          \r
                \r
 }\r
 \r
 void hx3695_hrs_low_power(void)\r
 {\r
-    uint16_t sample_rate = 25;                       /*config the data rate of chip alps2_fm ,uint is Hz*/\r
+    uint16_t sample_rate = 5;                       /*config the data rate of chip alps2_fm ,uint is Hz*/\r
     uint8_t data_avg_num = 0;         /* 0 = 1 ; 1 = 2; 2 =4 ; 3 =8 ; 4 =16 ;*/\r
-    uint32_t prf_clk_num = 32000/sample_rate;        /*period in clk num, num = Fclk/fs */\r
+    uint32_t prf_clk_num = 32000/sample_rate*24/25;       /*period in clk num, num = Fclk/fs */\r
     \r
     uint8_t phase2_offset_idac = 0; /* 0~127 = 0 ~ 32ua , step = 0.25ua */\r
          uint8_t phase5_offset_idac = 0; /* 0~127 = 0 ~ 32ua , step = 0.25ua */\r
@@ -592,7 +593,7 @@ void hx3695_hrs_low_power(void)
                uint8_t phase7_mux_sel = 6; \r
                uint8_t phase8_mux_sel = 7;       \r
     \r
-    uint8_t phase8_ldr_cur = 25;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
+    uint8_t phase8_ldr_cur = 32;     /* 0~255 = 0 ~ 200ma, step = 0.8ma */\r
     \r
     uint8_t led_on_time = 1;      /* 0 = 32clk=8us ; 1 = 64clk=16us; 2=128clk=32us ; 3 = 256clk=64us ;\r
                                      4 = 512clk=128us ; 5 = 1024clk=256us; 6= 2048clk=512us; 7 = 4096clk=1024us */\r
@@ -914,8 +915,8 @@ uint8_t hx3695_hrs_read(hrs_sensor_data_t * s_dat)
     }  \r
 //    TYHX_LOG("ppg_state: %d ,hrs_cal_state:  %d\r\n",s_ppg_state,hrs_cal_state);             \r
                    data_count = hx3695_read_fifo_data(s_buf,hrs_phase_num,1); \r
-                   //AGC_LOG("ppg data size: %d %d\r\n", data_count,hrs_phase_num);\r
-//                             AGC_LOG("af_hx3695_read_fifo_data:::%d %d %d\r\n", hx3695_read_reg(0X2a),hx3695_read_reg(0X2b),hx3695_read_reg(0X2c));\r
+                   //SEGGER_RTT_printf(0,"ppg data size: %d %d\r\n", data_count,hrs_phase_num);\r
+//                             SEGGER_RTT_printf(0,"af_hx3695_read_fifo_data:::%d %d %d\r\n", hx3695_read_reg(0X2a),hx3695_read_reg(0X2b),hx3695_read_reg(0X2c));\r
         s_dat->count =  data_count; \r
 \r
                    read_hrs_data_packet(ps_data);\r
@@ -928,15 +929,14 @@ uint8_t hx3695_hrs_read(hrs_sensor_data_t * s_dat)
 //            Ir_src_data  =    s_buf[i*4+3];          \r
 \r
             PPG_buf[i] = PPG_src_data * 2;\r
-            ir_buf[i] = PPG_src_data2 * 2;        //Ir_src_data;\r
-//                                     AGC_LOG("PPG_data:  %d , PPG_src_data2: %d\r\n", PPG_src_data,PPG_src_data2);\r
+            ir_buf[i] = Ir_src_data;        //Ir_src_data;\r
+//                                     SEGGER_RTT_printf(0,"PPG_data:  %d , PPG_src_data2: %d\r\n", PPG_src_data,PPG_src_data2);\r
+                       //my_printf("hx3695 Ir_src_data %d \r\n", Ir_src_data);\r
             hx3695_hrs_wear_mode_check(HRS_MODE,Ir_src_data); \r
-//           AGC_LOG("hx3690_hrs_wear_mode_check:::%d %d %d\r\n", hx3695_read_reg(0X2a),hx3695_read_reg(0X2b),hx3695_read_reg(0X2c));\r
-                                       // AGC_LOG("fifo:%d/%d %d %d, fifo_data: %d %d %d %d\r\n" ,1+i,data_count,   \r
-            // PPG_buf[i],ir_buf[i],s_buf[i*3],s_buf[i*3+1],s_buf[i*3+2],calReg_Hrs.LED);         \r
+\r
         }\r
                                ps_green_data = ps_data[1];   //  -  ((ps_data[2]+ps_data[0])>>1);\r
-//                             AGC_LOG("ps_green_data: %d  PS8: %d, PS7:  %d\r\n", ps_green_data,ps_data[7],ps_data[6]);\r
+//                             SEGGER_RTT_printf(0,"ps_green_data: %d  PS8: %d, PS7:  %d\r\n", ps_green_data,ps_data[7],ps_data[6]);\r
                                if (ps_green_data<300000 || ps_green_data>800000)            \r
                                {\r
                                                recal = true;\r
index 46bff12..8f63744 100644 (file)
@@ -22,7 +22,7 @@ typedef struct {
        uint8_t count;\r
        int32_t green_data[64];\r
        int32_t ir_data[64];\r
-       int32_t s_buf[64]; \r
+       int32_t s_buf[192]; \r
        uint32_t als;\r
        uint32_t agc_green;\r
 } hrs_sensor_data_t;\r
@@ -50,7 +50,7 @@ typedef struct {
 \r
 typedef enum {    \r
     hrsCalStart, \r
-       hrsCalStart1,\r
+               hrsCalStart1,\r
     hrsCalLed,\r
     hrsCalLed2,\r
     hrsCalLed3,\r
@@ -65,18 +65,18 @@ typedef struct {
        uint8_t int_cnt;\r
        uint8_t cur255_cnt;\r
        uint8_t Group1_Ledidac;   //led_idac\r
-       uint8_t Group2_Ledidac; \r
-       uint8_t Group3_Ledidac;         \r
+  uint8_t Group2_Ledidac; \r
+  uint8_t Group3_Ledidac;      \r
        uint16_t Group1_Cur;   //LED; \r
        uint16_t Group2_Cur;   //LED;\r
        uint16_t Group3_Cur;   //LED;\r
 //     uint8_t LEDDAC; \r
        uint8_t Group1_AMBDAC; \r
-       uint8_t Group2_AMBDAC;\r
-       uint8_t Group3_AMBDAC;  \r
+  uint8_t Group2_AMBDAC;\r
+  uint8_t Group3_AMBDAC;       \r
        uint8_t Group1_RF;\r
-       uint8_t Group2_RF;\r
-       uint8_t Group3_RF;      \r
+  uint8_t Group2_RF;\r
+  uint8_t Group3_RF;   \r
        uint32_t Group1_step;\r
        uint32_t Group2_step;\r
        uint32_t Group3_step;\r
index 37e867d..cdb44e6 100644 (file)
 #include "soc_osal.h"
 #include "tcxo.h"
 
+// bool b_hrs_work = false; //心率模块是否已经开始工作
+// WORK_MODE_T currmode = NULL_MODE;//心率模块的工作模式;
+// tyhx_hrsresult_t hrsresult;//心率的测试结果
+
+uint8_t hr_no_living_dur = 0;  //used to increase no living dur, when no living status detected
+uint8_t spo2_no_living_dur = 0;        //used to increase no living dur, when no living status detected
+int tyhx_long_timer_tick = 400;
+
+
 typedef struct {
     i2c_bus_t i2c_id;
     uint32_t i2c_speed;
index fa030ee..9a230be 100644 (file)
@@ -11,6 +11,7 @@
 \r
 \r
 #include "tyhx_hrs_custom.h"\r
+//#include "lv_dev.h"\r
 \r
 \r
 \r
@@ -1047,7 +1048,7 @@ uint8_t hx3695_spo2_read(spo2_sensor_data_t * s_dat)
     //AGC_LOG("s_ppg_state: %d,s_cal_state: %d\r\n",s_ppg_state,s_cal_state);\r
     if (!s_ppg_state || s_cal_state) \r
     {\r
-        return 0;\r
+        return NULL;\r
     }    \r
 \r
                        data_count = hx3695_read_fifo_data(s_buf,spo2_phase_num,1); \r
@@ -1055,7 +1056,7 @@ uint8_t hx3695_spo2_read(spo2_sensor_data_t * s_dat)
 \r
       hx3695_spo2_read_data( agc_buf );\r
                  Ir_wear_value = agc_buf[7]- agc_buf[6];\r
-                 TYHX_LOG("Ir_wear_value: %d \r\n",Ir_wear_value);\r
+                 //my_printf("hx3695 Ir_wear_value: %d \r\n",Ir_wear_value);\r
                        for (i=0; i<data_count; i++) \r
                        {\r
 //                               Red_src_data = s_buf[i*4+2] - s_buf[i*4];\r
@@ -1081,26 +1082,21 @@ uint8_t hx3695_spo2_read(spo2_sensor_data_t * s_dat)
                                        ir_buf1[i] = Ir_src_data1;\r
                                        ir_buf2[i] = Ir_src_data2;\r
                                        \r
-                                       //AGC_LOG("G_LEDDAC: %d,R_LEDDAC: %d\r\n", calReg_SPO2.R_LEDDAC,cal.R_LEDDAC);\r
-                                       //DEBUG_PRINTF(0,"%d/%d %d %d %d %d %d %d %d %d\r\n" ,1+i,data_count,\r
-                                       // green_buf[i],red_buf[i],ir_buf[i],s_buf[i*4],s_buf[i*4+1],s_buf[i*4+2],s_buf[i*4+3],spo2_wear_status);\r
 \r
-//                                     AGC_LOG("fifo_data: %d/%d %d %d %d %d\r\n", i+1,data_count,s_buf[i*4],\r
-                       // s_buf[i*4+1],s_buf[i*4+2],s_buf[i*4+3]);\r
 \r
                                        \r
                                        if(spo2_wear_status==MSG_SPO2_WEAR)\r
                                        {\r
                                                        if(hx3695_spo2_check_unwear(Ir_wear_value))    //Ir_src_data2\r
                                                        {\r
-                                                               return 0;\r
+                                                               return NULL;\r
                                                        }\r
                                        }\r
                                        else\r
                                        {\r
                                                        if(hx3695_spo2_check_wear(Ir_wear_value))\r
                                                        {\r
-                                                               return 0;\r
+                                                               return NULL;\r
                                                        }\r
                                        }\r
                        }\r
index 59d4ae5..db736ff 100644 (file)
@@ -29,7 +29,7 @@
 typedef enum {    \r
    \r
     sCalStart,\r
-       sCalStart1,     \r
+               sCalStart1,     \r
     sCalLed,\r
     sCalLed2,\r
     sCalLed3,\r
@@ -40,11 +40,20 @@ typedef enum {
 \r
 typedef struct {\r
        uint8_t count;\r
+       #if 0\r
        int32_t red_data[16];\r
        int32_t green_data[16];\r
        int32_t ir_data1[16]; \r
        int32_t ir_data2[16];\r
        int32_t s_buf[64];\r
+       #else\r
+       int32_t red_data[32];\r
+       int32_t green_data[32];\r
+       int32_t ir_data1[32]; \r
+       int32_t ir_data2[32];\r
+       int32_t s_buf[128];\r
+\r
+       #endif\r
 //     int32_t red_amb_buf[64];\r
        \r
        uint8_t agc_green;\r
@@ -117,6 +126,6 @@ bool hx3695_spo2_check_wear(int32_t infrared_data);
 SPO2_CAL_SET_T get_spo2_agc_status(void);\r
 SPO2_CAL_SET_T PPG_spo2_agc(void);\r
 void hx3695_spo2_data_reset(void);\r
-// void hx3695_spo2_read_data(int32_t *s_buf);\r
+void hx3695_spo2_read_data(int32_t *s_buf);\r
 \r
 #endif\r