From 62cc15c3d435ceaccd6164edc97c66264c2caaa5 Mon Sep 17 00:00:00 2001 From: Gatsby Van Date: Sat, 16 Mar 2024 13:20:04 +0800 Subject: [PATCH] add beampattern refreash method --- .../src/networking/link_layer/link_layer.h | 1 + .../src/networking/link_layer/scan.c | 28 +++++--- .../src/networking/link_layer/service.c | 2 +- .../src/networking/phy_layer/phy_antenna.c | 72 +++++++++++-------- .../src/networking/phy_layer/phy_layer.h | 2 +- 5 files changed, 67 insertions(+), 38 deletions(-) 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 59a36fe..fe79d75 100644 --- a/df_datalink_sp/src/networking/link_layer/link_layer.h +++ b/df_datalink_sp/src/networking/link_layer/link_layer.h @@ -131,6 +131,7 @@ bool L2_CrcCheck(uint8_t *dataBuff, uint32_t dataLen, L2_CRC_TYPE crcType); // Scanning int32_t L2_Scan_Init(L2_SCAN_FSM **scanFSMPtr); +void L2_Scan_RefreashScanTable(L2_INST *instPtr); void L2_Scan_Reset(L2_SCAN_FSM *scanFSMPtr); void L2_Scan_Destroy(L2_SCAN_FSM *scanFSMPtr); int32_t L2_Scan_Proc(L2_INST *instPtr); diff --git a/df_datalink_sp/src/networking/link_layer/scan.c b/df_datalink_sp/src/networking/link_layer/scan.c index 88f79d2..38c6417 100644 --- a/df_datalink_sp/src/networking/link_layer/scan.c +++ b/df_datalink_sp/src/networking/link_layer/scan.c @@ -194,9 +194,23 @@ static void StageUpdate(L2_SCAN_FSM *scanFsmPtr, SCAN_STAGE newStage) static int32_t Scan_InitScanHandler(L2_INST *instPtr) { ASSERT(instPtr != NULL); + PHY_INST *phyRef = instPtr->config.phyInstPtr; L2_SCAN_FSM *scanFsmPtr = instPtr->scanFSM; DBG_INFO("** Net-Setup - InitScan Procedure (Attempts: %" PRIu8 ")**\n", scanFsmPtr->scanCnt); + if(scanFsmPtr->scanCnt == 0) + { + // Update scan beam table + L2_Scan_RefreashScanTable(instPtr); + } + else if(Phy_IsFrameDetected(phyRef)) + { + // last scan beam number + instPtr->scanFSM->beamNo = Phy_LastScanBeamNo(instPtr->config.phyInstPtr); + // Update scan beam table + L2_Scan_RefreashScanTable(instPtr); + } + if (scanFsmPtr->isLocked == true) { StageUpdate(scanFsmPtr, L2_SCAN_ADV_STAGE); @@ -231,6 +245,9 @@ static int32_t Scan_AdvHandler(L2_INST *instPtr) // if received a valid bm frame. if (scanFsmPtr->isAdvRecvd == true) { + // last scan beam number + instPtr->scanFSM->beamNo = Phy_LastScanBeamNo(instPtr->config.phyInstPtr); + scanFsmPtr->advTimeout = 0; /* reset listen counter. */ DBG_INFO("Received Adv frame, skipping 10ms for turn around...\n"); // TODO: check functionality. @@ -417,6 +434,8 @@ int32_t L2_Scan_Init(L2_SCAN_FSM **scanFSMPtr) return ENOMEM; } L2_Scan_Reset(*scanFSMPtr); + (*scanFSMPtr)->beamNo = 0; + (*scanFSMPtr)->tableNo = 0; return SUCCESS; } @@ -439,8 +458,6 @@ void L2_Scan_Reset(L2_SCAN_FSM *scanFSMPtr) scanFSMPtr->advTimeout = 0; scanFSMPtr->cfmTimeout = 0; scanFSMPtr->scanStage = L2_SCAN_NONE_STAGE; - scanFSMPtr->beamNo = 0; - scanFSMPtr->tableNo = 0; } /*****************************************************************************/ @@ -537,11 +554,6 @@ int32_t L2_Scan_PktHandler(L2_INST *instPtr, uint8_t *msg) node->nodeInfo.pos.z = (double) nodePos; node->nodeInfo.beamNo = Phy_LastScanBeamNo(instPtr->config.phyInstPtr); - // last scan beam number - instPtr->scanFSM->beamNo = node->nodeInfo.beamNo; - // Update scan beam table - L2_Scan_RefreashScanTable(instPtr); - // Reset node ttl node->ttlCnt = 0; @@ -774,7 +786,7 @@ int32_t L2_Scan_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntry) instPtr->log.lastBeamWidth = PHY_ANT_BEAM_16; if (commNode != NULL) { - Phy_SetBeamNo(instPtr->config.phyInstPtr, commNode->nodeInfo.beamNo); + Phy_SetBeamNo(instPtr->config.phyInstPtr, commNode->nodeInfo.beamNo, PHY_ANT_BEAM_16); } } else diff --git a/df_datalink_sp/src/networking/link_layer/service.c b/df_datalink_sp/src/networking/link_layer/service.c index ff49cd5..94d603c 100644 --- a/df_datalink_sp/src/networking/link_layer/service.c +++ b/df_datalink_sp/src/networking/link_layer/service.c @@ -388,7 +388,7 @@ int32_t L2_Service_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntr if (L2_GetNodeType(instPtr) != L2_NODE_HEAD && commNode != NULL) { Phy_SetBeamWidth(phyRef, PHY_ANT_BEAM_16); - Phy_SetBeamNo(phyRef, commNode->nodeInfo.beamNo); + Phy_SetBeamNo(phyRef, commNode->nodeInfo.beamNo, PHY_ANT_BEAM_16); instPtr->log.lastBeamWidth = PHY_ANT_BEAM_16; } else diff --git a/df_datalink_sp/src/networking/phy_layer/phy_antenna.c b/df_datalink_sp/src/networking/phy_layer/phy_antenna.c index 6bd73f8..058685b 100644 --- a/df_datalink_sp/src/networking/phy_layer/phy_antenna.c +++ b/df_datalink_sp/src/networking/phy_layer/phy_antenna.c @@ -87,10 +87,16 @@ uint16_t hopPattern_10KBPS_10MS[L1_FRAME_10KBPS_10MS_HOPS] = 1500 }; +//uint16_t hopPattern_10KBPS_20MS[L1_FRAME_10KBPS_20MS_HOPS] = +//{ +// 1500, 1600, 1700, 1800, 1900, 1400, 1300, 1200, +// 1100, 1000, 900 +//}; + uint16_t hopPattern_10KBPS_20MS[L1_FRAME_10KBPS_20MS_HOPS] = { - 1500, 1600, 1700, 1800, 1900, 1400, 1300, 1200, - 1100, 1000, 900 + 1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500, + 1500, 1500, 1500 }; uint16_t hopPattern_40KBPS_10MS[L1_FRAME_40KBPS_10MS_HOPS] = @@ -99,11 +105,18 @@ uint16_t hopPattern_40KBPS_10MS[L1_FRAME_40KBPS_10MS_HOPS] = 1500 }; +//uint16_t hopPattern_40KBPS_20MS[L1_FRAME_40KBPS_20MS_HOPS] = +//{ +// 1600, 1650, 1700, 1750, 1800, 1850, 1900, 1550, +// 1500, 1450, 1400, 1350, 1300, 1250, 1200, 1150, +// 1100, 1050, 1000 +//}; + uint16_t hopPattern_40KBPS_20MS[L1_FRAME_40KBPS_20MS_HOPS] = { - 1600, 1650, 1700, 1750, 1800, 1850, 1900, 1550, - 1500, 1450, 1400, 1350, 1300, 1250, 1200, 1150, - 1100, 1050, 1000 + 1700, 1800, 1900, 2000, 1700, 1700, 1700, 1700, + 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, + 1700, 1700, 1700 }; uint16_t hopPattern_200KBPS_5MS[L1_FRAME_200KBPS_5MS_HOPS] = @@ -213,6 +226,29 @@ void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode) instPtr->antConfig.antMode = config; } +/*****************************************************************************/ +/** + * @brief Update antenna beam width setting + * + * @param instPtr pointer to physical layer instance + * @param table new beam table + * @param offset table offset + * + * @return None + * + ******************************************************************************/ +void Phy_SetBeamTable(PHY_INST *instPtr, PHY_ANT_ANGLE *table, uint32_t offset) +{ + ASSERT(instPtr != NULL); + ASSERT(table != NULL); + for (int i = 0; i < L1_NUM_ANT_NRRW_PATTERN; i++) + { + instPtr->antNrrwPattern[i] = table[(i+offset) % L1_NUM_ANT_NRRW_PATTERN]; + } + memcpy((uint32_t*)instPtr->antInfoAddr, instPtr->antNrrwPattern, + L1_NUM_ANT_NRRW_PATTERN*sizeof(PHY_ANT_ANGLE)); +} + /*****************************************************************************/ /** * @brief Update antenna point direction using predefined beam table @@ -224,10 +260,11 @@ void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode) * FAILURE beamNo exceeds the table size * ******************************************************************************/ -int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo) +int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo, PHY_ANT_BEAM_WIDTH beamWidth) { ASSERT(instPtr != NULL); - if (instPtr->beamWd.next == PHY_ANT_BEAM_16) + + if (beamWidth == PHY_ANT_BEAM_16) { if (beamNo >= L1_NUM_ANT_NRRW_PATTERN) { @@ -257,27 +294,6 @@ int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo) } } -/*****************************************************************************/ -/** - * @brief Update antenna beam width setting - * - * @param instPtr pointer to physical layer instance - * @param table new beam table - * @param offset table offset - * - * @return None - * - ******************************************************************************/ -void Phy_SetBeamTable(PHY_INST *instPtr, PHY_ANT_ANGLE *table, uint32_t offset) -{ - ASSERT(instPtr != NULL); - ASSERT(table != NULL); - for (int i = 0; i < L1_NUM_ANT_NRRW_PATTERN; i++) - { - instPtr->antNrrwPattern[i] = table[(i+offset) % L1_NUM_ANT_NRRW_PATTERN]; - } -} - /*****************************************************************************/ /** * @brief Update antenna beam width setting diff --git a/df_datalink_sp/src/networking/phy_layer/phy_layer.h b/df_datalink_sp/src/networking/phy_layer/phy_layer.h index 6b6ccc8..f1cb5d7 100644 --- a/df_datalink_sp/src/networking/phy_layer/phy_layer.h +++ b/df_datalink_sp/src/networking/phy_layer/phy_layer.h @@ -272,7 +272,7 @@ void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig); void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode); void Phy_SetBeamTable(PHY_INST *instPtr, PHY_ANT_ANGLE *table, uint32_t offset); int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth); -int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo); +int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo, PHY_ANT_BEAM_WIDTH beamWidth); int32_t Phy_SetBeamAngle(PHY_INST *phyInstPtr, double offAx, double rndAx); int32_t Phy_SetTimeWord(PHY_INST *instPtr, const TIME_WORD *tmWord, PHY_TIME_WORD_TYPE tmType);