feat: show delay reason/status from CRN NBT on monitor
This commit is contained in:
+47
-7
@@ -2,7 +2,7 @@
|
|||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
-- 1. Configuration & Constants
|
-- 1. Configuration & Constants
|
||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
local APP_VERSION_TEXT = "v1.0.28"
|
local APP_VERSION_TEXT = "v1.0.29"
|
||||||
|
|
||||||
local CONFIG = {
|
local CONFIG = {
|
||||||
CLOUD_URL = "ws://stabadmin.fse-media.group",
|
CLOUD_URL = "ws://stabadmin.fse-media.group",
|
||||||
@@ -2134,7 +2134,7 @@ function Display.render()
|
|||||||
mon.setTextColor(COLORS.DEBUG)
|
mon.setTextColor(COLORS.DEBUG)
|
||||||
mon.setCursorPos(1, upcomingStartY)
|
mon.setCursorPos(1, upcomingStartY)
|
||||||
mon.write("UPCOMING TRAINS:")
|
mon.write("UPCOMING TRAINS:")
|
||||||
if State.debugUpcoming and upcomingStartY + 1 <= h then
|
if CONFIG.DEBUG and State.debugUpcoming and upcomingStartY + 1 <= h then
|
||||||
mon.setCursorPos(1, upcomingStartY + 1)
|
mon.setCursorPos(1, upcomingStartY + 1)
|
||||||
mon.setTextColor(COLORS.DEBUG)
|
mon.setTextColor(COLORS.DEBUG)
|
||||||
local dbg = State.debugUpcoming
|
local dbg = State.debugUpcoming
|
||||||
@@ -2155,8 +2155,20 @@ function Display.render()
|
|||||||
for i = 1, visibleCount do
|
for i = 1, visibleCount do
|
||||||
local t = State.upcomingTrains[i]
|
local t = State.upcomingTrains[i]
|
||||||
mon.setCursorPos(1, upcomingStartY + i)
|
mon.setCursorPos(1, upcomingStartY + i)
|
||||||
local delayStr = t.delay > 0 and (" [+" .. t.delay .. "m]") or ""
|
local suffix = ""
|
||||||
local lineText = string.format("%s->%s ETA:%ds%s", t.trainName, t.dest, t.eta, delayStr)
|
if t.cancelled then
|
||||||
|
suffix = " [CANCEL]"
|
||||||
|
elseif (tonumber(t.delay) or 0) > 0 then
|
||||||
|
local reason = t.reason and (" " .. tostring(t.reason)) or ""
|
||||||
|
suffix = " [+" .. tostring(t.delay) .. "m" .. reason .. "]"
|
||||||
|
elseif t.reason then
|
||||||
|
suffix = " [" .. tostring(t.reason) .. "]"
|
||||||
|
end
|
||||||
|
local pfx = ""
|
||||||
|
if t.platform and tostring(t.platform) ~= "" then
|
||||||
|
pfx = "P" .. tostring(t.platform) .. " "
|
||||||
|
end
|
||||||
|
local lineText = string.format("%s%s->%s ETA:%ds%s", pfx, t.trainName, t.dest, t.eta, suffix)
|
||||||
if #lineText > w then lineText = lineText:sub(1, w) end
|
if #lineText > w then lineText = lineText:sub(1, w) end
|
||||||
mon.write(lineText)
|
mon.write(lineText)
|
||||||
end
|
end
|
||||||
@@ -2164,7 +2176,7 @@ function Display.render()
|
|||||||
else
|
else
|
||||||
mon.setTextColor(COLORS.WARNING)
|
mon.setTextColor(COLORS.WARNING)
|
||||||
local msgY = upcomingStartY + 1
|
local msgY = upcomingStartY + 1
|
||||||
if State.debugUpcoming then msgY = upcomingStartY + 2 end
|
if CONFIG.DEBUG and State.debugUpcoming then msgY = upcomingStartY + 2 end
|
||||||
if msgY <= h then
|
if msgY <= h then
|
||||||
mon.setCursorPos(1, msgY)
|
mon.setCursorPos(1, msgY)
|
||||||
mon.write("NONE / WAITING DATA")
|
mon.write("NONE / WAITING DATA")
|
||||||
@@ -2355,6 +2367,30 @@ function Main.loop()
|
|||||||
local trainName = st.TrainName or "Unknown"
|
local trainName = st.TrainName or "Unknown"
|
||||||
local destination = st.Destination or "Unknown"
|
local destination = st.Destination or "Unknown"
|
||||||
local platform = stop.StationInfo and stop.StationInfo.Platform or State.stationPlatform or "1"
|
local platform = stop.StationInfo and stop.StationInfo.Platform or State.stationPlatform or "1"
|
||||||
|
local cancelled = false
|
||||||
|
local reason = nil
|
||||||
|
local tr = stop.Train
|
||||||
|
if tr then
|
||||||
|
cancelled = tr.Cancelled == 1 or tr.Cancelled == true
|
||||||
|
local status = tr.Status
|
||||||
|
if type(status) == "table" then
|
||||||
|
for _, s in ipairs(status) do
|
||||||
|
if type(s) == "string" then
|
||||||
|
if string.find(s, "delay_from_previous_journey", 1, true) then
|
||||||
|
reason = "prev"
|
||||||
|
elseif string.find(s, "cancel", 1, true) then
|
||||||
|
reason = "cancel"
|
||||||
|
else
|
||||||
|
local tail = string.match(s, ":(.+)$")
|
||||||
|
reason = tail or s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if cancelled then
|
||||||
|
reason = "cancelled"
|
||||||
|
end
|
||||||
|
|
||||||
-- Calculate ETA in seconds using interpolated currentTick
|
-- Calculate ETA in seconds using interpolated currentTick
|
||||||
local scheduledArrival = st.ScheduledArrival or 0
|
local scheduledArrival = st.ScheduledArrival or 0
|
||||||
@@ -2373,7 +2409,9 @@ function Main.loop()
|
|||||||
dest = destination,
|
dest = destination,
|
||||||
platform = platform,
|
platform = platform,
|
||||||
eta = etaSeconds,
|
eta = etaSeconds,
|
||||||
delay = delayMinutes
|
delay = delayMinutes,
|
||||||
|
cancelled = cancelled,
|
||||||
|
reason = reason
|
||||||
})
|
})
|
||||||
|
|
||||||
if etaSeconds >= 0 and etaSeconds <= 45 then
|
if etaSeconds >= 0 and etaSeconds <= 45 then
|
||||||
@@ -2453,7 +2491,9 @@ function Main.loop()
|
|||||||
dest = dest,
|
dest = dest,
|
||||||
platform = platform or State.stationPlatform or "1",
|
platform = platform or State.stationPlatform or "1",
|
||||||
eta = etaSeconds >= 0 and etaSeconds or 0,
|
eta = etaSeconds >= 0 and etaSeconds or 0,
|
||||||
delay = delay
|
delay = delay,
|
||||||
|
cancelled = false,
|
||||||
|
reason = nil
|
||||||
})
|
})
|
||||||
|
|
||||||
-- 触发逻辑:当 ETA 已经明确 <= 45秒(包括30秒、15秒、现在等),且之前没有播报过
|
-- 触发逻辑:当 ETA 已经明确 <= 45秒(包括30秒、15秒、现在等),且之前没有播报过
|
||||||
|
|||||||
Reference in New Issue
Block a user