From 3da7b74cfba0c4a61633e0906196907440949e09 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Mon, 18 Apr 2022 11:07:16 -0400 Subject: [PATCH] initial base supervisor code --- supervisor/startup.lua | 78 +++++++++++++++++++++++++++------------ supervisor/supervisor.lua | 27 ++++++++++++++ 2 files changed, 81 insertions(+), 24 deletions(-) diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 4ff56a9..cec58c0 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -7,22 +7,29 @@ os.loadAPI("scada-common/util.lua") os.loadAPI("scada-common/ppm.lua") os.loadAPI("scada-common/comms.lua") -os.loadAPI("supervisor/config.lua") -os.loadAPI("supervisor/supervisor.lua") +os.loadAPI("config.lua") +os.loadAPI("supervisor.lua") local SUPERVISOR_VERSION = "alpha-v0.1.0" +local print = util.print +local println = util.println local print_ts = util.print_ts +local println_ts = util.println_ts +log._info("========================================") +log._info("BOOTING supervisor.startup " .. SUPERVISOR_VERSION) +log._info("========================================") + +println(">> SCADA Supervisor " .. SUPERVISOR_VERSION .. " <<") + +-- mount connected devices ppm.mount_all() -local modem = ppm.get_device("modem") - -print("| SCADA Supervisor - " .. SUPERVISOR_VERSION .. " |") - --- we need a modem +local modem = ppm.get_wireless_modem() if modem == nil then - print("Please connect a modem.") + println("boot> wireless modem not found") + log._warning("no wireless modem on startup") return end @@ -33,34 +40,57 @@ if config.SYSTEM_TYPE == "active" then end -- start comms, open all channels -if not modem.isOpen(config.SCADA_DEV_LISTEN) then - modem.open(config.SCADA_DEV_LISTEN) -end -if not modem.isOpen(config.SCADA_FO_CHANNEL) then - modem.open(config.SCADA_FO_CHANNEL) -end -if not modem.isOpen(config.SCADA_SV_CHANNEL) then - modem.open(config.SCADA_SV_CHANNEL) -end - local comms = supervisor.superv_comms(config.NUM_REACTORS, modem, config.SCADA_DEV_LISTEN, config.SCADA_FO_CHANNEL, config.SCADA_SV_CHANNEL) -- base loop clock (4Hz, 5 ticks) -local loop_tick = os.startTimer(0.25) +local loop_clock = os.startTimer(0.25) -- event loop while true do local event, param1, param2, param3, param4, param5 = os.pullEventRaw() -- handle event - if event == "timer" and param1 == loop_tick then + if event == "peripheral_detach" then + local device = ppm.handle_unmount(param1) + + if device.type == "modem" then + -- we only care if this is our wireless modem + if device.dev == modem then + println_ts("wireless modem disconnected!") + log._error("comms modem disconnected!") + else + log._warning("non-comms modem disconnected") + end + end + elseif event == "peripheral" then + local type, device = ppm.mount(param1) + + if type == "modem" then + if device.isWireless() then + -- reconnected modem + modem = device + superv_comms.reconnect_modem(modem) + + println_ts("wireless modem reconnected.") + log._info("comms modem reconnected.") + else + log._info("wired modem reconnected.") + end + end + elseif event == "timer" and param1 == loop_clock then -- basic event tick, send keep-alives + loop_clock = os.startTimer(0.25) elseif event == "modem_message" then -- got a packet - elseif event == "terminate" then - -- safe exit - print_ts("[alert] terminated\n") + end + + -- check for termination request + if event == "terminate" or ppm.should_terminate() then + log._warning("terminate requested, exiting...") -- todo: attempt failover, alert hot backup - return + break end end + +println_ts("exited") +log._info("exited") diff --git a/supervisor/supervisor.lua b/supervisor/supervisor.lua index 5f988a8..d9b125c 100644 --- a/supervisor/supervisor.lua +++ b/supervisor/supervisor.lua @@ -12,4 +12,31 @@ function superv_comms(mode, num_reactors, modem, dev_listen, fo_channel, sv_chan sv_channel = sv_channel, reactor_struct_cache = nil } + + -- PRIVATE FUNCTIONS -- + + -- open all channels + local _open_channels = function () + if not self.modem.isOpen(self.dev_listen) then + self.modem.open(self.dev_listen) + end + if not self.modem.isOpen(self.fo_channel) then + self.modem.open(self.fo_channel) + end + if not self.modem.isOpen(self.sv_channel) then + self.modem.open(self.sv_channel) + end + end + + -- PUBLIC FUNCTIONS -- + + -- reconnect a newly connected modem + local reconnect_modem = function (modem) + self.modem = modem + _open_channels() + end + + return { + reconnect_modem = reconnect_modem + } end