#182 linked up PLC front panel indicators, cleaned up panel display and added flashing to RPS trip

This commit is contained in:
Mikayla Fischler
2023-04-08 16:49:54 -04:00
parent 9bc4f0f7a6
commit 4aad591d3a
10 changed files with 293 additions and 116 deletions

View File

@@ -1,15 +1,13 @@
local log = require("scada-common.log")
local mqueue = require("scada-common.mqueue")
local ppm = require("scada-common.ppm")
local util = require("scada-common.util")
local log = require("scada-common.log")
local mqueue = require("scada-common.mqueue")
local ppm = require("scada-common.ppm")
local tcallbackdsp = require("scada-common.tcallbackdsp")
local util = require("scada-common.util")
local databus = require("reactor-plc.databus")
local threads = {}
local print = util.print
local println = util.println
local print_ts = util.print_ts
local println_ts = util.println_ts
local MAIN_CLOCK = 0.5 -- (2Hz, 10 ticks)
local RPS_SLEEP = 250 -- (250ms, 5 ticks)
local COMMS_SLEEP = 150 -- (150ms, 3 ticks)
@@ -32,11 +30,16 @@ local MQ__COMM_CMD = {
---@param smem plc_shared_memory
---@param init function
function threads.thread__main(smem, init)
-- print a log message to the terminal as long as the UI isn't running
local function println(message) if not smem.plc_state.fp_ok then util.println(message) end end
local function println_ts(message) if not smem.plc_state.fp_ok then util.println_ts(message) end end
---@class parallel_thread
local public = {}
-- execute thread
function public.exec()
databus.tx_rt_status("main", true)
log.debug("main thread init, clock inactive")
-- send status updates at 2Hz (every 10 server ticks) (every loop tick)
@@ -61,6 +64,9 @@ function threads.thread__main(smem, init)
-- handle event
if event == "timer" and loop_clock.is_clock(param1) then
-- blink heartbeat indicator
databus.heartbeat()
-- core clock tick
if networked then
-- start next clock timer
@@ -72,7 +78,6 @@ function threads.thread__main(smem, init)
smem.q.mq_comms_tx.push_command(MQ__COMM_CMD.SEND_STATUS)
else
if ticks_to_update == 0 then
smem.fp_ps.toggle("heartbeat")
plc_comms.send_link_req()
ticks_to_update = LINK_TICKS
else
@@ -80,14 +85,6 @@ function threads.thread__main(smem, init)
end
end
end
else
-- use ticks to update just for heartbeat if not networked
if ticks_to_update == 0 then
smem.fp_ps.toggle("heartbeat")
ticks_to_update = LINK_TICKS
else
ticks_to_update = ticks_to_update - 1
end
end
-- are we now formed after waiting to be formed?
@@ -144,10 +141,7 @@ function threads.thread__main(smem, init)
end
-- update indicators
smem.fp_ps.publish("init_ok", plc_state.init_ok)
smem.fp_ps.publish("reactor_dev_state", not plc_state.no_reactor)
smem.fp_ps.publish("has_modem", not plc_state.no_modem)
smem.fp_ps.publish("degraded", plc_state.degraded)
databus.tx_hw_status(plc_state)
elseif event == "modem_message" and networked and plc_state.init_ok and not plc_state.no_modem then
-- got a packet
local packet = plc_comms.parse_packet(param1, param2, param3, param4, param5)
@@ -159,6 +153,9 @@ function threads.thread__main(smem, init)
-- haven't heard from server recently? shutdown reactor
plc_comms.unlink()
smem.q.mq_rps.push_command(MQ__RPS_CMD.TRIP_TIMEOUT)
elseif event == "timer" then
-- notify timer callback dispatcher if no other timer case claimed this event
tcallbackdsp.handle(param1)
elseif event == "peripheral_detach" then
-- peripheral disconnect
local type, device = ppm.handle_unmount(param1)
@@ -191,10 +188,7 @@ function threads.thread__main(smem, init)
end
-- update indicators
smem.fp_ps.publish("has_reactor", not plc_state.no_reactor)
smem.fp_ps.publish("has_modem", not plc_state.no_modem)
smem.fp_ps.publish("degraded", plc_state.degraded)
smem.fp_ps.publish("init_ok", plc_state.init_ok)
databus.tx_hw_status(plc_state)
elseif event == "peripheral" then
-- peripheral connect
local type, device = ppm.mount(param1)
@@ -260,10 +254,7 @@ function threads.thread__main(smem, init)
end
-- update indicators
smem.fp_ps.publish("has_reactor", not plc_state.no_reactor)
smem.fp_ps.publish("has_modem", not plc_state.no_modem)
smem.fp_ps.publish("degraded", plc_state.degraded)
smem.fp_ps.publish("init_ok", plc_state.init_ok)
databus.tx_hw_status(plc_state)
elseif event == "clock_start" then
-- start loop clock
loop_clock.start()
@@ -290,6 +281,8 @@ function threads.thread__main(smem, init)
log.fatal(util.strval(result))
end
databus.tx_rt_status("main", false)
-- if status is true, then we are probably exiting, so this won't matter
-- if not, we need to restart the clock
-- this thread cannot be slept because it will miss events (namely "terminate" otherwise)
@@ -307,11 +300,16 @@ end
---@nodiscard
---@param smem plc_shared_memory
function threads.thread__rps(smem)
-- print a log message to the terminal as long as the UI isn't running
local function println(message) if not smem.plc_state.fp_ok then util.println(message) end end
local function println_ts(message) if not smem.plc_state.fp_ok then util.println_ts(message) end end
---@class parallel_thread
local public = {}
-- execute thread
function public.exec()
databus.tx_rt_status("rps", true)
log.debug("rps thread start")
-- load in from shared memory
@@ -345,11 +343,17 @@ function threads.thread__rps(smem)
was_linked = true
end
-- if we tried to SCRAM but failed, keep trying
-- in that case, SCRAM won't be called until it reconnects (this is the expected use of this check)
if (not plc_state.no_reactor) and rps.is_formed() then
-- check reactor status
---@diagnostic disable-next-line: need-check-nil
if (not plc_state.no_reactor) and rps.is_formed() and rps.is_tripped() and reactor.getStatus() then
rps.scram()
local reactor_status = reactor.getStatus()
databus.tx_reactor_state(reactor_status)
-- if we tried to SCRAM but failed, keep trying
-- in that case, SCRAM won't be called until it reconnects (this is the expected use of this check)
if rps.is_tripped() and reactor_status then
rps.scram()
end
end
-- if we are in standalone mode, continuously reset RPS
@@ -433,6 +437,8 @@ function threads.thread__rps(smem)
log.fatal(util.strval(result))
end
databus.tx_rt_status("rps", false)
if not plc_state.shutdown then
if plc_state.init_ok then smem.plc_sys.rps.scram() end
log.info("rps thread restarting in 5 seconds...")
@@ -453,6 +459,7 @@ function threads.thread__comms_tx(smem)
-- execute thread
function public.exec()
databus.tx_rt_status("comms_tx", true)
log.debug("comms tx thread start")
-- load in from shared memory
@@ -510,6 +517,8 @@ function threads.thread__comms_tx(smem)
log.fatal(util.strval(result))
end
databus.tx_rt_status("comms_tx", false)
if not plc_state.shutdown then
log.info("comms tx thread restarting in 5 seconds...")
util.psleep(5)
@@ -529,6 +538,7 @@ function threads.thread__comms_rx(smem)
-- execute thread
function public.exec()
databus.tx_rt_status("comms_rx", true)
log.debug("comms rx thread start")
-- load in from shared memory
@@ -586,6 +596,8 @@ function threads.thread__comms_rx(smem)
log.fatal(util.strval(result))
end
databus.tx_rt_status("comms_rx", false)
if not plc_state.shutdown then
log.info("comms rx thread restarting in 5 seconds...")
util.psleep(5)
@@ -605,6 +617,7 @@ function threads.thread__setpoint_control(smem)
-- execute thread
function public.exec()
databus.tx_rt_status("spctl", true)
log.debug("setpoint control thread start")
-- load in from shared memory
@@ -719,6 +732,8 @@ function threads.thread__setpoint_control(smem)
log.fatal(util.strval(result))
end
databus.tx_rt_status("spctl", false)
if not plc_state.shutdown then
log.info("setpoint control thread restarting in 5 seconds...")
util.psleep(5)