From 4170266b0f0e779d0c1dcbe519e3307e9f2cde7a Mon Sep 17 00:00:00 2001 From: yincheng.zhong <634916154@qq.com> Date: 星期一, 22 一月 2024 15:33:15 +0800 Subject: [PATCH] 增加同步部分代码,未测试 --- Src/application/dw_mbx_anc.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 139 insertions(+), 17 deletions(-) diff --git a/Src/application/dw_mbx_anc.c b/Src/application/dw_mbx_anc.c index a9ca1e9..ad2bd16 100644 --- a/Src/application/dw_mbx_anc.c +++ b/Src/application/dw_mbx_anc.c @@ -1,11 +1,141 @@ +#include "dw_mbx_anc.h" +///////////////////////////////////免布线时间同步代码 -//免布线基站端代码 -#include "dw_app.h" -#include "deca_device_api.h" -#include "deca_regs.h" -#include "dw_driver.h" -#include "Spi.h" -#include "global_param.h" + + +typedef enum{ Sync_Lost, //同步丢失 同步时间 100秒同步一次,每次同步开启2秒,发起测距请求 + Sync_Range,//同步状态 测距 同步时间 10秒同步一次,开启10ms,发起测距请求 + Sync_Config,//同步状态 配置 同步时间 1秒同步一次,不发起测距请求 + Sync_Sleep, //同步状态 休眠 同步时间 100秒同步一次,不发起测距请求 +}sync_state_enum; +sync_state_enum sync_state = Sync_Lost; + +static uint8_t sync_interval_s,range_state = 0; +static uint16_t sync_listen_ms; + +void SyncStateSwitch(void) //同步切换逻辑,开机LOST状态,收到信号后进入同步状态,在同步状态中,根据收到的网关信息判断测距还是休眠 测距 配置状态 +{ + switch(sync_state) + { + case Sync_Lost: + sync_interval_s = 100; + sync_listen_ms =2000; + range_state = 1; + break; + case Sync_Range: + sync_interval_s = 10; + sync_listen_ms =5; + range_state = 1; + break; + case Sync_Config: + sync_interval_s = 1; + sync_listen_ms =5; + range_state = 0; + break; + case Sync_Sleep: + sync_interval_s = 100; + sync_listen_ms =5; + range_state = 0; + break; + } +} +uint8_t GetRangeState(void) +{ + return range_state; +} +#define SYNCLOST_THRES 10 + + + +static uint16_t current_count,poll_startcount,start_count,end_count,poll_timeout; +static uint8_t sync_interval_count = 0,flag_sync_success,sync_lost_count; +void SetFlagSyncSuccess(uint8_t value) +{ + flag_sync_success = value; +} + +static uint16_t sync_wg_id,rec_sync_count; +uint8_t lora_recbuffer[255],lora_recbuffer_len; +static uint16_t synclock_zero_count,wg_sync_polltime_100us,uwbpoll_time_count; +uint16_t GetUwbPollCount(void) +{ + return uwbpoll_time_count; +} +uint16_t GetWGRecSyncCount(void) +{ + return rec_sync_count; +} +void SyncClockProcess(void) //同步时钟函数获取下次UWBpoll的定时器count。 +{ + memcpy(&wg_sync_polltime_100us,&lora_recbuffer[SYSTIME_IDX],2); //WG下发的同步时间,单位0.1ms。 + synclock_zero_count = rec_sync_count-(uint32_t)wg_sync_polltime_100us*100/LPTIMER_LSB; + if(synclock_zero_count<0) + synclock_zero_count+=32768; + uwbpoll_time_count = synclock_zero_count + (uint32_t)g_com_map[UWBPOLLTIME_MS_IDX]*1000/LPTIMER_LSB; + if(uwbpoll_time_count>32768) + uwbpoll_time_count-=32768; +} +void LoraSyncRecPoll(void) +{ + if(sync_interval_count++>=sync_interval_s) + { + sync_interval_count = 0; + flag_sync_success = 0; + SwitchLoraToSyncRec(); //切换lora接收频点 + + start_count=HAL_LPTIM_ReadCounter(&hlptim1); //等待接收完成直到超时 + poll_timeout=sync_listen_ms*10; //单位0.1ms + end_count=start_count+(poll_timeout<<2); + if(end_count>=32768) + {end_count-=32768;} + current_count=HAL_LPTIM_ReadCounter(&hlptim1); + while(GetFlagLoraWaitSync()) + { + current_count=HAL_LPTIM_ReadCounter(&hlptim1); + if(current_count>=end_count&¤t_count<end_count+15000) + { + break; + } + } + if(flag_sync_success) //同步成功 + { + sync_lost_count = 0; + lora_recbuffer_len = GetLoraBufferAndLen(lora_recbuffer,&rec_sync_count);//获取LORA收到的数据和长度 + if(lora_recbuffer[MSG_TYPE_IDX]==LORA_MSGTYPE_SYNC) + { + memcpy(&g_com_map[SYNCWG_ID_IDX],&lora_recbuffer[WG_ID_IDX],2); + if(lora_recbuffer[RANGE_STATE_IDX]) + { + sync_state = Sync_Range; + }else{ + sync_state = Sync_Sleep; + } + switch(lora_recbuffer[SUBMSGTYPE_IDX]) + { + case SUBMSG_READ_ANCPARA: + + break; + case SUBMSG_WRITE_ANCPARA: + + break; + case SUBMSG_UPDATE_ANC: + + break; + } + } + }else{ + if(sync_lost_count++>SYNCLOST_THRES) + { + sync_state = Sync_Lost; + SyncStateSwitch(); + } + } + } + // Radio.Sleep( ); //如果超时就sleep +} +////////////////////////////免布线测距相关代码 + + #define TAG_KEEPTIMES 30 //标签存活时间 #define MAX_TAG_LIST_NUM 200 //同时通讯标签最大数量 @@ -18,7 +148,7 @@ static u8 frame_seq_nb,frame_len; -static uint16_t current_count,poll_startcount,start_count,end_count,poll_timeout; + static uint32_t status_reg = 0; extern int32_t dwt_readcarrierintegrator(void); static int32_t test2; @@ -185,15 +315,7 @@ uwb_sendbuffer[MESSAGE_TYPE_IDX] = MBX_POLL; dwt_writetxdata(13+4*tag_num_tosend, uwb_sendbuffer, 0);//将Poll包数据传给DW1000,将在开启发送时传出去 dwt_writetxfctrl(13+4*tag_num_tosend, 0);//设置超宽带发送数据长度 -// current_count=HAL_LPTIM_ReadCounter(&hlptim1); -// while(current_count<poll_startcount||current_count>poll_startcount+16384) -// { -// current_count=HAL_LPTIM_ReadCounter(&hlptim1); -// if(current_count<poll_startcount-300) -// { -// break; -// } -// } + dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//开启发送,发送完成后等待一段时间开启接收,等待时间在dwt_setrxaftertxdelay中设置 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); -- Gitblit v1.9.3