From 9f2dc5bb3d9a43f6141129c5a0c8517ae496719a Mon Sep 17 00:00:00 2001 From: HenryDu8133 <813367384@qq.com> Date: Sun, 2 Aug 2026 17:00:24 +0800 Subject: [PATCH] debug: compare text and NBT ETA keys on monitor --- debug-eta-stopover-bug.md | 24 +++++++++++++++++++++ station_broadcast.lua | 44 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 debug-eta-stopover-bug.md diff --git a/debug-eta-stopover-bug.md b/debug-eta-stopover-bug.md new file mode 100644 index 0000000..c9b870c --- /dev/null +++ b/debug-eta-stopover-bug.md @@ -0,0 +1,24 @@ +# Debug Session: eta-stopover-bug +- **Status**: [OPEN] +- **Issue**: 列车进站 ETA 仍然包含停站时间;终点站显示已正确,但 ETA 仍偏大。 +- **Debug Server**: N/A +- **Log File**: N/A + +## Reproduction Steps +1. 在发车牌和 Block Reader 都正常连接的情况下运行 `station_broadcast.lua` +2. 观察 `UPCOMING TRAINS` 的 ETA +3. 与 CRN 发车牌原始 ETA 对比 + +## Hypotheses & Verification +| ID | Hypothesis | Likelihood | Effort | Evidence | +|----|------------|------------|--------|----------| +| A | NBT 侧生成的 `announceKey` 仍未与 `create_target` 文本键完全匹配,导致没有走文本 ETA 覆盖 | High | Low | Pending | +| B | `create_target` 文本里解析出的 ETA 本身就是“到发后/含停站”的字段,而不是进站前 ETA | Medium | Low | Pending | +| C | 文本解析到了正确 ETA,但后来又被 NBT 计算值覆盖 | Medium | Low | Pending | +| D | 同一班车在 NBT 与文本中的目的地/车次格式仍有额外差异(空格、平台、后缀) | High | Low | Pending | + +## Log Evidence +- Pending instrumentation + +## Verification Conclusion +- Pending diff --git a/station_broadcast.lua b/station_broadcast.lua index 67be297..a847ae0 100644 --- a/station_broadcast.lua +++ b/station_broadcast.lua @@ -2149,7 +2149,28 @@ function Display.render() ) if #dbgLine > w then dbgLine = dbgLine:sub(1, w) end mon.write(dbgLine) - logsStartY = upcomingStartY + 2 + if upcomingStartY + 2 <= h then + mon.setCursorPos(1, upcomingStartY + 2) + local keyLine = string.format( + "TK:%s NK:%s", + tostring(dbg.textKey or "-"), + tostring(dbg.nbtKey or "-") + ) + if #keyLine > w then keyLine = keyLine:sub(1, w) end + mon.write(keyLine) + end + if upcomingStartY + 3 <= h then + mon.setCursorPos(1, upcomingStartY + 3) + local etaLine = string.format( + "TXT:%s NBT:%s USE:%s", + tostring(dbg.textEta or "-"), + tostring(dbg.nbtEta or "-"), + tostring(dbg.usedEta or "-") + ) + if #etaLine > w then etaLine = etaLine:sub(1, w) end + mon.write(etaLine) + end + logsStartY = upcomingStartY + 4 end if hasUpcoming then mon.setTextColor(COLORS.INFO) @@ -2337,7 +2358,12 @@ function Main.loop() hasCT = Peripherals.createTarget ~= nil, ok = false, trainStopsCount = 0, - tickRate = State.tickRate or 20 + tickRate = State.tickRate or 20, + textKey = nil, + nbtKey = nil, + textEta = nil, + nbtEta = nil, + usedEta = nil } -- Prefer CRN's own ETA display text (create_target) when available. @@ -2373,7 +2399,12 @@ function Main.loop() end end if dest then - etaByText[tName .. "_" .. dest] = etaSeconds + local textKey = tName .. "_" .. dest + etaByText[textKey] = etaSeconds + if not dbg.textKey then + dbg.textKey = textKey + dbg.textEta = etaSeconds + end end end end @@ -2459,10 +2490,17 @@ function Main.loop() local etaSeconds = math.floor(etaTicks / (State.tickRate or 20)) if etaSeconds < 0 then etaSeconds = 0 end local announceKey = trainName .. "_" .. destination + if not dbg.nbtKey then + dbg.nbtKey = announceKey + dbg.nbtEta = etaSeconds + end local textEta = etaByText[announceKey] if type(textEta) == "number" and textEta >= 0 then etaSeconds = textEta end + if not dbg.usedEta then + dbg.usedEta = etaSeconds + end -- Calculate Delay in minutes local delayTicks = realArrival - scheduledArrival