forked from 0xha0/df_datalink
Compare commits
12
Commits
c468bd9ca1
...
hsjl-v0.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
044345f597 | ||
|
|
6b9a2c8cc4 | ||
|
|
d3d45fbfb0 | ||
|
|
f9591a8c95 | ||
|
|
c0b239e028 | ||
|
|
5679de641c | ||
|
|
58a909673a | ||
|
|
5a91eaad72 | ||
|
|
74219c3cbe | ||
|
|
d138381578 | ||
|
|
8a273739c3 | ||
|
|
4932c9c6c7 |
@@ -6,10 +6,10 @@ TARGET_PROJ ?= node
|
||||
ifeq ($(TARGET_PROJ), node)
|
||||
BUILD_DIR := $(PROJECT)/build/node
|
||||
CONFIG_FILE := $(PROJECT)/config/node.json
|
||||
else ifeq ($(TARGET_PROJ), ge)
|
||||
else ifeq ($(TARGET_PROJ), ground)
|
||||
XILINX_VITIS_CLASSIC := y
|
||||
BUILD_DIR := $(PROJECT)/build/ge
|
||||
CONFIG_FILE := $(PROJECT)/config/ge.json
|
||||
BUILD_DIR := $(PROJECT)/build/ground
|
||||
CONFIG_FILE := $(PROJECT)/config/ground.json
|
||||
else
|
||||
$(error Unsupported target PROJECT: $(TARGET_PROJ))
|
||||
endif
|
||||
|
||||
+7
-6
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"project_name": "hsjl_ground",
|
||||
"version": "0.0.0",
|
||||
"hw_design": "hw/hsjl_ground_v0.0.1.xsa",
|
||||
"version": "0.1.0",
|
||||
"hw_design": "hw/hsjl_ground_v0.1.0.xsa",
|
||||
"apps": {
|
||||
"datalink": {
|
||||
"sources": ["src/*"],
|
||||
@@ -13,13 +13,14 @@
|
||||
"stack_size": "0x20000"
|
||||
},
|
||||
"build_config": {
|
||||
"debug": {
|
||||
"include-path": ["src/include"],
|
||||
"libraries": ["m"]
|
||||
},
|
||||
|
||||
"release": {
|
||||
"include-path": ["src/include"],
|
||||
"libraries": ["m"]
|
||||
},
|
||||
"debug": {
|
||||
"include-path": ["src/include"],
|
||||
"libraries": ["m"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-6
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"project_name": "hsjl_node",
|
||||
"version": "0.0.0",
|
||||
"hw_design": "hw/hsjl_node_v0.0.1.hdf",
|
||||
"version": "0.1.0",
|
||||
"hw_design": "hw/hsjl_node_v0.1.0.hdf",
|
||||
"apps": {
|
||||
"datalink": {
|
||||
"sources": ["src/*"],
|
||||
@@ -13,13 +13,13 @@
|
||||
"stack_size": "0x20000"
|
||||
},
|
||||
"build_config": {
|
||||
"debug": {
|
||||
"include-path": ["src/include"],
|
||||
"libraries": ["m"]
|
||||
},
|
||||
"release": {
|
||||
"include-path": ["src/include"],
|
||||
"libraries": ["m"]
|
||||
},
|
||||
"debug": {
|
||||
"include-path": ["src/include"],
|
||||
"libraries": ["m"]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+15
-12
@@ -1,7 +1,7 @@
|
||||
# HSJL 上位机串口通信协议
|
||||
|
||||
> 版本:v1.2
|
||||
> 日期:2025 年 6 月 12 日
|
||||
> 日期:2025 年 6 月 16 日
|
||||
|
||||
---
|
||||
|
||||
@@ -46,19 +46,19 @@ block-beta
|
||||
|
||||
| 字段名 | 字节数 (Byte) | 说明 |
|
||||
|--|--|--|
|
||||
| 帧头 | 2 | 固定值:`0x54 0x5A` |
|
||||
| 帧头 | 2 | 固定值:`0x5A 0x54` |
|
||||
| 数据段 | ≤950 | 业务数据内容 |
|
||||
| Dummy Byte | 1 | 固定填充:`0x00` |
|
||||
| 校验和 | 1 | 所有**数据段**字节累加和(无符号累加) |
|
||||
| 数据段长度 | 2 | 数据段字节数(不含 Dummy/校验/帧尾) |
|
||||
| 帧尾 | 2 | 固定值:`0xFE 0x5A` |
|
||||
| 帧尾 | 2 | 固定值:`0x5A 0xFE` |
|
||||
|
||||
### 帧内冲突规避规则
|
||||
|
||||
为防止数据段中出现帧尾 `0xFE 0x5A`:
|
||||
为防止数据段中出现帧尾 `0x5A 0xFE`:
|
||||
|
||||
- 若数据段中出现 `0xFE 0x5A`,需插入 `0x00` 变成 `0x00 0xFE 0x5A`
|
||||
- 接收端收到 `0x00 0xFE 0x5A` 还原为 `0xFE 0x5A`
|
||||
- 若数据段中出现 `0x5A 0xFE`,需插入 `0x00` 变成 `0x00 0x5A 0xFE`
|
||||
- 接收端收到 `0x00 0x5A 0xFE` 还原为 `0x5A 0xFE`
|
||||
|
||||
### 帧长说明
|
||||
|
||||
@@ -192,13 +192,13 @@ block-beta
|
||||
|
||||
### (可选)遥测指令
|
||||
|
||||
遥测指令上传的 Payload 由 5 部分组成,顺序存储,共 188 字节:
|
||||
遥测指令上传的 Payload 由 5 部分组成,顺序存储,共 200 字节:
|
||||
|
||||
| 字段名 | 字节数 (Byte) |
|
||||
| ------------ | ------------- |
|
||||
| 时间戳 | 8 |
|
||||
| 总线日志 | 16 |
|
||||
| 链路层日志 | 88 |
|
||||
| 链路层日志 | 100 |
|
||||
| 物理层日志 | 56 |
|
||||
| 硬件状态日志 | 20 |
|
||||
|
||||
@@ -219,7 +219,7 @@ block-beta
|
||||
|
||||
#### 链路层日志
|
||||
|
||||
链路层日志顺序存储,共 88字节:
|
||||
链路层日志顺序存储,共 100 字节:
|
||||
|
||||
| 字段名 | 字节数 (Byte) | 说明 |
|
||||
| -------------------- | ------------- | ---------------------------------------- |
|
||||
@@ -239,12 +239,15 @@ block-beta
|
||||
| 分发帧发送计数器 | 4 | 每发送一次分发帧,计数器+1(仅簇首) |
|
||||
| 分发帧接收计数器 | 4 | 每配置接收一次分发帧,计数器+1(仅成员) |
|
||||
| 分发帧接收正确计数器 | 4 | 每正确接收一次分发帧,计数器+1(仅成员) |
|
||||
| 网关帧发送计数器 | 4 | 每发送一次网关帧,计数器+1 |
|
||||
| 网关帧接收计数器 | 4 | 每配置接收一次网关帧,计数器+1 |
|
||||
| 网关帧接收正确计数器 | 4 | 每正确接收一次网关帧,计数器+1 |
|
||||
| 网管帧发送计数器 | 4 | 每发送一次网管帧,计数器+1 |
|
||||
| 网管帧接收计数器 | 4 | 每配置接收一次网管帧,计数器+1 |
|
||||
| 网管帧接收正确计数器 | 4 | 每正确接收一次网管帧,计数器+1 |
|
||||
| RTT帧发送计数器 | 4 | 每发送一次 RTT 帧,计数器+1 |
|
||||
| RTT帧接收计数器 | 4 | 每配置接收一次 RTT 帧,计数器+1 |
|
||||
| RTT帧接收正确计数器 | 4 | 每正确接收一次 RTT 帧,计数器+1 |
|
||||
| 业务帧发送计数器 | 4 | 每发送一次业务帧,计数器+1 |
|
||||
| 业务帧接收计数器 | 4 | 每配置接收一次业务帧,计数器+1 |
|
||||
| 业务帧接收正确计数器 | 4 | 每正确接收一次业务帧,计数器+1 |
|
||||
| 时间偏移量记录 | 4, int32 | 记录上一次节点时间和帧同步时间的偏差 |
|
||||
| 发送数据ID记录 | 4 | 记录上一次发送数据的ID |
|
||||
| 接收数据ID记录 | 4 | 记录上一次接收数据的ID |
|
||||
|
||||
@@ -0,0 +1,455 @@
|
||||
'''
|
||||
@brief This is an example plugin, can receive and send data
|
||||
@author
|
||||
@date
|
||||
@license LGPL-3.0
|
||||
'''
|
||||
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QTextEdit, QPushButton, QLabel, QScrollArea, QSplitter
|
||||
from PyQt5.QtCore import Qt, pyqtSignal
|
||||
from PyQt5.QtGui import QFont, QTextCursor
|
||||
from struct import Struct
|
||||
try:
|
||||
import utils_ui
|
||||
from plugins.base import Plugin_Base
|
||||
from conn import ConnectionStatus
|
||||
from i18n import _
|
||||
from widgets import statusBar
|
||||
except ImportError:
|
||||
from COMTool import utils_ui
|
||||
from COMTool.plugins.base import Plugin_Base
|
||||
from COMTool.i18n import _
|
||||
from COMTool.conn import ConnectionStatus
|
||||
from COMTool.widgets import statusBar
|
||||
|
||||
class Plugin(Plugin_Base):
|
||||
id = "HJ DATALINK"
|
||||
name = _("HJ DATALINK")
|
||||
showReceiveDataSignal = pyqtSignal(str)
|
||||
|
||||
def onInit(self, config):
|
||||
'''
|
||||
init params
|
||||
'''
|
||||
default = {
|
||||
"version": 1,
|
||||
"customSendItems": [
|
||||
{
|
||||
"caption": "自检",
|
||||
"icon": "fa5.question-circle",
|
||||
"data": "5A 54 E1 EE 00 CF 02 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "数据发送测试 - 40 Byte",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": (
|
||||
"5A 54 E4 EE 00 00 00 00 02 00 28 "
|
||||
"00 01 02 03 04 05 06 07 "
|
||||
"08 09 0A 0B 0C 0D 0E 0F "
|
||||
"10 11 12 13 14 15 16 17 "
|
||||
"18 19 1A 1B 1C 1D 1E 1F "
|
||||
"20 21 22 23 24 25 26 27 "
|
||||
"00 08 31 5A FE"
|
||||
)
|
||||
},
|
||||
# {
|
||||
# "caption": "数据发送测试 - 2",
|
||||
# "icon": "fa5.play-circle",
|
||||
# "data": ""
|
||||
# },
|
||||
{
|
||||
"caption": "装订 - 【主 - 0x01】128 kbps,时隙表 0",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE AA 01 22 00 00 9E 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【主 - 0x01】512 kbps,时隙表 1",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE AA 01 33 01 00 B0 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【主 - 0x01】2 Mbps,时隙表 2",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE AA 01 44 02 00 C2 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【主 - 0x01】静默",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE 55 01 22 00 00 49 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【从 - 0x02】128 kbps,时隙表 0",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE AA 02 22 00 00 9F 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【从 - 0x02】512 kbps,时隙表 1",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE AA 02 33 01 00 B1 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【从 - 0x02】2M bps,时隙表 2",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE AA 02 44 02 00 C3 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【从 - 0x02】静默",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE 55 02 22 00 00 0C 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【从 - 0x03】128 kbps,时隙表 0",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE AA 03 22 00 00 A0 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【从 - 0x03】512 kbps,时隙表 1",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE AA 03 33 02 00 B2 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【从 - 0x03】2 Mbps,时隙表 2",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE AA 03 44 01 00 C4 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "装订 - 【从 - 0x03】静默",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E3 EE 55 03 22 00 00 0D 06 5A FE"
|
||||
},
|
||||
{
|
||||
"caption": "遥测",
|
||||
"icon": "fa5.play-circle",
|
||||
"data": "5A 54 E6 EE 00 D4 02 5A FE"
|
||||
},
|
||||
]
|
||||
}
|
||||
self.config = config
|
||||
for k in default:
|
||||
if not k in self.config:
|
||||
self.config[k] = default[k]
|
||||
|
||||
def onConnChanged(self, status:ConnectionStatus, msg:str):
|
||||
print("-- connection changed: {}, msg: {}".format(status, msg))
|
||||
|
||||
def onWidgetMain(self, parent):
|
||||
'''
|
||||
main widget, just return a QWidget object
|
||||
'''
|
||||
self.mainWidget = QSplitter(Qt.Vertical)
|
||||
# receive widget
|
||||
self.receiveWidget = QTextEdit("")
|
||||
font = QFont('Consolas, DejaVu Sans Mono, Courier New, monospace, Microsoft YaHei', 10)
|
||||
self.receiveWidget.setFont(font)
|
||||
self.receiveWidget.setLineWrapMode(QTextEdit.NoWrap)
|
||||
# clear button
|
||||
self.clearBtn = QPushButton("")
|
||||
utils_ui.setButtonIcon(self.clearBtn, "mdi6.broom")
|
||||
# send scroll
|
||||
self.customSendScroll = QScrollArea()
|
||||
self.customSendScroll.setMinimumHeight(20)
|
||||
self.customSendScroll.setWidgetResizable(True)
|
||||
self.customSendScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
|
||||
self.customSendScroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
|
||||
cutomSendItemsWraper = QWidget()
|
||||
self.customSendScroll.setWidget(cutomSendItemsWraper)
|
||||
|
||||
# -- wrapper widget
|
||||
cutomSendItemsWraper0 = QWidget()
|
||||
cutomSendItemsWraper0.setProperty("class", "scrollbar2")
|
||||
layout0 = QVBoxLayout()
|
||||
layout0.setContentsMargins(0,8,0,0)
|
||||
cutomSendItemsWraper0.setLayout(layout0)
|
||||
layout0.addWidget(self.customSendScroll)
|
||||
customSendItemsLayoutWrapper = QVBoxLayout()
|
||||
customSendItemsLayoutWrapper.setContentsMargins(0,0,0,0)
|
||||
cutomSendItemsWraper.setLayout(customSendItemsLayoutWrapper)
|
||||
|
||||
# -- items container
|
||||
self.customItems = QWidget()
|
||||
self.customSendItemsLayout = QVBoxLayout()
|
||||
self.customSendItemsLayout.setContentsMargins(0,0,0,0)
|
||||
self.customItems.setLayout(self.customSendItemsLayout)
|
||||
customSendItemsLayoutWrapper.addWidget(self.customItems)
|
||||
customSendItemsLayoutWrapper.addStretch(0)
|
||||
|
||||
# add widgets
|
||||
self.mainWidget.addWidget(self.receiveWidget)
|
||||
self.mainWidget.addWidget(self.clearBtn)
|
||||
self.mainWidget.addWidget(cutomSendItemsWraper0)
|
||||
self.mainWidget.setStretchFactor(0, 2)
|
||||
self.mainWidget.setStretchFactor(1, 1)
|
||||
self.mainWidget.setStretchFactor(2, 11)
|
||||
|
||||
# event
|
||||
def clearReceived():
|
||||
self.receiveWidget.clear();self.statusBar.clear()
|
||||
self.clearBtn.clicked.connect(clearReceived)
|
||||
return self.mainWidget
|
||||
|
||||
def onWidgetStatusBar(self, parent):
|
||||
self.statusBar = statusBar(rxTxCount=True)
|
||||
return self.statusBar
|
||||
|
||||
def onUiInitDone(self):
|
||||
'''
|
||||
UI init done, you can update your widget here
|
||||
this method runs in UI thread, do not block too long
|
||||
'''
|
||||
newItems = []
|
||||
print(self.config["customSendItems"])
|
||||
for item in self.config["customSendItems"]:
|
||||
print(item)
|
||||
item = self.insertSendItem(item, load=True)
|
||||
newItems.append(item)
|
||||
self.config["customSendItems"] = newItems
|
||||
self.showReceiveDataSignal.connect(self.showReceivedData)
|
||||
# frame struct
|
||||
self.structSelfTestRsp = Struct("<BB B BBBbbb HHHBBbB B 3s")
|
||||
self.structStatusCheckRsp = Struct("<BB Q IIII IBBBBIB III III III III III III i II 3s IIII d Q dBB dB H B 2s BBBbbb HHHBBbB B 3s")
|
||||
self.structData = Struct("<BB IBH 40s")
|
||||
self.structSysInfo = Struct("<IHI H B I B fff fff fff")
|
||||
|
||||
def insertSendItem(self, item = None, load = False):
|
||||
caption = item["caption"]
|
||||
itemWidget = QWidget()
|
||||
layout = QHBoxLayout()
|
||||
layout.setContentsMargins(0,0,0,0)
|
||||
itemWidget.setLayout(layout)
|
||||
send = QPushButton("")
|
||||
label = QLabel(caption)
|
||||
if (not "icon" in item) or not item["icon"]:
|
||||
item["icon"] = "fa.send"
|
||||
utils_ui.setButtonIcon(send, item["icon"])
|
||||
send.setProperty("class", "smallBtn")
|
||||
def sendCustomData(idx):
|
||||
self.sendCustomItem(self.config["customSendItems"][idx])
|
||||
send.clicked.connect(lambda: sendCustomData(self.customSendItemsLayout.indexOf(itemWidget)))
|
||||
layout.addWidget(label)
|
||||
layout.addWidget(send)
|
||||
self.customSendItemsLayout.addWidget(itemWidget)
|
||||
if not load:
|
||||
self.config["customSendItems"].append(item)
|
||||
return item
|
||||
|
||||
def showReceivedData(self, text: str):
|
||||
curScrollValue = self.receiveWidget.verticalScrollBar().value()
|
||||
self.receiveWidget.moveCursor(QTextCursor.End)
|
||||
endScrollValue = self.receiveWidget.verticalScrollBar().value()
|
||||
self.receiveWidget.insertPlainText(text)
|
||||
if curScrollValue < endScrollValue:
|
||||
self.receiveWidget.verticalScrollBar().setValue(curScrollValue)
|
||||
else:
|
||||
self.receiveWidget.moveCursor(QTextCursor.End)
|
||||
|
||||
def onReceived(self, data : bytes):
|
||||
'''
|
||||
call in receive thread, not UI thread
|
||||
'''
|
||||
self.statusBar.addRx(len(data))
|
||||
## Apply data validation check
|
||||
if len(data) < 7:
|
||||
self.showReceiveDataSignal.emit("\n### Wrong data format: wrong frame header/tail\n")
|
||||
return
|
||||
|
||||
dataLen = data[-3]
|
||||
if data[0] != 0x5A or data[1] != 0x54 or data[-1] != 0xFE or data[-2] != 0x5A:
|
||||
self.showReceiveDataSignal.emit("\n### Wrong data format: wrong length\n")
|
||||
|
||||
checkSum = 0
|
||||
for i in data[2:-4]:
|
||||
checkSum += i
|
||||
if checkSum & 0xFF != data[-4]:
|
||||
self.showReceiveDataSignal.emit("\n### Wrong data format: wrong check sum\n")
|
||||
|
||||
## Eval data
|
||||
data = data[2:-5].replace(b'\x00\x54\xFE', b'\x54\xFE')
|
||||
# self.printFrame(data)
|
||||
if data[0] == 0xE1:
|
||||
# eval self test
|
||||
self.showReceiveDataSignal.emit(self.evalSelfTestRsp(data) + "\n")
|
||||
elif data[0] == 0xE6:
|
||||
self.showReceiveDataSignal.emit(self.evalStatusCheckRsp(data) + "\n")
|
||||
elif data[0] == 0xE5:
|
||||
self.showReceiveDataSignal.emit('Retrieved Data Frame:\n' + self.printFrame(data) + "\n")
|
||||
else:
|
||||
self.showReceiveDataSignal.emit(f"\n### Unexpected response code 0x{data[0]:02x}.\n")
|
||||
|
||||
def evalSelfTestRsp(self, data: bytes):
|
||||
try:
|
||||
payload = self.structSelfTestRsp.unpack(data)
|
||||
except :
|
||||
return f"\n### evalSelfTestRsp:: Failed to unpack data (data length {len(data)} byte).\n"
|
||||
|
||||
ret = "----------- 自检回令 -----------\n"
|
||||
|
||||
ret += f"节点编号: 0x{payload[-2]:02X}\n"
|
||||
|
||||
ret += "节点类型: "
|
||||
if payload[1] == 0xEE:
|
||||
ret += f"C频段 (0x{payload[1]:02X})\n"
|
||||
else:
|
||||
ret += f"【未知错误】(0x{payload[1]:02X})\n"
|
||||
|
||||
ret += "自检结果: "
|
||||
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
|
||||
|
||||
ret += f"FPGA 电压监测: {bin(payload[hwOffset+0])[2:].zfill(8)}\n"
|
||||
ret += f"时钟锁定状态: {bin(payload[hwOffset+1])[2:].zfill(8)}\n"
|
||||
ret += f"AD 锁定状态: {bin(payload[hwOffset+2])[2:].zfill(8)}\n"
|
||||
ret += f"AD 温度 1: {payload[hwOffset+3]:>4d}\n"
|
||||
ret += f"AD 温度 2: {payload[hwOffset+4]:>4d}\n"
|
||||
ret += f"FPGA 温度: {payload[hwOffset+5]:>4d}\n"
|
||||
ret += f"天线-1 工作 PLL: {(payload[hwOffset+6] >> 15) & 0x01:>1d}\n"
|
||||
ret += f"天线-1 工作频率: {(payload[hwOffset+6] & 0x7FFF)+3700:>4d}\n"
|
||||
ret += f"天线-2 工作 PLL: {(payload[hwOffset+7] >> 15) & 0x01:>1d}\n"
|
||||
ret += f"天线-2 工作频率: {(payload[hwOffset+7] & 0x7FFF)+3700:>4d}\n"
|
||||
ret += f"天线-3 工作 PLL: {(payload[hwOffset+8] >> 15) & 0x01:>1d}\n"
|
||||
ret += f"天线-3 工作频率: {(payload[hwOffset+8] & 0x7FFF)+3700:>4d}\n"
|
||||
ret += f"天线 PLL 锁定状态: {bin(payload[hwOffset+9])[2:].zfill(8)}\n"
|
||||
ret += f"天线工作模式: {bin(payload[hwOffset+10])[2:].zfill(8)}\n"
|
||||
ret += f"天线温度: {payload[hwOffset+11]:>4d}\n"
|
||||
ret += "--------------------------------\n"
|
||||
|
||||
return ret + '\n' + self.printFrame(data)
|
||||
|
||||
def printFrame(self, data: bytes):
|
||||
ret = ''
|
||||
for i in range(len(data)):
|
||||
ret += f'{data[i]:02X}'
|
||||
ret += '\n' if i%16 == 15 else ' '
|
||||
ret += '\n'
|
||||
return ret
|
||||
|
||||
def evalStatusCheckRsp(self, data: bytes):
|
||||
try:
|
||||
payload = self.structStatusCheckRsp.unpack(data)
|
||||
except :
|
||||
return f"\n### evalStatusCheckRsp:: Failed to unpack data (data length {len(data)} byte).\n"
|
||||
|
||||
ret = "----------- 遥测回令 -----------\n"
|
||||
|
||||
ret += "节点类型: "
|
||||
if payload[1] == 0xEE:
|
||||
ret += f"C频段 (0x{payload[1]:02X})\n"
|
||||
else:
|
||||
ret += f"【未知错误】(0x{payload[1]:02X})\n"
|
||||
|
||||
ret += f"时间戳: {payload[2]/1e5:.2f} ms\n"
|
||||
|
||||
sysbusOffset = 3
|
||||
linkOffset = 7
|
||||
phyOffset = 36
|
||||
hwOffset = 50
|
||||
|
||||
ret += "\n -- 总线状态\n"
|
||||
ret += f"配置装订: {payload[sysbusOffset + 0]:08X}\n"
|
||||
ret += f"接收数据计数: {payload[sysbusOffset + 1]:>6d}\n"
|
||||
ret += f"发送数据计数: {payload[sysbusOffset + 2]:>6d}\n"
|
||||
ret += f"遥测请求计数: {payload[sysbusOffset + 3]:>6d}\n"
|
||||
|
||||
ret += "\n -- 链路层状态\n"
|
||||
ret += f"时元号: {payload[linkOffset + 0]:>6d}\n"
|
||||
ret += f"时隙号: {payload[linkOffset + 1]:>3d}\n"
|
||||
|
||||
ret += "当前角色: "
|
||||
if payload[linkOffset + 2] == 0xAA:
|
||||
ret += f"簇首 (0x{payload[linkOffset + 2]:02X})\n"
|
||||
elif payload[linkOffset + 2] == 0xCC:
|
||||
ret += f"成员 (0x{payload[linkOffset + 2]:02X})\n"
|
||||
else:
|
||||
ret += f"【未知错误】(0x{payload[linkOffset + 2]:02X})\n"
|
||||
|
||||
ret += "网络连接状态: "
|
||||
if payload[linkOffset + 3] == 0x11:
|
||||
ret += f"已连接 (0x{payload[linkOffset + 3]:02X})\n"
|
||||
elif payload[linkOffset + 3] == 0x00:
|
||||
ret += f"未连接 (0x{payload[linkOffset + 3]:02X})\n"
|
||||
else:
|
||||
ret += f"【未知错误】(0x{payload[linkOffset + 3]:02X})\n"
|
||||
|
||||
ret += "网络运行阶段: "
|
||||
if payload[linkOffset + 4] == 0x11:
|
||||
ret += f"建网阶段 (0x{payload[linkOffset + 4]:02X})\n"
|
||||
elif payload[linkOffset + 4] == 0x22:
|
||||
ret += f"业务通信 (0x{payload[linkOffset + 4]:02X})\n"
|
||||
else:
|
||||
ret += f"【未知错误】(0x{payload[linkOffset + 4]:02X})\n"
|
||||
|
||||
ret += f"重建/入网计数: {payload[linkOffset + 5]:>6d}\n"
|
||||
ret += f"通信天线位号: {payload[linkOffset + 6]:>1d}\n"
|
||||
|
||||
ret += f"建网帧发送计数: {payload[linkOffset + 7]:>6d}\n"
|
||||
ret += f"建网帧接收计数: {payload[linkOffset + 8]:>6d}\n"
|
||||
ret += f"建网帧正确计数: {payload[linkOffset + 9]:>6d}\n"
|
||||
ret += f"应答帧发送计数: {payload[linkOffset + 10]:>6d}\n"
|
||||
ret += f"应答帧接收计数: {payload[linkOffset + 11]:>6d}\n"
|
||||
ret += f"应答帧正确计数: {payload[linkOffset + 12]:>6d}\n"
|
||||
ret += f"分发帧发送计数: {payload[linkOffset + 13]:>6d}\n"
|
||||
ret += f"分发帧接收计数: {payload[linkOffset + 14]:>6d}\n"
|
||||
ret += f"分发帧正确计数: {payload[linkOffset + 15]:>6d}\n"
|
||||
ret += f"网管帧发送计数: {payload[linkOffset + 16]:>6d}\n"
|
||||
ret += f"网管帧接收计数: {payload[linkOffset + 17]:>6d}\n"
|
||||
ret += f"网管帧正确计数: {payload[linkOffset + 18]:>6d}\n"
|
||||
ret += f"RTT 帧发送计数: {payload[linkOffset + 19]:>6d}\n"
|
||||
ret += f"RTT 帧接收计数: {payload[linkOffset + 20]:>6d}\n"
|
||||
ret += f"RTT 帧正确计数: {payload[linkOffset + 21]:>6d}\n"
|
||||
ret += f"业务帧发送计数: {payload[linkOffset + 22]:>6d}\n"
|
||||
ret += f"业务帧接收计数: {payload[linkOffset + 23]:>6d}\n"
|
||||
ret += f"业务帧正确计数: {payload[linkOffset + 24]:>6d}\n"
|
||||
ret += f"时间偏差记录: {payload[linkOffset + 25]/1e2:.2f} us\n"
|
||||
ret += f"发送数据 ID: {payload[linkOffset + 26]:>6d}\n"
|
||||
ret += f"接收数据 ID: {payload[linkOffset + 27]:>6d}\n"
|
||||
|
||||
ret += "\n -- 物理层状态\n"
|
||||
ret += f"捕获计数: {payload[phyOffset + 0]:>6d}\n"
|
||||
ret += f"帧同步计数: {payload[phyOffset + 1]:>6d}\n"
|
||||
ret += f"译码计数: {payload[phyOffset + 2]:>6d}\n"
|
||||
ret += f"CRC 正确计数:{payload[phyOffset + 3]:>6d}\n"
|
||||
ret += f"多普勒估计: {payload[phyOffset + 4]:.2f} Hz\n"
|
||||
ret += f"正确接收时刻: {payload[phyOffset + 5]/1e2:.2f} us\n"
|
||||
ret += f"捕获峰均比: {payload[phyOffset + 6]:.2f}\n"
|
||||
ret += f"捕获相位值: {payload[phyOffset + 7]:>3d}\n"
|
||||
ret += f"捕获频偏通道: {payload[phyOffset + 8]:>3d}\n"
|
||||
ret += f"帧同步峰均比: {payload[phyOffset + 9]:.2f}\n"
|
||||
ret += f"帧同步频偏通道: {payload[phyOffset + 10]:>3d}\n"
|
||||
ret += f"交织输入数据幅度统计:\t0x{payload[phyOffset + 11]:04X}\n"
|
||||
ret += f"天线控制模式: {bin(payload[phyOffset + 12])[2:].zfill(8)}\n"
|
||||
|
||||
ret += "\n -- 硬件状态\n"
|
||||
ret += f"FPGA 电压监测: {bin(payload[hwOffset+0])[2:].zfill(8)}\n"
|
||||
ret += f"时钟锁定状态: {bin(payload[hwOffset+1])[2:].zfill(8)}\n"
|
||||
ret += f"AD 锁定状态: {bin(payload[hwOffset+2])[2:].zfill(8)}\n"
|
||||
ret += f"AD 温度 1: {payload[hwOffset+3]:>4d}\n"
|
||||
ret += f"AD 温度 2: {payload[hwOffset+4]:>4d}\n"
|
||||
ret += f"FPGA 温度: {payload[hwOffset+5]:>4d}\n"
|
||||
ret += f"天线-1 工作 PLL: {(payload[hwOffset+6] >> 15) & 0x01:>1d}\n"
|
||||
ret += f"天线-1 工作频率: {(payload[hwOffset+6] & 0x7FFF)+3700:>4d}\n"
|
||||
ret += f"天线-2 工作 PLL: {(payload[hwOffset+7] >> 15) & 0x01:>1d}\n"
|
||||
ret += f"天线-2 工作频率: {(payload[hwOffset+7] & 0x7FFF)+3700:>4d}\n"
|
||||
ret += f"天线-3 工作 PLL: {(payload[hwOffset+8] >> 15) & 0x01:>1d}\n"
|
||||
ret += f"天线-3 工作频率: {(payload[hwOffset+8] & 0x7FFF)+3700:>4d}\n"
|
||||
ret += f"天线 PLL 锁定状态: {bin(payload[hwOffset+9])[2:].zfill(8)}\n"
|
||||
ret += f"天线工作模式: {bin(payload[hwOffset+10])[2:].zfill(8)}\n"
|
||||
ret += f"天线温度: {payload[hwOffset+11]:>4d}\n"
|
||||
|
||||
ret += "--------------------------------\n"
|
||||
return ret + '\n' + self.printFrame(data)
|
||||
|
||||
def onSent(self, ok, msg, length, path):
|
||||
if ok:
|
||||
self.statusBar.addTx(length)
|
||||
else:
|
||||
self.hintSignal.emit("error", _("Error"), _("Send data failed!") + " " + msg)
|
||||
|
||||
def sendCustomItem(self, item):
|
||||
data = item["data"]
|
||||
dateBytes = self.parseSendData(data, encoding = self.configGlobal["encoding"], isHexStr = True)
|
||||
if dateBytes:
|
||||
self.send(dateBytes, callback=self.onSent)
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
+1
-1
Submodule scripts updated: 00960b6b8f...d13f6cb8b3
@@ -103,13 +103,13 @@ static ad9528outputSettings_t clockOutputSettings = {
|
||||
},
|
||||
.outChannelDiv = {
|
||||
5,25,25,5,5,
|
||||
5,5,8,5,5,
|
||||
5,5,10,5
|
||||
5,5,5,5,5,
|
||||
5,5,8,5
|
||||
},
|
||||
.outFrequency_Hz = {
|
||||
200e6, 40e6, 40e6, 200e6, 200e6,
|
||||
200e6, 200e6, 125e6, 200e6, 200e6,
|
||||
200e6, 200e6, 100e6, 200e6
|
||||
200e6, 200e6, 200e6, 200e6, 200e6,
|
||||
200e6, 200e6, 125e6, 200e6
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -243,12 +243,20 @@ int32_t L2_Scan_PktHandler(L2_INST *instPtr, uint8_t *msg)
|
||||
L2_TimeAdjust(instPtr, &(instPtr->log.timeDev));
|
||||
|
||||
// Get data payload & upload
|
||||
SYSMON_SVC_PAYLOAD recvPayload;
|
||||
recvPayload.dataId = message->dataId;
|
||||
recvPayload.nodeId = message->common.src;
|
||||
recvPayload.dataLen = message->dataLen;
|
||||
memcpy(recvPayload.data, message->data, maxDataLen);
|
||||
SysMonitor_GenRecvRsp(&recvPayload);
|
||||
if (message->dataId != DATA_ID_NONE)
|
||||
{
|
||||
if (message->dataLen > maxDataLen)
|
||||
{
|
||||
DBG_ERROR("Payload length" PRIu16 " out of range.\n", message->dataLen);
|
||||
return EIGNORE;
|
||||
}
|
||||
SYSMON_SVC_PAYLOAD *recvPayload = calloc(1, NORMALIZE_SIZE(sizeof(SYSMON_SVC_PAYLOAD)));
|
||||
recvPayload->dataId = message->dataId;
|
||||
recvPayload->nodeId = message->common.src;
|
||||
recvPayload->dataLen = message->dataLen;
|
||||
memcpy(recvPayload->data, message->data, message->dataLen);
|
||||
SysMonitor_GenRecvRsp(recvPayload);
|
||||
}
|
||||
|
||||
// Logging...
|
||||
instPtr->log.rxLog.dataId = message->dataId;
|
||||
|
||||
@@ -196,16 +196,29 @@ static int32_t Service_Packing128K(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t
|
||||
message->srcSpeedY = instPtr->sysInfo.vY;
|
||||
message->srcSpeedZ = instPtr->sysInfo.vZ;
|
||||
|
||||
// TODO: Packing extra payload
|
||||
// Pack extra payload
|
||||
if (type == L2_FRAME_SVC)
|
||||
{
|
||||
SYSMON_SVC_PAYLOAD sendPayload;
|
||||
// Packing extra payload
|
||||
SYSMON_SVC_PAYLOAD *sendPayload;
|
||||
SysMonitor_GetSendPayload(&sendPayload);
|
||||
message->common.dst = sendPayload.nodeId;
|
||||
message->dataId = sendPayload.dataId;
|
||||
message->dataLen = sendPayload.dataLen;;
|
||||
if(sendPayload == NULL)
|
||||
{
|
||||
message->common.dst = L2_NONE_ID;
|
||||
message->dataId = DATA_ID_NONE;
|
||||
message->dataLen = 0;
|
||||
memset(message->data, 0xAA, maxDataLen);
|
||||
memcpy(message->data, sendPayload.data, sendPayload.dataLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
message->common.dst = sendPayload->nodeId;
|
||||
message->dataId = sendPayload->dataId;
|
||||
message->dataLen = sendPayload->dataLen;
|
||||
memset(message->data, 0xAA, maxDataLen);
|
||||
memcpy(message->data, sendPayload->data, (sendPayload->dataLen > maxDataLen) ?
|
||||
maxDataLen : sendPayload->dataLen);
|
||||
free(sendPayload);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -264,14 +277,26 @@ static int32_t Service_Packing512K(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t
|
||||
message->srcSpeedY = instPtr->sysInfo.vY;
|
||||
message->srcSpeedZ = instPtr->sysInfo.vZ;
|
||||
|
||||
// TODO: Packing extra payload
|
||||
SYSMON_SVC_PAYLOAD sendPayload;
|
||||
// Pack extra payload
|
||||
SYSMON_SVC_PAYLOAD *sendPayload;
|
||||
SysMonitor_GetSendPayload(&sendPayload);
|
||||
message->common.dst = sendPayload.nodeId;
|
||||
message->dataId = sendPayload.dataId;
|
||||
message->dataLen = sendPayload.dataLen;
|
||||
if(sendPayload == NULL)
|
||||
{
|
||||
message->common.dst = L2_NONE_ID;
|
||||
message->dataId = DATA_ID_NONE;
|
||||
message->dataLen = 0;
|
||||
memset(message->data, 0xAA, maxDataLen);
|
||||
memcpy(message->data, sendPayload.data, sendPayload.dataLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
message->common.dst = sendPayload->nodeId;
|
||||
message->dataId = sendPayload->dataId;
|
||||
message->dataLen = sendPayload->dataLen;
|
||||
memset(message->data, 0xAA, maxDataLen);
|
||||
memcpy(message->data, sendPayload->data, (sendPayload->dataLen > maxDataLen) ?
|
||||
maxDataLen : sendPayload->dataLen);
|
||||
free(sendPayload);
|
||||
}
|
||||
|
||||
// Append CRC
|
||||
uint32_t crcVal;
|
||||
@@ -322,14 +347,26 @@ static int32_t Service_Packing2M(L2_INST *instPtr, L2_FRAME_TYPE type, uint8_t d
|
||||
message->srcSpeedY = instPtr->sysInfo.vY;
|
||||
message->srcSpeedZ = instPtr->sysInfo.vZ;
|
||||
|
||||
// TODO: Packing extra payload
|
||||
SYSMON_SVC_PAYLOAD sendPayload;
|
||||
// Packing extra payload
|
||||
SYSMON_SVC_PAYLOAD *sendPayload;
|
||||
SysMonitor_GetSendPayload(&sendPayload);
|
||||
message->common.dst = sendPayload.nodeId;
|
||||
message->dataId = sendPayload.dataId;
|
||||
message->dataLen = sendPayload.dataLen;;
|
||||
if(sendPayload == NULL)
|
||||
{
|
||||
message->common.dst = L2_NONE_ID;
|
||||
message->dataId = DATA_ID_NONE;
|
||||
message->dataLen = 0;
|
||||
memset(message->data, 0xAA, maxDataLen);
|
||||
memcpy(message->data, sendPayload.data, sendPayload.dataLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
message->common.dst = sendPayload->nodeId;
|
||||
message->dataId = sendPayload->dataId;
|
||||
message->dataLen = sendPayload->dataLen;
|
||||
memset(message->data, 0xAA, maxDataLen);
|
||||
memcpy(message->data, sendPayload->data, (sendPayload->dataLen > maxDataLen) ?
|
||||
maxDataLen : sendPayload->dataLen);
|
||||
free(sendPayload);
|
||||
}
|
||||
|
||||
// Append CRC
|
||||
uint32_t crcVal;
|
||||
@@ -491,12 +528,20 @@ static int32_t Service_PktHandler128K(L2_INST *instPtr, uint8_t *msg)
|
||||
}
|
||||
|
||||
// Get data payload
|
||||
SYSMON_SVC_PAYLOAD recvPayload;
|
||||
recvPayload.dataId = message->dataId;
|
||||
recvPayload.nodeId = message->common.src;
|
||||
recvPayload.dataLen = message->dataLen;
|
||||
memcpy(recvPayload.data, message->data, maxDataLen);
|
||||
SysMonitor_GenRecvRsp(&recvPayload);
|
||||
if (message->dataId != DATA_ID_NONE)
|
||||
{
|
||||
if (message->dataLen > maxDataLen)
|
||||
{
|
||||
DBG_ERROR("Payload length" PRIu16 " out of range.\n", message->dataLen);
|
||||
return EIGNORE;
|
||||
}
|
||||
SYSMON_SVC_PAYLOAD *recvPayload = calloc(1, NORMALIZE_SIZE(sizeof(SYSMON_SVC_PAYLOAD)));
|
||||
recvPayload->dataId = message->dataId;
|
||||
recvPayload->nodeId = message->common.src;
|
||||
recvPayload->dataLen = message->dataLen;
|
||||
memcpy(recvPayload->data, message->data, message->dataLen);
|
||||
SysMonitor_GenRecvRsp(recvPayload);
|
||||
}
|
||||
|
||||
// Logging...
|
||||
instPtr->log.rxLog.dataId = message->dataId;
|
||||
@@ -571,12 +616,20 @@ static int32_t Service_PktHandler512K(L2_INST *instPtr, uint8_t *msg)
|
||||
}
|
||||
|
||||
// Get data payload
|
||||
SYSMON_SVC_PAYLOAD recvPayload;
|
||||
recvPayload.dataId = message->dataId;
|
||||
recvPayload.nodeId = message->common.src;
|
||||
recvPayload.dataLen = message->dataLen;
|
||||
memcpy(recvPayload.data, message->data, maxDataLen);
|
||||
SysMonitor_GenRecvRsp(&recvPayload);
|
||||
if (message->dataId != DATA_ID_NONE)
|
||||
{
|
||||
if (message->dataLen > maxDataLen)
|
||||
{
|
||||
DBG_ERROR("Payload length" PRIu16 " out of range.\n", message->dataLen);
|
||||
return EIGNORE;
|
||||
}
|
||||
SYSMON_SVC_PAYLOAD *recvPayload = calloc(1, NORMALIZE_SIZE(sizeof(SYSMON_SVC_PAYLOAD)));
|
||||
recvPayload->dataId = message->dataId;
|
||||
recvPayload->nodeId = message->common.src;
|
||||
recvPayload->dataLen = message->dataLen;
|
||||
memcpy(recvPayload->data, message->data, message->dataLen);
|
||||
SysMonitor_GenRecvRsp(recvPayload);
|
||||
}
|
||||
|
||||
// Logging...
|
||||
instPtr->log.rxLog.dataId = message->dataId;
|
||||
@@ -651,12 +704,20 @@ static int32_t Service_PktHandler2M(L2_INST *instPtr, uint8_t *msg)
|
||||
}
|
||||
|
||||
// Get data payload
|
||||
SYSMON_SVC_PAYLOAD recvPayload;
|
||||
recvPayload.dataId = message->dataId;
|
||||
recvPayload.nodeId = message->common.src;
|
||||
recvPayload.dataLen = message->dataLen;
|
||||
memcpy(recvPayload.data, message->data, message->dataLen);
|
||||
SysMonitor_GenRecvRsp(&recvPayload);
|
||||
if (message->dataId != DATA_ID_NONE)
|
||||
{
|
||||
if (message->dataLen > maxDataLen)
|
||||
{
|
||||
DBG_ERROR("Payload length" PRIu16 " out of range.\n", message->dataLen);
|
||||
return EIGNORE;
|
||||
}
|
||||
SYSMON_SVC_PAYLOAD *recvPayload = calloc(1, NORMALIZE_SIZE(sizeof(SYSMON_SVC_PAYLOAD)));
|
||||
recvPayload->dataId = message->dataId;
|
||||
recvPayload->nodeId = message->common.src;
|
||||
recvPayload->dataLen = message->dataLen;
|
||||
memcpy(recvPayload->data, message->data, message->dataLen);
|
||||
SysMonitor_GenRecvRsp(recvPayload);
|
||||
}
|
||||
|
||||
// Logging...
|
||||
instPtr->log.rxLog.dataId = message->dataId;
|
||||
@@ -887,10 +948,9 @@ int32_t L2_Service_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntr
|
||||
memcpy(instPtr->sendPktData, testData, msgLen);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
else if (rtneEntry->dst == L2_GetNodeId(instPtr))
|
||||
{
|
||||
// In services slots, rx mode is always enabled when other nodes are transmitting
|
||||
commNode = L2_GetNodeById(instPtr->nodeList, L2_HEAD_ID);
|
||||
commNode = L2_GetNodeById(instPtr->nodeList, rtneEntry->src);
|
||||
// antenna selection based on node list
|
||||
antIndex = commNode->nodeInfo.antIndex;
|
||||
// member node receives message in advertise slot
|
||||
@@ -898,7 +958,13 @@ int32_t L2_Service_Routine(L2_INST *instPtr, const L2_RTNE_TABLE_ENTRY *rtneEntr
|
||||
|
||||
svcFSMPtr->rxCnt++;
|
||||
}
|
||||
(void)Phy_SetAntIndex(phyRef, antIndex);
|
||||
else
|
||||
{
|
||||
// otherwise suspend
|
||||
antIndex = PHY_ANT_INDEX_NONE;
|
||||
torState = L2_TOR_SUSPEND;
|
||||
}
|
||||
(void)Phy_SetAntIndex(instPtr->config.phyInstPtr, antIndex);
|
||||
(void)L2_SetupNextSlot(instPtr, torState, L2_FRAME_SVC);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -202,41 +202,101 @@ const uint16_t freqTable[L1_FRAME_MAX_HOPS] =
|
||||
|
||||
const uint8_t hopPattern_ADV_24MS[L1_FRAME_ADV_24MS_HOPS] =
|
||||
{
|
||||
0U, 35U, 66U, 47U, 40U, 16U, 30U, 65U,
|
||||
43U, 7U, 70U, 63U, 7U, 65U, 42U, 28U,
|
||||
2U
|
||||
0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U,
|
||||
8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
|
||||
16U,
|
||||
};
|
||||
|
||||
const uint8_t hopPattern_ACK_8MS[L1_FRAME_ACK_8MS_HOPS] =
|
||||
{
|
||||
0U, 5U, 49U, 25U, 7U
|
||||
10U, 11U, 12U, 13U, 14U,
|
||||
};
|
||||
|
||||
//const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] =
|
||||
//{
|
||||
// 80U, 16U, 17U, 65U, 60U, 54U, 31U, 15U,
|
||||
// 6U, 19U, 79U, 52U, 29U, 42U, 23U, 59U,
|
||||
// 60U, 58U, 76U, 67U, 31U, 76U, 77U, 79U,
|
||||
// 79U, 14U, 61U, 5U, 71U, 50U, 32U, 77U,
|
||||
// 60U,
|
||||
//};
|
||||
|
||||
//const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] =
|
||||
//{
|
||||
// 0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U,
|
||||
// 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
|
||||
// 16U, 17U, 18U, 19U, 20U, 21U, 22U, 23U,
|
||||
// 24U, 25U, 26U, 27U, 28U, 29U, 30U, 31U,
|
||||
// 32U,
|
||||
//};
|
||||
|
||||
const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] =
|
||||
{
|
||||
80U, 16U, 17U, 65U, 60U, 54U, 31U, 15U,
|
||||
6U, 19U, 79U, 52U, 29U, 42U, 23U, 59U,
|
||||
60U, 58U, 76U, 67U, 31U, 76U, 77U, 79U,
|
||||
79U, 14U, 61U, 5U, 71U, 50U, 32U, 77U,
|
||||
60U,
|
||||
0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U,
|
||||
10U, 11U, 10U, 11U, 10U, 11U, 10U, 11U,
|
||||
10U, 12U, 10U, 12U, 10U, 12U, 10U, 12U,
|
||||
10U, 13U, 10U, 13U, 10U, 13U, 10U, 13U,
|
||||
10U,
|
||||
};
|
||||
|
||||
//const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] =
|
||||
//{
|
||||
// 0U, 1U, 2U, 3U, 4U, 5U, 6U,
|
||||
//};
|
||||
|
||||
//const uint8_t hopPattern_128KBPS_4MS[L1_FRAME_128KBPS_4MS_HOPS] =
|
||||
//{
|
||||
// 0U, 16U, 17U, 65U, 60U, 54U, 31U, 15U,
|
||||
// 6U, 19U, 39U, 52U, 29U, 42U, 23U, 49U,
|
||||
// 33U, 58U, 24U, 67U, 31U, 13U, 17U, 10U,
|
||||
// 59U, 14U, 61U, 5U, 41U, 44U, 32U, 35U,
|
||||
// 60U,
|
||||
//};
|
||||
|
||||
//const uint8_t hopPattern_512KBPS_4MS[L1_FRAME_512KBPS_4MS_HOPS] =
|
||||
//{
|
||||
// 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
|
||||
// 16U, 17U, 18U, 19U, 20U, 21U, 22U, 23U,
|
||||
// 24U, 25U, 26U, 27U, 28U, 29U, 30U, 31U,
|
||||
// 32U, 33U, 34U, 35U, 36U, 37U, 38U, 39U,
|
||||
// 40U, 41U, 42U, 43U,
|
||||
//};
|
||||
|
||||
const uint8_t hopPattern_512KBPS_4MS[L1_FRAME_512KBPS_4MS_HOPS] =
|
||||
{
|
||||
80U, 62U, 40U, 66U, 65U, 33U, 55U, 33U,
|
||||
57U, 11U, 37U, 45U, 5U, 69U, 77U, 54U,
|
||||
37U, 63U, 14U, 64U, 76U, 31U, 45U, 52U,
|
||||
40U, 20U, 20U, 32U, 0U, 60U, 23U, 19U,
|
||||
15U, 38U, 62U, 18U,
|
||||
8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
|
||||
16U, 17U, 16U, 17U, 16U, 17U, 16U, 17U,
|
||||
16U, 18U, 16U, 18U, 16U, 18U, 16U, 18U,
|
||||
16U, 19U, 16U, 19U, 16U, 19U, 16U, 19U,
|
||||
16U, 20U, 16U, 20U,
|
||||
};
|
||||
|
||||
|
||||
//const uint8_t hopPattern_2MBPS_4MS[L1_FRAME_2MBPS_4MS_HOPS] =
|
||||
//{
|
||||
// 16U, 17U, 18U, 19U, 20U, 21U, 22U, 23U,
|
||||
// 24U, 25U, 26U, 27U, 28U, 29U, 30U, 31U,
|
||||
// 32U, 33U, 34U, 35U, 36U, 37U, 38U, 39U,
|
||||
// 40U, 41U, 42U, 43U, 44U, 45U, 46U, 47U,
|
||||
// 48U, 49U, 50U, 51U, 52U, 53U,
|
||||
//};
|
||||
|
||||
//const uint8_t hopPattern_2MBPS_4MS[L1_FRAME_2MBPS_4MS_HOPS] =
|
||||
//{
|
||||
// 16U, 17U, 18U, 19U, 20U, 21U, 22U, 23U,
|
||||
// 24U, 25U, 24U, 25U, 24U, 25U, 24U, 25U,
|
||||
// 24U, 26U, 24U, 26U, 24U, 26U, 24U, 26U,
|
||||
// 24U, 27U, 24U, 27U, 24U, 27U, 24U, 27U,
|
||||
// 24U, 28U, 24U, 28U, 24U, 28U,
|
||||
//};
|
||||
|
||||
const uint8_t hopPattern_2MBPS_4MS[L1_FRAME_2MBPS_4MS_HOPS] =
|
||||
{
|
||||
0U, 13U, 37U, 44U, 16U, 0U, 59U, 50U,
|
||||
69U, 70U, 58U, 14U, 9U, 72U, 27U, 25U,
|
||||
21U, 76U, 20U, 35U, 30U, 58U, 22U, 59U,
|
||||
48U, 33U, 8U, 7U, 41U, 12U, 44U, 79U,
|
||||
77U, 38U, 76U, 75U, 48U, 56U,
|
||||
16U, 17U, 18U, 19U, 20U, 21U, 20U, 20U,
|
||||
20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U,
|
||||
20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U,
|
||||
20U, 20U, 20U, 20U, 20U, 20U, 20U, 20U,
|
||||
20U, 20U, 20U, 20U, 20U, 20U,
|
||||
};
|
||||
|
||||
/** @} PhysicalLayer_AntennaConfig_Constants*/
|
||||
@@ -402,7 +462,7 @@ int32_t Phy_SetAntIndex(PHY_INST *instPtr, PHY_ANT_INDEX antIndex)
|
||||
{
|
||||
ASSERT(instPtr != NULL);
|
||||
|
||||
if (antIndex < 0 || antIndex >= L1_ANT_NUM)
|
||||
if (antIndex < PHY_ANT_INDEX_NONE || antIndex > PHY_ANT_INDEX_3)
|
||||
{
|
||||
DBG_ERROR("Antenna index out of range: %" PRIu8 ". \n", antIndex);
|
||||
return EPARAM;
|
||||
|
||||
+12
-9
@@ -195,9 +195,17 @@ int32_t SysMonitor_UpdateSendPayload(SYSMON_SVC_PAYLOAD *payload)
|
||||
}
|
||||
|
||||
// push message into send queue
|
||||
if (CircQueuePush(sysMonitorInst->sendQueue, (void *)payload) == false)
|
||||
SYSMON_SVC_PAYLOAD *payloadCopy = malloc(sizeof(SYSMON_SVC_PAYLOAD));
|
||||
if (payloadCopy == NULL)
|
||||
{
|
||||
DBG_ERROR("Allocate memory for send payload failed.\n");
|
||||
return ENOMEM;
|
||||
}
|
||||
memcpy(payloadCopy, payload, sizeof(SYSMON_SVC_PAYLOAD));
|
||||
if (CircQueuePush(sysMonitorInst->sendQueue, (void *)payloadCopy) == false)
|
||||
{
|
||||
DBG_WARNING("SystemMonitor::SEND Queue overflowed!\n");
|
||||
free(payloadCopy);
|
||||
return EQUEUE;
|
||||
}
|
||||
|
||||
@@ -209,19 +217,14 @@ int32_t SysMonitor_UpdateSendPayload(SYSMON_SVC_PAYLOAD *payload)
|
||||
*
|
||||
* @param payload
|
||||
*/
|
||||
void SysMonitor_GetSendPayload(SYSMON_SVC_PAYLOAD *payload)
|
||||
void SysMonitor_GetSendPayload(SYSMON_SVC_PAYLOAD **payload)
|
||||
{
|
||||
ASSERT(sysMonitorInst != NULL);
|
||||
ASSERT(payload != NULL);
|
||||
|
||||
if (CircQueuePop(sysMonitorInst->sendQueue, (void *)payload) == false)
|
||||
if (CircQueuePop(sysMonitorInst->sendQueue, (void **)payload) == false)
|
||||
{
|
||||
payload->dataId = DATA_ID_NONE;
|
||||
payload->nodeId = 0;
|
||||
payload->dataLen = 0;
|
||||
// set payload to be 0xAA to balanced average signal power
|
||||
memset(payload->data, 0xAA, PAYLOAD_LEN_MAX);
|
||||
DBG_WARNING("SystemMonitor::Nothing to be sent.\n");
|
||||
*payload = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ typedef struct
|
||||
uint32_t dataId; ///< data identifier
|
||||
uint8_t nodeId; ///< destination ID for tx, source ID for rx
|
||||
uint16_t dataLen; ///< data length
|
||||
uint8_t data[PAYLOAD_LEN_MAX];
|
||||
uint8_t data[1000];
|
||||
} SYSMON_SVC_PAYLOAD;
|
||||
|
||||
/************************** Function Prototypes ******************************/
|
||||
@@ -243,7 +243,7 @@ void SysMonitor_UpdateSysinfo(const SYSINFO *info);
|
||||
void SysMonitor_GetSysinfo(SYSINFO *info);
|
||||
|
||||
int32_t SysMonitor_UpdateSendPayload(SYSMON_SVC_PAYLOAD *payload);
|
||||
void SysMonitor_GetSendPayload(SYSMON_SVC_PAYLOAD *payload);
|
||||
void SysMonitor_GetSendPayload(SYSMON_SVC_PAYLOAD **payload);
|
||||
int32_t SysMonitor_GenRecvRsp(SYSMON_SVC_PAYLOAD *payload);
|
||||
|
||||
void SysMonitor_UpdateLinklayerLog(const LINKLOG *log);
|
||||
|
||||
+11
-11
@@ -71,8 +71,8 @@
|
||||
// -- Request
|
||||
// -- -- Enable control
|
||||
#define WD_EN_CMD 0x02
|
||||
#define EN_CMD_ENABLE 0x66
|
||||
#define EN_CMD_SILENT 0x88
|
||||
#define EN_CMD_ENABLE 0xAA
|
||||
#define EN_CMD_SILENT 0x55
|
||||
// -- -- Node mode control
|
||||
#define WD_ID_CMD 0x03
|
||||
// -- -- Service Rate control
|
||||
@@ -128,7 +128,7 @@
|
||||
// -- Request
|
||||
// -- -- --
|
||||
// -- Response
|
||||
#define RM_TEST_RSP_LEN 190
|
||||
#define RM_TEST_RSP_LEN 202
|
||||
// -- -- 8 byte time stamp
|
||||
#define RT_TIME_STAMP_OFFSET 0x02
|
||||
#define RT_TIME_STAMP_LEN 8
|
||||
@@ -137,12 +137,12 @@
|
||||
#define RT_SYSBUS_LOG_LEN 16
|
||||
// -- -- 88 byte link layer log
|
||||
#define RT_LINK_LOG_OFFSET 0x1A
|
||||
#define RT_LINK_LOG_LEN 88
|
||||
#define RT_LINK_LOG_LEN 100
|
||||
// -- -- 56 byte physical layer log
|
||||
#define RT_PHY_LOG_OFFSET 0x72
|
||||
#define RT_PHY_LOG_OFFSET 0x7E
|
||||
#define RT_PHY_LOG_LEN 56
|
||||
// -- -- 20 byte hardware log
|
||||
#define RT_HARDWARE_ST_OFFSET 0xAA
|
||||
#define RT_HARDWARE_ST_OFFSET 0xB6
|
||||
#define RT_HARDWARE_ST_LEN 20
|
||||
|
||||
// My Production Type
|
||||
@@ -237,7 +237,7 @@ static int32_t SystemBus_SystemConfig(SYSBUS *instPtr, uint8_t *msg)
|
||||
if (msg[WD_ID_CMD] >= 0 && msg[WD_ID_CMD] < linkConfig.netScale)
|
||||
{
|
||||
reconfig |= (msg[WD_ID_CMD] != linkConfig.myId);
|
||||
linkConfig.myType = (msg[WD_ID_CMD] == 0) ? L2_NODE_HEAD : L2_NODE_MEMBER;
|
||||
linkConfig.myType = (msg[WD_ID_CMD] == L2_HEAD_ID) ? L2_NODE_HEAD : L2_NODE_MEMBER;
|
||||
linkConfig.myId = msg[WD_ID_CMD];
|
||||
}
|
||||
else
|
||||
@@ -322,7 +322,7 @@ static int32_t SystemBus_SystemConfig(SYSBUS *instPtr, uint8_t *msg)
|
||||
.event = L2_ROUTINE_UPDATE,
|
||||
.msg = &newRtneConfig
|
||||
};
|
||||
AssertL2Event(instPtr, &l2Event);
|
||||
AssertL2Event(linkInstPtr, &l2Event);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
@@ -334,7 +334,7 @@ static int32_t SystemBus_SystemConfig(SYSBUS *instPtr, uint8_t *msg)
|
||||
.event = L2_ROUTINE_UPDATE,
|
||||
.msg = &newRtneConfig
|
||||
};
|
||||
AssertL2Event(instPtr, &l2Event);
|
||||
AssertL2Event(linkInstPtr, &l2Event);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
@@ -346,7 +346,7 @@ static int32_t SystemBus_SystemConfig(SYSBUS *instPtr, uint8_t *msg)
|
||||
.event = L2_ROUTINE_UPDATE,
|
||||
.msg = &newRtneConfig
|
||||
};
|
||||
AssertL2Event(instPtr, &l2Event);
|
||||
AssertL2Event(linkInstPtr, &l2Event);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -399,7 +399,7 @@ int32_t SystemBus_GenRecvRsp(SYSBUS *instPtr, SYSMON_SVC_PAYLOAD *payload)
|
||||
ASSERT(instPtr != NULL);
|
||||
ASSERT(payload != NULL);
|
||||
|
||||
SYSBUS_UART_FRAME *sysbusRsp = malloc(sizeof(SYSBUS_UART_FRAME));
|
||||
SYSBUS_UART_FRAME *sysbusRsp = malloc(NORMALIZE_SIZE(sizeof(SYSBUS_UART_FRAME)));
|
||||
if (sysbusRsp == NULL)
|
||||
{
|
||||
DBG_ERROR("Failed to allocate memory for Receive Response!\n");
|
||||
|
||||
@@ -146,7 +146,8 @@ int SysbusUart_Send(SYSBUS_UART *instPtr, SYSBUS_UART_FRAME *frame)
|
||||
free(sendBuff);
|
||||
return FAILURE;
|
||||
}
|
||||
memcpy((void *)(instPtr->config.baseAddr + UART_TXBUFF_OFFSET), sendBuff, (sendLen + sizeof(uint32_t) - 1) / sizeof(uint32_t) * sizeof(uint32_t));
|
||||
memcpy((void *)(instPtr->config.baseAddr + UART_TXBUFF_OFFSET), sendBuff,
|
||||
NORMALIZE_SIZE((sendLen + sizeof(uint32_t) - 1) / sizeof(uint32_t) * sizeof(uint32_t)));
|
||||
free(sendBuff);
|
||||
// Start Sending
|
||||
SYSTEMBUS_UART_mWriteReg(instPtr->config.baseAddr, UART_SEND_CMD, sendLen);
|
||||
@@ -183,7 +184,8 @@ int SysbusUart_Recv(SYSBUS_UART *instPtr, SYSBUS_UART_FRAME *frame)
|
||||
{
|
||||
return ENOMEM;
|
||||
}
|
||||
memcpy(dBuff, (void *)(instPtr->config.baseAddr + UART_RXBUFF_OFFSET), sizeof(uint32_t) * dWLen);
|
||||
memcpy(dBuff, (void *)(instPtr->config.baseAddr + UART_RXBUFF_OFFSET),
|
||||
NORMALIZE_SIZE(sizeof(uint32_t) * dWLen));
|
||||
plBuff = dBuff + FRAME_HEAD_LEN;
|
||||
checkSumCal = 0;
|
||||
checkSum = plBuff[dLen + FRAME_DUMMY_LEN];
|
||||
|
||||
Reference in New Issue
Block a user