From da02cf36b7265693bef7d982c6d46b372ed53693 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期三, 21 五月 2025 18:16:14 +0800 Subject: [PATCH] 将网关读取标签配置和修改标签配置调通,但下发修改配置只能改组id其他能改但不能保存,掉电后会初始化问题未解决 --- keil/include/src/Radio/lora_1268.c | 742 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 742 insertions(+), 0 deletions(-) diff --git a/keil/include/src/Radio/lora_1268.c b/keil/include/src/Radio/lora_1268.c new file mode 100644 index 0000000..0ab8651 --- /dev/null +++ b/keil/include/src/Radio/lora_1268.c @@ -0,0 +1,742 @@ +#include <math.h> +#include <string.h> +#include "sx126x.h" +#include "sx126x-board.h" +#include "lora_1268.h" +//#include "lora_3029.h"" +#include "user.h" +#include "sx126x-board.h" +#include "string.h" +#include "stdio.h" +#include <stdlib.h> +#include "mk_spi.h" +#include "global_param.h" +#include "dw_app_anchor.h" +#include "HIDO_TypeDef.h" +#include "PCA9555.h" +#include "mk_misc.h" +/********************************************结构体**************************************************************/ +typedef enum +{ + LOWPOWER, + RX, + RX_TIMEOUT, + RX_ERROR, + TX, + TX_TIMEOUT, +}States_t; +/********************************************结构体**************************************************************/ +/********************************************变量**************************************************************/ +extern wg_state_enum wg_state; + + +/********************************************变量**************************************************************/ + +#define USE_MODEM_LORA + +#if defined( USE_MODEM_LORA ) + +#define LORA_BANDWIDTH 2 // [0: 125 kHz, + // 1: 250 kHz, + // 2: 500 kHz, + // 3: Reserved] +#define LORA_SPREADING_FACTOR 5 // [SF7..SF12] +#define LORA_CODINGRATE 1 // [1: 4/5, + // 2: 4/6, + // 3: 4/7, + // 4: 4/8] +#define LORA_PREAMBLE_LENGTH_T 8 // Same for Tx +#define LORA_PREAMBLE_LENGTH_R 8 // Same for Rx +//#define LORA_PREAMBLE_LENGTH 990 // Same for Tx and Rx +#define LORA_SYMBOL_TIMEOUT 0 // Symbols +#define LORA_FIX_LENGTH_PAYLOAD_ON false +#define LORA_IQ_INVERSION_ON_T false +#define LORA_IQ_INVERSION_ON_R false + + +#elif defined( USE_MODEM_FSK ) + +#define FSK_FDEV 5e3 // Hz +#define FSK_DATARATE 2.4e3 // bps +#define FSK_BANDWIDTH 20e3 // Hz >> DSB in sx126x +#define FSK_AFC_BANDWIDTH 100e3 // Hz +#define FSK_PREAMBLE_LENGTH 5 // Same for Tx and Rx +#define FSK_FIX_LENGTH_PAYLOAD_ON false + +#else + #error "Please define a modem in the compiler options." +#endif + + +/***lora接收,发送变量定义******/ + +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); +extern uint16_t ancidlist_rec[TAG_NUM_IN_SYS],ancidlist_send[TAG_NUM_IN_SYS],rec_ancidlist[TAG_NUM_IN_SYS]; +extern uint8_t report_ancnum; +extern uint16_t report_ancdist[ANC_MAX_NUM],report_ancid[ANC_MAX_NUM]; +//extern wg_state_enum wg_state; +extern uint32_t wg_lost_count; +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; +wg_state_enum wg_state = WG_Lost; +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; +// wg_report_freq = TEST_MANAGE_CHANNEL_FRQ; +// wg_report_sf = TEST_MANAGE_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 LoraHeartBeartPoll(void) +{ + +// lora_up_uwb_flag=2; +// rf_set_default_para(); + +/*****************************心跳包上传内容************************************/ + 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];//将距离校准改为了TX发射功率设置 + checksum = Checksum_u16(lora_sendbuffer,14); + memcpy(&lora_sendbuffer[14],&checksum,2); + Radio.Send(lora_sendbuffer,16); + +/*****************************心跳包上传内容*************************************/ + +} +#define HEATBEAT_UPDATE_TIME 20 +uint16_t heatbeat_count = HEATBEAT_UPDATE_TIME-1 ; +uint16_t flag_getwgresp = 0; +int16_t intheight; //气压 +extern uint32_t dangqian_frqe; +uint16_t recnum[3]; +extern uint32_t freq_list[4]; +extern uint8_t DMA_RXBuf_BT[200]; +extern uint8_t report_ancnum; +extern uint8_t report_ancnum_bt; +uint32_t BT_SEND_lenth=0; +uint8_t BT_NUM=0; +extern uint16_t report_ancdist[ANC_MAX_NUM],report_ancid[ANC_MAX_NUM]; +extern uint8_t bat_percent; +extern uint16_t REV_RX_NUM; +extern uint16_t REV_POLL_NUM; +extern uint16_t REPLY_POLL_NUM; +uint16_t num[3]={0,0,0}; +extern uint8_t stationary_flag; +extern uint8_t SOS_KEY_STATE; +uint32_t LORA_POLL_COUNT=0; +#define GET_USERKEY gpio_pin_get_val(SOS_PIN) +void LoraReportPoll(void) +{ +//// // delay_ms(100); + +////#ifdef _USE_BAR +//// GetPressAndHeight(); +//// intheight = Height*100; +////#endif +////#ifdef _SMT_TEST +//// printf("气压值:%d",intheight); +////#endif + +////// TagListUpdate(); + +//// LoraReportFreqPoll(); +//// flag_getwgresp = 0; + +// SwitchLoraSettings(478,REPORT_CHANNEL_SF,22); + +//// if(heatbeat_count++>HEATBEAT_UPDATE_TIME && WG_Connected == wg_state) //如果心跳包到达上传时间,并且网关处于链接状态,就上传心跳包 +//// { +//// heatbeat_count = 0; +//// LoraHeartBeartPoll(); +//// 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>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+30; +////#else +//// BT_NUM=DMA_RXBuf_BT[0]; +//// if(SOS_KEY_STATE) +//// { +//// BT_NUM=0; +////// } +//// lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_TAGMSGTOWG; +// lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_TAGMSGTOWG_BT; +// //lora_sendbuffer[MSG_LENGTH] = 4*report_ancnum+4*BT_NUM+ANCID_IDX+3; +////#endif +// 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; +//// //GET_USERKEY这个是那个lora——busy那个引脚 +////// lora_sendbuffer[STATE_IDX]=0x01; +////// lora_sendbuffer[GATEWAY_CHANL]=0x02; +////// lora_sendbuffer[CHANL_NUM]=0x03; +//// +////#ifdef USE_GPS +//// memcpy(&lora_sendbuffer[GPS_JINGDU_IDX],&gps_jingdu,8); +//// memcpy(&lora_sendbuffer[GPS_WEIDU_IDX],&gps_jingdu,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[BT_ANCID_IDX] = report_ancnum; +//// memcpy(&lora_sendbuffer[BT_ANCID_IDX+1],report_ancid,report_ancnum*2); +//// memcpy(&lora_sendbuffer[BT_ANCID_IDX+report_ancnum*2+1],report_ancdist,report_ancnum*2); +//// uint8_t LORA_RETRANSNUSSION_BT=0; +////// +////// num[0]=REV_RX_NUM; +////// num[1]=REV_POLL_NUM; +////// num[2]=REPLY_POLL_NUM; +//// LORA_RETRANSNUSSION_BT=BT_ANCID_IDX+report_ancnum*4+1; +//// lora_sendbuffer[LORA_RETRANSNUSSION_BT] = 0x2D; //蓝牙上传标识符 + +//// memcpy(&lora_sendbuffer[LORA_RETRANSNUSSION_BT+1],&DMA_RXBuf_BT[0],BT_NUM*2+1); //基站ID +//// memcpy(&lora_sendbuffer[LORA_RETRANSNUSSION_BT+BT_NUM*2+2],&DMA_RXBuf_BT[1+BT_NUM*2],BT_NUM*2);//基站距离 +//// lora_sendbuffer[MSG_LENGTH] = LORA_RETRANSNUSSION_BT+4*BT_NUM+2; +////// } +////// if(lora_sendbuffer[LORA_RETRANSNUSSION_BT]==0x2D) +////// { +//// checksum = Checksum_u16(lora_sendbuffer,4*BT_NUM+4*report_ancnum+BT_ANCID_IDX+3); +//// memcpy(&lora_sendbuffer[LORA_RETRANSNUSSION_BT+BT_NUM*4+2],&checksum,2); +// BT_SEND_flag=BT_ANCID_IDX+report_ancnum*4+BT_NUM*4+5; +// Radio.Send(lora_sendbuffer,BT_SEND_flag); +//// LORA_POLL_COUNT++; +////// LORA_3029_SINGLE_SEND(lora_sendbuffer,ANCID_IDX+report_ancnum*4+BT_NUM*4+4,0); +////// } +////// else +////// { +////// checksum = Checksum_u16(lora_sendbuffer,4*report_ancnum+ANCID_IDX); +////// memcpy(&lora_sendbuffer[ANCID_IDX+report_ancnum*4],&checksum,2); +////// Radio.Send(lora_sendbuffer,ANCID_IDX+report_ancnum*4+BT_NUM*4+2); +////// } + + +#ifdef _USE_BAR + GetPressAndHeight(); + intheight = Height*100; +#endif +#ifdef _SMT_TEST + printf("气压值:%d",intheight); +#endif + +// TagListUpdate(); + + LoraReportFreqPoll(); + flag_getwgresp = 0; + // wg_report_freq = REPORT_MANGE_CHANNEL_FRQ; + SwitchLoraSettings(wg_report_freq,REPORT_CHANNEL_SF,g_com_map[LORA_POWER]); + if(heatbeat_count++>HEATBEAT_UPDATE_TIME && WG_Connected == wg_state) //如果心跳包到达上传时间,并且网关处于链接状态,就上传心跳包 + { + heatbeat_count = 0; + LoraHeartBeartPoll(); + 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>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+30; +#else + lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_TAGMSGTOWG; + lora_sendbuffer[MSG_LENGTH] = 4*report_ancnum+ANCID_IDX; +#endif + 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_jingdu,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); + Radio.Send(lora_sendbuffer,ANCID_IDX+report_ancnum*4+2); + + +} + +//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; + +uint8_t shengji_flag,time=5; +extern uint32_t uwbled,gpsled,loraled,powerled; +extern struct RxDoneMsg RxDoneParams; + +//extern uint8_t Lora_tx_ancnum; +//extern uint8_t lora_seq_nb2; +extern uint16_t lora_yingda_num; +uint8_t lora_tx_flag=0; +uint8_t lora_txanchor_power_flag; +extern uint16_t Lora_tx_ancid[50]; +extern uint16_t Lora_tx_ancdist[50]; +extern uint8_t Lora_tx_anc_electricity[50]; +uint8_t lora_seq_nb1; + +extern uint8_t lora_sendbuffer[200]; +void LoraSendComMap(uint8_t cmd) +{ + uint8_t data_length = 0x50; + uint16_t checksum = 0; + lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_READPARARESP; + lora_sendbuffer[MSG_LENGTH] = data_length+11; + memcpy(&lora_sendbuffer[SOURCE_ID_IDX],&g_com_map[DEV_ID],2); + memcpy(&lora_sendbuffer[DEST_ID_IDX],&wg_report_id,2); + lora_sendbuffer[RP_CMD_IDX] = cmd; + lora_sendbuffer[RP_INDEX_IDX] = 2; + lora_sendbuffer[RP_LEN_IDX] = data_length; + memcpy(&lora_sendbuffer[9], &g_com_map[1], data_length); + checksum = Checksum_u16(lora_sendbuffer,11+data_length); + memcpy(&lora_sendbuffer[11+data_length],&checksum,2); +// LORA_3029_SINGLE_SEND(lora_sendbuffer,data_length+13,0); + Radio.Send(lora_sendbuffer,data_length+13); + //++; + // Delay_Ms(100); +} +void LoraRspWriteCommap(uint8_t index) +{ + uint8_t data_length = 2; + uint16_t checksum = 0; + lora_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_READPARARESP; + lora_sendbuffer[MSG_LENGTH] = data_length+9; + memcpy(&lora_sendbuffer[SOURCE_ID_IDX],&g_com_map[DEV_ID],2); + memcpy(&lora_sendbuffer[DEST_ID_IDX],&wg_report_id,2); + lora_sendbuffer[RP_CMD_IDX] = WGRSP_RWTAG_WRITE; + lora_sendbuffer[RP_INDEX_IDX] = index; + lora_sendbuffer[RP_LEN_IDX] = data_length; + memcpy(&lora_sendbuffer[7], &g_com_map[index/2], data_length); + checksum = Checksum_u16(lora_sendbuffer,9+data_length); + memcpy(&lora_sendbuffer[9+data_length],&checksum,2); + Radio.Send(lora_sendbuffer,data_length+11); + + //LORA_3029_SINGLE_SEND(lora_sendbuffer,data_length+11,0); + // Delay_Ms(100); +} +uint8_t t22[20],ti; +uint8_t no_yingdaflag; +uint8_t aRxBuffer[1]; + +extern uint8_t group_id; +uint16_t lora_send_count; +uint8_t mode_flag=0; +uint32_t frqe,dangqian_frqe; + +uint8_t sum_count; +void Lora_Tx_Poll() +{ + +// if(lora_tx_flag) +// { +// OnMaster(); +//// +// //rf_enter_continous_rx(); +// } + if(lora_tx_flag) + { +// gpio_pin_set(IO_PIN_5); + + + if(lora_send_count++%10==0||lora_jianting_flag) + { + sum_count++; + lora_tx_flag=0; +#ifdef GROUPID_SWITCH + if(rec_secdelay>0) + { + rec_secdelay--; + return; + } +#endif + + LoraReportPoll(); + + } + } + + +} + +////States_t State = LOWPOWER; + +//////int8_t RssiValue = 0; +//////int8_t SnrValue = 0; +////uint8_t lora_chongfuyingda_flag; +////uint8_t Lora_rx_open_flag; +////extern u32 Loratx_frequency; +uint8_t huifushengjibao_flag; +uint8_t LoraUp_flag; +//uint8_t lora_up_rec_flag; +uint8_t flag_writepara_needreset = 0; +//uint32_t wg_lost_count = 10; +//uint32_t lora_zhuangtai; +//uint16_t current_count; +//extern wg_state_enum wg_state; +uint8_t txdone=0; +void OnTxDone( void ) +{ + txdone++; + if(flag_writepara_needreset) //配置写入完成设备需要重启 + { + printf("网关下发配置写入完成,重启"); + SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader + } + Radio.Standby(); + if(LoraUp_flag) + { + huifushengjibao_flag=1; + Radio.Rx( 500 ); + } + else + { + Radio.Rx( 50 ); + //LORA_LED_OFF; + } +} +#define BUFFER_SIZE 255 // Define the payload size here + +extern uint8_t imu_enable,motor_enable; +extern uint8_t lora_jianting_flag,report_ancnum; +extern uint16_t motor_keeptime; +extern uint32_t dev_id; +//extern wg_state_enum wg_state; +uint16_t rec_value,rec_delaytime,rx_count,datalen_offset; +uint16_t BufferSize = BUFFER_SIZE; +uint16_t CRC16=0; +uint16_t DEST_ID=0; +uint8_t shengji_flag; +int8_t RssiValue = 0; +int8_t SnrValue = 0; +uint8_t TX_Buffer[BUFFER_SIZE]; +uint8_t RX_Buffer[BUFFER_SIZE]; +static RadioEvents_t RadioEvents; +static uint16_t delaytime = 771; +static uint16_t source_id; + + +uint8_t rec_index,rec_secdelay; +uint16_t rec_value,rx_count,datalen_offset; +int32_t target_count; +uint32_t sleep_time_count=0; +uint32_t sleep_time_count_LAST=0; +uint16_t time_count; +uint8_t LoraUp_flag; +uint16_t REV_WG_pack=0; +uint8_t rxdone=0; +void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr ) +{ + uint16_t checksum1; + BufferSize = size; + memcpy( RX_Buffer, payload, BufferSize ); + RssiValue = rssi; + SnrValue = snr; + Radio.Standby(); + rxdone++; + no_rx_flag = 0; + lora_up_rec_flag=1; + if(RX_Buffer[MSG_TYPE_IDX]==LORA_MSGTYPE_WGRESPTAG) + { + checksum1=Checksum_u16(RX_Buffer,BufferSize-2); + + memcpy(&DEST_ID,&RX_Buffer[DEST_ID_IDX],2); + memcpy(&CRC16,&RX_Buffer[BufferSize-2],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; + switch(RX_Buffer[PWTAG_RW_FLAG_IDX]) + { + case WGRSP_RWTAG_NONE: +// REV_WG_pack++; +// wg_report_freq = RX_Buffer[POLL_FREQ_IDX]+400; +// memcpy(&rec_delaytime,&RX_Buffer[NEXTPOLL_TIME_IDX],2); + +// if(report_ancnum<2) +// { +// datalen_offset = report_ancnum*85; +// }else{ +// datalen_offset = (report_ancnum-1)*46+85; +// } +// rec_secdelay = RX_Buffer[PWTAG_SECDELAY_IDX]; +// if(BufferSize!=13||rec_secdelay>20) +// { +// rec_secdelay = 0; +// } +// if(rec_delaytime<500) +// { +// int t; +// t++; +// } +//// sleep_time_count =(__MS_TO_32K_CNT(rec_delaytime)/10)- delaytime-datalen_offset; +// sleep_time_count =(__MS_TO_32K_CNT(rec_delaytime)/10); +// while(sleep_time_count>=32768) +// { +// sleep_time_count-=32768; +// } +// while(sleep_time_count<2000) +// { +// sleep_time_count+=10000; +// } +// if(REV_WG_pack==1) +// { +// sleep_time_count_LAST=sleep_time_count; +// } +// if(abs(sleep_time_count_LAST-sleep_time_count)>2000||REV_WG_pack==1) +// { +// sleep_timer_start(sleep_time_count); + time_count++; +// } + 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]; + switch(rec_index) + { + case 0xdd: //语音下发 + break; +// case 0x20: //蜂鸣 +// memcpy(&rec_value,&RX_Buffer[PWTAG_WRITE_VALUE_IDX],2); +// motor_keeptime = rec_value; +// break; + default : + 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>0XAC00||rec_wenjian_daxiao==0) +// {}//文件过大,超出范围 +// else +// { +// memcpy(&wangguan_up_id,&RX_Buffer[SOURCE_ID_IDX],2);//网关ID 占用2个字节 +// shengji_flag=1; +// LoraUp_flag=1; +// imu_enable=0; +// } +//// LoraUp_Poll(); +// break; +// } + break; + } + } + } + + } + if(!no_rx_flag) + { + if(lora_jianting_flag&&LoraUp_flag==0) + { + SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0); + Radio.Rx(0); + } + } +} + +void OnTxTimeout( void ) +{ + Radio.Standby(); + if(lora_jianting_flag) + { + SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0); + Radio.Rx(0); + } +} + +void OnRxTimeout( void ) +{ + Radio.Standby(); + if(lora_jianting_flag) + { + SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0); + Radio.Rx(0); + } +} + + +void OnRxError( void ) +{ + + Radio.Standby(); + if(lora_jianting_flag) + { + SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0); + Radio.Rx(0); + } +} + + + +uint16_t freq_test; +void SwitchLoraSettings(uint32_t freq,uint8_t sf,uint8_t power) +{ + Radio.Standby(); + Radio.SetChannel( freq*1000000 ); + freq_test = freq; + Radio.SetTxConfig( MODEM_LORA, power, 0, 2, + sf, LORA_CODINGRATE,LORA_PREAMBLE_LENGTH_T, LORA_FIX_LENGTH_PAYLOAD_ON, + false, 0, 0, LORA_IQ_INVERSION_ON_T, 3000 ); + + Radio.SetRxConfig( MODEM_LORA, LORA_BANDWIDTH, + sf,LORA_CODINGRATE, 0, LORA_PREAMBLE_LENGTH_R, + LORA_SYMBOL_TIMEOUT, LORA_FIX_LENGTH_PAYLOAD_ON, + 0, false, 0, 0, LORA_IQ_INVERSION_ON_R, 0 ); +} + + +uint8_t active_flag; +void Lora_1268_Init(void) +{ + RadioEvents.TxDone = OnTxDone; + RadioEvents.RxDone = OnRxDone; + RadioEvents.TxTimeout = OnTxTimeout; + RadioEvents.RxTimeout = OnRxTimeout; + RadioEvents.RxError = OnRxError; + + Radio.Init( &RadioEvents ); +// SwitchLoraSettings(UWB_CHANNEL_FRQ+group_id,UWB_CHANNEL_SF,0); //切换lora接收频点 + if(active_flag) + { + Radio.Rx( 0 ); + } +// else{ +// Radio.Sleep(); +// } +// Radio.SetRxDutyCycle(RxDutyCycle_RX_time,RxDutyCycle_SLEEP_time); + +} -- Gitblit v1.9.3