From: p15692025051 <846603105@qq.com> Date: Wed, 13 Sep 2023 08:23:56 +0000 (+0800) Subject: k5 gps优化 X-Git-Url: http://git.snicker.com.cn/img/static/gitweb.css?a=commitdiff_plain;h=9f5ef8a4bb1e9fada67332b36a40b533552e6930;p=mirrors%2FASR1603_G5.git k5 gps优化 --- diff --git a/2.sdk/Helios_SDK/components/HX3918/hx3918.c b/2.sdk/Helios_SDK/components/HX3918/hx3918.c index d293aa88..486104f7 100644 --- a/2.sdk/Helios_SDK/components/HX3918/hx3918.c +++ b/2.sdk/Helios_SDK/components/HX3918/hx3918.c @@ -97,13 +97,14 @@ const int32_t hrv_ir_unwear_thres = 5000; const int32_t hrv_ir_wear_thres = 6000; //SPO2_INFRARED_THRES const uint8_t spo2_check_unwear_oft = 4; -const int32_t spo2_ir_wear_thres = 12000; +const int32_t spo2_ir_wear_thres = 20000; //CHECK_WEAR_MODE_THRES const int32_t check_mode_unwear_thre = 5000; const int32_t check_mode_wear_thre = 6000; //const int32_t check_mode_sar_thre = 6000; - +int32_t sar_wear_thres = NORMALWEARDIFF/3; // 可设定为正常的1/3, 必须小于32767 +int32_t sar_unwear_thres = NORMALWEARDIFF/30*8; // 可设定为 sar_wear_thres *0.8 uint8_t alg_ram[11 * 1024] __attribute__((aligned(4))); ppg_sensor_data_t ppg_s_dat; @@ -815,6 +816,9 @@ void hx3918_ppg_Int_handle(void) hx3918_agc_Int_handle(); #endif +#ifdef SAR_ALG_LIB + hx3918_report_prox_status(); +#endif switch(work_mode_flag) { case HRS_MODE: diff --git a/2.sdk/Helios_SDK/components/HX3918/hx3918.h b/2.sdk/Helios_SDK/components/HX3918/hx3918.h index fa6111c7..39bfd53e 100644 --- a/2.sdk/Helios_SDK/components/HX3918/hx3918.h +++ b/2.sdk/Helios_SDK/components/HX3918/hx3918.h @@ -35,6 +35,7 @@ NEW_GSEN_SCHME DEMO调试使用, 客户关闭 //#define HRV_ALG_LIB #define CHECK_TOUCH_LIB //#define CHECK_LIVING_LIB +#define SAR_ALG_LIB #define BP_CUSTDOWN_ALG_LIB @@ -286,6 +287,8 @@ typedef struct { extern uint8_t alg_ram[11*1024]; extern uint8_t hx3918_chip_id; +extern int32_t sar_wear_thres; +extern int32_t sar_unwear_thres; extern WORK_MODE_T work_mode_flag; diff --git a/2.sdk/Helios_SDK/components/HX3918/hx3918_factory_test.c b/2.sdk/Helios_SDK/components/HX3918/hx3918_factory_test.c index 6bb71428..3f853709 100644 --- a/2.sdk/Helios_SDK/components/HX3918/hx3918_factory_test.c +++ b/2.sdk/Helios_SDK/components/HX3918/hx3918_factory_test.c @@ -339,7 +339,7 @@ bool hx3918_chip_check_id(void) factory_result_t factory_reslts = {0,0,0}; factory_result_t hx3918_factroy_test(uint32_t test_mode) { - + factory_result_t factory_reslts = {0,0,0}; int32_t green_buffer[4] = {0,0,0,0}; int32_t red_buffer[4] = {0,0,0,0}; int32_t ir_buffer[4] = {0,0,0,0}; diff --git a/2.sdk/Helios_SDK/components/HX3918/hx3918_hrs_agc.c b/2.sdk/Helios_SDK/components/HX3918/hx3918_hrs_agc.c index 6ffa92cb..620f242c 100644 --- a/2.sdk/Helios_SDK/components/HX3918/hx3918_hrs_agc.c +++ b/2.sdk/Helios_SDK/components/HX3918/hx3918_hrs_agc.c @@ -9,7 +9,9 @@ #include "hx3918.h" #include "hx3918_hrs_agc.h" #include "tyhx_hrs_alg.h" +#ifdef SAR_ALG_LIB #include "hx3918_prox.h" +#endif #ifdef HRS_ALG_LIB @@ -20,8 +22,6 @@ extern uint8_t read_fifo_first_flg; extern const int32_t hrs_ir_unwear_thres; extern const int32_t hrs_ir_wear_thres; -extern const int32_t sar_unwear_thres; -extern const int32_t sar_wear_thres; static uint8_t s_ppg_state = 0; static uint8_t s_cal_state = 0; @@ -218,6 +218,10 @@ void Restart_hrs_PPG_Calibration_Routine(HRS_CAL_SET_T *calR) hx3918_hrs_wear_msg_code_t hx3918_hrs_wear_mode_check(int32_t infrared_data) { int32_t check_thre = 0; + int16_t sar_data = 32767; +#ifdef SAR_ALG_LIB + sar_data = hx90xx_get_prox_data(); +#endif if(hrs_wear_status == MSG_HRS_NO_WEAR) { check_thre = hrs_ir_wear_thres; @@ -227,7 +231,7 @@ hx3918_hrs_wear_msg_code_t hx3918_hrs_wear_mode_check(int32_t infrared_data) check_thre = hrs_ir_unwear_thres; } - if(infrared_data < check_thre) + if(infrared_data < check_thre || sar_data < sar_unwear_thres) { if(no_touch_cnt < NO_TOUCH_CHECK_NUM) { @@ -238,7 +242,7 @@ hx3918_hrs_wear_msg_code_t hx3918_hrs_wear_mode_check(int32_t infrared_data) hrs_wear_status = MSG_HRS_NO_WEAR; } } - else if(infrared_data >= check_thre) + else if(infrared_data >= check_thre && sar_data > sar_wear_thres) { if(no_touch_cnt>0) { @@ -253,8 +257,8 @@ hx3918_hrs_wear_msg_code_t hx3918_hrs_wear_mode_check(int32_t infrared_data) //AGC_LOG("hrs wearstates: hrs_wear_status_pre=%d,hrs_wear_status=%d\r\n",\ //hrs_wear_status_pre,hrs_wear_status); - hrs_wear_status = hx3918_get_wear_result(hrs_wear_status); - HX3918_LOG("[hx3918_hrs_wear_mode_check end] final result = %d\r\n",hrs_wear_status); + //hrs_wear_status = hx3918_get_wear_result(hrs_wear_status); + //HX3918_LOG("[hx3918_hrs_wear_mode_check end] final result = %d\r\n",hrs_wear_status); if(hrs_wear_status_pre != hrs_wear_status) { hrs_wear_status_pre = hrs_wear_status; @@ -269,7 +273,7 @@ hx3918_hrs_wear_msg_code_t hx3918_hrs_wear_mode_check(int32_t infrared_data) hx3918_hrs_set_mode(CAL_INIT); } } - return hrs_wear_status; + return hrs_wear_status; } /* @@ -444,7 +448,9 @@ void hx3918_hrs_cal_off(void) // 20200615 ericy afe cali offline hx3918_delay(5); hx3918_write_reg(0X4d, 0X00); //release hx3918_delay(5); //Delay for reset time - hx3918_prox_init(); +#ifdef SAR_ALG_LIB + hx3918_prox_reg_init(); +#endif read_fifo_first_flg = 1; } @@ -498,9 +504,10 @@ void hx3918_hrs_low_power(void) hx3918_delay(5); hx3918_write_reg(0x4d, 0x00); //release hx3918_delay(5); - calReg.led_cur = 0; - hx3918_prox_init(); +#ifdef SAR_ALG_LIB + hx3918_prox_reg_init(); +#endif read_fifo_first_flg = 1; AGC_LOG(" chip go to low power mode \r\n" ); @@ -700,7 +707,14 @@ uint8_t hx3918_hrs_read(ppg_sensor_data_t * s_dat) //DEBUG_PRINTF("%d/%d %d %d\r\n",1+i,data_count,PPG_buf[i],ir_buf[i]); } TYHX_LOG("\r\n"); - + + #ifdef SAR_ALG_LIB + if (hrs_wear_status == MSG_HRS_NO_WEAR) + { + hx3918_cali_with_ir(Ir_src_data, hrs_ir_unwear_thres); + } + #endif + if (ps_green_data<100000 || ps_green_data>400000) { recal = true; diff --git a/2.sdk/Helios_SDK/components/HX3918/hx3918_hrv_agc.c b/2.sdk/Helios_SDK/components/HX3918/hx3918_hrv_agc.c index 9d39fac4..bc221b17 100644 --- a/2.sdk/Helios_SDK/components/HX3918/hx3918_hrv_agc.c +++ b/2.sdk/Helios_SDK/components/HX3918/hx3918_hrv_agc.c @@ -8,7 +8,9 @@ #include "hx3918_hrs_agc.h" #include "hx3918_hrv_agc.h" #include "tyhx_hrv_alg.h" +#ifdef SAR_ALG_LIB #include "hx3918_prox.h" +#endif //#ifdef TYHX_DEMO //#include "twi_master.h" //#include "SEGGER_RTT.h" @@ -246,13 +248,17 @@ void hx3918_hrv_ppg_init(void) //20200615 ericy ppg fs=25hz, phase3 conversion r hx3918_delay(5); hx3918_write_reg(0X4d, 0X00); //release hx3918_delay(5); - hx3918_prox_init(); + //hx3918_prox_init(); read_fifo_first_flg = 1; } hx3918_hrv_wear_msg_code_t hx3918_hrv_wear_mode_check(int32_t infrared_data) { - if(infrared_data > hrv_ir_wear_thres) + int16_t sar_data = 32767; +#ifdef SAR_ALG_LIB + sar_data = hx90xx_get_prox_data(); +#endif + if(infrared_data > hrv_ir_wear_thres && sar_data > sar_wear_thres) { if(no_touch_cnt < NO_TOUCH_CHECK_NUM) { @@ -263,7 +269,7 @@ hx3918_hrv_wear_msg_code_t hx3918_hrv_wear_mode_check(int32_t infrared_data) hrv_wear_status = MSG_HRV_WEAR; } } - else if(infrared_data < hrv_ir_unwear_thres) + else if(infrared_data < hrv_ir_unwear_thres || sar_data < sar_unwear_thres) { if(no_touch_cnt>0) { @@ -279,8 +285,8 @@ hx3918_hrv_wear_msg_code_t hx3918_hrv_wear_mode_check(int32_t infrared_data) { hrv_wear_status_pre = hrv_wear_status; //TYHX_LOG("[hx3918_hrv_wear_mode_check start] ir wear result = %d\r\n",hrv_wear_status); - hrv_wear_status = hx3918_get_wear_result(hrv_wear_status); - TYHX_LOG("[hx3918_hrv_wear_mode_check end] final result = %d\r\n",hrv_wear_status); + //hrv_wear_status = hx3918_get_wear_result(hrv_wear_status); + //TYHX_LOG("[hx3918_hrv_wear_mode_check end] final result = %d\r\n",hrv_wear_status); if(hrv_wear_status_pre == MSG_HRV_NO_WEAR) { hx3918_hrv_low_power(); @@ -491,7 +497,9 @@ void hx3918_hrv_cal_off(void) // 20200615 ericy afe cali offline hx3918_delay(5); hx3918_write_reg(0X4d, 0X00); //release hx3918_delay(5); //Delay for reset time - hx3918_prox_init(); +#ifdef SAR_ALG_LIB + hx3918_prox_reg_init(); +#endif read_fifo_first_flg = 1; } @@ -701,7 +709,9 @@ void hx3918_hrv_low_power(void) hx3918_write_reg(0X4d, 0X00); //release hx3918_delay(5); calReg.led_cur = 0; - hx3918_prox_init(); +#ifdef SAR_ALG_LIB + hx3918_prox_reg_init(); +#endif // hx3918_ppg_timer_cfg(false); // hx3918_agc_timer_cfg(false); // hx3918_gpioint_cfg(true); diff --git a/2.sdk/Helios_SDK/components/HX3918/hx3918_prox.c b/2.sdk/Helios_SDK/components/HX3918/hx3918_prox.c index b2ed4c9d..00a15477 100644 --- a/2.sdk/Helios_SDK/components/HX3918/hx3918_prox.c +++ b/2.sdk/Helios_SDK/components/HX3918/hx3918_prox.c @@ -51,13 +51,13 @@ hx_set_wear_detect_mode(SLEEP_WEAR_MODE) //在手表检测到进入睡眠后 PPG部分没有同时被初始化, 所以读到的hx3918_chip_id = 0, 那这里就是会加上芯片的上下电控制 6. 注意CSx和CHx, CSx是指外部PAD接到芯片的对应CS管脚. CH是指内部采集数据的3个通道, CSx可配置在不同的CH上; -------------------------------- -------------------------------- -----------------------------------*/ -#define ANALOG_DIFF //模拟差分, 一般用这种模式 -//#define DIGITAL_DIFF //数字差分 -#ifdef ANALOG_DIFF +#ifdef SAR_ALG_LIB +//#define TEMP_COMPENSATION + //#define INDEPENDDENT_CH // 独立通道宏定义, 就是一个PAD对应一个CH #define DIFFERENCE_CH //差分通道定义, 两个PAD作为一个CH的差分正端和负端, 挨着胳膊的佩戴为正端 -#endif + //#define HRS_VDD_ALWAYS_ON //HRS 模块长供电 @@ -65,36 +65,21 @@ extern uint8_t hx3918_chip_id; // 芯片ID, 应该等于0x27 int16_t nv_wear_offset[2] = {0}; // 芯片产测校准的两个通道的OFFSET值, 值记录在fash里面 int16_t nv_base_data[2] = {0}; // 芯片产测校准的两个通道的对空LP值, 值记录在flash里面 //extern uint16_t sendcnt; // 蓝牙数据采集计数, 这个是采数用的, 可以不用 -int16_t gdiff[2] = {0}; // gdiff[0], gdiff[1] 分别保存CH0, CH1的结果 -int16_t lp[2] = {0}; -int16_t bl[2] = {0}; +int16_t gdiff[2] = {0}; // gdiff[0], gdiff[1] 分别保存WEAR_CH, REF_CH的结果 +int16_t glp[2] = {0}; +int16_t gbl[2] = {0}; //flash 读写变量, 依次记录nv_wear_offset[0],nv_wear_offset[1],nv_base_data[0],nv_base_data[1] -int16_t fds_read[4] = {0}; //读出flash 存储数据的变量; -int16_t fds_write[4] = {0}; //写flash的变量, flash里面分别记录 - +uint32_t fds_read[4] = {0}; //读出flash 存储数据的变量; +uint32_t fds_write[4] = {0}; //写flash的变量, flash里面分别记录 +uint8_t data_updata_ready = 0; uint8_t is_factory_mode = 0; // 产测模式, 用来读取整机对空时OFFSET和对空的nv_base值; -uint8_t wear_detect_mode = NORMAL_WEAR_MODE; - - - - -/** - * set touch detect mode - * @param current_mode 设置的工作模式 - */ -void hx_set_wear_detect_mode(uint8_t current_mode) -{ - if(current_mode>SLEEP_WEAR_MODE) - { - TYHX_LOG("wear mode set fail , exceed the limit\r\n"); - return; - } - wear_detect_mode = current_mode; +uint8_t is_offset_manual = 0; // = 0自动校准模式, 用来读取整机对空时OFFSET和对空的nv_base值; +static bool cap_wear = false; +static bool cap_enable = false; -} /** @@ -108,9 +93,11 @@ int16_t hx3918_read_two_reg_low_triple(uint8_t addh, uint8_t addl) uint8_t val_h = 0; uint8_t val_m= 0; int32_t data = 0; + hx3918_write_reg(0x35,0x08); // man lock val_l = hx3918_read_reg(addl-1); val_m = hx3918_read_reg(addl); val_h = hx3918_read_reg(addh); + hx3918_write_reg(0x35,0x00); // unlock data =((val_l>>4) | (val_m<<4)|((val_h & 0x0f) << 12)) ; if (data > 32767) return (int16_t)(data - 65536); @@ -282,16 +269,33 @@ int16_t hx3918_read_diff_lp(uint8_t chx_diff) */ void hx3918_config_thres(uint8_t chx,int16_t high_thres, int16_t low_thres, int16_t base_data) { - - if ((low_thres + base_data) <= 0) + + //TYHX_LOG("[config_thres]CHX = %d, high thres =%d, low_thres=%d, base_data=%d\r\n",chx,high_thres,low_thres,base_data); + //if ((low_thres + base_data) <= 0) { - return; + // return; } + //TYHX_LOG("[config_thres]CHX = %d, high thres =%d, low_thres=%d\r\n",chx,high_thres,low_thres); int16_t thres = 0; - thres = (high_thres + base_data)/32; + + + thres = (high_thres + base_data)/32; + if(thres<0) + { + thres = 0; + } + + TYHX_LOG("[config_thres]CHX = %d, high thres =%d\r\n",chx,thres); hx3918_write_reg(0x9D+1*chx, (thres&0x00FF)); hx3918_write_reg(0xA0+1*chx, (thres&0xFF00)>>8); + thres = (low_thres + base_data)/32; + if(thres<0) + { + thres = 0; + } + + TYHX_LOG("[config_thres]CHX = %d,low_thres=%d\r\n",chx,thres); hx3918_write_reg(0xA5+1*chx, (thres&0x00FF)); hx3918_write_reg(0xA8+1*chx, (thres&0xFF00)>>8); } @@ -304,23 +308,23 @@ void hx3918_config_thres(uint8_t chx,int16_t high_thres, int16_t low_thres, int1 bool hx3918_prox_reg_init(void) { bool write_ok = true; - -#ifdef ANALOG_DIFF - if (hx3918_chip_id != PROX_CHIPID) - { - TYHX_LOG("100hz\r\n"); - write_ok &= hx3918_write_reg(0x18,0x40); //prf =100HZ - write_ok &= hx3918_write_reg(0x19,0x01); // - } + data_updata_ready = 0; +//prf 默认25HZ +// if (hx3918_chip_id != PROX_CHIPID) +// { +// TYHX_LOG("100hz\r\n"); +// write_ok &= hx3918_write_reg(0x18,0x00); //prf =100HZ +// write_ok &= hx3918_write_reg(0x19,0x05); // +// } write_ok &= hx3918_write_reg(0x6a,0x00); //CH0~N disable - write_ok &= hx3918_write_reg(0x51,0x00); //default?? - write_ok &= hx3918_write_reg(0x52,0x02); //default?? - write_ok &= hx3918_write_reg(0x53,0x00); //default?? +// write_ok &= hx3918_write_reg(0x51,0x00); //default +// write_ok &= hx3918_write_reg(0x52,0x02); //default +// write_ok &= hx3918_write_reg(0x53,0x00); //default #ifdef INDEPENDDENT_CH // -// write_ok &= hx3918_write_reg(0x55,0x0C); //CS1->CH0 - write_ok &= hx3918_write_reg(0x55,0x03); //CS0->CH0 + write_ok &= hx3918_write_reg(0x55,0x0C); //CS1->CH0 + write_ok &= hx3918_write_reg(0x55,0x03); //CS0->CH0 // write_ok &= hx3918_write_reg(0x57,0x30); //CS2->CH1 @@ -330,26 +334,26 @@ bool hx3918_prox_reg_init(void) #elif defined(DIFFERENCE_CH) //?????????????¨, ???????·?? // write_ok &= hx3918_write_reg(0x55,0x2c); //CS1->CH0[P],CS2->CH0[N] // write_ok &= hx3918_write_reg(0x55,0x0e); //CS1->CH0[P],CS0->CH0[N] - write_ok &= hx3918_write_reg(0x55,0x0B); //CS0->CH0[P],CS1->CH0[N] + write_ok &= hx3918_write_reg(0x55,0x0c); //CS0->CH0[P],CS1->CH0[N] // write_ok &= hx3918_write_reg(0x57,0x30); //CS2->CH1 // write_ok &= hx3918_write_reg(0x57,0x03); //CS0->CH1 - write_ok &= hx3918_write_reg(0x57,0x0c); //CS1->CH1 + write_ok &= hx3918_write_reg(0x57,0x0b); //CS1->CH1 #endif - write_ok &= hx3918_write_reg(0x56,0x00); //default - write_ok &= hx3918_write_reg(0x58,0x00); //default - write_ok &= hx3918_write_reg(0x59,0x00); //CH2 - write_ok &= hx3918_write_reg(0x5A,0x00); //CH2 + write_ok &= hx3918_write_reg(0x59,0x0c); //CH2 CS1 + #ifdef FULL25PF write_ok &= hx3918_write_reg(0x5B,0x11); //full range = 2.5pf 0x11=2.5pf 0x22 = 3.75pf, 0x33 = 5pf +#elif defined(FULL125PF) + write_ok &= hx3918_write_reg(0x5B,0x00); //full range 0x00 = 1.25pf #elif defined(FULL375PF) write_ok &= hx3918_write_reg(0x5B,0x22); //full range = 2.5pf 0x11=2.5pf 0x22 = 3.75pf, 0x33 = 5pf #elif defined(FULL50PF) write_ok &= hx3918_write_reg(0x5B,0x33); //full range = 2.5pf 0x11=2.5pf 0x22 = 3.75pf, 0x33 = 5pf #endif write_ok &= hx3918_write_reg(0x5D,0x25); //OSR AVG - write_ok &= hx3918_write_reg(0x5E,0x11); //OSR AVG - write_ok &= hx3918_write_reg(0x5F,0x01); //OSR AVG + write_ok &= hx3918_write_reg(0x5E,0x22); //OSR nosr1_num_i2c nosr2_num_i2c + write_ok &= hx3918_write_reg(0x5F,0x11); //AVG ch1_avg_num_i2c ch2_avg_num_i2c write_ok &= hx3918_write_reg(0x66,0x08); //采样时间 write_ok &= hx3918_write_reg(0x67,0x00); // @@ -359,118 +363,228 @@ bool hx3918_prox_reg_init(void) write_ok &= hx3918_write_reg(0x6E,0x11); //LP alpha write_ok &= hx3918_write_reg(0x77,0x70); //output 选择LP和BL - write_ok &= hx3918_write_reg(0x7A,0x07); //补偿电容校准触发设置=16384 - - - if(is_factory_mode) + //write_ok &= hx3918_write_reg(0x99,0x40); // ch0 coe 增益配置 + //write_ok &= hx3918_write_reg(0x9A,0x40); // ch1 coe 增益配置 + //write_ok &= hx3918_write_reg(0x94,0x02); // diff_en_ch01 + + + if(is_offset_manual == 0) { - TYHX_LOG("is_factory_mode\r\n"); + TYHX_LOG("is_offset_manual = 0\r\n"); - write_ok &= hx3918_write_reg(0x70,0x66); - write_ok &= hx3918_write_reg(0x72,0x20); - write_ok &= hx3918_write_reg(0x73,0x04); - write_ok &= hx3918_write_reg(0x90,0x77); - write_ok &= hx3918_write_reg(0x8F,0x00); + write_ok &= hx3918_write_reg(0x90,(0x1<100) - // ret = 1; - // else - // { - // if((lp_old[0] - lp[0]) > 40) - // ret = 0; - // else - // { - // if(lp[0]>3300) - // ret = 1; - // else - // ret = 0; - // } - - // } - // lp_old[0] = lp[0]; - // lp_old[1] = lp[1]; - // bl_old[0] = bl[0]; - // bl_old[1] = bl[1]; - // return ret; -#ifdef TEMP_COMPENSATION //温度补偿 - //这个是应对高温环境要求, 不用打开, 要看看具体情况, - if(gdiff[1]>20000) - { - gdiff[0] = gdiff[0]*0.9; // 如果随着高温,感应值上升,为0.9, 感应值下降改为1.1 - } -#endif - if(gdiff[0]=SLEEPWEARTHRES)&&(wear_detect_mode == SLEEP_WEAR_MODE ))//SLEEPWEARTHRES=9000*0.3 - { - ret = prox_detect; - } - ret = prox_no_detect; - } - else - { - ret = prox_detect; + hx3918_timer = Helios_Timer_init( (void* )hx3918_timerout_cb, NULL); + Helios_Timer_Start(hx3918_timer, 1500, 1); } - if(ret == 1) //检测到已佩戴,置标志 - cap_wear_flag = 1; - if(cap_wear_flag != 1)//没有检测过已佩戴,统一置为已佩戴 - ret = 1; - return ret; + uint8_t ret = 0; + + glp[0] = hx3918_read_diff_lp(WEAR_CH); + gbl[0] = hx3918_read_raw_bl(WEAR_CH); + + glp[1] = hx3918_read_diff_lp(REF_CH); + gbl[1] = hx3918_read_raw_bl(REF_CH); + + if ((glp[0] == 0) && (gbl[0] == 0)) // agc 调节时出现 + { + data_updata_ready = 0; + } + + if (data_updata_ready == 1&& (glp[0] != gbl[0])) + { + if (is_offset_manual == 0) + { + gdiff[0] = glp[0]- gbl[0]; + } + else + { + gdiff[0] = glp[0]- nv_base_data[0]; + } + gdiff[1] = glp[1]- gbl[1]; + + hx3918_update_min_nv_data(gbl[0]); + } + + if ((glp[0] == gbl[0]) && (glp[0] != 0) && is_offset_manual ==1) + { + if (data_updata_ready == 0) + { + // 恢复寄存器 + hx3918_write_reg(0x9c,0x07); // lp_out_delta_bypass + //hx3918_write_reg(0x85,0x0f); // prox_int_high_num_i2c + //hx3918_write_reg(0xa3,0xff); //lp_out_delta_thres_ch1[7:0] + //hx3918_write_reg(0xa4,0x0f); // lp_out_delta_thres_ch1[11:8] + hx3918_write_reg(0x70,0x99); // RA_UP_ALP_1_0_CFG + data_updata_ready = 1; + TYHX_LOG("data_updata_ready == 1\r\n"); + } + } + if(gdiff[0]>sar_wear_thres) + ret = 1; + else + ret = 0; + if(ret == 1)// + cap_wear_flag = 1; + if(cap_wear_flag == 0) + ret = 0; + TYHX_LOG("SARresult ready: %d, lp,%d,%d, bl,%d,%d, giff, %d,%d, offset, %d, nv_data,%d\r\n",data_updata_ready, glp[0],glp[1], gbl[0],gbl[1],gdiff[0],gdiff[1], nv_wear_offset[0],nv_base_data[0]); + return ret; +} + + +int32_t hx90xx_get_prox_data(void) +{ + if (data_updata_ready == 1) + { + // 异常处理 + if (nv_base_data[0] <-16384|| nv_base_data[0] > 25000 || hx3918_chip_id != PROX_CHIPID ||is_open_sar == 0) + { + gdiff[0] = 32767; + } + } + + if (is_offset_manual == 0) + { + gdiff[0] = 32767; + } + //DEBUG_PRINTF("gdiff[0]: %d \r\n", gdiff[0]); + + return gdiff[0]; +} + + //红外值很小时校准 +void hx3918_cali_with_ir(int32_t infrared_data, int32_t ir_thres) +{ + //设定 对空红外值 校准 + int32_t unwear_infrared_data = ir_thres/4; + if (data_updata_ready == 1) + { + if (infrared_data < unwear_infrared_data) + { + if ((gdiff[0] > sar_unwear_thres/4)&& (gdiff[0] < sar_unwear_thres)) + { + nv_base_data[0] = gbl[0]; + } + } + } + DEBUG_PRINTF("infrared_data: %d , unwear_infrared_data %d, sar_unwear_thres: %d,gdiff[0],%d\r\n", infrared_data, unwear_infrared_data,sar_unwear_thres,gdiff[0]); +} + + +//更新最小值 +void hx3918_update_min_nv_data(int16_t min_data) +{ + uint8_t nv_change_flag = 0; + if (is_offset_manual == 1&&data_updata_ready == 1) + { + // 取得最小信号量值 + if(min_data < nv_base_data[0]-50) + { + nv_base_data[0] = min_data; + nv_change_flag = 1; + + } + + if (nv_change_flag == 1) + { +// hx90xx_config_thres(CH0,ch0_high_diff, ch0_low_diff,nv_base_data[0]); // wear0 +// hx90xx_config_thres(CH1,ch1_high_diff, ch1_low_diff,nv_base_data[1]); // wear1 + DEBUG_PRINTF("90XX update_min_nv_data nv_base_data0: %d,\r\n", nv_base_data[0]); + } + } +} + + +// 在充电状态下调用, 每次充电只调用一次 +void hx3918_update_nv_data() +{ + int16_t min_data0 = {0}; + uint8_t nv_change_flag = 0; + + glp[0] = hx3918_read_diff_lp(WEAR_CH); + min_data0 = hx3918_read_raw_bl(WEAR_CH); + + if (is_offset_manual == 1) + { + //nv_wear_offset[0] = hx3918_read_offset(CH0_OFFSET); + // 取得对空信号值 + if((min_data0 - nv_base_data[0]) > 100 ) + { + nv_base_data[0] = nv_base_data[0] + (min_data0 - nv_base_data[0])/2; + nv_change_flag = 1; + } + + // 异常处理 + if (nv_base_data[0] <-16384|| nv_base_data[0] > 20000 || glp[0] > 32000) + { + hx3918_prox_factory_hanging_cali(); + return; + } + if (nv_change_flag == 1) + { + hx3918_factory_cali_save_nv(); + } + hx3918_prox_init(); + DEBUG_PRINTF("90XX update_nv_data nv_base_data0: %d, nv_base_data1: %d\r\n", nv_base_data[0], nv_base_data[1]); + } + else if (is_offset_manual == 0) + { + hx3918_prox_factory_hanging_cali(); + DEBUG_PRINTF("is_offset_manual == 0 %d, %d \r\n", nv_base_data[0], nv_wear_offset[0]); + } } /** @@ -493,16 +607,22 @@ void hx3918_read_nv(void) nv_base_data[1] = fds_read[3]; //如果flash记录的值大于上限, 则让靠近感应进入相对值模式 - if(nv_wear_offset[0] > 1020) + if ( (nv_wear_offset[0] == 0&& nv_base_data[0] == 0) || nv_wear_offset[0] == 0xFFFF) { - nv_wear_offset[0] = 0; - nv_base_data[0] = 0; - nv_wear_offset[1] = 0; - nv_base_data[1] = 0; + nv_wear_offset[0] = 0; + nv_base_data[0] = 0; + nv_wear_offset[1] = 0; + nv_base_data[1] = 0; + cap_enable = false; + is_offset_manual = 0; } - TYHX_LOG("[hx3918_read_nv]\r\n"); - TYHX_LOG("OFF[0]: %d, OFF[1]:%d\r\n",nv_wear_offset[0],nv_wear_offset[1]); - TYHX_LOG("BASE[0]: %d, BASE[1]:%d\r\n",nv_base_data[0],nv_base_data[1]); + else + { + is_offset_manual = 1; + } + + TYHX_LOG("hx3918_read_nv ,OFF[0]: %d, OFF[1]:%d\r\n",nv_wear_offset[0],nv_wear_offset[1]); + TYHX_LOG("BASE[0]: %d, BASE[1]:%d,mode: %d \r\n",nv_base_data[0],nv_base_data[1],is_offset_manual); @@ -519,27 +639,28 @@ bool hx3918_prox_init(void) #endif int32_t i = 0; bool ret = false; - //sendcnt = 0; + cap_wear = false; TYHX_LOG("[hx3918_prox_init]prox device_id is : 0x%.2x !\r\n", hx3918_chip_id); if (hx3918_chip_id != PROX_CHIPID) { hx3918_power_restart(); //i2c_hrs_init(); - //twi_master_init(); + // twi_master_init(); hx3918_read_nv(); - hx3918_ppg_on(); - hx3918_prox_reg_init(); + hx3918_ppg_on(); + for (i = 0; i<5; i++) { hx3918_chip_id = hx3918_check_device_id(); TYHX_LOG(" power restart ,prox device_id is : 0x%.2x !\r\n", hx3918_chip_id); if (hx3918_chip_id == PROX_CHIPID) { + hx3918_prox_reg_init(); break; } } - if(hx3918_chip_id == 0) + if(hx3918_chip_id != PROX_CHIPID) { TYHX_LOG("no proximity device\r\n"); //i2c_hrs_uninit(); @@ -554,7 +675,7 @@ bool hx3918_prox_init(void) hx3918_read_nv(); hx3918_prox_reg_init(); } - hx3918_delay(50); + //hx3918_ppg_off(); return ret; } @@ -575,29 +696,55 @@ bool hx3918_prox_factory_init(void) hx3918_power_restart(); //i2c_hrs_init(); - hx3918_ppg_on(); - hx3918_prox_reg_init(); for (i = 0; i<5; i++) { hx3918_chip_id = hx3918_check_device_id(); TYHX_LOG(" power restart ,prox device_id is : 0x%.2x !\r\n", hx3918_chip_id); if (hx3918_chip_id == PROX_CHIPID) { + hx3918_write_reg(0x18,0x40); //prf =100HZ + hx3918_write_reg(0x19,0x01); // + hx3918_prox_reg_init(); break; } } - if(hx3918_chip_id == 0) + + if(hx3918_chip_id != PROX_CHIPID) { TYHX_LOG("no proximity device\r\n"); - //i2c_hrs_uninit(); hx3918_power_down(); } - hx3918_delay(50); return ret; } +//佩戴数据 +void hx3918_factory_cali_read_data(void) +{ + int16_t lp[2] = {0}; + int16_t bl[3] = {0}; + int32_t diff[3] = {0}; + + lp[0] = hx3918_read_diff_lp(WEAR_CH); + bl[0] = hx3918_read_raw_bl(WEAR_CH); + + //lp[1] = hx3918_read_diff_lp(REF_CH); + //bl[1] = hx3918_read_raw_bl(REF_CH); + + if (is_offset_manual ==1) + { + diff[0] = lp[0]- nv_base_data[0]; + } + else + { + diff[0] = lp[0] - bl[0]; + } + + + DEBUG_PRINTF("id: 0x%x,offset0,%%d, lp[0], %d, bl[0], %d, diff[0],%d\r\n", hx3918_chip_id,nv_wear_offset[0],lp[0],bl[0],diff[0]); +} + /** * hx3918 靠近感应部分 工厂产测程序, 需将手表悬空或者远离其他可能影响电容值的物体. * @param NULL @@ -611,17 +758,16 @@ void hx3918_prox_factory_hanging_cali(void) // uint16_t offset1 = 0; // int16_t lp[2] = {0}; //uint8_t device_id = 0x00; - - is_factory_mode = 1; + is_offset_manual = 0; hx3918_prox_factory_init(); hx3918_delay(50);//delay 100ms - prox_factory_offset0 = hx3918_read_offset(CH0_OFFSET); - prox_factory_offset1 = hx3918_read_offset(CH1_OFFSET); + prox_factory_offset0 = hx3918_read_offset(WEAR_CH); + prox_factory_offset1 = hx3918_read_offset(REF_CH); - prox_factory_lp[0] = hx3918_read_diff_lp(LP0); - prox_factory_lp[1] = hx3918_read_diff_lp(LP1); + prox_factory_lp[0] = hx3918_read_diff_lp(WEAR_CH); + prox_factory_lp[1] = hx3918_read_diff_lp(REF_CH); HX3918_LOG("offset0,offset1= %d %d\r\n", prox_factory_offset0,prox_factory_offset1); @@ -634,14 +780,14 @@ void hx3918_prox_factory_hanging_cali(void) #endif nv_wear_offset[0] = prox_factory_offset0; nv_wear_offset[1] = prox_factory_offset1; - nv_base_data[0] = lp[0]; - nv_base_data[1] = lp[1]; - HX3918_LOG("base0,base1= %d %d\r\n", lp[0],lp[1]); + nv_base_data[0] = prox_factory_lp[0]; + nv_base_data[1] = prox_factory_lp[1]; + HX3918_LOG("base0,base1= %d %d\r\n", glp[0],glp[1]); #ifdef DIFFERENCE_CH //将差分数据读到的OFFSET, NV_BASE记录到FLASH里面, 校准存储把自学习的记录也需要清掉重新计算 - if((prox_factory_offset0 == 510) &&(prox_factory_offset1 == 510)) + if((prox_factory_offset0 == 510) &&(prox_factory_offset1 == 510)&&(prox_factory_lp[0]==0)&&(prox_factory_lp[1]==0)) { TYHX_LOG("ERR, read offset err, please redo it !!!\r\n"); } @@ -650,8 +796,9 @@ void hx3918_prox_factory_hanging_cali(void) hx3918_factory_cali_save_nv(); } #endif - hx3918_ppg_off(); - is_factory_mode = 0; + + hx3918_prox_init(); + hx3918_delay(1000);//delay 1000ms } @@ -717,7 +864,7 @@ bool hx3918_get_wear_result(uint8_t ppg_wear) } } } - +#endif // SAR_ALG_LIB diff --git a/2.sdk/Helios_SDK/components/HX3918/hx3918_prox.h b/2.sdk/Helios_SDK/components/HX3918/hx3918_prox.h index 7043b0b0..25093ebe 100644 --- a/2.sdk/Helios_SDK/components/HX3918/hx3918_prox.h +++ b/2.sdk/Helios_SDK/components/HX3918/hx3918_prox.h @@ -43,33 +43,31 @@ #define DIFF1 1 #define DIFF2 2 +// user to config +#define WEAR_CH CH1 +#define REF_CH CH0 #define hx_min(x,y) ( (x)>(y)?(y):(x) ) #define hx_abs(x) ((x)>0?(x):(-(x))) -#define RELATIVE_MODE 0 //相对值模式, 检测结果=LP-BL, 无法佩戴着开机时的靠近感应,其他正常 -#define ABSOLUTE_MODE 1 //绝对值模式, 检测结果=LP-NV_BASE 可以佩戴开机 #define PROX_CHIPID 0x27 -#define HX3918_IR_AIR 6000 //小于这个值代表脱腕 -#define NORMALWEARDIFF 7000 //正常佩戴测试到的平均值, 宽松佩戴 -#define WEARTHRES NORMALWEARDIFF/2 //普通佩戴阈值 -#define SLEEPWEARTHRES NORMALWEARDIFF*0.3 //睡眠佩戴阈值 +#define NORMALWEARDIFF 18000 //正常佩戴测试到的平均值, 宽松佩戴 -#define CH0_HIGH_DIFF NORMALWEARDIFF/8 -#define CH0_LOW_DIFF NORMALWEARDIFF/10 -#define CH1_HIGH_DIFF NORMALWEARDIFF/8 -#define CH1_LOW_DIFF NORMALWEARDIFF/10 +#define WEAR_HIGH_DIFF NORMALWEARDIFF/6 +#define WEAR_LOW_DIFF NORMALWEARDIFF/8 +#define REF_HIGH_DIFF NORMALWEARDIFF/6 +#define REF_LOW_DIFF NORMALWEARDIFF/8 //HX3918 cap 测试电容的满量程设置, 最小 //#define FULL0625PF //HX3918 full range cap = 0.625pf //一般不用这个, 这个满量程设置, 说明感应pad很小, //#define FULL125PF //HX3918 full range cap = 1.25pf -#define FULL25PF //HX3918 full range cap = 2.5pf, 一般PAD大小默认这个. -//#define FULL375PF //HX3918 full range cap = 3.75 pf +//#define FULL25PF //HX3918 full range cap = 2.5pf, 一般PAD大小默认这个. +#define FULL375PF //HX3918 full range cap = 3.75 pf //#define FULL50PF //HX3918 full range cap = 5.0 pf //READ_DEVATION ,read offset 的偏差控制, 一个offset = 0.0586pf 按照不同量程, 对应的code, 留10%余量 @@ -81,6 +79,8 @@ #define READ_DEVATION 560 #elif defined(FULL375PF) #define READ_DEVATION 420 +#elif defined(FULL50PF) +#define READ_DEVATION 420 #endif @@ -98,19 +98,20 @@ typedef enum { } wear_mode_t; - +extern int32_t sar_wear_thres; +extern int32_t sar_unwear_thres; extern int16_t gdiff[2]; -extern int16_t lp[2]; -extern int16_t bl[2]; +extern int16_t glp[2]; +extern int16_t gbl[2]; extern int16_t nv_base_data[2]; extern int16_t nv_wear_offset[2]; #define FDSLEN 4 //flash 存储的长度 -extern int16_t fds_read[FDSLEN]; //flash 读 -extern int16_t fds_write[FDSLEN];//flash 写 +extern uint32_t fds_read[FDSLEN]; //flash 读 +extern uint32_t fds_write[FDSLEN];//flash 写 extern uint8_t wear_detect_mode; @@ -129,5 +130,8 @@ int16_t hx3918_read_diff_lp(uint8_t chx_diff); bool hx3918_get_wear_result(uint8_t ppg_wear); bool hx3918_prox_factory_init(void); void hx_set_wear_detect_mode(uint8_t current_mode); +int32_t hx90xx_get_prox_data(void); +void hx3918_cali_with_ir(int32_t infrared_data, int32_t ir_thres); +void hx3918_update_min_nv_data(int16_t min_data); #endif diff --git a/2.sdk/Helios_SDK/components/HX3918/hx3918_spo2_agc.c b/2.sdk/Helios_SDK/components/HX3918/hx3918_spo2_agc.c index 6e35e7b6..86f0c00e 100644 --- a/2.sdk/Helios_SDK/components/HX3918/hx3918_spo2_agc.c +++ b/2.sdk/Helios_SDK/components/HX3918/hx3918_spo2_agc.c @@ -9,7 +9,10 @@ #include "tyhx_spo2_alg.h" #include "tyhx_hrs_alg.h" //#include "tyhx_hrs_custom.h" +#ifdef SAR_ALG_LIB #include "hx3918_prox.h" +#endif + #ifdef SPO2_ALG_LIB extern const uint8_t hx3918_spo2_agc_green_idac; // 6,7,8... @@ -22,8 +25,7 @@ extern uint8_t low_vbat_flag; extern const uint8_t spo2_check_unwear_oft; extern const int32_t spo2_ir_wear_thres; -extern const int32_t sar_unwear_thres; -extern const int32_t sar_wear_thres; + extern uint8_t read_fifo_first_flg; static uint8_t s_ppg_state = 0; @@ -227,7 +229,11 @@ void Restart_Spo2_PPG_Calibration_Routine(SPO2_CAL_SET_T *calR) bool hx3918_spo2_check_unwear(void) { - if(calReg.ir_idac < spo2_check_unwear_oft) + int16_t sar_data = 32767; +#ifdef SAR_ALG_LIB + sar_data = hx90xx_get_prox_data(); +#endif + if(calReg.ir_idac < spo2_check_unwear_oft || sar_data < sar_unwear_thres) { spo2_wear_status = MSG_SPO2_NO_WEAR; if(spo2_wear_status_pre != MSG_SPO2_NO_WEAR) @@ -242,7 +248,11 @@ bool hx3918_spo2_check_unwear(void) bool hx3918_spo2_check_wear(int32_t infrared_data) { - if(infrared_data > spo2_ir_wear_thres ) + int16_t sar_data = 32767; +#ifdef SAR_ALG_LIB + sar_data = hx90xx_get_prox_data(); +#endif + if(infrared_data > spo2_ir_wear_thres && sar_data > sar_wear_thres) { spo2_wear_status = MSG_SPO2_WEAR; @@ -480,7 +490,9 @@ void hx3918_spo2_cal_off(void) // 20200615 ericy afe cali offline hx3918_delay(5); hx3918_write_reg(0X4d, 0X00); //release hx3918_delay(5); //Delay for reset time - hx3918_prox_init(); +#ifdef SAR_ALG_LIB + hx3918_prox_reg_init(); +#endif read_fifo_first_flg = 1; } @@ -566,7 +578,9 @@ void hx3918_spo2_low_power(void) hx3918_delay(5); hx3918_write_reg(0X4d, 0X00); //release hx3918_delay(5); - hx3918_prox_init(); +#ifdef SAR_ALG_LIB + hx3918_prox_reg_init(); +#endif read_fifo_first_flg = 1; AGC_LOG(" chip go to low power mode \r\n" ); } diff --git a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modHsensor_HX3918.c b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modHsensor_HX3918.c index 0b9b16cf..8875b2bc 100644 --- a/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modHsensor_HX3918.c +++ b/2.sdk/Helios_SDK/services/microPython/ports/quectel/core/source/modHsensor_HX3918.c @@ -80,7 +80,7 @@ static uint32_t timer_Gsensor_count = 0; extern int SC7A20_init(void); extern signed char SL_SC7A20_PEDO_KCAL_WRIST_SLEEP_SWAY_L_ALGO(void); extern unsigned char Gsensor_init_flag ; - +void HX3918_restart(void); #endif int ir_wear = 0;//红外佩戴状态 int cap_wear = 1;//电容佩戴状态 @@ -111,7 +111,8 @@ void HX3918_thread_do(void) HX3918_close(); Helios_msleep(20); HX3918_jobs_mode = NULL_MODE; - } + }else + HX3918_restart(); HX3918_test(HX3918_run_mode); HX3918_jobs_mode = HX3918_run_mode; HX3918_run_mode = NULL_MODE; @@ -203,7 +204,10 @@ void HX3918_result_set_heart_rate(unsigned char heart_rate) } void HX3918_result_set_wear_status(unsigned char wear_status) { - s_HX3918_wear_status = wear_status; + if(wear_status != 1) + s_HX3918_wear_status = 0; + else + s_HX3918_wear_status = 1; //HX3918_LOG("s_HX3918_wear_status:%d !!!!!!!!!!!!!!!!!\n\n\n",s_HX3918_wear_status); } void HX3918_result_set_blood_oxygen(unsigned char blood_oxygen) @@ -260,10 +264,11 @@ STATIC mp_obj_t mp_HX3918_deinit(mp_obj_t self_in); - void sensor_timerout_cb(void) { - timer_Gsensor_count++; + + if(timer_Gsensor_count < 65536) + timer_Gsensor_count++; } void HX3918_irq_cb(void) { @@ -465,17 +470,14 @@ void HX3918_close(void) } } is_open_HX3918 = 0; - // Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_LOW); - // Helios_msleep(15); - // Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_HIGH); - // Helios_msleep(20); + HX3918_restart(); hx3918_init(WEAR_MODE);//打开佩戴检测 } void HX3918_restart(void) { Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_LOW); - Helios_msleep(150); + Helios_msleep(50); Helios_GPIO_SetLevel(g_HX3918->power, HELIOS_LVL_HIGH); Helios_msleep(50); } @@ -511,10 +513,7 @@ STATIC mp_obj_t mp_HX3918_get_hrv(mp_obj_t self_in) } // ir_wear = hx3918_get_wear_ppg_Int_handle(); // cap_wear = hx3918_report_prox_status(); -//lp[0],bl[0],lp[1],bl[1],gdiff[0] -extern int16_t lp[2] ; -extern int16_t bl[2]; -extern int16_t gdiff[2]; + //获取佩戴状态 STATIC mp_obj_t mp_HX3918_get_wear(mp_obj_t self_in) { @@ -540,10 +539,14 @@ extern factory_result_t factory_reslts; // extern int16_t prox_factory_lp[2] ; extern int16_t nv_wear_offset[2] ; // 芯片产测校准的两个通道的OFFSET值, 值记录在fash里面 extern int16_t nv_base_data[2]; // 芯片产测校准的两个通道的对空LP值, 值记录在flash里面 +//lp[0],bl[0],lp[1],bl[1],gdiff[0] +extern int16_t glp[2] ; +extern int16_t gbl[2]; +extern int16_t gdiff[2]; STATIC mp_obj_t mp_HX3918_get_test_data(mp_obj_t self_in) { mp_obj_t coordinate_list[15] = {mp_obj_new_int((int)factory_reslts.green_data_final),mp_obj_new_int((int)factory_reslts.red_data_final),mp_obj_new_int((int)factory_reslts.ir_data_final), - mp_obj_new_int((int)ir_wear),mp_obj_new_int((int)cap_wear),mp_obj_new_int((int)lp[0]),mp_obj_new_int((int)bl[0]),mp_obj_new_int((int)lp[1]),mp_obj_new_int((int)bl[1]), + mp_obj_new_int((int)ir_wear),mp_obj_new_int((int)cap_wear),mp_obj_new_int((int)glp[0]),mp_obj_new_int((int)gbl[0]),mp_obj_new_int((int)glp[1]),mp_obj_new_int((int)gbl[1]), mp_obj_new_int((int)(gdiff[0])),mp_obj_new_int((int)(gdiff[1])),mp_obj_new_int((int)nv_wear_offset[0]),mp_obj_new_int((int)nv_wear_offset[1]),mp_obj_new_int((int)nv_base_data[0]), mp_obj_new_int((int)nv_base_data[1]), }; diff --git a/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/EventMesh.py b/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/EventMesh.py index ff0911de..cc684061 100644 --- a/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/EventMesh.py +++ b/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/EventMesh.py @@ -78,6 +78,20 @@ def set_log(log_adapter): def add_filter(flt): event_store.add_filter(flt) +Txt_Log = 1 +def txt_log(data): + if Txt_Log != 0 : + print(data) + try: + f_stat = uos.stat("ext/log.txt") + if f_stat[6] >50*1024: + uos.remove("ext/log.txt") + except Exception as e: + usys.print_exception(e) + with open("/ext/log.txt","a",encoding="utf-8") as fd: + d_time = utime.localtime() + data_tmp = "%02d-%02d %02d:%02d:%02d :"%(d_time[1],d_time[2],d_time[3],d_time[4],d_time[5]) + fd.write(data_tmp+data+"\n") def callback_wrapper(callback):#按键回调 def wrapped_callback(*args, **kwargs): diff --git a/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/appFactoryMode.py b/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/appFactoryMode.py index a5847930..c09894c7 100644 --- a/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/appFactoryMode.py +++ b/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/appFactoryMode.py @@ -10,6 +10,7 @@ from machine import Pin from ui import style_screen,style_font_youyuan_20,style_btn,style_img,Screen,style_contact_btn import audio import utime +import usys from misc import Power factorymode_cont_y = 0 factorymode_screen = lv.obj() @@ -211,6 +212,7 @@ class FactoryModeLocationScreen(Screen): if rmc_tmp[2] == 'A': if self.GNSS_status == 0: self.time_GNSS = time_tmp-self.time_count + EventMesh.txt_log("test location time:{}".format(self.time_GNSS)) self.GNSS_status = 1 else: self.GNSS_status = 0 @@ -233,19 +235,29 @@ class FactoryModeLocationScreen(Screen): if len(gsv_tmp)-i < 4: break count = 0 - for key in GSV_dict : - #print("GSV_dict[key]:len:{}".format(len(GSV_dict[key]))) - if len(GSV_dict[key]) >= 1 : - GNSS_DATA+=" {:<3}:[{:<3}] \n".format(key,GSV_dict[key])#:<3 宽度为3左对齐 - count+=1 - if count > 14: - break - print("GxGSV:{}".format(GNSS_DATA)) + try: + for j in range(200): + for key in GSV_dict : + + if(int(key) != j): + continue + #print("GSV_dict[key]:len:{}".format(len(GSV_dict[key]))) + if len(GSV_dict[key]) >= 1 : + GNSS_DATA+="{:<3}:[{:<3}]".format(key,GSV_dict[key])#:<3 宽度为3左对齐 + count+=1 + if count % 2 == 0: + GNSS_DATA+="\n" + + if count > 30: + break + except Exception as e: + usys.print_exception(e) + #print("GxGSV:{}".format(GNSS_DATA)) _DATA += GNSS_DATA #FactoryModeLocation_GNSS_label.set_text(GNSS_DATA) if msg[1] != [] : #WIFI WIFI_len = len(msg[1][1]) - _DATA += "WIFI:------\n" + _DATA += "\nWIFI:------\n" if WIFI_len > 3: WIFI_len = 3 for i in range(WIFI_len) : diff --git a/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/lcd.py b/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/lcd.py index 29c2e716..0c3ef155 100644 --- a/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/lcd.py +++ b/2.sdk/project/K01/sdk/services/microPython/ports/quectel/core/lcd.py @@ -11,6 +11,8 @@ init_data = ( 0, 0, 0xfe, 0, 0, 0xEF, + 0, 0, 0x21, + 0, 1, 0x36, 1, 1, 0xd8, @@ -21,7 +23,7 @@ init_data = ( 1, 1, 0x00, 0, 1, 0xA8, - 1, 1, 0x0c, + 1, 1, 0x22, 0, 1, 0xB4, 1, 1, 0x00, @@ -36,7 +38,7 @@ init_data = ( 1, 1, 0x2F, 0, 1, 0xB3, - 1, 1, 0x03, + 1, 1, 0x13, 0, 1, 0xB6, 1, 1, 0x19, @@ -48,18 +50,18 @@ init_data = ( 1, 1, 0xC8, 0, 1, 0xAB, - 1, 1, 0x07, + 1, 1, 0x0f, 0, 1, 0xb8, 1, 1, 0x08, 0, 1, 0xE8, - 1, 1, 0x20, + 1, 1, 0x27, 2, 0, 12, 0, 1, 0xE9, - 1, 1, 0x44, + 1, 1, 0x47, 0, 1, 0xea, 1, 1, 0x44, @@ -67,8 +69,8 @@ init_data = ( 0, 1, 0xeb, 1, 1, 0xb0, - 0, 1, 0xed, - 1, 1, 0x03, + # 0, 1, 0xed, + # 1, 1, 0x03, 0, 1, 0x44, 1, 1, 0x00, @@ -76,40 +78,44 @@ init_data = ( 0, 1, 0xc7, - 1, 1, 0x10, + 1, 1, 0x1D, 0, 14, 0xF0, 1, 1, 0x0F, + 1, 1, 0x24, + 1, 1, 0x2c, + 1, 1, 0x38, + 1, 1, 0x67, + 1, 1, 0x39, 1, 1, 0x20, - 1, 1, 0x25, - 1, 1, 0x35, - 1, 1, 0x26, - 1, 1, 0x3f, - 1, 1, 0x30, 1, 1, 0x60, - 1, 1, 0x26, - 1, 1, 0x03, - 1, 1, 0x00, - 1, 1, 0x09, - 1, 1, 0x13, - 1, 1, 0x1a, + 1, 1, 0x04, + 1, 1, 0x14, + 1, 1, 0x10, + 1, 1, 0x10, + 1, 1, 0x0c, + 1, 1, 0x1f, 0, 14, 0xF1, - 1, 1, 0x00, - 1, 1, 0x28, - 1, 1, 0x7f, - 1, 1, 0x39, - 1, 1, 0xa5, - 1, 1, 0x0f, - 1, 1, 0x30, + 1, 1, 0x1f, + 1, 1, 0x38, + 1, 1, 0x3f, + 1, 1, 0x4f, + 1, 1, 0xd7, + 1, 1, 0x24, + 1, 1, 0x3f, 1, 1, 0x60, 1, 1, 0x00, - 1, 1, 0x05, - 1, 1, 0x01, - 1, 1, 0x0f, - 1, 1, 0x0f, + 1, 1, 0x03, + 1, 1, 0x09, + 1, 1, 0x14, + 1, 1, 0x10, 1, 1, 0x1F, - + + 0, 3, 0xf4, + 1, 1, 0x00, + 1, 1, 0x00, + 1, 1, 0xff, 0, 0, 0x11, 2, 0, 120, diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/EventMesh.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/EventMesh.py index f9cb2419..84c8fc71 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/EventMesh.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/EventMesh.py @@ -79,9 +79,17 @@ def set_log(log_adapter): def add_filter(flt): event_store.add_filter(flt) import utime +import uos Txt_Log = 1 def txt_log(data): if Txt_Log != 0 : + print(data) + try: + f_stat = uos.stat("ext/log.txt") + if f_stat[6] >50*1024: + uos.remove("ext/log.txt") + except Exception as e: + usys.print_exception(e) with open("/ext/log.txt","a",encoding="utf-8") as fd: d_time = utime.localtime() data_tmp = "%02d-%02d %02d:%02d:%02d :"%(d_time[1],d_time[2],d_time[3],d_time[4],d_time[5]) diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/Makefile b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/Makefile index 1d3bc08b..b1c37b7a 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/Makefile +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/Makefile @@ -951,7 +951,6 @@ frozen_mpy_list = $(BUILD)/_boot.mpy \ $(BUILD)/uping.mpy \ $(BUILD)/ymodem.mpy \ $(BUILD)/alarm.mpy \ - $(BUILD)/appAlipay.mpy \ $(BUILD)/appFactoryMode.mpy \ $(BUILD)/appWechat.mpy \ $(BUILD)/btn_device_ec800m.mpy \ diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/alarm.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/alarm.py index 2eb91c5e..bfd119e2 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/alarm.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/alarm.py @@ -409,7 +409,7 @@ class ClockManager(Abstract): self.rtc = RTC() self.days = 0 self.idx = 0 - + self.rtc.enable_alarm(1) IFEXIST = ql_fs.path_exists("/ext/static/storage_file/alarm_msg.json") self.check_alarm_list = [] if IFEXIST == True: diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py index cf7b03c6..48e10c50 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/appFactoryMode.py @@ -108,17 +108,17 @@ factorymode_log_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.S factorymode_log_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) factorymode_log.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) -factorymode_cont_y+=200 -factorymode_alipay_init = lv.btn(factorymode_cont) -factorymode_alipay_init.set_pos(0, factorymode_cont_y) -factorymode_alipay_init.set_size(240, 60) -factorymode_alipay_init_label = lv.label(factorymode_alipay_init) -factorymode_alipay_init_label.set_text("支付宝初始化") -factorymode_alipay_init.set_style_pad_all(0, lv.STATE.DEFAULT) -factorymode_alipay_init_label.align(lv.ALIGN.LEFT_MID, 70, 0) -factorymode_alipay_init_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) -factorymode_alipay_init_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -factorymode_alipay_init.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) +# factorymode_cont_y+=200 +# factorymode_alipay_init = lv.btn(factorymode_cont) +# factorymode_alipay_init.set_pos(0, factorymode_cont_y) +# factorymode_alipay_init.set_size(240, 60) +# factorymode_alipay_init_label = lv.label(factorymode_alipay_init) +# factorymode_alipay_init_label.set_text("支付宝初始化") +# factorymode_alipay_init.set_style_pad_all(0, lv.STATE.DEFAULT) +# factorymode_alipay_init_label.align(lv.ALIGN.LEFT_MID, 70, 0) +# factorymode_alipay_init_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +# factorymode_alipay_init_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +# factorymode_alipay_init.add_style(style_btn, lv.PART.MAIN | lv.STATE.DEFAULT) class FactoryModeScreen(Screen): @@ -127,7 +127,7 @@ class FactoryModeScreen(Screen): super().__init__() self.meta = factorymode_screen factorymode_location.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "FactoryModeLocation"})), lv.EVENT.CLICKED, None) - factorymode_alipay_init.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "FactoryModeAlipayInit"})), lv.EVENT.CLICKED, None) + #factorymode_alipay_init.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "FactoryModeAlipayInit"})), lv.EVENT.CLICKED, None) factorymode_bat_test.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "FactoryModeBatTest"})), lv.EVENT.CLICKED, None) factorymode_hsensor_test.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "FactoryModeHsensorTest"})), lv.EVENT.CLICKED, None) factorymode_log.add_event_cb(lambda e: EventMesh.callback_wrapper(self.load_screen(e, {"screen": "FactoryModeLog"})), lv.EVENT.CLICKED, None) @@ -298,6 +298,7 @@ class FactoryModeHsensorTestScreen(Screen): self.hsensorTest_timer.start(1000,1,self.hsensorTest_timer_cb) if self.Hsensor == None: self.Hsensor = EventMesh.publish("get_Hsensor") + #EventMesh.publish(constants.EVENT.START_BLOOD_OXYGEN) def post_processor_after_initialization(self): pass @@ -333,6 +334,7 @@ class FactoryModeHsensorTestScreen(Screen): def Close(self): self.hsensorTest_timer.stop() + #EventMesh.publish(constants.EVENT.STOP_BLOOD_OXYGEN) pass def done_return(self): @@ -392,46 +394,46 @@ class FactoryModeBatTestScreen(Screen): EventMesh.publish("load_screen", {"screen": "main_menu"}) -FactoryModeAlipayInit_screen = lv.obj() -FactoryModeAlipayInit_screen.center() -FactoryModeAlipayInit_screen.set_size(240, 320) -FactoryModeAlipayInit_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) - -FactoryModeAlipayInit_label = lv.label(FactoryModeAlipayInit_screen) -FactoryModeAlipayInit_label.set_text("支付宝初始化成功") -FactoryModeAlipayInit_label.set_size(240, 100) -FactoryModeAlipayInit_label.set_pos(50, 100) -FactoryModeAlipayInit_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) -FactoryModeAlipayInit_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) -import atcmd - -class FactoryModeAlipayInitScreen(Screen): - NAME = "FactoryModeAlipayInit" - def __init__(self): - super().__init__() - self.meta = FactoryModeAlipayInit_screen +# FactoryModeAlipayInit_screen = lv.obj() +# FactoryModeAlipayInit_screen.center() +# FactoryModeAlipayInit_screen.set_size(240, 320) +# FactoryModeAlipayInit_screen.add_style(style_screen, lv.PART.MAIN | lv.STATE.DEFAULT) + +# FactoryModeAlipayInit_label = lv.label(FactoryModeAlipayInit_screen) +# FactoryModeAlipayInit_label.set_text("支付宝初始化成功") +# FactoryModeAlipayInit_label.set_size(240, 100) +# FactoryModeAlipayInit_label.set_pos(50, 100) +# FactoryModeAlipayInit_label.set_style_text_color(lv.color_make(0xff, 0xff, 0xff), lv.STATE.DEFAULT) +# FactoryModeAlipayInit_label.add_style(style_font_youyuan_20, lv.PART.MAIN | lv.STATE.DEFAULT) +# import atcmd + +# class FactoryModeAlipayInitScreen(Screen): +# NAME = "FactoryModeAlipayInit" +# def __init__(self): +# super().__init__() +# self.meta = FactoryModeAlipayInit_screen - def initialization(self): - ret =EventMesh.publish("id2_clean_data") - print("id2_clean_data:ret:{}".format(ret)) - - def post_processor_after_initialization(self): - resp=bytearray(50) - atcmd.sendSync('AT+RSTSET\r\n',resp,'',200) #清nv - print("AT+RSTSET:{}".format(resp)) - utime.sleep(5) - Power.powerRestart() - def Close(self): - pass - - def done_return(self): - EventMesh.publish("load_screen", {"screen": "factorymode"}) - - def btn1_release(self): - EventMesh.publish("load_screen", {"screen": "factorymode"}) +# def initialization(self): +# ret =EventMesh.publish("id2_clean_data") +# print("id2_clean_data:ret:{}".format(ret)) + +# def post_processor_after_initialization(self): +# resp=bytearray(50) +# atcmd.sendSync('AT+RSTSET\r\n',resp,'',200) #清nv +# print("AT+RSTSET:{}".format(resp)) +# utime.sleep(5) +# Power.powerRestart() +# def Close(self): +# pass + +# def done_return(self): +# EventMesh.publish("load_screen", {"screen": "factorymode"}) + +# def btn1_release(self): +# EventMesh.publish("load_screen", {"screen": "factorymode"}) - def btn8_press(self): - EventMesh.publish("load_screen", {"screen": "main_menu"}) +# def btn8_press(self): +# EventMesh.publish("load_screen", {"screen": "main_menu"}) FactoryModeLocation_screen = lv.obj() print("FactoryModeLocation_screen") @@ -471,7 +473,7 @@ class FactoryModeLocationScreen(Screen): self.time_count = 0 self.time_GNSS = 0 self.GNSS_status = 0 - + self.timer_c = 0 def initialization(self): FactoryModeLocation_GNSS_label.set_text("GNSS:\n") # FactoryModeLocation_WIFI_label.set_text("WIFI:") @@ -485,7 +487,14 @@ class FactoryModeLocationScreen(Screen): EventMesh.publish(constants.EVENT.START_LOCATION_TEST) #测试模式 def timer_FactoryModeLocation_cb(self, *args, **kwargs): - EventMesh.publish("system_sleep_rest")#防止黑屏 + EventMesh.publish("system_sleep_rest")#防止黑屏 + self.timer_c += 1 + if self.timer_c >= 5: + get_location_flag = EventMesh.publish("get_location_flag") + self.timer_c = 0 + if get_location_flag != None: + if(get_location_flag == 0): + EventMesh.publish(constants.EVENT.START_LOCATION_TEST) #测试模式 def GET_LOCATION_DATA(self, event, msg): # print("GPS:{}".format(msg[0])) @@ -499,7 +508,7 @@ class FactoryModeLocationScreen(Screen): if len(msg[0]) > 1 : #GPS GNSS_DATA = "GNSS:------\n" - _DATA += "定位时间:{};{}秒\n".format(self.time_GNSS,time_tmp-self.time_count) + rmc_data = msg[0][1].split("RMC") gsv_data = msg[0][1].split("GSV") if len(rmc_data) >= 2 : @@ -511,11 +520,13 @@ class FactoryModeLocationScreen(Screen): if self.GNSS_status == 0: self.time_GNSS = time_tmp-self.time_count EventMesh.txt_log("test location time:{}".format(self.time_GNSS)) + + self.time_count = utime.mktime(utime.localtime()) self.GNSS_status = 1 else: self.GNSS_status = 0 - self.time_GNSS = 0 - + #self.time_GNSS = 0 + _DATA += "定位时间:{};{}秒\n".format(self.time_GNSS,time_tmp-self.time_count) if len(gsv_data) >= 2 : gsv_data = gsv_data[1:] GSV_dict= {} @@ -566,7 +577,8 @@ class FactoryModeLocationScreen(Screen): _DATA += "CALL:------\n{}".format(msg[2][0]) #FactoryModeLocation_CALL_label.set_text("CALL:{}".format(msg[2][0])) print("GET_LOCATION_DATA:data:{}".format(_DATA)) - FactoryModeLocation_GNSS_label.set_text(_DATA) + FactoryModeLocation_GNSS_label.set_text(_DATA) + self.timer_c = 0 def Close(self): EventMesh.publish(constants.EVENT.CLOSE_LOCATION) self.timer_FactoryModeLocation.stop() diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main_init.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main_init.py index 4385c7fe..12972a0a 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main_init.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/main_init.py @@ -64,7 +64,7 @@ def main_init(): from ui_main_menu import MainMenuScreen # from ui_WatchFaceScreen import WatchFaceScreen - from appFactoryMode import FactoryModeLocationScreen,FactoryModeScreen ,FactoryModeAlipayInitScreen,FactoryModeBatTestScreen,FactoryModeHsensorTestScreen,FactoryModeLogScreen + from appFactoryMode import FactoryModeLocationScreen,FactoryModeScreen ,FactoryModeBatTestScreen,FactoryModeHsensorTestScreen,FactoryModeLogScreen from mgr import setSmsIndexManager,ConfigStoreManager,testSmsSetIPManager,playPowerAudioManager,sosInfoCallManager,getBootOffManager,getSosFlagManager,CountdownManager, LocationManager, getVolumSizeManager,gethistoryDataManager,getUpLoadDataManager, getplayAudiodStateManager,\ AddrBookManager,MsgdetailManager,PhoneCallingManager,getOldTimeManager,getStorageDataManager,getBrightnessManager,getHrTimeManager,getTempTimeManager,getLowBatManager @@ -139,20 +139,22 @@ def main_init(): ui.add_screen(_ui.CallLogScreen()) except Exception as e: usys.print_exception(e) - try: - from appAlipay import Alipay ,AlipayOpenScreen,Alipay_1_1,Alipay_invite,Alipay_inviting,\ - Alipay_success,Alipay_paycode,Alipay_pay_success,Alipay_collect,Alipay_parent - ui.add_screen(AlipayOpenScreen()) - ui.add_screen(Alipay_1_1()) - ui.add_screen(Alipay_invite()) - ui.add_screen(Alipay_inviting()) - ui.add_screen(Alipay_success()) - ui.add_screen(Alipay_paycode()) - ui.add_screen(Alipay_pay_success()) - ui.add_screen(Alipay_collect()) - ui.add_screen(Alipay_parent()) - except Exception as e: - usys.print_exception(e) + # try: + # from appAlipay import Alipay ,AlipayOpenScreen,Alipay_1_1,Alipay_invite,Alipay_inviting,\ + # Alipay_success,Alipay_paycode,Alipay_pay_success,Alipay_collect,Alipay_parent + # from appFactoryMode import FactoryModeAlipayInitScreen, + # ui.add_screen(AlipayOpenScreen()) + # ui.add_screen(Alipay_1_1()) + # ui.add_screen(Alipay_invite()) + # ui.add_screen(Alipay_inviting()) + # ui.add_screen(Alipay_success()) + # ui.add_screen(Alipay_paycode()) + # ui.add_screen(Alipay_pay_success()) + # ui.add_screen(Alipay_collect()) + # ui.add_screen(Alipay_parent()) + # ui.add_screen(FactoryModeAlipayInitScreen()) + # except Exception as e: + # usys.print_exception(e) try: ui.add_screen(_ui.UIFINDScreen()) ui.add_screen(_ui.MsgDetailScreen()) @@ -165,7 +167,7 @@ def main_init(): try: ui.add_screen(FactoryModeLocationScreen()) ui.add_screen(FactoryModeScreen()) - ui.add_screen(FactoryModeAlipayInitScreen()) + ui.add_screen(FactoryModeBatTestScreen()) ui.add_screen(FactoryModeHsensorTestScreen()) ui.add_screen(FactoryModeLogScreen()) @@ -189,7 +191,7 @@ def main_init(): ui.add_screen(_ui.chargeInScreen()) ui.add_screen(_ui.chargeOutScreen()) ui.add_screen(_ui.restore_confirmScreen()) - ui.add_screen(_ui.calendar_Screen()) + ui.add_screen(NewWechatPopupScreen()) ui.add_screen(HealthScreen()) # ui.add_screen(_ui.Setting3Screen()) @@ -228,7 +230,7 @@ def main_init(): # .append_manager(mgr.StopwatchManager()) \ # .append_manager(mgr.CountdownManager()) \ app.append_manager(playPowerAudioManager()) - app.append_manager(Alipay()) + #app.append_manager(Alipay()) app.append_manager(ConfigStoreManager()) app.append_manager(NetManager()) app.append_manager(LocationManager()) diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py index e4a3665a..f472c2f9 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/mgr.py @@ -831,11 +831,13 @@ class DeviceInfoManager(Abstract): EventMesh.publish("countdown_end_cb") """定时检查是否关闭gps失败""" - gnss_state = quecgnss.get_state() - get_location_flag = EventMesh.publish("get_location_flag") - if get_location_flag != None: - if gnss_state == 2 and get_location_flag == 0: - EventMesh.publish(constants.EVENT.GPSCLOSE) + # gnss_state = quecgnss.get_state() + # get_location_flag = EventMesh.publish("get_location_flag") + # if get_location_flag != None: + # # if gnss_state == 2 and get_location_flag == 0: + # # EventMesh.publish(constants.EVENT.GPSCLOSE) + # if(get_location_flag == 0): + # EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位 """7分钟一次心跳""" if math.fabs(time_tmp - self.KA_time) > 7*60: #7分钟一次心跳 @@ -853,8 +855,11 @@ class DeviceInfoManager(Abstract): if EventMesh.publish(constants.EVENT.GET_CONNECT) == 1 and status_tmp > 3 : EventMesh.publish(constants.EVENT.START_LOCATION,constants.PROTOCOL.UD_SEND) #开始UD定位 self.gsensor.clean_status()#清除运动次数 + else : #关闭定位 + EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 EventMesh.publish(constants.EVENT.PUSH_STEP, self.get_step_count()) + """电池平均值""" temp = Power.getVbatt() if self.bat_count < 10: @@ -1798,8 +1803,7 @@ class LocationManager(Abstract): self.location_type = 0 #定位类型,0:正常定位,有gps数据或60秒关闭;1:测试模式,只有发CLOSE_LOCATION消息才关闭 self.location_flag = 0 self.start_location_flag = 0 - self.location_thread_id = 0 - self.location_thread_id = _thread.start_new_thread(self.location_thread, ()) + self.location_thread_id = 0 self.location_queue = Queue(100) #quecgnss.init() #quecgnss.gnssEnable(0) @@ -1841,33 +1845,32 @@ class LocationManager(Abstract): def start_location(self, event, msg): self.location_queue.put(msg)#测试类型入队 print("start_location:{}".format(msg)) - self.timer_read_GPS_info.start(1000, 1, self.location_timer) + self.location_timer_count = 0 if( self.location_flag == 1): return - self.location_timer_count = 0 + self.location_thread_id = _thread.start_new_thread(self.location_thread, ()) self.location_flag = 1 #self.gps_open(event, msg) - self.start_location_flag = 1 def start_location_test(self, event, msg): print("start_location_test") - self.timer_read_GPS_info.start(1000, 1, self.location_timer) + + self.location_type = 1 if( self.location_flag == 1): return + self.location_thread_id = _thread.start_new_thread(self.location_thread, ()) self.location_timer_count = 0 self.location_flag = 1 #self.gps_open(event, msg) self.location_type = 1 - self.start_location_flag = 1 + def close_location(self, event, msg): self.location_flag = 0 self.location_type = 0 - self.gps.power_switch(0) - wifiScan.control(0) - self.timer_read_GPS_info.stop() + def WIFI_INFO(self, event, msg): self.wifi_data = msg @@ -1902,6 +1905,7 @@ class LocationManager(Abstract): #print("Location_send1") date = "{:04d}{:02d}{:02d},{:02d}{:02d}{:02d}".format(*utime.localtime()[0:6]) date = date[2:] + #date = "180916,025723" GPS_type = "V" latitude = "0.000000,N" longitude = "0.000000,E" @@ -1909,7 +1913,8 @@ class LocationManager(Abstract): direction = "0.0" high = "100.0" number = "0" - if msg[0] != [] :#有GPS数据 + precision = "24" + if msg[0] :#有GPS数据 GPS_type = "A" # 纬度 latitude = msg[0]["latitude"] @@ -1928,6 +1933,8 @@ class LocationManager(Abstract): high = "%s"%(high_tmp[0]) # 讯号质量:搜索到的卫星数目 number = msg[0]["number"] + precision = msg[0]["precision"] + #date = msg[0]["date"] #gsm 信号强度 gsm_sig = str((100//31)*EventMesh.publish("screen_get_sig")) # 电池电量百分比 @@ -1987,6 +1994,7 @@ class LocationManager(Abstract): send_data += ",%s,%s,%s"%(battery_caption,step,turn_count) send_data += ",%s,%d,%s"%(state,CELL_num,CELL_data) send_data += ",%d,%s"%(WIFI_num,WIFI_data) + send_data+=",%s"%(precision) #print("Location_send2:{} q_size:{}".format(send_data,self.location_queue.size())) while True: if self.location_queue.empty() == False: @@ -1999,134 +2007,176 @@ class LocationManager(Abstract): def location_thread(self): - gnss_r_data = "" - while True: + self.wifi_data = [] + self.gps_data = {} + self.cell_data = [] + gnss_r_data = [] + self.GSV_sig_ok_count = 0 + self.GGA_count = 0 + + print("location_thread:1") + EventMesh.publish(constants.EVENT.GPSOPEN) + print("location_thread:2") + self.timer_read_GPS_info.start(1000, 1, self.location_timer) + #utime.sleep_ms(1000) + self.location_timer_count = 0 + #quecgnss.read(4096)#去掉第一次错误数据 + #EventMesh.txt_log("START_LOCATION") + while self.location_flag == 1: try : - if self.location_flag == 1 : + + match_gga_data = [] + #match_gsv_data = [] + gnss_r_data = [] + if self.location_check_data_timer_count > 3 :#3秒查一次基站数据和wifi数据 + self.location_check_data_timer_count = 0 + #print(self.location_timer_count) + #GSV_dict= {} - if self.start_location_flag == 1 : - self.start_location_flag = 0 - self.wifi_data = [] - self.gps_data = [] - self.cell_data = [] - gnss_r_data = [] - print("location_thread:1") - EventMesh.publish(constants.EVENT.GPSOPEN) - print("location_thread:2") - EventMesh.publish(constants.EVENT.WIFISCANOPEN) - print("location_thread:3") - utime.sleep_ms(1000) - self.location_timer_count - #quecgnss.read(4096)#去掉第一次错误数据 - match_gga_data = [] - #match_gsv_data = [] - gnss_r_data = [] - if self.location_check_data_timer_count > 3 :#5秒查一次基站数据和wifi数据 - self.location_check_data_timer_count = 0 - #print(self.location_timer_count) - GSV_dict= {} - GSV_sig_ok_count = 0 - #检查GNSS数据 - if (self.gps_data == [] or self.location_type == 1) and quecgnss.get_state() == 2: - self.gps.__gps_nmea_data_clean() - #gnss_r_data = [0,1] - gnss_r_data = quecgnss.read(4096) - #print("location gnss_r_data:{}".format(gnss_r_data[1].decode())) - print("gnss_r_data len:{}".format(gnss_r_data[0])) - if gnss_r_data[0] > 0 : #有数据 - gsv_data = gnss_r_data[1].split("GSV") - if len(gsv_data) >= 2 : - gsv_data = gsv_data[1:] - for i in range(len(gsv_data)) : - gsv_data[i] = gsv_data[i].split("\r\n")[0] - gsv_tmp = gsv_data[i].split(",") - if len(gsv_tmp) < 7 : - break - gsv_tmp = gsv_tmp[4:] - #print("gsv_tmp:{}".format(gsv_tmp)) - for i in range(len(gsv_tmp)) : - if i % 4 == 0: - GSV_dict[gsv_tmp[i]] = gsv_tmp[i+3] - try: - #print("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3])) - if gsv_tmp[i+3] != "" : - if int(gsv_tmp[i+3])>=24: - GSV_sig_ok_count+=1 - except Exception as e: - usys.print_exception(e) - #print("GSV_dict:{}:[{}]".format(gsv_tmp[i],gsv_tmp[i+3])) - if len(gsv_tmp)-i < 4: - break - #match_gga_data = self.match.GxGGA(gnss_r_data[1]).split(",") - #match_gsv_data = self.match.GxGSV(gnss_r_data[1]).split(",") - if self.gps.__check_gps_valid(gnss_r_data[1].decode()): #数据齐全 - match_gmc_data = self.match.GxRMC(gnss_r_data[1]).split(",") + #检查GNSS数据 + if (self.gps_data == {} or self.location_type == 1) and quecgnss.get_state() == 2: + self.gps.__gps_nmea_data_clean() + #gnss_r_data = [0,1] + gnss_r_data = quecgnss.read(4096) + print("location gnss_r_data:\n{}".format(gnss_r_data[1].decode())) + #print("gnss_r_data len:{}".format(gnss_r_data[0])) + if gnss_r_data[0] > 0 : #有数据 + tmp_ok_count = 0 + gsv_data = gnss_r_data[1].split("GSV") + if len(gsv_data) >= 2 : + gsv_data = gsv_data[1:] + for i in range(len(gsv_data)) : + gsv_data[i] = gsv_data[i].split("\r\n")[0] + gsv_tmp = gsv_data[i].split(",") + if len(gsv_tmp) < 7 : + break + #self.GGA_count = int(gsv_tmp[3]) + + gsv_tmp = gsv_tmp[4:] + #print("gsv_tmp:{}".format(gsv_tmp)) + for i in range(len(gsv_tmp)) : + if i % 4 == 0: + #GSV_dict[gsv_tmp[i]] = gsv_tmp[i+3] + try: + #print("gsv_tmp[i+3]:{}".format(gsv_tmp[i+3])) + if gsv_tmp[i+3] != "" : + if int(gsv_tmp[i+3])>=25: + tmp_ok_count +=1 + except Exception as e: + usys.print_exception(e) + #print("GSV_dict:{}:[{}]".format(gsv_tmp[i],gsv_tmp[i+3])) + if len(gsv_tmp)-i < 4: + break + + if(tmp_ok_count > self.GSV_sig_ok_count ): + self.GSV_sig_ok_count = tmp_ok_count + #print("GGA_count:{} GSV_sig_ok_coun:{}".format(self.GGA_count,self.GSV_sig_ok_count)) + match_gga_data = self.match.GxGGA(gnss_r_data[1]).split(",") + + if len(match_gga_data) > 8: + #print(match_gga_data) + self.GGA_count = int(match_gga_data[7]) #可用微信 + print("GGA_count:{} GSV_sig_ok_coun:{} ".format(self.GGA_count,self.GSV_sig_ok_count)) + #match_gsv_data = self.match.GxGSV(gnss_r_data[1]).split(",") + match_rmc_data = self.match.GxRMC(gnss_r_data[1]).split(",") + #print("match_rmc_data:\n{}".format(match_rmc_data)) + if len (match_rmc_data)>3: #有rmc数据 + if match_rmc_data[2] == 'A': + + #match_rmc_data = self.match.GxRMC(gnss_r_data[1]).split(",") match_vtg_data = self.match.GxVTG(gnss_r_data[1]).split(",") - match_gga_data = self.match.GxGGA(gnss_r_data[1]).split(",") + if len(match_gga_data) < 8: + match_gga_data = self.match.GxGGA(gnss_r_data[1]).split(",") gps_data_tmp = self.gps.read_coordinates(gnss_r_data[1]) latitude_tmp = str(gps_data_tmp[1]).split(".") - if len(latitude_tmp) >= 2 and len(latitude_tmp[1])>=5: - latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:6]) - latitude = "%s,%s"%(latitude,match_gmc_data[4] ) - longitude_tmp = str(gps_data_tmp[0]).split(".") - if len(longitude_tmp) >= 2 and len(longitude_tmp[1])>=5: - longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6]) - longitude = "%s,%s"%(longitude,match_gmc_data[6] ) #match_gmc_data[6] + str(gnss_r_data[1]) - high = str(gps_data_tmp[2]) - self.gps_data = { - "latitude": latitude, - "longitude": longitude, - "high": high, - "direction": match_vtg_data[1], - "speed": match_vtg_data[5], - "number": match_gga_data[7], - } - #检查wifi数据 - if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0: - EventMesh.publish(constants.EVENT.WIFISCANOPEN) - - #检查基站数据 - if self.cell_data == []: - data_tmp = net.getCellInfo() - for cell in data_tmp: - if cell and cell[0][0] == 0 and len(cell[0]) > 1: - self.cell_data = cell - break - if self.location_timer_count >= 60*7 : #4分钟关闭 + if len(match_vtg_data)>5 and len(match_gga_data)>5 and len(latitude_tmp) >= 2: + + print("LOCATION_ok :time:{}!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n\n".format(self.location_timer_count)) + gps_date = "%s,%s"%(match_rmc_data[9],match_rmc_data[1][:6]) + latitude = "0" + if len(latitude_tmp[1])>=5: + latitude = "%s.%s"%(latitude_tmp[0],latitude_tmp[1][:5]) + latitude = "%s,%s"%(latitude,match_rmc_data[4] ) + longitude_tmp = str(gps_data_tmp[0]).split(".") + longitude = "0" + if len(longitude_tmp[1])>=5: + longitude = "%s.%s"%(longitude_tmp[0],longitude_tmp[1][:6]) + longitude = "%s,%s"%(longitude,match_rmc_data[6] ) #match_rmc_data[6] + str(gnss_r_data[1]) + high = str(gps_data_tmp[2]) + self.gps_data = { + "latitude": latitude, + "longitude": longitude, + "high": high, + "direction": match_vtg_data[1], + "speed": match_vtg_data[5], + "number": match_gga_data[7], + "date": gps_date, + "precision": match_gga_data[8] + } + #检查wifi数据 + if self.wifi_data == [] or (self.wifi_data != [] and self.wifi_data[0] == 0):#and self.wifi_data[0] <= 0: + EventMesh.publish(constants.EVENT.WIFISCANOPEN) + + #检查基站数据 + if self.cell_data == []: + data_tmp = net.getCellInfo() + if(len(data_tmp)>=2): + for cell in data_tmp: + if cell and cell[0][0] == 0 and len(cell[0]) > 1: + self.cell_data = cell + break + + if self.location_type == 1: #测试模式 + self.location_timer_count = 0 + if len(gnss_r_data) >= 1: + if gnss_r_data[0] > 0: + EventMesh.publish("PUSH_LOCATION_DATA", [gnss_r_data,self.wifi_data,self.cell_data]) + if self.gps_data != {} : #发送数据 EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 - #break - #EventMesh.txt_log("GSV_sig_ok_count :{}".format(GSV_sig_ok_count)) - if self.location_type == 1: #测试模式 - if len(gnss_r_data) >= 1: - if gnss_r_data[0] > 0: - EventMesh.publish("PUSH_LOCATION_DATA", [gnss_r_data,self.wifi_data,self.cell_data]) - elif self.location_type == 0: #正常模式 - if self.gps_data != [] or self.location_timer_count > 180: #or( self.wifi_data != [] and self.cell_data != []): - self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) + self.location_queue.put(constants.PROTOCOL.UD_SEND) + self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) + + + elif self.location_type == 0: #正常模式 + if self.gps_data != {} or self.location_timer_count > 170: #or( self.wifi_data != [] and self.cell_data != []): + upload_time = EventMesh.publish("get_upload_data") + if upload_time > 200 or self.gps_data != {} : #定位间隔小于3分钟且定位失败不关闭gps,不影响无信号判断 EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 - EventMesh.txt_log("CLOSE_LOCATION:location_timer_count:{}".format(self.location_timer_count)) - #break - - if len(GSV_dict) < 2 and GSV_sig_ok_count < 1 and self.wifi_data != [] and self.cell_data != [] and self.location_timer_count > 20: #超过20秒且卫星个数少于3 - self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) - EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 - EventMesh.txt_log("len(GSV_dict) < 2") - if GSV_sig_ok_count < 3 and self.wifi_data != [] and self.cell_data != [] and self.location_timer_count > 40: #超过40秒且信号大于30的不足3个 - self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) - EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 - EventMesh.txt_log("GSV_sig_ok_count < 3") - #break - utime.sleep_ms(1000) - #print("location_timer_count:{}".format(self.location_timer_count)) - else : - utime.sleep_ms(2000) + EventMesh.txt_log("CLOSE_LOCATION:timer:{} ok_count:{} count:{}".format(self.location_timer_count,self.GSV_sig_ok_count,self.GGA_count)) + self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) + + if self.GGA_count < 3 and self.wifi_data and self.cell_data and self.location_timer_count > 20 and self.location_timer_count < 30: #超过20秒且有效卫星个数少于3 + EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 + EventMesh.txt_log("GGA_count<3:timer:{} ok_count:{} count:{}".format(self.location_timer_count,self.GSV_sig_ok_count,self.GGA_count)) + self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) + + if self.GSV_sig_ok_count < 3 and self.wifi_data != [] and self.cell_data != [] and self.location_timer_count > 40: #超过40秒且信号大于30的不足3个 + EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 + EventMesh.txt_log("GSV_sig_ok_count<3:timer:{} ok_count:{} count:{}".format(self.location_timer_count,self.GSV_sig_ok_count,self.GGA_count)) + self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) + #break + # if self.location_type != 1 and self.location_timer_count >= 60*4 : #4分钟关闭 + # EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 + #break + #EventMesh.txt_log("self.GSV_sig_ok_count :{}".format(self.GSV_sig_ok_count)) + #EventMesh.publish("set_old_step_value",self.location_timer_count) + + #print("location_timer_count:{}".format(self.location_timer_count)) + except Exception as e: usys.print_exception(e) - utime.sleep_ms(1000) - print("location_thread:ERROR:{}\r\n{}".format(e,Exception)) + EventMesh.txt_log("location_thread:ERROR:".format(e)) + #print("location_thread:ERROR:{}".format(usys.print_exception(e))) print("self.gps_data{},self.wifi_data{},self.cell_data{}".format(self.gps_data,self.wifi_data,self.cell_data)) - self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) - EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 + #self.Location_send([self.gps_data,self.wifi_data,self.cell_data]) + #EventMesh.publish(constants.EVENT.CLOSE_LOCATION)#关闭定位 + utime.sleep_ms(1000) + self.timer_read_GPS_info.stop() + self.gps.power_switch(0) + wifiScan.control(0) + + print("CLOSE_LOCATION") + #EventMesh.txt_log("CLOSE_LOCATION") diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/protocol.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/protocol.py index fc8ab9be..e54fd945 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/protocol.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/protocol.py @@ -23,7 +23,7 @@ import usys def server_init(server_type = None): - #服务器选择1,防走丢,2大锤,3三基同创,4童信 + #服务器选择1,防走丢,2大锤,3三基同创,4童信,5云米,6荣为 if server_type == None: server_type = 1 #print("server_init:server_type:{}".format(server_type)) @@ -56,6 +56,11 @@ def server_init(server_type = None): d_server_port = 8505 d_md5_key = "" d_PID = "3G" + elif server_type == 6: + d_server_addr = "120.26.104.21" + d_server_port = 9968 + d_md5_key = "bZld0ALsZTt15tKEZhOlLPgbsO75BLTP" + d_PID = "SZKW" return [d_server_addr,d_server_port,d_md5_key,d_PID] from queue import Queue def unicode_to_utf8(src): @@ -157,7 +162,7 @@ class SockManager(Abstract): def connect(self): print("connect1{}:{}".format(self.server_addr, self.server_port)) - if EventMesh.publish("network_state") == 0: #没注网 + if EventMesh.publish("get_sim_Status") != 1: #没sim return try: if(self.sock != None) : @@ -215,8 +220,8 @@ class SockManager(Abstract): except Exception as e: self.reconnect() self.socket_send_queue.put(data)#重新把数据加回队列 - print("socket_send_queue_thread1:ERROR:") - usys.print_exception(e) + #print("socket_send_queue_thread1:ERROR:") + #usys.print_exception(e) elif socketsta < 4:#正在连接,等待连接成功重新发送 count = 0 while True: @@ -230,8 +235,8 @@ class SockManager(Abstract): except Exception as e: self.reconnect() self.socket_send_queue.put(data)#重新把数据加回队列 - print("socket_send_queue_thread2:ERROR:") - usys.print_exception(e) + #print("socket_send_queue_thread2:ERROR:") + #usys.print_exception(e) break else :#连接错误 print("socket_send_queue_thread:ERROR:reconnect") @@ -240,7 +245,7 @@ class SockManager(Abstract): def send(self, topic, msg): # print("TCP:send data:{}".format(msg)) - if EventMesh.publish("network_state") == 0: #没注网,则不发送 + if EventMesh.publish("get_sim_Status") != 1: #没sim,则不发送 EventMesh.publish(constants.EVENT.SET_CONNECT, 0)#标记断网 print("dataCall not connect") return @@ -282,8 +287,8 @@ class SockManager(Abstract): data = b'' except Exception as e: - print("TCP:ERROR:recv:") - usys.print_exception(e) + #print("TCP:ERROR:recv:") + #usys.print_exception(e) self.run_flag = False self.reconnect() @@ -1126,7 +1131,7 @@ class MONITOR_ProtoCol(ProtoCol): @param msg: 接收到的下行数据 """ # b'[SZKW*867387060319166*000A*MONITOR]' - read_data = EventMesh.publish("set_storage_config","center_dial") + read_data = EventMesh.publish("get_storage_config","center_dial") if read_data != None: contact = read_data diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/sleep_test.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/sleep_test.py index 2604683b..609a9e36 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/sleep_test.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/sleep_test.py @@ -54,178 +54,180 @@ import ql_fs # print("test end2") -# import request -# import ujson +import request +import ujson -# def manual_url_encode(s: str) -> str: -# """Encodes a string for use in a URL query string.""" -# safe_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.*" -# encoded_str = "" +def manual_url_encode(s: str) -> str: + """Encodes a string for use in a URL query string.""" + safe_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-.*" + encoded_str = "" -# for char in s: -# if char in safe_chars: -# encoded_str += char -# else: -# encoded_str += ''.join(['%' + hex(c)[2:].upper() for c in char.encode('utf-8')]) -# return encoded_str - -# def generate_url(base_uri: str, params: dict) -> str: -# """Generates a full URL given a base URI and a dictionary of query parameters.""" -# # Encode each key-value pair in the params dictionary -# encoded_params = "&".join([key + "=" + manual_url_encode(str(value)) for key, value in params.items()]) -# return base_uri + "?" + encoded_params - -# # Test the function with the given example -# base_uri = "http://ability.raisound.com:8096/bwtts" -# params = { -# "text": "这是一个测试用例,一二三四五,上山打老虎", -# "voice_name": "xiaomu", -# "sample_rate": 16000, -# "audio_format": "mp3" -# } -# generated_url = generate_url(base_uri, params) -# print("url:{}".format(generated_url)) -# response = request.get(generated_url) -# print("status_code:{}".format(response.status_code)) -# play_flag = 2 # = 1流播放 =2保存文件播放 -# import audio -# from machine import Pin -# record_test = audio.Record() -# record_test.gain(4,12) -# aud = audio.Audio(0) -# aud.set_pa(Pin.GPIO29) -# aud.setVolume(11) -# tmp = bytearray() -# size = 10*1024 -# ret = 0 -# if play_flag == 1: -# for i in response.content: -# #print("type:{}".format(type(i))) -# tmp+= bytearray(i) -# print("data len:{}".format(len(tmp))) -# #print("data:{}".format(tmp)) -# ret = aud.playStream(3, tmp) -# utime.sleep_ms(20) -# else: -# len_tmp = 0 -# with open('/ext/test.mp3', 'w+')as fp: -# for i in response.content: -# fp.write(i) -# len_tmp+=len(i) -# print("data len:{}".format(len_tmp)) -# #ret = aud.play(1, 1, '/ext/test.mp3') -# with open("/ext/test.mp3", "rb")as f: -# while 1: -# b = f.read(size) # read -# if not b: -# break -# ret =aud.playStream(3, b) -# utime.sleep_ms(20) -# print("ret:{}".format(ret)) - - - - -import quecgnss -import utime - -import quecgnss -import utime -import ure - -gnss_init_flag = 0 -ret = -1 -fix_num = 0 - -def gnss_nmea_debug(gnss_data): - global fix_num - global gnss_init_flag - try: - rmc_info = ure.search("GNRMC(.+?)M", gnss_data) - if rmc_info.group(0).split(",")[2] == 'A': - if fix_num > 1: - print("输出有效定位!\r\n") - else: - fix_num = fix_num + 1 - - except: - pass - - -def gnss_nmea_get_sat(gnss_data): - try: - nema_str_list = gnss_data.split('\r\n') - for i in range(len(nema_str_list)): - if(ure.search("GPGSV(.+?)", nema_str_list[i]) != None): - # print(nema_str_list[i].split(",")[3]) - try: - print('GPS SAT NUM:{},SAT1 {} SNR {},SAT2 {} SNR {},SAT3 {} SNR {},SAT4 {} SNR {}\r\n'.format(nema_str_list[i].split(",")[3], \ - nema_str_list[i].split(",")[4], nema_str_list[i].split(",")[7], nema_str_list[i].split(",")[8], \ - nema_str_list[i].split(",")[11], nema_str_list[i].split(",")[12], nema_str_list[i].split(",")[15], \ - nema_str_list[i].split(",")[16], nema_str_list[i].split(",")[19])) - - except: - pass - - elif(ure.search("GBGSV(.+?)", nema_str_list[i]) != None): - # print(nema_str_list[i].split(",")[3]) - try: - print('BDS SAT NUM:{},SAT1 {} SNR {},SAT2 {} SNR {},SAT3 {} SNR {},SAT4 {} SNR {}\r\n'.format(nema_str_list[i].split(",")[3], \ - nema_str_list[i].split(",")[4], nema_str_list[i].split(",")[7], nema_str_list[i].split(",")[8], \ - nema_str_list[i].split(",")[11], nema_str_list[i].split(",")[12], nema_str_list[i].split(",")[15], \ - nema_str_list[i].split(",")[16], nema_str_list[i].split(",")[19])) - except: - pass - - else: - pass - except Exception as e: - print(str(e)) - - -def main(): - global fix_num - global gnss_init_flag - global ret - if(gnss_init_flag == 0): - ret = quecgnss.init() - if ret == 0: - print('GNSS init ok.\r\n') - gnss_init_flag = 1 + for char in s: + if char in safe_chars: + encoded_str += char else: - print('GNSS init failed.\r\n') - return -1 - else: - print('GNSS has been init.\r\n') - quecgnss.gnssEnable(1) - - for i in range(60): - print("==========GNSS READTIME {}==========\r\n".format(i+1)) - data = quecgnss.read(4096) - gnss_data = data[1].decode() - print(gnss_data) - gnss_nmea_get_sat(gnss_data) - utime.sleep(1) - - quecgnss.gnssEnable(0) - fix_num = 0 - utime.sleep(5) - quecgnss.gnssEnable(1) - print("==========GNSS RESTART==========\r\n") - - for i in range(60): - print("==========GNSS READTIME {}==========\r\n".format(i+1)) - data = quecgnss.read(4096) - gnss_data = data[1].decode() - print(gnss_data) - gnss_nmea_get_sat(gnss_data) - utime.sleep(1) - - quecgnss.gnssEnable(0) - fix_num = 0 - - - -if __name__ == '__main__': - main() \ No newline at end of file + encoded_str += ''.join(['%' + hex(c)[2:].upper() for c in char.encode('utf-8')]) + return encoded_str + +def generate_url(base_uri: str, params: dict) -> str: + """Generates a full URL given a base URI and a dictionary of query parameters.""" + # Encode each key-value pair in the params dictionary + encoded_params = "&".join([key + "=" + manual_url_encode(str(value)) for key, value in params.items()]) + return base_uri + "?" + encoded_params + +# Test the function with the given example +base_uri = "http://ability.raisound.com:8096/bwtts" +params = { + "text": "这是一个测试用例,一二三四五,上山打老虎", + "voice_name": "xiaomu", + "sample_rate": 44100, + "audio_format": "mp3" +} +import audio +from machine import Pin +record_test = audio.Record() +record_test.gain(4,12) +aud = audio.Audio(0) +aud.set_pa(Pin.GPIO29) +aud.setVolume(11) +tmp = bytearray() +generated_url = generate_url(base_uri, params) +print("url:{}".format(generated_url)) +response = request.get(generated_url) +print("status_code:{}".format(response.status_code)) +play_flag = 1 # = 1流播放 =2保存文件播放 + +size = 10*1024 +ret = 0 +if play_flag == 1: + for i in response.content: + print("len:{}".format(len(i))) + #tmp+= bytearray(i) + ret = aud.playStream(3, bytearray(i)) + print("data len:{}".format(len(tmp))) + #print("data:{}".format(tmp)) + #ret = aud.playStream(3, tmp) + utime.sleep_ms(20) +else: + len_tmp = 0 + with open('/ext/test.mp3', 'w+')as fp: + for i in response.content: + fp.write(i) + len_tmp+=len(i) + print("data len:{}".format(len_tmp)) + #ret = aud.play(1, 1, '/ext/test.mp3') + with open("/ext/test.mp3", "rb")as f: + while 1: + b = f.read(size) # read + if not b: + break + ret =aud.playStream(3, b) + utime.sleep_ms(20) +print("ret:{}".format(ret)) + + + + +# import quecgnss +# import utime + +# import quecgnss +# import utime +# import ure + +# gnss_init_flag = 0 +# ret = -1 +# fix_num = 0 + +# def gnss_nmea_debug(gnss_data): +# global fix_num +# global gnss_init_flag +# try: +# rmc_info = ure.search("GNRMC(.+?)M", gnss_data) +# if rmc_info.group(0).split(",")[2] == 'A': +# if fix_num > 1: +# print("输出有效定位!\r\n") +# else: +# fix_num = fix_num + 1 + +# except: +# pass + + +# def gnss_nmea_get_sat(gnss_data): +# try: +# nema_str_list = gnss_data.split('\r\n') +# for i in range(len(nema_str_list)): +# if(ure.search("GPGSV(.+?)", nema_str_list[i]) != None): +# # print(nema_str_list[i].split(",")[3]) +# try: +# print('GPS SAT NUM:{},SAT1 {} SNR {},SAT2 {} SNR {},SAT3 {} SNR {},SAT4 {} SNR {}\r\n'.format(nema_str_list[i].split(",")[3], \ +# nema_str_list[i].split(",")[4], nema_str_list[i].split(",")[7], nema_str_list[i].split(",")[8], \ +# nema_str_list[i].split(",")[11], nema_str_list[i].split(",")[12], nema_str_list[i].split(",")[15], \ +# nema_str_list[i].split(",")[16], nema_str_list[i].split(",")[19])) + +# except: +# pass + +# elif(ure.search("GBGSV(.+?)", nema_str_list[i]) != None): +# # print(nema_str_list[i].split(",")[3]) +# try: +# print('BDS SAT NUM:{},SAT1 {} SNR {},SAT2 {} SNR {},SAT3 {} SNR {},SAT4 {} SNR {}\r\n'.format(nema_str_list[i].split(",")[3], \ +# nema_str_list[i].split(",")[4], nema_str_list[i].split(",")[7], nema_str_list[i].split(",")[8], \ +# nema_str_list[i].split(",")[11], nema_str_list[i].split(",")[12], nema_str_list[i].split(",")[15], \ +# nema_str_list[i].split(",")[16], nema_str_list[i].split(",")[19])) +# except: +# pass + +# else: +# pass +# except Exception as e: +# print(str(e)) + + +# def main(): +# global fix_num +# global gnss_init_flag +# global ret +# if(gnss_init_flag == 0): +# ret = quecgnss.init() +# if ret == 0: +# print('GNSS init ok.\r\n') +# gnss_init_flag = 1 +# else: +# print('GNSS init failed.\r\n') +# return -1 +# else: +# print('GNSS has been init.\r\n') +# quecgnss.gnssEnable(1) + +# for i in range(60): +# print("==========GNSS READTIME {}==========\r\n".format(i+1)) +# data = quecgnss.read(4096) +# gnss_data = data[1].decode() +# print(gnss_data) +# gnss_nmea_get_sat(gnss_data) +# utime.sleep(1) + +# quecgnss.gnssEnable(0) +# fix_num = 0 +# utime.sleep(5) +# quecgnss.gnssEnable(1) +# print("==========GNSS RESTART==========\r\n") + +# for i in range(60): +# print("==========GNSS READTIME {}==========\r\n".format(i+1)) +# data = quecgnss.read(4096) +# gnss_data = data[1].decode() +# print(gnss_data) +# gnss_nmea_get_sat(gnss_data) +# utime.sleep(1) + +# quecgnss.gnssEnable(0) +# fix_num = 0 + + + +# if __name__ == '__main__': +# main() \ No newline at end of file diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui.py index e66258b4..98f9a4a1 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui.py @@ -4382,7 +4382,7 @@ class Spo2Screen(Screen): self.timer = osTimer() self.point = 0 self.spo2_value = 0 - + #self.Hsensor = None def initialization(self): global spo2_screen,spo2_label,spo2_value_label,spo2_reset_btn_img,spo2_done_img,spo2_line_bg_img,spo2_line1,spo2_line2,\ spo2_line3,spo2_line4,spo2_line5,spo2_line6,spo2_line7,spo2_line_bg_img ,spo2_start_label ,spo2_done_label @@ -4483,7 +4483,7 @@ class Spo2Screen(Screen): self.spo2_value = 0 self.show_history_data() self.restart_up(0) - + def restart_up(self,e): global spo2_value_label,heartrate_bpm_label,spo2_start_label,spo2_reset_btn_img self.point = 0 @@ -4574,6 +4574,12 @@ class Spo2Screen(Screen): self.point = self.point + 1 EventMesh.publish("system_sleep_rest")#防止黑屏 WEAR = EventMesh.publish(constants.EVENT.GET_WEAR)#佩戴数据 + # if self.Hsensor == None: + # self.Hsensor = EventMesh.publish("get_Hsensor") + # c_data = self.Hsensor.get_test_data()#校准数据和工厂数据 + # print(" 佩戴状态\n红外:{}活体:{}佩戴:{}\n{},{} \n{},{} \n{},{}\n校准数据:{},{},{},{}\n漏光数据:{},{},{}" + # .format(c_data[3],c_data[4],WEAR,c_data[5],c_data[6],c_data[7],c_data[8],c_data[9],c_data[10], + # c_data[11],c_data[12],c_data[13],c_data[14],c_data[0],c_data[1],c_data[2],)) # print("sop2:start_measure:point{}".format(self.point)) self.spo2_value = EventMesh.publish(constants.EVENT.GET_BLOOD_OXYGEN) if self.point >= 2: diff --git a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_main_menu.py b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_main_menu.py index 7533a1c5..2d1ad777 100644 --- a/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_main_menu.py +++ b/2.sdk/project/K5/sdk/services/microPython/ports/quectel/core/ui_main_menu.py @@ -106,29 +106,29 @@ label_text.set_pos(0, 240) label_text.set_size(0, 0) label_text.set_text("0") MainMenu2_num+=1 -#支付宝 -MainMenu2_alipay = MainMenu2_til.add_tile(MainMenu2x, 0, lv.DIR.LEFT | lv.DIR.RIGHT) -#MainMenu2_alipay.set_tile_act(7,0,lv.ANIM.ON)#设置拼接 -label_text = lv.label(MainMenu2_alipay) -label_text.set_pos(0, 240) -label_text.set_size(0, 0) -label_text.set_text("{}".format(MainMenu2_num)) -MainMenu2_img_alipay_text = lv.label(MainMenu2_alipay) -MainMenu2_img_alipay_text.set_pos(int(0),int(220)) -MainMenu2_img_alipay_text.set_size(240,100) -MainMenu2_img_alipay_text.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_alipay_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) -MainMenu2_img_alipay_text.set_text("支付宝") -MainMenu2_img_alipay_text.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) - -MainMenu2_img_alipay = lv.img(MainMenu2_alipay) -MainMenu2_img_alipay.set_size(160,160) -MainMenu2_img_alipay.set_pos(40,20) -MainMenu2_img_alipay.set_src("U:/static/alipay_.png") -MainMenu2_img_alipay.add_flag(lv.obj.FLAG.CLICKABLE) -MainMenu2_img_alipay.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) -MainMenu2_num+=1 -MainMenu2x+=1 +# #支付宝 +# MainMenu2_alipay = MainMenu2_til.add_tile(MainMenu2x, 0, lv.DIR.LEFT | lv.DIR.RIGHT) +# #MainMenu2_alipay.set_tile_act(7,0,lv.ANIM.ON)#设置拼接 +# label_text = lv.label(MainMenu2_alipay) +# label_text.set_pos(0, 240) +# label_text.set_size(0, 0) +# label_text.set_text("{}".format(MainMenu2_num)) +# MainMenu2_img_alipay_text = lv.label(MainMenu2_alipay) +# MainMenu2_img_alipay_text.set_pos(int(0),int(220)) +# MainMenu2_img_alipay_text.set_size(240,100) +# MainMenu2_img_alipay_text.add_flag(lv.obj.FLAG.CLICKABLE) +# MainMenu2_img_alipay_text.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) +# MainMenu2_img_alipay_text.set_text("支付宝") +# MainMenu2_img_alipay_text.add_style(style_font_youyuan_font_60, lv.PART.MAIN|lv.STATE.DEFAULT) + +# MainMenu2_img_alipay = lv.img(MainMenu2_alipay) +# MainMenu2_img_alipay.set_size(160,160) +# MainMenu2_img_alipay.set_pos(40,20) +# MainMenu2_img_alipay.set_src("U:/static/alipay_.png") +# MainMenu2_img_alipay.add_flag(lv.obj.FLAG.CLICKABLE) +# MainMenu2_img_alipay.add_style(style_MainMenu_img_default, lv.PART.MAIN | lv.STATE.DEFAULT) +# MainMenu2_num+=1 +# MainMenu2x+=1 # label_alipay.set_long_mode(lv.label.LONG.WRAP) # label_alipay.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0) @@ -344,7 +344,7 @@ class MainMenuScreen(Screen): MainMenu2_img_wechat.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "wechat")), lv.EVENT.CLICKED, None) # MainMenu2_img_spo2.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "spo2")), lv.EVENT.CLICKED, None) MainMenu2_img_sms.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "popup")), lv.EVENT.CLICKED, None) - MainMenu2_img_alipay.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "alipay_open")), lv.EVENT.CLICKED, None) + #MainMenu2_img_alipay.add_event_cb(lambda e: EventMesh.callback_wrapper(self.img_cb(e, "alipay_open")), lv.EVENT.CLICKED, None) EventMesh.subscribe("watch_top_show", self.watch_top_show) EventMesh.subscribe("return_alipay", self.return_alipay) diff --git a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z index 18d6dd33..d2a559e5 100644 Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/DBG.7z differ diff --git a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip index e4cd5de2..fa044e01 100644 Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/images/firmware_base_release_pack.zip differ diff --git a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib index e5de4d90..3dc3b0fa 100644 Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/libHeliosAPI.lib differ diff --git a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib index dc0d758e..98845874 100644 Binary files a/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib and b/2.sdk/project/K5/sdk/system/platform/ASR_1606/boards/EG810MCN_GA_ALIPAY/libraries/ql_common_api.lib differ