From a842ed1ea9caa76785625ad6b7728a919bb4ce2c Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期三, 02 七月 2025 18:49:01 +0800 Subject: [PATCH] Merge branch 'MK大工卡-低精度GPS-1/5HZ' of http://47.108.70.204:60062/r/ChinaUWBProject into MK大工卡-低精度GPS-1/5HZ --- keil/include/main/main.c | 478 +++++++++++++++++++++++++++++++++++------------------------ 1 files changed, 280 insertions(+), 198 deletions(-) diff --git a/keil/include/main/main.c b/keil/include/main/main.c index 3688375..24336ea 100644 --- a/keil/include/main/main.c +++ b/keil/include/main/main.c @@ -46,6 +46,8 @@ #define UWB_MEASUREMENT_INTERVAL 5 #define UWB_MEASUREMENT_INTERVAL_SLEEP 30 +#define INACTIVE_TIMEOUT 30 + extern uint8_t mUsartReceivePack[100]; extern uint8_t mUsart2ReceivePack[150]; extern uint8_t state5V_prase_flag,gps_prase_flag; @@ -143,55 +145,22 @@ lock = int_lock(); // LOG_INFO(TRACE_MODULE_APP, "进入深度休眠\r\n"); // gps_air780_power_change(0,0);//关闭gps,4G - PCA9555_Set_One_Value_Output(LED_POWER,0);//输出低电平关闭LED + PCA9555_Set_One_Value_Output(LED_POWER,0);//输出低电平关闭LED PCA9555_Set_One_Value_Output(GPS_POWER,0);//关闭gps,4G + PCA9555_Set_One_Value_Output(TTS_ENABLE,0); + PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0);//关闭gps,4G - sleep_timer_stop(); + + sleep_timer_stop(); + //adc_close(); power_enter_power_down_mode(1); // LOG_INFO(TRACE_MODULE_APP, "从休眠出来\r\n"); sys_reset(0); int_unlock(lock); -//// uint32_t lock; -//// trace_flush(); -//// lock = int_lock(); -////// LOG_INFO(TRACE_MODULE_APP, "进入深度休眠\r\n"); -//// gps_air780_power_change(0,0);//关闭gps,4G -// deep_sleep_falg=0; -// PCA9555_Set_One_Value_Output(LED_POWER,0);//输出低电平关闭LED -// PCA9555_Set_One_Value_Output(GPS_POWER,0);//关闭gps,4G -//// PCA9555_Set_One_Value_Config(MAIN_RI,0);//配置4G唤醒引脚为输入 -//// -////// PCA9555_Set_One_Value_Output(MAIN_RI,1); -// boot_deinit(); -// CloseUWB(); -// if(onlyoneflag) -// { -// onlyoneflag=0; -// userkey_state=4; -// heartbeasend_flag = 1; -// sleepflag=1; -// sleepflagtime=HIDO_TimerGetTick(); -// } -// if(sleepflag) -// { -// if(HIDO_TimerGetTick() - sleepflagtime>3) -// { -// PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0);//关闭gps,4G -// } -// } -// -//// PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0);//关闭gps,4G -// -//// sleep_timer_stop(); -//// //adc_close(); -//// power_enter_power_down_mode(1); -//// delay_us(200000); -//// sys_reset(0); -////// LOG_INFO(TRACE_MODULE_APP, "从休眠出来\r\n"); -//// int_unlock(lock); } +uint8_t jiancebat_percent_flag; static void adc_callback(void *data, uint32_t number) { uint32_t *result = (uint32_t *)data; @@ -218,6 +187,7 @@ bat_percent=100; if(bat_percent<0) bat_percent=0; + jiancebat_percent_flag=1; // if(fVoltage_mv<3300) // { // //power_low_flag=1; @@ -251,6 +221,7 @@ userkey_state=4; heartbeasend_flag = 1; sleepflag=1; + sleepflagtime=HIDO_TimerGetTick(); } } @@ -271,6 +242,7 @@ } } +uint16_t gaodu; uint8_t guanjiflag; uint8_t heartbeasend_flag; uint32_t guanjiflagtime; @@ -296,6 +268,7 @@ keystarttime3 = HIDO_TimerGetTick(); } } +uint8_t user_Power_keyflag=0; void PowerTask(void) { if(read_powerkey_input_pca()) @@ -315,9 +288,12 @@ // PCA9555_Set_One_Value_Output(GPS_POWER,0);//关GPS // PCA9555_Set_One_Value_Output(PWR_ENABLE,0);//低电平关闭 heartbeasend_flag = 1; + user_Power_keyflag=1; guanjiflag=1; userkey_state = 2; guanjiflagtime=HIDO_TimerGetTick(); + g_com_map[KEY_POWERON] = user_Power_keyflag; + save_com_map_to_flash(); } }else { @@ -362,6 +338,7 @@ HIDO_TimerTick(); // if(nomove_count<=g_com_map[NOMOVESLEEP_TIME])//防止溢出 nomove_count++; + gaodu=GetPressAndHeight()*100; // else{ // nomove_count=g_com_map[NOMOVESLEEP_TIME]+1; // } @@ -372,6 +349,7 @@ uint8_t input5v_time; extern uint8_t taglist_num; uint8_t gps_ntripsend; +extern uint8_t uwb_OpenClose_flag; static void sleep_timer_callback(void *dev, uint32_t time) { // powerON_Task(); @@ -402,7 +380,7 @@ // uart_send(UART_ID1, ceshidata, 50,NULL); } input5v_time=1; - if(taglist_num==0&&g_com_map[UWBFrequency]==1&&g_com_map[UWBENBLE]==1) + if(taglist_num==0&&g_com_map[UWBFrequency]==1&&g_com_map[UWBENBLE]==1&&uwb_OpenClose_flag==1) { CloseUWB(); Uwb_init(); @@ -420,6 +398,57 @@ delaysleep_count--; } +#ifdef JIBU_XIUMIAN + +uint16_t sleep_time=0; +uint32_t state_start_time_jibu=0; +uint8_t exercise_state=0; +uint32_t step_count = 0; // 步数计数 +uint32_t last_step_count = 0; // 上一次步数 +void check_step_and_update_state(void) +{ + if ((step_count != last_step_count)) + { + // 步数有变化,重置状态为正常状态 + last_step_count = step_count; + + if(current_state == STATE_SLEEP) + { + state_start_time_jibu = uwb_time_count; + state_start_time=uwb_time_count; + } +// if (current_state != STATE_NORMAL) +// { +// // 关闭可能正在运行的UWB +// if (uwb_is_on) { +// CloseUWB(); +// UWB_LED_OFF; +// uwb_is_on = false; +// } +// current_state = STATE_NORMAL; +// state_start_time = uwb_time_count; // 重置测距周期 +// } + current_state = STATE_NORMAL; + exercise_state=1; + last_step_count = step_count; + + } + else + { + // 步数没有变化,检查是否需要切换到休眠状态 + if (current_state == STATE_NORMAL) + { + uint32_t inactive_time = uwb_time_count - state_start_time_jibu; + if (inactive_time >= INACTIVE_TIMEOUT) + { // 30秒后切换到休眠状态 + current_state = STATE_SLEEP; + exercise_state=2; + state_start_time_jibu=uwb_time_count; + } + } + } +} +#endif static void pca_handler(enum IO_PIN_T pin) { PCA9555_readdata(PCA9555_DEVICE_ADDR,pca9555writedata_input);//读输入寄存器的值 @@ -483,6 +512,10 @@ { g_com_map[UWBFrequency]=1; } + if(g_com_map[URT_BQ]>1) + { + g_com_map[URT_BQ]=0; + } // g_com_map[IP_0]=111; // g_com_map[IP_1]=198; // g_com_map[IP_2]=60; @@ -531,8 +564,8 @@ // } g_com_map[MODBUS_MODE] = 0; log_4g_enable_flag=g_com_map[LOG_4G_ENABLE]; - g_com_map[VERSION] = (1<<8)|20; - + g_com_map[VERSION] = (1<<8)|25; + LOG_INFO(TRACE_MODULE_APP,"设备ID: %x .\r\n",dev_id); LOG_INFO(TRACE_MODULE_APP,"固件版本:4G-GPS定位工卡 V%d.%d. \r\n",g_com_map[VERSION]>>8,g_com_map[VERSION]&0xff); @@ -542,6 +575,7 @@ LOG_INFO(TRACE_MODULE_APP,"设备UWB工作间隔: %x .\r\n",g_com_map[UWBFrequency]); LOG_INFO(TRACE_MODULE_APP,"设备GPS工作间隔: %x .\r\n",g_com_map[GPSFrequency]); LOG_INFO(TRACE_MODULE_APP,"当前GPS工作波特率: %d .\r\n",gpsbaudrate1); +// LOG_INFO(TRACE_MODULE_APP,"充电是否开机标志位: %d .\r\n",g_com_map[URT_BQ]); if(g_com_map[RTCMMODE_INDEX] == RTCMMODE_TCP) { LOG_INFO(TRACE_MODULE_APP,"TCP_RTCM模式,服务器地址: %d.%d.%d.%d:%d.\r\n",g_com_map[TCP_IP_0],g_com_map[TCP_IP_1],g_com_map[TCP_IP_2],g_com_map[TCP_IP_3],g_com_map[TCP_PORT]); @@ -566,166 +600,184 @@ uint8_t bat_percent_old=100; uint8_t input5vflag; extern uint8_t ota_flag; +uint8_t bat_percent_only_one=1; +extern uint8_t jiancebat_percent_flag; void IdleTask(void) { -if(read_5v_input_pca()) - { - if(state5v==0) +// if(g_com_map[URT_BQ]) +// {} +// else +// { +// +// +// } + + if(read_5v_input_pca()) { - state5v=1; - state5V_prase_flag=state5v; - gps_prase_flag=0;//解除gps解析 - uart1_change_from_gps_to_debug();//测试 - PCA9555_Set_One_Value_Output(MCU_A,1);//输出高电平切换为5V输入 - } - chongman_time=0; - only_one_flag=0; - uwbled=0; - rtkled=0; - led4g=0; - powerled=0; -// PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0); - while(1) - { - nomove_count = 0; -// adctick = HIDO_TimerGetTick(); - if(HIDO_TimerGetTick()-adctick>600) //10分钟采样一次 电量 + if(state5v==0) { - chongman_time=chongman_time+60; - adctick = HIDO_TimerGetTick(); - PCA9555_Set_One_Value_Output(ADC_MINIUS,0);//拉低 - adc_get(&sample[0], NUM_SAMPLES, adc_callback);//adc采样 - } - if(bat_percent>=99&&!only_one_flag) - { - only_one_flag=1; + state5v=1; + state5V_prase_flag=state5v; + gps_prase_flag=0;//解除gps解析 + uart1_change_from_gps_to_debug();//测试 + PCA9555_Set_One_Value_Output(MCU_A,1);//输出高电平切换为5V输入 + } chongman_time=0; - } - if(bat_percent>=99&&chongman_time>=180) + only_one_flag=0; + uwbled=0; + rtkled=0; + led4g=0; + powerled=0; + // PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0); + while(1) { - powerled = GREEN; - }else{ - powerled = RED; - } - if(DBG_GetMode() == DBG_MODE_SHELL) - { - if(ota_flag==1) - { -// OTA_Poll(); -// HTTPClient_Poll(); - } - else - { - uwb_app_poll(); - } - Internet_Poll(); - HIDO_TimerPoll(); - HIDO_ATLitePoll(); - TCPClient_Poll(); - if(g_com_map[RTCMMODE_INDEX] == RTCMMODE_TCP) - {TCPClient_Poll_1();} - if(flag_secondtask) - { - flag_secondtask = 0; - SecondTask(); - } - UserKeyTask(); - } - UART_CheckReceive(); - if(flag_secondtask) - { - flag_secondtask = 0; - SecondTask(); - } - if(DBG_GetMode() == DBG_MODE_SHELL) - { - Set4LEDColor(uwbled,rtkled,led4g,powerled); - if(g_com_map[CNT_RESTART]==1) + nomove_count = 0; + wdt_ping(WDT_ID0);//喂狗 + // adctick = HIDO_TimerGetTick(); + if(HIDO_TimerGetTick()-adctick>600) //10分钟采样一次 电量 { - g_com_map[CNT_RESTART]=0; - save_com_map_to_flash(); - NVIC_SystemReset(); + chongman_time=chongman_time+60; + adctick = HIDO_TimerGetTick(); + PCA9555_Set_One_Value_Output(ADC_MINIUS,0);//拉低 + adc_get(&sample[0], NUM_SAMPLES, adc_callback);//adc采样 + } + if(bat_percent>=99&&!only_one_flag) + { + only_one_flag=1; + chongman_time=0; + } + if(bat_percent>=99&&chongman_time>=180) + { + powerled = GREEN; + }else{ + powerled = RED; + } + if(DBG_GetMode() == DBG_MODE_SHELL) + { + if(ota_flag==1) + { + // OTA_Poll(); + // HTTPClient_Poll(); + } + else + { + uwb_app_poll(); + } + Internet_Poll(); + HIDO_TimerPoll(); + HIDO_ATLitePoll(); + TCPClient_Poll(); + if(g_com_map[RTCMMODE_INDEX] == RTCMMODE_TCP) + {TCPClient_Poll_1();} + if(flag_secondtask) + { + flag_secondtask = 0; + SecondTask(); + } + UserKeyTask(); + } + UART_CheckReceive(); + if(flag_secondtask) + { + flag_secondtask = 0; + SecondTask(); + } + if(DBG_GetMode() == DBG_MODE_SHELL) + { + Set4LEDColor(uwbled,rtkled,led4g,powerled); + if(g_com_map[CNT_RESTART]==1) + { + g_com_map[CNT_RESTART]=0; + save_com_map_to_flash(); + NVIC_SystemReset(); + } + } + else + { + Set4LEDColor(0,0,0,powerled); + } + if(input5v_time) + { + if(!read_5v_input_pca()) + { + break; + } } } - else - { - Set4LEDColor(0,0,0,powerled); - } - if(input5v_time) - { - if(!read_5v_input_pca()) - { - break; - } - } + // NVIC_SystemReset(); + // PCA9555_Set_One_Value_Output(PWR_ENABLE,0); + input5vflag=1; } -// NVIC_SystemReset(); -// PCA9555_Set_One_Value_Output(PWR_ENABLE,0); - input5vflag=1; - } - else - { - if(state5v==1) + else { - g_com_map[MODBUS_MODE] = 0; - state5v=0; - state5V_prase_flag=state5v; - gps_prase_flag=1;//恢复gps解析 - uart1_change_from_debug_to_gps();//测试 -// PCA9555_Set_One_Value_Output(MCU_A,0);//输出低电平切换为GPS - PCA9555_Set_One_Value_Output(LED_POWER,0);//输出低电平关闭LED - PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0); - PCA9555_Set_One_Value_Output(GPS_POWER,0);//关GPS - PCA9555_Set_One_Value_Output(PWR_ENABLE,0);//低电平关闭 - delay_us(1000000); - - } - } - UART_CheckReceive(); - if(g_com_map[CNT_RESTART]==1) - { - g_com_map[CNT_RESTART]=0; - NVIC_SystemReset(); - - } - if(g_com_map[MAP_SIGN_INDEX]!=0x55AA||g_com_map[COM_INTERVAL]==0) - { - NVIC_SystemReset(); - } - HIDO_TimerPoll(); - if(ledonflag==1) - { - ledonflag=0; - uwbled=0; - rtkled=0; - led4g=0; - powerled=0; - Set4LEDColor(LEDOFF,LEDOFF,LEDOFF,LEDOFF); - } - if(bat_percent<1) - { - userkey_state=3; - heartbeasend_flag = 1; - guanjiflag=1; - guanjiflagtime=HIDO_TimerGetTick(); - } - if(guanjiflag) - { - rtkled=WHITE; - uwbled=WHITE; - led4g=WHITE; - powerled=WHITE; - Set4LEDColor(uwbled,rtkled,led4g,powerled); - if(HIDO_TimerGetTick() - guanjiflagtime>3) - { + if(state5v==1) + { + g_com_map[MODBUS_MODE] = 0; + state5v=0; + state5V_prase_flag=state5v; + gps_prase_flag=1;//恢复gps解析 + uart1_change_from_debug_to_gps();//测试 + // PCA9555_Set_One_Value_Output(MCU_A,0);//输出低电平切换为GPS PCA9555_Set_One_Value_Output(LED_POWER,0);//输出低电平关闭LED PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0); PCA9555_Set_One_Value_Output(GPS_POWER,0);//关GPS PCA9555_Set_One_Value_Output(PWR_ENABLE,0);//低电平关闭 - } - - } + delay_us(1000000); + + } + } + UART_CheckReceive(); + if(g_com_map[CNT_RESTART]==1) + { + g_com_map[CNT_RESTART]=0; + NVIC_SystemReset(); + + } + if(g_com_map[MAP_SIGN_INDEX]!=0x55AA||g_com_map[COM_INTERVAL]==0) + { + NVIC_SystemReset(); + } + HIDO_TimerPoll(); + if(ledonflag==1) + { + ledonflag=0; + uwbled=0; + rtkled=0; + led4g=0; + powerled=0; + Set4LEDColor(LEDOFF,LEDOFF,LEDOFF,LEDOFF); + } + if(bat_percent<5&&jiancebat_percent_flag) + { + WT588E_PLAY(14); + } + if(bat_percent<1&&bat_percent_only_one&&jiancebat_percent_flag) + { + WT588E_PLAY(15); + userkey_state=3; + heartbeasend_flag = 1; + guanjiflag=1; + guanjiflagtime=HIDO_TimerGetTick(); + bat_percent_only_one=0; + } + if(guanjiflag) + { + rtkled=WHITE; + uwbled=WHITE; + led4g=WHITE; + powerled=WHITE; + Set4LEDColor(uwbled,rtkled,led4g,powerled); + if(HIDO_TimerGetTick() - guanjiflagtime>3) + { + PCA9555_Set_One_Value_Output(TTS_ENABLE,0); //关闭语音输入 + PCA9555_Set_One_Value_Output(LED_POWER,0); //输出低电平关闭LED + PCA9555_Set_One_Value_Output(AIR780E_ENBALE,0); + PCA9555_Set_One_Value_Output(GPS_POWER,0); //关GPS + PCA9555_Set_One_Value_Output(PWR_ENABLE,0); //低电平关闭 + } + + } } void boot_deinit(void) { @@ -746,10 +798,11 @@ extern uint32_t uwb_time_count; uint8_t GPS_UPLOAD_FLAG=0; uint32_t elapsed_time_jibu; +extern uint8_t uwb_OpenClose_flag; void upload_apppoll() { - if(current_state==STATE_NORMAL) + if(current_state==STATE_NORMAL&&uwb_OpenClose_flag==1) { if(g_com_map[UWBFrequency]>1) { @@ -771,10 +824,10 @@ else {} } - else if(current_state==STATE_SLEEP) + else if(current_state==STATE_SLEEP&&uwb_OpenClose_flag==1) { elapsed_time_jibu = uwb_time_count - state_start_time; - switch(elapsed_time_jibu==1) + switch(elapsed_time_jibu) { case UWB_OPEN_COUNT: CloseUWB(); @@ -843,6 +896,17 @@ int test1,test3; uint32_t test4; extern uint8_t receive_flag; +static void app_wdt_callback(void *dev, uint32_t status) +{ + ASSERT(status, "WDT TIMEOUT,程序复位"); + //LOG_INFO(TRACE_MODULE_APP, "程序卡死,看门狗复位"); +} + struct WDT_CFG_T app_wdt_cfg = { + .timeout = 32768 * 30, + .rst_en = true, + .int_en = true, + .callback = app_wdt_callback, + }; int main(void) { __enable_irq(); @@ -850,11 +914,15 @@ boot_deinit(); board_pins_config(); gpio_open(); - IIC2_Init(); - Accelerometer_Init(); + IIC2_Init(); + Accelerometer_Init(); +// delay_ms(100); + BarInit(); +// delay_ms(100); +// gaodu=GetPressAndHeight(); PCA9555_init(); - board_debug_console_open_baud(TRACE_PORT_UART1,BAUD_115200); - + board_debug_console_open_baud(TRACE_PORT_UART1,BAUD_921600); +// while(1); // Reset reason reset_cause_get(); reset_cause_clear(); @@ -877,7 +945,8 @@ Uart_Register(UART_ID_DBG_GPS, UART_ID1); DBG_Init(); - + + SendComMap(0x50,0); Internet_Init(); TCPClient_Init(); // if(g_com_map[RTCMMODE_INDEX] == RTCMMODE_NTRIP) @@ -890,15 +959,25 @@ TCPClient_Init_1(); } // HTTPClient_Init(); - + wdt_open(WDT_ID0,&app_wdt_cfg);//30s检测喂狗 LED_output_init();//配置彩色灯引脚 - + PCA9555_Set_One_Value_Output(TTS_ENABLE,1); WT588E02B_Init(); adc_open(&usr_adc_cfg); uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback); power_init(); Uwb_init(); + if(g_com_map[KEY_POWERON]==1) + { + WT588E_PLAY(0); //播报开机语音 + g_com_map[KEY_POWERON]=0; + save_com_map_to_flash(); + + + } + + if(g_com_map[UWBFrequency]&&g_com_map[UWBENBLE]) { OpenUWB(); @@ -926,6 +1005,7 @@ PCA9555_Set_One_Value_Output(ADC_MINIUS,0);//拉低 adc_get(&sample[0], NUM_SAMPLES, adc_callback);//adc采样 pca_input_detection_init(pca_handler);//pca检测输入 + gaodu=GetPressAndHeight()*100; while (1) { @@ -934,6 +1014,7 @@ HIDO_TimerPoll(); HIDO_ATLitePoll(); TCPClient_Poll(); + wdt_ping(WDT_ID0);//喂狗 if(g_com_map[RTCMMODE_INDEX] == RTCMMODE_TCP) { TCPClient_Poll_1(); @@ -943,7 +1024,8 @@ flag_secondtask = 0; SecondTask(); } - IMUTask(); + IMUTask(); IdleTask(); + check_step_and_update_state(); } } -- Gitblit v1.9.3