| | |
| | | #include "mk_uwb.h" |
| | | #include "mk_phy.h" |
| | | #include "mk_misc.h" |
| | | #include "mk_wdt.h" |
| | | #include "mk_power.h" |
| | | #include "mk_sleep_timer.h" |
| | | #include "lib_ranging.h" |
| | | #include "dw_app.h" |
| | | #include "board.h" |
| | | #include "mk_calib.h" |
| | | |
| | | #include "stdlib.h" |
| | | #include "mk_flash.h" |
| | | #include "global_param.h" |
| | | #if defined(MK_SS_TWR_DW_INIT) |
| | | |
| | | extern int TagRange(void); |
| | |
| | | /* Default communication configuration. */ |
| | | static struct mk_uwb_configure config = {//yuan |
| | | .phy_work_mode = (uint8_t)(PHY_TX | PHY_RX), |
| | | .phy_cfg.ch_num = 5, /* Channel number. */ |
| | | .phy_cfg.ch_num = 9, /* Channel number. */ |
| | | .phy_cfg.code_index = 9, /* TRX preamble code */ |
| | | .phy_cfg.mean_prf = MEAN_PRF_64M, /* Mean prf 64/128/256M */ |
| | | .phy_cfg.data_bit_rate = DATA_BR_6M8, /* Data rate 6.8M */ |
| | |
| | | int32_t freq_offset,freq_offset_filter; |
| | | int temp_flag,poll_tx_num,resp_rx_num; |
| | | extern double distance; |
| | | extern uint8_t bat_percent; |
| | | uint32_t count1,count2; |
| | | enum SIMPLE_FSM_T |
| | | { |
| | |
| | | } |
| | | uwb_sendbuffer[GROUP_ID_IDX] = group_id; |
| | | memcpy(&uwb_sendbuffer[TAG_ID_IDX],&dev_id,2); |
| | | //uwb_sendbuffer[BATTARY_IDX] = bat_percent; |
| | | 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);//基站id |
| | |
| | | |
| | | } |
| | | int sleep_time_step=SLEEP_COUNT; |
| | | int rand_temp; |
| | | static uint16_t source_id; |
| | | uint8_t rec_index,rec_secdelay; |
| | | uint16_t rec_value; |
| | | uint8_t readgcom_flag; |
| | | uint16_t wg_report_id; |
| | | uint16_t rec_wenjian_daxiao; |
| | | uint16_t wangguan_up_id; |
| | | uint8_t shengji_flag,time=5; |
| | | uint8_t LoraUp_flag; |
| | | extern uint16_t final_bag_num; |
| | | uint16_t checksum1; |
| | | void Uwb_Update(void) |
| | | { |
| | | |
| | | checksum1=Checksum_u16(rx_buf,rx_length-2); |
| | | if(!memcmp(&checksum1,&rx_buf[rx_length-2],2)) |
| | | if(!memcmp(&dev_id,&rx_buf[DEST_ID_IDX],2)) |
| | | { |
| | | memcpy(&source_id,&rx_buf[SOURCE_ID_IDX],2); |
| | | // if(wg_state==WG_Lost) |
| | | // { |
| | | // wg_state = WG_Connected; |
| | | wg_report_id = source_id; |
| | | // } |
| | | // if(!memcmp(&wg_report_id,&rx_buf[SOURCE_ID_IDX],2)) |
| | | // { |
| | | // wg_lost_count = 0; |
| | | // loraled=GREEN; |
| | | switch(rx_buf[PWTAG_RW_FLAG_IDX]) |
| | | { |
| | | case WGRSP_RWTAG_READ: |
| | | readgcom_flag = 1; |
| | | // LoraSendComMap(WGRSP_RWTAG_READ); |
| | | break; |
| | | case WGRSP_RWTAG_WRITE: |
| | | rec_index = rx_buf[PWTAG_WRITE_IDX_IDX]; |
| | | if(rec_index<=DEV_ID) |
| | | {break;} |
| | | memcpy(&rec_value,&rx_buf[PWTAG_WRITE_VALUE_IDX],2); |
| | | if(g_com_map[rec_index/2]==rec_value) |
| | | {break;} |
| | | g_com_map[rec_index/2] = rec_value; |
| | | save_com_map_to_flash(); |
| | | delay_us(60000); |
| | | NVIC_SystemReset(); |
| | | break; |
| | | case WGRSP_RWTAG_UPDATE: |
| | | rec_index = rx_buf[PWTAG_WRITE_IDX_IDX]; |
| | | switch(rec_index) |
| | | { |
| | | case 0xaa: //升级下发 |
| | | memcpy(&rec_wenjian_daxiao,&rx_buf[11],2);//文件大小 |
| | | if(rec_wenjian_daxiao>APP_SIZE||rec_wenjian_daxiao==0) |
| | | {}//文件过大,超出范围 |
| | | else |
| | | { |
| | | final_bag_num=(rec_wenjian_daxiao/ONE_BAG_DAXIAO)+1; |
| | | memcpy(&wangguan_up_id,&rx_buf[SOURCE_ID_IDX],2);//网关ID 占用2个字节 |
| | | shengji_flag=1; |
| | | LoraUp_flag=1; |
| | | LOG_INFO(TRACE_MODULE_APP, "进入升级模式,接收文件大小%d\r\n",rec_wenjian_daxiao); |
| | | } |
| | | break; |
| | | } |
| | | break; |
| | | } |
| | | // } |
| | | } |
| | | } |
| | | int TagRange(void) |
| | | { |
| | | phy_timer_open(1, IRQ_PRIORITY_HIGH); |
| | | if(readgcom_flag) |
| | | { |
| | | readgcom_flag=0; |
| | | phy_timer_open(1, IRQ_PRIORITY_HIGH); |
| | | mac_register_process_handler(tx_int_callback, rx_int_callback); |
| | | uint8_t data_length = 0x50; |
| | | uint16_t checksum = 0; |
| | | uwb_sendbuffer[MSG_TYPE_IDX] = LORA_MSGTYPE_READPARARESP; |
| | | uwb_sendbuffer[MSG_LENGTH] = data_length+11; |
| | | memcpy(&uwb_sendbuffer[SOURCE_ID_IDX],&g_com_map[DEV_ID],2); |
| | | memcpy(&uwb_sendbuffer[DEST_ID_IDX],&wg_report_id,2); |
| | | uwb_sendbuffer[RP_CMD_IDX] = WGRSP_RWTAG_READ; |
| | | uwb_sendbuffer[RP_INDEX_IDX] = 2; |
| | | uwb_sendbuffer[RP_LEN_IDX] = data_length; |
| | | memcpy(&uwb_sendbuffer[9], &g_com_map[1], data_length); |
| | | checksum = Checksum_u16(uwb_sendbuffer,11+data_length); |
| | | memcpy(&uwb_sendbuffer[11+data_length],&checksum,2); |
| | | // Radio.Send(uwb_sendbuffer,data_length+13); |
| | | // Delay_Ms(100); |
| | | poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 |
| | | tempflag=uwb_tx(uwb_sendbuffer,data_length+13,1,poll_tx_en_start_u32);//立即发送 |
| | | poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 |
| | | temp_count1=phy_timer_count_get(); |
| | | while(mac_is_busy());//等待发送完成 |
| | | }else{ |
| | | phy_timer_open(1, IRQ_PRIORITY_HIGH); |
| | | // Register rx interrupt callback function |
| | | mac_register_process_handler(tx_int_callback, rx_int_callback); |
| | | //taglist_total_num=50;//测试 |
| | |
| | | if(receive_flag==1)//成功接收数据 |
| | | { |
| | | receive_flag=0; |
| | | //tempflag=uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 |
| | | tempflag=uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 |
| | | //接收成功则判断是否为同一组 |
| | | if (rx_buf[MESSAGE_TYPE_IDX] == MBX_RESPONSE&&!memcmp(&rx_buf[TAG_ID_IDX],&dev_id,2)&&rx_buf[GROUP_ID_IDX]==group_id) //判断接收到的数据是否是response数据 |
| | | if(rx_buf[MESSAGE_TYPE_IDX] == MBX_POLL)//收到是其他的基站的POLL包 |
| | | { |
| | | rand_temp=rand()%10; |
| | | sleep_timer_start(__MS_TO_32K_CNT(SLEEP_COUNT-rand_temp));//测试 |
| | | }else if (rx_buf[MESSAGE_TYPE_IDX] == MBX_RESPONSE&&!memcmp(&rx_buf[TAG_ID_IDX],&dev_id,2)&&rx_buf[GROUP_ID_IDX]==group_id) //判断接收到的数据是否是response数据 |
| | | { |
| | | memcpy(&rec_nearbaseid,&rx_buf[ANCHOR_ID_IDX],2); |
| | | rec_tag_index = CmpTagInList(rec_nearbaseid);//当前新来的这包数据插入当前表中的位置索引 |
| | |
| | | |
| | | memset(rx_buf, 0, sizeof(rx_buf));//清空接收到的用完的数组 |
| | | rx_length=0;//清0长度 |
| | | uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 |
| | | //uwb_rx(0, 0, RESP_RX_TIMEOUT_US);//立即开启接受并设置0超时 |
| | | // while(mac_is_busy()); |
| | | //break;//成功接收就退出 |
| | | } |
| | | |
| | | }else if(rx_buf[MSG_TYPE_IDX]==LORA_MSGTYPE_WGRESPTAG){ |
| | | Uwb_Update(); |
| | | } |
| | | |
| | | // #ifdef BOXING |
| | | // gpio_pin_clr(IO_PIN_5);//测试 |
| | | // #endif |
| | |
| | | uwb_rx_force_off(1); |
| | | //dwt_forecetrxoff(); |
| | | CalculateDists(poll_tx_ts_i64); //计算距离并更新距离表 |
| | | //LOG_INFO(TRACE_MODULE_APP,"现存测距数 %d id1:%04x id2:%04x .\r\n",taglist_total_num,taglist_id[0],taglist_id[1]); |
| | | |
| | | //Calculate_battery_percent(); |
| | | |
| | | //LOG_INFO(TRACE_MODULE_APP,"现存测距数 %d id1:%04x dist:%d .\r\n",taglist_total_num,taglist_id[0],(int16_t)taglist_dist[0]); |
| | | //AnchorListUpdate();//更新存活基站列表 |
| | | TagListUpdate(); |
| | | taglist_current_index+=tag_num_tosend; |
| | | if(taglist_current_index>=taglist_total_num||taglist_total_num<=SEND_GROUP_MAX_NUM) //如果标签当前index大于总index,或者总基站数量小于等于25,则从0开始index。一个是已经发完一轮了,一个是不够最大发送数 |
| | | taglist_current_index = 0; |
| | | //Rank_ANchor_list_by_dis();//冒泡排序重新按距离重新排列基站列表最小距离存货基站放到最前面 |
| | | } |
| | | } |
| | | #endif |
| | | #endif |
| | | uint16_t UpdateCRC16(uint16_t crcIn, uint8_t byte) |
| | | { |
| | | uint32_t crc = crcIn; |
| | | uint32_t in = byte|0x100; |
| | | |
| | | do |
| | | { |
| | | crc <<= 1; |
| | | in <<= 1; |
| | | |
| | | if(in&0x100) |
| | | { |
| | | ++crc; |
| | | } |
| | | |
| | | if(crc&0x10000) |
| | | { |
| | | crc ^= 0x1021; |
| | | } |
| | | } while(!(in&0x10000)); |
| | | |
| | | return (crc&0xffffu); |
| | | } |
| | | |
| | | /** |
| | | * @brief Cal CRC16 for YModem Packet |
| | | * @param data |
| | | * @param length |
| | | * @retval CRC value |
| | | */ |
| | | uint16_t Cal_CRC16(const uint8_t* data, uint32_t size) |
| | | { |
| | | uint32_t crc = 0; |
| | | const uint8_t* dataEnd = data+size; |
| | | |
| | | while(data<dataEnd) |
| | | { |
| | | crc = UpdateCRC16(crc,*data++); |
| | | } |
| | | crc = UpdateCRC16(crc,0); |
| | | crc = UpdateCRC16(crc,0); |
| | | |
| | | return (crc&0xffffu); |
| | | } |
| | | void delay_ms(uint32_t nTimer) |
| | | { |
| | | uint32_t i=1000*nTimer; |
| | | delay_us(i); |
| | | } |
| | | uint8_t send_lora_data[250]; |
| | | uint16_t muqiandeshengjibao; |
| | | static uint16_t current_count1,target_count1,end_count1,start_count1; |
| | | uint8_t huifushengjibaoerror_num; |
| | | uint16_t final_bag_num; |
| | | uint16_t testflag; |
| | | uint32_t Zhongjian_data[60]; |
| | | uint8_t shengji_flag; |
| | | uint16_t wangguan_up_id; |
| | | uint8_t huifushengjibao_flag; |
| | | uint8_t LoraUp_flag; |
| | | uint16_t rec_wenjian_daxiao; |
| | | uint8_t lora_up_rec_flag; |
| | | uint16_t flash_shuju; |
| | | static uint32_t status_reg; |
| | | static uint32_t frame_len; |
| | | void LoraUp_Poll(void) |
| | | { uint16_t result ; |
| | | uint16_t crc16; |
| | | uint8_t jindu; |
| | | if(shengji_flag) |
| | | { |
| | | uwb_rx_force_off(1); |
| | | Tag_uwb_init(); |
| | | phy_timer_open(1, IRQ_PRIORITY_HIGH); |
| | | mac_register_process_handler(tx_int_callback, rx_int_callback); |
| | | |
| | | send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATE_CONFIRM; |
| | | memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节 |
| | | memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节 |
| | | // send_lora_data[MUQIAN_BAG]=0xFF; |
| | | crc16=Checksum_u16(send_lora_data,6); |
| | | memcpy(&send_lora_data[6],&crc16,2); |
| | | huifushengjibao_flag=0; |
| | | LoraUp_flag=1; |
| | | |
| | | poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 |
| | | tempflag=uwb_tx(send_lora_data,8+2,1,poll_tx_en_start_u32);//立即发送 |
| | | poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 |
| | | temp_count1=phy_timer_count_get(); |
| | | while(mac_is_busy());//等待发送完成 |
| | | |
| | | __disable_irq(); |
| | | result=flash_open(FLASH_ID0,NULL); |
| | | flash_read(FLASH_ID0, APP2_ADRESS, (uint8_t*)&flash_shuju, 2); |
| | | if(flash_shuju!=0xffff/*&&flash_shuju!=0x0000*/) |
| | | { |
| | | while(1) |
| | | { |
| | | flash_erase(FLASH_ID0,APP2_ADRESS,APP_SIZE); |
| | | delay_ms(500); |
| | | flash_read(FLASH_ID0, APP2_ADRESS, (uint8_t*)&flash_shuju, 2); |
| | | if(flash_shuju==0xffff/*&&flash_shuju!=0x0000*/) |
| | | {break;} |
| | | } |
| | | } |
| | | __enable_irq(); |
| | | while(1) |
| | | { |
| | | uwb_rx_force_off(1); |
| | | send_lora_data[MSG_TYPE_IDX]=LORA_MSGTYPE_UPDATEFILE_REQUEST; |
| | | memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节 |
| | | memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节 |
| | | // send_lora_data[MUQIAN_BAG]=muqiandeshengjibao; |
| | | memcpy(&send_lora_data[MUQIAN_BAG],&muqiandeshengjibao,2); |
| | | crc16=Checksum_u16(send_lora_data,8); |
| | | memcpy(&send_lora_data[8],&crc16,2); |
| | | lora_up_rec_flag=0; |
| | | // LOG_INFO(TRACE_MODULE_APP, "正在请求第%d包\r\n",muqiandeshengjibao); |
| | | jindu=(muqiandeshengjibao*100)/final_bag_num; |
| | | LOG_INFO(TRACE_MODULE_APP, "升级进度%d\r\n",jindu); |
| | | wdt_ping(WDT_ID0);//喂狗 |
| | | poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 |
| | | tempflag=uwb_tx(send_lora_data,10+2,1,poll_tx_en_start_u32);//立即发送 |
| | | poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 |
| | | temp_count1=phy_timer_count_get(); |
| | | while(mac_is_busy());//等待发送完成 |
| | | temp_count2=phy_timer_count_get(); |
| | | resp_rx_en_start_u32 = poll_tx_en_start_u32+ US_TO_PHY_TIMER_COUNT(POLL_TX_TO_RESP_RX_DLY_US);//设置发送多少s后接收按target独立时间起点算+ US_TO_PHY_TIMER_COUNT(POLL_TX_TO_RESP_RX_DLY_US为发送后要多久开启接收时间 |
| | | temp_resp=resp_rx_en_start_u32; |
| | | tempflag=uwb_rx(0,0, 50000); |
| | | |
| | | while(mac_is_busy()) |
| | | {} |
| | | if(receive_flag==1)//成功接收数据 |
| | | { uint16_t result12; |
| | | |
| | | __disable_irq(); |
| | | crc16=Cal_CRC16(rx_buf,DATA_IDX+ONE_BAG_DAXIAO); |
| | | |
| | | if(!memcmp(&muqiandeshengjibao,&rx_buf[MUQIAN_BAG],2)&&!memcmp(&crc16,&rx_buf[DATA_IDX+ONE_BAG_DAXIAO],2)&&!memcmp(&dev_id,&rx_buf[DEST_ID_IDX],2)&& !memcmp(&wangguan_up_id,&rx_buf[SOURCE_ID_IDX],2)) |
| | | { |
| | | result=flash_open(FLASH_ID0,NULL); |
| | | memcpy(Zhongjian_data,&rx_buf[DATA_IDX],ONE_BAG_DAXIAO); |
| | | result12=flash_write_nbytes(FLASH_ID0, APP2_ADRESS+ONE_BAG_DAXIAO*muqiandeshengjibao, (uint8_t*)Zhongjian_data, ONE_BAG_DAXIAO); |
| | | while(!result12==0) |
| | | { |
| | | result12=flash_write_nbytes(FLASH_ID0, APP2_ADRESS+ONE_BAG_DAXIAO*muqiandeshengjibao, (uint8_t*)Zhongjian_data, ONE_BAG_DAXIAO); |
| | | delay_ms(10); |
| | | } |
| | | if(result12==0) |
| | | { |
| | | // if(muqiandeshengjibao==650) |
| | | // { |
| | | // delay_ms(10); |
| | | // } |
| | | muqiandeshengjibao++; |
| | | huifushengjibaoerror_num=0; |
| | | delay_ms(10); |
| | | } |
| | | } |
| | | __enable_irq(); |
| | | } |
| | | else |
| | | { |
| | | delay_ms(500); |
| | | huifushengjibaoerror_num++; |
| | | if(huifushengjibaoerror_num>=20) |
| | | { |
| | | huifushengjibaoerror_num=0; |
| | | muqiandeshengjibao=0; |
| | | delay_ms(500); |
| | | NVIC_SystemReset(); |
| | | break; |
| | | } |
| | | uwb_rx_force_off(1); |
| | | } |
| | | if(muqiandeshengjibao==final_bag_num) |
| | | { |
| | | send_lora_data[MSG_TYPE_IDX]=0x99; |
| | | memcpy(&send_lora_data[SOURCE_ID_IDX],&dev_id,2);//网关ID 占用2个字节 |
| | | memcpy(&send_lora_data[DEST_ID_IDX],&wangguan_up_id,2);//标签或者基站的设备ID 2个字节 |
| | | crc16=Checksum_u16(send_lora_data,6); |
| | | memcpy(&send_lora_data[6],&crc16,2); |
| | | huifushengjibao_flag=0; |
| | | LoraUp_flag=1; |
| | | LOG_INFO(TRACE_MODULE_APP, "正在发送最后一包\r\n"); |
| | | poll_tx_en_start_u32 = phy_timer_count_get()+US_TO_PHY_TIMER_COUNT(POLL_DELAY);//发送必须要延时发送才可以用于测距否则立即发送会获取时间戳不对,需要计算程序运行时间,避免设置过去时间 |
| | | tempflag=uwb_tx(send_lora_data,8+2,1,poll_tx_en_start_u32);//立即发送 |
| | | poll_tx_ts_i64 = ranging_tx_time_correct(poll_tx_en_start_u32 + phy_shr_duration());//修正时间戳 |
| | | temp_count1=phy_timer_count_get(); |
| | | while(mac_is_busy());//等待发送完成 |
| | | |
| | | uint16_t tmp11 ,result11; |
| | | tmp11=0XDDDD; |
| | | result=flash_open(FLASH_ID0,NULL); |
| | | result11=flash_erase(FLASH_ID0,APP_1OR2_ADRESS,0x1000); |
| | | if(result11==0) |
| | | flash_write_nbytes(FLASH_ID0, APP_1OR2_ADRESS, (uint8_t*)&tmp11, 2); |
| | | __disable_irq(); |
| | | delay_ms(500); |
| | | NVIC_SystemReset(); |
| | | } |
| | | } |
| | | uwb_rx_force_off(1); |
| | | } |
| | | } |
| | | |
| | | |