#include "dw_mbx_anc.h" ///////////////////////////////////Ãâ²¼Ïßʱ¼äͬ²½´úÂë #define CONFIG_REMAIN_TIME 120 sync_state_enum sync_state = Sync_Lost; int16_t intheight; static uint8_t sync_interval_s,range_state = 0,config_state_count = CONFIG_REMAIN_TIME; static uint16_t sync_listen_ms; void MbxInit(void) { // config_state_count = CONFIG_REMAIN_TIME; } void SyncStateSwitch(void) //ͬ²½Çл»Âß¼­£¬¿ª»úLOST״̬£¬ÊÕµ½Ðźźó½øÈëͬ²½×´Ì¬£¬ÔÚͬ²½×´Ì¬ÖУ¬¸ù¾ÝÊÕµ½µÄÍø¹ØÐÅÏ¢Åжϲâ¾à»¹ÊÇÐÝÃß ²â¾à ÅäÖÃ״̬ { switch(sync_state) { case Sync_Lost: sync_interval_s = 100; //100 sync_listen_ms =1500; range_state = 1; break; case Sync_Range: sync_interval_s = 10; //10 sync_listen_ms =15; range_state = 1; if(config_state_count>0) { config_state_count--; sync_interval_s = 1; } break; case Sync_Sleep: sync_interval_s = 10;//10 sync_listen_ms =15; range_state = 0; if(config_state_count>0) { config_state_count--; sync_interval_s = 1; } break; } } uint8_t GetRangeState(void) { // range_state = 0; return range_state; } #define SYNCLOST_THRES 10 static uint16_t current_count,poll_startcount,start_count,end_count,poll_timeout; uint8_t sync_interval_count = 100,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 wg_sync_polltime_100us,uwbpoll_time_count; int16_t synclock_zero_count; uint16_t GetUwbPollCount(void) { uwbpoll_time_count = synclock_zero_count+g_com_map[UWBPOLLTIME_MS_IDX]*33; if(uwbpoll_time_count>=32768) uwbpoll_time_count-=32768; return uwbpoll_time_count; } uint16_t GetWGRecSyncCount(void) { return rec_sync_count; } void SyncClockProcess(void) //ͬ²½Ê±ÖÓº¯Êý»ñȡϴÎUWBpollµÄ¶¨Ê±Æ÷count¡£ { } #define HEATBEAT_UPDATE_TIME_S 600 //ÐÄÌø°üÒ»¸öСʱÉÏ´«Ò»´Î static uint16_t current_count,target_count,wg_report_id; uint16_t heartbeat_count = HEATBEAT_UPDATE_TIME_S; static uint8_t heatbeat_buffer[100]; void HeartbeatPoll(uint16_t wangguanid) {//ÐÄÌø°üÉÏ´« ID °æ±¾ºÅ С×é UWB¹¦ÂÊ LORA¹¦ÂÊ UWB·¢ËÍʱ¼ä heartbeat_count+=sync_interval_s; if(heartbeat_count>HEATBEAT_UPDATE_TIME_S) { uint16_t checksum1 = 0; heartbeat_count = 0; heatbeat_buffer[MSG_TYPE_IDX] = LORA_MSGTYPE_ANC_HEARTBEAT; heatbeat_buffer[MSG_LENGTH] = 17; memcpy(&heatbeat_buffer[SOURCE_ID_IDX],&g_com_map[DEV_ID],2); memcpy(&heatbeat_buffer[DEST_ID_IDX],&wangguanid,2); memcpy(&heatbeat_buffer[ANC_HB_VERSION_IDX],&g_com_map[VERSION],2); memcpy(&heatbeat_buffer[ANC_HB_UWBPOLLTIME_IDX],&g_com_map[UWBPOLLTIME_MS_IDX],2); heatbeat_buffer[ANC_HB_UWBPOWER_IDX] = g_com_map[POWER]; heatbeat_buffer[ANC_HB_LORAPOWER_IDX] = g_com_map[LORA_POWER]; heatbeat_buffer[ANC_HB_BATTARY_IDX] = bat_percent; checksum1=Checksum_u16(heatbeat_buffer,17); memcpy(&heatbeat_buffer[17],&checksum1,2); Radio.Send(heatbeat_buffer, 19); Delay_Ms(60); } } static uint8_t lora_sendbuffer[200]; uint8_t flag_writepara_needreset; static uint8_t data_length; void LoraSendComMap(uint8_t cmd) { uint16_t checksum = 0; data_length = 80; 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); Radio.Send(lora_sendbuffer,data_length+13); Delay_Ms(160); } void LoraRspWriteCommap(uint8_t index) { uint16_t checksum = 0; data_length = 2; 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); Delay_Ms(160); } static uint8_t rec_index; uint16_t rec_value; void LoraSyncRecPoll(void) { if(++sync_interval_count>=sync_interval_s) { sync_interval_count = 0; flag_sync_success = 0; SwitchLoraSettings(SYNC_CHANNEL_FRQ,7,22); //Çл»lora½ÓÊÕÆµµã//ÒòΪÊÇ´Ólorasleep»½Ðѵģ¬¿ÉÄÜÕâÀï»áÓõÄʱ¼ä¶à£¬ÐèÒª¿¼ÂÇ 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); SetFlagLoraWaitSync(1); Radio.Rx(sync_listen_ms); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET); while(GetFlagLoraWaitSync()) { } HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET); if(flag_sync_success) //ͬ²½³É¹¦ { uint16_t wangguanid,checksum1; // printf("ͬ²½³É¹¦\r\n"); lora_recbuffer_len = GetLoraBufferAndLen(lora_recbuffer,&rec_sync_count);//»ñÈ¡LORAÊÕµ½µÄÊý¾ÝºÍ³¤¶È checksum1=Checksum_u16(lora_recbuffer,lora_recbuffer_len-2); if(!memcmp(&checksum1,&lora_recbuffer[lora_recbuffer_len-2],2)) //CRC16УÑéÊÇ·ñͨ¹ý { memcpy(&wangguanid,&lora_recbuffer[SOURCE_ID_IDX],2); HeartbeatPoll(wangguanid); LED_LG_ON; sync_lost_count = 0; if(lora_recbuffer[MSG_TYPE_IDX]==LORA_MSGTYPE_SYNC) { uint16_t wg_sendtime_100us,pwanc_value; uint8_t pwanc_index; memcpy(&g_com_map[SYNCWG_ID_IDX],&lora_recbuffer[SOURCE_ID_IDX],2); memcpy(&g_com_map2[SYNCWG_ID_IDX],&lora_recbuffer[SOURCE_ID_IDX],2); memcpy(&wg_report_id,&lora_recbuffer[SOURCE_ID_IDX],2); memcpy(&wg_sendtime_100us,&lora_recbuffer[SYSTIME_IDX],2); synclock_zero_count = rec_sync_count-(wg_sendtime_100us+158)*3.27;//¼õÈ¥17ms ÒòΪlora·¢ËÍ»áÑÓ³Ù17msÊÕµ½ while(synclock_zero_count<0) synclock_zero_count+=32768; sync_lost_count = 0; if(lora_recbuffer[RANGE_STATE_IDX]) { sync_state = Sync_Range; }else{ sync_state = Sync_Sleep; } SyncStateSwitch(); if(!memcmp(&dev_id,&lora_recbuffer[DEST_ID_IDX],2)) switch(lora_recbuffer[SUBMSGTYPE_IDX]) //×Ó״̬º¯Êý { case SUBMSG_READ_ANCPARA: heartbeat_count=HEATBEAT_UPDATE_TIME_S-2; LoraSendComMap(SUBMSG_READ_ANCPARA); config_state_count = CONFIG_REMAIN_TIME; break; case SUBMSG_WRITE_ANCPARA: rec_index = lora_recbuffer[WRITEPARA_INDEX_IDX]; memcpy(&rec_value,&lora_recbuffer[WRITEPARA_VALUE_IDX],2); g_com_map[rec_index/2] = rec_value; LoraRspWriteCommap(rec_index); save_com_map_to_flash(); flag_writepara_needreset = 1; break; case SUBMSG_UPDATE_ANC: LoraUp_Poll(); break; } } }else{ if(sync_lost_count++>SYNCLOST_THRES) { sync_state = Sync_Lost; SyncStateSwitch(); } } }else{ // LED_LR_ON; // printf("ͬ²½Ê§°Ü\r\n"); if(sync_lost_count++>SYNCLOST_THRES) { sync_state = Sync_Lost; SyncStateSwitch(); } } Radio.Sleep(); // LED_LR_OFF; LED_LG_OFF; } // Radio.Sleep( ); //Èç¹û³¬Ê±¾Ísleep } ////////////////////////////Ãâ²¼Ïß²â¾àÏà¹Ø´úÂë #define TAG_KEEPTIMES 30 //±êÇ©´æ»îʱ¼ä #define MAX_TAG_LIST_NUM 200 //ͬʱͨѶ±êÇ©×î´óÊýÁ¿ static uint8_t uwb_sendbuffer[150]; static uint8_t rx_buffer[150]; uint16_t taglist_total_num,taglist_current_index; //µ±Ç°Áбí×ÜÊýÁ¿ static uint8_t taglist_keeptime[MAX_TAG_LIST_NUM]; //ÿ¸ö±êÇ©´æ»îʱ¼ä static uint16_t taglist_id[MAX_TAG_LIST_NUM],taglist_dist[MAX_TAG_LIST_NUM]; //±êÇ©¾àÀëºÍ±êÇ©µÄID static u8 frame_seq_nb,frame_len; static uint32_t status_reg = 0; extern int32_t dwt_readcarrierintegrator(void); static int32_t test2; static uint64_t poll_tx_ts; static uint64_t resp_rx_ts; static uint64_t get_tx_timestamp_u64(void) { uint8_t ts_tab[5]; uint64_t ts = 0; int i; dwt_readtxtimestamp(ts_tab); for (i = 4; i >= 0; i--) { ts <<= 8; ts |= ts_tab[i]; } return ts; } static uint64_t get_rx_timestamp_u64(void) { uint8_t ts_tab[5]; uint64_t ts = 0; int i; dwt_readrxtimestamp(ts_tab); for (i = 4; i >= 0; i--) { ts <<= 8; ts |= ts_tab[i]; } return ts; } //×¢Ò⣺ÒòΪÐÂ×¢²áµÄ±êÇ©²¢²»ÖªµÀ»ùÕ¾ÒѾ­ÊÕµ½ÁË£¬ËùÒÔÒªÔÚÏÂÒ»°üÁ¢¿Ì½«ÐµıêÇ©ID·¢³ö£¬·ñÔò±êÇ©»áÒ»Ö±ÇÀÕ¼»ùÕ¾µÄpoll°ü¡£ //·½·¨Êǽ«ÐÂ×¢²áµÄ±êÇ©Ìí¼Óµ½Ï´η¢Ë͵ıêÇ©ÁбíÍ·²¿£¬ÆäËû±êÇ©ÒÀ´ÎÏòºóŲ¶¯¡£ uint16_t AddNewTagIntoList(uint16_t tagid) { u16 newindex_cal = taglist_current_index+25;//µ±Ç°Ë÷Òý+25£¬ÎªÏ´ÎË÷ÒýÒª·¢³öµÄÖµµÄ×î´óÖµ£¬Èç¹û×ÜÊýСÓÚÕâ¸öÖµ£¬¼´¿É·Åµ½×îºóÃæ¡£ if(newindex_cal>=taglist_total_num) //Èç¹ûµ±Ç°Ë÷ÒýÊÇ×îºóÒ»°ü£¬ÄÇô¾Í¼Óµ½×ÜË÷ÒýµÄºóÃæ£¬Èç¹û²»ÊǾͼӵ½ÏÂÒ»´ÎÆðʼË÷ÒýλÖᣠ{ newindex_cal = taglist_total_num; }else{ for(u16 i=taglist_total_num;i>newindex_cal;i--) //´ÓºóÍùǰŲµØ·½ { taglist_id[i]=taglist_id[i-1]; taglist_dist[i]=taglist_dist[i-1]; taglist_keeptime[i]=taglist_keeptime[i-1]; } } taglist_total_num++; taglist_id[newindex_cal] = tagid; taglist_dist[newindex_cal] = 0; taglist_keeptime[newindex_cal] = TAG_KEEPTIMES; return newindex_cal; } uint16_t CmpTagInList(uint16_t tagid) { u16 temp; for(u8 i=0;i-10&&distance<1000) { count2++; taglist_dist[i+taglist_current_index] = distance*100+anc_distoffset[i]; } }else{ // nearbase_distlist[i] = 0x1ffff; } } } void testprogram(void) { } void TagListUpdate(void) { uint16_t i,j=0,temp[TAG_NUM_IN_SYS]; for(i=0;i0) { taglist_id[j]=taglist_id[i]; taglist_keeptime[j++]=taglist_keeptime[i]; } } taglist_total_num=j; } extern uint16_t verfint_cal; u16 rec_nearbaseid,temp_index,adc_val1,adc_val_min=0xffff; static u8 rec_tag_index,tag_num_tosend; extern uint8_t Anchor_Vcc_Flag; extern float bat_volt; uint16_t AD_value[500],ti; extern float Height; u8 rec_tag_num,temp_tag_num,kp1; void MBXANCPoll(void) //½«Òª·¢µÄ±êÇ©ÐòºÅ£¬ÔÚÁбíÖеÄλÖà { temp_tag_num = 0; tag_num_tosend = taglist_total_num-taglist_current_index; if(tag_num_tosend>25) { tag_num_tosend = 25; } count1++; ti = 0; dwt_setrxaftertxdelay(300);//ÉèÖ÷¢ËÍÍê³Éºó¿ªÆô½ÓÊÕÑÓ³Ùʱ¼ä dwt_setrxtimeout(0);//½ÓÊÕ³¬Ê±Ê±¼ä memcpy(&uwb_sendbuffer[TAG_ID_IDX],&dev_id,2); uwb_sendbuffer[GROUP_ID_IDX] = group_id; uwb_sendbuffer[BATTARY_IDX] = bat_percent; uwb_sendbuffer[SEQUENCE_IDX] = frame_seq_nb++; uwb_sendbuffer[NEARBASENUM_INDEX] = tag_num_tosend; memcpy(&uwb_sendbuffer[NEARBASEID_INDEX],&taglist_id[taglist_current_index],tag_num_tosend*2); memcpy(&uwb_sendbuffer[NEARBASEID_INDEX+tag_num_tosend*2],&taglist_dist[taglist_current_index],tag_num_tosend*2); 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);//ÉèÖó¬¿í´ø·¢ËÍÊý¾Ý³¤¶È dwt_starttx(DWT_START_TX_IMMEDIATE | DWT_RESPONSE_EXPECTED);//¿ªÆô·¢ËÍ£¬·¢ËÍÍê³ÉºóµÈ´ýÒ»¶Îʱ¼ä¿ªÆô½ÓÊÕ£¬µÈ´ýʱ¼äÔÚdwt_setrxaftertxdelayÖÐÉèÖà if(Anchor_Vcc_Flag) { READC_Init(); adc_val_min=0xffff; verfint_cal = *(__IO uint16_t *)(0X1FF80078); } start_count=HAL_LPTIM_ReadCounter(&hlptim1); poll_timeout=tag_num_tosend*SLOT_SCALE+10; //µ¥Î»0.1ms end_count=start_count+(poll_timeout<<2); if(end_count>=32768) {end_count-=32768;} current_count=HAL_LPTIM_ReadCounter(&hlptim1); while(current_countend_count+15000) { current_count=HAL_LPTIM_ReadCounter(&hlptim1); while (!((status_reg = dwt_read32bitreg(SYS_STATUS_ID)) & (SYS_STATUS_RXFCG | SYS_STATUS_ALL_RX_ERR)))//²»¶Ï²éѯоƬ״ֱ̬µ½³É¹¦½ÓÊÕ»òÕß·¢Éú´íÎó { if(Anchor_Vcc_Flag) { adc_val1 = Get_ADC_Value(); AD_value[ti++] = adc_val1; if(ti>=500) ti = 400; if(adc_val1=end_count&¤t_count=taglist_total_num||taglist_total_num<=25) //Èç¹û±êÇ©µ±Ç°index´óÓÚ×Üindex£¬»òÕß×Ü»ùÕ¾ÊýÁ¿Ð¡ÓÚµÈÓÚ25£¬Ôò´Ó0¿ªÊ¼index¡£ taglist_current_index = 0; if(Anchor_Vcc_Flag) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET); Anchor_Vcc_Flag=0; MX_ADC_DeInit(); bat_volt = 3*(float)verfint_cal/AD_value[21]-0.1; bat_percent=bat_volt*100-200; } for(uint8_t i=0;i0) { GetPressAndHeight(); intheight = Height*100; } #endif }