From 1df3228db2397c1a9de8b5c53dca79dea0ec16d6 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Tue, 27 May 2025 17:37:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E8=81=86=E5=90=AC?= =?UTF-8?q?=E9=80=BB=E8=BE=91,=20=E5=A2=9E=E5=8A=A0=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=88=A4=E5=AE=9A=E4=B8=8E=E4=B8=8B=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/networking/link_layer/link_layer.c | 12 --- src/networking/link_layer/link_layer_types.h | 4 +- src/networking/link_layer/scan.c | 103 ++++++++----------- src/networking/link_layer/service.c | 4 +- 4 files changed, 47 insertions(+), 76 deletions(-) diff --git a/src/networking/link_layer/link_layer.c b/src/networking/link_layer/link_layer.c index de36915..e6427f4 100644 --- a/src/networking/link_layer/link_layer.c +++ b/src/networking/link_layer/link_layer.c @@ -34,7 +34,6 @@ /************************** Constant Definitions *****************************/ #define NET_START_TIME_INFTY UINT32_MAX #define LINK_BROCK_THRESHOLD L2_SLOTS_PER_FRAME // 0.5 seconds -#define LISTEN_TIMEOUT_INT L2_SLOTS_PER_FRAME // number of 2 ms slots /************************** Variable Definitions *****************************/ /***************** Macros (Inline Functions) Definitions *********************/ @@ -1313,17 +1312,6 @@ int32_t L2_SetupNextSlot(L2_INST *instPtr, L2_TOR_TYPE txrxMode, L2_FRAME_TYPE f L2_RcdShift(&(instPtr->frame), frameType); L2_RcdShift(&(instPtr->tor), txrxMode); - if (L2_isCxn2Net(instPtr) == false) - { - // NOTE: LISTENING mode is assumed. - TIME_WORD listenTime = {LISTEN_TIMEOUT_INT, 0}; - Status = Phy_SetTimeWord(phyRef, &listenTime, PHY_TIME_WORD_LISTEN_TIMEOUT); - if (Status != SUCCESS) - { - DBG_ERROR("Physical set listening timeout failed, with error code: %" PRId32 "\n", Status); - } - } - TIME_WORD pollTime = {0, 0}; pollTime.int_part = TimeCtrl_GetIntCnt(instPtr->config.tmcInstPtr) + 1; Status = Phy_SetTimeWord(phyRef, &pollTime, PHY_TIME_WORD_POLL); diff --git a/src/networking/link_layer/link_layer_types.h b/src/networking/link_layer/link_layer_types.h index 93b33b9..dfe6fd3 100644 --- a/src/networking/link_layer/link_layer_types.h +++ b/src/networking/link_layer/link_layer_types.h @@ -213,8 +213,8 @@ typedef struct */ typedef struct { - bool isAdvRecvd; ///< indicates if advertisement frame done(antenna locked). - uint8_t advCnt; ///< adv receive try count + TIME_WORD timeoutWord; ///< listening timeout word + uint8_t timeoutCnt; ///< listening timeout count } L2_SCAN_FSM; /** diff --git a/src/networking/link_layer/scan.c b/src/networking/link_layer/scan.c index b6e9a66..fd92b16 100644 --- a/src/networking/link_layer/scan.c +++ b/src/networking/link_layer/scan.c @@ -31,7 +31,8 @@ #include "../phy_layer/phy_layer.h" /************************** Constant Definitions *****************************/ -#define ACK_FRAME_SLOTS 4 +#define LISTEN_TIMEOUT_INT 2*L2_SLOTS_PER_FRAME // number of 2 ms slots + /***************** Macros (In-line Functions) Definitions *********************/ /**************************** Type Definitions *******************************/ @@ -39,52 +40,8 @@ /************************** Variable Definitions *****************************/ /************************** Function Prototypes ******************************/ -static void AdvRecvStateUpdate(L2_SCAN_FSM *scanFsmPtr, bool state); -static int32_t Scan_AdvHandler(L2_INST *instPtr); static int32_t ScanMsg_Packing(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t dstId); -/** - * @brief Update Base-info Advertisement state. - */ -static void AdvRecvStateUpdate(L2_SCAN_FSM *scanFsmPtr, bool state) -{ - ASSERT(scanFsmPtr != NULL); - DBG_INFO("Update AdvRecvState from [%" PRId8 "] to [%" PRId8 "].\n", - scanFsmPtr->isAdvRecvd, state); - scanFsmPtr->isAdvRecvd = state; - return; -} - -/*****************************************************************************/ -/** - * @brief Member node scan net BmAdvt stage handler. - * - * @param instPtr Pointer to linklayer layer instance. - * - * @return used slot (2 ms slot). - * - ******************************************************************************/ -static int32_t Scan_AdvHandler(L2_INST *instPtr) -{ - ASSERT(instPtr != NULL); - L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM; - DBG_INFO("** Net-Setup - Advertisement Procedure (Attempts: %" PRIu8 ") **\n", scanFsmPtr->advCnt); - - // Network status is updated in L2_Scan_PktHandler() if valid ADV frame is received. - if (scanFsmPtr->isAdvRecvd == true) - { - DBG_ERROR("Only unconnected node can execute Scan_AdvHandler().\n"); - return EUNEXP; - } - // no valid bm frame was received. - else - { - (void)L2_SetupNextSlot(instPtr, L2_TOR_RX, L2_FRAME_ADV); - scanFsmPtr->advCnt++; - } - return SUCCESS; -} - /*****************************************************************************/ /** * @brief Packing Scan message to a bit array. @@ -292,8 +249,6 @@ int32_t L2_Scan_PktHandler(L2_INST *instPtr, uint8_t *msg) memcpy(instPtr->log.rxLog.data, msg, sizeof(L2_MSG_ADV)); instPtr->log.rxLog.dataId = dataId; - // trigger flag - AdvRecvStateUpdate(scanFsmPtr, true); Status = SUCCESS; break; } @@ -408,8 +363,9 @@ int32_t L2_Scan_Init(L2_SCAN_FSM **scanFSMPtr) void L2_Scan_Reset(L2_SCAN_FSM *scanFSMPtr) { ASSERT(scanFSMPtr != NULL); - scanFSMPtr->isAdvRecvd = false; - scanFSMPtr->advCnt = 0; + scanFSMPtr->timeoutWord.int_part = 0; + scanFSMPtr->timeoutWord.frac_part = 0; + scanFSMPtr->timeoutCnt = 0; } /*****************************************************************************/ @@ -428,26 +384,53 @@ void L2_Scan_Destroy(L2_SCAN_FSM *scanFSMPtr) /*****************************************************************************/ /** - * @brief Execute a member node scan net procedure. + * @brief Member node listening procedure. * - * @param instPtr a pointer to linklayer layer instance + * @param instPtr Pointer to linklayer layer instance. * - * @return used slot (2 ms slot). + * @return used slot (2 ms slot). * ******************************************************************************/ int32_t L2_Scan_Proc(L2_INST *instPtr) { - if (L2_GetNodeType(instPtr) == L2_NODE_HEAD) - { - DBG_ERROR("Only member node needs to execute L2_Scan_Proc. \n"); - return FAILURE; - } + ASSERT(instPtr != NULL); + PHY_INST *phyRef = instPtr->config.phyInstPtr; + L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM; int32_t Status; - DBG_INFO("-------- ScanNet Process --------\n"); + DBG_INFO("** Net-Setup - Listening Procedure (Attempts: %" PRIu8 ") **\n", scanFsmPtr->advCnt); - Status = Scan_AdvHandler(instPtr); + uint32_t currTimeInt = TimeCtrl_GetIntCnt(instPtr->config.tmcInstPtr); - return Status; + if (scanFsmPtr->timeoutWord.int_part < currTimeInt) + { + // listening timeout: current system time + listening duration + TIME_WORD listenTime = {currTimeInt + LISTEN_TIMEOUT_INT, 0}; + Status = Phy_SetTimeWord(phyRef, &listenTime, PHY_TIME_WORD_LISTEN_TIMEOUT); + if (Status != SUCCESS) + { + DBG_ERROR("Physical set listening timeout failed, with error code: %" PRId32 "\n", Status); + } + scanFsmPtr->timeoutWord = listenTime; + + // physical start time: set to next slot + TIME_WORD pollTime = {0, 0}; + pollTime.int_part = currTimeInt + 1; + Status = Phy_SetTimeWord(phyRef, &pollTime, PHY_TIME_WORD_POLL); + if (Status != SUCCESS) + { + DBG_ERROR("Physical set poll time failed, with error code: %" PRId32 "\n", Status); + } + + Status = Phy_SetupNextSlot(phyRef, PHY_TOR_RX, L2_L2frame2L1frame(L2_FRAME_ADV, L2_SVC_NONE), + instPtr->sendPktData); + + // record + scanFsmPtr->timeoutCnt++; + + return Status; + } + + return SUCCESS; } /*****************************************************************************/ diff --git a/src/networking/link_layer/service.c b/src/networking/link_layer/service.c index 0500d75..bcd1032 100644 --- a/src/networking/link_layer/service.c +++ b/src/networking/link_layer/service.c @@ -649,7 +649,7 @@ static int32_t Service_PktHandler2M(L2_INST *instPtr, uint8_t *msg) /** * @brief Initialize service net FSM * - * @param serviceFSM A pointer to service FSM instance. + * @param svcFSMPtr A pointer to service FSM instance. * * @return SUCCESS Initialize successfully. * Other Initialize failed. @@ -671,7 +671,7 @@ int32_t L2_Service_Init(L2_SVC_FSM **svcFSMPtr) /** * @brief Reset ServiceNet FSM * - * @param scanFsmPtr a pointer to service net finite state machine + * @param svcFSMPtr a pointer to service net finite state machine * * @return NONE *