diff --git a/df_datalink_sp/src/networking/link_layer/time_sync.c b/df_datalink_sp/src/networking/link_layer/time_sync.c index 9b55586..5dd7f49 100644 --- a/df_datalink_sp/src/networking/link_layer/time_sync.c +++ b/df_datalink_sp/src/networking/link_layer/time_sync.c @@ -32,20 +32,22 @@ /*****************************************************************************/ /** - * @brief a slot alignment, base on physical layer information. + * @brief Get time deviation to the specified frame and slot number. * * @param instPtr a pointer to linklayer layer instance * @param frameNum * @param slotNum + * @param relative + * @param timeDev * - * @return SUCCESS Initialize successfully. - * FAILURE Initialization failed, allocate memory fail or initial - * bram controller fail. + * @return SUCCESS + * EIGNORE there is no received frame * ******************************************************************************/ -// TODO: Check -int32_t L2_TimeAlign(L2_INST *instPtr, uint32_t frameNum, uint32_t slotNum, bool relative) +int32_t L2_GetTimeDeviation(L2_INST *instPtr, uint32_t frameNum, uint32_t slotNum, bool relative, int64_t *timeDev) { + ASSERT(instPtr != NULL); + ASSERT(timeDev != NULL); L1_FRAME_TYPE lastRecvdFrame; lastRecvdFrame = Phy_GetLastRecvFrameType(instPtr->config.phyInstPtr); if (lastRecvdFrame == L1_NONE_FRAME) @@ -57,8 +59,7 @@ int32_t L2_TimeAlign(L2_INST *instPtr, uint32_t frameNum, uint32_t slotNum, bool DBG_INFO("Starting TimeAlign operation...\n"); // read nextSendTime from physical layer uint64_t currTime, expectTime; - int64_t timeDiff; - TIME_WORD timeStamp, slotTimerAdjmet; + TIME_WORD timeStamp; expectTime = ((uint64_t)(frameNum * L2_SLOTS_PER_FRAME + slotNum)) * TIME_FRAC_MAX; expectTime += Phy_GetTimeComp(lastRecvdFrame); @@ -71,10 +72,27 @@ int32_t L2_TimeAlign(L2_INST *instPtr, uint32_t frameNum, uint32_t slotNum, bool currTime = (uint64_t)timeStamp.frac_part; currTime += ((uint64_t)timeStamp.int_part) * TIME_FRAC_MAX; - timeDiff = (int64_t)(expectTime - currTime); - - slotTimerAdjmet.int_part = (uint32_t)(timeDiff / TIME_FRAC_MAX); - slotTimerAdjmet.frac_part = (uint32_t)(timeDiff % TIME_FRAC_MAX); - TimeCtrl_TimeAdjust(instPtr->config.tmcInstPtr, &slotTimerAdjmet, TM_ADJ_ADD); + *timeDev = (int64_t)(expectTime - currTime); return SUCCESS; +} + + +/*****************************************************************************/ +/** + * @brief Implement time adjustment by applying time deviation. + * + * @param instPtr a pointer to linklayer layer instance + * @param timeDev + * + * @return NONE + * + ******************************************************************************/ +void L2_TimeAdjust(L2_INST *instPtr, const int64_t *timeDev) +{ + ASSERT(instPtr != NULL); + ASSERT(timeDev != NULL); + TIME_WORD slotTimerAdjmet; + slotTimerAdjmet.int_part = (uint32_t)(*timeDev / TIME_FRAC_MAX); + slotTimerAdjmet.frac_part = (uint32_t)(*timeDev % TIME_FRAC_MAX); + TimeCtrl_TimeAdjust(instPtr->config.tmcInstPtr, &slotTimerAdjmet, TM_ADJ_ADD); } \ No newline at end of file