From 6f1b3c2706e405d91d42d3507ed4cd4be17b6f57 Mon Sep 17 00:00:00 2001 From: cbb <2625274797@qq.com> Date: Wed, 16 Sep 2026 12:26:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(pm):=20pmHold=20=E5=B9=82=E7=AD=89=EF=BC=8C?= =?UTF-8?q?=E6=B8=85=E9=86=92=E8=BD=AE=E8=AF=A2=E4=B8=8D=E5=86=8D=E6=AF=8F?= =?UTF-8?q?=202s=20=E6=89=93=E3=80=8C=E8=B1=81=E5=85=8D=E8=A7=A3=E9=99=A4?= =?UTF-8?q?=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pollOnce 每 2s 调 markAwake();原先无脑 pmHold(0) 会重复 POST 并刷日志。 现跟踪 pmHoldOn,仅在状态翻转时发请求并记一行。 --- lab/lan9252_pm.html | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lab/lan9252_pm.html b/lab/lan9252_pm.html index 74ffd64..90039cb 100644 --- a/lab/lan9252_pm.html +++ b/lab/lan9252_pm.html @@ -327,11 +327,15 @@ * 事务本身会唤醒睡眠中的芯片,轮询等于不停叫醒它);连败 3 次标红停轮。 * pollGen:丢弃 enterMode/唤醒 之后仍在途的过期 1E 响应,避免竞态覆盖 UI。 ---- */ var pollFail = 0, pollTimer = null, pollPaused = false, pollGen = 0; + /** 主站看门狗豁免是否已置位(pmHold 幂等,防 2s 轮询刷屏) */ + var pmHoldOn = false; function bumpPollGen() { return ++pollGen; } /* 仅在确认芯片已离开睡眠(唤醒成功 / 读到 SLEEP_EN=0 / NRST)时清 flag */ function markAwake() { clearSleepFlag(); - pmHold(0); /* 芯片已醒:解除主站看门狗豁免,恢复正常自愈 */ + /* 只在「之前置过豁免」时才解除:pollOnce 每 2s 调本函数, + * 无脑 pmHold(0) 会把「主站看门狗豁免解除」刷屏。 */ + if (pmHoldOn) pmHold(0); $("sleepBanner").textContent = "🌙 芯片处于低功耗档 —— EtherCAT 通信已中断,点「手动唤醒」恢复"; } @@ -431,11 +435,14 @@ * 即被偷偷拉回 OP——2026-09-12 实测休眠 ~20s 自动"复活")。解除时主站 * 自带 60s 冷却,让本页唤醒流程先走完。best-effort:native 未起只记日志。 */ function pmHold(on) { - return ecatPost("pm/hold", { on: on }, 5000).then(function (r) { - log("主站看门狗豁免" + (on ? "置位" : "解除") + + var want = !!on; + if (pmHoldOn === want) return Promise.resolve(); + return ecatPost("pm/hold", { on: want }, 5000).then(function (r) { + if (r.ok) pmHoldOn = want; + log("主站看门狗豁免" + (want ? "置位" : "解除") + (r.ok ? "" : "失败: " + r.log.join(";")), r.ok ? "ok" : "warn"); }).catch(function (e) { - log("主站看门狗豁免" + (on ? "置位" : "解除") + "失败: " + e.message, "warn"); + log("主站看门狗豁免" + (want ? "置位" : "解除") + "失败: " + e.message, "warn"); }); } function ecatEnsureOpen() {