feat: display upcoming trains and delay info on monitor

This commit is contained in:
2026-08-02 16:07:48 +08:00
parent e92348b4db
commit ad70f4adbc
+37
View File
@@ -2101,6 +2101,23 @@ function Display.render()
end
end
-- Upcoming Trains
if State.upcomingTrains and #State.upcomingTrains > 0 then
local startY = State.currentTrain and 11 or 7
mon.setCursorPos(1, startY)
mon.setTextColor(COLORS.DEBUG)
mon.write("UPCOMING TRAINS:")
mon.setTextColor(COLORS.INFO)
for i = 1, math.min(3, #State.upcomingTrains) do
local t = State.upcomingTrains[i]
mon.setCursorPos(1, startY + i)
local delayStr = t.delay > 0 and (" [+" .. t.delay .. "m]") or ""
local lineText = string.format("%s->%s ETA:%ds%s", t.trainName, t.dest, t.eta, delayStr)
if #lineText > w then lineText = lineText:sub(1, w) end
mon.write(lineText)
end
end
-- Logs
local y = h - 3
for i = 1, 3 do
@@ -2242,6 +2259,7 @@ State.pendingApproaching = {}
function Main.loop()
while true do
local now = os.epoch("utc")
local newUpcoming = {}
-- Check Block Reader (Advanced Peripherals) first for precise ETA and Delay
if Peripherals.blockReader then
@@ -2273,12 +2291,21 @@ function Main.loop()
local realArrival = st.RealTimeArrival or 0
local etaTicks = realArrival - currentTick
local etaSeconds = math.floor(etaTicks / 20)
if etaSeconds < 0 then etaSeconds = 0 end
-- Calculate Delay in minutes
local delayTicks = realArrival - scheduledArrival
local delayMinutes = math.floor(delayTicks / (20 * 60))
if delayMinutes < 0 then delayMinutes = 0 end
table.insert(newUpcoming, {
trainName = trainName,
dest = destination,
platform = platform,
eta = etaSeconds,
delay = delayMinutes
})
if etaSeconds >= 0 and etaSeconds <= 45 then
local announceKey = trainName .. "_" .. destination
if not State.announcedApproaching[announceKey] then
@@ -2348,6 +2375,14 @@ function Main.loop()
end
end
end
table.insert(newUpcoming, {
trainName = tName,
dest = dest,
platform = platform or State.stationPlatform or "1",
eta = etaSeconds >= 0 and etaSeconds or 0,
delay = delay
})
-- 触发逻辑:当 ETA 已经明确 <= 45秒(包括30秒、15秒、现在等),且之前没有播报过
if etaSeconds >= 0 and etaSeconds <= 45 then
@@ -2374,6 +2409,7 @@ function Main.loop()
if not Peripherals.station then
State.currentTrain = nil
State.upcomingTrains = newUpcoming
Display.render()
Display.renderTerminal()
os.sleep(0.5)
@@ -2436,6 +2472,7 @@ function Main.loop()
end
end
State.upcomingTrains = newUpcoming
Display.render()
Display.renderTerminal()
os.sleep(0.5)