catch nil cases, supervisor use loop clock

This commit is contained in:
Mikayla Fischler 2022-05-10 17:08:38 -04:00
parent 3c688bfafa
commit e3a4ed5363
3 changed files with 136 additions and 123 deletions

View File

@ -88,16 +88,17 @@ threads.thread__main = function (smem, init)
smem.q.mq_rps.push_command(MQ__RPS_CMD.TRIP_TIMEOUT) smem.q.mq_rps.push_command(MQ__RPS_CMD.TRIP_TIMEOUT)
elseif event == "peripheral_detach" then elseif event == "peripheral_detach" then
-- peripheral disconnect -- peripheral disconnect
local device = ppm.handle_unmount(param1) local type, device = ppm.handle_unmount(param1)
if device.type == "fissionReactor" then if type ~= nil and device ~= nil then
if type == "fissionReactor" then
println_ts("reactor disconnected!") println_ts("reactor disconnected!")
log.error("reactor disconnected!") log.error("reactor disconnected!")
plc_state.no_reactor = true plc_state.no_reactor = true
plc_state.degraded = true plc_state.degraded = true
elseif networked and device.type == "modem" then elseif networked and type == "modem" then
-- we only care if this is our wireless modem -- we only care if this is our wireless modem
if device.dev == plc_dev.modem then if device == plc_dev.modem then
println_ts("wireless modem disconnected!") println_ts("wireless modem disconnected!")
log.error("comms modem disconnected!") log.error("comms modem disconnected!")
plc_state.no_modem = true plc_state.no_modem = true
@ -112,10 +113,12 @@ threads.thread__main = function (smem, init)
log.warning("non-comms modem disconnected") log.warning("non-comms modem disconnected")
end end
end end
end
elseif event == "peripheral" then elseif event == "peripheral" then
-- peripheral connect -- peripheral connect
local type, device = ppm.mount(param1) local type, device = ppm.mount(param1)
if type ~= nil and device ~= nil then
if type == "fissionReactor" then if type == "fissionReactor" then
-- reconnected reactor -- reconnected reactor
plc_dev.reactor = device plc_dev.reactor = device
@ -158,6 +161,7 @@ threads.thread__main = function (smem, init)
log.info("wired modem reconnected.") log.info("wired modem reconnected.")
end end
end end
end
if not plc_state.init_ok and not plc_state.degraded then if not plc_state.init_ok and not plc_state.degraded then
plc_state.init_ok = true plc_state.init_ok = true

View File

@ -74,11 +74,12 @@ threads.thread__main = function (smem)
rtu_comms.unlink(rtu_state) rtu_comms.unlink(rtu_state)
elseif event == "peripheral_detach" then elseif event == "peripheral_detach" then
-- handle loss of a device -- handle loss of a device
local device = ppm.handle_unmount(param1) local type, device = ppm.handle_unmount(param1)
if device.type == "modem" then if type ~= nil and device ~= nil then
if type == "modem" then
-- we only care if this is our wireless modem -- we only care if this is our wireless modem
if device.dev == rtu_dev.modem then if device == rtu_dev.modem then
println_ts("wireless modem disconnected!") println_ts("wireless modem disconnected!")
log.warning("comms modem disconnected!") log.warning("comms modem disconnected!")
else else
@ -87,7 +88,7 @@ threads.thread__main = function (smem)
else else
for i = 1, #units do for i = 1, #units do
-- find disconnected device -- find disconnected device
if units[i].device == device.dev then if units[i].device == device then
-- we are going to let the PPM prevent crashes -- we are going to let the PPM prevent crashes
-- return fault flags/codes to MODBUS queries -- return fault flags/codes to MODBUS queries
local unit = units[i] local unit = units[i]
@ -95,10 +96,12 @@ threads.thread__main = function (smem)
end end
end end
end end
end
elseif event == "peripheral" then elseif event == "peripheral" then
-- peripheral connect -- peripheral connect
local type, device = ppm.mount(param1) local type, device = ppm.mount(param1)
if type ~= nil and device ~= nil then
if type == "modem" then if type == "modem" then
if device.isWireless() then if device.isWireless() then
-- reconnected modem -- reconnected modem
@ -141,6 +144,7 @@ threads.thread__main = function (smem)
end end
end end
end end
end
-- check for termination request -- check for termination request
if event == "terminate" or ppm.should_terminate() then if event == "terminate" or ppm.should_terminate() then

View File

@ -43,28 +43,32 @@ local superv_comms = supervisor.comms(config.NUM_REACTORS, modem, config.SCADA_D
-- base loop clock (6.67Hz, 3 ticks) -- base loop clock (6.67Hz, 3 ticks)
local MAIN_CLOCK = 0.15 local MAIN_CLOCK = 0.15
local loop_clock = os.startTimer(MAIN_CLOCK) local loop_clock = util.new_clock(MAIN_CLOCK)
-- event loop -- event loop
while true do while true do
---@diagnostic disable-next-line: undefined-field
local event, param1, param2, param3, param4, param5 = os.pullEventRaw() local event, param1, param2, param3, param4, param5 = os.pullEventRaw()
-- handle event -- handle event
if event == "peripheral_detach" then if event == "peripheral_detach" then
local device = ppm.handle_unmount(param1) local type, device = ppm.handle_unmount(param1)
if device.type == "modem" then if type ~= nil and device ~= nil then
if type == "modem" then
-- we only care if this is our wireless modem -- we only care if this is our wireless modem
if device.dev == modem then if device == modem then
println_ts("wireless modem disconnected!") println_ts("wireless modem disconnected!")
log.error("comms modem disconnected!") log.error("comms modem disconnected!")
else else
log.warning("non-comms modem disconnected") log.warning("non-comms modem disconnected")
end end
end end
end
elseif event == "peripheral" then elseif event == "peripheral" then
local type, device = ppm.mount(param1) local type, device = ppm.mount(param1)
if type ~= nil and device ~= nil then
if type == "modem" then if type == "modem" then
if device.isWireless() then if device.isWireless() then
-- reconnected modem -- reconnected modem
@ -77,7 +81,8 @@ while true do
log.info("wired modem reconnected.") log.info("wired modem reconnected.")
end end
end end
elseif event == "timer" and param1 == loop_clock then end
elseif event == "timer" and loop_clock.is_clock(param1) then
-- main loop tick -- main loop tick
-- iterate sessions -- iterate sessions
@ -86,9 +91,9 @@ while true do
-- free any closed sessions -- free any closed sessions
svsessions.free_all_closed() svsessions.free_all_closed()
loop_clock = os.startTimer(MAIN_CLOCK) loop_clock.start()
elseif event == "timer" then elseif event == "timer" then
-- another timer event, check watchdogs -- a non-clock timer event, check watchdogs
svsessions.check_all_watchdogs(param1) svsessions.check_all_watchdogs(param1)
elseif event == "modem_message" then elseif event == "modem_message" then
-- got a packet -- got a packet