feat: 添加局域网设备发现功能和链路胶囊优化
- 实现局域网设备发现面板,支持探测ESP32中继板并自动切换端点 - 添加POST /api/lan/probe接口用于设备探测,返回三态判决结果 - 实现快扫和全段扫描两种模式,支持种子地址优先探测 - 添加端点唯一写手机制,防止多处同时修改设备IP - 优化链路胶囊UI显示WiFi/EtherCAT/BLE连接状态和设备名称 - 修复EtherCAT链路OTA刷写期间PDO循环暂停和AL状态处理问题 - 调整PDO周期设置范围为0.125-4ms,支持亚毫秒显示为微秒 - 添加ESP32 WiFi使能开关控件样式和数据来源角标显示
This commit is contained in:
+15
-6
@@ -7,9 +7,9 @@
|
||||
<!-- 空 favicon:阻止浏览器自动请求 /favicon.ico(本地静态服务无此文件会 404) -->
|
||||
<link rel="icon" href="data:,">
|
||||
<link rel="stylesheet" href="../css/base.css?v=857f83a5">
|
||||
<link rel="stylesheet" href="../css/layout.css?v=20260924a">
|
||||
<link rel="stylesheet" href="../css/layout.css?v=20260926a">
|
||||
<link rel="stylesheet" href="../css/components.css?v=20260924a">
|
||||
<link rel="stylesheet" href="../css/can.css?v=c06f5688">
|
||||
<link rel="stylesheet" href="../css/can.css?v=20260926a">
|
||||
<link rel="stylesheet" href="../css/responsive.css?v=quiet20260919a">
|
||||
</head>
|
||||
<body class="can-page">
|
||||
@@ -30,9 +30,9 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-status">
|
||||
<span class="pill offline" id="canConnPill"><span class="indicator"></span><span id="canConnTxt">未连接</span></span>
|
||||
<span class="pill" id="canIpPill">IP --</span>
|
||||
<span class="pill" id="canRssiPill">RSSI --</span>
|
||||
<span class="pill offline link-pill" id="canNetPill" title="ESP32 WiFi(/system/status)">
|
||||
<span class="indicator"></span><span id="canNetTxt">未连接</span>
|
||||
</span>
|
||||
<span class="pill" id="canUptimePill">运行 --</span>
|
||||
<span class="pill" id="canVersionPill">v--</span>
|
||||
<span class="pill" id="canChannelPill">CH0</span>
|
||||
@@ -216,6 +216,15 @@
|
||||
<button class="btn btn-outline btn-sm" id="btnModeFilter" type="button">过滤模式</button>
|
||||
<button class="btn btn-outline btn-sm" id="btnModeBridge" type="button" title="CAN0 收到的每一帧按原帧格式自动转发到 CAN1 与 CAN2">CAN0→1/2 桥接</button>
|
||||
</div>
|
||||
<div class="status-section-title">发送静默(只听不发)</div>
|
||||
<div class="input-group" style="margin-bottom:12px;flex-wrap:wrap;">
|
||||
<button class="btn btn-outline btn-sm" id="btnSilent0" type="button" title="切换 CH0 只听不发">CH0 只听不发</button>
|
||||
<button class="btn btn-outline btn-sm" id="btnSilent1" type="button" title="切换 CH1 只听不发">CH1 只听不发</button>
|
||||
<button class="btn btn-outline btn-sm" id="btnSilent2" type="button" title="切换 CH2 只听不发">CH2 只听不发</button>
|
||||
</div>
|
||||
<div class="helper-note" style="margin-bottom:14px;">
|
||||
只听不发=把该通道收发器的驱动器关掉(GD32 拉高 S 脚),<b>接收与上报照常</b>;按钮高亮表示当前正处于只听不发,状态来自 1Hz 反馈的 <code>bus_state</code> bit5,不是本地猜测。静默期间该通道发送会被拒绝(错误码 0xE6),上电后默认不静默。
|
||||
</div>
|
||||
<div class="helper-note" id="monHelper" style="margin-bottom:14px;">
|
||||
地址与顶栏一致;1Hz <code>/can/feedback</code>。悬停抽屉保持展开。
|
||||
</div>
|
||||
@@ -329,6 +338,6 @@
|
||||
<span id="toastMsg">操作成功</span>
|
||||
</div>
|
||||
|
||||
<script type="module" src="../js/can.js?v=20260919a"></script>
|
||||
<script type="module" src="../js/can.js?v=20261010a"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
+27
-6
@@ -7,9 +7,9 @@
|
||||
<!-- 空 favicon:阻止浏览器自动请求 /favicon.ico(本地静态服务无此文件会 404) -->
|
||||
<link rel="icon" href="data:,">
|
||||
<link rel="stylesheet" href="../css/base.css?v=857f83a5">
|
||||
<link rel="stylesheet" href="../css/layout.css?v=acd17001">
|
||||
<link rel="stylesheet" href="../css/layout.css?v=20260926a">
|
||||
<link rel="stylesheet" href="../css/components.css?v=quiet20260919a">
|
||||
<link rel="stylesheet" href="../css/can.css?v=c06f5688">
|
||||
<link rel="stylesheet" href="../css/can.css?v=20260926a">
|
||||
<link rel="stylesheet" href="../css/responsive.css?v=quiet20260919a">
|
||||
</head>
|
||||
<body class="can-page">
|
||||
@@ -17,11 +17,24 @@
|
||||
|
||||
<header class="header-bar can-header">
|
||||
<div class="header-brand">
|
||||
<span class="dot-mark"></span>
|
||||
<strong>ESP32 CAN 接收监控</strong>
|
||||
<span class="brand-logo" aria-hidden="true">
|
||||
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
|
||||
<rect x="6" y="6" width="12" height="12" rx="2.5"/>
|
||||
<rect x="9.5" y="9.5" width="5" height="5" rx="1" fill="currentColor" stroke="none" opacity=".85"/>
|
||||
<path d="M9 2v3M15 2v3M9 19v3M15 19v3M2 9h3M2 15h3M19 9h3M19 15h3"/>
|
||||
</svg>
|
||||
</span>
|
||||
<div class="brand-text">
|
||||
<strong>ESP32 CAN 接收监控</strong>
|
||||
<span class="brand-sub">DCU · Robot_v2 · CAN FD</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="header-status">
|
||||
<span class="pill offline" id="monConnPill"><span class="indicator"></span><span id="monConnTxt">未连接</span></span>
|
||||
<span class="pill offline link-pill" id="canNetPill" title="ESP32 WiFi(/system/status)">
|
||||
<span class="indicator"></span><span id="canNetTxt">未连接</span>
|
||||
</span>
|
||||
<span class="pill" id="canUptimePill">运行 --</span>
|
||||
<span class="pill" id="canVersionPill">v--</span>
|
||||
<span class="pill" id="fbModePill">模式: --</span>
|
||||
<span class="pill" id="fbPollStatus">轮询: 待连接</span>
|
||||
</div>
|
||||
@@ -51,6 +64,14 @@
|
||||
<button class="btn btn-outline btn-sm" id="btnModeBridge" type="button" title="CAN0 收到的每一帧按原帧格式自动转发到 CAN1 与 CAN2">CAN0→1/2 桥接</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="can-toolbar-block">
|
||||
<label class="form-label">发送静默(只听不发)</label>
|
||||
<div class="input-group">
|
||||
<button class="btn btn-outline btn-sm" id="btnSilent0" type="button" title="切换 CH0 只听不发">CH0 只听不发</button>
|
||||
<button class="btn btn-outline btn-sm" id="btnSilent1" type="button" title="切换 CH1 只听不发">CH1 只听不发</button>
|
||||
<button class="btn btn-outline btn-sm" id="btnSilent2" type="button" title="切换 CH2 只听不发">CH2 只听不发</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="can-toolbar-foot">
|
||||
<div class="conn-indicator err" id="monConnIndicator">
|
||||
@@ -184,6 +205,6 @@
|
||||
<span id="toastMsg">操作成功</span>
|
||||
</div>
|
||||
|
||||
<script type="module" src="../js/can_monitor.js?v=20260919a"></script>
|
||||
<script type="module" src="../js/can_monitor.js?v=20261010a"></script>
|
||||
</body>
|
||||
</html>
|
||||
+621
-584
File diff suppressed because it is too large
Load Diff
+3
-3
@@ -286,8 +286,8 @@
|
||||
<button id="otaLogClearBtn" title="清空日志">清空</button>
|
||||
</div>
|
||||
<div class="ota-log" id="otaLog" aria-live="polite">
|
||||
<div class="log-info">[就绪] 电机 Bootloader OTA · 先上传固件到 ESP32 → 发 0x000N0000 进 BOOT → 触发转发 → GD32 本地 relay(AES-128 + CAN stop-and-wait)</div>
|
||||
<div>[信息] 选固件 → 上传并比对 flash SHA-256(失败重传≤2次)→ 发进BOOT命令 → 触发 /motor/ota/relay → GD32 完成握手/加密/传输 · 每包 48 B · 48 KB 上限</div>
|
||||
<div class="log-info">[就绪] 电机 Bootloader OTA · 固件先灌进 GD32 → 发 0x000N0000 进 BOOT → GD32 本地 relay(AES-128 + CAN stop-and-wait)· 每包 48 B · 48 KB 上限</div>
|
||||
<div>[信息] 进料与完整性核对按链路不同:<b>WiFi</b> = 上传到 ESP32,设备从 flash 读回算 SHA-256 与本地比对,再经 SPI 喂给 GD32;进 BOOT 帧由本页发。<b>EtherCAT</b> = 经 CoE 邮箱 0x2511 灌进 GD32 的 48KB 暂存区,分块 CRC32 + 整镜像 CRC32 由<b>从站在电机进 BOOT 之前</b>核对;进 BOOT 帧由 GD32 在已独占的通道上自己发(运动帧被通道锁挡住)。只插网线也能刷。两条链路共用同一个 GD32 引擎;刷写期间本链路的过程数据与轮询会暂停,其他电机也收不到运动指令。</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 命令序列 TAB -->
|
||||
@@ -430,7 +430,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="module" src="../js/motor/main.js?v=20260924g"></script>
|
||||
<script type="module" src="../js/motor/main.js?v=20261011b"></script>
|
||||
|
||||
<!-- 单独打开本页(不在标签外壳里)时, 由本页自己持有 app 租约 -->
|
||||
<script src="../js/common/app-lease.js"></script>
|
||||
|
||||
Reference in New Issue
Block a user