4 Commits
Author SHA1 Message Date
Gatsby Van 712d37061a add antenna power mode print 2024-03-07 11:42:22 +08:00
Gatsby Van dfecadac56 omit redundant code 2024-03-07 11:41:52 +08:00
Gatsby Van c09bd57408 enhance code inherence 2024-03-07 11:40:53 +08:00
Gatsby Van ec772ba9e3 add new log entry (phy: antenna power mode) 2024-03-07 11:40:53 +08:00
6 changed files with 183 additions and 97 deletions
+91 -43
View File
@@ -34,48 +34,67 @@ class Plugin(Plugin_Base):
"version": 1, "version": 1,
"customSendItems": [ "customSendItems": [
{ {
"caption": "Self Test", "caption": "自检",
"icon": "fa5.question-circle", "icon": "fa5.question-circle",
"data": "5A 54 E1 DD 00 BE 02 5A FE" "data": "5A 54 E1 DD 00 BE 02 5A FE"
}, },
# {
# "caption": "数据发送测试 - 1",
# "icon": "fa5.play-circle",
# "data": ""
# },
# {
# "caption": "数据发送测试 - 2",
# "icon": "fa5.play-circle",
# "data": ""
# },
{ {
"caption": "Config - FLJ Low Power", "caption": "装订 - 【主】反拦截小功率",
"icon": "fa5.play-circle",
"data": "5A 54 E3 DD 77 11 00 00 00 48 06 5A FE"
},{
"caption": "Config - FLJ Full Power",
"icon": "fa5.play-circle",
"data": "5A 54 E3 DD 66 11 00 00 00 37 06 5A FE"
}, {
"caption": "Config - FLJ Silent",
"icon": "fa5.play-circle", "icon": "fa5.play-circle",
"data": "5A 54 E3 DD 88 11 00 00 00 59 06 5A FE" "data": "5A 54 E3 DD 88 11 00 00 00 59 06 5A FE"
},{ },
"caption": "Config - LJ Low Power", {
"caption": "装订 - 【主】反拦截全功率",
"icon": "fa5.play-circle", "icon": "fa5.play-circle",
"data": "5A 54 E3 DD 77 00 00 00 00 37 06 5A FE" "data": "5A 54 E3 DD 66 11 00 00 00 37 06 5A FE"
},{ },
"caption": "Config - LJ Full Power", {
"caption": "装订 - 【主】反拦截静默",
"icon": "fa5.play-circle", "icon": "fa5.play-circle",
"data": "5A 54 E3 DD 66 00 00 00 00 26 06 5A FE" "data": "5A 54 E3 DD 00 11 00 00 00 D1 06 5A FE"
},{ },
"caption": "Config - LJ Silent", {
"icon": "fa5.play-circle", "caption": "遥测 - 【主】反拦截",
"data": "5A 54 E3 DD 88 00 00 00 00 48 06 5A FE"
},{
"caption": "StatusCheck - FLJ",
"icon": "fa5.play-circle", "icon": "fa5.play-circle",
"data": "5A 54 E6 DD 99 00 5C 03 5A FE" "data": "5A 54 E6 DD 99 00 5C 03 5A FE"
},{ },
"caption": "StatusCheck - LJ", {
"icon": "fa5.play-circle", "caption": "点名 - 【主】反拦截",
"data": "5A 54 F6 DD 99 00 6C 03 5A FE"
},{
"caption": "DataRetrieve - FLJ",
"icon": "fa5.play-circle", "icon": "fa5.play-circle",
"data": "5A 54 E5 DD 77 00 39 03 5A FE" "data": "5A 54 E5 DD 77 00 39 03 5A FE"
},{ },
"caption": "DataRetrieve - LJ", {
"caption": "装订 - 【从】拦截小功率",
"icon": "fa5.play-circle",
"data": "5A 54 E3 DD 88 00 00 00 00 48 06 5A FE"
},
{
"caption": "装订 - 【从】拦截大功率",
"icon": "fa5.play-circle",
"data": "5A 54 E3 DD 66 00 00 00 00 26 06 5A FE"
},
{
"caption": "装订 - 【从】拦截静默",
"icon": "fa5.play-circle",
"data": "5A 54 E3 DD 00 00 00 00 00 C0 06 5A FE"
},
{
"caption": "遥测 - 【从】拦截",
"icon": "fa5.play-circle",
"data": "5A 54 F6 DD 99 00 6C 03 5A FE"
},
{
"caption": "点名 - 【从】拦截",
"icon": "fa5.play-circle", "icon": "fa5.play-circle",
"data": "5A 54 F5 DD 77 00 49 03 5A FE" "data": "5A 54 F5 DD 77 00 49 03 5A FE"
} }
@@ -163,7 +182,10 @@ class Plugin(Plugin_Base):
self.showReceiveDataSignal.connect(self.showReceivedData) self.showReceiveDataSignal.connect(self.showReceivedData)
# frame struct # frame struct
self.structSelfTestRsp = Struct("<BB B BBBbbb BbBBB H") self.structSelfTestRsp = Struct("<BB B BBBbbb BbBBB H")
self.structStatusCheckRsp = Struct("<BB Q HIII IBBBBI BBHH HHHIIIIII i II I IIII d Q dBB dB H I BBBbbb BbBBB H") self.structStatusCheckRsp = Struct("<BB Q HIII IBBBBI BBHH HHHIIIIII i II 4s IIII d Q dBB dB H B 3s BBBbbb BbBBB 2s")
self.structFljData = Struct("<dddd IHI fff fff")
self.structLjData = Struct("<IHI ffff IHI fff fff fff IHI fff fff fff IHI fff fff fff I")
self.structSysInfo = Struct("<IHI H B I B fff fff fff")
def insertSendItem(self, item = None, load = False): def insertSendItem(self, item = None, load = False):
caption = item["caption"] caption = item["caption"]
@@ -237,11 +259,22 @@ class Plugin(Plugin_Base):
return f"\n### evalSelfTestRsp:: Failed to unpack data (data length {len(data)} byte).\n" return f"\n### evalSelfTestRsp:: Failed to unpack data (data length {len(data)} byte).\n"
ret = "----------- 自检回令 -----------\n" ret = "----------- 自检回令 -----------\n"
ret += "节点类型: " ret += "节点类型: "
ret += "K频段(0xDD)\n" if payload[1] == 0xDD else "S频段(0xDD)\n" if payload[1] == 0xDD:
ret += f"K频段 (0x{payload[1]:02X})\n"
elif payload[1] == 0xEE:
ret += f"S频段 (0x{payload[1]:02X})\n"
else:
ret += f"【未知错误】(0x{payload[1]:02X})\n"
ret += "自检结果: " ret += "自检结果: "
ret += "正常(0xAA)\n" if payload[2] == 0xAA else "异常(0x55 or other)\n" if payload[2] == 0xAA:
ret += f"正常 (0x{payload[2]:02X})\n"
elif payload[2] == 0x55:
ret += f"异常 (0x{payload[2]:02X})\n"
else:
ret += f"【未知错误】(0x{payload[2]:02X})\n"
hwOffset = 3 hwOffset = 3
@@ -275,15 +308,21 @@ class Plugin(Plugin_Base):
return f"\n### evalStatusCheckRsp:: Failed to unpack data (data length {len(data)} byte).\n" return f"\n### evalStatusCheckRsp:: Failed to unpack data (data length {len(data)} byte).\n"
ret = "----------- 遥测回令 -----------\n" ret = "----------- 遥测回令 -----------\n"
ret += "节点类型: "
ret += "K频段(0xDD)\n" if payload[1] == 0xDD else "S频段(0xDD)\n"
ret += f"时间戳: {payload[2]/1e2:.2f} us\n" ret += "节点类型: "
if payload[1] == 0xDD:
ret += f"K频段 (0x{payload[1]:02X})\n"
elif payload[1] == 0xEE:
ret += f"S频段 (0x{payload[1]:02X})\n"
else:
ret += f"【未知错误】(0x{payload[1]:02X})\n"
ret += f"时间戳: {payload[2]/1e5:.2f} ms\n"
sysbusOffset = 3 sysbusOffset = 3
linkOffset = 7 linkOffset = 7
phyOffset = 30 phyOffset = 30
hwOffset = 43 hwOffset = 44
ret += "\n -- 总线状态\n" ret += "\n -- 总线状态\n"
ret += f"配置装订: {payload[sysbusOffset + 0]:04X}\n" ret += f"配置装订: {payload[sysbusOffset + 0]:04X}\n"
@@ -323,14 +362,14 @@ class Plugin(Plugin_Base):
ret += f"通信波位号: {payload[linkOffset + 6]:>2d}\n" ret += f"通信波位号: {payload[linkOffset + 6]:>2d}\n"
ret += "通信波束宽度: " ret += "通信波束宽度: "
if payload[linkOffset + 7] == 0x04: if payload[linkOffset + 7] == 0x01:
ret += f"8° 窄波束 (0x{payload[linkOffset + 7]:02X})\n" ret += f"120° 宽波束 (0x{payload[linkOffset + 7]:02X})\n"
elif payload[linkOffset + 7] == 0x03:
ret += f"25° 次波束 (0x{payload[linkOffset + 7]:02X})\n"
elif payload[linkOffset + 7] == 0x02: elif payload[linkOffset + 7] == 0x02:
ret += f"60° 次波束 (0x{payload[linkOffset + 7]:02X})\n" ret += f"60° 次波束 (0x{payload[linkOffset + 7]:02X})\n"
elif payload[linkOffset + 7] == 0x01: elif payload[linkOffset + 7] == 0x03:
ret += f"120° 宽波束 (0x{payload[linkOffset + 7]:02X})\n" ret += f"25° 次波束 (0x{payload[linkOffset + 7]:02X})\n"
elif payload[linkOffset + 7] == 0x04:
ret += f"8° 窄波束 (0x{payload[linkOffset + 7]:02X})\n"
else: else:
ret += f"【未知错误】(0x{payload[linkOffset + 7]:02X})\n" ret += f"【未知错误】(0x{payload[linkOffset + 7]:02X})\n"
@@ -362,6 +401,15 @@ class Plugin(Plugin_Base):
ret += f"帧同步峰均比: {payload[phyOffset + 9]:.2f}\n" ret += f"帧同步峰均比: {payload[phyOffset + 9]:.2f}\n"
ret += f"帧同步频偏通道: {payload[phyOffset + 10]:>3d}\n" ret += f"帧同步频偏通道: {payload[phyOffset + 10]:>3d}\n"
ret += f"交织输入数据幅度统计:\t0x{payload[phyOffset + 11]:04X}\n" ret += f"交织输入数据幅度统计:\t0x{payload[phyOffset + 11]:04X}\n"
ret += "天线工作模式: "
if payload[phyOffset + 12] == 0x01:
ret += f"静默模式 (0x{payload[phyOffset + 12]:02X})\n"
elif payload[phyOffset + 12] == 0x02:
ret += f"低功率模式 (0x{payload[phyOffset + 12]:02X})\n"
elif payload[phyOffset + 12] == 0x03:
ret += f"全功率模式 (0x{payload[phyOffset + 12]:02X})\n"
else:
ret += f"【未知错误】(0x{payload[phyOffset + 12]:02X})\n"
ret += "\n -- 硬件状态\n" ret += "\n -- 硬件状态\n"
ret += f"FPGA 电压监测: {bin(payload[hwOffset+0])[2:].zfill(8)}\n" ret += f"FPGA 电压监测: {bin(payload[hwOffset+0])[2:].zfill(8)}\n"
@@ -660,10 +660,10 @@ int32_t Linklayer_Init(L2_INST **instPtr, const L2_CONFIG *config)
DBG_ERROR("Allocate memory for L2_InstPtr failed.\n"); DBG_ERROR("Allocate memory for L2_InstPtr failed.\n");
return ENOMEM; return ENOMEM;
} }
// Clear random content
memset(*instPtr, 0x00, sizeof(L2_INST)); memset(*instPtr, 0x00, sizeof(L2_INST));
memcpy(&((*instPtr)->config), config, sizeof(L2_CONFIG)); memcpy(&((*instPtr)->config), config, sizeof(L2_CONFIG));
// Clear log
memset(&((*instPtr)->log), 0x00, sizeof((*instPtr)->log));
// Packet buffer // Packet buffer
(*instPtr)->sendPktData = calloc(L2_PACK_LEN_MAX / sizeof(uint64_t), sizeof(uint64_t)); (*instPtr)->sendPktData = calloc(L2_PACK_LEN_MAX / sizeof(uint64_t), sizeof(uint64_t));
@@ -29,16 +29,19 @@
#define CTRL_WORD_DEFAULT 0x00 #define CTRL_WORD_DEFAULT 0x00
#define ANT_MODE_BEAM_MASK 0xF0 #define ANT_MODE_BEAM_MASK 0xF0
#define ANT_MODE_NARROR_BEAM 0x00 // 8 #define ANT_BEAM_NARROR 0x00 // 8
#define ANT_MODE_WIDE_BEAM_1 0x10 // 25 #define ANT_BEAM_SUBNARROR_0 0x10 // 25
#define ANT_MODE_WIDE_BEAM_2 0x20 // 60 #define ANT_BEAM_SUBNARROR_1 0x20 // 60
#define ANT_MODE_WIDE_BEAM_3 0x30 // 120 #define ANT_BEAM_WIDE 0x30 // 120
#define ANT_MODE_HIGH_POWER 0x00 #define ANT_MODE_POWER_MASK 0x0F
#define ANT_MODE_LOW_POWER 0x04 #define ANT_POWER_FULL 0x00
#define ANT_MODE_STANDBY 0x0F #define ANT_POWER_LOW 0x04
#define ATN_MODE_DEFAULT (ANT_MODE_WIDE_BEAM_1 | ANT_MODE_LOW_POWER) #define ANT_POWER_STANDBY 0x0F
#define ATN_MODE_HIGH (ANT_MODE_WIDE_BEAM_1 | ANT_MODE_HIGH_POWER) #define ATN_MODE_SILENT (ANT_BEAM_SUBNARROR_0 | ANT_POWER_STANDBY)
#define ATN_MODE_LOWPOWER (ANT_BEAM_SUBNARROR_0 | ANT_POWER_LOW)
#define ATN_MODE_FULLPOWER (ANT_BEAM_SUBNARROR_0 | ANT_POWER_FULL)
#define ATN_MODE_DEFAULT ATN_MODE_SILENT
#define DEFAULT_CENTRTAL_FREQ 0x06D7 // 26.25GHz #define DEFAULT_CENTRTAL_FREQ 0x06D7 // 26.25GHz
@@ -186,13 +189,14 @@ PHY_ANT_ANGLE antNrrwPattern[L1_NUM_ANT_NRRW_PATTERN] =
0 0
}; };
#endif #endif
/*****************************************************************************/ /*****************************************************************************/
/** /**
* @brief * @brief Initialize antenna configurations (load preset values)
* *
* @param antConfig * @param antConfig pointer to antenna configure
* *
* @return * @return None.
* *
******************************************************************************/ ******************************************************************************/
void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig) void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig)
@@ -246,28 +250,50 @@ void Phy_AntConfigInit(PHY_ANT_CONFIG *antConfig)
// *********************** // ***********************
} }
/*****************************************************************************/
/**
* @brief Update antenna power mode setting
*
* @param instPtr pointer to physical layer instance
* @param mode new antenna mode
*
* @return None.
*
******************************************************************************/
void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode) void Phy_AntConfigMode(PHY_INST *instPtr, PHY_ANT_MODE mode)
{ {
ASSERT(instPtr != NULL); ASSERT(instPtr != NULL);
uint8_t config = instPtr->antConfig.antMode & ANT_MODE_BEAM_MASK; uint8_t config = instPtr->antConfig.antMode & ANT_MODE_BEAM_MASK;
switch (mode) switch (mode)
{ {
case PHY_ANT_MODE_SILENT: case PHY_ANT_MODE_STANDBY:
config |= ANT_MODE_STANDBY; config |= ANT_POWER_STANDBY;
break; break;
case PHY_ANT_MODE_LOW_POWER: case PHY_ANT_MODE_POWER_LOW:
config |= ANT_MODE_LOW_POWER; config |= ANT_POWER_LOW;
break; break;
case PHY_ANT_MODE_HIGH_POWER: case PHY_ANT_MODE_POWER_FULL:
config |= ANT_MODE_HIGH_POWER; config |= ANT_POWER_FULL;
break; break;
default: default:
DBG_ERROR("Unknown antenna mode: %" PRIu8 ", remain previous mode.\n", mode); DBG_ERROR("Unknown antenna mode: %" PRIu8 ", remain previous mode.\n", mode);
return; return;
} }
instPtr->phyLog.antMode = mode;
instPtr->antConfig.antMode = config; instPtr->antConfig.antMode = config;
} }
/*****************************************************************************/
/**
* @brief Update antenna point direction using predefined beam table
*
* @param instPtr pointer to physical layer instance
* @param beamNo new beam index
*
* @return SUCCESS.
* 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)
{ {
ASSERT(instPtr != NULL); ASSERT(instPtr != NULL);
@@ -317,6 +343,17 @@ int32_t Phy_SetBeamNo(PHY_INST *instPtr, int32_t beamNo)
} }
} }
/*****************************************************************************/
/**
* @brief Update antenna beam width setting
*
* @param instPtr pointer to physical layer instance
* @param beamWidth new beam width
*
* @return SUCCESS.
* EPARAM - the direction is exceeds predefined range
*
******************************************************************************/
int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth) int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth)
{ {
ASSERT(instPtr != NULL); ASSERT(instPtr != NULL);
@@ -324,16 +361,16 @@ int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth)
switch (beamWidth) switch (beamWidth)
{ {
case PHY_ANT_BEAM_120: case PHY_ANT_BEAM_120:
beamConfig |= ANT_MODE_WIDE_BEAM_3; beamConfig |= ANT_BEAM_WIDE;
break; break;
case PHY_ANT_BEAM_60: case PHY_ANT_BEAM_60:
beamConfig |= ANT_MODE_WIDE_BEAM_2; beamConfig |= ANT_BEAM_SUBNARROR_1;
break; break;
case PHY_ANT_BEAM_25: case PHY_ANT_BEAM_25:
beamConfig |= ANT_MODE_WIDE_BEAM_1; beamConfig |= ANT_BEAM_SUBNARROR_0;
break; break;
case PHY_ANT_BEAM_8: case PHY_ANT_BEAM_8:
beamConfig |= ANT_MODE_NARROR_BEAM; beamConfig |= ANT_BEAM_NARROR;
break; break;
default: default:
DBG_ERROR("Beam width code: 0x%08X is illegal.\n\r", beamWidth); DBG_ERROR("Beam width code: 0x%08X is illegal.\n\r", beamWidth);
@@ -344,7 +381,18 @@ int32_t Phy_SetBeamWidth(PHY_INST *instPtr, PHY_ANT_BEAM_WIDTH beamWidth)
return SUCCESS; return SUCCESS;
} }
// Common version radius double input /*****************************************************************************/
/**
* @brief Set antenna to a specific direction
*
* @param instPtr pointer to physical layer instance
* @param offAx elevation angle
* @param rndAx azimuth angle
*
* @return SUCCESS.
* EPARAM - the direction is exceeds predefined range
*
******************************************************************************/
int32_t Phy_SetBeamAngle(PHY_INST *instPtr, double offAx, double rndAx) int32_t Phy_SetBeamAngle(PHY_INST *instPtr, double offAx, double rndAx)
{ {
ASSERT(instPtr != NULL); ASSERT(instPtr != NULL);
@@ -170,9 +170,9 @@ typedef enum
typedef enum typedef enum
{ {
PHY_ANT_MODE_NONE = 0, PHY_ANT_MODE_NONE = 0,
PHY_ANT_MODE_SILENT = 1, PHY_ANT_MODE_STANDBY = 1,
PHY_ANT_MODE_LOW_POWER = 2, PHY_ANT_MODE_POWER_LOW = 2,
PHY_ANT_MODE_HIGH_POWER = 3, PHY_ANT_MODE_POWER_FULL = 3,
} PHY_ANT_MODE; } PHY_ANT_MODE;
typedef struct typedef struct
+2 -1
View File
@@ -152,7 +152,8 @@ typedef struct __attribute__((packed))
double fsyncPAPR; double fsyncPAPR;
uint8_t fsyncFreqCh; uint8_t fsyncFreqCh;
uint16_t deintlvAmpEst; uint16_t deintlvAmpEst;
uint8_t reserve[4]; uint8_t antMode;
uint8_t reserve[3];
} PHYLOG; } PHYLOG;
typedef struct __attribute__((packed)) typedef struct __attribute__((packed))
+5 -16
View File
@@ -420,7 +420,7 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
} }
else else
{ {
// Do not response // Ignore current command
DBG_ERROR("Unexpected config command 0x%02X:0x%02X", DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
WD_MODE_CMD, data[WD_MODE_CMD]); WD_MODE_CMD, data[WD_MODE_CMD]);
Status = EPARAM; Status = EPARAM;
@@ -430,19 +430,19 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
if(data[WD_EN_CMD] == EN_CMD_ON_HIGH_POWER) if(data[WD_EN_CMD] == EN_CMD_ON_HIGH_POWER)
{ {
// high power config // high power config
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_HIGH_POWER); Phy_AntConfigMode(phyRef, PHY_ANT_MODE_POWER_FULL);
} }
else if(data[WD_EN_CMD] == EN_CMD_ON_LOW_POWER) else if(data[WD_EN_CMD] == EN_CMD_ON_LOW_POWER)
{ {
// low power config // low power config
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_LOW_POWER); Phy_AntConfigMode(phyRef, PHY_ANT_MODE_POWER_LOW);
} }
else if(data[WD_EN_CMD] == EN_CMD_SILENT) else if(data[WD_EN_CMD] == EN_CMD_SILENT)
{ {
// silence config // silence config
// TODO: better approach? // TODO: better approach?
Linklayer_Halt(linkInstPtr); Linklayer_Halt(linkInstPtr);
Phy_AntConfigMode(phyRef, PHY_ANT_MODE_SILENT); Phy_AntConfigMode(phyRef, PHY_ANT_MODE_STANDBY);
TIME_WORD pullTime = {0, 0}; TIME_WORD pullTime = {0, 0};
pullTime.int_part = TimeCtrl_GetIntCnt(tmcRef) + 1; pullTime.int_part = TimeCtrl_GetIntCnt(tmcRef) + 1;
Status = Phy_SetTimeWord(phyRef, &pullTime, PHY_TIME_WORD_POLL); Status = Phy_SetTimeWord(phyRef, &pullTime, PHY_TIME_WORD_POLL);
@@ -453,19 +453,8 @@ int32_t SystemBus_HandleCmd(SYSBUS *instPtr)
Phy_SetupNextSlot(phyRef, PHY_TOR_RX, L1_10KBPS_10MS_FRAME, NULL); Phy_SetupNextSlot(phyRef, PHY_TOR_RX, L1_10KBPS_10MS_FRAME, NULL);
break; break;
} }
else
{
// Do not response
DBG_ERROR("Unexpected config command 0x%02X:0x%02X",
WD_EN_CMD, data[WD_EN_CMD]);
Status = EPARAM;
break;
}
if (reconfig == true)
{
Linklayer_Reconfig(linkInstPtr, &linkConfig);
Linklayer_Start(linkInstPtr); Linklayer_Start(linkInstPtr);
}
instPtr->sysbusLog.lastConfig[0] = data[WD_MODE_CMD]; instPtr->sysbusLog.lastConfig[0] = data[WD_MODE_CMD];
instPtr->sysbusLog.lastConfig[1] = data[WD_EN_CMD]; instPtr->sysbusLog.lastConfig[1] = data[WD_EN_CMD];
Status = SUCCESS; Status = SUCCESS;