From 6d08f540240e0baad08328f06c66d8e2fb1f336f Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期三, 04 十二月 2024 09:16:16 +0800 Subject: [PATCH] 实现,1对1通信,超时时间2ms --- keil/lora_3029.c | 346 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 345 insertions(+), 1 deletions(-) diff --git a/keil/lora_3029.c b/keil/lora_3029.c index c88ff6e..4e3738b 100644 --- a/keil/lora_3029.c +++ b/keil/lora_3029.c @@ -1,10 +1,36 @@ #include "lora_3029.h" #include "mk_spi.h" +#include "global_param.h" +#include "pan_port.h" +//#include "WS2812.h" //#include "pan_port.h" //#include "pan_param.h" //#include "pan_rf.h" +//#define RX_TIMEOUT_VALUE 1000 +//extern LPTIM_HandleTypeDef hlptim1; +/***lora接收,发送变量定义******/ +#define RX_TIMEOUT_VALUE 0 +#define BUFFER_SIZE 255 // Define the payload size here +uint16_t BufferSize = BUFFER_SIZE; +uint8_t TX_Buffer[BUFFER_SIZE]; +uint8_t RX_Buffer[BUFFER_SIZE]; + +int8_t RssiValue = 0; +int8_t SnrValue = 0; +extern uint32_t current_count; + +extern uint32_t dev_id; +uint8_t yuyin_no_sleep_flag,no_rx_flag; +uint8_t lora_up_rec_flag; +static uint16_t source_id; +/***lora接收,发送变量定义******/ +uint32_t wg_lost_count = 10; static uint8_t tx_buf[10] = {0x55, 0x44, 0x33, 0x22, 0x11}; static uint8_t rx_buf[10] = {0x00}; +//extern uint32_t uwbled,gpsled,loraled,powerled; +extern uint8_t bat_percent,taglist_num; +uint8_t report_ancnum; +uint16_t report_ancdist[ANC_MAX_NUM],report_ancid[ANC_MAX_NUM]; extern void spi_transfer_callback(void *dev, uint32_t err_code); void Lora_init(void) { @@ -13,8 +39,9 @@ // uint8_t rx_data = 0; // 用于存储接收的数据 // spi_transfer(SPI_ID0, 0x09, rx_buf, 1, spi_transfer_callback); uint32_t ret = 0; - uint32_t cnt = 0; + uint32_t cnt = 0; ret=rf_init(); + set_test_mode1_reg(); if(ret== 1) { // printf("LORA Init Fail"); @@ -25,6 +52,323 @@ // printf("LORA Init OK\r\n"); } } +wg_state_enum wg_state = WG_Lost; +uint8_t lora_sendbuffer[200]; +uint8_t seq_num; +extern uint16_t lora_up_uwb_flag; +//extern uint8_t wg_lost_count; +uint16_t wg_report_freq,wg_report_id; +uint8_t wg_report_sf; +#define WG_LOST_SWITCH_THRES 3 +#define WG_LOST_NOUWB_COUNT 60 +#define DEFAULT_WG_ID 0xFFFF +#define DEFAULT_LR_WG_ID 0xFFFE +uint8_t lora_jianting_flag = 1; +void LoraReportFreqPoll(void) +{ + // wg_state = WG_Lost; + if(wg_lost_count++>WG_LOST_NOUWB_COUNT) + { + lora_jianting_flag = 0; + } else { + lora_jianting_flag = 1; + } + if(wg_state==WG_Lost) + { + static uint8_t channel_switch_count = 0; + // channel_switch_count = 10; + if(channel_switch_count++>1) + { +// channel_switch_count = 0; +// wg_report_id = DEFAULT_LR_WG_ID; +// wg_report_freq = LR_DATA_CHANNEL_FRQ; //如果丢失链接就进入WG管理信道。 +// wg_report_sf = LR_DATA_CHANNEL_SF; + } + else + { + wg_report_id = DEFAULT_WG_ID; + wg_report_freq = REPORT_MANGE_CHANNEL_FRQ; //如果丢失链接就进入WG管理信道。 + wg_report_sf = REPORT_CHANNEL_SF; + } + } else { + if(wg_lost_count>WG_LOST_SWITCH_THRES) + { + wg_state = WG_Lost; + } + } +} +static uint16_t checksum; + +//uint16_t wg_report_freq,wg_report_id; +uint8_t lora_sendbuffer[200]; +void Lora_UploadHeartBeartPoll(void) +{ + +// lora_up_uwb_flag=2; +// rf_set_default_para(); + + rf_enter_continous_tx(); +/*****************************心跳包上传内容************************************/ + lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_TAGHEARTBEAT; + lora_sendbuffer[MSG_LENGTH] = 14; + memcpy(&lora_sendbuffer[SOURCE_ID_IDX],&g_com_map[DEV_ID],2); + memcpy(&lora_sendbuffer[DEST_ID_IDX],&wg_report_id,2); + memcpy(&lora_sendbuffer[HB_VERSION_IDX],&g_com_map[VERSION],2); + lora_sendbuffer[HB_UWBPOWER_IDX] = g_com_map[POWER]; + lora_sendbuffer[HB_LORAPOWER_IDX] = g_com_map[LORA_POWER]; + checksum = Checksum_u16(lora_sendbuffer,14); + memcpy(&lora_sendbuffer[14],&checksum,2); +/*****************************心跳包上传内容*************************************/ + rf_set_transmit_flag(RADIO_FLAG_TXDONE); + + if(rf_get_transmit_flag()==RADIO_FLAG_TXDONE) + { + if(rf_continous_tx_send_data(lora_sendbuffer, 16)==OK) + { + //LOG_INFO(TRACE_MODULE_APP,"设备ID: %x .\r\n"); + } + while (rf_get_transmit_flag() == RADIO_FLAG_IDLE) + ; + //rf_enter_continous_rx();; + rf_set_transmit_flag(RADIO_FLAG_IDLE); + } + +} +#define HEATBEAT_UPDATE_TIME 3600 +uint16_t heatbeat_count = HEATBEAT_UPDATE_TIME-1 ; +uint16_t flag_getwgresp = 0; +int16_t intheight; //气压 +void Lora_Report_poll(void) +{ + LoraReportFreqPoll(); + flag_getwgresp = 0; //网关回复标志位 && WG_Connected == wg_state + uint32_t ret = 0; + ret = rf_init(); + + set_test_mode1_reg(); + if(ret==OK) + { + rf_set_default_para(wg_report_freq*1000000,wg_report_sf); + } +// +// + if(heatbeat_count++>HEATBEAT_UPDATE_TIME) //如果心跳包到达上传时间,并且网关处于链接状态,就上传心跳包 + { + heatbeat_count = 0; + Lora_UploadHeartBeartPoll(); + //rf_irq_process(); + return; + } + for(uint16_t i=0; i<report_ancnum-1; i++) + { + for(uint16_t j=0; j<report_ancnum-1-i; j++) + { + if(report_ancdist[j]>report_ancdist[j+1]) + { + uint16_t id,dist; + uint8_t bat; + id = report_ancid[j]; + dist = report_ancdist[j]; + report_ancid[j] = report_ancid[j+1]; + report_ancdist[j] = report_ancdist[j+1]; + report_ancid[j+1] = id; + report_ancdist[j+1] = dist; + } + } + } + if(report_ancnum>0) + { + //uwbled=0x11; //blue + } + else + { + //uwbled=0x1100; //red + } + if(report_ancnum>LORA_REPORT_MAXANC_NUM) //考虑lora传输时间,最多发送10个基站数据。 + report_ancnum = LORA_REPORT_MAXANC_NUM; + +#ifdef USE_GPS + lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_TAGMSGTOWG_GPS; + lora_sendbuffer[MSG_LENGTH] = 4*report_ancnum+ANCID_IDX; +#else + lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_TAGMSGTOWG; + lora_sendbuffer[MSG_LENGTH] = 4*report_ancnum+ANCID_IDX; +#endif + +// 2000f026 02020002 //000220200 + memcpy(&lora_sendbuffer[SOURCE_ID_IDX],&g_com_map[DEV_ID],2); + memcpy(&lora_sendbuffer[DEST_ID_IDX],&wg_report_id,2); + lora_sendbuffer[SEQNUM_IDX] = seq_num++; + lora_sendbuffer[BAT_IDX] = bat_percent; + // lora_sendbuffer[STATE_IDX] = !GET_USERKEY|stationary_flag<<1; +#ifdef USE_GPS + memcpy(&lora_sendbuffer[GPS_JINGDU_IDX],&gps_jingdu,8); + memcpy(&lora_sendbuffer[GPS_WEIDU_IDX],&gps_weidu,8); + memcpy(&lora_sendbuffer[GPS_HEIGHT_IDX],&gps_height,8); + lora_sendbuffer[GPS_STATE_IDX] = gps_state; + lora_sendbuffer[GPS_SATEL_NUM_IDX] = gps_satel_num; + lora_sendbuffer[GPS_SPOWER_IDX] = gps_signalpower; + lora_sendbuffer[GPS_CHAFENLINGQI] = gps_chafenlingqi; +#endif + + memcpy(&lora_sendbuffer[BAR_HEIGHT_IDX],&intheight,2); + lora_sendbuffer[ANCNUM_IDX] = report_ancnum; + + memcpy(&lora_sendbuffer[ANCID_IDX],report_ancid,report_ancnum*2); + memcpy(&lora_sendbuffer[ANCID_IDX+report_ancnum*2],report_ancdist,report_ancnum*2); + + checksum = Checksum_u16(lora_sendbuffer,4*report_ancnum+ANCID_IDX); + memcpy(&lora_sendbuffer[ANCID_IDX+report_ancnum*4],&checksum,2); + rf_enter_continous_tx(); + //rf_irq_process(); + rf_set_transmit_flag(RADIO_FLAG_TXDONE); + + if(rf_get_transmit_flag()==RADIO_FLAG_TXDONE) + { + if(rf_continous_tx_send_data(lora_sendbuffer,ANCID_IDX+report_ancnum*4+2)==OK) + { + //LOG_INFO(TRACE_MODULE_APP,"设备ID: %x .\r\n"); + } + while (rf_get_transmit_flag() == RADIO_FLAG_IDLE) + ; + //rf_enter_continous_rx();; + rf_set_transmit_flag(RADIO_FLAG_IDLE); + + } + // rf_enter_continous_rx(); + +} +extern uint8_t report_ancnum; +static uint16_t delaytime = 1200; +static uint16_t source_id; +uint8_t rec_index,rec_secdelay; +uint16_t rec_value,rec_delaytime,rx_count; +uint16_t rec_value,rec_delaytime,rx_count,datalen_offset; +int32_t target_count; +uint8_t shengji_flag,time=5; +extern uint32_t uwbled,gpsled,loraled,powerled; +extern struct RxDoneMsg RxDoneParams; +void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) +{ uint16_t checksum1; + BufferSize = size; + memcpy(RX_Buffer,RxDoneParams.Payload,RxDoneParams.Size); + // memcpy( RX_Buffer, payload, BufferSize ); + RssiValue = rssi; + SnrValue = snr; + //Radio.Standby(); + no_rx_flag = 0; + lora_up_rec_flag=1; +// if(RX_Buffer[MSG_TYPE_IDX]==LORA_MSGTYPE_RANGEPOLL) +// { +// UwbRange(); +// rf_delay_us(time*1000); +// // UWB_RXStart(10); +// // delay_ms(time); +// } + if(RX_Buffer[MSG_TYPE_IDX]==LORA_MSGTYPE_WGRESPTAG) + { + checksum1=Checksum_u16(RX_Buffer,BufferSize-2); + if(!memcmp(&checksum1,&RX_Buffer[BufferSize-2],2)) + if(!memcmp(&dev_id,&RX_Buffer[DEST_ID_IDX],2)) + { + memcpy(&source_id,&RX_Buffer[SOURCE_ID_IDX],2); + if(wg_state==WG_Lost) + { + wg_state = WG_Connected; + wg_report_id = source_id; + } + if(!memcmp(&wg_report_id,&RX_Buffer[SOURCE_ID_IDX],2)) + { + wg_lost_count = 0; + // loraled=GREEN; + switch(RX_Buffer[PWTAG_RW_FLAG_IDX]) + { + case WGRSP_RWTAG_NONE: + // current_count = HAL_LPTIM_ReadCounter(&hlptim1); + wg_report_freq = RX_Buffer[POLL_FREQ_IDX]+400; + memcpy(&rec_delaytime,&RX_Buffer[NEXTPOLL_TIME_IDX],2); + rec_secdelay = RX_Buffer[PWTAG_SECDELAY_IDX]; + if(BufferSize!=13||rec_secdelay>20) + { + rec_secdelay = 0; + } + + if(report_ancnum<2) + { + datalen_offset = report_ancnum*85; + }else{ + datalen_offset = (report_ancnum-1)*46+85; + } + + target_count = current_count + rec_delaytime*3.2768 - delaytime-datalen_offset; + while(target_count>=32768) + target_count-=32768; +// __HAL_LPTIM_COMPARE_SET(&hlptim1, target_count); +// rx_count = HAL_LPTIM_ReadCounter(&hlptim1); + // printf("tx %d,rx %d,delay %d",current_count>>5,rx_count>>5,rec_delaytime); + break; + case WGRSP_RWTAG_READ: + no_rx_flag = 1; + //LoraSendComMap(WGRSP_RWTAG_READ); + break; + case WGRSP_RWTAG_WRITE: + rec_index = RX_Buffer[PWTAG_WRITE_IDX_IDX]; + if(rec_index<=DEV_ID) + return; + if(rec_index==0xDD) + { +// if(usart5_state==1) +// { +// Usart5Init(); +// usart5_state=0; +// } +// HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET); +// HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); +// memcpy(&xiafayuyin_data,&RX_Buffer[PWTAG_WRITE_VALUE_IDX],BufferSize-PWTAG_WRITE_VALUE_IDX-2); +// yuyin_sendflag=1; +// yuyinzidongguan_time=0; +// yuyin_no_sleep_flag=1; +// SYN_FrameInfo(0,xiafayuyin_data); //播放内容 +// memset(xiafayuyin_data,0,sizeof(xiafayuyin_data)); + // LoraRspWriteCommap(SUBMSG_WRITE_ANCPARA); + no_rx_flag = 1; + }else{ + memcpy(&rec_value,&RX_Buffer[PWTAG_WRITE_VALUE_IDX],2); + g_com_map[rec_index/2] = rec_value; + save_com_map_to_flash(); + // LoraRspWriteCommap(SUBMSG_WRITE_ANCPARA); +// flag_writepara_needreset = 1; + no_rx_flag = 1; + } + break; + case WGRSP_RWTAG_UPDATE: + rec_index = RX_Buffer[PWTAG_WRITE_IDX_IDX]; + switch(rec_index) + { + case 0xaa: //升级下发 +// memcpy(&rec_wenjian_daxiao,&RX_Buffer[WRITEPARA_VALUE_IDX],2);//文件大小 +// if(rec_wenjian_daxiao>APP_SIZE||rec_wenjian_daxiao==0) +// {}//文件过大,超出范围 +// else +// { +// memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//网关ID 占用2个字节 +// shengji_flag=1; +// LoraUp_flag=1; +// } + break; + } + break; + } + } + } + } +// if(!no_rx_flag&&LoraUp_flag==0) +// { +// if(RX_Buffer[MSG_TYPE_IDX]!=LORA_MSGTYPE_RANGEPOLL) +// SwitchLoraSettings(UWB_CHANNEL_FRQ+g_com_map[GROUP_ID],UWB_CHANNEL_SF,0); +// Radio.Rx(0); +// } +} //void LORA_mode_select(void) //{ // if(TX_RX_SELECT==1) -- Gitblit v1.9.3