From a6aff34dee3dce838210a333d530e2710d555ccf Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Fri, 16 May 2025 21:11:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=E5=B1=82=E5=A4=A7=E6=A1=86=E6=9E=B6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- df_datalink_ge/src/main.c | 12 +- df_datalink_sp/src/main.c | 15 +- .../src/networking/link_layer/link_layer.c | 288 +++++++++--------- .../src/networking/link_layer/link_layer.h | 45 ++- .../networking/link_layer/link_layer_types.h | 84 +++-- df_datalink_sp/src/system_monitor.h | 22 +- 6 files changed, 245 insertions(+), 221 deletions(-) diff --git a/df_datalink_ge/src/main.c b/df_datalink_ge/src/main.c index e15bc33..2a1c8f3 100644 --- a/df_datalink_ge/src/main.c +++ b/df_datalink_ge/src/main.c @@ -46,7 +46,7 @@ /************************** Function Prototypes ******************************/ int32_t SetupInterruptSystem(struct irq_ctrl_desc *descPtr); void Phy_IntrHandler(void *context); -void PeriodicPull_Handler(void *callBackRef); +void PeriodicPoll_Handler(void *callBackRef); void ScuTimer_IntrHandler(void *context); void Mpc_RxIntrHandler(void *context); void Mpc_TxIntrHandler(void *context); @@ -57,9 +57,9 @@ struct callback_desc phy_callback_desc = .ctx = NULL }; -struct callback_desc periodicpull_callback_desc = +struct callback_desc periodicpoll_callback_desc = { - .callback = PeriodicPull_Handler, + .callback = PeriodicPoll_Handler, .ctx = NULL }; @@ -246,7 +246,7 @@ int32_t SetupInterruptSystem(struct irq_ctrl_desc *descPtr) return Status; } // Connect the interrupt service routine isr1 to the interrupt controller - Status = irq_register_callback(descPtr, PERIODIC_5MS_INTR_ID, &periodicpull_callback_desc); + Status = irq_register_callback(descPtr, PERIODIC_5MS_INTR_ID, &periodicpoll_callback_desc); if (Status != SUCCESS) { DBG_ERROR("PHY_INTR register callback FAILED, ErrorCode: %" PRId32 ".\n", Status); @@ -348,7 +348,7 @@ void Phy_IntrHandler(void *context) * @return None. * *****************************************************************************/ -void PeriodicPull_Handler(void *callBackRef) +void PeriodicPoll_Handler(void *callBackRef) { int32_t Status; Status = Linklayer_Proc(linkInstPtr); @@ -357,7 +357,7 @@ void PeriodicPull_Handler(void *callBackRef) DBG_ERROR("Link layer runs failed, with error code: %" PRId32 "\n", Status); _nop_(); } -} // PeriodicPull_Handler +} // PeriodicPoll_Handler /*****************************************************************************/ /** diff --git a/df_datalink_sp/src/main.c b/df_datalink_sp/src/main.c index 7b52f7a..31319f6 100644 --- a/df_datalink_sp/src/main.c +++ b/df_datalink_sp/src/main.c @@ -38,7 +38,7 @@ /************************** Function Prototypes ******************************/ int32_t SetupInterruptSystem(struct irq_ctrl_desc *descPtr); void Phy_IntrHandler(void *context); -void PeriodicPull_Handler(void *callBackRef); +void PeriodicPoll_Handler(void *callBackRef); void ScuTimer_IntrHandler(void *context); void Systembus_RxIntrHandler(void *context); void Systembus_TxIntrHandler(void *context); @@ -49,8 +49,8 @@ struct callback_desc phy_callback_desc = { .ctx = NULL }; -struct callback_desc periodicpull_callback_desc = { - .callback = PeriodicPull_Handler, +struct callback_desc periodicpoll_callback_desc = { + .callback = PeriodicPoll_Handler, .ctx = NULL }; @@ -190,7 +190,7 @@ int32_t SetupInterruptSystem(struct irq_ctrl_desc *descPtr) return Status; } // Connect the interrupt service routine isr1 to the interrupt controller - Status = irq_register_callback(descPtr, PERIODIC_5MS_INTR_ID, &periodicpull_callback_desc); + Status = irq_register_callback(descPtr, PERIODIC_5MS_INTR_ID, &periodicpoll_callback_desc); if (Status != SUCCESS) { DBG_ERROR("PHY_INTR register callback FAILED, ErrorCode: %" PRId32 ".\n", Status); @@ -282,17 +282,16 @@ void Phy_IntrHandler(void *context) Phy_UpdateState(phyInstPtr); } // PhyIntr_Handler - /****************************************************************************/ /** - * Handler of periodic 5ms interrupt + * Handler of periodic 2ms interrupt * * @param callBackRef is the linklayer instance pointer. * * @return None. * *****************************************************************************/ -void PeriodicPull_Handler(void *callBackRef) +void PeriodicPoll_Handler(void *callBackRef) { int32_t Status; Status = Linklayer_Proc(linkInstPtr); @@ -301,7 +300,7 @@ void PeriodicPull_Handler(void *callBackRef) DBG_ERROR("Link layer runs failed, with error code: %" PRId32 "\n", Status); _nop_(); } -} // PeriodicPull_Handler +} // PeriodicPoll_Handler /*****************************************************************************/ /** diff --git a/df_datalink_sp/src/networking/link_layer/link_layer.c b/df_datalink_sp/src/networking/link_layer/link_layer.c index 897508a..e500576 100644 --- a/df_datalink_sp/src/networking/link_layer/link_layer.c +++ b/df_datalink_sp/src/networking/link_layer/link_layer.c @@ -33,7 +33,7 @@ #endif /************************** Constant Definitions *****************************/ #define NET_START_TIME_INFTY UINT32_MAX -#define LINK_BROCK_THRESHOLD L2_SLOTS_PER_FRAME // 0.5 secods +#define LINK_BROCK_THRESHOLD L2_SLOTS_PER_FRAME // 1 seconds /************************** Variable Definitions *****************************/ /***************** Macros (Inline Functions) Definitions *********************/ @@ -59,7 +59,7 @@ inline void L2_RcdShift(L2_RCD *rcd, uint32_t netxVal) } /** - * @brief helper function to update linkelayer state + * @brief helper function to update linklayer state */ static inline void UpdateMainSate(L2_INST *instPtr, L2_NODE_STATE newSate) { @@ -131,7 +131,7 @@ static void L2_FrameStateUpdate(L2_INST *instPtr) ASSERT(instPtr != NULL); PHY_INST *phyRef = instPtr->config.phyInstPtr; bool isValid; - L2_FRAME_TYPE recvType = L2_GetLastOptFrameType(instPtr); + L2_FRAME_TYPE recvType = L2_GetLastFrameType(instPtr); isValid = false; // Update frame state. if (Phy_IsFrameValid(phyRef) == false) @@ -148,20 +148,34 @@ static void L2_FrameStateUpdate(L2_INST *instPtr) // Update frame state. switch (recvType) { - case L2_SCAN_FRAME: - case L2_ADV_FRAME: - isValid = L2_CrcCheck(instPtr->recvPktData, L2_ADV_PACK_LEN, L2_CRC16_1021); + case L2_FRAME_ADV: + isValid = L2_CrcCheck(instPtr->recvPktData, L2_GetFrameLen(L2_FRAME_ADV, L2_SVC_NONE), L2_CRC16_1021); instPtr->log.advRecvCnt++; instPtr->log.advCorrectCnt = isValid ? instPtr->log.advCorrectCnt + 1 : instPtr->log.advCorrectCnt; break; - case L2_CFM_FRAME: - isValid = L2_CrcCheck(instPtr->recvPktData, L2_CMF_PACK_LEN, L2_CRC16_1021); - instPtr->log.cfmRecvCnt++; - instPtr->log.cfmCorrectCnt = isValid ? instPtr->log.cfmCorrectCnt + 1 : instPtr->log.cfmCorrectCnt; + case L2_FRAME_ACK: + isValid = L2_CrcCheck(instPtr->recvPktData, L2_GetFrameLen(L2_FRAME_ACK, L2_SVC_NONE), L2_CRC16_1021); + instPtr->log.ackRecvCnt++; + instPtr->log.ackCorrectCnt = isValid ? instPtr->log.ackCorrectCnt + 1 : instPtr->log.ackCorrectCnt; break; - case L2_SVC_FRAME: + case L2_FRAME_DIS: + isValid = L2_CrcCheck(instPtr->recvPktData, L2_GetFrameLen(L2_FRAME_DIS, L2_SVC_NONE), L2_CRC16_1021); + instPtr->log.disRecvCnt++; + instPtr->log.disCorrectCnt = isValid ? instPtr->log.disCorrectCnt + 1 : instPtr->log.disCorrectCnt; + break; + case L2_FRAME_MNG: + isValid = L2_CrcCheck(instPtr->recvPktData, L2_GetFrameLen(L2_FRAME_MNG, L2_SVC_NONE), L2_CRC16_1021); + instPtr->log.mngRecvCnt++; + instPtr->log.mngCorrectCnt = isValid ? instPtr->log.mngCorrectCnt + 1 : instPtr->log.mngCorrectCnt; + break; + case L2_FRAME_RTT: + isValid = L2_CrcCheck(instPtr->recvPktData, L2_GetFrameLen(L2_FRAME_RTT, L2_SVC_NONE), L2_CRC16_1021); + instPtr->log.rttRecvCnt++; + instPtr->log.rttCorrectCnt = isValid ? instPtr->log.rttCorrectCnt + 1 : instPtr->log.rttCorrectCnt; + break; + case L2_FRAME_SVC: #ifndef DATALINK_ENABLE_BERTEST - isValid = L2_CrcCheck(instPtr->recvPktData, L2_SVC_PACK_LEN, L2_CRC16_1021); + isValid = L2_CrcCheck(instPtr->recvPktData, L2_GetFrameLen(L2_FRAME_SVC, instPtr->config.serviceRate), L2_CRC16_1021); #else isValid = true; #endif @@ -265,9 +279,9 @@ inline bool L2_isCxn2Net(L2_INST *instPtr) /** * @brief Get corresponding frame length in byte of L2 frame. */ -inline uint32_t L2_GetFrameLen(L2_FRAME_TYPE l2FrameType) +inline uint32_t L2_GetFrameLen(L2_FRAME_TYPE l2FrameType, L2_SVC_RATE l2SvcRate) { - return Phy_GetFrameLen(L2_L2frame2L1frame(l2FrameType)); + return Phy_GetFrameLen(L2_L2frame2L1frame(l2FrameType, l2SvcRate)); } /** @@ -377,57 +391,54 @@ inline L2_TOR_TYPE L2_GetNextTor(L2_INST *instPtr) return instPtr->tor.next; } -/*****************************************************************************/ /** - * @brief Infer last received frame type. - * - * @param instPtr A pointer to physical layer control instance. - * - * @return L2_FRAME_TYPE. - * - ******************************************************************************/ -L2_FRAME_TYPE L2_GetLastOptFrameType(L2_INST *instPtr) + * @brief Get service rate of the node. + */ +inline L2_SVC_RATE L2_GetServiceRate(L2_INST *instPtr) { - if (instPtr->myInfo.nodeType == L2_NODE_HEAD || L2_isCxn2Net(instPtr)) - { - return instPtr->frame.curr; - } - switch (instPtr->scanFSM->scanStage) - { - case L2_SCAN_INIT_STAGE: - return L2_SCAN_FRAME; - case L2_SCAN_ADV_STAGE: - return L2_ADV_FRAME; - case L2_SCAN_CFM_STAGE: - return L2_CFM_FRAME; - default: - return L2_NONE_FRAME; - } + ASSERT(instPtr != NULL); + return instPtr->config.serviceRate; } + /*****************************************************************************/ /** * @brief Convert L2 frame type to L1 frame type * * @param l2Frame + * @param l2SvcRate * * @return L1 frame type. * ******************************************************************************/ -L1_FRAME_TYPE L2_L2frame2L1frame(L2_FRAME_TYPE l2Frame) +L1_FRAME_TYPE L2_L2frame2L1frame(L2_FRAME_TYPE l2Frame, L2_SVC_RATE l2SvcRate) { switch (l2Frame) { - case L2_SCAN_FRAME: - return L1_10KBPS_10MS_FRAME; - case L2_ADV_FRAME: - return L1_10KBPS_20MS_FRAME; - case L2_CFM_FRAME: - case L2_SVC_FRAME: - return L1_40KBPS_20MS_FRAME; + case L2_FRAME_ADV: + return L1_FRAME_ADV_24MS; + case L2_FRAME_ACK: + return L1_FRAME_ACK_8MS; + case L2_FRAME_DIS: + case L2_FRAME_MNG: + case L2_FRAME_RTT: + return L1_FRAME_128KBPS_4MS; + case L2_FRAME_SVC: + switch (l2SvcRate) + { + case L2_SVC_128K: + return L1_FRAME_128KBPS_4MS; + case L2_SVC_512K: + return L1_FRAME_512KBPS_4MS; + case L2_SVC_2M: + return L1_FRAME_2MBPS_4MS; + default: + return L1_FRAME_NONE; + } default: return L1_FRAME_NONE; } } + /** @} LinkLayer_Utility*/ /** @@ -508,9 +519,9 @@ int32_t Linklayer_Init(L2_INST **instPtr, const L2_CONFIG *config) (*instPtr)->slotNum.last = 0; (*instPtr)->slotNum.curr = 0; (*instPtr)->slotNum.next = 0; - (*instPtr)->frame.last = L2_NONE_FRAME; - (*instPtr)->frame.curr = L2_NONE_FRAME; - (*instPtr)->frame.next = L2_NONE_FRAME; + (*instPtr)->frame.last = L2_FRAME_NONE; + (*instPtr)->frame.curr = L2_FRAME_NONE; + (*instPtr)->frame.next = L2_FRAME_NONE; (*instPtr)->tor.last = L2_TOR_SUSPEND; (*instPtr)->tor.curr = L2_TOR_SUSPEND; (*instPtr)->tor.next = L2_TOR_SUSPEND; @@ -605,9 +616,9 @@ int32_t Linklayer_Reconfig(L2_INST *instPtr, const L2_CONFIG *config) instPtr->slotNum.last = 0; instPtr->slotNum.curr = 0; instPtr->slotNum.next = 0; - instPtr->frame.last = L2_NONE_FRAME; - instPtr->frame.curr = L2_NONE_FRAME; - instPtr->frame.next = L2_NONE_FRAME; + instPtr->frame.last = L2_FRAME_NONE; + instPtr->frame.curr = L2_FRAME_NONE; + instPtr->frame.next = L2_FRAME_NONE; instPtr->tor.last = L2_TOR_SUSPEND; instPtr->tor.curr = L2_TOR_SUSPEND; instPtr->tor.next = L2_TOR_SUSPEND; @@ -851,12 +862,14 @@ int32_t Linklayer_PktHandler(L2_INST *instPtr, L2_FRAME_TYPE frameType) switch (frameType) { - case L2_SCAN_FRAME: - case L2_ADV_FRAME: - case L2_CFM_FRAME: + case L2_FRAME_ADV: + case L2_FRAME_ACK: Status = L2_Scan_PktHandler(instPtr, instPtr->recvPktData); break; - case L2_SVC_FRAME: + case L2_FRAME_DIS: + case L2_FRAME_MNG: + case L2_FRAME_RTT: + case L2_FRAME_SVC: Status = L2_Service_PktHandler(instPtr, instPtr->recvPktData); break; default: @@ -923,22 +936,26 @@ static int32_t Linklayer_Routine(L2_INST *instPtr) instPtr->rtneConfig.curr = instPtr->rtneConfig.next; instPtr->rtneConfig.next = &(instPtr->rtneConfig.rtneTable[tableIndx][entryIndx]); rtneEntry = instPtr->rtneConfig.rtneTable[tableIndx][entryIndx]; - DBG_INFO("## Routine: %" PRIu32 "-%" PRIu32 ", Routine period: %" PRIu32 ".\n", tableIndx, entryIndx, instPtr->rtneConfig.rtnePrd); + DBG_INFO("## Routine: %" PRIu32 "-%" PRIu32 ", Routine period: %" PRIu32 ".\n", tableIndx, entryIndx, + instPtr->rtneConfig.rtnePrd); switch (rtneEntry.slotType) { case L2_SLOT_IDLE: - // Skip a 5ms slot. - DBG_INFO("Skipping idle slot (5ms)...\n"); + // Skip a 2 ms slot. + DBG_INFO("Skipping idle slot (2 ms)...\n"); Status = SUCCESS; break; - case L2_SLOT_SCAN: case L2_SLOT_ADVERTISE: - case L2_SLOT_CONFIRM: + case L2_SLOT_ACKNOWLEDGE: Status = L2_Scan_Routine(instPtr, &rtneEntry); break; + case L2_SLOT_DISTRIBUTE: + case L2_SLOT_MANAGE: + case L2_SLOT_RTT: + Status = L2_Service_Routine(instPtr, &rtneEntry, L2_SVC_128K); case L2_SLOT_SERVICE: - Status = L2_Service_Routine(instPtr, &rtneEntry); + Status = L2_Service_Routine(instPtr, &rtneEntry, L2_GetServiceRate(instPtr)); break; default: DBG_ERROR("UNKNOWN slot type [%" PRId8 "].\n", rtneEntry.slotType); @@ -1021,9 +1038,9 @@ int32_t Linklayer_Proc(L2_INST *instPtr) // Handle frame received in last slot. if (L2_isDataAvail(instPtr) == true) { - if (Linklayer_PktHandler(instPtr, L2_GetLastOptFrameType(instPtr)) != SUCCESS) + if (Linklayer_PktHandler(instPtr, L2_GetLastFrameType(instPtr)) != SUCCESS) { - DBG_ERROR("Failed to handle last received frame: %" PRId8 ".\n", L2_GetLastOptFrameType(instPtr)); + DBG_ERROR("Failed to handle last received frame: %" PRId8 ".\n", L2_GetLastFrameType(instPtr)); } } @@ -1064,16 +1081,22 @@ int32_t Linklayer_Proc(L2_INST *instPtr) instPtr->linkLog.cxnStatus = (L2_isCxn2Net(instPtr)) ? 0x11 : 0x00; instPtr->linkLog.linkStage = (instPtr->mainState == L2_INIT_STATE) ? 0x11 : 0x22; instPtr->linkLog.recxnCnt = instPtr->log.reconnectCnt; - instPtr->linkLog.beamNo = instPtr->scanFSM->beamNo; - instPtr->linkLog.beamWidth = instPtr->log.lastBeamWidth; - instPtr->linkLog.beamAz = phyRef->antNrrwPattern[instPtr->scanFSM->beamNo].oaxis; - instPtr->linkLog.beamEl = phyRef->antNrrwPattern[instPtr->scanFSM->beamNo].raxis; + instPtr->linkLog.antIndex = instPtr->scanFSM->antIndex; instPtr->linkLog.advTxCnt = (uint16_t)instPtr->log.advTxCnt; instPtr->linkLog.advRecvCnt = (uint16_t)instPtr->log.advRecvCnt; instPtr->linkLog.advCorrectCnt = (uint16_t)instPtr->log.advCorrectCnt; - instPtr->linkLog.cfmTxCnt = instPtr->log.cfmTxCnt; - instPtr->linkLog.cfmRecvCnt = instPtr->log.cfmRecvCnt; - instPtr->linkLog.cfmCorrectCnt = instPtr->log.cfmCorrectCnt; + instPtr->linkLog.ackTxCnt = instPtr->log.ackTxCnt; + instPtr->linkLog.ackRecvCnt = instPtr->log.ackRecvCnt; + instPtr->linkLog.ackCorrectCnt = instPtr->log.ackCorrectCnt; + instPtr->linkLog.disTxCnt = instPtr->log.disTxCnt; + instPtr->linkLog.disRecvCnt = instPtr->log.disRecvCnt; + instPtr->linkLog.disCorrectCnt = instPtr->log.disCorrectCnt; + instPtr->linkLog.mngTxCnt = instPtr->log.mngTxCnt; + instPtr->linkLog.mngRecvCnt = instPtr->log.mngRecvCnt; + instPtr->linkLog.mngCorrectCnt = instPtr->log.mngCorrectCnt; + instPtr->linkLog.rttTxCnt = instPtr->log.rttTxCnt; + instPtr->linkLog.rttRecvCnt = instPtr->log.rttRecvCnt; + instPtr->linkLog.rttCorrectCnt = instPtr->log.rttCorrectCnt; instPtr->linkLog.svcTxCnt = instPtr->log.svcTxCnt; instPtr->linkLog.svcRecvCnt = instPtr->log.svcRecvCnt; instPtr->linkLog.svcCorrectCnt = instPtr->log.svcCorrectCnt; @@ -1086,69 +1109,6 @@ int32_t Linklayer_Proc(L2_INST *instPtr) return SUCCESS; } -/*****************************************************************************/ -/** - * @brief Steer antenna beam to specified node. - * - * @param instPtr a pointer to link layer descriptor instance - * @param nodeId destination node - * - * @return Corresponding frame length - * L2_FRAME_NONE_LEN if the frame type code cannot be recognized. - * - ******************************************************************************/ -int32_t L2_SteerBeam2Node(L2_INST *instPtr, uint8_t nodeId) -{ - ASSERT(instPtr != NULL); - int32_t Status; - - COORD myPos, dstPos, beamDir; - Status = L2_GetNodePos(instPtr->nodeList, nodeId, &dstPos); - if (Status != SUCCESS) - { - DBG_ERROR("Failed to retrieve position info of node %" PRIu8 ", remain last configuration.\n", nodeId); - return EPARAM; - } - myPos.x = instPtr->sysInfo.posX; - myPos.y = instPtr->sysInfo.posY; - myPos.z = instPtr->sysInfo.posZ; - - // TODO Check data format - EULERANGLES attitudeEuler, antAttitudeEuler; - attitudeEuler.alpha = DEG2RAD(instPtr->sysInfo.pitch); - attitudeEuler.beta = DEG2RAD(instPtr->sysInfo.yaw); - attitudeEuler.gamma = DEG2RAD(instPtr->sysInfo.roll); - - // FIXME: confirm date source. - antAttitudeEuler.alpha = DEG2RAD(0); - antAttitudeEuler.beta = DEG2RAD(0); - antAttitudeEuler.gamma = DEG2RAD(0); - - // TODO Check data format - QUATERNION attitude, antAttitude; - attitude = Quaternion_FromeEulerAngles(attitudeEuler, EULERANGLES_XYZ); - antAttitude = Quaternion_FromeEulerAngles(antAttitudeEuler, EULERANGLES_XYZ); - - // --- --- Algorithm --- --- - // TODO Check result validation - // Compute beam direction vector - beamDir = Coord_Sub(dstPos, myPos); - - // Compute antenna attitude respect to ECEF - antAttitude = Quaternion_Mult(attitude, antAttitude); - - // Convert beam direction vector to antenna coordinate - beamDir = Quaternion_Rotate(Quaternion_GeInverse(antAttitude), beamDir); - // Normalize - Coord_Normalize(&beamDir); - - double oAxis, rAxis; - oAxis = RAD2DEG(atan2(beamDir.z, beamDir.y)); - rAxis = RAD2DEG(acos(Coord_Dot(beamDir, COORD_X_AXIS))); - Status = Phy_SetBeamAngle(instPtr->config.phyInstPtr, oAxis, rAxis); - return Status; -} - /*****************************************************************************/ /** * @brief Layer 2 setup next slot operation, update current operating frame. @@ -1165,8 +1125,9 @@ int32_t L2_SetupNextSlot(L2_INST *instPtr, L2_TOR_TYPE txrxMode, L2_FRAME_TYPE f ASSERT(instPtr != NULL); PHY_INST *phyRef = instPtr->config.phyInstPtr; int32_t Status; - if (frameType < L2_SCAN_FRAME || frameType > L2_SVC_FRAME) + if (frameType < L2_FRAME_ADV || frameType > L2_FRAME_SVC) { + DBG_WARNING("L2_SetupNextSlot(): UNKNOWN L2-FrameType %" PRId8 "\n", frameType); return FAILURE; } @@ -1176,13 +1137,22 @@ int32_t L2_SetupNextSlot(L2_INST *instPtr, L2_TOR_TYPE txrxMode, L2_FRAME_TYPE f instPtr->log.frameTx++; switch (frameType) { - case L2_ADV_FRAME: + case L2_FRAME_ADV: instPtr->log.advTxCnt++; break; - case L2_CFM_FRAME: - instPtr->log.cfmTxCnt++; + case L2_FRAME_ACK: + instPtr->log.ackTxCnt++; break; - case L2_SVC_FRAME: + case L2_FRAME_DIS: + instPtr->log.disTxCnt++; + break; + case L2_FRAME_MNG: + instPtr->log.mngTxCnt++; + break; + case L2_FRAME_RTT: + instPtr->log.rttTxCnt++; + break; + case L2_FRAME_SVC: instPtr->log.svcTxCnt++; break; default: @@ -1194,13 +1164,22 @@ int32_t L2_SetupNextSlot(L2_INST *instPtr, L2_TOR_TYPE txrxMode, L2_FRAME_TYPE f instPtr->log.frameRx++; switch (frameType) { - case L2_ADV_FRAME: + case L2_FRAME_ADV: instPtr->log.advRxCnt++; break; - case L2_CFM_FRAME: - instPtr->log.cfmRxCnt++; + case L2_FRAME_ACK: + instPtr->log.ackRxCnt++; break; - case L2_SVC_FRAME: + case L2_FRAME_DIS: + instPtr->log.disRxCnt++; + break; + case L2_FRAME_MNG: + instPtr->log.mngRxCnt++; + break; + case L2_FRAME_RTT: + instPtr->log.rttRxCnt++; + break; + case L2_FRAME_SVC: instPtr->log.svcRxCnt++; break; default: @@ -1225,16 +1204,22 @@ int32_t L2_SetupNextSlot(L2_INST *instPtr, L2_TOR_TYPE txrxMode, L2_FRAME_TYPE f } switch (frameType) { - case L2_SCAN_FRAME: - frameStr = "Scan"; - break; - case L2_ADV_FRAME: + case L2_FRAME_ADV: frameStr = "Advertisement"; break; - case L2_CFM_FRAME: - frameStr = "Confirm"; + case L2_FRAME_ACK: + frameStr = "Acknowledgement"; break; - case L2_SVC_FRAME: + case L2_FRAME_DIS: + frameStr = "Distribution"; + break; + case L2_FRAME_MNG: + frameStr = "Management"; + break; + case L2_FRAME_RTT: + frameStr = "Round Trip Time"; + break; + case L2_FRAME_SVC: frameStr = "Service"; break; default: @@ -1277,7 +1262,8 @@ int32_t L2_SetupNextSlot(L2_INST *instPtr, L2_TOR_TYPE txrxMode, L2_FRAME_TYPE f return EPARAM; } - Status = Phy_SetupNextSlot(phyRef, tor, L2_L2frame2L1frame(frameType), instPtr->sendPktData); + Status = Phy_SetupNextSlot(phyRef, tor, L2_L2frame2L1frame(frameType, + instPtr->config.serviceRate), instPtr->sendPktData); if (Status != SUCCESS) { DBG_ERROR("Physical setup failed, with error code: %" PRId32 "\n", Status); diff --git a/df_datalink_sp/src/networking/link_layer/link_layer.h b/df_datalink_sp/src/networking/link_layer/link_layer.h index cbe8ad2..5767b1c 100644 --- a/df_datalink_sp/src/networking/link_layer/link_layer.h +++ b/df_datalink_sp/src/networking/link_layer/link_layer.h @@ -38,13 +38,14 @@ */ typedef struct { - L2_NODE_TYPE myType; ///< node type - uint8_t clustId; ///< node cluster id - uint8_t myId; ///< node id - uint8_t headId; ///< head node id - uint8_t netScale; ///< net scale - PHY_INST *phyInstPtr; ///< pointer to system physical layer instance - TMC_INST *tmcInstPtr; ///< pointer to system timer controller layer instance + L2_NODE_TYPE myType; ///< node type + uint8_t clustId; ///< node cluster id + uint8_t myId; ///< node id + uint8_t headId; ///< head node id + uint8_t netScale; ///< net scale + L2_SVC_RATE serviceRate; ///< service data rate + PHY_INST *phyInstPtr; ///< pointer to system physical layer instance + TMC_INST *tmcInstPtr; ///< pointer to system timer controller layer instance } L2_CONFIG; /** @@ -63,10 +64,25 @@ typedef struct uint32_t advRecvCnt; ///< advertise received frame count uint32_t advCorrectCnt; ///< advertise correctly received frame count - uint32_t cfmRxCnt; ///< confirm rx frame count - uint32_t cfmTxCnt; ///< confirm tx frame count - uint32_t cfmRecvCnt; ///< confirm received frame count - uint32_t cfmCorrectCnt; ///< confirm correctly received frame count + uint32_t ackRxCnt; ///< acknowledgement rx frame count + uint32_t ackTxCnt; ///< acknowledgement tx frame count + uint32_t ackRecvCnt; ///< acknowledgement received frame count + uint32_t ackCorrectCnt; ///< acknowledgement correctly received frame count + + uint32_t distRxCnt; ///< distribution rx frame count + uint32_t distTxCnt; ///< distribution tx frame count + uint32_t distRecvCnt; ///< distribution received frame count + uint32_t distCorrectCnt;///< distribution correctly received frame count + + uint32_t mngRxCnt; ///< management rx frame count + uint32_t mngTxCnt; ///< management tx frame count + uint32_t mngRecvCnt; ///< management received frame count + uint32_t mngCorrectCnt; ///< management correctly received frame count + + uint32_t rttRxCnt; ///< rtt rx frame count + uint32_t rttTxCnt; ///< rtt tx frame count + uint32_t rttRecvCnt; ///< rtt received frame count + uint32_t rttCorrectCnt; ///< rtt correctly received frame count uint32_t svcRxCnt; ///< service rx frame count uint32_t svcTxCnt; ///< service tx frame count @@ -74,7 +90,6 @@ typedef struct uint32_t svcCorrectCnt; ///< service correctly received frame count int64_t timeDev; ///< last time deviation estimation result - uint8_t lastBeamWidth; ///< last beam width uint32_t reconnectCnt; ///< reconnect trial count PAYLOAD rxLog; @@ -128,7 +143,6 @@ int32_t Linklayer_Halt(L2_INST *instPtr); int32_t Linklayer_Proc(L2_INST *instPtr); int32_t Linklayer_EventHandler(L2_INST *instPtr, const L2_EVENT *l2Event); int32_t Linklayer_PktHandler(L2_INST *instPtr, L2_FRAME_TYPE frameType); -int32_t L2_SteerBeam2Node(L2_INST *instPtr, uint8_t nodeId); int32_t L2_SetupNextSlot(L2_INST *instPtr, L2_TOR_TYPE txrxMode, L2_FRAME_TYPE frameType); /** @} LinkLayer_Main*/ @@ -198,7 +212,7 @@ L2_NODE_STATE L2_GetMainState(L2_INST *instPtr); bool L2_isStarted(L2_INST *instPtr); bool L2_isDataAvail(L2_INST *instPtr); bool L2_isCxn2Net(L2_INST *instPtr); -uint32_t L2_GetFrameLen(L2_FRAME_TYPE l2FrameType); +uint32_t L2_GetFrameLen(L2_FRAME_TYPE l2FrameType, L2_SVC_RATE l2SvcRate); uint32_t L2_GetLastFrameNum(L2_INST *instPtr); uint32_t L2_GetLastSlotNum(L2_INST *instPtr); L2_FRAME_TYPE L2_GetLastFrameType(L2_INST *instPtr); @@ -211,8 +225,7 @@ uint32_t L2_GetNextFrameNum(L2_INST *instPtr); uint32_t L2_GetNextSlotNum(L2_INST *instPtr); L2_FRAME_TYPE L2_GetNextFrameType(L2_INST *instPtr); L2_TOR_TYPE L2_GetNextTor(L2_INST *instPtr); -L2_FRAME_TYPE L2_GetLastOptFrameType(L2_INST *instPtr); -L1_FRAME_TYPE L2_L2frame2L1frame(L2_FRAME_TYPE l2Frame); +L1_FRAME_TYPE L2_L2frame2L1frame(L2_FRAME_TYPE l2Frame, L2_SVC_RATE l2SvcRate); /** @} LinkLayer_Utility*/ #endif /* __LINK_LAYER_H_ */ diff --git a/df_datalink_sp/src/networking/link_layer/link_layer_types.h b/df_datalink_sp/src/networking/link_layer/link_layer_types.h index 1e9f46e..3aae004 100644 --- a/df_datalink_sp/src/networking/link_layer/link_layer_types.h +++ b/df_datalink_sp/src/networking/link_layer/link_layer_types.h @@ -45,15 +45,8 @@ #define L2_FRAMENO_NONE 0 // Common number of slots definition -#define L2_SLOTS_PER_FRAME 100 -#define L2_SLOTS_PER_SUBFRAME 20 +#define L2_SLOTS_PER_FRAME 500 // 2 ms per slot, 1 s per time unit (frame) -#define L2_NUM_SLOTS_NONE UINT32_MAX -#define L2_NUM_SLOTS_100MS 20 -#define L2_NUM_SLOTS_20MS 4 -#define L2_NUM_SLOTS_10MS 2 -#define L2_NUM_SLOTS_5MS 1 -#define L2_NUM_SLOTS_SKIP 0 /** @} Linklayer_Common_Constants*/ /**************************** Type Definitions *******************************/ @@ -113,7 +106,7 @@ typedef struct uint8_t clustId; ///< node cluster ID uint8_t headId; ///< cluster head ID L2_NODE_TYPE nodeType; ///< node type - uint8_t beamNo; ///< beam number to this node + uint8_t antNo; ///< antenna number to this node COORD pos; ///< node position COORD speed; ///< node speed QUATERNION attitude; ///< node attitude @@ -149,30 +142,60 @@ typedef struct } L2_EVENT; /** - * @enum L2_SLOT_TYPE + * @enum L2_SLOT_INTER_TYPE */ typedef enum { - L2_SLOT_NONE = 0, - L2_SLOT_IDLE = 1, - L2_SLOT_SCAN = 2, - L2_SLOT_ADVERTISE = 3, - L2_SLOT_CONFIRM = 4, - L2_SLOT_SERVICE = 5, -} L2_SLOT_TYPE; + L2_SLOT_NONE = 0, + L2_SLOT_IDLE = 1, + L2_SLOT_ADVERTISE = 2, + L2_SLOT_ACKNOWLEDGE = 3, + L2_SLOT_DISTRIBUTE = 4, + L2_SLOT_MANAGE = 5, + L2_SLOT_RTT = 6, + L2_SLOT_SERVICE = 7 +} L2_SLOT_INTER_TYPE; + +/** + * @enum L2_SLOT_INNER_TYPE + */ +typedef enum +{ + L2_SLOT_NONE = 0, + L2_SLOT_IDLE = 1, + L2_SLOT_ADVERTISE = 2, + L2_SLOT_ACKNOWLEDGE = 3, + L2_SLOT_DISTRIBUTE = 4, + L2_SLOT_MANAGE = 5, + L2_SLOT_RTT = 6, + L2_SLOT_SERVICE = 7 +} L2_SLOT_INNER_TYPE; /** * @enum L2_FRAME_TYPE */ typedef enum { - L2_NONE_FRAME = 0, - L2_SCAN_FRAME = 1, - L2_ADV_FRAME = 2, - L2_CFM_FRAME = 3, - L2_SVC_FRAME = 4 + L2_FRAME_NONE = 0, + L2_FRAME_ADV = 1, + L2_FRAME_ACK = 2, + L2_FRAME_DIS = 3, + L2_FRAME_MNG = 4, + L2_FRAME_RTT = 5, + L2_FRAME_SVC = 6 } L2_FRAME_TYPE; +/** + * @enum L2_SVC_RATE + */ +typedef enum +{ + L2_SVC_NONE = 0, + L2_SVC_128K = 1, // 128 kbps + L2_SVC_512K = 2, // 512 kbps + L2_SVC_2M = 3 // 2 Mbps +} L2_SVC_RATE; + /** * @enum L2_CRC_TYPE */ @@ -201,10 +224,9 @@ typedef struct */ typedef enum { - L2_SCAN_NONE_STAGE = 0, - L2_SCAN_INIT_STAGE = 1, - L2_SCAN_ADV_STAGE = 2, - L2_SCAN_CFM_STAGE = 3 + L2_SCAN_STAGE_NONE = 0, + L2_SCAN_STAGE_ADV = 1, + L2_SCAN_STAGE_ACK = 2 } SCAN_STAGE; /** @@ -213,15 +235,13 @@ typedef enum */ typedef struct { - bool isLocked; ///< indicates if init acq done(beam locked). - bool isAdvRecvd; ///< indicates if advertisement frame done(beam locked). + bool isAdvRecvd; ///< indicates if advertisement frame done(antenna locked). bool isAckPending; ///< indicates if confirm message acked uint8_t scanCnt; ///< scan count uint8_t advTimeout; ///< adv receive try count - uint8_t cfmTimeout; ///< cmf receive try count - SCAN_STAGE scanStage; ///< scan stage \n - /// only for member node - uint8_t beamNo; ///< locked beam number + uint8_t ackTimeout; ///< ack receive try count + SCAN_STAGE scanStage; ///< scan stage, only for member node + uint8_t antIndex; ///< target antenna index uint8_t tableNo; ///< scan table index } L2_SCAN_FSM; diff --git a/df_datalink_sp/src/system_monitor.h b/df_datalink_sp/src/system_monitor.h index f0a10ee..62be2fa 100644 --- a/df_datalink_sp/src/system_monitor.h +++ b/df_datalink_sp/src/system_monitor.h @@ -141,16 +141,22 @@ typedef struct __attribute__((packed)) uint8_t cxnStatus; ///< current connection status uint8_t linkStage; ///< current linklayer working stage uint32_t recxnCnt; ///< reconnect trial count - uint8_t beamNo; ///< current working beam number - uint8_t beamWidth; ///< current working beam width - uint16_t beamAz; ///< current working beam angle Az - uint16_t beamEl; ///< current working beam angle Ez + uint8_t antIndex; ///< current working antenna index uint16_t advTxCnt; ///< adv frame send count uint16_t advRecvCnt; ///< adv frame received count uint16_t advCorrectCnt; ///< adv frame received correctly count - uint32_t cfmTxCnt; ///< cfm frame send count - uint32_t cfmRecvCnt; ///< cfm frame received count - uint32_t cfmCorrectCnt; ///< adv frame received correctly count + uint32_t ackTxCnt; ///< ack frame send count + uint32_t ackRecvCnt; ///< ack frame received count + uint32_t ackCorrectCnt; ///< ack frame received correctly count + uint32_t distTxCnt; ///< dist frame send count + uint32_t distRecvCnt; ///< dist frame received count + uint32_t distCorrectCnt;///< dist frame received correctly count + uint32_t mngTxCnt; ///< mng frame send count + uint32_t mngRecvCnt; ///< mng frame received count + uint32_t mngCorrectCnt; ///< mng frame received correctly count + uint32_t rttTxCnt; ///< rtt frame send count + uint32_t rttRecvCnt; ///< rtt frame received count + uint32_t rttCorrectCnt; ///< rtt frame received correctly count uint32_t svcTxCnt; ///< svc frame send count uint32_t svcRecvCnt; ///< svc frame received count uint32_t svcCorrectCnt; ///< svc frame received correctly count @@ -178,7 +184,7 @@ typedef struct __attribute__((packed)) double fsyncPAPR; ///< last frame sync peak-average ration uint8_t fsyncFreqCh; ///< last frame sync frequency estimation uint16_t deintlvAmpEst; ///< de-interleave amplitude estimation - uint8_t antMode; ///< current antenna working mode + uint8_t rfMode; ///< current rf working mode uint8_t reserve[3]; ///< reserved data } PHYLOG;