From 9b1cdedb33543cd3a5d3a88f0786311af3aeb08e Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期四, 15 八月 2024 13:50:30 +0800 Subject: [PATCH] 增加了闪灯逻辑以及gps解析逻辑以及添加了搜索模式逻辑等,并且为之前的chm5 未改为110k波特率,成功测距闪灯demo,加速度计未驱动有问题 --- uwb_MK8000_example_ss_twr_qiang_Anchor_gai/keil/include/main/main.c | 239 ++++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 187 insertions(+), 52 deletions(-) diff --git a/uwb_MK8000_example_ss_twr_qiang_Anchor_gai/keil/include/main/main.c b/uwb_MK8000_example_ss_twr_qiang_Anchor_gai/keil/include/main/main.c index 27af7aa..a277996 100644 --- a/uwb_MK8000_example_ss_twr_qiang_Anchor_gai/keil/include/main/main.c +++ b/uwb_MK8000_example_ss_twr_qiang_Anchor_gai/keil/include/main/main.c @@ -52,26 +52,44 @@ #include "Usart.h" #include "mk_adc.h" #include "mk_sleep_timer.h" +#include "lis3dh_driver.h" +#include "sn74hc595.h" +#include "mk_4G.h" extern int simple_main(void); -uint8_t trx_buf[10] = {0}; +extern int temp_main(void); #define TEST_UART_POLL_MODE 0 #define TEST_UART_INTERUPT_MODE 1 #define TEST_UART_DMA_MODE 2 #define TEST_UART_MODE TEST_UART_DMA_MODE #define NUM_SAMPLES 1 +#define BIND_TRIGGER_TIME 60000 extern uint8_t mUsartReceivePack[100]; -extern uint8_t mUsart2ReceivePack[100]; +extern uint8_t mUsart2ReceivePack[150]; +extern uint8_t state5V_prase_flag,gps_prase_flag; uint32_t dev_id; uint8_t group_id; uint16_t tag_frequency; uint16_t disoffset; -uint16_t warning_distance; -int16_t fVoltage_mv; +uint16_t warning_distance,prewarning_distance; +int16_t fVoltage_mv,first_search_flag; uint8_t bat_percent,g_start_send_flag=1; -uint8_t state5v = 1; - +int link_success_flag; +uint8_t state5v,link_error_count; +uint8_t gps_power_state,motor_power_state=1,uwb_state,air780_power_state,gps_success_state,chaging_state,changed_state,air780_success_state; +float nomove_count=0; static uint32_t sample[NUM_SAMPLES] = {0}; +uint8_t recev_error_num,send_messgae_count,send_flag,control_state; + +typedef enum +{ UN_BIND=0, + LINK_SUCCESS, + SEARCH_DEV, +}Operation_step; +Operation_step Operation_state; + + +Commend_SendDate send_struct; static struct ADC_CFG_T usr_adc_cfg = { .mode = ADC_MODE_CONTINUE, /* Selected single conversion mode */ .clk_sel = ADC_CLK_HIGH, /* Selected 62.4M high speed clock */ @@ -112,33 +130,6 @@ { uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback); } -void UartInit(void) -{ -board_pins_config(); -uart_open(UART_ID1, &test_uart_cfg); -board_debug_console_open(TRACE_PORT_UART0); -uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback); -} -static void sleep_timer_callback(void *dev, uint32_t time) -{ - g_start_send_flag=1; - //LOG_INFO(TRACE_MODULE_APP, "Sleep timer interrupt callback\r\n"); -} -static void voltage_input_handler(enum IO_PIN_T pin) -{ - -} -void Program_Init(void) -{ -Usart1ParseDataCallback = UsartParseDataHandler; -parameter_init_anchor();//g_com_map表初始化角色默认为基站 -dev_id=g_com_map[DEV_ID];//这里不太对 -group_id=g_com_map[GROUP_ID];//组ID -tag_frequency = 1000/g_com_map[COM_INTERVAL];//测距频率这个存的是测距时间 -memcpy(&disoffset,&g_com_map[DIST_OFFSET],2); -warning_distance=g_com_map[STATIONARY_TIME]; -} - static void adc_callback(void *data, uint32_t number) { uint32_t *result = (uint32_t *)data; @@ -163,31 +154,123 @@ } LOG_INFO(TRACE_MODULE_APP, "The voltage is %%%d \r\n",bat_percent); } +//void UartInit(void) +//{ +//board_pins_config(); +//uart_open(UART_ID1, &test_uart_cfg); +//board_debug_console_open(TRACE_PORT_UART0); +//uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback); +//} +static void sleep_timer_callback(void *dev, uint32_t time) +{ + + nomove_count++; + send_messgae_count+=g_com_map[COM_INTERVAL]; + //if(send_messgae_count>=g_com_map[4G_INTERNAL]){ + //send_message_count=0; + //send_flag=1; + //} + + if(Operation_state==LINK_SUCCESS){//成功时清0错误计数 + link_error_count=0; + g_start_send_flag=1; + } + if(Operation_state==SEARCH_DEV){ +// if(first_search_flag){//当第一次连接断开产生时才开始计数 + //link_error_count=0; +// } + link_error_count++; + if(link_error_count==60) + link_error_count=0; + //link_error_count+=g_com_map[COM_INTERVAL]; + //if(link_error_count>=g_com_map[4G_INTERNAL]) + //link_error_count=0; + updata_led_power_state();//更新灯状态 + } +} +static void voltage_input_handler(enum IO_PIN_T pin) +{ + +} +static void move_handler(enum IO_PIN_T pin) +{ +nomove_count=0; +} +void Program_Init(void) +{ +Usart1ParseDataCallback = UsartParseDataHandler;//需改为默认为gps处理,UsartParseDataHandler为升级处理当调试时候改为 +parameter_init_anchor();//g_com_map表初始化角色默认为基站 +dev_id=g_com_map[DEV_ID];//这里不太对 +group_id=g_com_map[GROUP_ID];//组ID +tag_frequency = 1000/g_com_map[COM_INTERVAL];//测距频率这个存的是测距时间 +memcpy(&disoffset,&g_com_map[DIST_OFFSET],2); +warning_distance=g_com_map[STATIONARY_TIME]; +prewarning_distance=g_com_map[ALARM_DISTANCE2]; +send_struct.warnDistence=warning_distance; +send_struct.alarmDistence=prewarning_distance;//更新报警距离 +memcpy(&send_struct.gunLableId,&g_com_map[BIND_DEV_ID],2);//更新绑定ID +send_struct.tagId=dev_id;//更新设备ID +} + + + void IdleTask(void) { if(gpio_pin_get_val(INPUT_5V_Pin)) - { - - UART_CheckReceive(); - //UART_CheckSend(); + { + if(state5v==0) { state5v=1; - UartInit(); + state5V_prase_flag=state5v; + gps_prase_flag=0;//解除gps解析 + uart1_change_from_gps_to_debug(); + uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback);//开启dma + //UartInit(); } + + //UART_CheckSend(); }else{ if(state5v==1) { - state5v=0; + state5v=0; + state5V_prase_flag=state5v; + gps_prase_flag=1;//恢复gps解析 + uart1_change_from_debug_to_gps(); + uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback);//开启dma //UartDeinit(); } + UART_CheckReceive(); } } +int bind_check(void) +{ +if(g_com_map[BIND_DEV_ID]!=0x00) +{ + return 1; +//绑定信息为1说明设备已经被下发绑定 +}else{ + return 0; +//绑定信息为0说明设备未被绑定 +} +} +void check_if_in_search(void) +{ +if(link_success_flag==1){//如果第一次测距收包成功那么则进入连接测距模式 + Operation_state=LINK_SUCCESS; + }else{//否则进入搜索模式 + Operation_state=SEARCH_DEV; + if(first_search_flag==0) + first_search_flag=1; + } +} + int main(void) { board_clock_run(); board_pins_config(); + board_debug_console_open(TRACE_PORT_UART0); // Reset reason reset_cause_get(); @@ -218,29 +301,81 @@ //sys_timer_open(); gpio_open(); - board_led_init(); - adc_open(&usr_adc_cfg); - //adc_get(&sample[0], NUM_SAMPLES, adc_callback);//adc采样 + //board_led_init(); - //flash_open(FLASH_ID0, NULL); - uart_open(UART_ID1, &test_uart_cfg); - Program_Init(); +// adc_open(&usr_adc_cfg); +// IIC2_Init(); +// Accelerometer_Init(); //加速度计初始化必须在IO_control_init之前因为复用SDA引脚 + IO_control_init(); + //adc_get(&sample[0], NUM_SAMPLES, adc_callback);//adc采样 + uart_open(UART_ID1, &test_uart_cfg); + gps_air780_power_change(1,1);//开启gps,4G + Program_Init(); uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback); - sleep_timer_open(true, SLEEP_TIMER_MODE_RELOAD, sleep_timer_callback); -// sleep_timer_start(__MS_TO_32K_CNT(g_com_map[COM_INTERVAL]));//测试 +// Initialize low power mode + power_init(); + g_com_map[BIND_DEV_ID]=0x1122;//测试 + if(bind_check())//绑定后才提前开启测距 + {link_success_flag=temp_main();//上机开启接收2s绑定成功则进行下面轮询测距流程,不成功则1分后再次开启2s接收 + check_if_in_search(); + }else{ + send_struct.bindState=false; + Operation_state=UN_BIND; + } + sleep_timer_open(true, SLEEP_TIMER_MODE_RELOAD, sleep_timer_callback); + //sleep_timer_start(__MS_TO_32K_CNT(g_com_map[COM_INTERVAL]));//测试 + sleep_timer_start(__MS_TO_32K_CNT(1000));//测试 board_5V_input_init(voltage_input_handler); + board_acceleration_detection_init(move_handler); while (1) { + switch(Operation_state){ + case LINK_SUCCESS: + {//连接成功进行轮询测距 + if(g_start_send_flag){ + g_start_send_flag = 0; + uwb_led_on(); simple_main(); - UART_CheckReceive(); + uwb_led_off(); + IdleTask(); + }else{ + IdleTask(); + } + } + break; + case SEARCH_DEV: + {//接包不成功或者通讯失败进入搜索模式 + if(link_error_count==0||first_search_flag){ + first_search_flag=0; + uwb_led_on(); + link_success_flag=temp_main();//第一次开启接收2s绑定失败后则进行下面1分钟后重新开启2s绑定流程 + uwb_led_off(); + if(link_success_flag) + Operation_state=LINK_SUCCESS; + } + IdleTask(); + } + break; + case UN_BIND: + {uwb_led_off();//关闭uwb指示灯 + IdleTask(); + } + break; + } + + //3种情况后都要发包和休眠 + //if(send_flag){ + //message_construct(); + //send_udp; + //air780_success_state=0;//关闭4G成功发送灯 + //blink_led(&air780_success_state);//成功测距闪烁4G状态灯 + //air780_success_state=0; + //} #ifdef DEBUG_MODE if(!gpio_pin_get_val(INPUT_5V_Pin)){ trace_flush(); uint32_t lock = int_lock(); - LOG_INFO(TRACE_MODULE_APP, "进入低功耗"); - //唤醒源设置MK8000修改 - //board_5V_input_init(voltage_input_handler); - sleep_timer_start(__MS_TO_32K_CNT(g_com_map[COM_INTERVAL])); + //LOG_INFO(TRACE_MODULE_APP, "进入低功耗"); power_enter_power_down_mode(0); int_unlock(lock); } -- Gitblit v1.9.3