Compare commits

...

6 Commits

Author SHA1 Message Date
Mikayla Fischler
db1b90df90 #647 cleanup/optimizations 2025-11-15 23:37:51 -05:00
Mikayla Fischler
ebfdec2294 #647 coordinator status light functionality 2025-11-15 23:37:34 -05:00
Mikayla Fischler
68ae061ed3 #647 rtu gateway status light functionality 2025-11-15 23:06:04 -05:00
Mikayla Fischler
7f951a985b #647 supervisor status light functionality 2025-11-15 23:05:36 -05:00
Mikayla Fischler
965fa0c7d1 #647 fixes to reactor PLC status light 2025-11-15 23:05:04 -05:00
Mikayla Fischler
99742c621a #647 updated reactor PLC status indicator to also reflect coroutine health 2025-11-15 17:23:36 -05:00
12 changed files with 125 additions and 25 deletions

View File

@@ -33,6 +33,15 @@ local HIGH_RTT = 1500 -- 3.33x as long as expected w/ 0 ping
local iocontrol = {}
local _ioctl = {
-- connection states for status evaluation
wd_modem = true,
wl_modem = true,
speaker = true,
monitor_states = {},
coroutines = {}
}
---@class ioctl
local io = {
---@class ioctl_front_panel
@@ -279,6 +288,15 @@ end
--#region Front Panel PSIL
-- evaluate and publish system health status
local function fp_eval_status()
local ok = _ioctl.wd_modem and _ioctl.wl_modem and _ioctl.speaker
for _, v in pairs(_ioctl.monitor_states) do ok = ok and v end
for _, v in pairs(_ioctl.coroutines) do ok = ok and v end
io.fp.ps.publish("status", ok)
end
-- toggle heartbeat indicator
function iocontrol.heartbeat() io.fp.ps.toggle("heartbeat") end
@@ -292,15 +310,30 @@ end
-- report presence of the wired comms modem
---@param has_modem boolean
function iocontrol.fp_has_wd_modem(has_modem) io.fp.ps.publish("has_wd_modem", has_modem) end
function iocontrol.fp_has_wd_modem(has_modem)
io.fp.ps.publish("has_wd_modem", has_modem)
_ioctl.wd_modem = has_modem
fp_eval_status()
end
-- report presence of the wireless comms modem
---@param has_modem boolean
function iocontrol.fp_has_wl_modem(has_modem) io.fp.ps.publish("has_wl_modem", has_modem) end
function iocontrol.fp_has_wl_modem(has_modem)
io.fp.ps.publish("has_wl_modem", has_modem)
_ioctl.wl_modem = has_modem
fp_eval_status()
end
-- report presence of the speaker
---@param has_speaker boolean
function iocontrol.fp_has_speaker(has_speaker) io.fp.ps.publish("has_speaker", has_speaker) end
function iocontrol.fp_has_speaker(has_speaker)
io.fp.ps.publish("has_speaker", has_speaker)
_ioctl.speaker = has_speaker
fp_eval_status()
end
-- report supervisor link state
---@param state integer
@@ -322,6 +355,9 @@ function iocontrol.fp_monitor_state(id, connected)
if name ~= nil then
io.fp.ps.publish(name, connected)
_ioctl.monitor_states[name] = connected ~= 1
fp_eval_status()
end
end
@@ -329,7 +365,12 @@ end
---@param thread string thread name
---@param ok boolean thread state
function iocontrol.fp_rt_status(thread, ok)
io.fp.ps.publish(util.c("routine__", thread), ok)
local name = util.c("routine__", thread)
io.fp.ps.publish(name, ok)
_ioctl.coroutines[name] = ok
fp_eval_status()
end
-- report PKT firmware version and PKT session connection state

View File

@@ -20,7 +20,7 @@ local renderer = require("coordinator.renderer")
local sounder = require("coordinator.sounder")
local threads = require("coordinator.threads")
local COORDINATOR_VERSION = "v1.7.0"
local COORDINATOR_VERSION = "v1.7.1"
local CHUNK_LOAD_DELAY_S = 30.0

View File

@@ -59,9 +59,9 @@ local function init(panel, config)
local status = LED{parent=system,label="STATUS",colors=cpair(colors.green,colors.red)}
local heartbeat = LED{parent=system,label="HEARTBEAT",colors=led_grn}
status.update(true)
system.line_break()
status.register(ps, "status", status.update)
heartbeat.register(ps, "heartbeat", heartbeat.update)
if config.WirelessModem and config.WiredModem then

View File

@@ -11,11 +11,22 @@ local databus = {}
-- databus PSIL
databus.ps = psil.create()
local dbus_iface = {
local _dbus = {
rps_scram = function () log.debug("DBUS: unset rps_scram() called") end,
rps_reset = function () log.debug("DBUS: unset rps_reset() called") end
rps_reset = function () log.debug("DBUS: unset rps_reset() called") end,
degraded = false,
coroutines = {}
}
-- evaluate and publish system health status
local function eval_status()
local ok = not _dbus.degraded
for _, v in pairs(_dbus.coroutines) do ok = ok and v end
databus.ps.publish("status", ok)
end
-- call to toggle heartbeat signal
function databus.heartbeat() databus.ps.toggle("heartbeat") end
@@ -23,15 +34,15 @@ function databus.heartbeat() databus.ps.toggle("heartbeat") end
---@param scram function reactor SCRAM function
---@param reset function RPS reset function
function databus.link_rps(scram, reset)
dbus_iface.rps_scram = scram
dbus_iface.rps_reset = reset
_dbus.rps_scram = scram
_dbus.rps_reset = reset
end
-- transmit a command to the RPS to SCRAM
function databus.rps_scram() dbus_iface.rps_scram() end
function databus.rps_scram() _dbus.rps_scram() end
-- transmit a command to the RPS to reset
function databus.rps_reset() dbus_iface.rps_reset() end
function databus.rps_reset() _dbus.rps_reset() end
-- transmit firmware versions
---@param plc_v string PLC version
@@ -50,17 +61,24 @@ end
-- transmit hardware status
---@param plc_state plc_state
function databus.tx_hw_status(plc_state)
databus.ps.publish("degraded", plc_state.degraded)
databus.ps.publish("reactor_dev_state", util.trinary(plc_state.no_reactor, 1, util.trinary(plc_state.reactor_formed, 3, 2)))
databus.ps.publish("has_wd_modem", plc_state.wd_modem)
databus.ps.publish("has_wl_modem", plc_state.wl_modem)
_dbus.degraded = plc_state.degraded
eval_status()
end
-- transmit thread (routine) statuses
---@param thread string thread name
---@param ok boolean thread state
function databus.tx_rt_status(thread, ok)
databus.ps.publish(util.c("routine__", thread), ok)
local name = util.c("routine__", thread)
databus.ps.publish(name, ok)
_dbus.coroutines[name] = ok
eval_status()
end
-- transmit supervisor link state

View File

@@ -50,11 +50,11 @@ local function init(panel, config)
local system = Div{parent=panel,width=14,height=18,x=2,y=3}
local degraded = LED{parent=system,label="STATUS",colors=cpair(colors.red,colors.green)}
local sys_status = LED{parent=system,label="STATUS",colors=cpair(colors.green,colors.red)}
local heartbeat = LED{parent=system,label="HEARTBEAT",colors=ind_grn}
system.line_break()
degraded.register(databus.ps, "degraded", degraded.update)
sys_status.register(databus.ps, "status", sys_status.update)
heartbeat.register(databus.ps, "heartbeat", heartbeat.update)
local reactor = LEDPair{parent=system,label="REACTOR",off=colors.red,c1=colors.yellow,c2=colors.green}

View File

@@ -19,7 +19,7 @@ local plc = require("reactor-plc.plc")
local renderer = require("reactor-plc.renderer")
local threads = require("reactor-plc.threads")
local R_PLC_VERSION = "v1.10.0"
local R_PLC_VERSION = "v1.10.2"
local println = util.println
local println_ts = util.println_ts

View File

@@ -7,6 +7,20 @@ local util = require("scada-common.util")
local databus = {}
local _dbus = {
wd_modem = true,
wl_modem = true,
coroutines = {}
}
-- evaluate and publish system health status
local function eval_status()
local ok = _dbus.wd_modem and _dbus.wl_modem
for _, v in pairs(_dbus.coroutines) do ok = ok and v end
databus.ps.publish("status", ok)
end
-- databus PSIL
databus.ps = psil.create()
@@ -35,12 +49,18 @@ end
---@param has_modem boolean
function databus.tx_hw_wd_modem(has_modem)
databus.ps.publish("has_wd_modem", has_modem)
_dbus.wd_modem = has_modem
eval_status()
end
-- transmit hardware status for the wireless comms modem
---@param has_modem boolean
function databus.tx_hw_wl_modem(has_modem)
databus.ps.publish("has_wl_modem", has_modem)
_dbus.wl_modem = has_modem
eval_status()
end
-- transmit the number of speakers connected
@@ -67,7 +87,12 @@ end
---@param thread string thread name
---@param ok boolean thread state
function databus.tx_rt_status(thread, ok)
databus.ps.publish(util.c("routine__", thread), ok)
local name = util.c("routine__", thread)
databus.ps.publish(name, ok)
_dbus.coroutines[name] = ok
eval_status()
end
-- transmit supervisor link state

View File

@@ -51,11 +51,11 @@ local function init(panel, config, units)
local system = Div{parent=panel,width=14,height=term_h-5,x=2,y=3}
local on = LED{parent=system,label="STATUS",colors=cpair(colors.green,colors.red)}
local status = LED{parent=system,label="STATUS",colors=cpair(colors.green,colors.red)}
local heartbeat = LED{parent=system,label="HEARTBEAT",colors=ind_grn}
on.update(true)
system.line_break()
status.register(databus.ps, "status", status.update)
heartbeat.register(databus.ps, "heartbeat", heartbeat.update)
if config.WirelessModem and config.WiredModem then

View File

@@ -21,7 +21,7 @@ local rtu = require("rtu.rtu")
local threads = require("rtu.threads")
local uinit = require("rtu.uinit")
local RTU_VERSION = "v1.13.0"
local RTU_VERSION = "v1.13.1"
local println = util.println
local println_ts = util.println_ts

View File

@@ -6,10 +6,20 @@ local const = require("scada-common.constants")
local psil = require("scada-common.psil")
local util = require("scada-common.util")
local pgi = require("supervisor.panel.pgi")
local pgi = require("supervisor.panel.pgi")
local databus = {}
local _dbus = {
wd_modem = true,
wl_modem = true
}
-- evaluate and publish system health status
local function eval_status()
databus.ps.publish("status", _dbus.wd_modem and _dbus.wl_modem)
end
-- databus PSIL
databus.ps = psil.create()
@@ -28,12 +38,18 @@ end
---@param has_modem boolean
function databus.tx_hw_wd_modem(has_modem)
databus.ps.publish("has_wd_modem", has_modem)
_dbus.wd_modem = has_modem
eval_status()
end
-- transmit hardware status for the wireless comms modem
---@param has_modem boolean
function databus.tx_hw_wl_modem(has_modem)
databus.ps.publish("has_wl_modem", has_modem)
_dbus.wl_modem = has_modem
eval_status()
end
-- transmit PLC firmware version and session connection state

View File

@@ -58,11 +58,11 @@ local function init(panel, config)
local system = Div{parent=main_page,width=18,height=17,x=2,y=2}
local on = LED{parent=system,label="STATUS",colors=cpair(colors.green,colors.red)}
local status = LED{parent=system,label="STATUS",colors=cpair(colors.green,colors.red)}
local heartbeat = LED{parent=system,label="HEARTBEAT",colors=ind_grn}
on.update(true)
system.line_break()
status.register(databus.ps, "status", status.update)
heartbeat.register(databus.ps, "heartbeat", heartbeat.update)
if config.WirelessModem and config.WiredModem then

View File

@@ -24,7 +24,7 @@ local supervisor = require("supervisor.supervisor")
local svsessions = require("supervisor.session.svsessions")
local SUPERVISOR_VERSION = "v1.8.0"
local SUPERVISOR_VERSION = "v1.8.1"
local println = util.println
local println_ts = util.println_ts