forked from gatsby/df_datalink
feat: 完成链路层大框架修改
This commit is contained in:
@@ -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
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -43,6 +43,7 @@ typedef struct
|
||||
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_ */
|
||||
|
||||
@@ -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_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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user