From 7d1032a3f853af9ae519aeccd0c70bab99a2d61c Mon Sep 17 00:00:00 2001 From: David <stierint@hotmail.com> Date: Sun, 4 Oct 2020 17:53:47 -0400 Subject: [PATCH] consolidated uwbList TDMA variables --- DecaRanging.coproj | 20 ++-- src/application/instance.c | 10 +- src/application/instance.h | 10 +- src/application/instance_common.c | 27 ++++-- src/application/tdma_handler.c | 146 ++++++++++++++++++++---------- src/application/tdma_handler.h | 8 +- 6 files changed, 144 insertions(+), 77 deletions(-) diff --git a/DecaRanging.coproj b/DecaRanging.coproj index ad9877d..6c9e7cf 100644 --- a/DecaRanging.coproj +++ b/DecaRanging.coproj @@ -105,8 +105,8 @@ <File name="src/platform/deca_spi.h" path="src/platform/deca_spi.h" type="1"/> <File name="Libraries/STM32_USB_Device_Library/Core/src/usbd_ioreq.c" path="Libraries/STM32_USB_Device_Library/Core/src/usbd_ioreq.c" type="1"/> <File name="Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c" path="Libraries/STM32_USB_Device_Library/Class/cdc/src/usbd_cdc_core.c" type="1"/> - <File name="src/usb/usbd_desc.h" path="src/usb/usbd_desc.h" type="1"/> <File name="Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h" path="Libraries/STM32_USB_Device_Library/Class/cdc/inc/usbd_cdc_core.h" type="1"/> + <File name="src/usb/usbd_desc.h" path="src/usb/usbd_desc.h" type="1"/> <File name="src/platform/deca_spi.c" path="src/platform/deca_spi.c" type="1"/> <File name="src/usb" path="" type="2"/> <File name="src/decadriver/deca_version.h" path="src/decadriver/deca_version.h" type="1"/> @@ -137,12 +137,12 @@ <File name="Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h" path="Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h" type="1"/> <File name="src/decadriver/deca_device.c" path="src/decadriver/deca_device.c" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c" path="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c" type="1"/> - <File name="Libraries/STM32_USB_Device_Library/Core/inc/usbd_req.h" path="Libraries/STM32_USB_Device_Library/Core/inc/usbd_req.h" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h" path="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_adc.h" type="1"/> + <File name="Libraries/STM32_USB_Device_Library/Core/inc/usbd_req.h" path="Libraries/STM32_USB_Device_Library/Core/inc/usbd_req.h" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c" path="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c" path="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c" type="1"/> - <File name="src/usb/usb_conf.h" path="src/usb/usb_conf.h" type="1"/> <File name="Libraries/STM32_USB_OTG_Driver/inc/usb_otg.h" path="Libraries/STM32_USB_OTG_Driver/inc/usb_otg.h" type="1"/> + <File name="src/usb/usb_conf.h" path="src/usb/usb_conf.h" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c" path="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c" type="1"/> <File name="Libraries/STM32_USB_Device_Library/Core/src/usbd_req.c" path="Libraries/STM32_USB_Device_Library/Core/src/usbd_req.c" type="1"/> <File name="src/usb/usbd_conf.h" path="src/usb/usbd_conf.h" type="1"/> @@ -163,26 +163,26 @@ <File name="Libraries/STM32_USB_Device_Library/Core/src" path="" type="2"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c" path="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/src/misc.c" path="Libraries/STM32F10x_StdPeriph_Driver/src/misc.c" type="1"/> - <File name="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h" path="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h" type="1"/> <File name="Libraries/STM32_USB_OTG_Driver/src/usb_hcd.c" path="Libraries/STM32_USB_OTG_Driver/src/usb_hcd.c" type="1"/> + <File name="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h" path="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_cec.h" type="1"/> <File name="src/application/main.c" path="src/main.c" type="1"/> <File name="src/platform/deca_sleep.c" path="src/platform/deca_sleep.c" type="1"/> - <File name="Libraries/STM32_USB_OTG_Driver/inc/usb_defines.h" path="Libraries/STM32_USB_OTG_Driver/inc/usb_defines.h" type="1"/> <File name="Libraries/CMSIS/CM3/CoreSupport" path="" type="2"/> - <File name="Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c" path="Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c" type="1"/> - <File name="src/compiler" path="" type="2"/> + <File name="Libraries/STM32_USB_OTG_Driver/inc/usb_defines.h" path="Libraries/STM32_USB_OTG_Driver/inc/usb_defines.h" type="1"/> <File name="src/decadriver/deca_param_types.h" path="src/decadriver/deca_param_types.h" type="1"/> + <File name="src/compiler" path="" type="2"/> + <File name="Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c" path="Libraries/STM32_USB_OTG_Driver/src/usb_dcd_int.c" type="1"/> <File name="src/usb/deca_usb_bsp_evk1000.c" path="src/usb/deca_usb_bsp_evk1000.c" type="1"/> <File name="Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10x_cl.S" path="Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/startup_stm32f10x_cl.S" type="1"/> - <File name="Libraries/STM32_USB_OTG_Driver/inc/usb_bsp.h" path="Libraries/STM32_USB_OTG_Driver/inc/usb_bsp.h" type="1"/> <File name="src/platform/stm32f10x_conf.h" path="src/platform/stm32f10x_conf.h" type="1"/> + <File name="Libraries/STM32_USB_OTG_Driver/inc/usb_bsp.h" path="Libraries/STM32_USB_OTG_Driver/inc/usb_bsp.h" type="1"/> <File name="Libraries/CMSIS/CM3" path="" type="2"/> <File name="Libraries" path="" type="2"/> <File name="src/decadriver/deca_types.h" path="src/decadriver/deca_types.h" type="1"/> <File name="src/usb/deca_usb.h" path="src/usb/deca_usb.h" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/inc" path="" type="2"/> - <File name="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h" path="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h" type="1"/> <File name="Libraries/STM32_USB_Device_Library/Core/inc/usbd_def.h" path="Libraries/STM32_USB_Device_Library/Core/inc/usbd_def.h" type="1"/> + <File name="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h" path="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_spi.h" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h" path="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_iwdg.h" type="1"/> <File name="src/platform/stm32f10x_it.c" path="src/platform/stm32f10x_it.c" type="1"/> <File name="Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c" path="Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c" type="1"/> @@ -216,8 +216,8 @@ <File name="Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup" path="" type="2"/> <File name="Libraries/STM32_USB_OTG_Driver/inc/usb_core.h" path="Libraries/STM32_USB_OTG_Driver/inc/usb_core.h" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c" path="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c" type="1"/> - <File name="src/application/dw_main.c" path="src/application/dw_main.c" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c" path="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c" type="1"/> + <File name="src/application/dw_main.c" path="src/application/dw_main.c" type="1"/> <File name="src/platform" path="" type="2"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c" path="Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c" type="1"/> <File name="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h" path="Libraries/STM32F10x_StdPeriph_Driver/inc/stm32f10x_i2c.h" type="1"/> diff --git a/src/application/instance.c b/src/application/instance.c index b4cb4b6..9751dc1 100644 --- a/src/application/instance.c +++ b/src/application/instance.c @@ -529,7 +529,8 @@ int testapprun(instance_data_t *inst, struct TDMAHandler *tdma_handler, int mess memcpy(&inst->uwbList[0][0], &inst->eui64, inst->addrByteSize); #endif inst->uwbListLen = 1; - inst->uwbListType[0] = UWB_LIST_SELF; +// inst->uwbListType[0] = UWB_LIST_SELF; + tdma_handler->uwbListTDMAInfo[0].connectionType = UWB_LIST_SELF; mode = (DWT_PRESRV_SLEEP|DWT_CONFIG|DWT_TANDV); @@ -1783,7 +1784,9 @@ int testapprun(instance_data_t *inst, struct TDMAHandler *tdma_handler, int mess } } - inst->lastRangeTimeStamp[inst->uwbToRangeWith] = portGetTickCnt(); + +// inst->lastRangeTimeStamp[inst->uwbToRangeWith] = portGetTickCnt(); + tdma_handler->uwbListTDMAInfo[inst->uwbToRangeWith].lastRange = portGetTickCnt(); inst->newRangeTagAddress = instance_get_uwbaddr(inst->uwbToRangeWith); inst->newRangeAncAddress = instance_get_addr(); @@ -1845,7 +1848,8 @@ int testapprun(instance_data_t *inst, struct TDMAHandler *tdma_handler, int mess } } - inst->lastRangeTimeStamp[inst->uwbToRangeWith] = portGetTickCnt(); +// inst->lastRangeTimeStamp[inst->uwbToRangeWith] = portGetTickCnt(); + tdma_handler->uwbListTDMAInfo[inst->uwbToRangeWith].lastRange = portGetTickCnt(); uint8 debug_msg[100]; // int n = sprintf((char *)&debug_msg, "POLL_COMPLETE,%llX,%llX", inst->newRangeTagAddress, inst->newRangeAncAddress); diff --git a/src/application/instance.h b/src/application/instance.h index 99b10c1..04c3ba9 100644 --- a/src/application/instance.h +++ b/src/application/instance.h @@ -151,19 +151,19 @@ typedef struct uint8 uwbListLen ; uint8 uwbList[UWB_LIST_SIZE][8]; //index 0 reserved for self, rest for other tracked uwbs - uint8 uwbListType[UWB_LIST_SIZE]; //UWB_LIST_SELF, UWB_LIST_NEIGHBOR, UWB_LIST_HIDDEN, UWB_LIST_INACTIVE +// uint8 uwbListType[UWB_LIST_SIZE]; //UWB_LIST_SELF, UWB_LIST_NEIGHBOR, UWB_LIST_HIDDEN, UWB_LIST_INACTIVE - uint8 uwbNumActive[UWB_LIST_SIZE]; //number of TAGs each tracked ANCHOR is actively ranging with. //TODO remove? +// uint8 uwbNumActive[UWB_LIST_SIZE]; //number of TAGs each tracked ANCHOR is actively ranging with. //TODO remove? // keep track of when final messages so we can drop uwbs that we haven't communicated with in a while uint32 lastCommTimeStamp[UWB_LIST_SIZE]; //TODO move into tdma_handler? uint32 lastHiddenTimeStamp[UWB_LIST_SIZE]; uint32 lastTwiceHiddenTimeStamp[UWB_LIST_SIZE]; - uint8 uwbTimeout[UWB_LIST_SIZE] ; + uint8 uwbTimeout[UWB_LIST_SIZE] ; //TODO remove and use list type instead - uint32 lastRangeTimeStamp[UWB_LIST_SIZE]; +// uint32 lastRangeTimeStamp[UWB_LIST_SIZE]; - uint8 time_till_next_reported[UWB_LIST_SIZE]; //used to keep track of whether we reported the RX_ACCEPT node. 0 if no, 1 if yes. +// uint8 time_till_next_reported[UWB_LIST_SIZE]; //used to keep track of whether we reported the RX_ACCEPT node. 0 if no, 1 if yes. uint32 blink_start; uint32 range_start; diff --git a/src/application/instance_common.c b/src/application/instance_common.c index 735ee78..b9b6dd9 100644 --- a/src/application/instance_common.c +++ b/src/application/instance_common.c @@ -216,6 +216,7 @@ int instgetuwblistindex(instance_data_t *inst, uint8 *uwbAddr, uint8 addrByteSiz char uwbChar[2]; memcpy(&uwbChar[0], &uwbAddr[0], 2); + //TODO remove the following! bool match = FALSE; char test_addr[2] = {0x95, 0x15}; if(memcmp(&uwbChar[0], &test_addr[0], 2) == 0) @@ -449,7 +450,8 @@ int instfindnumactiveneighbors(instance_data_t *inst) for(int i=1; i<inst->uwbListLen; i++)// 0 reserved for self, cant be neighbor { - if(inst->uwbListType[i] == UWB_LIST_NEIGHBOR) +// if(inst->uwbListType[i] == UWB_LIST_NEIGHBOR) + if(tdma_handler.uwbListTDMAInfo[i].connectionType == UWB_LIST_NEIGHBOR) { num++; } @@ -469,8 +471,10 @@ int instfindnumactivehidden(instance_data_t *inst) for(int i=1; i<inst->uwbListLen; i++)//0 reserved for self, cannot be hidden { - if(inst->uwbListType[i] == UWB_LIST_HIDDEN) +// if(inst->uwbListType[i] == UWB_LIST_HIDDEN) + if(tdma_handler.uwbListTDMAInfo[i].connectionType == UWB_LIST_HIDDEN) { + num++; } } @@ -496,12 +500,14 @@ void instclearuwbList(void) for(int i=0; i<UWB_LIST_SIZE; i++) { instance_data[instance].lastCommTimeStamp[i] = 0; - instance_data[instance].lastRangeTimeStamp[i] = 0; +// instance_data[instance].lastRangeTimeStamp[i] = 0; + tdma_handler.uwbListTDMAInfo[i].lastRange = 0; instance_data[instance].uwbTimeout[i] = 0; - instance_data[instance].time_till_next_reported[i] = 0; +// instance_data[instance].time_till_next_reported[i] = 0; memcpy(&instance_data[instance].uwbList[i][0], &blank[0], 8); - instance_data[instance].uwbListType[i] = UWB_LIST_INACTIVE; +// instance_data[instance].uwbListType[i] = UWB_LIST_INACTIVE; + tdma_handler.uwbListTDMAInfo[i].connectionType = UWB_LIST_INACTIVE; } } @@ -1329,7 +1335,8 @@ void instance_rxgoodcallback(const dwt_cb_data_t *rxd) uwb_index = instgetuwblistindex(&instance_data[instance], &dw_event.msgu.frame[srcAddr_index], instance_data[instance].addrByteSize); //TODO maybe do this somewhere else... - instance_data[instance].uwbListType[uwb_index] = UWB_LIST_NEIGHBOR; +// instance_data[instance].uwbListType[uwb_index] = UWB_LIST_NEIGHBOR; + tdma_handler.uwbListTDMAInfo[uwb_index].connectionType = UWB_LIST_NEIGHBOR; instance_data[instance].lastCommTimeStamp[uwb_index] = time_now; instance_data[instance].uwbTimeout[uwb_index] = 0; @@ -1839,13 +1846,13 @@ int instance_run(void) uint32 time_now = portGetTickCnt(); uint32 delta_t = get_dt32(instance_data[instance].lastCommTimeStamp[i], time_now); -// if(instance_data[instance].lastCommTimeStamp[i] + UWB_COMM_TIMEOUT < portGetTickCnt()) //TODO handle number wrapping if(delta_t > UWB_COMM_TIMEOUT) //TODO handle number wrapping { -// if(instance_data[instance].uwbTimeout[i] == 0) - if(instance_data[instance].uwbListType[i] == UWB_LIST_NEIGHBOR) //what about hidden? +// if(instance_data[instance].uwbListType[i] == UWB_LIST_NEIGHBOR) //what about hidden? + if(tdma_handler.uwbListTDMAInfo[i].connectionType == UWB_LIST_NEIGHBOR) //what about hidden? { - instance_data[instance].uwbListType[i] = UWB_LIST_INACTIVE; //TODO release TDMA slots as well +// instance_data[instance].uwbListType[i] = UWB_LIST_INACTIVE; //TODO release TDMA slots as well + tdma_handler.uwbListTDMAInfo[i].connectionType = UWB_LIST_INACTIVE; //TODO release TDMA slots as well instance_data[instance].uwbTimeout[i] = 1; //NEW diff --git a/src/application/tdma_handler.c b/src/application/tdma_handler.c index e87cddf..735feb0 100644 --- a/src/application/tdma_handler.c +++ b/src/application/tdma_handler.c @@ -28,7 +28,8 @@ static bool slot_transition(struct TDMAHandler *this) //we have transitioned into the next slot. //get the slot number and set the start time appropriately - uint64 timeSinceFrameStart64 = get_dt64(this->uwbFrameStartTimes64[0], time_now_us); +// uint64 timeSinceFrameStart64 = get_dt64(this->uwbFrameStartTimes64[0], time_now_us); + uint64 timeSinceFrameStart64 = get_dt64(this->uwbListTDMAInfo[0].frameStartTime, time_now_us); uint64 frameDuration64 = this->slotDuration_us*this->uwbListTDMAInfo[0].framelength; if(timeSinceFrameStart64 >= frameDuration64) @@ -48,14 +49,17 @@ static bool slot_transition(struct TDMAHandler *this) while(timeSinceFrameStart64 >= frameDuration64) { - this->uwbFrameStartTimes64[0] = timestamp_add64(this->uwbFrameStartTimes64[0], frameDuration64); +// this->uwbFrameStartTimes64[0] = timestamp_add64(this->uwbFrameStartTimes64[0], frameDuration64); + this->uwbListTDMAInfo[0].frameStartTime = timestamp_add64(this->uwbListTDMAInfo[0].frameStartTime, frameDuration64); timeSinceFrameStart64 -= frameDuration64; } - this->lastFST = this->uwbFrameStartTimes64[0]; +// this->lastFST = this->uwbFrameStartTimes64[0]; + this->lastFST = this->uwbListTDMAInfo[0].frameStartTime; uint8 slot = timeSinceFrameStart64/(this->slotDuration_us); //integer division rounded down - this->lastSlotStartTime64 = this->uwbFrameStartTimes64[0] + (uint64)(this->slotDuration_us*slot); +// this->lastSlotStartTime64 = this->uwbFrameStartTimes64[0] + (uint64)(this->slotDuration_us*slot); + this->lastSlotStartTime64 = this->uwbListTDMAInfo[0].frameStartTime + (uint64)(this->slotDuration_us*slot); // uint8 debug_msg[100]; @@ -152,13 +156,16 @@ static void frame_sync(struct TDMAHandler *this, event_data_t *dw_event, uint8 f uint64 txrx_delay = (uint64)(convertdevicetimetosec(tx_antenna_delay + rxfs_process_delay)*1000000.0) + inst->storePreLen_us; uint64 hisTimeSinceFrameStart_us = timeSinceFrameStart_us + txrx_delay; - this->uwbFrameStartTimes64[srcIndex] = timestamp_subtract64(time_now_us, hisTimeSinceFrameStart_us); //TODO consider applying the diff! +// this->uwbFrameStartTimes64[srcIndex] = timestamp_subtract64(time_now_us, hisTimeSinceFrameStart_us); //TODO consider applying the diff! + this->uwbListTDMAInfo[srcIndex].frameStartTime = timestamp_subtract64(time_now_us, hisTimeSinceFrameStart_us); //TODO consider applying the diff! if(mode == FS_ADOPT) //TODO this might not be right! incoming framelength not always the same as ours! { - this->uwbFrameStartTimes64[0] = this->uwbFrameStartTimes64[srcIndex]; +// this->uwbFrameStartTimes64[0] = this->uwbFrameStartTimes64[srcIndex]; + this->uwbListTDMAInfo[0].frameStartTime = this->uwbListTDMAInfo[srcIndex].frameStartTime; uint8 slot = hisTimeSinceFrameStart_us/this->slotDuration_us; //integer division rounded down - this->lastSlotStartTime64 = this->uwbFrameStartTimes64[0] + (uint64)((this->slotDuration_us)*slot); +// this->lastSlotStartTime64 = this->uwbFrameStartTimes64[0] + (uint64)((this->slotDuration_us)*slot); + this->lastSlotStartTime64 = this->uwbListTDMAInfo[0].frameStartTime + (uint64)((this->slotDuration_us)*slot); } else if(mode == FS_COLLECT) { @@ -167,7 +174,8 @@ static void frame_sync(struct TDMAHandler *this, event_data_t *dw_event, uint8 f else// if(mode == FS_AVERAGE || mode == FS_EVAL) //TODO consider using a weighted average. perhaps use threshholds to determine if instead we should just use the ADOPT logic { // uint64 myFramelengthDuration_us = this->uwbListTDMAInfo[0].framelength*this->slotDuration_us; - uint64 myTimeSinceFrameStart_us = get_dt64(this->uwbFrameStartTimes64[0], time_now_us); +// uint64 myTimeSinceFrameStart_us = get_dt64(this->uwbFrameStartTimes64[0], time_now_us); + uint64 myTimeSinceFrameStart_us = get_dt64(this->uwbListTDMAInfo[0].frameStartTime, time_now_us); ////OLD WAY @@ -300,7 +308,8 @@ static void frame_sync(struct TDMAHandler *this, event_data_t *dw_event, uint8 f // send_usbmessage(&debug_msg[0], n); // usb_run(); - this->uwbFrameStartTimes64[0] = timestamp_add64(this->uwbFrameStartTimes64[0], diff_us/div); +// this->uwbFrameStartTimes64[0] = timestamp_add64(this->uwbFrameStartTimes64[0], diff_us/div); + this->uwbListTDMAInfo[0].frameStartTime = timestamp_add64(this->uwbListTDMAInfo[0].frameStartTime, diff_us/div); this->lastSlotStartTime64 = timestamp_add64(this->lastSlotStartTime64, diff_us/div); } else @@ -309,7 +318,8 @@ static void frame_sync(struct TDMAHandler *this, event_data_t *dw_event, uint8 f // int n = sprintf((char*)&debug_msg[0], "subtract %llu", diff_us); // send_usbmessage(&debug_msg[0], n); // usb_run(); - this->uwbFrameStartTimes64[0] = timestamp_subtract64(this->uwbFrameStartTimes64[0], diff_us/div); +// this->uwbFrameStartTimes64[0] = timestamp_subtract64(this->uwbFrameStartTimes64[0], diff_us/div); + this->uwbListTDMAInfo[0].frameStartTime = timestamp_subtract64(this->uwbListTDMAInfo[0].frameStartTime, diff_us/div); this->lastSlotStartTime64 = timestamp_subtract64(this->lastSlotStartTime64, diff_us/div); } @@ -323,7 +333,8 @@ static bool tx_sync_msg(struct TDMAHandler *this) { instance_data_t *inst = instance_get_local_structure_ptr(0); uint64 time_now_us = portGetTickCntMicro(); - uint64 myTimeSinceFrameStart_us = get_dt64(this->uwbFrameStartTimes64[0], time_now_us); +// uint64 myTimeSinceFrameStart_us = get_dt64(this->uwbFrameStartTimes64[0], time_now_us); + uint64 myTimeSinceFrameStart_us = get_dt64(this->uwbListTDMAInfo[0].frameStartTime, time_now_us); memcpy(&inst->sync_msg.messageData[SYNC_FRAMELENGTH], &this->uwbListTDMAInfo[0].framelength, sizeof(uint8)); memcpy(&inst->sync_msg.messageData[SYNC_TSFS], &myTimeSinceFrameStart_us, 6); int psduLength = 0; @@ -667,9 +678,11 @@ static bool tx_select(struct TDMAHandler *this) //TODO handle unsuccessful add uint32 timeSinceOldestRange = 0; for(int i = 1; i < inst->uwbListLen; i++)//0 reserved for self { - if(inst->uwbListType[i] == UWB_LIST_NEIGHBOR) +// if(inst->uwbListType[i] == UWB_LIST_NEIGHBOR) + if(this->uwbListTDMAInfo[i].connectionType == UWB_LIST_NEIGHBOR) { - uint32 timeSinceRange = get_dt32(inst->lastRangeTimeStamp[i], time_now); +// uint32 timeSinceRange = get_dt32(inst->lastRangeTimeStamp[i], time_now); + uint32 timeSinceRange = get_dt32(this->uwbListTDMAInfo[i].lastRange, time_now); if(timeSinceRange > timeSinceOldestRange) { timeSinceOldestRange = timeSinceRange; @@ -842,7 +855,8 @@ static void populate_inf_msg(struct TDMAHandler *this, uint8 inf_msg_type) //neighbor address, framelength, number of slots, and slot assignments for(int i = 1; i < inst->uwbListLen; i++) //slot 0 reserved for self { - if(inst->uwbListType[i] == UWB_LIST_NEIGHBOR) +// if(inst->uwbListType[i] == UWB_LIST_NEIGHBOR) + if(this->uwbListTDMAInfo[i].connectionType == UWB_LIST_NEIGHBOR) { struct TDMAInfo *info = &this->uwbListTDMAInfo[i]; @@ -870,7 +884,8 @@ static void populate_inf_msg(struct TDMAHandler *this, uint8 inf_msg_type) //hidden address, framelength, number of slots, and slot assignments for(int i = 1; i < inst->uwbListLen; i++) //slot 0 reserved for self { - if(inst->uwbListType[i] == UWB_LIST_HIDDEN) +// if(inst->uwbListType[i] == UWB_LIST_HIDDEN) + if(this->uwbListTDMAInfo[i].connectionType == UWB_LIST_HIDDEN) { struct TDMAInfo *info = &this->uwbListTDMAInfo[i]; @@ -912,11 +927,13 @@ static void update_inf_tsfs(struct TDMAHandler *this) instance_data_t *inst = instance_get_local_structure_ptr(0); uint64 time_now_us = portGetTickCntMicro(); int msgDataIndex = TDMA_TSFS; - uint64 timeSinceFrameStart64 = get_dt64(this->uwbFrameStartTimes64[0], time_now_us); +// uint64 timeSinceFrameStart64 = get_dt64(this->uwbFrameStartTimes64[0], time_now_us); + uint64 timeSinceFrameStart64 = get_dt64(this->uwbListTDMAInfo[0].frameStartTime, time_now_us); uint64 frameDuration = this->slotDuration_us*this->uwbListTDMAInfo[0].framelength; while(timeSinceFrameStart64 > frameDuration) { - this->uwbFrameStartTimes64[0] = timestamp_add64(this->uwbFrameStartTimes64[0], frameDuration); +// this->uwbFrameStartTimes64[0] = timestamp_add64(this->uwbFrameStartTimes64[0], frameDuration); + this->uwbListTDMAInfo[0].frameStartTime = timestamp_add64(this->uwbListTDMAInfo[0].frameStartTime, frameDuration); timeSinceFrameStart64 -= frameDuration; } @@ -995,7 +1012,8 @@ static bool process_inf_msg(struct TDMAHandler *this, uint8 *messageData, uint8 } instance_data_t *inst = instance_get_local_structure_ptr(0); - inst->uwbListType[srcIndex] = UWB_LIST_NEIGHBOR; +// inst->uwbListType[srcIndex] = UWB_LIST_NEIGHBOR; + this->uwbListTDMAInfo[srcIndex].connectionType = UWB_LIST_NEIGHBOR; uint8 numNeighbors; uint8 numHidden; @@ -1090,9 +1108,11 @@ static bool process_inf_msg(struct TDMAHandler *this, uint8 *messageData, uint8 uint8 uwb_index = instgetuwblistindex(inst, &address[0], inst->addrByteSize); if(uwb_index != 0) { - if(inst->uwbListType[uwb_index] == UWB_LIST_INACTIVE || inst->uwbListType[uwb_index] == UWB_LIST_TWICE_HIDDEN) +// if(inst->uwbListType[uwb_index] == UWB_LIST_INACTIVE || inst->uwbListType[uwb_index] == UWB_LIST_TWICE_HIDDEN) + if(this->uwbListTDMAInfo[uwb_index].connectionType == UWB_LIST_INACTIVE || this->uwbListTDMAInfo[uwb_index].connectionType == UWB_LIST_TWICE_HIDDEN) { - inst->uwbListType[uwb_index] = UWB_LIST_HIDDEN; +// inst->uwbListType[uwb_index] = UWB_LIST_HIDDEN; + this->uwbListTDMAInfo[uwb_index].connectionType = UWB_LIST_HIDDEN; } inst->lastHiddenTimeStamp[uwb_index] = time_now; @@ -1165,9 +1185,11 @@ static bool process_inf_msg(struct TDMAHandler *this, uint8 *messageData, uint8 uint8 uwb_index = instgetuwblistindex(inst, &address[0], inst->addrByteSize); if(uwb_index != 0)//0 reserved for self { - if(inst->uwbListType[uwb_index] == UWB_LIST_INACTIVE) +// if(inst->uwbListType[uwb_index] == UWB_LIST_INACTIVE) + if(this->uwbListTDMAInfo[uwb_index].connectionType == UWB_LIST_INACTIVE) { - inst->uwbListType[uwb_index] = UWB_LIST_TWICE_HIDDEN; +// inst->uwbListType[uwb_index] = UWB_LIST_TWICE_HIDDEN; + this->uwbListTDMAInfo[uwb_index].connectionType = UWB_LIST_TWICE_HIDDEN; } inst->lastTwiceHiddenTimeStamp[uwb_index] = time_now; @@ -1240,10 +1262,14 @@ static bool process_inf_msg(struct TDMAHandler *this, uint8 *messageData, uint8 if((uwbListInMsg[i] == FALSE && uwbListInMsg[j] == TRUE) || (uwbListInMsg[i] == TRUE && uwbListInMsg[j] == FALSE)) { - if((inst->uwbListType[i] == UWB_LIST_NEIGHBOR && inst->uwbListType[j] == UWB_LIST_NEIGHBOR) || - (inst->uwbListType[i] == UWB_LIST_NEIGHBOR && inst->uwbListType[j] == UWB_LIST_HIDDEN) || - (inst->uwbListType[j] == UWB_LIST_NEIGHBOR && inst->uwbListType[i] == UWB_LIST_NEIGHBOR) || - (inst->uwbListType[j] == UWB_LIST_NEIGHBOR && inst->uwbListType[i] == UWB_LIST_HIDDEN)) +// if((inst->uwbListType[i] == UWB_LIST_NEIGHBOR && inst->uwbListType[j] == UWB_LIST_NEIGHBOR) || +// (inst->uwbListType[i] == UWB_LIST_NEIGHBOR && inst->uwbListType[j] == UWB_LIST_HIDDEN) || +// (inst->uwbListType[j] == UWB_LIST_NEIGHBOR && inst->uwbListType[i] == UWB_LIST_NEIGHBOR) || +// (inst->uwbListType[j] == UWB_LIST_NEIGHBOR && inst->uwbListType[i] == UWB_LIST_HIDDEN)) + if((this->uwbListTDMAInfo[i].connectionType == UWB_LIST_NEIGHBOR && this->uwbListTDMAInfo[j].connectionType == UWB_LIST_NEIGHBOR) || + (this->uwbListTDMAInfo[i].connectionType == UWB_LIST_NEIGHBOR && this->uwbListTDMAInfo[j].connectionType == UWB_LIST_HIDDEN) || + (this->uwbListTDMAInfo[j].connectionType == UWB_LIST_NEIGHBOR && this->uwbListTDMAInfo[i].connectionType == UWB_LIST_NEIGHBOR) || + (this->uwbListTDMAInfo[j].connectionType == UWB_LIST_NEIGHBOR && this->uwbListTDMAInfo[i].connectionType == UWB_LIST_HIDDEN)) { //TODO make sure this is okay. will i need to ensure the assignments from the message are maintained? if(this->deconflict_uwb_pair(this, &this->uwbListTDMAInfo[i], &this->uwbListTDMAInfo[j]) == TRUE) @@ -2082,7 +2108,8 @@ static void build_new_network(struct TDMAHandler *this) // this->lastSlotStartTime_stm32 = time_now; //build the initial TDMA - this->uwbFrameStartTimes64[0] = timestamp_subtract64(time_now_us, this->slotDuration_us); +// this->uwbFrameStartTimes64[0] = timestamp_subtract64(time_now_us, this->slotDuration_us); + this->uwbListTDMAInfo[0].frameStartTime = timestamp_subtract64(time_now_us, this->slotDuration_us); this->lastSlotStartTime64 = time_now_us; @@ -2106,17 +2133,23 @@ static bool deconflict_slot_assignments(struct TDMAHandler *this) //first deconflict slots in neighbor, hidden, and twice hidden for(int i = 1; i < inst->uwbListLen; i++)//0 reserved for self { - if(inst->uwbListType[i] != UWB_LIST_INACTIVE) +// if(inst->uwbListType[i] != UWB_LIST_INACTIVE) + if(this->uwbListTDMAInfo[i].connectionType != UWB_LIST_INACTIVE) { for(int j = i+1; j < inst->uwbListLen; j++) { - if(inst->uwbListType[j] != UWB_LIST_INACTIVE && j != i) +// if(inst->uwbListType[j] != UWB_LIST_INACTIVE && j != i) + if(this->uwbListTDMAInfo[j].connectionType != UWB_LIST_INACTIVE && j != i) { //first check if their list type requires deconflicting - if((inst->uwbListType[i] == UWB_LIST_NEIGHBOR && inst->uwbListType[j] == UWB_LIST_TWICE_HIDDEN) || - (inst->uwbListType[j] == UWB_LIST_NEIGHBOR && inst->uwbListType[i] == UWB_LIST_TWICE_HIDDEN) || - (inst->uwbListType[i] == UWB_LIST_TWICE_HIDDEN && inst->uwbListType[j] == UWB_LIST_TWICE_HIDDEN) || - (inst->uwbListType[i] == UWB_LIST_HIDDEN && inst->uwbListType[j] == UWB_LIST_HIDDEN)) +// if((inst->uwbListType[i] == UWB_LIST_NEIGHBOR && inst->uwbListType[j] == UWB_LIST_TWICE_HIDDEN) || +// (inst->uwbListType[j] == UWB_LIST_NEIGHBOR && inst->uwbListType[i] == UWB_LIST_TWICE_HIDDEN) || +// (inst->uwbListType[i] == UWB_LIST_TWICE_HIDDEN && inst->uwbListType[j] == UWB_LIST_TWICE_HIDDEN) || +// (inst->uwbListType[i] == UWB_LIST_HIDDEN && inst->uwbListType[j] == UWB_LIST_HIDDEN)) + if((this->uwbListTDMAInfo[i].connectionType == UWB_LIST_NEIGHBOR && this->uwbListTDMAInfo[j].connectionType == UWB_LIST_TWICE_HIDDEN) || + (this->uwbListTDMAInfo[j].connectionType == UWB_LIST_NEIGHBOR && this->uwbListTDMAInfo[i].connectionType == UWB_LIST_TWICE_HIDDEN) || + (this->uwbListTDMAInfo[i].connectionType == UWB_LIST_TWICE_HIDDEN && this->uwbListTDMAInfo[j].connectionType == UWB_LIST_TWICE_HIDDEN) || + (this->uwbListTDMAInfo[i].connectionType == UWB_LIST_HIDDEN && this->uwbListTDMAInfo[j].connectionType == UWB_LIST_HIDDEN)) { continue; } @@ -2146,7 +2179,8 @@ static bool deconflict_slot_assignments(struct TDMAHandler *this) //next deconflict slots between self and neighbor, hidden, and twice hidden for(int i = 1; i < inst->uwbListLen; i++)//0 reserved for self { - if(inst->uwbListType[i] != UWB_LIST_INACTIVE) +// if(inst->uwbListType[i] != UWB_LIST_INACTIVE) + if(this->uwbListTDMAInfo[i].connectionType != UWB_LIST_INACTIVE) { if(this->deconflict_uwb_pair(this, &this->uwbListTDMAInfo[0], &this->uwbListTDMAInfo[i])) { @@ -2420,9 +2454,12 @@ static bool self_conflict(struct TDMAHandler *this) for(int b = 1; b < inst->uwbListLen; b++) { - if(inst->uwbListType[b] == UWB_LIST_NEIGHBOR || - inst->uwbListType[b] == UWB_LIST_HIDDEN || - inst->uwbListType[b] == UWB_LIST_TWICE_HIDDEN) +// if(inst->uwbListType[b] == UWB_LIST_NEIGHBOR || +// inst->uwbListType[b] == UWB_LIST_HIDDEN || +// inst->uwbListType[b] == UWB_LIST_TWICE_HIDDEN) + if(this->uwbListTDMAInfo[b].connectionType == UWB_LIST_NEIGHBOR || + this->uwbListTDMAInfo[b].connectionType == UWB_LIST_HIDDEN || + this->uwbListTDMAInfo[b].connectionType == UWB_LIST_TWICE_HIDDEN) { struct TDMAInfo *info_b = &this->uwbListTDMAInfo[b]; @@ -2646,14 +2683,16 @@ static void set_discovery_mode(struct TDMAHandler *this, DISCOVERY_MODE discover for(int i=1; i < inst->uwbListLen; i++) //zero reserved for self { - if(inst->uwbListType[i] != UWB_LIST_NEIGHBOR) +// if(inst->uwbListType[i] != UWB_LIST_NEIGHBOR) + if(this->uwbListTDMAInfo[i].connectionType != UWB_LIST_NEIGHBOR) { continue; //TODO consider a way to accoutn for hidden and twice hidden to determine which netowrk is larger } struct TDMAInfo *info_i = &this->uwbListTDMAInfo[i]; // uint64 framelengthDuration_us = info_i->framelength*this->slotDuration_us; - uint64 timeSinceFrameStart_us = get_dt64(this->uwbFrameStartTimes64[i], time_now_us); +// uint64 timeSinceFrameStart_us = get_dt64(this->uwbFrameStartTimes64[i], time_now_us); + uint64 timeSinceFrameStart_us = get_dt64(this->uwbListTDMAInfo[i].frameStartTime, time_now_us); //if tsfs > framelengthDuration_us, reduce it by framelengthDuration_us @@ -2738,7 +2777,8 @@ static void set_discovery_mode(struct TDMAHandler *this, DISCOVERY_MODE discover //reached the last listed sub_netowrk, list a new subnetwork. sub_network_members[num_sub_networks] = 1; sub_network_base_framelength[num_sub_networks] = this->uwbListTDMAInfo[i].framelength; - sub_network_tsfs[num_sub_networks] = get_dt64(this->uwbFrameStartTimes64[i], time_now_us); +// sub_network_tsfs[num_sub_networks] = get_dt64(this->uwbFrameStartTimes64[i], time_now_us); + sub_network_tsfs[num_sub_networks] = get_dt64(this->uwbListTDMAInfo[i].frameStartTime, time_now_us); sub_network_membership[num_sub_networks] = num_sub_networks; num_sub_networks++; break; @@ -2780,10 +2820,12 @@ static void set_discovery_mode(struct TDMAHandler *this, DISCOVERY_MODE discover for(int i = 1; i < inst->uwbListLen; i++)//0 reserved for self { - if(inst->uwbListType[i] == UWB_LIST_NEIGHBOR && sub_network_membership[i] == sub_network_selected) +// if(inst->uwbListType[i] == UWB_LIST_NEIGHBOR && sub_network_membership[i] == sub_network_selected) + if(this->uwbListTDMAInfo[i].connectionType == UWB_LIST_NEIGHBOR && sub_network_membership[i] == sub_network_selected) { neighborIndices[nidx] = i; - tnext[nidx] = this->uwbFrameStartTimes64[i]; +// tnext[nidx] = this->uwbFrameStartTimes64[i]; + tnext[nidx] = this->uwbListTDMAInfo[i].frameStartTime; while(time_now_us > tnext[nidx]) //TODO handle number wrapping... { tnext[nidx] += this->uwbListTDMAInfo[i].framelength*slotDuration_us; @@ -2853,15 +2895,20 @@ static void set_discovery_mode(struct TDMAHandler *this, DISCOVERY_MODE discover //back-track the frame start time so we can inform the need to rebase //and keep in sync with the subnetwork we initially chose to sync with - this->uwbFrameStartTimes64[0] = latest_tnext; +// this->uwbFrameStartTimes64[0] = latest_tnext; + this->uwbListTDMAInfo[0].frameStartTime = latest_tnext; //TODO handle number wrapping uint64 myFrameDuration = this->uwbListTDMAInfo[0].framelength*this->slotDuration_us; - while(this->uwbFrameStartTimes64[0] > time_now_us) +// while(this->uwbFrameStartTimes64[0] > time_now_us) + while(this->uwbListTDMAInfo[0].frameStartTime > time_now_us) { - this->uwbFrameStartTimes64[0] -= myFrameDuration; +// this->uwbFrameStartTimes64[0] -= myFrameDuration; + this->uwbListTDMAInfo[0].frameStartTime -= myFrameDuration; } - uint8 slot = this->uwbFrameStartTimes64[0]/this->slotDuration_us; //integer division rounded down - this->lastSlotStartTime64 = this->uwbFrameStartTimes64[0] + (uint64)(this->slotDuration_us*slot); +// uint8 slot = this->uwbFrameStartTimes64[0]/this->slotDuration_us; //integer division rounded down + uint8 slot = this->uwbListTDMAInfo[0].frameStartTime/this->slotDuration_us; //integer division rounded down +// this->lastSlotStartTime64 = this->uwbFrameStartTimes64[0] + (uint64)(this->slotDuration_us*slot); + this->lastSlotStartTime64 = this->uwbListTDMAInfo[0].frameStartTime + (uint64)(this->slotDuration_us*slot); // this->lastSlotStartTime64 = this->uwbFrameStartTimes64[0]; @@ -3078,9 +3125,12 @@ static struct TDMAHandler new(){ ret.uwbListTDMAInfo[i].framelength = (uint8)MIN_FRAMELENGTH; ret.uwbListTDMAInfo[i].slots = NULL; ret.uwbListTDMAInfo[i].slotsLength = 0; + ret.uwbListTDMAInfo[i].frameStartTime = time_now_us; + ret.uwbListTDMAInfo[i].connectionType = UWB_LIST_INACTIVE; } + ret.uwbListTDMAInfo[0].connectionType = UWB_LIST_SELF; - ret.uwbFrameStartTimes64[0] = time_now_us; +// ret.uwbFrameStartTimes64[0] = time_now_us; ret.lastFST = time_now_us; ret.lastSlotStartTime64 = time_now_us; ret.infSentThisSlot = FALSE; diff --git a/src/application/tdma_handler.h b/src/application/tdma_handler.h index 78b7cc4..ec9eac9 100644 --- a/src/application/tdma_handler.h +++ b/src/application/tdma_handler.h @@ -7,6 +7,12 @@ struct TDMAInfo { + //lastCommNeighbor + //lastCommHidden + //lastComm2Hidden + uint64 frameStartTime; + uint32 lastRange; + uint8 connectionType; //UWB_LIST_SELF, UWB_LIST_NEIGHBOR, UWB_LIST_HIDDEN, UWB_LIST_INACTIVE uint8 uwbIndex; //TODO remove if unused uint8 framelength; uint8 slotsLength; @@ -45,7 +51,7 @@ struct TDMAHandler uint64 lastINFrx; - uint64 uwbFrameStartTimes64[UWB_LIST_SIZE]; +// uint64 uwbFrameStartTimes64[UWB_LIST_SIZE]; uint64 lastFST; uint64 lastSlotStartTime64; uint32 slotDuration_ms; //TODO make variable in duration based on UWB_LIST_SIZE -- GitLab