From 7b9824b6f926d33ded2e952a654be3b764da4d3c Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 1 Jul 2023 19:40:33 -0400 Subject: [PATCH 01/34] added checkbox graphics element --- graphics/element.lua | 1 + graphics/elements/controls/checkbox.lua | 84 +++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 graphics/elements/controls/checkbox.lua diff --git a/graphics/element.lua b/graphics/element.lua index 2cf211b..4630a53 100644 --- a/graphics/element.lua +++ b/graphics/element.lua @@ -20,6 +20,7 @@ local element = {} ---@alias graphics_args graphics_args_generic ---|waiting_args +---|checkbox_args ---|hazard_button_args ---|multi_button_args ---|push_button_args diff --git a/graphics/elements/controls/checkbox.lua b/graphics/elements/controls/checkbox.lua new file mode 100644 index 0000000..42dd937 --- /dev/null +++ b/graphics/elements/controls/checkbox.lua @@ -0,0 +1,84 @@ +-- Checkbox Graphics Element + +local core = require("graphics.core") +local element = require("graphics.element") + +---@class checkbox_args +---@field label string checkbox text +---@field box_fg_bg cpair colors for checkbox +---@field callback function function to call on press +---@field parent graphics_element +---@field id? string element id +---@field x? integer 1 if omitted +---@field y? integer 1 if omitted +---@field fg_bg? cpair foreground/background colors +---@field hidden? boolean true to hide on initial draw + +-- new checkbox control +---@param args checkbox_args +---@return graphics_element element, element_id id +local function checkbox(args) + assert(type(args.label) == "string", "graphics.elements.controls.checkbox: label is a required field") + assert(type(args.box_fg_bg) == "table", "graphics.elements.controls.checkbox: box_fg_bg is a required field") + assert(type(args.callback) == "function", "graphics.elements.controls.checkbox: callback is a required field") + + args.height = 1 + args.width = 3 + string.len(args.label) + + -- create new graphics element base object + local e = element.new(args) + + e.value = false + + -- show the button state + local function draw() + e.window.setCursorPos(1, 1) + + if e.value then + -- show as selected + e.window.setTextColor(args.box_fg_bg.bkg) + e.window.setBackgroundColor(args.box_fg_bg.fgd) + e.window.write("\x88") + e.window.setTextColor(args.box_fg_bg.fgd) + e.window.setBackgroundColor(e.fg_bg.bkg) + e.window.write("\x95") + else + -- show as unselected + e.window.setBackgroundColor(args.box_fg_bg.bkg) + e.window.write("\x80") + e.window.setTextColor(args.box_fg_bg.bkg) + e.window.setBackgroundColor(e.fg_bg.bkg) + e.window.write("\x95") + end + end + + -- handle mouse interaction + ---@param event mouse_interaction mouse event + function e.handle_mouse(event) + if e.enabled and core.events.was_clicked(event.type) then + e.value = not e.value + draw() + args.callback(e.value) + end + end + + -- set the value + ---@param val integer new value + function e.set_value(val) + e.value = val + draw() + end + + -- write label text + e.window.setCursorPos(3, 1) + e.window.setTextColor(e.fg_bg.fgd) + e.window.setBackgroundColor(e.fg_bg.bkg) + e.window.write(args.label) + + -- initial draw + draw() + + return e.complete() +end + +return checkbox From 8f54e95519e967c7441b6f5cd5d7d888843a2d05 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Thu, 6 Jul 2023 01:36:06 -0400 Subject: [PATCH 02/34] #25 continued WIP waste control, main view updated and unit fields modified --- coordinator/iocontrol.lua | 10 +- .../{processctl.lua => process_ctl.lua} | 124 ++++++++++++++---- coordinator/ui/components/unit_detail.lua | 32 +---- coordinator/ui/layout/main_view.lua | 2 +- coordinator/ui/style.lua | 61 +++++++++ graphics/elements/controls/checkbox.lua | 3 +- install_manifest.json | 2 +- scada-common/comms.lua | 2 +- scada-common/types.lua | 19 ++- supervisor/facility.lua | 2 +- supervisor/session/coordinator.lua | 4 +- supervisor/session/rtu.lua | 7 +- supervisor/unit.lua | 98 +++++++++----- 13 files changed, 270 insertions(+), 96 deletions(-) rename coordinator/ui/components/{processctl.lua => process_ctl.lua} (70%) diff --git a/coordinator/iocontrol.lua b/coordinator/iocontrol.lua index 24e839c..a15a236 100644 --- a/coordinator/iocontrol.lua +++ b/coordinator/iocontrol.lua @@ -739,12 +739,14 @@ function iocontrol.update_unit_statuses(statuses) local unit_state = status[5] if type(unit_state) == "table" then - if #unit_state == 5 then + if #unit_state == 6 then unit.unit_ps.publish("U_StatusLine1", unit_state[1]) unit.unit_ps.publish("U_StatusLine2", unit_state[2]) - unit.unit_ps.publish("U_WasteMode", unit_state[3]) - unit.unit_ps.publish("U_AutoReady", unit_state[4]) - unit.unit_ps.publish("U_AutoDegraded", unit_state[5]) + unit.unit_ps.publish("U_AutoReady", unit_state[3]) + unit.unit_ps.publish("U_AutoDegraded", unit_state[4]) + unit.unit_ps.publish("U_AutoWaste", unit_state[5] == types.WASTE_MODE.AUTO) + unit.unit_ps.publish("U_WasteMode", unit_state[5]) + unit.unit_ps.publish("U_WasteProduct", unit_state[6]) else log.debug(log_header .. "unit state length mismatch") valid = false diff --git a/coordinator/ui/components/processctl.lua b/coordinator/ui/components/process_ctl.lua similarity index 70% rename from coordinator/ui/components/processctl.lua rename to coordinator/ui/components/process_ctl.lua index eaeb8ab..b945914 100644 --- a/coordinator/ui/components/processctl.lua +++ b/coordinator/ui/components/process_ctl.lua @@ -15,8 +15,10 @@ local TextBox = require("graphics.elements.textbox") local DataIndicator = require("graphics.elements.indicators.data") local IndicatorLight = require("graphics.elements.indicators.light") local RadIndicator = require("graphics.elements.indicators.rad") +local StateIndicator = require("graphics.elements.indicators.state") local TriIndicatorLight = require("graphics.elements.indicators.trilight") +local Checkbox = require("graphics.elements.controls.checkbox") local HazardButton = require("graphics.elements.controls.hazard_button") local RadioButton = require("graphics.elements.controls.radio_button") local SpinboxNumeric = require("graphics.elements.controls.spinbox_numeric") @@ -43,7 +45,7 @@ local function new_view(root, x, y) local lu_cpair = cpair(colors.gray, colors.gray) local dis_colors = cpair(colors.white, colors.lightGray) - local main = Div{parent=root,width=104,height=24,x=x,y=y} + local main = Div{parent=root,width=128,height=24,x=x,y=y} local scram = HazardButton{parent=main,x=1,y=1,text="FAC SCRAM",accent=colors.yellow,dis_colors=dis_colors,callback=process.fac_scram,fg_bg=hzd_fg_bg} local ack_a = HazardButton{parent=main,x=16,y=1,text="ACK \x13",accent=colors.orange,dis_colors=dis_colors,callback=process.fac_ack_alarms,fg_bg=hzd_fg_bg} @@ -52,8 +54,9 @@ local function new_view(root, x, y) facility.ack_alarms_ack = ack_a.on_response local all_ok = IndicatorLight{parent=main,y=5,label="Unit Systems Online",colors=cpair(colors.green,colors.red)} - local ind_mat = IndicatorLight{parent=main,label="Induction Matrix",colors=cpair(colors.green,colors.gray)} local rad_mon = TriIndicatorLight{parent=main,label="Radiation Monitor",c1=colors.gray,c2=colors.yellow,c3=colors.green} + local ind_mat = IndicatorLight{parent=main,label="Induction Matrix",colors=cpair(colors.green,colors.gray)} + local sps = IndicatorLight{parent=main,label="SPS Online",colors=cpair(colors.green,colors.gray)} all_ok.register(facility.ps, "all_sys_ok", all_ok.update) ind_mat.register(facility.induction_ps_tbl[1], "computed_status", function (status) ind_mat.update(status > 1) end) @@ -99,7 +102,7 @@ local function new_view(root, x, y) -- process control -- --------------------- - local proc = Div{parent=main,width=78,height=24,x=27,y=1} + local proc = Div{parent=main,width=103,height=24,x=27,y=1} ----------------------------- -- process control targets -- @@ -148,46 +151,77 @@ local function new_view(root, x, y) local rate_limits = {} - for i = 1, facility.num_units do - local unit = units[i] ---@type ioctl_unit + for i = 1, 4 do + local unit + local tag_fg_bg = cpair(colors.gray,colors.white) + local lim_fg_bg = cpair(colors.lightGray,colors.white) + local ctl_fg = colors.lightGray + local cur_fg_bg = cpair(colors.lightGray,colors.white) + local cur_lu = colors.lightGray + + if i <= facility.num_units then + unit = units[i] ---@type ioctl_unit + tag_fg_bg = cpair(colors.black,colors.lightBlue) + lim_fg_bg = bw_fg_bg + ctl_fg = colors.gray + cur_fg_bg = cpair(colors.black,colors.brown) + cur_lu = colors.black + end local _y = ((i - 1) * 5) + 1 - local unit_tag = Div{parent=limit_div,x=1,y=_y,width=8,height=4,fg_bg=cpair(colors.black,colors.lightBlue)} + local unit_tag = Div{parent=limit_div,x=1,y=_y,width=8,height=4,fg_bg=tag_fg_bg} TextBox{parent=unit_tag,x=2,y=2,text="Unit "..i.." Limit",width=7,height=2} - local lim_ctl = Div{parent=limit_div,x=9,y=_y,width=14,height=3,fg_bg=cpair(colors.gray,colors.white)} - rate_limits[i] = SpinboxNumeric{parent=lim_ctl,x=2,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=cpair(colors.gray,colors.white),fg_bg=bw_fg_bg} + local lim_ctl = Div{parent=limit_div,x=9,y=_y,width=14,height=3,fg_bg=cpair(ctl_fg,colors.white)} + local lim = SpinboxNumeric{parent=lim_ctl,x=2,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=cpair(colors.gray,colors.white),fg_bg=lim_fg_bg} TextBox{parent=lim_ctl,x=9,y=2,text="mB/t",width=4,height=1} - rate_limits[i].register(unit.unit_ps, "max_burn", rate_limits[i].set_max) - rate_limits[i].register(unit.unit_ps, "burn_limit", rate_limits[i].set_value) + local cur_burn = DataIndicator{parent=limit_div,x=9,y=_y+3,label="",format="%7.1f",value=0,unit="mB/t",commas=false,lu_colors=cpair(cur_lu,cur_lu),width=14,fg_bg=cur_fg_bg} - local cur_burn = DataIndicator{parent=limit_div,x=9,y=_y+3,label="",format="%7.1f",value=0,unit="mB/t",commas=false,lu_colors=cpair(colors.black,colors.black),width=14,fg_bg=cpair(colors.black,colors.brown)} + if i <= facility.num_units then + rate_limits[i] = lim + rate_limits[i].register(unit.unit_ps, "max_burn", rate_limits[i].set_max) + rate_limits[i].register(unit.unit_ps, "burn_limit", rate_limits[i].set_value) - cur_burn.register(unit.unit_ps, "act_burn_rate", cur_burn.update) + cur_burn.register(unit.unit_ps, "act_burn_rate", cur_burn.update) + else + lim.disable() + end end ------------------- -- unit statuses -- ------------------- - local stat_div = Div{parent=proc,width=38,height=19,x=57,y=6} + local stat_div = Div{parent=proc,width=22,height=24,x=57,y=6} - for i = 1, facility.num_units do - local unit = units[i] ---@type ioctl_unit + for i = 1, 4 do + local tag_fg_bg = cpair(colors.gray,colors.white) + local ind_fg_bg = cpair(colors.lightGray,colors.white) + local ind_off = colors.lightGray + + if i <= facility.num_units then + tag_fg_bg = cpair(colors.black,colors.cyan) + ind_fg_bg = bw_fg_bg + ind_off = colors.gray + end local _y = ((i - 1) * 5) + 1 - local unit_tag = Div{parent=stat_div,x=1,y=_y,width=8,height=4,fg_bg=cpair(colors.black,colors.lightBlue)} + local unit_tag = Div{parent=stat_div,x=1,y=_y,width=8,height=4,fg_bg=tag_fg_bg} TextBox{parent=unit_tag,x=2,y=2,text="Unit "..i.." Status",width=7,height=2} - local lights = Div{parent=stat_div,x=9,y=_y,width=12,height=4,fg_bg=bw_fg_bg} - local ready = IndicatorLight{parent=lights,x=2,y=2,label="Ready",colors=cpair(colors.green,colors.gray)} - local degraded = IndicatorLight{parent=lights,x=2,y=3,label="Degraded",colors=cpair(colors.red,colors.gray),flash=true,period=period.BLINK_250_MS} + local lights = Div{parent=stat_div,x=9,y=_y,width=14,height=4,fg_bg=ind_fg_bg} + local ready = IndicatorLight{parent=lights,x=2,y=2,label="Ready",colors=cpair(colors.green,ind_off)} + local degraded = IndicatorLight{parent=lights,x=2,y=3,label="Degraded",colors=cpair(colors.red,ind_off),flash=true,period=period.BLINK_250_MS} - ready.register(unit.unit_ps, "U_AutoReady", ready.update) - degraded.register(unit.unit_ps, "U_AutoDegraded", degraded.update) + if i <= facility.num_units then + local unit = units[i] ---@type ioctl_unit + + ready.register(unit.unit_ps, "U_AutoReady", ready.update) + degraded.register(unit.unit_ps, "U_AutoDegraded", degraded.update) + end end ------------------------- @@ -195,7 +229,7 @@ local function new_view(root, x, y) ------------------------- local ctl_opts = { "Monitored Max Burn", "Combined Burn Rate", "Charge Level", "Generation Rate" } - local mode = RadioButton{parent=proc,x=34,y=1,options=ctl_opts,callback=function()end,radio_colors=cpair(colors.purple,colors.black),radio_bg=colors.gray} + local mode = RadioButton{parent=proc,x=34,y=1,options=ctl_opts,callback=function()end,radio_colors=cpair(colors.white,colors.black),radio_bg=colors.purple} mode.register(facility.ps, "process_mode", mode.set_value) @@ -261,6 +295,52 @@ local function new_view(root, x, y) for i = 1, #rate_limits do rate_limits[i].enable() end end end) + + ------------------------------ + -- waste production control -- + ------------------------------ + + local waste_status = Div{parent=proc,width=24,height=4,x=57,y=1,} + + for i = 1, facility.num_units do + local unit = units[i] ---@type ioctl_unit + + TextBox{parent=waste_status,y=i,text="U"..i.." Waste",width=8,height=1} + local a_waste = IndicatorLight{parent=waste_status,x=10,y=i,label="Auto",colors=cpair(colors.white,colors.gray)} + local waste_m = StateIndicator{parent=waste_status,x=17,y=i,states=style.waste.states_abbrv,value=1,min_width=6} + + a_waste.register(unit.unit_ps, "U_AutoWaste", a_waste.update) + waste_m.register(unit.unit_ps, "U_WasteProduct", waste_m.update) + end + + local waste_sel = Div{parent=proc,width=21,height=24,x=81,y=1} + + TextBox{parent=waste_sel,text=" ",width=21,height=1,x=1,y=1,fg_bg=cpair(colors.black,colors.brown)} + TextBox{parent=waste_sel,text="WASTE PRODUCTION",alignment=TEXT_ALIGN.CENTER,width=21,height=1,x=1,y=2,fg_bg=cpair(colors.lightGray,colors.brown)} + + local rect = Rectangle{parent=waste_sel,border=border(1,colors.brown,true),width=21,height=22,x=1,y=3} + local status = StateIndicator{parent=rect,x=2,y=1,states=style.waste.states,value=1,min_width=17} + + RadioButton{parent=rect,x=2,y=3,options=style.waste.options,callback=status.update,radio_colors=cpair(colors.white,colors.black),radio_bg=colors.brown} + + local pu_fallback = Checkbox{parent=rect,x=2,y=7,label="Pu Fallback",callback=function()end,box_fg_bg=cpair(colors.green,colors.black)} + + local fb_active = IndicatorLight{parent=rect,x=2,y=9,label="Fallback Active",colors=cpair(colors.white,colors.gray)} + + TextBox{parent=rect,x=2,y=11,text="Plutonium Rate",height=1,width=17,fg_bg=style.label} + local pu_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} + + TextBox{parent=rect,x=2,y=14,text="Polonium Rate",height=1,width=17,fg_bg=style.label} + local po_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} + + TextBox{parent=rect,x=2,y=17,text="Antimatter Rate",height=1,width=17,fg_bg=style.label} + local am_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} + + local sna_count = DataIndicator{parent=rect,x=2,y=20,label="Linked SNAs:",format="%4d",value=0,lu_colors=lu_cpair,width=17} + + -- local text_fg_bg = cpair(colors.black, colors.lightGray) + -- local label_fg_bg = cpair(colors.gray, colors.lightGray) + -- local lu_col = cpair(colors.gray, colors.gray) end return new_view diff --git a/coordinator/ui/components/unit_detail.lua b/coordinator/ui/components/unit_detail.lua index 30e2044..7d7bc92 100644 --- a/coordinator/ui/components/unit_detail.lua +++ b/coordinator/ui/components/unit_detail.lua @@ -33,41 +33,21 @@ local border = core.border local period = core.flasher.PERIOD -local waste_opts = { - { - text = "Auto", - fg_bg = cpair(colors.black, colors.lightGray), - active_fg_bg = cpair(colors.white, colors.gray) - }, - { - text = "Pu", - fg_bg = cpair(colors.black, colors.lightGray), - active_fg_bg = cpair(colors.black, colors.green) - }, - { - text = "Po", - fg_bg = cpair(colors.black, colors.lightGray), - active_fg_bg = cpair(colors.black, colors.cyan) - }, - { - text = "AM", - fg_bg = cpair(colors.black, colors.lightGray), - active_fg_bg = cpair(colors.black, colors.purple) - } -} - -- create a unit view ---@param parent graphics_element parent ---@param id integer local function init(parent, id) local unit = iocontrol.get_db().units[id] ---@type ioctl_unit local f_ps = iocontrol.get_db().facility.ps + + local main = Div{parent=parent,x=1,y=1} + + if unit == nil then return main end + local u_ps = unit.unit_ps local b_ps = unit.boiler_ps_tbl local t_ps = unit.turbine_ps_tbl - local main = Div{parent=parent,x=1,y=1} - TextBox{parent=main,text="Reactor Unit #" .. id,alignment=TEXT_ALIGN.CENTER,height=1,fg_bg=style.header} local bw_fg_bg = cpair(colors.black, colors.white) @@ -398,7 +378,7 @@ local function init(parent, id) local waste_proc = Rectangle{parent=main,border=border(1,colors.brown,true),thin=true,width=33,height=3,x=46,y=49} local waste_div = Div{parent=waste_proc,x=2,y=1,width=31,height=1} - local waste_mode = MultiButton{parent=waste_div,x=1,y=1,options=waste_opts,callback=unit.set_waste,min_width=6} + local waste_mode = MultiButton{parent=waste_div,x=1,y=1,options=style.waste.unit_opts,callback=unit.set_waste,min_width=6} waste_mode.register(u_ps, "U_WasteMode", waste_mode.set_value) diff --git a/coordinator/ui/layout/main_view.lua b/coordinator/ui/layout/main_view.lua index a7b3c86..a1b3b5b 100644 --- a/coordinator/ui/layout/main_view.lua +++ b/coordinator/ui/layout/main_view.lua @@ -9,7 +9,7 @@ local iocontrol = require("coordinator.iocontrol") local style = require("coordinator.ui.style") local imatrix = require("coordinator.ui.components.imatrix") -local process_ctl = require("coordinator.ui.components.processctl") +local process_ctl = require("coordinator.ui.components.process_ctl") local unit_overview = require("coordinator.ui.components.unit_overview") local core = require("graphics.core") diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index b78fc91..5db54d5 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -151,7 +151,68 @@ style.imatrix = { { color = cpair(colors.black, colors.yellow), text = "HIGH CHARGE" + } + } +} + +style.waste = { + -- auto waste processing states + states = { + { + color = cpair(colors.black, colors.green), + text = "PLUTONIUM" }, + { + color = cpair(colors.black, colors.green), + text = "PLUTONIUM (FB)" + }, + { + color = cpair(colors.black, colors.cyan), + text = "POLONIUM" + }, + { + color = cpair(colors.black, colors.purple), + text = "ANTI MATTER" + } + }, + states_abbrv = { + { + color = cpair(colors.black, colors.green), + text = "Pu" + }, + { + color = cpair(colors.black, colors.cyan), + text = "Po" + }, + { + color = cpair(colors.black, colors.purple), + text = "AM" + } + }, + -- process radio button options + options = { "Plutonium", "Polonium", "Antimatter" }, + -- unit waste selection + unit_opts = { + { + text = "Auto", + fg_bg = cpair(colors.black, colors.lightGray), + active_fg_bg = cpair(colors.white, colors.gray) + }, + { + text = "Pu", + fg_bg = cpair(colors.black, colors.lightGray), + active_fg_bg = cpair(colors.black, colors.green) + }, + { + text = "Po", + fg_bg = cpair(colors.black, colors.lightGray), + active_fg_bg = cpair(colors.black, colors.cyan) + }, + { + text = "AM", + fg_bg = cpair(colors.black, colors.lightGray), + active_fg_bg = cpair(colors.black, colors.purple) + } } } diff --git a/graphics/elements/controls/checkbox.lua b/graphics/elements/controls/checkbox.lua index 42dd937..2867d8b 100644 --- a/graphics/elements/controls/checkbox.lua +++ b/graphics/elements/controls/checkbox.lua @@ -44,8 +44,9 @@ local function checkbox(args) e.window.write("\x95") else -- show as unselected + e.window.setTextColor(e.fg_bg.bkg) e.window.setBackgroundColor(args.box_fg_bg.bkg) - e.window.write("\x80") + e.window.write("\x88") e.window.setTextColor(args.box_fg_bg.bkg) e.window.setBackgroundColor(e.fg_bg.bkg) e.window.write("\x95") diff --git a/install_manifest.json b/install_manifest.json index b93e2b4..b3accc3 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.0", "graphics": "1.0.0", "lockbox": "1.0", "reactor-plc": "v1.5.0", "rtu": "v1.4.0", "supervisor": "v0.18.0", "coordinator": "v0.17.1", "pocket": "alpha-v0.5.1"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/processctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5568, "system": 1991, "common": 97109, "graphics": 144556, "lockbox": 34900, "reactor-plc": 97595, "rtu": 102247, "supervisor": 315425, "coordinator": 198188, "pocket": 37633}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.0", "lockbox": "1.0", "reactor-plc": "v1.5.0", "rtu": "v1.4.0", "supervisor": "v0.18.0", "coordinator": "v0.17.1", "pocket": "alpha-v0.5.1"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5612, "system": 1991, "common": 97342, "graphics": 147195, "lockbox": 34900, "reactor-plc": 97595, "rtu": 102247, "supervisor": 316739, "coordinator": 203382, "pocket": 37633}} \ No newline at end of file diff --git a/scada-common/comms.lua b/scada-common/comms.lua index 88e8631..8d52e45 100644 --- a/scada-common/comms.lua +++ b/scada-common/comms.lua @@ -14,7 +14,7 @@ local max_distance = nil ---@type number|nil maximum acceptable t ---@class comms local comms = {} -comms.version = "2.1.0" +comms.version = "2.1.1" ---@enum PROTOCOL local PROTOCOL = { diff --git a/scada-common/types.lua b/scada-common/types.lua index 21429b5..9e68632 100644 --- a/scada-common/types.lua +++ b/scada-common/types.lua @@ -158,13 +158,26 @@ types.PROCESS_NAMES = { ---@enum WASTE_MODE types.WASTE_MODE = { AUTO = 1, - PLUTONIUM = 2, - POLONIUM = 3, - ANTI_MATTER = 4 + MANUAL_PLUTONIUM = 2, + MANUAL_POLONIUM = 3, + MANUAL_ANTI_MATTER = 4 } types.WASTE_MODE_NAMES = { "AUTO", + "MANUAL_PLUTONIUM", + "MANUAL_POLONIUM", + "MANUAL_ANTI_MATTER" +} + +---@enum WASTE_PRODUCT +types.WASTE_PRODUCT = { + PLUTONIUM = 1, + POLONIUM = 2, + ANTI_MATTER = 3 +} + +types.WASTE_PRODUCT_NAMES = { "PLUTONIUM", "POLONIUM", "ANTI_MATTER" diff --git a/supervisor/facility.lua b/supervisor/facility.lua index 5864ea5..87c99b2 100644 --- a/supervisor/facility.lua +++ b/supervisor/facility.lua @@ -205,7 +205,7 @@ function facility.new(num_reactors, cooling_conf) table.insert(self.redstone, rs_unit) end - -- link an imatrix RTU session + -- link an induction matrix RTU session ---@param imatrix unit_session function public.add_imatrix(imatrix) table.insert(self.induction, imatrix) diff --git a/supervisor/session/coordinator.lua b/supervisor/session/coordinator.lua index 1b75078..92303d8 100644 --- a/supervisor/session/coordinator.lua +++ b/supervisor/session/coordinator.lua @@ -294,9 +294,9 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil end elseif cmd == UNIT_COMMAND.SET_WASTE then if (pkt.length == 3) and (type(pkt.data[3]) == "number") and (pkt.data[3] > 0) and (pkt.data[3] <= 4) then - unit.set_waste(pkt.data[3]) + unit.set_waste_mode(pkt.data[3]) else - log.debug(log_header .. "CRDN unit command set waste missing option") + log.debug(log_header .. "CRDN unit command set waste missing/invalid option") end elseif cmd == UNIT_COMMAND.ACK_ALL_ALARMS then unit.ack_all() diff --git a/supervisor/session/rtu.lua b/supervisor/session/rtu.lua index 69ba796..fdf6f55 100644 --- a/supervisor/session/rtu.lua +++ b/supervisor/session/rtu.lua @@ -138,6 +138,10 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement -- turbine unit = svrs_turbinev.new(id, i, unit_advert, self.modbus_q) if type(unit) ~= "nil" then target_unit.add_turbine(unit) end + elseif u_type == RTU_UNIT_TYPE.SNA then + -- solar neutron activator + unit = svrs_sna.new(id, i, unit_advert, self.modbus_q) + if type(unit) ~= "nil" then target_unit.add_sna(unit) end elseif u_type == RTU_UNIT_TYPE.ENV_DETECTOR then -- environment detector unit = svrs_envd.new(id, i, unit_advert, self.modbus_q) @@ -161,9 +165,6 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement elseif u_type == RTU_UNIT_TYPE.SPS then -- super-critical phase shifter unit = svrs_sps.new(id, i, unit_advert, self.modbus_q) - elseif u_type == RTU_UNIT_TYPE.SNA then - -- solar neutron activator - unit = svrs_sna.new(id, i, unit_advert, self.modbus_q) elseif u_type == RTU_UNIT_TYPE.ENV_DETECTOR then -- environment detector unit = svrs_envd.new(id, i, unit_advert, self.modbus_q) diff --git a/supervisor/unit.lua b/supervisor/unit.lua index 0d7246a..acf03b5 100644 --- a/supervisor/unit.lua +++ b/supervisor/unit.lua @@ -12,6 +12,7 @@ local rsctl = require("supervisor.session.rsctl") local unit = {} local WASTE_MODE = types.WASTE_MODE +local WASTE = types.WASTE_PRODUCT local ALARM = types.ALARM local PRIO = types.ALARM_PRIORITY local ALARM_STATE = types.ALARM_STATE @@ -71,6 +72,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) redstone = {}, boilers = {}, turbines = {}, + sna = {}, envd = {}, -- redstone control io_ctl = nil, ---@type rs_controller @@ -89,7 +91,8 @@ function unit.new(reactor_id, num_boilers, num_turbines) damage_start = 0, damage_last = 0, damage_est_last = 0, - waste_mode = WASTE_MODE.AUTO, + waste_mode = WASTE_MODE.AUTO, ---@type WASTE_MODE + waste_product = WASTE.PLUTONIUM, ---@type WASTE_PRODUCT status_text = { "UNKNOWN", "awaiting connection..." }, -- logic for alarms had_reactor = false, @@ -341,6 +344,32 @@ function unit.new(reactor_id, num_boilers, num_turbines) emer_cool = emer_cool } + -- route reactor waste for a given waste product + ---@param product WASTE_PRODUCT waste product to route valves for + local function _set_waste_valves(product) + self.waste_product = product + + if product == WASTE.PLUTONIUM then + -- route through plutonium generation + waste_pu.open() + waste_sna.close() + waste_po.close() + waste_sps.close() + elseif product == WASTE.POLONIUM then + -- route through polonium generation into pellets + waste_pu.close() + waste_sna.open() + waste_po.open() + waste_sps.close() + elseif product == WASTE.ANTI_MATTER then + -- route through polonium generation into SPS + waste_pu.close() + waste_sna.open() + waste_po.close() + waste_sps.open() + end + end + --#endregion -- unlink disconnected units @@ -378,7 +407,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) table.insert(self.redstone, rs_unit) -- send or re-send waste settings - public.set_waste(self.waste_mode) + _set_waste_valves(self.waste_product) end -- link a turbine RTU session @@ -415,6 +444,12 @@ function unit.new(reactor_id, num_boilers, num_turbines) end end + -- link a solar neutron activator RTU session + ---@param sna unit_session + function public.add_sna(sna) + table.insert(self.sna, sna) + end + -- link an environment detector RTU session ---@param envd unit_session function public.add_envd(envd) @@ -427,6 +462,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) util.filter_table(self.redstone, function (s) return s.get_session_id() ~= session end) util.filter_table(self.boilers, function (s) return s.get_session_id() ~= session end) util.filter_table(self.turbines, function (s) return s.get_session_id() ~= session end) + util.filter_table(self.sna, function (s) return s.get_session_id() ~= session end) util.filter_table(self.envd, function (s) return s.get_session_id() ~= session end) end @@ -577,6 +613,15 @@ function unit.new(reactor_id, num_boilers, num_turbines) end end + -- set automatic waste product if mode is set to auto + ---@param product WASTE_PRODUCT waste product to generate + function public.auto_set_waste(product) + if self.waste_mode == WASTE_MODE.AUTO then + self.waste_product = product + _set_waste_valves(product) + end + end + --#endregion -- OPERATIONS -- @@ -621,34 +666,18 @@ function unit.new(reactor_id, num_boilers, num_turbines) end end - -- route reactor waste - ---@param mode WASTE_MODE waste handling mode - function public.set_waste(mode) - if mode == WASTE_MODE.AUTO then - ---@todo automatic waste routing - self.waste_mode = mode - elseif mode == WASTE_MODE.PLUTONIUM then - -- route through plutonium generation - self.waste_mode = mode - waste_pu.open() - waste_sna.close() - waste_po.close() - waste_sps.close() - elseif mode == WASTE_MODE.POLONIUM then - -- route through polonium generation into pellets - self.waste_mode = mode - waste_pu.close() - waste_sna.open() - waste_po.open() - waste_sps.close() - elseif mode == WASTE_MODE.ANTI_MATTER then - -- route through polonium generation into SPS - self.waste_mode = mode - waste_pu.close() - waste_sna.open() - waste_po.close() - waste_sps.open() - else + -- set waste processing mode + ---@param mode WASTE_MODE processing mode + function public.set_waste_mode(mode) + self.waste_mode = mode + + if mode == WASTE_MODE.MANUAL_PLUTONIUM then + _set_waste_valves(WASTE.PLUTONIUM) + elseif mode == WASTE_MODE.MANUAL_POLONIUM then + _set_waste_valves(WASTE.POLONIUM) + elseif mode == WASTE_MODE.MANUAL_ANTI_MATTER then + _set_waste_valves(WASTE.ANTI_MATTER) + elseif mode > WASTE_MODE.MANUAL_ANTI_MATTER then log.debug(util.c("invalid waste mode setting ", mode)) end end @@ -787,7 +816,14 @@ function unit.new(reactor_id, num_boilers, num_turbines) -- get unit state ---@nodiscard function public.get_state() - return { self.status_text[1], self.status_text[2], self.waste_mode, self.db.control.ready, self.db.control.degraded } + return { + self.status_text[1], + self.status_text[2], + self.db.control.ready, + self.db.control.degraded, + self.waste_mode, + self.waste_product + } end -- get the reactor ID From ba0900ac6599923fa30968f6bb3687382036f8ad Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 8 Jul 2023 16:57:13 -0400 Subject: [PATCH 03/34] #25 sna/sps integration, plutonium fallback, waste rate reporting --- coordinator/coordinator.lua | 11 +- coordinator/iocontrol.lua | 141 +++++++++++++++++++--- coordinator/process.lua | 124 +++++++++++++------ coordinator/startup.lua | 2 +- coordinator/ui/components/process_ctl.lua | 25 ++-- coordinator/ui/style.lua | 30 ++++- scada-common/comms.lua | 8 +- supervisor/facility.lua | 120 ++++++++++++++++-- supervisor/session/coordinator.lua | 14 ++- supervisor/session/rtu.lua | 1 + supervisor/startup.lua | 2 +- supervisor/unit.lua | 56 +++++++-- 12 files changed, 443 insertions(+), 91 deletions(-) diff --git a/coordinator/coordinator.lua b/coordinator/coordinator.lua index ff81e5d..11287e7 100644 --- a/coordinator/coordinator.lua +++ b/coordinator/coordinator.lua @@ -364,8 +364,9 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, -- send a facility command ---@param cmd FAC_COMMAND command - function public.send_fac_command(cmd) - _send_sv(PROTOCOL.SCADA_CRDN, SCADA_CRDN_TYPE.FAC_CMD, { cmd }) + ---@param option any? optional option options for the optional options (like waste mode) + function public.send_fac_command(cmd, option) + _send_sv(PROTOCOL.SCADA_CRDN, SCADA_CRDN_TYPE.FAC_CMD, { cmd, option }) end -- send the auto process control configuration with a start command @@ -379,7 +380,7 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, -- send a unit command ---@param cmd UNIT_COMMAND command ---@param unit integer unit ID - ---@param option any? optional option options for the optional options (like burn rate) (does option still look like a word?) + ---@param option any? optional option options for the optional options (like burn rate) function public.send_unit_command(cmd, unit, option) _send_sv(PROTOCOL.SCADA_CRDN, SCADA_CRDN_TYPE.UNIT_CMD, { cmd, unit, option }) end @@ -563,6 +564,10 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, end elseif cmd == FAC_COMMAND.ACK_ALL_ALARMS then iocontrol.get_db().facility.ack_alarms_ack(ack) + elseif cmd == FAC_COMMAND.SET_WASTE_MODE then + process.waste_ack_handle(packet.data[2]) + elseif cmd == FAC_COMMAND.SET_PU_FB then + process.pu_fb_ack_handle(packet.data[2]) else log.debug(util.c("received facility command ack with unknown command ", cmd)) end diff --git a/coordinator/iocontrol.lua b/coordinator/iocontrol.lua index a15a236..2eeb5e2 100644 --- a/coordinator/iocontrol.lua +++ b/coordinator/iocontrol.lua @@ -52,6 +52,10 @@ function iocontrol.init(conf, comms) gen_fault = false }, + ---@type WASTE_PRODUCT + auto_current_waste_product = types.WASTE_PRODUCT.PLUTONIUM, + auto_pu_fallback_active = false, + radiation = types.new_zero_radiation_reading(), save_cfg_ack = __generic_ack, @@ -65,16 +69,18 @@ function iocontrol.init(conf, comms) induction_ps_tbl = {}, induction_data_tbl = {}, + sps_ps_tbl = {}, + sps_data_tbl = {}, + env_d_ps = psil.create(), env_d_data = {} } - -- create induction tables (currently only 1 is supported) - for _ = 1, conf.num_units do - local data = {} ---@type imatrix_session_db - table.insert(io.facility.induction_ps_tbl, psil.create()) - table.insert(io.facility.induction_data_tbl, data) - end + -- create induction and SPS tables (currently only 1 of each is supported) + table.insert(io.facility.induction_ps_tbl, psil.create()) + table.insert(io.facility.induction_data_tbl, {}) + table.insert(io.facility.sps_ps_tbl, psil.create()) + table.insert(io.facility.sps_data_tbl, {}) io.units = {} for i = 1, conf.num_units do @@ -87,11 +93,15 @@ function iocontrol.init(conf, comms) num_boilers = 0, num_turbines = 0, + num_snas = 0, control_state = false, burn_rate_cmd = 0.0, - waste_control = 0, radiation = types.new_zero_radiation_reading(), + sna_prod_rate = 0.0, + + waste_mode = types.WASTE_MODE.MANUAL_PLUTONIUM, + waste_product = types.WASTE_PRODUCT.PLUTONIUM, -- auto control group a_group = 0, @@ -100,10 +110,10 @@ function iocontrol.init(conf, comms) scram = function () process.scram(i) end, reset_rps = function () process.reset_rps(i) end, ack_alarms = function () process.ack_all_alarms(i) end, - set_burn = function (rate) process.set_rate(i, rate) end, ---@param rate number burn rate - set_waste = function (mode) process.set_waste(i, mode) end, ---@param mode integer waste processing mode + set_burn = function (rate) process.set_rate(i, rate) end, ---@param rate number burn rate + set_waste = function (mode) process.set_unit_waste(i, mode) end, ---@param mode WASTE_MODE waste processing mode - set_group = function (grp) process.set_group(i, grp) end, ---@param grp integer|0 group ID or 0 + set_group = function (grp) process.set_group(i, grp) end, ---@param grp integer|0 group ID or 0 for manual start_ack = __generic_ack, scram_ack = __generic_ack, @@ -206,6 +216,25 @@ function iocontrol.record_facility_builds(build) end end end + + -- SPS + if type(build.sps) == "table" then + for id, sps in pairs(build.sps) do + if type(fac.sps_data_tbl[id]) == "table" then + fac.sps_data_tbl[id].formed = sps[1] ---@type boolean + fac.sps_data_tbl[id].build = sps[2] ---@type table + + fac.sps_ps_tbl[id].publish("formed", sps[1]) + + for key, val in pairs(fac.sps_data_tbl[id].build) do + fac.sps_ps_tbl[id].publish(key, val) + end + else + log.debug(util.c("iocontrol.record_facility_builds: invalid SPS id ", id)) + valid = false + end + end + end else log.debug("facility builds not a table") valid = false @@ -306,7 +335,7 @@ function iocontrol.update_facility_status(status) local ctl_status = status[1] - if type(ctl_status) == "table" and #ctl_status == 14 then + if type(ctl_status) == "table" and #ctl_status == 16 then fac.all_sys_ok = ctl_status[1] fac.auto_ready = ctl_status[2] @@ -354,6 +383,12 @@ function iocontrol.update_facility_status(status) io.units[i].unit_ps.publish("auto_group", names[group_map[i] + 1]) end end + + fac.auto_current_waste_product = ctl_status[15] + fac.auto_pu_fallback_active = ctl_status[16] + + fac.ps.publish("current_waste_product", fac.auto_current_waste_product) + fac.ps.publish("pu_fallback_active", fac.auto_pu_fallback_active) else log.debug(log_header .. "control status not a table or length mismatch") valid = false @@ -430,6 +465,52 @@ function iocontrol.update_facility_status(status) valid = false end + -- SPS statuses + if type(rtu_statuses.sps) == "table" then + for id = 1, #fac.sps_ps_tbl do + if rtu_statuses.sps[id] == nil then + -- disconnected + fac.sps_ps_tbl[id].publish("computed_status", 1) + end + end + + for id, sps in pairs(rtu_statuses.sps) do + if type(fac.sps_data_tbl[id]) == "table" then + local rtu_faulted = sps[1] ---@type boolean + fac.sps_data_tbl[id].formed = sps[2] ---@type boolean + fac.sps_data_tbl[id].state = sps[3] ---@type table + fac.sps_data_tbl[id].tanks = sps[4] ---@type table + + local data = fac.sps_data_tbl[id] ---@type sps_session_db + + fac.sps_ps_tbl[id].publish("formed", data.formed) + fac.sps_ps_tbl[id].publish("faulted", rtu_faulted) + + if data.formed then + if rtu_faulted then + fac.sps_ps_tbl[id].publish("computed_status", 3) -- faulted + elseif data.state.process_rate > 0 then + fac.sps_ps_tbl[id].publish("computed_status", 5) -- active + else + fac.sps_ps_tbl[id].publish("computed_status", 4) -- idle + end + else + fac.sps_ps_tbl[id].publish("computed_status", 2) -- not formed + end + + for key, val in pairs(data.state) do fac.sps_ps_tbl[id].publish(key, val) end + for key, val in pairs(data.tanks) do fac.sps_ps_tbl[id].publish(key, val) end + + io.facility.ps.publish("am_rate", data.state.process_rate * 1000) + else + log.debug(util.c(log_header, "invalid sps id ", id)) + end + end + else + log.debug(log_header .. "sps list not a table") + valid = false + end + -- environment detector status if type(rtu_statuses.rad_mon) == "table" then if #rtu_statuses.rad_mon > 0 then @@ -472,6 +553,9 @@ function iocontrol.update_unit_statuses(statuses) valid = false else local burn_rate_sum = 0.0 + local sna_count_sum = 0 + local pu_rate = 0.0 + local po_rate = 0.0 -- get all unit statuses for i = 1, #statuses do @@ -480,6 +564,8 @@ function iocontrol.update_unit_statuses(statuses) local unit = io.units[i] ---@type ioctl_unit local status = statuses[i] + local burn_rate = 0.0 + if type(status) ~= "table" or #status ~= 5 then log.debug(log_header .. "invalid status entry in unit statuses (not a table or invalid length)") valid = false @@ -515,7 +601,8 @@ function iocontrol.update_unit_statuses(statuses) -- if status hasn't been received, mek_status = {} if type(unit.reactor_data.mek_status.act_burn_rate) == "number" then - burn_rate_sum = burn_rate_sum + unit.reactor_data.mek_status.act_burn_rate + burn_rate = unit.reactor_data.mek_status.act_burn_rate + burn_rate_sum = burn_rate_sum + burn_rate end if unit.reactor_data.mek_status.status then @@ -662,6 +749,19 @@ function iocontrol.update_unit_statuses(statuses) valid = false end + -- solar neutron activator status info + if type(rtu_statuses.sna) == "table" then + unit.num_snas = rtu_statuses.sna[1] ---@type integer + unit.sna_prod_rate = rtu_statuses.sna[2] ---@type number + + unit.unit_ps.publish("sna_prod_rate", unit.sna_prod_rate) + + sna_count_sum = sna_count_sum + unit.num_snas + else + log.debug(log_header .. "sna statistic list not a table") + valid = false + end + -- environment detector status if type(rtu_statuses.rad_mon) == "table" then if #rtu_statuses.rad_mon > 0 then @@ -740,13 +840,16 @@ function iocontrol.update_unit_statuses(statuses) if type(unit_state) == "table" then if #unit_state == 6 then + unit.waste_mode = unit_state[5] + unit.waste_product = unit_state[6] + unit.unit_ps.publish("U_StatusLine1", unit_state[1]) unit.unit_ps.publish("U_StatusLine2", unit_state[2]) unit.unit_ps.publish("U_AutoReady", unit_state[3]) unit.unit_ps.publish("U_AutoDegraded", unit_state[4]) - unit.unit_ps.publish("U_AutoWaste", unit_state[5] == types.WASTE_MODE.AUTO) - unit.unit_ps.publish("U_WasteMode", unit_state[5]) - unit.unit_ps.publish("U_WasteProduct", unit_state[6]) + unit.unit_ps.publish("U_AutoWaste", unit.waste_mode == types.WASTE_MODE.AUTO) + unit.unit_ps.publish("U_WasteMode", unit.waste_mode) + unit.unit_ps.publish("U_WasteProduct", unit.waste_product) else log.debug(log_header .. "unit state length mismatch") valid = false @@ -755,10 +858,18 @@ function iocontrol.update_unit_statuses(statuses) log.debug(log_header .. "unit state not a table") valid = false end + + -- determine waste production for this unit, add to statistics + local is_pu = unit.waste_product == types.WASTE_PRODUCT.PLUTONIUM + pu_rate = pu_rate + util.trinary(is_pu, burn_rate / 10.0, 0.0) + po_rate = po_rate + util.trinary(not is_pu, math.min(burn_rate / 10.0, unit.sna_prod_rate), 0.0) end end io.facility.ps.publish("burn_sum", burn_rate_sum) + io.facility.ps.publish("sna_count", sna_count_sum) + io.facility.ps.publish("pu_rate", pu_rate) + io.facility.ps.publish("po_rate", po_rate) -- update alarm sounder sounder.eval(io.units) diff --git a/coordinator/process.lua b/coordinator/process.lua index 1e318ed..72152c8 100644 --- a/coordinator/process.lua +++ b/coordinator/process.lua @@ -11,6 +11,7 @@ local FAC_COMMAND = comms.FAC_COMMAND local UNIT_COMMAND = comms.UNIT_COMMAND local PROCESS = types.PROCESS +local PRODUCT = types.WASTE_PRODUCT ---@class process_controller local process = {} @@ -24,7 +25,9 @@ local self = { burn_target = 0.0, charge_target = 0.0, gen_target = 0.0, - limits = {} + limits = {}, + waste_product = PRODUCT.PLUTONIUM, + pu_fallback = false } } @@ -48,19 +51,23 @@ function process.init(iocontrol, coord_comms) log.error("process.init(): failed to load coordinator settings file") end + -- facility auto control configuration local config = settings.get("PROCESS") ---@type coord_auto_config|nil - if type(config) == "table" then self.config.mode = config.mode self.config.burn_target = config.burn_target self.config.charge_target = config.charge_target self.config.gen_target = config.gen_target self.config.limits = config.limits + self.config.waste_product = config.waste_product + self.config.pu_fallback = config.pu_fallback self.io.facility.ps.publish("process_mode", self.config.mode) self.io.facility.ps.publish("process_burn_target", self.config.burn_target) self.io.facility.ps.publish("process_charge_target", self.config.charge_target) self.io.facility.ps.publish("process_gen_target", self.config.gen_target) + self.io.facility.ps.publish("process_waste_product", self.config.waste_product) + self.io.facility.ps.publish("process_pu_fallback", self.config.pu_fallback) for id = 1, math.min(#self.config.limits, self.io.facility.num_units) do local unit = self.io.units[id] ---@type ioctl_unit @@ -70,18 +77,18 @@ function process.init(iocontrol, coord_comms) log.info("PROCESS: loaded auto control settings from coord.settings") end - local waste_mode = settings.get("WASTE_MODES") ---@type table|nil - - if type(waste_mode) == "table" then - for id, mode in pairs(waste_mode) do + -- unit waste states + local waste_modes = settings.get("WASTE_MODES") ---@type table|nil + if type(waste_modes) == "table" then + for id, mode in pairs(waste_modes) do self.comms.send_unit_command(UNIT_COMMAND.SET_WASTE, id, mode) end - log.info("PROCESS: loaded waste mode settings from coord.settings") + log.info("PROCESS: loaded unit waste mode settings from coord.settings") end + -- unit priority groups local prio_groups = settings.get("PRIORITY_GROUPS") ---@type table|nil - if type(prio_groups) == "table" then for id, group in pairs(prio_groups) do self.comms.send_unit_command(UNIT_COMMAND.SET_GROUP, id, group) @@ -137,7 +144,7 @@ end -- set waste mode ---@param id integer unit ID ---@param mode integer waste mode -function process.set_waste(id, mode) +function process.set_unit_waste(id, mode) -- publish so that if it fails then it gets reset self.io.units[id].unit_ps.publish("U_WasteMode", mode) @@ -153,7 +160,7 @@ function process.set_waste(id, mode) settings.set("WASTE_MODES", waste_mode) if not settings.save("/coord.settings") then - log.error("process.set_waste(): failed to save coordinator settings file") + log.error("process.set_unit_waste(): failed to save coordinator settings file") end end @@ -204,6 +211,24 @@ end -- AUTO PROCESS CONTROL -- -------------------------- +-- write auto process control to config file +local function _write_auto_config() + -- attempt to load settings + if not settings.load("/coord.settings") then + log.warning("process._write_config(): failed to load coordinator settings file") + end + + -- save config + settings.set("PROCESS", self.config) + local saved = settings.save("/coord.settings") + + if not saved then + log.warning("process._write_config(): failed to save coordinator settings file") + end + + return not not saved +end + -- stop automatic process control function process.stop_auto() self.comms.send_fac_command(FAC_COMMAND.STOP) @@ -216,6 +241,30 @@ function process.start_auto() log.debug("PROCESS: START AUTO CTL") end +-- set automatic process control waste mode +---@param product WASTE_PRODUCT waste product for auto control +function process.set_process_waste(product) + self.comms.send_fac_command(FAC_COMMAND.SET_WASTE_MODE, product) + + log.debug(util.c("PROCESS: SET WASTE ", product)) + + -- update config table and save + self.config.waste_product = product + _write_auto_config() +end + +-- set automatic process control plutonium fallback +---@param enabled boolean whether to enable plutonium fallback +function process.set_pu_fallback(enabled) + self.comms.send_fac_command(FAC_COMMAND.SET_PU_FB, enabled) + + log.debug(util.c("PROCESS: SET PU FALLBACK ", enabled)) + + -- update config table and save + self.config.pu_fallback = enabled + _write_auto_config() +end + -- save process control settings ---@param mode PROCESS control mode ---@param burn_target number burn rate target @@ -223,29 +272,17 @@ end ---@param gen_target number generation rate target ---@param limits table unit burn rate limits function process.save(mode, burn_target, charge_target, gen_target, limits) - -- attempt to load settings - if not settings.load("/coord.settings") then - log.warning("process.save(): failed to load coordinator settings file") - end + log.debug("PROCESS: SAVE") - -- config table - self.config = { - mode = mode, - burn_target = burn_target, - charge_target = charge_target, - gen_target = gen_target, - limits = limits - } + -- update config table + self.config.mode = mode + self.config.burn_target = burn_target + self.config.charge_target = charge_target + self.config.gen_target = gen_target + self.config.limits = limits -- save config - settings.set("PROCESS", self.config) - local saved = settings.save("/coord.settings") - - if not saved then - log.warning("process.save(): failed to save coordinator settings file") - end - - self.io.facility.save_cfg_ack(saved) + self.io.facility.save_cfg_ack(_write_auto_config()) end -- handle a start command acknowledgement @@ -258,16 +295,33 @@ function process.start_ack_handle(response) self.config.charge_target = response[4] self.config.gen_target = response[5] - for i = 1, #response[6] do + for i = 1, math.min(#response[6], self.io.facility.num_units) do self.config.limits[i] = response[6][i] + + local unit = self.io.units[i] ---@type ioctl_unit + unit.unit_ps.publish("burn_limit", self.config.limits[i]) end - self.io.facility.ps.publish("auto_mode", self.config.mode) - self.io.facility.ps.publish("burn_target", self.config.burn_target) - self.io.facility.ps.publish("charge_target", self.config.charge_target) - self.io.facility.ps.publish("gen_target", self.config.gen_target) + self.io.facility.ps.publish("process_mode", self.config.mode) + self.io.facility.ps.publish("process_burn_target", self.config.burn_target) + self.io.facility.ps.publish("process_charge_target", self.config.charge_target) + self.io.facility.ps.publish("process_gen_target", self.config.gen_target) self.io.facility.start_ack(ack) end +-- record waste product state after attempting to change it +---@param response WASTE_PRODUCT supervisor waste product state +function process.waste_ack_handle(response) + self.config.waste_product = response + self.io.facility.ps.publish("process_waste_product", response) +end + +-- record plutonium fallback state after attempting to change it +---@param response boolean supervisor plutonium fallback state +function process.pu_fb_ack_handle(response) + self.config.pu_fallback = response + self.io.facility.ps.publish("process_pu_fallback", response) +end + return process diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 8bbc550..f58642d 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -21,7 +21,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.17.1" +local COORDINATOR_VERSION = "v0.18.0" local println = util.println local println_ts = util.println_ts diff --git a/coordinator/ui/components/process_ctl.lua b/coordinator/ui/components/process_ctl.lua index b945914..0716619 100644 --- a/coordinator/ui/components/process_ctl.lua +++ b/coordinator/ui/components/process_ctl.lua @@ -56,11 +56,12 @@ local function new_view(root, x, y) local all_ok = IndicatorLight{parent=main,y=5,label="Unit Systems Online",colors=cpair(colors.green,colors.red)} local rad_mon = TriIndicatorLight{parent=main,label="Radiation Monitor",c1=colors.gray,c2=colors.yellow,c3=colors.green} local ind_mat = IndicatorLight{parent=main,label="Induction Matrix",colors=cpair(colors.green,colors.gray)} - local sps = IndicatorLight{parent=main,label="SPS Online",colors=cpair(colors.green,colors.gray)} + local sps = IndicatorLight{parent=main,label="SPS Connected",colors=cpair(colors.green,colors.gray)} all_ok.register(facility.ps, "all_sys_ok", all_ok.update) - ind_mat.register(facility.induction_ps_tbl[1], "computed_status", function (status) ind_mat.update(status > 1) end) rad_mon.register(facility.ps, "rad_computed_status", rad_mon.update) + ind_mat.register(facility.induction_ps_tbl[1], "computed_status", function (status) ind_mat.update(status > 1) end) + sps.register(facility.sps_ps_tbl[1], "computed_status", function (status) sps.update(status > 1) end) main.line_break() @@ -321,12 +322,18 @@ local function new_view(root, x, y) local rect = Rectangle{parent=waste_sel,border=border(1,colors.brown,true),width=21,height=22,x=1,y=3} local status = StateIndicator{parent=rect,x=2,y=1,states=style.waste.states,value=1,min_width=17} - RadioButton{parent=rect,x=2,y=3,options=style.waste.options,callback=status.update,radio_colors=cpair(colors.white,colors.black),radio_bg=colors.brown} + status.register(facility.ps, "current_waste_product", status.update) - local pu_fallback = Checkbox{parent=rect,x=2,y=7,label="Pu Fallback",callback=function()end,box_fg_bg=cpair(colors.green,colors.black)} + local waste_prod = RadioButton{parent=rect,x=2,y=3,options=style.waste.options,callback=process.set_process_waste,radio_colors=cpair(colors.white,colors.black),radio_bg=colors.brown} + local pu_fallback = Checkbox{parent=rect,x=2,y=7,label="Pu Fallback",callback=process.set_pu_fallback,box_fg_bg=cpair(colors.green,colors.black)} + + waste_prod.register(facility.ps, "process_waste_product", waste_prod.set_value) + pu_fallback.register(facility.ps, "process_pu_fallback", pu_fallback.set_value) local fb_active = IndicatorLight{parent=rect,x=2,y=9,label="Fallback Active",colors=cpair(colors.white,colors.gray)} + fb_active.register(facility.ps, "pu_fallback_active", fb_active.update) + TextBox{parent=rect,x=2,y=11,text="Plutonium Rate",height=1,width=17,fg_bg=style.label} local pu_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} @@ -334,13 +341,15 @@ local function new_view(root, x, y) local po_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} TextBox{parent=rect,x=2,y=17,text="Antimatter Rate",height=1,width=17,fg_bg=style.label} - local am_rate = DataIndicator{parent=rect,x=2,label="",unit="mB/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} + local am_rate = DataIndicator{parent=rect,x=2,label="",unit="\xb5B/t",format="%12.2f",value=0,lu_colors=lu_cpair,fg_bg=bw_fg_bg,width=17} + + pu_rate.register(facility.ps, "pu_rate", pu_rate.update) + po_rate.register(facility.ps, "po_rate", po_rate.update) + am_rate.register(facility.ps, "am_rate", am_rate.update) local sna_count = DataIndicator{parent=rect,x=2,y=20,label="Linked SNAs:",format="%4d",value=0,lu_colors=lu_cpair,width=17} - -- local text_fg_bg = cpair(colors.black, colors.lightGray) - -- local label_fg_bg = cpair(colors.gray, colors.lightGray) - -- local lu_col = cpair(colors.gray, colors.gray) + sna_count.register(facility.ps, "sna_count", sna_count.update) end return new_view diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 5db54d5..46faf4a 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -155,6 +155,32 @@ style.imatrix = { } } +style.sps = { + -- SPS states + states = { + { + color = cpair(colors.black, colors.yellow), + text = "OFF-LINE" + }, + { + color = cpair(colors.black, colors.orange), + text = "NOT FORMED" + }, + { + color = cpair(colors.black, colors.orange), + text = "RTU FAULT" + }, + { + color = cpair(colors.black, colors.gray), + text = "IDLE" + }, + { + color = cpair(colors.black, colors.green), + text = "ACTIVE" + } + } +} + style.waste = { -- auto waste processing states states = { @@ -162,10 +188,6 @@ style.waste = { color = cpair(colors.black, colors.green), text = "PLUTONIUM" }, - { - color = cpair(colors.black, colors.green), - text = "PLUTONIUM (FB)" - }, { color = cpair(colors.black, colors.cyan), text = "POLONIUM" diff --git a/scada-common/comms.lua b/scada-common/comms.lua index 8d52e45..a9fa5a5 100644 --- a/scada-common/comms.lua +++ b/scada-common/comms.lua @@ -92,9 +92,11 @@ local PLC_AUTO_ACK = { ---@enum FAC_COMMAND local FAC_COMMAND = { SCRAM_ALL = 0, -- SCRAM all reactors - STOP = 1, -- stop automatic control - START = 2, -- start automatic control - ACK_ALL_ALARMS = 3 -- acknowledge all alarms on all units + STOP = 1, -- stop automatic process control + START = 2, -- start automatic process control + ACK_ALL_ALARMS = 3, -- acknowledge all alarms on all units + SET_WASTE_MODE = 4, -- set automatic waste processing mode + SET_PU_FB = 5 -- set plutonium fallback mode } ---@enum UNIT_COMMAND diff --git a/supervisor/facility.lua b/supervisor/facility.lua index 87c99b2..52870fa 100644 --- a/supervisor/facility.lua +++ b/supervisor/facility.lua @@ -11,6 +11,9 @@ local rsctl = require("supervisor.session.rsctl") local PROCESS = types.PROCESS local PROCESS_NAMES = types.PROCESS_NAMES local PRIO = types.ALARM_PRIORITY +local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE +local WASTE = types.WASTE_PRODUCT +local WASTE_MODE = types.WASTE_MODE local IO = rsio.IO @@ -61,6 +64,7 @@ function facility.new(num_reactors, cooling_conf) rtu_conn_count = 0, redstone = {}, induction = {}, + sps = {}, envd = {}, -- redstone I/O control io_ctl = nil, ---@type rs_controller @@ -99,6 +103,10 @@ function facility.new(num_reactors, cooling_conf) last_update = 0, last_error = 0.0, last_time = 0.0, + -- waste processing + waste_product = WASTE.PLUTONIUM, + current_waste_product = WASTE.PLUTONIUM, + pu_fallback = false, -- statistics im_stat_init = false, avg_charge = util.mov_avg(3, 0.0), @@ -211,6 +219,12 @@ function facility.new(num_reactors, cooling_conf) table.insert(self.induction, imatrix) end + -- link an SPS RTU session + ---@param sps unit_session + function public.add_sps(sps) + table.insert(self.sps, sps) + end + -- link an environment detector RTU session ---@param envd unit_session function public.add_envd(envd) @@ -222,6 +236,7 @@ function facility.new(num_reactors, cooling_conf) function public.purge_rtu_devices(session) util.filter_table(self.redstone, function (s) return s.get_session_id() ~= session end) util.filter_table(self.induction, function (s) return s.get_session_id() ~= session end) + util.filter_table(self.sps, function (s) return s.get_session_id() ~= session end) util.filter_table(self.envd, function (s) return s.get_session_id() ~= session end) end @@ -238,6 +253,7 @@ function facility.new(num_reactors, cooling_conf) -- unlink RTU unit sessions if they are closed _unlink_disconnected_units(self.redstone) _unlink_disconnected_units(self.induction) + _unlink_disconnected_units(self.sps) _unlink_disconnected_units(self.envd) -- current state for process control @@ -277,6 +293,8 @@ function facility.new(num_reactors, cooling_conf) -- Run Process Control -- ------------------------- + --#region Process Control + local avg_charge = self.avg_charge.compute() local avg_inflow = self.avg_inflow.compute() @@ -542,10 +560,14 @@ function facility.new(num_reactors, cooling_conf) next_mode = PROCESS.INACTIVE end + --#endregion + ------------------------------ -- Evaluate Automatic SCRAM -- ------------------------------ + --#region Automatic SCRAM + local astatus = self.ascram_status if self.induction[1] ~= nil then @@ -659,6 +681,8 @@ function facility.new(num_reactors, cooling_conf) end end + --#endregion + -- update last mode and set next mode self.last_mode = self.mode self.mode = next_mode @@ -692,12 +716,33 @@ function facility.new(num_reactors, cooling_conf) self.io_ctl.digital_write(IO.F_ALARM, has_alarm) end + + ----------------------------- + -- Update Waste Processing -- + ----------------------------- + + local insufficent_po_rate = false + for i = 1, #self.units do + local u = self.units[i] ---@type reactor_unit + if u.get_control_inf().waste_mode == WASTE_MODE.AUTO then + if (u.get_sna_rate() * 10.0) < u.get_burn_rate() then + insufficent_po_rate = true + break + end + end + end + + if self.waste_product == WASTE.PLUTONIUM or (self.pu_fallback and insufficent_po_rate) then + self.current_waste_product = WASTE.PLUTONIUM + else self.current_waste_product = self.waste_product end end - -- call the update function of all units in the facility + -- call the update function of all units in the facility
+ -- additionally sets the requested auto waste mode if applicable function public.update_units() for i = 1, #self.units do local u = self.units[i] ---@type reactor_unit + u.auto_set_waste(self.current_waste_product) u.update() end end @@ -721,15 +766,15 @@ function facility.new(num_reactors, cooling_conf) end -- stop auto control - function public.auto_stop() - self.mode = PROCESS.INACTIVE - end + function public.auto_stop() self.mode = PROCESS.INACTIVE end -- set automatic control configuration and start the process ---@param config coord_auto_config configuration ---@return table response ready state (successfully started) and current configuration (after updating) function public.auto_start(config) - local ready = false + local charge_scaler = 1000000 -- convert MFE to FE + local gen_scaler = 1000 -- convert kFE to FE + local ready = false -- load up current limits local limits = {} @@ -749,11 +794,11 @@ function facility.new(num_reactors, cooling_conf) end if (type(config.charge_target) == "number") and config.charge_target >= 0 then - self.charge_setpoint = config.charge_target * 1000000 -- convert MFE to FE + self.charge_setpoint = config.charge_target * charge_scaler end if (type(config.gen_target) == "number") and config.gen_target >= 0 then - self.gen_rate_setpoint = config.gen_target * 1000 -- convert kFE to FE + self.gen_rate_setpoint = config.gen_target * gen_scaler end if (type(config.limits) == "table") and (#config.limits == num_reactors) then @@ -782,7 +827,14 @@ function facility.new(num_reactors, cooling_conf) if ready then self.mode = self.mode_set end end - return { ready, self.mode_set, self.burn_target, self.charge_setpoint, self.gen_rate_setpoint, limits } + return { + ready, + self.mode_set, + self.burn_target, + self.charge_setpoint / charge_scaler, + self.gen_rate_setpoint / gen_scaler, + limits + } end -- SETTINGS -- @@ -807,15 +859,35 @@ function facility.new(num_reactors, cooling_conf) end end + -- set waste production + ---@param product WASTE_PRODUCT target product + ---@return WASTE_PRODUCT product newly set value, if valid + function public.set_waste_product(product) + if product == WASTE.PLUTONIUM or product == WASTE.POLONIUM or product == WASTE.ANTI_MATTER then + self.waste_product = product + end + + return self.waste_product + end + + -- enable/disable plutonium fallback + ---@param enabled boolean requested state + ---@return boolean enabled newly set value + function public.set_pu_fallback(enabled) + self.pu_fallback = enabled == true + return self.pu_fallback + end + -- READ STATES/PROPERTIES -- - -- get build properties of all machines + -- get build properties of all facility devices ---@nodiscard - ---@param inc_imatrix boolean? true/nil to include induction matrix build, false to exclude - function public.get_build(inc_imatrix) + ---@param type RTU_UNIT_TYPE? type or nil to include only a particular unit type, or to include all if nil + function public.get_build(type) + local all = type == nil local build = {} - if inc_imatrix ~= false then + if all or type == RTU_UNIT_TYPE.IMATRIX then build.induction = {} for i = 1, #self.induction do local matrix = self.induction[i] ---@type unit_session @@ -823,6 +895,14 @@ function facility.new(num_reactors, cooling_conf) end end + if all or type == RTU_UNIT_TYPE.SPS then + build.sps = {} + for i = 1, #self.sps do + local sps = self.sps[i] ---@type unit_session + build.sps[sps.get_device_idx()] = { sps.get_db().formed, sps.get_db().build } + end + end + return build end @@ -844,7 +924,9 @@ function facility.new(num_reactors, cooling_conf) astat.gen_fault or self.mode == PROCESS.GEN_RATE_FAULT_IDLE, self.status_text[1], self.status_text[2], - self.group_map + self.group_map, + self.current_waste_product, + (self.current_waste_product == WASTE.PLUTONIUM) and (self.waste_product ~= WASTE.PLUTONIUM) } end @@ -875,6 +957,18 @@ function facility.new(num_reactors, cooling_conf) } end + -- status of sps + status.sps = {} + for i = 1, #self.sps do + local sps = self.sps[i] ---@type unit_session + status.sps[sps.get_device_idx()] = { + sps.is_faulted(), + sps.get_db().formed, + sps.get_db().state, + sps.get_db().tanks + } + end + -- radiation monitors (environment detectors) status.rad_mon = {} for i = 1, #self.envd do diff --git a/supervisor/session/coordinator.lua b/supervisor/session/coordinator.lua index 92303d8..eb8935f 100644 --- a/supervisor/session/coordinator.lua +++ b/supervisor/session/coordinator.lua @@ -258,6 +258,18 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil elseif cmd == FAC_COMMAND.ACK_ALL_ALARMS then facility.ack_all() _send(SCADA_CRDN_TYPE.FAC_CMD, { cmd, true }) + elseif cmd == FAC_COMMAND.SET_WASTE_MODE then + if pkt.length == 2 then + _send(SCADA_CRDN_TYPE.FAC_CMD, { cmd, facility.set_waste_product(pkt.data[2]) }) + else + log.debug(log_header .. "CRDN set waste mode packet length mismatch") + end + elseif cmd == FAC_COMMAND.SET_PU_FB then + if pkt.length == 2 then + _send(SCADA_CRDN_TYPE.FAC_CMD, { cmd, facility.set_pu_fallback(pkt.data[2]) }) + else + log.debug(log_header .. "CRDN set pu fallback packet length mismatch") + end else log.debug(log_header .. "CRDN facility command unknown") end @@ -417,7 +429,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil self.retry_times.f_builds_packet = util.time() + PARTIAL_RETRY_PERIOD self.acks.fac_builds = false - _send(SCADA_CRDN_TYPE.FAC_BUILDS, { facility.get_build(cmd.val.type == RTU_UNIT_TYPE.IMATRIX) }) + _send(SCADA_CRDN_TYPE.FAC_BUILDS, { facility.get_build(cmd.val.type) }) end else log.error(log_header .. "unsupported data command received in in_queue (this is a bug)", true) diff --git a/supervisor/session/rtu.lua b/supervisor/session/rtu.lua index fdf6f55..ce5e08d 100644 --- a/supervisor/session/rtu.lua +++ b/supervisor/session/rtu.lua @@ -165,6 +165,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement elseif u_type == RTU_UNIT_TYPE.SPS then -- super-critical phase shifter unit = svrs_sps.new(id, i, unit_advert, self.modbus_q) + if type(unit) ~= "nil" then facility.add_sps(unit) end elseif u_type == RTU_UNIT_TYPE.ENV_DETECTOR then -- environment detector unit = svrs_envd.new(id, i, unit_advert, self.modbus_q) diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 3dc850e..34f295b 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v0.18.0" +local SUPERVISOR_VERSION = "v0.19.0" local println = util.println local println_ts = util.println_ts diff --git a/supervisor/unit.lua b/supervisor/unit.lua index acf03b5..3e2986a 100644 --- a/supervisor/unit.lua +++ b/supervisor/unit.lua @@ -74,6 +74,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) turbines = {}, sna = {}, envd = {}, + sna_prod_rate = 0, -- redstone control io_ctl = nil, ---@type rs_controller valves = {}, ---@type unit_valves @@ -91,7 +92,6 @@ function unit.new(reactor_id, num_boilers, num_turbines) damage_start = 0, damage_last = 0, damage_est_last = 0, - waste_mode = WASTE_MODE.AUTO, ---@type WASTE_MODE waste_product = WASTE.PLUTONIUM, ---@type WASTE_PRODUCT status_text = { "UNKNOWN", "awaiting connection..." }, -- logic for alarms @@ -224,7 +224,8 @@ function unit.new(reactor_id, num_boilers, num_turbines) degraded = false, blade_count = 0, br100 = 0, - lim_br100 = 0 + lim_br100 = 0, + waste_mode = WASTE_MODE.AUTO ---@type WASTE_MODE } } } @@ -616,7 +617,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) -- set automatic waste product if mode is set to auto ---@param product WASTE_PRODUCT waste product to generate function public.auto_set_waste(product) - if self.waste_mode == WASTE_MODE.AUTO then + if self.db.control.waste_mode == WASTE_MODE.AUTO then self.waste_product = product _set_waste_valves(product) end @@ -669,7 +670,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) -- set waste processing mode ---@param mode WASTE_MODE processing mode function public.set_waste_mode(mode) - self.waste_mode = mode + self.db.control.waste_mode = mode if mode == WASTE_MODE.MANUAL_PLUTONIUM then _set_waste_valves(WASTE.PLUTONIUM) @@ -759,6 +760,14 @@ function unit.new(reactor_id, num_boilers, num_turbines) return status end + -- get the current burn rate (actual rate) + ---@nodiscard + function public.get_burn_rate() + local rate = 0 + if self.plc_i ~= nil then rate = self.plc_i.get_status().act_burn_rate end + return rate or 0 + end + -- get RTU statuses ---@nodiscard function public.get_rtu_statuses() @@ -779,7 +788,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) -- status of turbines (including tanks) status.turbines = {} for i = 1, #self.turbines do - local turbine = self.turbines[i] ---@type unit_session + local turbine = self.turbines[i] ---@type unit_session status.turbines[turbine.get_device_idx()] = { turbine.is_faulted(), turbine.get_db().formed, @@ -788,10 +797,13 @@ function unit.new(reactor_id, num_boilers, num_turbines) } end + -- basic SNA statistical information, don't send everything, it's not necessary + status.sna = { #self.sna, public.get_sna_rate() } + -- radiation monitors (environment detectors) status.rad_mon = {} for i = 1, #self.envd do - local envd = self.envd[i] ---@type unit_session + local envd = self.envd[i] ---@type unit_session status.rad_mon[envd.get_device_idx()] = { envd.is_faulted(), envd.get_db().radiation @@ -801,6 +813,36 @@ function unit.new(reactor_id, num_boilers, num_turbines) return status end + -- get the current total [max] production rate is + ---@nodiscard + ---@return number total_avail_rate + function public.get_sna_rate() + local total_avail_rate = 0 + + for i = 1, #self.sna do + local db = self.sna[i].get_db() ---@type sna_session_db + total_avail_rate = total_avail_rate + db.state.production_rate + end + + return total_avail_rate + end + + -- check plutonium and polonium estimated production rates + ---@nodiscard + ---@return number pu_rate, number po_rate + function public.get_waste_rates() + local pu, po = 0.0, 0.0 + local br = public.get_burn_rate() + + if self.waste_product == WASTE.PLUTONIUM then + pu = br / 10.0 + else + po = math.min(br / 10.0, public.get_sna_rate()) + end + + return pu, po + end + -- get the annunciator status ---@nodiscard function public.get_annunciator() return self.db.annunciator end @@ -821,7 +863,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) self.status_text[2], self.db.control.ready, self.db.control.degraded, - self.waste_mode, + self.db.control.waste_mode, self.waste_product } end From dcef5a96f0021e745fdbf40766c078460fac14f2 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 8 Jul 2023 16:57:41 -0400 Subject: [PATCH 04/34] removed unused function --- supervisor/unit.lua | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/supervisor/unit.lua b/supervisor/unit.lua index 3e2986a..74ef687 100644 --- a/supervisor/unit.lua +++ b/supervisor/unit.lua @@ -827,22 +827,6 @@ function unit.new(reactor_id, num_boilers, num_turbines) return total_avail_rate end - -- check plutonium and polonium estimated production rates - ---@nodiscard - ---@return number pu_rate, number po_rate - function public.get_waste_rates() - local pu, po = 0.0, 0.0 - local br = public.get_burn_rate() - - if self.waste_product == WASTE.PLUTONIUM then - pu = br / 10.0 - else - po = math.min(br / 10.0, public.get_sna_rate()) - end - - return pu, po - end - -- get the annunciator status ---@nodiscard function public.get_annunciator() return self.db.annunciator end From 7d65bba589d253556a6b836b365e24a7d9cadcd0 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 8 Jul 2023 17:11:51 -0400 Subject: [PATCH 05/34] fixes/cleanups for pull request --- coordinator/process.lua | 4 ++-- install_manifest.json | 2 +- supervisor/unit.lua | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/coordinator/process.lua b/coordinator/process.lua index 72152c8..ad9c94f 100644 --- a/coordinator/process.lua +++ b/coordinator/process.lua @@ -215,7 +215,7 @@ end local function _write_auto_config() -- attempt to load settings if not settings.load("/coord.settings") then - log.warning("process._write_config(): failed to load coordinator settings file") + log.warning("process._write_auto_config(): failed to load coordinator settings file") end -- save config @@ -223,7 +223,7 @@ local function _write_auto_config() local saved = settings.save("/coord.settings") if not saved then - log.warning("process._write_config(): failed to save coordinator settings file") + log.warning("process._write_auto_config(): failed to save coordinator settings file") end return not not saved diff --git a/install_manifest.json b/install_manifest.json index b3accc3..99abbb5 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.0", "lockbox": "1.0", "reactor-plc": "v1.5.0", "rtu": "v1.4.0", "supervisor": "v0.18.0", "coordinator": "v0.17.1", "pocket": "alpha-v0.5.1"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5612, "system": 1991, "common": 97342, "graphics": 147195, "lockbox": 34900, "reactor-plc": 97595, "rtu": 102247, "supervisor": 316739, "coordinator": 203382, "pocket": 37633}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.0", "lockbox": "1.0", "reactor-plc": "v1.5.0", "rtu": "v1.4.0", "supervisor": "v0.19.0", "coordinator": "v0.18.0", "pocket": "alpha-v0.5.1"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5612, "system": 1991, "common": 97476, "graphics": 147195, "lockbox": 34900, "reactor-plc": 97595, "rtu": 102247, "supervisor": 321729, "coordinator": 212109, "pocket": 37633}} \ No newline at end of file diff --git a/supervisor/unit.lua b/supervisor/unit.lua index 74ef687..beaf495 100644 --- a/supervisor/unit.lua +++ b/supervisor/unit.lua @@ -485,6 +485,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) _unlink_disconnected_units(self.redstone) _unlink_disconnected_units(self.boilers) _unlink_disconnected_units(self.turbines) + _unlink_disconnected_units(self.sna) _unlink_disconnected_units(self.envd) -- update degraded state for auto control From 59eac62c3367c00e22593c5a23420c4ee2f17839 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 8 Jul 2023 18:07:40 -0400 Subject: [PATCH 06/34] #270 validate reactor PLC status packet types --- install_manifest.json | 2 +- supervisor/session/plc.lua | 37 +++++++++++++++++++++---------------- supervisor/startup.lua | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/install_manifest.json b/install_manifest.json index 99abbb5..764e7c1 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.0", "lockbox": "1.0", "reactor-plc": "v1.5.0", "rtu": "v1.4.0", "supervisor": "v0.19.0", "coordinator": "v0.18.0", "pocket": "alpha-v0.5.1"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5612, "system": 1991, "common": 97476, "graphics": 147195, "lockbox": 34900, "reactor-plc": 97595, "rtu": 102247, "supervisor": 321729, "coordinator": 212109, "pocket": 37633}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.0", "lockbox": "1.0", "reactor-plc": "v1.5.0", "rtu": "v1.4.0", "supervisor": "v0.19.1", "coordinator": "v0.18.0", "pocket": "alpha-v0.5.1"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5612, "system": 1991, "common": 97476, "graphics": 147195, "lockbox": 34900, "reactor-plc": 97595, "rtu": 102247, "supervisor": 322210, "coordinator": 212109, "pocket": 37633}} \ No newline at end of file diff --git a/supervisor/session/plc.lua b/supervisor/session/plc.lua index ac80ea6..8fac94f 100644 --- a/supervisor/session/plc.lua +++ b/supervisor/session/plc.lua @@ -313,26 +313,31 @@ function plc.new_session(id, s_addr, reactor_id, in_queue, out_queue, timeout, f if pkt.type == RPLC_TYPE.STATUS then -- status packet received, update data if pkt.length >= 5 then - self.sDB.last_status_update = pkt.data[1] - self.sDB.control_state = pkt.data[2] - self.sDB.no_reactor = pkt.data[3] - self.sDB.formed = pkt.data[4] - self.sDB.auto_ack_token = pkt.data[5] + if (type(pkt.data[1]) == "number") and (type(pkt.data[2]) == "boolean") and (type(pkt.data[3]) == "boolean") and + (type(pkt.data[4]) == "boolean") and (type(pkt.data[5]) == "number") then + self.sDB.last_status_update = pkt.data[1] + self.sDB.control_state = pkt.data[2] + self.sDB.no_reactor = pkt.data[3] + self.sDB.formed = pkt.data[4] + self.sDB.auto_ack_token = pkt.data[5] - if not self.sDB.no_reactor and self.sDB.formed then - self.sDB.mek_status.heating_rate = pkt.data[6] or 0.0 + if (not self.sDB.no_reactor) and self.sDB.formed and (type(pkt.data[6]) == "number") then + self.sDB.mek_status.heating_rate = pkt.data[6] or 0.0 - -- attempt to read mek_data table - if pkt.data[7] ~= nil then - local status = pcall(_copy_status, pkt.data[7]) - if status then - -- copied in status data OK - self.received_status_cache = true - else - -- error copying status data - log.error(log_header .. "failed to parse status packet data") + -- attempt to read mek_data table + if type(pkt.data[7]) == "table" then + local status = pcall(_copy_status, pkt.data[7]) + if status then + -- copied in status data OK + self.received_status_cache = true + else + -- error copying status data + log.error(log_header .. "failed to parse status packet data") + end end end + else + log.debug(log_header .. "RPLC status packet invalid") end else log.debug(log_header .. "RPLC status packet length mismatch") diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 34f295b..8f2715d 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v0.19.0" +local SUPERVISOR_VERSION = "v0.19.1" local println = util.println local println_ts = util.println_ts From 96c44441849406f754e26a7f629518c25cddd062 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 9 Jul 2023 23:22:24 -0400 Subject: [PATCH 07/34] corrected some comments --- reactor-plc/panel/front_panel.lua | 4 ++-- rtu/panel/front_panel.lua | 4 ++-- supervisor/panel/front_panel.lua | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactor-plc/panel/front_panel.lua b/reactor-plc/panel/front_panel.lua index 12c8266..91f8651 100644 --- a/reactor-plc/panel/front_panel.lua +++ b/reactor-plc/panel/front_panel.lua @@ -1,5 +1,5 @@ -- --- Main SCADA Coordinator GUI +-- Reactor PLC Front Panel GUI -- local types = require("scada-common.types") @@ -28,7 +28,7 @@ local TEXT_ALIGN = core.TEXT_ALIGN local cpair = core.cpair local border = core.border --- create new main view +-- create new front panel view ---@param panel graphics_element main displaybox local function init(panel) local header = TextBox{parent=panel,y=1,text="REACTOR PLC - UNIT ?",alignment=TEXT_ALIGN.CENTER,height=1,fg_bg=style.header} diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index 467386e..640811d 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -1,5 +1,5 @@ -- --- Main SCADA Coordinator GUI +-- RTU Front Panel GUI -- local types = require("scada-common.types") @@ -33,7 +33,7 @@ local UNIT_TYPE_LABELS = { } --- create new main view +-- create new front panel view ---@param panel graphics_element main displaybox ---@param units table unit list local function init(panel, units) diff --git a/supervisor/panel/front_panel.lua b/supervisor/panel/front_panel.lua index b6ee692..4ae6ddd 100644 --- a/supervisor/panel/front_panel.lua +++ b/supervisor/panel/front_panel.lua @@ -1,5 +1,5 @@ -- --- Main SCADA Coordinator GUI +-- Supervisor Front Panel GUI -- local util = require("scada-common.util") @@ -29,7 +29,7 @@ local TEXT_ALIGN = core.TEXT_ALIGN local cpair = core.cpair --- create new main view +-- create new front panel view ---@param panel graphics_element main displaybox local function init(panel) TextBox{parent=panel,y=1,text="SCADA SUPERVISOR",alignment=TEXT_ALIGN.CENTER,height=1,fg_bg=style.header} From bf7a316b04a68e9f684cdc17514ff1d2da9221f9 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 9 Jul 2023 23:24:41 -0400 Subject: [PATCH 08/34] don't start flasher if already started --- graphics/core.lua | 2 +- graphics/flasher.lua | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/graphics/core.lua b/graphics/core.lua index d99ef3b..cff4ff5 100644 --- a/graphics/core.lua +++ b/graphics/core.lua @@ -7,7 +7,7 @@ local flasher = require("graphics.flasher") local core = {} -core.version = "1.0.0" +core.version = "1.0.1" core.flasher = flasher core.events = events diff --git a/graphics/flasher.lua b/graphics/flasher.lua index 520fba7..9412ac7 100644 --- a/graphics/flasher.lua +++ b/graphics/flasher.lua @@ -43,8 +43,10 @@ end -- start/resume the flasher periodic function flasher.run() - active = true - callback_250ms() + if not active then + active = true + callback_250ms() + end end -- clear all blinking indicators and stop the flasher periodic From df61ec2c625dc22f8b7836caa659a8fe907ba951 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 9 Jul 2023 23:31:56 -0400 Subject: [PATCH 09/34] #265 coordinator front panel --- coordinator/coordinator.lua | 14 ++- coordinator/iocontrol.lua | 65 ++++++++++++++ coordinator/renderer.lua | 96 ++++++++++++++++++--- coordinator/session/apisessions.lua | 12 +-- coordinator/session/pocket.lua | 17 ++-- coordinator/startup.lua | 51 +++++++++-- coordinator/ui/components/pkt_entry.lua | 48 +++++++++++ coordinator/ui/layout/front_panel.lua | 108 ++++++++++++++++++++++++ coordinator/ui/pgi.lua | 58 +++++++++++++ coordinator/ui/style.lua | 34 ++++++++ 10 files changed, 465 insertions(+), 38 deletions(-) create mode 100644 coordinator/ui/components/pkt_entry.lua create mode 100644 coordinator/ui/layout/front_panel.lua create mode 100644 coordinator/ui/pgi.lua diff --git a/coordinator/coordinator.lua b/coordinator/coordinator.lua index 11287e7..26009ff 100644 --- a/coordinator/coordinator.lua +++ b/coordinator/coordinator.lua @@ -2,6 +2,7 @@ local comms = require("scada-common.comms") local log = require("scada-common.log") local ppm = require("scada-common.ppm") local util = require("scada-common.util") +local types = require("scada-common.types") local iocontrol = require("coordinator.iocontrol") local process = require("coordinator.process") @@ -12,7 +13,6 @@ local dialog = require("coordinator.ui.dialog") local print = util.print local println = util.println -local println_ts = util.println_ts local PROTOCOL = comms.PROTOCOL local DEVICE_TYPE = comms.DEVICE_TYPE @@ -301,6 +301,7 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, self.sv_addr = comms.BROADCAST self.sv_linked = false self.sv_r_seq_num = nil + iocontrol.fp_link_state(types.PANEL_LINK_STATE.DISCONNECTED) _send_sv(PROTOCOL.SCADA_MGMT, SCADA_MGMT_TYPE.CLOSE, {}) end @@ -474,7 +475,6 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, elseif dev_type == DEVICE_TYPE.PKT then -- pocket linking request local id = apisessions.establish_session(src_addr, firmware_v) - println(util.c("[API] pocket (", firmware_v, ") [@", src_addr, "] \xbb connected")) coordinator.log_comms(util.c("API_ESTABLISH: pocket (", firmware_v, ") [@", src_addr, "] connected with session ID ", id)) _send_api_establish_ack(packet.scada_frame, ESTABLISH_ACK.ALLOW) @@ -639,6 +639,9 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, local config = packet.data[2] if est_ack == ESTABLISH_ACK.ALLOW then + -- reset to disconnected before validating + iocontrol.fp_link_state(types.PANEL_LINK_STATE.DISCONNECTED) + if type(config) == "table" and #config > 1 then -- get configuration @@ -660,6 +663,8 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, self.sv_addr = src_addr self.sv_linked = true self.sv_config_err = false + + iocontrol.fp_link_state(types.PANEL_LINK_STATE.LINKED) else self.sv_config_err = true log.warning("invalid supervisor configuration definitions received, establish failed") @@ -677,14 +682,17 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, if est_ack == ESTABLISH_ACK.DENY then if self.last_est_ack ~= est_ack then + iocontrol.fp_link_state(types.PANEL_LINK_STATE.DENIED) log.info("supervisor connection denied") end elseif est_ack == ESTABLISH_ACK.COLLISION then if self.last_est_ack ~= est_ack then + iocontrol.fp_link_state(types.PANEL_LINK_STATE.COLLISION) log.warning("supervisor connection denied due to collision") end elseif est_ack == ESTABLISH_ACK.BAD_VERSION then if self.last_est_ack ~= est_ack then + iocontrol.fp_link_state(types.PANEL_LINK_STATE.BAD_VERSION) log.warning("supervisor comms version mismatch") end else @@ -720,7 +728,7 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, self.sv_addr = comms.BROADCAST self.sv_linked = false self.sv_r_seq_num = nil - println_ts("server connection closed by remote host") + iocontrol.fp_link_state(types.PANEL_LINK_STATE.DISCONNECTED) log.info("server connection closed by remote host") else log.debug("received unknown SCADA_MGMT packet type " .. packet.type) diff --git a/coordinator/iocontrol.lua b/coordinator/iocontrol.lua index 2eeb5e2..921c626 100644 --- a/coordinator/iocontrol.lua +++ b/coordinator/iocontrol.lua @@ -10,9 +10,15 @@ local util = require("scada-common.util") local process = require("coordinator.process") local sounder = require("coordinator.sounder") +local pgi = require("coordinator.ui.pgi") + local ALARM_STATE = types.ALARM_STATE local PROCESS = types.PROCESS +-- nominal RTT is ping (0ms to 10ms usually) + 500ms for CRD main loop tick +local WARN_RTT = 1000 -- 2x as long as expected w/ 0 ping +local HIGH_RTT = 1500 -- 3.33x as long as expected w/ 0 ping + local iocontrol = {} ---@class ioctl @@ -27,6 +33,19 @@ local function __generic_ack(success) end -- luacheck: unused args +-- initialize front panel PSIL +---@param firmware_v string coordinator version +---@param comms_v string comms version +function iocontrol.init_fp(firmware_v, comms_v) + ---@class ioctl_front_panel + io.fp = { + ps = psil.create() + } + + io.fp.ps.publish("version", firmware_v) + io.fp.ps.publish("comms_version", comms_v) +end + -- initialize the coordinator IO controller ---@param conf facility_conf configuration ---@param comms coord_comms comms reference @@ -189,6 +208,52 @@ function iocontrol.init(conf, comms) process.init(io, comms) end +-- toggle heartbeat indicator +function iocontrol.heartbeat() io.fp.ps.toggle("heartbeat") end + +-- report presence of the wireless modem +---@param has_modem boolean +function iocontrol.fp_has_modem(has_modem) io.fp.ps.publish("has_modem", has_modem) 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 + +-- report supervisor link state +---@param state integer +function iocontrol.fp_link_state(state) io.fp.ps.publish("link_state", state) end + +-- report PKT firmware version and PKT session connection state +---@param session_id integer PKT session +---@param fw string firmware version +---@param s_addr integer PKT computer ID +function iocontrol.fp_pkt_connected(session_id, fw, s_addr) + io.fp.ps.publish("pkt_" .. session_id .. "_fw", fw) + io.fp.ps.publish("pkt_" .. session_id .. "_addr", util.sprintf("@ C% 3d", s_addr)) + pgi.create_pkt_entry(session_id) +end + +-- report PKT session disconnected +---@param session_id integer PKT session +function iocontrol.fp_pkt_disconnected(session_id) + pgi.delete_pkt_entry(session_id) +end + +-- transmit PKT session RTT +---@param session_id integer PKT session +---@param rtt integer round trip time +function iocontrol.fp_pkt_rtt(session_id, rtt) + io.fp.ps.publish("pkt_" .. session_id .. "_rtt", rtt) + + if rtt > HIGH_RTT then + io.fp.ps.publish("pkt_" .. session_id .. "_rtt_color", colors.red) + elseif rtt > WARN_RTT then + io.fp.ps.publish("pkt_" .. session_id .. "_rtt_color", colors.yellow_hc) + else + io.fp.ps.publish("pkt_" .. session_id .. "_rtt_color", colors.green) + end +end + -- populate facility structure builds ---@param build table ---@return boolean valid diff --git a/coordinator/renderer.lua b/coordinator/renderer.lua index fec6629..16ea6a9 100644 --- a/coordinator/renderer.lua +++ b/coordinator/renderer.lua @@ -6,7 +6,9 @@ local log = require("scada-common.log") local util = require("scada-common.util") local style = require("coordinator.ui.style") +local pgi = require("coordinator.ui.pgi") +local panel_view = require("coordinator.ui.layout.front_panel") local main_view = require("coordinator.ui.layout.main_view") local unit_view = require("coordinator.ui.layout.unit_view") @@ -21,7 +23,9 @@ local engine = { monitors = nil, ---@type monitors_struct|nil dmesg_window = nil, ---@type table|nil ui_ready = false, + fp_ready = false, ui = { + front_panel = nil, ---@type graphics_element|nil main_display = nil, ---@type graphics_element|nil unit_displays = {} } @@ -44,9 +48,7 @@ end -- link to the monitor peripherals ---@param monitors monitors_struct -function renderer.set_displays(monitors) - engine.monitors = monitors -end +function renderer.set_displays(monitors) engine.monitors = monitors end -- check if the renderer is configured to use a given monitor peripheral ---@nodiscard @@ -75,6 +77,17 @@ function renderer.init_displays() for _, monitor in ipairs(engine.monitors.unit_displays) do _init_display(monitor) end + + -- init terminal + term.setTextColor(colors.white) + term.setBackgroundColor(colors.black) + term.clear() + term.setCursorPos(1, 1) + + -- set overridden colors + for i = 1, #style.fp.colors do + term.setPaletteColor(style.fp.colors[i].c, style.fp.colors[i].hex) + end end -- check main display width @@ -109,6 +122,21 @@ function renderer.init_dmesg() log.direct_dmesg(engine.dmesg_window) end +-- start the coordinator front panel +function renderer.start_fp() + if not engine.fp_ready then + -- show front panel view on terminal + engine.ui.front_panel = DisplayBox{window=term.native(),fg_bg=style.fp.root} + panel_view(engine.ui.front_panel) + + -- start flasher callback task + flasher.run() + + -- report front panel as ready + engine.fp_ready = true + end +end + -- start the coordinator GUI function renderer.start_ui() if not engine.ui_ready then @@ -133,10 +161,42 @@ function renderer.start_ui() end end +-- close out the front panel +function renderer.close_fp() + if engine.fp_ready then + if not engine.ui_ready then + -- stop blinking indicators + flasher.clear() + end + + -- disable PGI + pgi.unlink() + + -- hide to stop animation callbacks and clear root UI elements + engine.ui.front_panel.hide() + engine.ui.front_panel = nil + engine.fp_ready = false + + -- restore colors + for i = 1, #style.colors do + local r, g, b = term.nativePaletteColor(style.colors[i].c) + term.setPaletteColor(style.colors[i].c, r, g, b) + end + + -- reset terminal + term.setTextColor(colors.white) + term.setBackgroundColor(colors.black) + term.clear() + term.setCursorPos(1, 1) + end +end + -- close out the UI function renderer.close_ui() - -- stop blinking indicators - flasher.clear() + if not engine.fp_ready then + -- stop blinking indicators + flasher.clear() + end -- delete element trees if engine.ui.main_display ~= nil then engine.ui.main_display.delete() end @@ -157,6 +217,11 @@ function renderer.close_ui() engine.dmesg_window.redraw() end +-- is the front panel ready? +---@nodiscard +---@return boolean ready +function renderer.fp_ready() return engine.fp_ready end + -- is the UI ready? ---@nodiscard ---@return boolean ready @@ -165,14 +230,19 @@ function renderer.ui_ready() return engine.ui_ready end -- handle a touch event ---@param event mouse_interaction|nil function renderer.handle_mouse(event) - if engine.ui_ready and event ~= nil then - if event.monitor == engine.monitors.primary_name then - engine.ui.main_display.handle_mouse(event) - else - for id, monitor in ipairs(engine.monitors.unit_name_map) do - if event.monitor == monitor then - local layout = engine.ui.unit_displays[id] ---@type graphics_element - layout.handle_mouse(event) + if event ~= nil then + if engine.fp_ready and event.monitor == "terminal" then + engine.ui.front_panel.handle_mouse(event) + elseif engine.ui_ready then + if event.monitor == engine.monitors.primary_name then + engine.ui.main_display.handle_mouse(event) + else + for id, monitor in ipairs(engine.monitors.unit_name_map) do + if event.monitor == monitor then + local layout = engine.ui.unit_displays[id] ---@type graphics_element + layout.handle_mouse(event) + break + end end end end diff --git a/coordinator/session/apisessions.lua b/coordinator/session/apisessions.lua index 1ea1beb..c1f1d4e 100644 --- a/coordinator/session/apisessions.lua +++ b/coordinator/session/apisessions.lua @@ -1,11 +1,12 @@ -local log = require("scada-common.log") -local mqueue = require("scada-common.mqueue") -local util = require("scada-common.util") +local log = require("scada-common.log") +local mqueue = require("scada-common.mqueue") +local util = require("scada-common.util") -local config = require("coordinator.config") +local config = require("coordinator.config") +local iocontrol = require("coordinator.iocontrol") -local pocket = require("coordinator.session.pocket") +local pocket = require("coordinator.session.pocket") local apisessions = {} @@ -112,6 +113,7 @@ function apisessions.establish_session(source_addr, version) setmetatable(pkt_s, mt) + iocontrol.fp_pkt_connected(id, version, source_addr) log.debug(util.c("[API] established new session: ", pkt_s)) self.next_id = id + 1 diff --git a/coordinator/session/pocket.lua b/coordinator/session/pocket.lua index ddabdda..f5211a7 100644 --- a/coordinator/session/pocket.lua +++ b/coordinator/session/pocket.lua @@ -1,7 +1,9 @@ -local comms = require("scada-common.comms") -local log = require("scada-common.log") -local mqueue = require("scada-common.mqueue") -local util = require("scada-common.util") +local comms = require("scada-common.comms") +local log = require("scada-common.log") +local mqueue = require("scada-common.mqueue") +local util = require("scada-common.util") + +local iocontrol = require("coordinator.iocontrol") local pocket = {} @@ -9,8 +11,6 @@ local PROTOCOL = comms.PROTOCOL -- local CAPI_TYPE = comms.CAPI_TYPE local SCADA_MGMT_TYPE = comms.SCADA_MGMT_TYPE -local println = util.println - -- retry time constants in ms -- local INITIAL_WAIT = 1500 -- local RETRY_PERIOD = 1000 @@ -69,6 +69,7 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout) local function _close() self.conn_watchdog.cancel() self.connected = false + iocontrol.fp_pkt_disconnected(id) end -- send a CAPI packet @@ -140,6 +141,8 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout) -- log.debug(log_header .. "PKT RTT = " .. self.last_rtt .. "ms") -- log.debug(log_header .. "PKT TT = " .. (srv_now - api_send) .. "ms") + + iocontrol.fp_pkt_rtt(id, self.last_rtt) else log.debug(log_header .. "SCADA keep alive packet length mismatch") end @@ -172,7 +175,6 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout) function public.close() _close() _send_mgmt(SCADA_MGMT_TYPE.CLOSE, {}) - println("connection to pocket session " .. id .. " closed by server") log.info(log_header .. "session closed by server") end @@ -211,7 +213,6 @@ function pocket.new_session(id, s_addr, in_queue, out_queue, timeout) -- exit if connection was closed if not self.connected then - println("connection to pocket session " .. id .. " closed by remote host") log.info(log_header .. "session closed by remote host") return self.connected end diff --git a/coordinator/startup.lua b/coordinator/startup.lua index f58642d..6a97896 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -4,6 +4,7 @@ require("/initenv").init_env() +local comms = require("scada-common.comms") local crash = require("scada-common.crash") local log = require("scada-common.log") local network = require("scada-common.network") @@ -21,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.18.0" +local COORDINATOR_VERSION = "v0.19.0" local println = util.println local println_ts = util.println_ts @@ -80,6 +81,9 @@ local function main() -- mount connected devices ppm.mount_all() + -- report versions/init fp PSIL + iocontrol.init_fp(COORDINATOR_VERSION, comms.version) + -- setup monitors local configured, monitors = coordinator.configure_monitors(config.NUM_UNITS) if not configured or monitors == nil then @@ -127,6 +131,7 @@ local function main() sounder.init(speaker, config.SOUNDER_VOLUME) log_boot("tone generation took " .. (util.time_ms() - sounder_start) .. "ms") log_sys("annunciator alarm configured") + iocontrol.fp_has_speaker(true) end ---------------------------------------- @@ -148,6 +153,7 @@ local function main() return else log_comms("wireless modem connected") + iocontrol.fp_has_modem(true) end -- create connection watchdog @@ -166,6 +172,21 @@ local function main() local MAIN_CLOCK = 0.5 local loop_clock = util.new_clock(MAIN_CLOCK) + ---------------------------------------- + -- start front panel + ---------------------------------------- + + log_graphics("starting front panel UI...") + + local fp_ok, fp_message = pcall(renderer.start_fp) + if not fp_ok then + renderer.close_fp() + log_graphics(util.c("front panel UI error: ", fp_message)) + println_ts("front panel UI creation failed") + log.fatal(util.c("front panel GUI render failed with error ", fp_message)) + return + else log_graphics("front panel ready") end + ---------------------------------------- -- connect to the supervisor ---------------------------------------- @@ -199,18 +220,18 @@ local function main() -- start up the UI ---@return boolean ui_ok started ok local function init_start_ui() - log_graphics("starting UI...") + log_graphics("starting main UI...") local draw_start = util.time_ms() - local ui_ok, message = pcall(renderer.start_ui) + local ui_ok, ui_message = pcall(renderer.start_ui) if not ui_ok then renderer.close_ui() - log_graphics(util.c("UI crashed: ", message)) - println_ts("UI crashed") - log.fatal(util.c("GUI crashed with error ", message)) + log_graphics(util.c("main UI error: ", ui_message)) + println_ts("main UI creation failed") + log.fatal(util.c("main GUI render failed with error ", ui_message)) else - log_graphics("first UI draw took " .. (util.time_ms() - draw_start) .. "ms") + log_graphics("first main UI draw took " .. (util.time_ms() - draw_start) .. "ms") -- start clock loop_clock.start() @@ -257,6 +278,8 @@ local function main() -- alert user to status log_sys("awaiting comms modem reconnect...") + + iocontrol.fp_has_modem(false) else log_sys("non-comms modem disconnected") end @@ -275,6 +298,8 @@ local function main() local msg = "lost alarm sounder speaker" println_ts(msg) log_sys(msg) + + iocontrol.fp_has_speaker(false) end end elseif event == "peripheral" then @@ -292,6 +317,8 @@ local function main() -- re-init system if not init_connect_sv() then break end ui_ok = init_start_ui() + + iocontrol.fp_has_modem(true) else log_sys("wired modem reconnected") end @@ -302,12 +329,15 @@ local function main() local msg = "alarm sounder speaker reconnected" println_ts(msg) log_sys(msg) + sounder.reconnect(device) + iocontrol.fp_has_speaker(true) end end elseif event == "timer" then if loop_clock.is_clock(param1) then -- main loop tick + iocontrol.heartbeat() -- iterate sessions apisessions.iterate_all() @@ -364,8 +394,9 @@ local function main() ui_ok = init_start_ui() end end - elseif event == "monitor_touch" then - -- handle a monitor touch event + elseif event == "monitor_touch" or event == "mouse_click" or event == "mouse_up" or + event == "mouse_drag" or event == "mouse_scroll" then + -- handle a mouse event renderer.handle_mouse(core.events.new_mouse_event(event, param1, param2, param3)) elseif event == "speaker_audio_empty" then -- handle speaker buffer emptied @@ -386,6 +417,7 @@ local function main() end renderer.close_ui() + renderer.close_fp() sounder.stop() log_sys("system shutdown") @@ -395,6 +427,7 @@ end if not xpcall(main, crash.handler) then pcall(renderer.close_ui) + pcall(renderer.close_fp) pcall(sounder.stop) crash.exit() else diff --git a/coordinator/ui/components/pkt_entry.lua b/coordinator/ui/components/pkt_entry.lua new file mode 100644 index 0000000..8ba805c --- /dev/null +++ b/coordinator/ui/components/pkt_entry.lua @@ -0,0 +1,48 @@ +-- +-- Pocket Connection Entry +-- + +local iocontrol = require("coordinator.iocontrol") + +local core = require("graphics.core") + +local Div = require("graphics.elements.div") +local TextBox = require("graphics.elements.textbox") + +local DataIndicator = require("graphics.elements.indicators.data") + +local TEXT_ALIGN = core.TEXT_ALIGN + +local cpair = core.cpair + +-- create a pocket list entry +---@param parent graphics_element parent +---@param id integer PKT session ID +local function init(parent, id) + local ps = iocontrol.get_db().fp.ps + + -- root div + local root = Div{parent=parent,x=2,y=2,height=4,width=parent.get_width()-2,hidden=true} + local entry = Div{parent=root,x=2,y=1,height=3,fg_bg=cpair(colors.black,colors.white)} + + local ps_prefix = "pkt_" .. id .. "_" + + TextBox{parent=entry,x=1,y=1,text="",width=8,height=1,fg_bg=cpair(colors.black,colors.lightGray)} + local pkt_addr = TextBox{parent=entry,x=1,y=2,text="@ C ??",alignment=TEXT_ALIGN.CENTER,width=8,height=1,fg_bg=cpair(colors.black,colors.lightGray),nav_active=cpair(colors.gray,colors.black)} + TextBox{parent=entry,x=1,y=3,text="",width=8,height=1,fg_bg=cpair(colors.black,colors.lightGray)} + pkt_addr.register(ps, ps_prefix .. "addr", pkt_addr.set_value) + + TextBox{parent=entry,x=10,y=2,text="FW:",width=3,height=1} + local pkt_fw_v = TextBox{parent=entry,x=14,y=2,text=" ------- ",width=20,height=1,fg_bg=cpair(colors.lightGray,colors.white)} + pkt_fw_v.register(ps, ps_prefix .. "fw", pkt_fw_v.set_value) + + TextBox{parent=entry,x=35,y=2,text="RTT:",width=4,height=1} + local pkt_rtt = DataIndicator{parent=entry,x=40,y=2,label="",unit="",format="%5d",value=0,width=5,fg_bg=cpair(colors.lightGray,colors.white)} + TextBox{parent=entry,x=46,y=2,text="ms",width=4,height=1,fg_bg=cpair(colors.lightGray,colors.white)} + pkt_rtt.register(ps, ps_prefix .. "rtt", pkt_rtt.update) + pkt_rtt.register(ps, ps_prefix .. "rtt_color", pkt_rtt.recolor) + + return root +end + +return init diff --git a/coordinator/ui/layout/front_panel.lua b/coordinator/ui/layout/front_panel.lua new file mode 100644 index 0000000..176299e --- /dev/null +++ b/coordinator/ui/layout/front_panel.lua @@ -0,0 +1,108 @@ +-- +-- Coordinator Front Panel GUI +-- + +local types = require("scada-common.types") +local util = require("scada-common.util") + +local iocontrol = require("coordinator.iocontrol") + +local pgi = require("coordinator.ui.pgi") +local style = require("coordinator.ui.style") + +local pkt_entry = require("coordinator.ui.components.pkt_entry") + +local core = require("graphics.core") + +local Div = require("graphics.elements.div") +local ListBox = require("graphics.elements.listbox") +local MultiPane = require("graphics.elements.multipane") +local TextBox = require("graphics.elements.textbox") + +local TabBar = require("graphics.elements.controls.tabbar") + +local LED = require("graphics.elements.indicators.led") +local RGBLED = require("graphics.elements.indicators.ledrgb") + +local TEXT_ALIGN = core.TEXT_ALIGN + +local cpair = core.cpair + +-- create new front panel view +---@param panel graphics_element main displaybox +local function init(panel) + local ps = iocontrol.get_db().fp.ps + + TextBox{parent=panel,y=1,text="SCADA COORDINATOR",alignment=TEXT_ALIGN.CENTER,height=1,fg_bg=style.fp.header} + + local page_div = Div{parent=panel,x=1,y=3} + + -- + -- system indicators + -- + + local main_page = Div{parent=page_div,x=1,y=1} + + local system = Div{parent=main_page,width=14,height=17,x=2,y=2} + + local status = LED{parent=system,label="STATUS",colors=cpair(colors.green,colors.red)} + local heartbeat = LED{parent=system,label="HEARTBEAT",colors=cpair(colors.green,colors.green_off)} + status.update(true) + system.line_break() + + heartbeat.register(ps, "heartbeat", heartbeat.update) + + local modem = LED{parent=system,label="MODEM",colors=cpair(colors.green,colors.green_off)} + local network = RGBLED{parent=system,label="NETWORK",colors={colors.green,colors.red,colors.orange,colors.yellow,colors.gray}} + network.update(types.PANEL_LINK_STATE.DISCONNECTED) + system.line_break() + + modem.register(ps, "has_modem", modem.update) + network.register(ps, "link_state", network.update) + + local speaker = LED{parent=system,label="SPEAKER",colors=cpair(colors.green,colors.green_off)} + speaker.register(ps, "has_speaker", speaker.update) + +---@diagnostic disable-next-line: undefined-field + local comp_id = util.sprintf("(%d)", os.getComputerID()) + TextBox{parent=system,x=9,y=4,width=6,height=1,text=comp_id,fg_bg=cpair(colors.lightGray,colors.ivory)} + + -- + -- about footer + -- + + local about = Div{parent=main_page,width=15,height=3,x=1,y=16,fg_bg=cpair(colors.lightGray,colors.ivory)} + local fw_v = TextBox{parent=about,x=1,y=1,text="FW: v00.00.00",alignment=TEXT_ALIGN.LEFT,height=1} + local comms_v = TextBox{parent=about,x=1,y=2,text="NT: v00.00.00",alignment=TEXT_ALIGN.LEFT,height=1} + + fw_v.register(ps, "version", function (version) fw_v.set_value(util.c("FW: ", version)) end) + comms_v.register(ps, "comms_version", function (version) comms_v.set_value(util.c("NT: v", version)) end) + + -- + -- page handling + -- + + -- API page + + local api_page = Div{parent=page_div,x=1,y=1,hidden=true} + local api_list = ListBox{parent=api_page,x=1,y=1,height=17,width=51,scroll_height=1000,fg_bg=cpair(colors.black,colors.ivory),nav_fg_bg=cpair(colors.gray,colors.lightGray),nav_active=cpair(colors.black,colors.gray)} + local _ = Div{parent=api_list,height=1,hidden=true} -- padding + + -- assemble page panes + + local panes = { main_page, api_page } + + local page_pane = MultiPane{parent=page_div,x=1,y=1,panes=panes} + + local tabs = { + { name = "CRD", color = cpair(colors.black, colors.ivory) }, + { name = "API", color = cpair(colors.black, colors.ivory) }, + } + + TabBar{parent=panel,y=2,tabs=tabs,min_width=9,callback=page_pane.set_value,fg_bg=cpair(colors.black,colors.white)} + + -- link pocket API list management to PGI + pgi.link_elements(api_list, pkt_entry) +end + +return init diff --git a/coordinator/ui/pgi.lua b/coordinator/ui/pgi.lua new file mode 100644 index 0000000..5e4077f --- /dev/null +++ b/coordinator/ui/pgi.lua @@ -0,0 +1,58 @@ +-- +-- Protected Graphics Interface +-- + +local log = require("scada-common.log") +local util = require("scada-common.util") + +local pgi = {} + +local data = { + pkt_list = nil, ---@type nil|graphics_element + pkt_entry = nil, ---@type function + -- session entries + s_entries = { pkt = {} } +} + +-- link list boxes +---@param pkt_list graphics_element pocket list element +---@param pkt_entry function pocket entry constructor +function pgi.link_elements(pkt_list, pkt_entry) + data.pkt_list = pkt_list + data.pkt_entry = pkt_entry +end + +-- unlink all fields, disabling the PGI +function pgi.unlink() + data.pkt_list = nil + data.pkt_entry = nil +end + +-- add a PKT entry to the PKT list +---@param session_id integer pocket session +function pgi.create_pkt_entry(session_id) + if data.pkt_list ~= nil and data.pkt_entry ~= nil then + local success, result = pcall(data.pkt_entry, data.pkt_list, session_id) + + if success then + data.s_entries.pkt[session_id] = result + else + log.error(util.c("PGI: failed to create PKT entry (", result, ")"), true) + end + end +end + +-- delete a PKT entry from the PKT list +---@param session_id integer pocket session +function pgi.delete_pkt_entry(session_id) + if data.s_entries.pkt[session_id] ~= nil then + local success, result = pcall(data.s_entries.pkt[session_id].delete) + data.s_entries.pkt[session_id] = nil + + if not success then + log.error(util.c("PGI: failed to delete PKT entry (", result, ")"), true) + end + end +end + +return pgi diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 46faf4a..1fd569f 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -10,6 +10,40 @@ local cpair = core.cpair -- GLOBAL -- +-- add color mappings for front panel +colors.ivory = colors.pink +colors.red_off = colors.brown +colors.yellow_off = colors.magenta +colors.green_off = colors.lime + +-- front panel styling + +style.fp = {} + +style.fp.root = cpair(colors.black, colors.ivory) +style.fp.header = cpair(colors.black, colors.lightGray) + +style.fp.colors = { + { c = colors.red, hex = 0xdf4949 }, -- RED ON + { c = colors.orange, hex = 0xffb659 }, + { c = colors.yellow, hex = 0xf9fb53 }, -- YELLOW ON + { c = colors.lime, hex = 0x16665a }, -- GREEN OFF + { c = colors.green, hex = 0x6be551 }, -- GREEN ON + { c = colors.cyan, hex = 0x34bac8 }, + { c = colors.lightBlue, hex = 0x6cc0f2 }, + { c = colors.blue, hex = 0x0096ff }, + { c = colors.purple, hex = 0xb156ee }, + { c = colors.pink, hex = 0xdcd9ca }, -- IVORY + { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF + -- { c = colors.white, hex = 0xdcd9ca }, + { c = colors.lightGray, hex = 0xb1b8b3 }, + { c = colors.gray, hex = 0x575757 }, + -- { c = colors.black, hex = 0x191919 }, + { c = colors.brown, hex = 0x672223 } -- RED OFF +} + +-- main GUI styling + style.root = cpair(colors.black, colors.lightGray) style.header = cpair(colors.white, colors.gray) style.label = cpair(colors.gray, colors.lightGray) From 1edee7f64b9b3660f56a72e40c28d56416400e02 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 9 Jul 2023 23:42:44 -0400 Subject: [PATCH 10/34] updated graphics comments --- graphics/elements/animations/waiting.lua | 2 +- graphics/elements/colormap.lua | 2 +- graphics/elements/controls/checkbox.lua | 2 +- graphics/elements/controls/hazard_button.lua | 2 +- graphics/elements/controls/multi_button.lua | 2 +- graphics/elements/controls/push_button.lua | 2 +- graphics/elements/controls/radio_button.lua | 2 +- graphics/elements/controls/sidebar.lua | 2 +- graphics/elements/controls/spinbox_numeric.lua | 2 +- graphics/elements/controls/switch_button.lua | 2 +- graphics/elements/controls/tabbar.lua | 2 +- graphics/elements/div.lua | 2 +- graphics/elements/indicators/alight.lua | 2 +- graphics/elements/indicators/coremap.lua | 2 +- graphics/elements/indicators/data.lua | 2 +- graphics/elements/indicators/hbar.lua | 2 +- graphics/elements/indicators/icon.lua | 2 +- graphics/elements/indicators/led.lua | 2 +- graphics/elements/indicators/ledpair.lua | 2 +- graphics/elements/indicators/ledrgb.lua | 2 +- graphics/elements/indicators/light.lua | 2 +- graphics/elements/indicators/power.lua | 2 +- graphics/elements/indicators/rad.lua | 2 +- graphics/elements/indicators/state.lua | 2 +- graphics/elements/indicators/trilight.lua | 2 +- graphics/elements/indicators/vbar.lua | 2 +- graphics/elements/listbox.lua | 2 +- graphics/elements/multipane.lua | 2 +- graphics/elements/pipenet.lua | 2 +- graphics/elements/rectangle.lua | 2 +- graphics/elements/textbox.lua | 2 +- graphics/elements/tiling.lua | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/graphics/elements/animations/waiting.lua b/graphics/elements/animations/waiting.lua index 286c82e..77aacdb 100644 --- a/graphics/elements/animations/waiting.lua +++ b/graphics/elements/animations/waiting.lua @@ -8,7 +8,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/colormap.lua b/graphics/elements/colormap.lua index be92d83..4d84e8b 100644 --- a/graphics/elements/colormap.lua +++ b/graphics/elements/colormap.lua @@ -8,7 +8,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field hidden? boolean true to hide on initial draw -- new color map diff --git a/graphics/elements/controls/checkbox.lua b/graphics/elements/controls/checkbox.lua index 2867d8b..b8557ae 100644 --- a/graphics/elements/controls/checkbox.lua +++ b/graphics/elements/controls/checkbox.lua @@ -10,7 +10,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/controls/hazard_button.lua b/graphics/elements/controls/hazard_button.lua index 4745f4f..fcec4bd 100644 --- a/graphics/elements/controls/hazard_button.lua +++ b/graphics/elements/controls/hazard_button.lua @@ -14,7 +14,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/controls/multi_button.lua b/graphics/elements/controls/multi_button.lua index 279c9a7..020c68d 100644 --- a/graphics/elements/controls/multi_button.lua +++ b/graphics/elements/controls/multi_button.lua @@ -20,7 +20,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field height? integer parent height if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/controls/push_button.lua b/graphics/elements/controls/push_button.lua index e6f4920..5644e59 100644 --- a/graphics/elements/controls/push_button.lua +++ b/graphics/elements/controls/push_button.lua @@ -16,7 +16,7 @@ local CLICK_TYPE = core.events.CLICK_TYPE ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field height? integer parent height if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/controls/radio_button.lua b/graphics/elements/controls/radio_button.lua index e3edf24..0063bee 100644 --- a/graphics/elements/controls/radio_button.lua +++ b/graphics/elements/controls/radio_button.lua @@ -13,7 +13,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/controls/sidebar.lua b/graphics/elements/controls/sidebar.lua index d43317a..977481c 100644 --- a/graphics/elements/controls/sidebar.lua +++ b/graphics/elements/controls/sidebar.lua @@ -17,7 +17,7 @@ local CLICK_TYPE = core.events.CLICK_TYPE ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field height? integer parent height if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/controls/spinbox_numeric.lua b/graphics/elements/controls/spinbox_numeric.lua index 767d97b..1cdfa26 100644 --- a/graphics/elements/controls/spinbox_numeric.lua +++ b/graphics/elements/controls/spinbox_numeric.lua @@ -16,7 +16,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/controls/switch_button.lua b/graphics/elements/controls/switch_button.lua index 6d2e09c..92fd9a5 100644 --- a/graphics/elements/controls/switch_button.lua +++ b/graphics/elements/controls/switch_button.lua @@ -12,7 +12,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field height? integer parent height if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/controls/tabbar.lua b/graphics/elements/controls/tabbar.lua index da4738b..0989534 100644 --- a/graphics/elements/controls/tabbar.lua +++ b/graphics/elements/controls/tabbar.lua @@ -18,7 +18,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width? integer parent width if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/div.lua b/graphics/elements/div.lua index 4b6bd6a..0af3259 100644 --- a/graphics/elements/div.lua +++ b/graphics/elements/div.lua @@ -6,7 +6,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width? integer parent width if omitted ---@field height? integer parent height if omitted ---@field gframe? graphics_frame frame instead of x/y/width/height diff --git a/graphics/elements/indicators/alight.lua b/graphics/elements/indicators/alight.lua index ff9b1ad..b3e9ab8 100644 --- a/graphics/elements/indicators/alight.lua +++ b/graphics/elements/indicators/alight.lua @@ -16,7 +16,7 @@ local flasher = require("graphics.flasher") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/coremap.lua b/graphics/elements/indicators/coremap.lua index 127a8a3..997bec8 100644 --- a/graphics/elements/indicators/coremap.lua +++ b/graphics/elements/indicators/coremap.lua @@ -11,7 +11,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted -- new core map box ---@nodiscard diff --git a/graphics/elements/indicators/data.lua b/graphics/elements/indicators/data.lua index 9282a03..5717d2c 100644 --- a/graphics/elements/indicators/data.lua +++ b/graphics/elements/indicators/data.lua @@ -14,7 +14,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width integer length ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/hbar.lua b/graphics/elements/indicators/hbar.lua index 9bee59f..0d61374 100644 --- a/graphics/elements/indicators/hbar.lua +++ b/graphics/elements/indicators/hbar.lua @@ -10,7 +10,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width? integer parent width if omitted ---@field height? integer parent height if omitted ---@field gframe? graphics_frame frame instead of x/y/width/height diff --git a/graphics/elements/indicators/icon.lua b/graphics/elements/indicators/icon.lua index 03c88fb..710fa5b 100644 --- a/graphics/elements/indicators/icon.lua +++ b/graphics/elements/indicators/icon.lua @@ -16,7 +16,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/led.lua b/graphics/elements/indicators/led.lua index 077cab3..f81d7e9 100644 --- a/graphics/elements/indicators/led.lua +++ b/graphics/elements/indicators/led.lua @@ -14,7 +14,7 @@ local flasher = require("graphics.flasher") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/ledpair.lua b/graphics/elements/indicators/ledpair.lua index 47c9a0a..97099d2 100644 --- a/graphics/elements/indicators/ledpair.lua +++ b/graphics/elements/indicators/ledpair.lua @@ -16,7 +16,7 @@ local flasher = require("graphics.flasher") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/ledrgb.lua b/graphics/elements/indicators/ledrgb.lua index dbcb947..8c9802f 100644 --- a/graphics/elements/indicators/ledrgb.lua +++ b/graphics/elements/indicators/ledrgb.lua @@ -9,7 +9,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/light.lua b/graphics/elements/indicators/light.lua index d4e8b09..2f68e9b 100644 --- a/graphics/elements/indicators/light.lua +++ b/graphics/elements/indicators/light.lua @@ -14,7 +14,7 @@ local flasher = require("graphics.flasher") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/power.lua b/graphics/elements/indicators/power.lua index 323fe58..5f1641e 100644 --- a/graphics/elements/indicators/power.lua +++ b/graphics/elements/indicators/power.lua @@ -13,7 +13,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width integer length ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/rad.lua b/graphics/elements/indicators/rad.lua index fc89044..83c9619 100644 --- a/graphics/elements/indicators/rad.lua +++ b/graphics/elements/indicators/rad.lua @@ -14,7 +14,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width integer length ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/state.lua b/graphics/elements/indicators/state.lua index d0e57b5..cff1798 100644 --- a/graphics/elements/indicators/state.lua +++ b/graphics/elements/indicators/state.lua @@ -15,7 +15,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field height? integer 1 if omitted, must be an odd number ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/trilight.lua b/graphics/elements/indicators/trilight.lua index ef8a8b6..151463f 100644 --- a/graphics/elements/indicators/trilight.lua +++ b/graphics/elements/indicators/trilight.lua @@ -16,7 +16,7 @@ local flasher = require("graphics.flasher") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field fg_bg? cpair foreground/background colors ---@field hidden? boolean true to hide on initial draw diff --git a/graphics/elements/indicators/vbar.lua b/graphics/elements/indicators/vbar.lua index 4cfb6e7..36cc74d 100644 --- a/graphics/elements/indicators/vbar.lua +++ b/graphics/elements/indicators/vbar.lua @@ -8,7 +8,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width? integer parent width if omitted ---@field height? integer parent height if omitted ---@field gframe? graphics_frame frame instead of x/y/width/height diff --git a/graphics/elements/listbox.lua b/graphics/elements/listbox.lua index e37a772..7be8e77 100644 --- a/graphics/elements/listbox.lua +++ b/graphics/elements/listbox.lua @@ -15,7 +15,7 @@ local CLICK_TYPE = core.events.CLICK_TYPE ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width? integer parent width if omitted ---@field height? integer parent height if omitted ---@field gframe? graphics_frame frame instead of x/y/width/height diff --git a/graphics/elements/multipane.lua b/graphics/elements/multipane.lua index 790b595..fff8fb3 100644 --- a/graphics/elements/multipane.lua +++ b/graphics/elements/multipane.lua @@ -7,7 +7,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width? integer parent width if omitted ---@field height? integer parent height if omitted ---@field gframe? graphics_frame frame instead of x/y/width/height diff --git a/graphics/elements/pipenet.lua b/graphics/elements/pipenet.lua index 5ca4745..efe6179 100644 --- a/graphics/elements/pipenet.lua +++ b/graphics/elements/pipenet.lua @@ -11,7 +11,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field hidden? boolean true to hide on initial draw -- new pipe network diff --git a/graphics/elements/rectangle.lua b/graphics/elements/rectangle.lua index c3cff14..1d8afae 100644 --- a/graphics/elements/rectangle.lua +++ b/graphics/elements/rectangle.lua @@ -11,7 +11,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width? integer parent width if omitted ---@field height? integer parent height if omitted ---@field gframe? graphics_frame frame instead of x/y/width/height diff --git a/graphics/elements/textbox.lua b/graphics/elements/textbox.lua index e72571b..521c499 100644 --- a/graphics/elements/textbox.lua +++ b/graphics/elements/textbox.lua @@ -13,7 +13,7 @@ local TEXT_ALIGN = core.TEXT_ALIGN ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width? integer parent width if omitted ---@field height? integer parent height if omitted ---@field gframe? graphics_frame frame instead of x/y/width/height diff --git a/graphics/elements/tiling.lua b/graphics/elements/tiling.lua index 536ed45..4c0d0ba 100644 --- a/graphics/elements/tiling.lua +++ b/graphics/elements/tiling.lua @@ -11,7 +11,7 @@ local element = require("graphics.element") ---@field parent graphics_element ---@field id? string element id ---@field x? integer 1 if omitted ----@field y? integer 1 if omitted +---@field y? integer auto incremented if omitted ---@field width? integer parent width if omitted ---@field height? integer parent height if omitted ---@field gframe? graphics_frame frame instead of x/y/width/height From a2e0999cea7889f3f6489809b8c6870e2a80aaee Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 13:32:26 -0400 Subject: [PATCH 11/34] combine coordinator supervisor connection event loop with main loop --- coordinator/coordinator.lua | 202 +++++++++++++++++++----------------- coordinator/startup.lua | 142 +++++++++---------------- 2 files changed, 158 insertions(+), 186 deletions(-) diff --git a/coordinator/coordinator.lua b/coordinator/coordinator.lua index 26009ff..c12f9fb 100644 --- a/coordinator/coordinator.lua +++ b/coordinator/coordinator.lua @@ -22,6 +22,8 @@ local SCADA_CRDN_TYPE = comms.SCADA_CRDN_TYPE local UNIT_COMMAND = comms.UNIT_COMMAND local FAC_COMMAND = comms.FAC_COMMAND +local LINK_TIMEOUT = 60.0 + local coordinator = {} -- request the user to select a monitor @@ -227,9 +229,12 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, sv_seq_num = 0, sv_r_seq_num = nil, sv_config_err = false, - connected = false, last_est_ack = ESTABLISH_ACK.ALLOW, - last_api_est_acks = {} + last_api_est_acks = {}, + est_start = 0, + est_last = 0, + est_tick_waiting = nil, + est_task_done = nil } comms.set_trusted_range(range) @@ -295,6 +300,63 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, ---@class coord_comms local public = {} + -- try to connect to the supervisor if not already linked + ---@param abort boolean? true to print out cancel info if not linked (use on program terminate) + ---@return boolean ok, boolean start_ui + function public.try_connect(abort) + local ok = true + local start_ui = false + + if not self.sv_linked then + if self.est_tick_waiting == nil then + self.est_start = util.time_s() + self.est_last = self.est_start + + self.est_tick_waiting, self.est_task_done = + coordinator.log_comms_connecting("attempting to connect to configured supervisor on channel " .. svr_channel) + + _send_establish() + else + self.est_tick_waiting(math.max(0, LINK_TIMEOUT - (util.time_s() - self.est_start))) + end + + if abort or (util.time_s() - self.est_start) >= LINK_TIMEOUT then + self.est_task_done(false) + + if abort then + coordinator.log_comms("supervisor connection attempt cancelled by user") + elseif self.sv_config_err then + coordinator.log_comms("supervisor cooling configuration invalid, check supervisor config file") + elseif not self.sv_linked then + if self.last_est_ack == ESTABLISH_ACK.DENY then + coordinator.log_comms("supervisor connection attempt denied") + elseif self.last_est_ack == ESTABLISH_ACK.COLLISION then + coordinator.log_comms("supervisor connection failed due to collision") + elseif self.last_est_ack == ESTABLISH_ACK.BAD_VERSION then + coordinator.log_comms("supervisor connection failed due to version mismatch") + else + coordinator.log_comms("supervisor connection failed with no valid response") + end + end + + ok = false + elseif self.sv_config_err then + coordinator.log_comms("supervisor cooling configuration invalid, check supervisor config file") + ok = false + elseif (util.time_s() - self.est_last) > 1.0 then + _send_establish() + self.est_last = util.time_s() + end + elseif self.est_tick_waiting ~= nil then + self.est_task_done(true) + self.est_tick_waiting = nil + self.est_task_done = nil + start_ui = true + end + + return ok, start_ui + end + -- close the connection to the server function public.close() sv_watchdog.cancel() @@ -305,64 +367,6 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, _send_sv(PROTOCOL.SCADA_MGMT, SCADA_MGMT_TYPE.CLOSE, {}) end - -- attempt to connect to the subervisor - ---@nodiscard - ---@param timeout_s number timeout in seconds - ---@param tick_dmesg_waiting function callback to tick dmesg waiting - ---@param task_done function callback to show done on dmesg - ---@return boolean sv_linked true if connected, false otherwise - --- EVENT_CONSUMER: this function consumes events - function public.sv_connect(timeout_s, tick_dmesg_waiting, task_done) - local clock = util.new_clock(1) - local start = util.time_s() - local terminated = false - - _send_establish() - - clock.start() - - while (util.time_s() - start) < timeout_s and (not self.sv_linked) and (not self.sv_config_err) do - local event, p1, p2, p3, p4, p5 = util.pull_event() - - if event == "timer" and clock.is_clock(p1) then - -- timed out attempt, try again - tick_dmesg_waiting(math.max(0, timeout_s - (util.time_s() - start))) - _send_establish() - clock.start() - elseif event == "timer" then - -- keep checking watchdog timers - apisessions.check_all_watchdogs(p1) - elseif event == "modem_message" then - -- handle message - local packet = public.parse_packet(p1, p2, p3, p4, p5) - public.handle_packet(packet) - elseif event == "terminate" then - terminated = true - break - end - end - - task_done(self.sv_linked) - - if terminated then - coordinator.log_comms("supervisor connection attempt cancelled by user") - elseif self.sv_config_err then - coordinator.log_comms("supervisor cooling configuration invalid, check supervisor config file") - elseif not self.sv_linked then - if self.last_est_ack == ESTABLISH_ACK.DENY then - coordinator.log_comms("supervisor connection attempt denied") - elseif self.last_est_ack == ESTABLISH_ACK.COLLISION then - coordinator.log_comms("supervisor connection failed due to collision") - elseif self.last_est_ack == ESTABLISH_ACK.BAD_VERSION then - coordinator.log_comms("supervisor connection failed due to version mismatch") - else - coordinator.log_comms("supervisor connection failed with no valid response") - end - end - - return self.sv_linked - end - -- send a facility command ---@param cmd FAC_COMMAND command ---@param option any? optional option options for the optional options (like waste mode) @@ -426,7 +430,10 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, -- handle a packet ---@param packet mgmt_frame|crdn_frame|capi_frame|nil + ---@return boolean close_ui function public.handle_packet(packet) + local was_linked = self.sv_linked + if packet ~= nil then local l_chan = packet.scada_frame.local_channel() local r_chan = packet.scada_frame.remote_channel() @@ -436,7 +443,9 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, if l_chan ~= crd_channel then log.debug("received packet on unconfigured channel " .. l_chan, true) elseif r_chan == pkt_channel then - if protocol == PROTOCOL.COORD_API then + if not self.sv_linked then + log.debug("discarding pocket API packet before linked to supervisor") + elseif protocol == PROTOCOL.COORD_API then ---@cast packet capi_frame -- look for an associated session local session = apisessions.find_session(src_addr) @@ -497,12 +506,12 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, -- check sequence number if self.sv_r_seq_num == nil then self.sv_r_seq_num = packet.scada_frame.seq_num() - elseif self.connected and ((self.sv_r_seq_num + 1) ~= packet.scada_frame.seq_num()) then + elseif self.sv_linked and ((self.sv_r_seq_num + 1) ~= packet.scada_frame.seq_num()) then log.warning("sequence out-of-order: last = " .. self.sv_r_seq_num .. ", new = " .. packet.scada_frame.seq_num()) - return + return false elseif self.sv_linked and src_addr ~= self.sv_addr then log.debug("received packet from unknown computer " .. src_addr .. " while linked; channel in use by another system?") - return + return false else self.sv_r_seq_num = packet.scada_frame.seq_num() end @@ -632,7 +641,37 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, end elseif protocol == PROTOCOL.SCADA_MGMT then ---@cast packet mgmt_frame - if packet.type == SCADA_MGMT_TYPE.ESTABLISH then + if self.sv_linked then + if packet.type == SCADA_MGMT_TYPE.KEEP_ALIVE then + -- keep alive request received, echo back + if packet.length == 1 then + local timestamp = packet.data[1] + local trip_time = util.time() - timestamp + + if trip_time > 750 then + log.warning("coordinator KEEP_ALIVE trip time > 750ms (" .. trip_time .. "ms)") + end + + -- log.debug("coordinator RTT = " .. trip_time .. "ms") + + iocontrol.get_db().facility.ps.publish("sv_ping", trip_time) + + _send_keep_alive_ack(timestamp) + else + log.debug("SCADA keep alive packet length mismatch") + end + elseif packet.type == SCADA_MGMT_TYPE.CLOSE then + -- handle session close + sv_watchdog.cancel() + self.sv_addr = comms.BROADCAST + self.sv_linked = false + self.sv_r_seq_num = nil + iocontrol.fp_link_state(types.PANEL_LINK_STATE.DISCONNECTED) + log.info("server connection closed by remote host") + else + log.debug("received unknown SCADA_MGMT packet type " .. packet.type) + end + elseif packet.type == SCADA_MGMT_TYPE.ESTABLISH then -- connection with supervisor established if packet.length == 2 then local est_ack = packet.data[1] @@ -662,6 +701,7 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, self.sv_addr = src_addr self.sv_linked = true + self.sv_r_seq_num = nil self.sv_config_err = false iocontrol.fp_link_state(types.PANEL_LINK_STATE.LINKED) @@ -703,36 +743,6 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, else log.debug("SCADA_MGMT establish packet length mismatch") end - elseif self.sv_linked then - if packet.type == SCADA_MGMT_TYPE.KEEP_ALIVE then - -- keep alive request received, echo back - if packet.length == 1 then - local timestamp = packet.data[1] - local trip_time = util.time() - timestamp - - if trip_time > 750 then - log.warning("coordinator KEEP_ALIVE trip time > 750ms (" .. trip_time .. "ms)") - end - - -- log.debug("coordinator RTT = " .. trip_time .. "ms") - - iocontrol.get_db().facility.ps.publish("sv_ping", trip_time) - - _send_keep_alive_ack(timestamp) - else - log.debug("SCADA keep alive packet length mismatch") - end - elseif packet.type == SCADA_MGMT_TYPE.CLOSE then - -- handle session close - sv_watchdog.cancel() - self.sv_addr = comms.BROADCAST - self.sv_linked = false - self.sv_r_seq_num = nil - iocontrol.fp_link_state(types.PANEL_LINK_STATE.DISCONNECTED) - log.info("server connection closed by remote host") - else - log.debug("received unknown SCADA_MGMT packet type " .. packet.type) - end else log.debug("discarding non-link SCADA_MGMT packet before linked") end @@ -743,6 +753,8 @@ function coordinator.comms(version, nic, crd_channel, svr_channel, pkt_channel, log.debug("received packet for unknown channel " .. r_chan, true) end end + + return was_linked and not self.sv_linked end -- check if the coordinator is still linked to the supervisor diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 6a97896..1045549 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.19.0" +local COORDINATOR_VERSION = "v0.19.1" local println = util.println local println_ts = util.println_ts @@ -31,7 +31,6 @@ local log_graphics = coordinator.log_graphics local log_sys = coordinator.log_sys local log_boot = coordinator.log_boot local log_comms = coordinator.log_comms -local log_comms_connecting = coordinator.log_comms_connecting local log_crypto = coordinator.log_crypto ---------------------------------------- @@ -173,7 +172,7 @@ local function main() local loop_clock = util.new_clock(MAIN_CLOCK) ---------------------------------------- - -- start front panel + -- start front panel & UI start function ---------------------------------------- log_graphics("starting front panel UI...") @@ -187,39 +186,9 @@ local function main() return else log_graphics("front panel ready") end - ---------------------------------------- - -- connect to the supervisor - ---------------------------------------- - - -- attempt to connect to the supervisor or exit - local function init_connect_sv() - local tick_waiting, task_done = log_comms_connecting("attempting to connect to configured supervisor on channel " .. config.SVR_CHANNEL) - - -- attempt to establish a connection with the supervisory computer - if not coord_comms.sv_connect(60, tick_waiting, task_done) then - log_sys("supervisor connection failed, shutting down...") - log.fatal("failed to connect to supervisor") - return false - end - - return true - end - - if not init_connect_sv() then - println("startup> failed to connect to supervisor") - log_sys("system shutdown") - return - else - log_sys("supervisor connected, proceeding to UI start") - end - - ---------------------------------------- - -- start the UI - ---------------------------------------- - - -- start up the UI + -- start up the main UI ---@return boolean ui_ok started ok - local function init_start_ui() + local function start_main_ui() log_graphics("starting main UI...") local draw_start = util.time_ms() @@ -228,36 +197,29 @@ local function main() if not ui_ok then renderer.close_ui() log_graphics(util.c("main UI error: ", ui_message)) - println_ts("main UI creation failed") log.fatal(util.c("main GUI render failed with error ", ui_message)) else - log_graphics("first main UI draw took " .. (util.time_ms() - draw_start) .. "ms") - - -- start clock - loop_clock.start() + log_graphics("main UI draw took " .. (util.time_ms() - draw_start) .. "ms") end return ui_ok end - local ui_ok = init_start_ui() - ---------------------------------------- -- main event loop ---------------------------------------- + local link_failed = false + local ui_ok = true local date_format = util.trinary(config.TIME_24_HOUR, "%X \x04 %A, %B %d %Y", "%r \x04 %A, %B %d %Y") - if ui_ok then - -- start connection watchdog - conn_watchdog.feed() - log.debug("startup> conn watchdog started") + -- start clock + loop_clock.start() - log_sys("system started successfully") - end + log_sys("system started successfully") -- main event loop - while ui_ok do + while true do local event, param1, param2, param3, param4, param5 = util.pull_event() -- handle event @@ -271,7 +233,6 @@ local function main() if nic.is_modem(device) then nic.disconnect() log_sys("comms modem disconnected") - println_ts("wireless modem disconnected!") -- close out UI renderer.close_ui() @@ -287,18 +248,13 @@ local function main() if renderer.is_monitor_used(device) then ---@todo will be handled properly in #249 -- "halt and catch fire" style handling - local msg = "lost a configured monitor, system will now exit" - println_ts(msg) - log_sys(msg) + log_sys("lost a configured monitor, system will now exit") break else log_sys("lost unused monitor, ignoring") end elseif type == "speaker" then - local msg = "lost alarm sounder speaker" - println_ts(msg) - log_sys(msg) - + log_sys("lost alarm sounder speaker") iocontrol.fp_has_speaker(false) end end @@ -309,15 +265,8 @@ local function main() if type == "modem" then if device.isWireless() then -- reconnected modem - nic.connect(device) - log_sys("comms modem reconnected") - println_ts("wireless modem reconnected.") - - -- re-init system - if not init_connect_sv() then break end - ui_ok = init_start_ui() - + nic.connect(device) iocontrol.fp_has_modem(true) else log_sys("wired modem reconnected") @@ -326,10 +275,7 @@ local function main() ---@todo will be handled properly in #249 -- not supported, system will exit on loss of in-use monitors elseif type == "speaker" then - local msg = "alarm sounder speaker reconnected" - println_ts(msg) - log_sys(msg) - + log_sys("alarm sounder speaker reconnected") sounder.reconnect(device) iocontrol.fp_has_speaker(true) end @@ -337,8 +283,25 @@ local function main() elseif event == "timer" then if loop_clock.is_clock(param1) then -- main loop tick + + -- toggle heartbeat iocontrol.heartbeat() + -- maintain connection + if nic.connected() then + local ok, start_ui = coord_comms.try_connect() + if not ok then + link_failed = true + log_sys("supervisor connection failed, shutting down...") + log.fatal("failed to connect to supervisor") + break + elseif start_ui then + log_sys("supervisor connected, proceeding to main UI start") + ui_ok = start_main_ui() + if not ui_ok then break end + end + end + -- iterate sessions apisessions.iterate_all() @@ -346,25 +309,19 @@ local function main() apisessions.free_all_closed() -- update date and time string for main display - iocontrol.get_db().facility.ps.publish("date_time", os.date(date_format)) + if coord_comms.is_linked() then + iocontrol.get_db().facility.ps.publish("date_time", os.date(date_format)) + end loop_clock.start() elseif conn_watchdog.is_timer(param1) then -- supervisor watchdog timeout - local msg = "supervisor server timeout" - log_comms(msg) - println_ts(msg) + log_comms("supervisor server timeout") - -- close connection, UI, and stop sounder + -- close connection, main UI, and stop sounder coord_comms.close() renderer.close_ui() sounder.stop() - - if nic.connected() then - -- try to re-connect to the supervisor - if not init_connect_sv() then break end - ui_ok = init_start_ui() - end else -- a non-clock/main watchdog timer event @@ -377,22 +334,15 @@ local function main() elseif event == "modem_message" then -- got a packet local packet = coord_comms.parse_packet(param1, param2, param3, param4, param5) - coord_comms.handle_packet(packet) - -- check if it was a disconnect - if not coord_comms.is_linked() then + -- handle then check if it was a disconnect + if coord_comms.handle_packet(packet) then log_comms("supervisor closed connection") -- close connection, UI, and stop sounder coord_comms.close() renderer.close_ui() sounder.stop() - - if nic.connected() then - -- try to re-connect to the supervisor - if not init_connect_sv() then break end - ui_ok = init_start_ui() - end end elseif event == "monitor_touch" or event == "mouse_click" or event == "mouse_up" or event == "mouse_drag" or event == "mouse_scroll" then @@ -405,10 +355,17 @@ local function main() -- check for termination request if event == "terminate" or ppm.should_terminate() then - println_ts("terminate requested, closing connections...") - log_comms("terminate requested, closing supervisor connection...") + -- handle supervisor connection + link_failed = coord_comms.try_connect(true) + + if coord_comms.is_linked() then + log_comms("terminate requested, closing supervisor connection...") + else link_failed = true end + coord_comms.close() log_comms("supervisor connection closed") + + -- handle API sessions log_comms("closing api sessions...") apisessions.close_all() log_comms("api sessions closed") @@ -421,6 +378,9 @@ local function main() sounder.stop() log_sys("system shutdown") + if link_failed then println_ts("failed to connect to supervisor") end + if not ui_ok then println_ts("main UI creation failed") end + println_ts("exited") log.info("exited") end From 1d7d6e98171488c34df9c188b9e7abf0a56abaea Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 13:38:21 -0400 Subject: [PATCH 12/34] update legacy install manifest --- install_manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install_manifest.json b/install_manifest.json index 764e7c1..6b81a17 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.0", "lockbox": "1.0", "reactor-plc": "v1.5.0", "rtu": "v1.4.0", "supervisor": "v0.19.1", "coordinator": "v0.18.0", "pocket": "alpha-v0.5.1"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5612, "system": 1991, "common": 97476, "graphics": 147195, "lockbox": 34900, "reactor-plc": 97595, "rtu": 102247, "supervisor": 322210, "coordinator": 212109, "pocket": 37633}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.0", "rtu": "v1.4.0", "supervisor": "v0.19.1", "coordinator": "v0.19.1", "pocket": "alpha-v0.5.1"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5722, "system": 1991, "common": 97476, "graphics": 147714, "lockbox": 34900, "reactor-plc": 97603, "rtu": 102247, "supervisor": 322217, "coordinator": 226362, "pocket": 37633}} \ No newline at end of file From 61d975d13fbf5f3a23ca4eb348db93239068769b Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 15:15:44 -0400 Subject: [PATCH 13/34] updated error messages for consistency --- install_manifest.json | 2 +- pocket/startup.lua | 4 ++-- reactor-plc/startup.lua | 4 ++-- rtu/startup.lua | 4 ++-- supervisor/startup.lua | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/install_manifest.json b/install_manifest.json index 6b81a17..7c887c7 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.0", "rtu": "v1.4.0", "supervisor": "v0.19.1", "coordinator": "v0.19.1", "pocket": "alpha-v0.5.1"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5722, "system": 1991, "common": 97476, "graphics": 147714, "lockbox": 34900, "reactor-plc": 97603, "rtu": 102247, "supervisor": 322217, "coordinator": 226362, "pocket": 37633}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.1", "rtu": "v1.4.1", "supervisor": "v0.19.2", "coordinator": "v0.19.1", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5722, "system": 1991, "common": 97476, "graphics": 147714, "lockbox": 34900, "reactor-plc": 97621, "rtu": 102265, "supervisor": 322235, "coordinator": 226362, "pocket": 37639}} \ No newline at end of file diff --git a/pocket/startup.lua b/pocket/startup.lua index 843686e..f8403c1 100644 --- a/pocket/startup.lua +++ b/pocket/startup.lua @@ -18,7 +18,7 @@ local coreio = require("pocket.coreio") local pocket = require("pocket.pocket") local renderer = require("pocket.renderer") -local POCKET_VERSION = "alpha-v0.5.1" +local POCKET_VERSION = "alpha-v0.5.2" local println = util.println local println_ts = util.println_ts @@ -112,7 +112,7 @@ local function main() if not ui_ok then renderer.close_ui() println(util.c("UI error: ", message)) - log.error(util.c("startup> GUI crashed with error ", message)) + log.error(util.c("startup> GUI render failed with error ", message)) else -- start clock loop_clock.start() diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index 132c7aa..c0aadee 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -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.5.0" +local R_PLC_VERSION = "v1.5.1" local println = util.println local println_ts = util.println_ts @@ -190,7 +190,7 @@ local function main() renderer.close_ui() println_ts(util.c("UI error: ", message)) println("init> running without front panel") - log.error(util.c("GUI crashed with error ", message)) + log.error(util.c("front panel GUI render failed with error ", message)) log.info("init> running in headless mode without front panel") end end diff --git a/rtu/startup.lua b/rtu/startup.lua index 9eecace..255d957 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -29,7 +29,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.4.0" +local RTU_VERSION = "v1.4.1" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE @@ -464,7 +464,7 @@ local function main() renderer.close_ui() println_ts(util.c("UI error: ", message)) println("startup> running without front panel") - log.error(util.c("GUI crashed with error ", message)) + log.error(util.c("front panel GUI render failed with error ", message)) log.info("startup> running in headless mode without front panel") end diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 8f2715d..35b3366 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v0.19.1" +local SUPERVISOR_VERSION = "v0.19.2" local println = util.println local println_ts = util.println_ts @@ -116,7 +116,7 @@ local function main() if not fp_ok then renderer.close_ui() println_ts(util.c("UI error: ", message)) - log.error(util.c("GUI crashed with error ", message)) + log.error(util.c("front panel GUI render failed with error ", message)) else -- redefine println_ts local to not print as we have the front panel running println_ts = function (_) end From 65ace26258d8bede542cf8af115e2f687b4a4d9a Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 15:36:41 -0400 Subject: [PATCH 14/34] corrected comments --- coordinator/startup.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 1045549..8b7e3e8 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -234,7 +234,7 @@ local function main() nic.disconnect() log_sys("comms modem disconnected") - -- close out UI + -- close out main UI renderer.close_ui() -- alert user to status @@ -339,7 +339,7 @@ local function main() if coord_comms.handle_packet(packet) then log_comms("supervisor closed connection") - -- close connection, UI, and stop sounder + -- close connection, main UI, and stop sounder coord_comms.close() renderer.close_ui() sounder.stop() From 9f3ad3caf0fc5eb798c9d4b46a28ca6fecb1ba56 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 16:17:24 -0400 Subject: [PATCH 15/34] removed PLC establish packet handling when already linked --- reactor-plc/plc.lua | 42 +---------------------------------------- reactor-plc/startup.lua | 2 +- 2 files changed, 2 insertions(+), 42 deletions(-) diff --git a/reactor-plc/plc.lua b/reactor-plc/plc.lua index 2bba4ee..acdc78b 100644 --- a/reactor-plc/plc.lua +++ b/reactor-plc/plc.lua @@ -929,47 +929,7 @@ function plc.comms(id, version, nic, plc_channel, svr_channel, range, reactor, r ---@cast packet mgmt_frame -- if linked, only accept packets from configured supervisor if self.linked then - if packet.type == SCADA_MGMT_TYPE.ESTABLISH then - -- link request confirmation - if packet.length == 1 then - log.debug("received unsolicited establish response") - - local est_ack = packet.data[1] - - if est_ack == ESTABLISH_ACK.ALLOW then - self.status_cache = nil - _send_struct() - public.send_status(plc_state.no_reactor, plc_state.reactor_formed) - log.debug("re-sent initial status data due to re-establish") - else - if est_ack == ESTABLISH_ACK.DENY then - println_ts("received unsolicited link denial, unlinking") - log.warning("unsolicited establish request denied") - elseif est_ack == ESTABLISH_ACK.COLLISION then - println_ts("received unsolicited link collision, unlinking") - log.warning("unsolicited establish request collision") - elseif est_ack == ESTABLISH_ACK.BAD_VERSION then - println_ts("received unsolicited link version mismatch, unlinking") - log.warning("unsolicited establish request version mismatch") - else - println_ts("invalid unsolicited link response") - log.debug("unsolicited unknown establish request response") - end - - -- unlink - self.sv_addr = comms.BROADCAST - self.linked = false - end - - -- clear this since this is for something that was unsolicited - self.last_est_ack = ESTABLISH_ACK.ALLOW - - -- report link state - databus.tx_link_state(est_ack + 1) - else - log.debug("SCADA_MGMT establish packet length mismatch") - end - elseif packet.type == SCADA_MGMT_TYPE.KEEP_ALIVE then + if packet.type == SCADA_MGMT_TYPE.KEEP_ALIVE then -- keep alive request received, echo back if packet.length == 1 and type(packet.data[1]) == "number" then local timestamp = packet.data[1] diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index c0aadee..f4ac2fe 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -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.5.1" +local R_PLC_VERSION = "v1.5.2" local println = util.println local println_ts = util.println_ts From a5214730ef7eddb28ee00fa1afce045744e0263a Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 17:27:03 -0400 Subject: [PATCH 16/34] #260 added dynamic tank RTU --- install_manifest.json | 2 +- rtu/dev/boilerv_rtu.lua | 2 +- rtu/dev/dynamicv_rtu.lua | 51 +++++++++++++++++++++++++++++++++++++++ rtu/dev/turbinev_rtu.lua | 2 +- rtu/panel/front_panel.lua | 1 + rtu/startup.lua | 15 +++++++++++- rtu/threads.lua | 16 +++++++++--- scada-common/comms.lua | 2 +- scada-common/types.lua | 22 ++++++++++++++--- 9 files changed, 100 insertions(+), 13 deletions(-) create mode 100644 rtu/dev/dynamicv_rtu.lua diff --git a/install_manifest.json b/install_manifest.json index 7c887c7..e5b85b2 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.1", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.1", "rtu": "v1.4.1", "supervisor": "v0.19.2", "coordinator": "v0.19.1", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5722, "system": 1991, "common": 97476, "graphics": 147714, "lockbox": 34900, "reactor-plc": 97621, "rtu": 102265, "supervisor": 322235, "coordinator": 226362, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.2", "rtu": "v1.5.0", "supervisor": "v0.19.2", "coordinator": "v0.19.1", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5750, "system": 1991, "common": 97755, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95247, "rtu": 105052, "supervisor": 322235, "coordinator": 226372, "pocket": 37639}} \ No newline at end of file diff --git a/rtu/dev/boilerv_rtu.lua b/rtu/dev/boilerv_rtu.lua index 6815a3c..0197421 100644 --- a/rtu/dev/boilerv_rtu.lua +++ b/rtu/dev/boilerv_rtu.lua @@ -2,7 +2,7 @@ local rtu = require("rtu.rtu") local boilerv_rtu = {} --- create new boiler (mek 10.1+) device +-- create new boiler device ---@nodiscard ---@param boiler table ---@return rtu_device interface, boolean faulted diff --git a/rtu/dev/dynamicv_rtu.lua b/rtu/dev/dynamicv_rtu.lua new file mode 100644 index 0000000..ff2e0f2 --- /dev/null +++ b/rtu/dev/dynamicv_rtu.lua @@ -0,0 +1,51 @@ +local rtu = require("rtu.rtu") + +local dynamicv_rtu = {} + +-- create new dynamic tank device +---@nodiscard +---@param dynamic_tank table +---@return rtu_device interface, boolean faulted +function dynamicv_rtu.new(dynamic_tank) + local unit = rtu.init_unit() + + -- disable auto fault clearing + dynamic_tank.__p_clear_fault() + dynamic_tank.__p_disable_afc() + + -- discrete inputs -- + unit.connect_di(dynamic_tank.isFormed) + + -- coils -- + unit.connect_coil(function () dynamic_tank.incrementContainerEditMode() end, function () end) + unit.connect_coil(function () dynamic_tank.decrementContainerEditMode() end, function () end) + + -- input registers -- + -- multiblock properties + unit.connect_input_reg(dynamic_tank.getLength) + unit.connect_input_reg(dynamic_tank.getWidth) + unit.connect_input_reg(dynamic_tank.getHeight) + unit.connect_input_reg(dynamic_tank.getMinPos) + unit.connect_input_reg(dynamic_tank.getMaxPos) + -- build properties + unit.connect_input_reg(dynamic_tank.getTankCapacity) + unit.connect_input_reg(dynamic_tank.getChemicalTankCapacity) + -- current state + -- tanks/containers + unit.connect_input_reg(dynamic_tank.getInputItem) + unit.connect_input_reg(dynamic_tank.getOutputItem) + unit.connect_input_reg(dynamic_tank.getStored) + unit.connect_input_reg(dynamic_tank.getFilledPercentage) + + -- holding registers -- + unit.connect_holding_reg(dynamic_tank.getContainerEditMode, dynamic_tank.setContainerEditMode) + + -- check if any calls faulted + local faulted = dynamic_tank.__p_is_faulted() + dynamic_tank.__p_clear_fault() + dynamic_tank.__p_enable_afc() + + return unit.interface(), faulted +end + +return dynamicv_rtu diff --git a/rtu/dev/turbinev_rtu.lua b/rtu/dev/turbinev_rtu.lua index f8d6d5e..17e6675 100644 --- a/rtu/dev/turbinev_rtu.lua +++ b/rtu/dev/turbinev_rtu.lua @@ -2,7 +2,7 @@ local rtu = require("rtu.rtu") local turbinev_rtu = {} --- create new turbine (mek 10.1+) device +-- create new turbine device ---@nodiscard ---@param turbine table ---@return rtu_device interface, boolean faulted diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index 640811d..dc0dd44 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -26,6 +26,7 @@ local UNIT_TYPE_LABELS = { "REDSTONE", "BOILER", "TURBINE", + "DYNAMIC TANK", "IND MATRIX", "SPS", "SNA", diff --git a/rtu/startup.lua b/rtu/startup.lua index 255d957..aa182d9 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -22,6 +22,7 @@ local rtu = require("rtu.rtu") local threads = require("rtu.threads") local boilerv_rtu = require("rtu.dev.boilerv_rtu") +local dynamicv_rtu = require("rtu.dev.dynamicv_rtu") local envd_rtu = require("rtu.dev.envd_rtu") local imatrix_rtu = require("rtu.dev.imatrix_rtu") local redstone_rtu = require("rtu.dev.redstone_rtu") @@ -29,7 +30,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.4.1" +local RTU_VERSION = "v1.5.0" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE @@ -342,6 +343,18 @@ local function main() log.fatal(util.c("configure> failed to check if '", name, "' is a formed turbine multiblock")) return false end + elseif type == "dynamicValve" then + -- dynamic tank multiblock + rtu_type = RTU_UNIT_TYPE.DYNAMIC_VALVE + rtu_iface, faulted = dynamicv_rtu.new(device) + is_multiblock = true + formed = device.isFormed() + + if formed == ppm.UNDEFINED_FIELD or formed == ppm.ACCESS_FAULT then + println_ts(util.c("configure> failed to check if '", name, "' is formed")) + log.fatal(util.c("configure> failed to check if '", name, "' is a formed dynamic tank multiblock")) + return false + end elseif type == "inductionPort" then -- induction matrix multiblock rtu_type = RTU_UNIT_TYPE.IMATRIX diff --git a/rtu/threads.lua b/rtu/threads.lua index c27052d..55a4b7a 100644 --- a/rtu/threads.lua +++ b/rtu/threads.lua @@ -10,6 +10,7 @@ local modbus = require("rtu.modbus") local renderer = require("rtu.renderer") local boilerv_rtu = require("rtu.dev.boilerv_rtu") +local dynamicv_rtu = require("rtu.dev.dynamicv_rtu") local envd_rtu = require("rtu.dev.envd_rtu") local imatrix_rtu = require("rtu.dev.imatrix_rtu") local sna_rtu = require("rtu.dev.sna_rtu") @@ -181,21 +182,22 @@ function threads.thread__main(smem) databus.tx_unit_hw_type(unit.uid, unit.type) end + -- note for multiblock structures: if not formed, indexing the multiblock functions results in a PPM fault + if unit.type == RTU_UNIT_TYPE.BOILER_VALVE then unit.rtu, faulted = boilerv_rtu.new(device) - -- if not formed, indexing the multiblock functions would have resulted in a PPM fault unit.formed = util.trinary(faulted, false, nil) elseif unit.type == RTU_UNIT_TYPE.TURBINE_VALVE then unit.rtu, faulted = turbinev_rtu.new(device) - -- if not formed, indexing the multiblock functions would have resulted in a PPM fault + unit.formed = util.trinary(faulted, false, nil) + elseif unit.type == RTU_UNIT_TYPE.DYNAMIC_VALVE then + unit.rtu, faulted = dynamicv_rtu.new(device) unit.formed = util.trinary(faulted, false, nil) elseif unit.type == RTU_UNIT_TYPE.IMATRIX then unit.rtu, faulted = imatrix_rtu.new(device) - -- if not formed, indexing the multiblock functions would have resulted in a PPM fault unit.formed = util.trinary(faulted, false, nil) elseif unit.type == RTU_UNIT_TYPE.SPS then unit.rtu, faulted = sps_rtu.new(device) - -- if not formed, indexing the multiblock functions would have resulted in a PPM fault unit.formed = util.trinary(faulted, false, nil) elseif unit.type == RTU_UNIT_TYPE.SNA then unit.rtu, faulted = sna_rtu.new(device) @@ -441,6 +443,12 @@ function threads.thread__unit_comms(smem, unit) unit.rtu, faulted = turbinev_rtu.new(device) unit.formed = device.isFormed() unit.modbus_io = modbus.new(unit.rtu, true) + elseif type == "dynamicValve" and unit.type == RTU_UNIT_TYPE.DYNAMIC_VALVE then + -- dynamic tank multiblock + unit.device = device + unit.rtu, faulted = dynamicv_rtu.new(device) + unit.formed = device.isFormed() + unit.modbus_io = modbus.new(unit.rtu, true) elseif type == "inductionPort" and unit.type == RTU_UNIT_TYPE.IMATRIX then -- induction matrix multiblock unit.device = device diff --git a/scada-common/comms.lua b/scada-common/comms.lua index a9fa5a5..6a8324d 100644 --- a/scada-common/comms.lua +++ b/scada-common/comms.lua @@ -14,7 +14,7 @@ local max_distance = nil ---@type number|nil maximum acceptable t ---@class comms local comms = {} -comms.version = "2.1.1" +comms.version = "2.1.2" ---@enum PROTOCOL local PROTOCOL = { diff --git a/scada-common/types.lua b/scada-common/types.lua index 9e68632..91e6469 100644 --- a/scada-common/types.lua +++ b/scada-common/types.lua @@ -89,16 +89,18 @@ types.RTU_UNIT_TYPE = { REDSTONE = 1, -- redstone I/O BOILER_VALVE = 2, -- boiler mekanism 10.1+ TURBINE_VALVE = 3, -- turbine, mekanism 10.1+ - IMATRIX = 4, -- induction matrix - SPS = 5, -- SPS - SNA = 6, -- SNA - ENV_DETECTOR = 7 -- environment detector + DYNAMIC_VALVE = 4, -- dynamic tank, mekanism 10.1+ + IMATRIX = 5, -- induction matrix + SPS = 6, -- SPS + SNA = 7, -- SNA + ENV_DETECTOR = 8 -- environment detector } types.RTU_UNIT_NAMES = { "redstone", "boiler_valve", "turbine_valve", + "dynamic_valve", "induction_matrix", "sps", "sna", @@ -115,6 +117,7 @@ function types.rtu_type_to_string(utype) elseif utype == types.RTU_UNIT_TYPE.REDSTONE or utype == types.RTU_UNIT_TYPE.BOILER_VALVE or utype == types.RTU_UNIT_TYPE.TURBINE_VALVE or + utype == types.RTU_UNIT_TYPE.DYNAMIC_VALVE or utype == types.RTU_UNIT_TYPE.IMATRIX or utype == types.RTU_UNIT_TYPE.SPS or utype == types.RTU_UNIT_TYPE.SNA or @@ -328,6 +331,17 @@ types.RPS_TRIP_CAUSE = { FORCE_DISABLED = "force_disabled" } +---@alias container_mode +---| "BOTH" +---| "FILL" +---| "EMPTY" + +types.CONTAINER_MODE = { + BOTH = "BOTH", + FILL = "FILL", + EMPTY = "EMPTY" +} + ---@alias dumping_mode ---| "IDLE" ---| "DUMPING" From 8b136d78a8d95221d2fb86866cf26f2a66432464 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 18:22:09 -0400 Subject: [PATCH 17/34] #268 better handling of wireless modem peripherals --- coordinator/startup.lua | 22 ++++++++++++++-------- reactor-plc/startup.lua | 2 +- reactor-plc/threads.lua | 27 ++++++++++++++++----------- rtu/startup.lua | 2 +- rtu/threads.lua | 12 +++++++++--- scada-common/network.lua | 2 +- supervisor/startup.lua | 12 +++++++++--- 7 files changed, 51 insertions(+), 28 deletions(-) diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 8b7e3e8..0f1d30a 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.19.1" +local COORDINATOR_VERSION = "v0.19.2" local println = util.println local println_ts = util.println_ts @@ -234,13 +234,19 @@ local function main() nic.disconnect() log_sys("comms modem disconnected") - -- close out main UI - renderer.close_ui() + local other_modem = ppm.get_wireless_modem() + if other_modem then + log_sys("found another wireless modem, using it for comms") + nic.connect(other_modem) + else + -- close out main UI + renderer.close_ui() - -- alert user to status - log_sys("awaiting comms modem reconnect...") + -- alert user to status + log_sys("awaiting comms modem reconnect...") - iocontrol.fp_has_modem(false) + iocontrol.fp_has_modem(false) + end else log_sys("non-comms modem disconnected") end @@ -263,7 +269,7 @@ local function main() if type ~= nil and device ~= nil then if type == "modem" then - if device.isWireless() then + if device.isWireless() and not nic.is_connected() then -- reconnected modem log_sys("comms modem reconnected") nic.connect(device) @@ -288,7 +294,7 @@ local function main() iocontrol.heartbeat() -- maintain connection - if nic.connected() then + if nic.is_connected() then local ok, start_ui = coord_comms.try_connect() if not ok then link_failed = true diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index f4ac2fe..1f1cdf1 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -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.5.2" +local R_PLC_VERSION = "v1.5.3" local println = util.println local println_ts = util.println_ts diff --git a/reactor-plc/threads.lua b/reactor-plc/threads.lua index cf18963..e3cd9a1 100644 --- a/reactor-plc/threads.lua +++ b/reactor-plc/threads.lua @@ -77,7 +77,7 @@ function threads.thread__main(smem, init) loop_clock.start() -- send updated data - if nic.connected() then + if nic.is_connected() then if plc_comms.is_linked() then smem.q.mq_comms_tx.push_command(MQ__COMM_CMD.SEND_STATUS) else @@ -116,7 +116,7 @@ function threads.thread__main(smem, init) smem.q.mq_rps.push_command(MQ__RPS_CMD.SCRAM) -- determine if we are still in a degraded state - if (not networked) or nic.connected() then + if (not networked) or nic.is_connected() then plc_state.degraded = false end @@ -146,7 +146,7 @@ function threads.thread__main(smem, init) -- update indicators databus.tx_hw_status(plc_state) - elseif event == "modem_message" and networked and plc_state.init_ok and nic.connected() then + elseif event == "modem_message" and networked and plc_state.init_ok and nic.is_connected() then -- got a packet local packet = plc_comms.parse_packet(param1, param2, param3, param4, param5) if packet ~= nil then @@ -177,16 +177,21 @@ function threads.thread__main(smem, init) nic.disconnect() println_ts("comms modem disconnected!") - log.error("comms modem disconnected") + log.warning("comms modem disconnected") - plc_state.no_modem = true + local other_modem = ppm.get_wireless_modem() + if other_modem then + log.info("found another wireless modem, using it for comms") + nic.connect(other_modem) + else + plc_state.no_modem = true + plc_state.degraded = true - if plc_state.init_ok then - -- try to scram reactor if it is still connected - smem.q.mq_rps.push_command(MQ__RPS_CMD.DEGRADED_SCRAM) + if plc_state.init_ok then + -- try to scram reactor if it is still connected + smem.q.mq_rps.push_command(MQ__RPS_CMD.DEGRADED_SCRAM) + end end - - plc_state.degraded = true else log.warning("non-comms modem disconnected") end @@ -230,7 +235,7 @@ function threads.thread__main(smem, init) rps.reset() end elseif networked and type == "modem" then - if device.isWireless() then + if device.isWireless() and not nic.is_connected() then -- reconnected modem plc_dev.modem = device plc_state.no_modem = false diff --git a/rtu/startup.lua b/rtu/startup.lua index aa182d9..d91075e 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -30,7 +30,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.5.0" +local RTU_VERSION = "v1.5.1" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE diff --git a/rtu/threads.lua b/rtu/threads.lua index 55a4b7a..32cda4f 100644 --- a/rtu/threads.lua +++ b/rtu/threads.lua @@ -98,9 +98,15 @@ function threads.thread__main(smem) nic.disconnect() println_ts("wireless modem disconnected!") - log.warning("comms modem disconnected!") + log.warning("comms modem disconnected") - databus.tx_hw_modem(false) + local other_modem = ppm.get_wireless_modem() + if other_modem then + log.info("found another wireless modem, using it for comms") + nic.connect(other_modem) + else + databus.tx_hw_modem(false) + end else log.warning("non-comms modem disconnected") end @@ -128,7 +134,7 @@ function threads.thread__main(smem) if type ~= nil and device ~= nil then if type == "modem" then - if device.isWireless() then + if device.isWireless() and not nic.is_connected() then -- reconnected modem nic.connect(device) diff --git a/scada-common/network.lua b/scada-common/network.lua index dbb3e75..491faef 100644 --- a/scada-common/network.lua +++ b/scada-common/network.lua @@ -94,7 +94,7 @@ function network.nic(modem) -- check if this NIC has a connected modem ---@nodiscard - function public.connected() return self.connected end + function public.is_connected() return self.connected end -- connect to a modem peripheral ---@param reconnected_modem table diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 35b3366..fe6c84a 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v0.19.2" +local SUPERVISOR_VERSION = "v0.19.3" local println = util.println local println_ts = util.println_ts @@ -153,7 +153,13 @@ local function main() println_ts("wireless modem disconnected!") log.warning("comms modem disconnected") - databus.tx_hw_modem(false) + local other_modem = ppm.get_wireless_modem() + if other_modem then + log.info("found another wireless modem, using it for comms") + nic.connect(other_modem) + else + databus.tx_hw_modem(false) + end else log.warning("non-comms modem disconnected") end @@ -164,7 +170,7 @@ local function main() if type ~= nil and device ~= nil then if type == "modem" then - if device.isWireless() and not nic.connected() then + if device.isWireless() and not nic.is_connected() then -- reconnected modem nic.connect(device) From 0d6022f5e36b5ef7196670960f0c6ba26b4800a9 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 18:31:53 -0400 Subject: [PATCH 18/34] fixed always reporting failure to connect to supervisor even when inaccurate --- coordinator/startup.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 0f1d30a..69f3891 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.19.2" +local COORDINATOR_VERSION = "v0.19.3" local println = util.println local println_ts = util.println_ts @@ -362,7 +362,7 @@ local function main() -- check for termination request if event == "terminate" or ppm.should_terminate() then -- handle supervisor connection - link_failed = coord_comms.try_connect(true) + coord_comms.try_connect(true) if coord_comms.is_linked() then log_comms("terminate requested, closing supervisor connection...") From 55ff9dad4bddad3fed64f50b66442fa3d5cfb023 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 20:32:10 -0400 Subject: [PATCH 19/34] #249 coordinator handle monitor disconnects/reconnects --- coordinator/iocontrol.lua | 8 ++ coordinator/renderer.lua | 167 +++++++++++++++++++------- coordinator/startup.lua | 20 +-- coordinator/ui/layout/front_panel.lua | 15 ++- 4 files changed, 156 insertions(+), 54 deletions(-) diff --git a/coordinator/iocontrol.lua b/coordinator/iocontrol.lua index 921c626..d199e0c 100644 --- a/coordinator/iocontrol.lua +++ b/coordinator/iocontrol.lua @@ -223,6 +223,14 @@ function iocontrol.fp_has_speaker(has_speaker) io.fp.ps.publish("has_speaker", h ---@param state integer function iocontrol.fp_link_state(state) io.fp.ps.publish("link_state", state) end +-- report monitor connection state +---@param id integer unit ID or 0 for main +function iocontrol.fp_monitor_state(id, connected) + local name = "main_monitor" + if id > 0 then name = "unit_monitor_" .. id end + io.fp.ps.publish(name, connected) +end + -- report PKT firmware version and PKT session connection state ---@param session_id integer PKT session ---@param fw string firmware version diff --git a/coordinator/renderer.lua b/coordinator/renderer.lua index 16ea6a9..5a6a605 100644 --- a/coordinator/renderer.lua +++ b/coordinator/renderer.lua @@ -5,6 +5,8 @@ local log = require("scada-common.log") local util = require("scada-common.util") +local iocontrol = require("coordinator.iocontrol") + local style = require("coordinator.ui.style") local pgi = require("coordinator.ui.pgi") @@ -48,24 +50,12 @@ end -- link to the monitor peripherals ---@param monitors monitors_struct -function renderer.set_displays(monitors) engine.monitors = monitors end +function renderer.set_displays(monitors) + engine.monitors = monitors --- check if the renderer is configured to use a given monitor peripheral ----@nodiscard ----@param periph table peripheral ----@return boolean is_used -function renderer.is_monitor_used(periph) - if engine.monitors ~= nil then - if engine.monitors.primary == periph then - return true - else - for _, monitor in ipairs(engine.monitors.unit_displays) do - if monitor == periph then return true end - end - end - end - - return false + -- report to front panel as connected + iocontrol.fp_monitor_state(0, true) + for i = 1, #engine.monitors.unit_displays do iocontrol.fp_monitor_state(i, true) end end -- init all displays in use by the renderer @@ -127,7 +117,7 @@ function renderer.start_fp() if not engine.fp_ready then -- show front panel view on terminal engine.ui.front_panel = DisplayBox{window=term.native(),fg_bg=style.fp.root} - panel_view(engine.ui.front_panel) + panel_view(engine.ui.front_panel, #engine.monitors.unit_displays) -- start flasher callback task flasher.run() @@ -137,30 +127,6 @@ function renderer.start_fp() end end --- start the coordinator GUI -function renderer.start_ui() - if not engine.ui_ready then - -- hide dmesg - engine.dmesg_window.setVisible(false) - - -- show main view on main monitor - engine.ui.main_display = DisplayBox{window=engine.monitors.primary,fg_bg=style.root} - main_view(engine.ui.main_display) - - -- show unit views on unit displays - for i = 1, #engine.monitors.unit_displays do - engine.ui.unit_displays[i] = DisplayBox{window=engine.monitors.unit_displays[i],fg_bg=style.root} - unit_view(engine.ui.unit_displays[i], i) - end - - -- start flasher callback task - flasher.run() - - -- report ui as ready - engine.ui_ready = true - end -end - -- close out the front panel function renderer.close_fp() if engine.fp_ready then @@ -191,6 +157,32 @@ function renderer.close_fp() end end +-- start the coordinator GUI +function renderer.start_ui() + if not engine.ui_ready then + -- hide dmesg + engine.dmesg_window.setVisible(false) + + -- show main view on main monitor + if engine.monitors.primary ~= nil then + engine.ui.main_display = DisplayBox{window=engine.monitors.primary,fg_bg=style.root} + main_view(engine.ui.main_display) + end + + -- show unit views on unit displays + for idx, display in pairs(engine.monitors.unit_displays) do + engine.ui.unit_displays[idx] = DisplayBox{window=display,fg_bg=style.root} + unit_view(engine.ui.unit_displays[idx], idx) + end + + -- start flasher callback task + flasher.run() + + -- report ui as ready + engine.ui_ready = true + end +end + -- close out the UI function renderer.close_ui() if not engine.fp_ready then @@ -200,7 +192,7 @@ function renderer.close_ui() -- delete element trees if engine.ui.main_display ~= nil then engine.ui.main_display.delete() end - for _, display in ipairs(engine.ui.unit_displays) do display.delete() end + for _, display in pairs(engine.ui.unit_displays) do display.delete() end -- report ui as not ready engine.ui_ready = false @@ -227,6 +219,95 @@ function renderer.fp_ready() return engine.fp_ready end ---@return boolean ready function renderer.ui_ready() return engine.ui_ready end +-- handle a monitor peripheral being disconnected +---@param device table monitor +---@return boolean is_used if the monitor is one of the configured monitors +function renderer.handle_disconnect(device) + local is_used = false + + if engine.monitors ~= nil then + if engine.monitors.primary == device then + if engine.ui.main_display ~= nil then + -- delete element tree and clear root UI elements + engine.ui.main_display.delete() + end + + is_used = true + engine.monitors.primary = nil + engine.ui.main_display = nil + + iocontrol.fp_monitor_state(0, false) + else + for idx, monitor in pairs(engine.monitors.unit_displays) do + if monitor == device then + if engine.ui.unit_displays[idx] ~= nil then + engine.ui.unit_displays[idx].delete() + end + + is_used = true + engine.monitors.unit_displays[idx] = nil + engine.ui.unit_displays[idx] = nil + + iocontrol.fp_monitor_state(idx, false) + break + end + end + end + end + + return is_used +end + +-- handle a monitor peripheral being reconnected +---@param name string monitor name +---@param device table monitor +---@return boolean is_used if the monitor is one of the configured monitors +function renderer.handle_reconnect(name, device) + local is_used = false + + if engine.monitors ~= nil then + if engine.monitors.primary_name == name then + is_used = true + _init_display(device) + engine.monitors.primary = device + + local disp_x, disp_y = engine.monitors.primary.getSize() + engine.dmesg_window.reposition(1, 1, disp_x, disp_y, engine.monitors.primary) + + if engine.ui_ready and (engine.ui.main_display == nil) then + engine.dmesg_window.setVisible(false) + + engine.ui.main_display = DisplayBox{window=device,fg_bg=style.root} + main_view(engine.ui.main_display) + else + engine.dmesg_window.setVisible(true) + engine.dmesg_window.redraw() + end + + iocontrol.fp_monitor_state(0, true) + else + for idx, monitor in ipairs(engine.monitors.unit_name_map) do + if monitor == name then + is_used = true + _init_display(device) + engine.monitors.unit_displays[idx] = device + + if engine.ui_ready and (engine.ui.unit_displays[idx] == nil) then + engine.ui.unit_displays[idx] = DisplayBox{window=device,fg_bg=style.root} + unit_view(engine.ui.unit_displays[idx], idx) + end + + iocontrol.fp_monitor_state(idx, true) + break + end + end + end + end + + return is_used +end + + -- handle a touch event ---@param event mouse_interaction|nil function renderer.handle_mouse(event) diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 69f3891..6f279b0 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.19.3" +local COORDINATOR_VERSION = "v0.20.0" local println = util.println local println_ts = util.println_ts @@ -251,13 +251,10 @@ local function main() log_sys("non-comms modem disconnected") end elseif type == "monitor" then - if renderer.is_monitor_used(device) then - ---@todo will be handled properly in #249 - -- "halt and catch fire" style handling - log_sys("lost a configured monitor, system will now exit") - break + if renderer.handle_disconnect(device) then + log_sys("lost a configured monitor") else - log_sys("lost unused monitor, ignoring") + log_sys("lost an unused monitor") end elseif type == "speaker" then log_sys("lost alarm sounder speaker") @@ -277,9 +274,12 @@ local function main() else log_sys("wired modem reconnected") end - -- elseif type == "monitor" then - ---@todo will be handled properly in #249 - -- not supported, system will exit on loss of in-use monitors + elseif type == "monitor" then + if renderer.handle_reconnect(param1, device) then + log_sys(util.c("configured monitor ", param1, " reconnected")) + else + log_sys(util.c("unused monitor ", param1, " connected")) + end elseif type == "speaker" then log_sys("alarm sounder speaker reconnected") sounder.reconnect(device) diff --git a/coordinator/ui/layout/front_panel.lua b/coordinator/ui/layout/front_panel.lua index 176299e..207e213 100644 --- a/coordinator/ui/layout/front_panel.lua +++ b/coordinator/ui/layout/front_panel.lua @@ -30,7 +30,8 @@ local cpair = core.cpair -- create new front panel view ---@param panel graphics_element main displaybox -local function init(panel) +---@param num_units integer number of units (number of unit monitors) +local function init(panel, num_units) local ps = iocontrol.get_db().fp.ps TextBox{parent=panel,y=1,text="SCADA COORDINATOR",alignment=TEXT_ALIGN.CENTER,height=1,fg_bg=style.fp.header} @@ -67,6 +68,18 @@ local function init(panel) local comp_id = util.sprintf("(%d)", os.getComputerID()) TextBox{parent=system,x=9,y=4,width=6,height=1,text=comp_id,fg_bg=cpair(colors.lightGray,colors.ivory)} + local monitors = Div{parent=main_page,width=16,height=17,x=18,y=2} + + local main_monitor = LED{parent=monitors,label="MAIN MONITOR",colors=cpair(colors.green,colors.green_off)} + main_monitor.register(ps, "main_monitor", main_monitor.update) + + monitors.line_break() + + for i = 1, num_units do + local unit_monitor = LED{parent=monitors,label="UNIT "..i.." MONITOR",colors=cpair(colors.green,colors.green_off)} + unit_monitor.register(ps, "unit_monitor_" .. i, unit_monitor.update) + end + -- -- about footer -- From d3c2ba7bee76c97d0a64b6a253293512d7f2814f Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 20:32:37 -0400 Subject: [PATCH 20/34] update install manifest --- install_manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install_manifest.json b/install_manifest.json index e5b85b2..a0a9616 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.2", "rtu": "v1.5.0", "supervisor": "v0.19.2", "coordinator": "v0.19.1", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5750, "system": 1991, "common": 97755, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95247, "rtu": 105052, "supervisor": 322235, "coordinator": 226372, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.3", "rtu": "v1.5.1", "supervisor": "v0.19.3", "coordinator": "v0.20.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5750, "system": 1991, "common": 97758, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95644, "rtu": 105418, "supervisor": 322554, "coordinator": 230186, "pocket": 37639}} \ No newline at end of file From 4ed6ec1c63c1ed6bf6f16e7c0ef219cae126a1b4 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 21:01:24 -0400 Subject: [PATCH 21/34] correctly print new messages without overwrites in dmesg even if a prior message is a progress one --- coordinator/startup.lua | 2 +- scada-common/log.lua | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 6f279b0..ce449a2 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.20.0" +local COORDINATOR_VERSION = "v0.20.1" local println = util.println local println_ts = util.println_ts diff --git a/scada-common/log.lua b/scada-common/log.lua index 7e2d3fd..51b5373 100644 --- a/scada-common/log.lua +++ b/scada-common/log.lua @@ -20,7 +20,9 @@ local logger = { mode = MODE.APPEND, debug = false, file = nil, - dmesg_out = nil + dmesg_out = nil, + dmesg_restore_coord = { 1, 1 }, + dmesg_scroll_count = 0 } ---@type function @@ -158,6 +160,7 @@ function log.dmesg(msg, tag, tag_color) if cur_y == out_h then out.scroll(1) out.setCursorPos(1, cur_y) + logger.dmesg_scroll_count = logger.dmesg_scroll_count + 1 else out.setCursorPos(1, cur_y + 1) end @@ -193,6 +196,7 @@ function log.dmesg(msg, tag, tag_color) if cur_y == out_h then out.scroll(1) out.setCursorPos(1, cur_y) + logger.dmesg_scroll_count = logger.dmesg_scroll_count + 1 else out.setCursorPos(1, cur_y + 1) end @@ -201,6 +205,8 @@ function log.dmesg(msg, tag, tag_color) out.write(lines[i]) end + logger.dmesg_restore_coord = { out.getCursorPos() } + _log(util.c("[", t_stamp, "] [", tag, "] ", msg)) end @@ -215,6 +221,7 @@ end ---@return function update, function done function log.dmesg_working(msg, tag, tag_color) local ts_coord = log.dmesg(msg, tag, tag_color) + local initial_scroll = logger.dmesg_scroll_count local out = logger.dmesg_out local width = (ts_coord.x2 - ts_coord.x1) + 1 @@ -225,11 +232,14 @@ function log.dmesg_working(msg, tag, tag_color) local counter = 0 local function update(sec_remaining) + local new_y = ts_coord.y - (logger.dmesg_scroll_count - initial_scroll) + if new_y < 1 then return end + local time = util.sprintf("%ds", sec_remaining) local available = width - (string.len(time) + 2) local progress = "" - out.setCursorPos(ts_coord.x1, ts_coord.y) + out.setCursorPos(ts_coord.x1, new_y) out.write(" ") if counter % 4 == 0 then @@ -249,10 +259,15 @@ function log.dmesg_working(msg, tag, tag_color) out.setTextColor(initial_color) counter = counter + 1 + + out.setCursorPos(table.unpack(logger.dmesg_restore_coord)) end local function done(ok) - out.setCursorPos(ts_coord.x1, ts_coord.y) + local new_y = ts_coord.y - (logger.dmesg_scroll_count - initial_scroll) + if new_y < 1 then return end + + out.setCursorPos(ts_coord.x1, new_y) if ok or ok == nil then out.setTextColor(colors.green) @@ -263,6 +278,8 @@ function log.dmesg_working(msg, tag, tag_color) end out.setTextColor(initial_color) + + out.setCursorPos(table.unpack(logger.dmesg_restore_coord)) end return update, done From 084a153a792ff11e3f7a8115fd4c9b72a7e99f7d Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Tue, 11 Jul 2023 21:06:47 -0400 Subject: [PATCH 22/34] #268 fixed incorrect info print on extra wireless modem connection --- coordinator/startup.lua | 4 +++- install_manifest.json | 2 +- reactor-plc/startup.lua | 2 +- reactor-plc/threads.lua | 2 ++ rtu/startup.lua | 2 +- rtu/threads.lua | 2 ++ supervisor/startup.lua | 4 +++- 7 files changed, 13 insertions(+), 5 deletions(-) diff --git a/coordinator/startup.lua b/coordinator/startup.lua index ce449a2..fd28a1f 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.20.1" +local COORDINATOR_VERSION = "v0.20.2" local println = util.println local println_ts = util.println_ts @@ -271,6 +271,8 @@ local function main() log_sys("comms modem reconnected") nic.connect(device) iocontrol.fp_has_modem(true) + elseif device.isWireless() then + log.info("unused wireless modem reconnected") else log_sys("wired modem reconnected") end diff --git a/install_manifest.json b/install_manifest.json index a0a9616..4e3dab9 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.3", "rtu": "v1.5.1", "supervisor": "v0.19.3", "coordinator": "v0.20.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5750, "system": 1991, "common": 97758, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95644, "rtu": 105418, "supervisor": 322554, "coordinator": 230186, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.4", "rtu": "v1.5.2", "supervisor": "v0.19.4", "coordinator": "v0.20.2", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5750, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95774, "rtu": 105548, "supervisor": 322676, "coordinator": 230308, "pocket": 37639}} \ No newline at end of file diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index 1f1cdf1..a5b013c 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -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.5.3" +local R_PLC_VERSION = "v1.5.4" local println = util.println local println_ts = util.println_ts diff --git a/reactor-plc/threads.lua b/reactor-plc/threads.lua index e3cd9a1..10634ef 100644 --- a/reactor-plc/threads.lua +++ b/reactor-plc/threads.lua @@ -249,6 +249,8 @@ function threads.thread__main(smem, init) if not plc_state.no_reactor then plc_state.degraded = false end + elseif device.isWireless() then + log.info("unused wireless modem reconnected") else log.info("wired modem reconnected") end diff --git a/rtu/startup.lua b/rtu/startup.lua index d91075e..4a59ca0 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -30,7 +30,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.5.1" +local RTU_VERSION = "v1.5.2" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE diff --git a/rtu/threads.lua b/rtu/threads.lua index 32cda4f..58d19c6 100644 --- a/rtu/threads.lua +++ b/rtu/threads.lua @@ -142,6 +142,8 @@ function threads.thread__main(smem) log.info("comms modem reconnected") databus.tx_hw_modem(true) + elseif device.isWireless() then + log.info("unused wireless modem reconnected") else log.info("wired modem reconnected") end diff --git a/supervisor/startup.lua b/supervisor/startup.lua index fe6c84a..ba71270 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v0.19.3" +local SUPERVISOR_VERSION = "v0.19.4" local println = util.println local println_ts = util.println_ts @@ -178,6 +178,8 @@ local function main() log.info("comms modem reconnected") databus.tx_hw_modem(true) + elseif device.isWireless() then + log.info("unused wireless modem reconnected") else log.info("wired modem reconnected") end From 4d663ada8d257c2cb2eb9152a3db93ecfe136c87 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Wed, 12 Jul 2023 13:38:37 -0400 Subject: [PATCH 23/34] added high contrast yellow to rtu/plc/coord front panels --- coordinator/startup.lua | 2 +- coordinator/ui/style.lua | 3 ++- install_manifest.json | 2 +- reactor-plc/panel/style.lua | 3 ++- reactor-plc/startup.lua | 2 +- rtu/panel/style.lua | 3 ++- rtu/startup.lua | 2 +- 7 files changed, 10 insertions(+), 7 deletions(-) diff --git a/coordinator/startup.lua b/coordinator/startup.lua index fd28a1f..52904f2 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.20.2" +local COORDINATOR_VERSION = "v0.20.3" local println = util.println local println_ts = util.println_ts diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 1fd569f..ea52556 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -12,6 +12,7 @@ local cpair = core.cpair -- add color mappings for front panel colors.ivory = colors.pink +colors.yellow_hc = colors.purple colors.red_off = colors.brown colors.yellow_off = colors.magenta colors.green_off = colors.lime @@ -32,7 +33,7 @@ style.fp.colors = { { c = colors.cyan, hex = 0x34bac8 }, { c = colors.lightBlue, hex = 0x6cc0f2 }, { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, + { c = colors.purple, hex = 0xb156ee }, -- YELLOW HIGH CONTRAST { c = colors.pink, hex = 0xdcd9ca }, -- IVORY { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF -- { c = colors.white, hex = 0xdcd9ca }, diff --git a/install_manifest.json b/install_manifest.json index 4e3dab9..8982f19 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.4", "rtu": "v1.5.2", "supervisor": "v0.19.4", "coordinator": "v0.20.2", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5750, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95774, "rtu": 105548, "supervisor": 322676, "coordinator": 230308, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.3", "supervisor": "v0.19.4", "coordinator": "v0.20.3", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5750, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105607, "supervisor": 322676, "coordinator": 230367, "pocket": 37639}} \ No newline at end of file diff --git a/reactor-plc/panel/style.lua b/reactor-plc/panel/style.lua index 996453c..edf3f64 100644 --- a/reactor-plc/panel/style.lua +++ b/reactor-plc/panel/style.lua @@ -12,6 +12,7 @@ local cpair = core.cpair -- remap global colors colors.ivory = colors.pink +colors.yellow_hc = colors.purple colors.red_off = colors.brown colors.yellow_off = colors.magenta colors.green_off = colors.lime @@ -28,7 +29,7 @@ style.colors = { { c = colors.cyan, hex = 0x34bac8 }, { c = colors.lightBlue, hex = 0x6cc0f2 }, { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, + { c = colors.purple, hex = 0xb156ee }, -- YELLOW HIGH CONTRAST { c = colors.pink, hex = 0xdcd9ca }, -- IVORY { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF -- { c = colors.white, hex = 0xdcd9ca }, diff --git a/reactor-plc/startup.lua b/reactor-plc/startup.lua index a5b013c..0c8022f 100644 --- a/reactor-plc/startup.lua +++ b/reactor-plc/startup.lua @@ -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.5.4" +local R_PLC_VERSION = "v1.5.5" local println = util.println local println_ts = util.println_ts diff --git a/rtu/panel/style.lua b/rtu/panel/style.lua index 996453c..edf3f64 100644 --- a/rtu/panel/style.lua +++ b/rtu/panel/style.lua @@ -12,6 +12,7 @@ local cpair = core.cpair -- remap global colors colors.ivory = colors.pink +colors.yellow_hc = colors.purple colors.red_off = colors.brown colors.yellow_off = colors.magenta colors.green_off = colors.lime @@ -28,7 +29,7 @@ style.colors = { { c = colors.cyan, hex = 0x34bac8 }, { c = colors.lightBlue, hex = 0x6cc0f2 }, { c = colors.blue, hex = 0x0096ff }, - { c = colors.purple, hex = 0xb156ee }, + { c = colors.purple, hex = 0xb156ee }, -- YELLOW HIGH CONTRAST { c = colors.pink, hex = 0xdcd9ca }, -- IVORY { c = colors.magenta, hex = 0x85862c }, -- YELLOW OFF -- { c = colors.white, hex = 0xdcd9ca }, diff --git a/rtu/startup.lua b/rtu/startup.lua index 4a59ca0..57f8a9b 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -30,7 +30,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.5.2" +local RTU_VERSION = "v1.5.3" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE From a164c18a502bf26db0eb8cfa9ead0019e12e6849 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Thu, 13 Jul 2023 12:19:25 -0400 Subject: [PATCH 24/34] removed unused fields from dynamic tank rtu --- rtu/dev/dynamicv_rtu.lua | 3 --- rtu/startup.lua | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/rtu/dev/dynamicv_rtu.lua b/rtu/dev/dynamicv_rtu.lua index ff2e0f2..75540a3 100644 --- a/rtu/dev/dynamicv_rtu.lua +++ b/rtu/dev/dynamicv_rtu.lua @@ -30,10 +30,7 @@ function dynamicv_rtu.new(dynamic_tank) -- build properties unit.connect_input_reg(dynamic_tank.getTankCapacity) unit.connect_input_reg(dynamic_tank.getChemicalTankCapacity) - -- current state -- tanks/containers - unit.connect_input_reg(dynamic_tank.getInputItem) - unit.connect_input_reg(dynamic_tank.getOutputItem) unit.connect_input_reg(dynamic_tank.getStored) unit.connect_input_reg(dynamic_tank.getFilledPercentage) diff --git a/rtu/startup.lua b/rtu/startup.lua index 57f8a9b..9567866 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -30,7 +30,7 @@ local sna_rtu = require("rtu.dev.sna_rtu") local sps_rtu = require("rtu.dev.sps_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu") -local RTU_VERSION = "v1.5.3" +local RTU_VERSION = "v1.5.4" local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_HW_STATE = databus.RTU_UNIT_HW_STATE From 47bda73afe15081fe9cdd1b076c12c7a6828b4b1 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 15 Jul 2023 13:16:36 -0400 Subject: [PATCH 25/34] #272 basic dynamic tank data in supervisor and coordinator --- coordinator/iocontrol.lua | 318 +++++++++++++++++----------- coordinator/startup.lua | 2 +- install_manifest.json | 2 +- supervisor/facility.lua | 98 +++++---- supervisor/session/coordinator.lua | 4 +- supervisor/session/rtu.lua | 9 + supervisor/session/rtu/dynamicv.lua | 289 +++++++++++++++++++++++++ supervisor/session/rtu/qtypes.lua | 15 ++ supervisor/startup.lua | 2 +- supervisor/unit.lua | 137 ++++++------ 10 files changed, 645 insertions(+), 231 deletions(-) create mode 100644 supervisor/session/rtu/dynamicv.lua diff --git a/coordinator/iocontrol.lua b/coordinator/iocontrol.lua index d199e0c..ce6d667 100644 --- a/coordinator/iocontrol.lua +++ b/coordinator/iocontrol.lua @@ -91,6 +91,9 @@ function iocontrol.init(conf, comms) sps_ps_tbl = {}, sps_data_tbl = {}, + tank_ps_tbl = {}, + tank_data_tbl = {}, + env_d_ps = psil.create(), env_d_data = {} } @@ -181,7 +184,10 @@ function iocontrol.init(conf, comms) boiler_data_tbl = {}, turbine_ps_tbl = {}, - turbine_data_tbl = {} + turbine_data_tbl = {}, + + tank_ps_tbl = {}, + tank_data_tbl = {} } -- create boiler tables @@ -208,6 +214,8 @@ function iocontrol.init(conf, comms) process.init(io, comms) end +--#region Front Panel PSIL + -- toggle heartbeat indicator function iocontrol.heartbeat() io.fp.ps.toggle("heartbeat") end @@ -262,6 +270,36 @@ function iocontrol.fp_pkt_rtt(session_id, rtt) end end +--#endregion + +--#region Builds + +-- record and publish multiblock RTU build data +---@param id integer +---@param entry table +---@param data_tbl table +---@param ps_tbl table +---@param create boolean? true to create an entry if non exists, false to fail on missing +---@return boolean ok true if data saved, false if invalid ID +local function _record_multiblock_build(id, entry, data_tbl, ps_tbl, create) + local exists = type(data_tbl[id]) == "table" + if exists or create then + if not exists then + ps_tbl[id] = psil.create() + data_tbl[id] = {} + end + + data_tbl[id].formed = entry[1] ---@type boolean + data_tbl[id].build = entry[2] ---@type table + + ps_tbl[id].publish("formed", entry[1]) + + for key, val in pairs(data_tbl[id].build) do ps_tbl[id].publish(key, val) end + end + + return exists or (create == true) +end + -- populate facility structure builds ---@param build table ---@return boolean valid @@ -274,16 +312,7 @@ function iocontrol.record_facility_builds(build) -- induction matricies if type(build.induction) == "table" then for id, matrix in pairs(build.induction) do - if type(fac.induction_data_tbl[id]) == "table" then - fac.induction_data_tbl[id].formed = matrix[1] ---@type boolean - fac.induction_data_tbl[id].build = matrix[2] ---@type table - - fac.induction_ps_tbl[id].publish("formed", matrix[1]) - - for key, val in pairs(fac.induction_data_tbl[id].build) do - fac.induction_ps_tbl[id].publish(key, val) - end - else + if not _record_multiblock_build(id, matrix, fac.induction_data_tbl, fac.induction_ps_tbl) then log.debug(util.c("iocontrol.record_facility_builds: invalid induction matrix id ", id)) valid = false end @@ -293,21 +322,19 @@ function iocontrol.record_facility_builds(build) -- SPS if type(build.sps) == "table" then for id, sps in pairs(build.sps) do - if type(fac.sps_data_tbl[id]) == "table" then - fac.sps_data_tbl[id].formed = sps[1] ---@type boolean - fac.sps_data_tbl[id].build = sps[2] ---@type table - - fac.sps_ps_tbl[id].publish("formed", sps[1]) - - for key, val in pairs(fac.sps_data_tbl[id].build) do - fac.sps_ps_tbl[id].publish(key, val) - end - else + if not _record_multiblock_build(id, sps, fac.sps_data_tbl, fac.sps_ps_tbl) then log.debug(util.c("iocontrol.record_facility_builds: invalid SPS id ", id)) valid = false end end end + + -- dynamic tanks + if type(build.tanks) == "table" then + for id, tank in pairs(build.tanks) do + _record_multiblock_build(id, tank, fac.tank_data_tbl, fac.tank_ps_tbl, true) + end + end else log.debug("facility builds not a table") valid = false @@ -351,16 +378,7 @@ function iocontrol.record_unit_builds(builds) -- boiler builds if type(build.boilers) == "table" then for b_id, boiler in pairs(build.boilers) do - if type(unit.boiler_data_tbl[b_id]) == "table" then - unit.boiler_data_tbl[b_id].formed = boiler[1] ---@type boolean - unit.boiler_data_tbl[b_id].build = boiler[2] ---@type table - - unit.boiler_ps_tbl[b_id].publish("formed", boiler[1]) - - for key, val in pairs(unit.boiler_data_tbl[b_id].build) do - unit.boiler_ps_tbl[b_id].publish(key, val) - end - else + if not _record_multiblock_build(b_id, boiler, unit.boiler_data_tbl, unit.boiler_ps_tbl) then log.debug(util.c(log_header, "invalid boiler id ", b_id)) valid = false end @@ -370,27 +388,49 @@ function iocontrol.record_unit_builds(builds) -- turbine builds if type(build.turbines) == "table" then for t_id, turbine in pairs(build.turbines) do - if type(unit.turbine_data_tbl[t_id]) == "table" then - unit.turbine_data_tbl[t_id].formed = turbine[1] ---@type boolean - unit.turbine_data_tbl[t_id].build = turbine[2] ---@type table - - unit.turbine_ps_tbl[t_id].publish("formed", turbine[1]) - - for key, val in pairs(unit.turbine_data_tbl[t_id].build) do - unit.turbine_ps_tbl[t_id].publish(key, val) - end - else + if not _record_multiblock_build(t_id, turbine, unit.turbine_data_tbl, unit.turbine_ps_tbl) then log.debug(util.c(log_header, "invalid turbine id ", t_id)) valid = false end end end + + -- dynamic tank builds + if type(build.tanks) == "table" then + for d_id, d_tank in pairs(build.tanks) do + _record_multiblock_build(d_id, d_tank, unit.tank_data_tbl, unit.tank_ps_tbl, true) + end + end end end return valid end +--#endregion + +--#region Statuses + +-- record and publish multiblock status data +---@param entry any +---@param data imatrix_session_db|sps_session_db|dynamicv_session_db|turbinev_session_db|boilerv_session_db +---@param ps psil +---@return boolean is_faulted +local function _record_multiblock_status(entry, data, ps) + local is_faulted = entry[1] ---@type boolean + data.formed = entry[2] ---@type boolean + data.state = entry[3] ---@type table + data.tanks = entry[4] ---@type table + + ps.publish("formed", data.formed) + ps.publish("faulted", is_faulted) + + for key, val in pairs(data.state) do ps.publish(key, val) end + for key, val in pairs(data.tanks) do ps.publish(key, val) end + + return is_faulted +end + -- update facility status ---@param status table ---@return boolean valid @@ -498,36 +538,23 @@ function iocontrol.update_facility_status(status) for id, matrix in pairs(rtu_statuses.induction) do if type(fac.induction_data_tbl[id]) == "table" then - local rtu_faulted = matrix[1] ---@type boolean - fac.induction_data_tbl[id].formed = matrix[2] ---@type boolean - fac.induction_data_tbl[id].state = matrix[3] ---@type table - fac.induction_data_tbl[id].tanks = matrix[4] ---@type table + local data = fac.induction_data_tbl[id] ---@type imatrix_session_db + local ps = fac.induction_ps_tbl[id] ---@type psil - local data = fac.induction_data_tbl[id] ---@type imatrix_session_db + local rtu_faulted = _record_multiblock_status(matrix, data, ps) - fac.induction_ps_tbl[id].publish("formed", data.formed) - fac.induction_ps_tbl[id].publish("faulted", rtu_faulted) - - if data.formed then - if rtu_faulted then - fac.induction_ps_tbl[id].publish("computed_status", 3) -- faulted - elseif data.tanks.energy_fill >= 0.99 then - fac.induction_ps_tbl[id].publish("computed_status", 6) -- full + if rtu_faulted then + ps.publish("computed_status", 3) -- faulted + elseif data.formed then + if data.tanks.energy_fill >= 0.99 then + ps.publish("computed_status", 6) -- full elseif data.tanks.energy_fill <= 0.01 then - fac.induction_ps_tbl[id].publish("computed_status", 5) -- empty + ps.publish("computed_status", 5) -- empty else - fac.induction_ps_tbl[id].publish("computed_status", 4) -- on-line + ps.publish("computed_status", 4) -- on-line end else - fac.induction_ps_tbl[id].publish("computed_status", 2) -- not formed - end - - for key, val in pairs(fac.induction_data_tbl[id].state) do - fac.induction_ps_tbl[id].publish(key, val) - end - - for key, val in pairs(fac.induction_data_tbl[id].tanks) do - fac.induction_ps_tbl[id].publish(key, val) + ps.publish("computed_status", 2) -- not formed end else log.debug(util.c(log_header, "invalid induction matrix id ", id)) @@ -549,31 +576,23 @@ function iocontrol.update_facility_status(status) for id, sps in pairs(rtu_statuses.sps) do if type(fac.sps_data_tbl[id]) == "table" then - local rtu_faulted = sps[1] ---@type boolean - fac.sps_data_tbl[id].formed = sps[2] ---@type boolean - fac.sps_data_tbl[id].state = sps[3] ---@type table - fac.sps_data_tbl[id].tanks = sps[4] ---@type table + local data = fac.sps_data_tbl[id] ---@type sps_session_db + local ps = fac.sps_ps_tbl[id] ---@type psil - local data = fac.sps_data_tbl[id] ---@type sps_session_db + local rtu_faulted = _record_multiblock_status(sps, data, ps) - fac.sps_ps_tbl[id].publish("formed", data.formed) - fac.sps_ps_tbl[id].publish("faulted", rtu_faulted) - - if data.formed then - if rtu_faulted then - fac.sps_ps_tbl[id].publish("computed_status", 3) -- faulted - elseif data.state.process_rate > 0 then - fac.sps_ps_tbl[id].publish("computed_status", 5) -- active + if rtu_faulted then + ps.publish("computed_status", 3) -- faulted + elseif data.formed then + if data.state.process_rate > 0 then + ps.publish("computed_status", 5) -- active else - fac.sps_ps_tbl[id].publish("computed_status", 4) -- idle + ps.publish("computed_status", 4) -- idle end else - fac.sps_ps_tbl[id].publish("computed_status", 2) -- not formed + ps.publish("computed_status", 2) -- not formed end - for key, val in pairs(data.state) do fac.sps_ps_tbl[id].publish(key, val) end - for key, val in pairs(data.tanks) do fac.sps_ps_tbl[id].publish(key, val) end - io.facility.ps.publish("am_rate", data.state.process_rate * 1000) else log.debug(util.c(log_header, "invalid sps id ", id)) @@ -584,6 +603,44 @@ function iocontrol.update_facility_status(status) valid = false end + -- dynamic tank statuses + if type(rtu_statuses.tanks) == "table" then + for id = 1, #fac.tank_ps_tbl do + if rtu_statuses.tanks[id] == nil then + -- disconnected + fac.tank_ps_tbl[id].publish("computed_status", 1) + end + end + + for id, tank in pairs(rtu_statuses.tanks) do + if type(fac.tank_data_tbl[id]) == "table" then + local data = fac.tank_data_tbl[id] ---@type dynamicv_session_db + local ps = fac.tank_ps_tbl[id] ---@type psil + + local rtu_faulted = _record_multiblock_status(tank, data, ps) + + if rtu_faulted then + ps.publish("computed_status", 3) -- faulted + elseif data.formed then + if data.tanks.fill >= 0.99 then + ps.publish("computed_status", 6) -- full + elseif data.tanks.fill < 0.20 then + ps.publish("computed_status", 5) -- low + else + ps.publish("computed_status", 4) -- on-line + end + else + ps.publish("computed_status", 2) -- not formed + end + else + log.debug(util.c(log_header, "invalid dynamic tank id ", id)) + end + end + else + log.debug(log_header .. "dyanmic tank list not a table") + valid = false + end + -- environment detector status if type(rtu_statuses.rad_mon) == "table" then if #rtu_statuses.rad_mon > 0 then @@ -731,34 +788,21 @@ function iocontrol.update_unit_statuses(statuses) for id, boiler in pairs(rtu_statuses.boilers) do if type(unit.boiler_data_tbl[id]) == "table" then - local rtu_faulted = boiler[1] ---@type boolean - unit.boiler_data_tbl[id].formed = boiler[2] ---@type boolean - unit.boiler_data_tbl[id].state = boiler[3] ---@type table - unit.boiler_data_tbl[id].tanks = boiler[4] ---@type table + local data = unit.boiler_data_tbl[id] ---@type boilerv_session_db + local ps = unit.boiler_ps_tbl[id] ---@type psil - local data = unit.boiler_data_tbl[id] ---@type boilerv_session_db - - unit.boiler_ps_tbl[id].publish("formed", data.formed) - unit.boiler_ps_tbl[id].publish("faulted", rtu_faulted) + local rtu_faulted = _record_multiblock_status(boiler, data, ps) if rtu_faulted then - unit.boiler_ps_tbl[id].publish("computed_status", 3) -- faulted + ps.publish("computed_status", 3) -- faulted elseif data.formed then if data.state.boil_rate > 0 then - unit.boiler_ps_tbl[id].publish("computed_status", 5) -- active + ps.publish("computed_status", 5) -- active else - unit.boiler_ps_tbl[id].publish("computed_status", 4) -- idle + ps.publish("computed_status", 4) -- idle end else - unit.boiler_ps_tbl[id].publish("computed_status", 2) -- not formed - end - - for key, val in pairs(unit.boiler_data_tbl[id].state) do - unit.boiler_ps_tbl[id].publish(key, val) - end - - for key, val in pairs(unit.boiler_data_tbl[id].tanks) do - unit.boiler_ps_tbl[id].publish(key, val) + ps.publish("computed_status", 2) -- not formed end else log.debug(util.c(log_header, "invalid boiler id ", id)) @@ -781,36 +825,23 @@ function iocontrol.update_unit_statuses(statuses) for id, turbine in pairs(rtu_statuses.turbines) do if type(unit.turbine_data_tbl[id]) == "table" then - local rtu_faulted = turbine[1] ---@type boolean - unit.turbine_data_tbl[id].formed = turbine[2] ---@type boolean - unit.turbine_data_tbl[id].state = turbine[3] ---@type table - unit.turbine_data_tbl[id].tanks = turbine[4] ---@type table - local data = unit.turbine_data_tbl[id] ---@type turbinev_session_db + local ps = unit.turbine_ps_tbl[id] ---@type psil - unit.turbine_ps_tbl[id].publish("formed", data.formed) - unit.turbine_ps_tbl[id].publish("faulted", rtu_faulted) + local rtu_faulted = _record_multiblock_status(turbine, data, ps) if rtu_faulted then - unit.turbine_ps_tbl[id].publish("computed_status", 3) -- faulted + ps.publish("computed_status", 3) -- faulted elseif data.formed then if data.tanks.energy_fill >= 0.99 then - unit.turbine_ps_tbl[id].publish("computed_status", 6) -- trip + ps.publish("computed_status", 6) -- trip elseif data.state.flow_rate < 100 then - unit.turbine_ps_tbl[id].publish("computed_status", 4) -- idle + ps.publish("computed_status", 4) -- idle else - unit.turbine_ps_tbl[id].publish("computed_status", 5) -- active + ps.publish("computed_status", 5) -- active end else - unit.turbine_ps_tbl[id].publish("computed_status", 2) -- not formed - end - - for key, val in pairs(unit.turbine_data_tbl[id].state) do - unit.turbine_ps_tbl[id].publish(key, val) - end - - for key, val in pairs(unit.turbine_data_tbl[id].tanks) do - unit.turbine_ps_tbl[id].publish(key, val) + ps.publish("computed_status", 2) -- not formed end else log.debug(util.c(log_header, "invalid turbine id ", id)) @@ -822,6 +853,45 @@ function iocontrol.update_unit_statuses(statuses) valid = false end + -- dynamic tank statuses + if type(rtu_statuses.tanks) == "table" then + for id = 1, #unit.tank_ps_tbl do + if rtu_statuses.tanks[i] == nil then + -- disconnected + unit.tank_ps_tbl[id].publish("computed_status", 1) + end + end + + for id, tank in pairs(rtu_statuses.tanks) do + if type(unit.tank_data_tbl[id]) == "table" then + local data = unit.tank_data_tbl[id] ---@type dynamicv_session_db + local ps = unit.tank_ps_tbl[id] ---@type psil + + local rtu_faulted = _record_multiblock_status(tank, data, ps) + + if rtu_faulted then + ps.publish("computed_status", 3) -- faulted + elseif data.formed then + if data.tanks.fill >= 0.99 then + ps.publish("computed_status", 6) -- full + elseif data.tanks.fill < 0.20 then + ps.publish("computed_status", 5) -- low + else + ps.publish("computed_status", 5) -- active + end + else + ps.publish("computed_status", 2) -- not formed + end + else + log.debug(util.c(log_header, "invalid dynamic tank id ", id)) + valid = false + end + end + else + log.debug(log_header .. "dynamic tank list not a table") + valid = false + end + -- solar neutron activator status info if type(rtu_statuses.sna) == "table" then unit.num_snas = rtu_statuses.sna[1] ---@type integer @@ -951,6 +1021,8 @@ function iocontrol.update_unit_statuses(statuses) return valid end +--#endregion + -- get the IO controller database function iocontrol.get_db() return io end diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 52904f2..0a922b7 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -22,7 +22,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.20.3" +local COORDINATOR_VERSION = "v0.21.0" local println = util.println local println_ts = util.println_ts diff --git a/install_manifest.json b/install_manifest.json index 8982f19..e0db13b 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.3", "supervisor": "v0.19.4", "coordinator": "v0.20.3", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5750, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105607, "supervisor": 322676, "coordinator": 230367, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.0", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335422, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file diff --git a/supervisor/facility.lua b/supervisor/facility.lua index 52870fa..77aa676 100644 --- a/supervisor/facility.lua +++ b/supervisor/facility.lua @@ -62,9 +62,11 @@ function facility.new(num_reactors, cooling_conf) all_sys_ok = false, -- rtus rtu_conn_count = 0, + rtu_list = {}, redstone = {}, induction = {}, sps = {}, + tanks = {}, envd = {}, -- redstone I/O control io_ctl = nil, ---@type rs_controller @@ -120,15 +122,12 @@ function facility.new(num_reactors, cooling_conf) table.insert(self.group_map, 0) end + -- list for RTU session management + self.rtu_list = { self.redstone, self.induction, self.sps, self.tanks, self.envd } + -- init redstone RTU I/O controller self.io_ctl = rsctl.new(self.redstone) - -- unlink disconnected units - ---@param sessions table - local function _unlink_disconnected_units(sessions) - util.filter_table(sessions, function (u) return u.is_connected() end) - end - -- check if all auto-controlled units completed ramping ---@nodiscard local function _all_units_ramped() @@ -215,29 +214,48 @@ function facility.new(num_reactors, cooling_conf) -- link an induction matrix RTU session ---@param imatrix unit_session + ---@return boolean linked induction matrix accepted (max 1) function public.add_imatrix(imatrix) - table.insert(self.induction, imatrix) + if #self.induction == 0 then + table.insert(self.induction, imatrix) + return true + else return false end end -- link an SPS RTU session ---@param sps unit_session + ---@return boolean linked SPS accepted (max 1) function public.add_sps(sps) - table.insert(self.sps, sps) + if #self.sps == 0 then + table.insert(self.sps, sps) + return true + else return false end + end + + -- link a dynamic tank RTU session + ---@param dynamic_tank unit_session + ---@return boolean linked dynamic tank accepted (max 1) + function public.add_tank(dynamic_tank) + if #self.tanks == 0 then + table.insert(self.tanks, dynamic_tank) + return true + else return false end end -- link an environment detector RTU session ---@param envd unit_session + ---@return boolean linked environment detector accepted (max 1) function public.add_envd(envd) - table.insert(self.envd, envd) + if #self.envd == 0 then + table.insert(self.envd, envd) + return true + else return false end end -- purge devices associated with the given RTU session ID ---@param session integer RTU session ID function public.purge_rtu_devices(session) - util.filter_table(self.redstone, function (s) return s.get_session_id() ~= session end) - util.filter_table(self.induction, function (s) return s.get_session_id() ~= session end) - util.filter_table(self.sps, function (s) return s.get_session_id() ~= session end) - util.filter_table(self.envd, function (s) return s.get_session_id() ~= session end) + for _, v in pairs(self.rtu_list) do util.filter_table(v, function (s) return s.get_session_id() ~= session end) end end -- UPDATE -- @@ -251,10 +269,7 @@ function facility.new(num_reactors, cooling_conf) -- update (iterate) the facility management function public.update() -- unlink RTU unit sessions if they are closed - _unlink_disconnected_units(self.redstone) - _unlink_disconnected_units(self.induction) - _unlink_disconnected_units(self.sps) - _unlink_disconnected_units(self.envd) + for _, v in pairs(self.rtu_list) do util.filter_table(v, function (u) return u.is_connected() end) end -- current state for process control local charge_update = 0 @@ -814,11 +829,9 @@ function facility.new(num_reactors, cooling_conf) ready = self.mode_set > 0 - if (self.mode_set == PROCESS.CHARGE) and (self.charge_setpoint <= 0) then - ready = false - elseif (self.mode_set == PROCESS.GEN_RATE) and (self.gen_rate_setpoint <= 0) then - ready = false - elseif (self.mode_set == PROCESS.BURN_RATE) and (self.burn_target < 0.1) then + if (self.mode_set == PROCESS.CHARGE) and (self.charge_setpoint <= 0) or + (self.mode_set == PROCESS.GEN_RATE) and (self.gen_rate_setpoint <= 0) or + (self.mode_set == PROCESS.BURN_RATE) and (self.burn_target < 0.1) then ready = false end @@ -903,6 +916,14 @@ function facility.new(num_reactors, cooling_conf) end end + if all or type == RTU_UNIT_TYPE.DYNAMIC_VALVE then + build.tanks = {} + for i = 1, #self.tanks do + local tank = self.tanks[i] ---@type unit_session + build.tanks[tank.get_device_idx()] = { tank.get_db().formed, tank.get_db().build } + end + end + return build end @@ -948,35 +969,32 @@ function facility.new(num_reactors, cooling_conf) -- status of induction matricies (including tanks) status.induction = {} for i = 1, #self.induction do - local matrix = self.induction[i] ---@type unit_session - status.induction[matrix.get_device_idx()] = { - matrix.is_faulted(), - matrix.get_db().formed, - matrix.get_db().state, - matrix.get_db().tanks - } + local matrix = self.induction[i] ---@type unit_session + local db = matrix.get_db() ---@type imatrix_session_db + status.induction[matrix.get_device_idx()] = { matrix.is_faulted(), db.formed, db.state, db.tanks } end -- status of sps status.sps = {} for i = 1, #self.sps do - local sps = self.sps[i] ---@type unit_session - status.sps[sps.get_device_idx()] = { - sps.is_faulted(), - sps.get_db().formed, - sps.get_db().state, - sps.get_db().tanks - } + local sps = self.sps[i] ---@type unit_session + local db = sps.get_db() ---@type sps_session_db + status.sps[sps.get_device_idx()] = { sps.is_faulted(), db.formed, db.state, db.tanks } + end + + -- status of dynamic tanks + status.tanks = {} + for i = 1, #self.tanks do + local tank = self.tanks[i] ---@type unit_session + local db = tank.get_db() ---@type dynamicv_session_db + status.tanks[tank.get_device_idx()] = { tank.is_faulted(), db.formed, db.state, db.tanks } end -- radiation monitors (environment detectors) status.rad_mon = {} for i = 1, #self.envd do local envd = self.envd[i] ---@type unit_session - status.rad_mon[envd.get_device_idx()] = { - envd.is_faulted(), - envd.get_db().radiation - } + status.rad_mon[envd.get_device_idx()] = { envd.is_faulted(), envd.get_db().radiation } end return status diff --git a/supervisor/session/coordinator.lua b/supervisor/session/coordinator.lua index eb8935f..e6ddc20 100644 --- a/supervisor/session/coordinator.lua +++ b/supervisor/session/coordinator.lua @@ -406,7 +406,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil local builds = {} local unit = self.units[unit_id] ---@type reactor_unit - builds[unit_id] = unit.get_build(true, false, false) + builds[unit_id] = unit.get_build(-1) _send(SCADA_CRDN_TYPE.UNIT_BUILDS, { builds }) elseif cmd.key == CRD_S_DATA.RESEND_RTU_BUILD then @@ -420,7 +420,7 @@ function coordinator.new_session(id, s_addr, in_queue, out_queue, timeout, facil local builds = {} local unit = self.units[unit_id] ---@type reactor_unit - builds[unit_id] = unit.get_build(false, cmd.val.type == RTU_UNIT_TYPE.BOILER_VALVE, cmd.val.type == RTU_UNIT_TYPE.TURBINE_VALVE) + builds[unit_id] = unit.get_build(cmd.val.type) _send(SCADA_CRDN_TYPE.UNIT_BUILDS, { builds }) else diff --git a/supervisor/session/rtu.lua b/supervisor/session/rtu.lua index ce5e08d..c33f11a 100644 --- a/supervisor/session/rtu.lua +++ b/supervisor/session/rtu.lua @@ -11,6 +11,7 @@ local svqtypes = require("supervisor.session.svqtypes") -- supervisor rtu sessions (svrs) local unit_session = require("supervisor.session.rtu.unit_session") local svrs_boilerv = require("supervisor.session.rtu.boilerv") +local svrs_dynamicv = require("supervisor.session.rtu.dynamicv") local svrs_envd = require("supervisor.session.rtu.envd") local svrs_imatrix = require("supervisor.session.rtu.imatrix") local svrs_redstone = require("supervisor.session.rtu.redstone") @@ -138,6 +139,10 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement -- turbine unit = svrs_turbinev.new(id, i, unit_advert, self.modbus_q) if type(unit) ~= "nil" then target_unit.add_turbine(unit) end + elseif u_type == RTU_UNIT_TYPE.DYNAMIC_VALVE then + -- dynamic tank + unit = svrs_dynamicv.new(id, i, unit_advert, self.modbus_q) + if type(unit) ~= "nil" then target_unit.add_tank(unit) end elseif u_type == RTU_UNIT_TYPE.SNA then -- solar neutron activator unit = svrs_sna.new(id, i, unit_advert, self.modbus_q) @@ -166,6 +171,10 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement -- super-critical phase shifter unit = svrs_sps.new(id, i, unit_advert, self.modbus_q) if type(unit) ~= "nil" then facility.add_sps(unit) end + elseif u_type == RTU_UNIT_TYPE.DYNAMIC_VALVE then + -- dynamic tank + unit = svrs_dynamicv.new(id, i, unit_advert, self.modbus_q) + if type(unit) ~= "nil" then facility.add_tank(unit) end elseif u_type == RTU_UNIT_TYPE.ENV_DETECTOR then -- environment detector unit = svrs_envd.new(id, i, unit_advert, self.modbus_q) diff --git a/supervisor/session/rtu/dynamicv.lua b/supervisor/session/rtu/dynamicv.lua new file mode 100644 index 0000000..d019da4 --- /dev/null +++ b/supervisor/session/rtu/dynamicv.lua @@ -0,0 +1,289 @@ +local log = require("scada-common.log") +local mqueue = require("scada-common.mqueue") +local types = require("scada-common.types") +local util = require("scada-common.util") + +local qtypes = require("supervisor.session.rtu.qtypes") +local unit_session = require("supervisor.session.rtu.unit_session") + +local dynamicv = {} + +local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE +local CONTAINER_MODE = types.CONTAINER_MODE +local MODBUS_FCODE = types.MODBUS_FCODE + +local DTV_RTU_S_CMDS = qtypes.DTV_RTU_S_CMDS +local DTV_RTU_S_DATA = qtypes.DTV_RTU_S_DATA + +local TXN_TYPES = { + FORMED = 1, + BUILD = 2, + STATE = 3, + TANKS = 4, + INC_CONT = 5, + DEC_CONT = 6, + SET_CONT = 7 +} + +local TXN_TAGS = { + "dynamicv.formed", + "dynamicv.build", + "dynamicv.state", + "dynamicv.tanks", + "dynamicv.inc_cont_mode", + "dynamicv.dec_cont_mode", + "dynamicv.set_cont_mode" +} + +local PERIODICS = { + FORMED = 2000, + BUILD = 1000, + STATE = 1000, + TANKS = 500 +} + +-- create a new dynamicv rtu session runner +---@nodiscard +---@param session_id integer RTU session ID +---@param unit_id integer RTU unit ID +---@param advert rtu_advertisement RTU advertisement table +---@param out_queue mqueue RTU unit message out queue +function dynamicv.new(session_id, unit_id, advert, out_queue) + -- type check + if advert.type ~= RTU_UNIT_TYPE.DYNAMIC_VALVE then + log.error("attempt to instantiate dynamicv RTU for type '" .. types.rtu_type_to_string(advert.type) .. "'. this is a bug.") + return nil + end + + local log_tag = "session.rtu(" .. session_id .. ").dynamicv(" .. advert.index .. "): " + + local self = { + session = unit_session.new(session_id, unit_id, advert, out_queue, log_tag, TXN_TAGS), + has_build = false, + periodics = { + next_formed_req = 0, + next_build_req = 0, + next_state_req = 0, + next_tanks_req = 0 + }, + ---@class dynamicv_session_db + db = { + formed = false, + build = { + last_update = 0, + length = 0, + width = 0, + height = 0, + min_pos = types.new_zero_coordinate(), + max_pos = types.new_zero_coordinate(), + tank_capacity = 0, + chem_tank_capacity = 0 + }, + state = { + last_update = 0, + container_mode = CONTAINER_MODE.BOTH ---@type container_mode + }, + tanks = { + last_update = 0, + stored = types.new_empty_gas(), + fill = 0 + } + } + } + + local public = self.session.get() + + -- PRIVATE FUNCTIONS -- + + -- increment the container mode + local function _inc_cont_mode() + -- write coil 1 with unused value 0 + self.session.send_request(TXN_TYPES.INC_CONT, MODBUS_FCODE.WRITE_SINGLE_COIL, { 1, 0 }) + end + + -- decrement the container mode + local function _dec_cont_mode() + -- write coil 2 with unused value 0 + self.session.send_request(TXN_TYPES.DEC_CONT, MODBUS_FCODE.WRITE_SINGLE_COIL, { 2, 0 }) + end + + -- set the container mode + ---@param mode container_mode + local function _set_cont_mode(mode) + -- write holding register 1 + self.session.send_request(TXN_TYPES.SET_CONT, MODBUS_FCODE.WRITE_SINGLE_HOLD_REG, { 1, mode }) + end + + -- query if the multiblock is formed + local function _request_formed() + -- read discrete input 1 (start = 1, count = 1) + self.session.send_request(TXN_TYPES.FORMED, MODBUS_FCODE.READ_DISCRETE_INPUTS, { 1, 1 }) + end + + -- query the build of the device + local function _request_build() + -- read input registers 1 through 7 (start = 1, count = 7) + self.session.send_request(TXN_TYPES.BUILD, MODBUS_FCODE.READ_INPUT_REGS, { 1, 7 }) + end + + -- query the state of the device + local function _request_state() + -- read holding register 1 (start = 1, count = 1) + self.session.send_request(TXN_TYPES.STATE, MODBUS_FCODE.READ_MUL_HOLD_REGS, { 1, 1 }) + end + + -- query the tanks of the device + local function _request_tanks() + -- read input registers 8 through 9 (start = 8, count = 2) + self.session.send_request(TXN_TYPES.TANKS, MODBUS_FCODE.READ_INPUT_REGS, { 8, 2 }) + end + + -- PUBLIC FUNCTIONS -- + + -- handle a packet + ---@param m_pkt modbus_frame + function public.handle_packet(m_pkt) + local txn_type = self.session.try_resolve(m_pkt) + if txn_type == false then + -- nothing to do + elseif txn_type == TXN_TYPES.FORMED then + -- formed response + -- load in data if correct length + if m_pkt.length == 1 then + self.db.formed = m_pkt.data[1] + + if not self.db.formed then self.has_build = false end + else + log.debug(log_tag .. "MODBUS transaction reply length mismatch (" .. TXN_TAGS[txn_type] .. ")") + end + elseif txn_type == TXN_TYPES.BUILD then + -- build response + if m_pkt.length == 7 then + self.db.build.last_update = util.time_ms() + self.db.build.length = m_pkt.data[1] + self.db.build.width = m_pkt.data[2] + self.db.build.height = m_pkt.data[3] + self.db.build.min_pos = m_pkt.data[4] + self.db.build.max_pos = m_pkt.data[5] + self.db.build.tank_capacity = m_pkt.data[6] + self.db.build.chem_tank_capacity = m_pkt.data[7] + self.has_build = true + + out_queue.push_data(unit_session.RTU_US_DATA.BUILD_CHANGED, { unit = advert.reactor, type = advert.type }) + else + log.debug(log_tag .. "MODBUS transaction reply length mismatch (" .. TXN_TAGS[txn_type] .. ")") + end + elseif txn_type == TXN_TYPES.STATE then + -- state response + if m_pkt.length == 1 then + self.db.state.last_update = util.time_ms() + self.db.state.container_mode = m_pkt.data[1] + else + log.debug(log_tag .. "MODBUS transaction reply length mismatch (" .. TXN_TAGS[txn_type] .. ")") + end + elseif txn_type == TXN_TYPES.TANKS then + -- tanks response + if m_pkt.length == 2 then + self.db.tanks.last_update = util.time_ms() + self.db.tanks.stored = m_pkt.data[1] + self.db.tanks.fill = m_pkt.data[2] + else + log.debug(log_tag .. "MODBUS transaction reply length mismatch (" .. TXN_TAGS[txn_type] .. ")") + end + elseif txn_type == TXN_TYPES.INC_CONT or txn_type == TXN_TYPES.DEC_CONT or txn_type == TXN_TYPES.SET_CONT then + -- successful acknowledgement + elseif txn_type == nil then + log.error(log_tag .. "unknown transaction reply") + else + log.error(log_tag .. "unknown transaction type " .. txn_type) + end + end + + -- update this runner + ---@param time_now integer milliseconds + function public.update(time_now) + -- check command queue + while self.session.in_q.ready() do + -- get a new message to process + local msg = self.session.in_q.pop() + + if msg ~= nil then + if msg.qtype == mqueue.TYPE.COMMAND then + -- instruction + local cmd = msg.message + + if cmd == DTV_RTU_S_CMDS.INC_CONT_MODE then + _inc_cont_mode() + elseif cmd == DTV_RTU_S_CMDS.DEC_CONT_MODE then + _dec_cont_mode() + else + log.debug(util.c(log_tag, "unrecognized in-queue command ", cmd)) + end + elseif msg.qtype == mqueue.TYPE.DATA then + -- instruction with body + local cmd = msg.message ---@type queue_data + if cmd.key == DTV_RTU_S_DATA.SET_CONT_MODE then + if cmd.val == types.CONTAINER_MODE.BOTH or + cmd.val == types.CONTAINER_MODE.FILL or + cmd.val == types.CONTAINER_MODE.EMPTY then + _set_cont_mode(cmd.val) + else + log.debug(util.c(log_tag, "unrecognized container mode \"", cmd.val, "\"")) + end + else + log.debug(util.c(log_tag, "unrecognized in-queue data ", cmd.key)) + end + end + end + + -- max 100ms spent processing queue + if util.time() - time_now > 100 then + log.warning(log_tag .. "exceeded 100ms queue process limit") + break + end + end + + time_now = util.time() + + -- handle periodics + + if self.periodics.next_formed_req <= time_now then + _request_formed() + self.periodics.next_formed_req = time_now + PERIODICS.FORMED + end + + if self.db.formed then + if not self.has_build and self.periodics.next_build_req <= time_now then + _request_build() + self.periodics.next_build_req = time_now + PERIODICS.BUILD + end + + if self.periodics.next_state_req <= time_now then + _request_state() + self.periodics.next_state_req = time_now + PERIODICS.STATE + end + + if self.periodics.next_tanks_req <= time_now then + _request_tanks() + self.periodics.next_tanks_req = time_now + PERIODICS.TANKS + end + end + + self.session.post_update() + end + + -- invalidate build cache + function public.invalidate_cache() + self.periodics.next_formed_req = 0 + self.periodics.next_build_req = 0 + self.has_build = false + end + + -- get the unit session database + ---@nodiscard + function public.get_db() return self.db end + + return public +end + +return dynamicv diff --git a/supervisor/session/rtu/qtypes.lua b/supervisor/session/rtu/qtypes.lua index 92a927f..0dff62d 100644 --- a/supervisor/session/rtu/qtypes.lua +++ b/supervisor/session/rtu/qtypes.lua @@ -1,16 +1,31 @@ ---@class rtu_unit_qtypes local qtypes = {} +-- turbine valve rtu session commands local TBV_RTU_S_CMDS = { INC_DUMP_MODE = 1, DEC_DUMP_MODE = 2 } +-- turbine valve rtu session commands w/ parameters local TBV_RTU_S_DATA = { SET_DUMP_MODE = 1 } +-- dynamic tank valve rtu session commands +local DTV_RTU_S_CMDS = { + INC_CONT_MODE = 1, + DEC_CONT_MODE = 2 +} + +-- dynamic tank valve rtu session commands w/ parameters +local DTV_RTU_S_DATA = { + SET_CONT_MODE = 1 +} + qtypes.TBV_RTU_S_CMDS = TBV_RTU_S_CMDS qtypes.TBV_RTU_S_DATA = TBV_RTU_S_DATA +qtypes.DTV_RTU_S_CMDS = DTV_RTU_S_CMDS +qtypes.DTV_RTU_S_DATA = DTV_RTU_S_DATA return qtypes diff --git a/supervisor/startup.lua b/supervisor/startup.lua index ba71270..ce7beb6 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v0.19.4" +local SUPERVISOR_VERSION = "v0.20.0" local println = util.println local println_ts = util.println_ts diff --git a/supervisor/unit.lua b/supervisor/unit.lua index beaf495..2b1425c 100644 --- a/supervisor/unit.lua +++ b/supervisor/unit.lua @@ -11,12 +11,13 @@ local rsctl = require("supervisor.session.rsctl") ---@class reactor_control_unit local unit = {} -local WASTE_MODE = types.WASTE_MODE -local WASTE = types.WASTE_PRODUCT -local ALARM = types.ALARM -local PRIO = types.ALARM_PRIORITY -local ALARM_STATE = types.ALARM_STATE -local TRI_FAIL = types.TRI_FAIL +local WASTE_MODE = types.WASTE_MODE +local WASTE = types.WASTE_PRODUCT +local ALARM = types.ALARM +local PRIO = types.ALARM_PRIORITY +local ALARM_STATE = types.ALARM_STATE +local TRI_FAIL = types.TRI_FAIL +local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local PLC_S_CMDS = plc.PLC_S_CMDS @@ -69,10 +70,12 @@ function unit.new(reactor_id, num_boilers, num_turbines) num_turbines = num_turbines, types = { DT_KEYS = DT_KEYS, AISTATE = AISTATE }, -- rtus + rtu_list = {}, redstone = {}, boilers = {}, turbines = {}, - sna = {}, + tanks = {}, + snas = {}, envd = {}, sna_prod_rate = 0, -- redstone control @@ -230,6 +233,9 @@ function unit.new(reactor_id, num_boilers, num_turbines) } } + -- list for RTU session management + self.rtu_list = { self.redstone, self.boilers, self.turbines, self.tanks, self.snas, self.envd } + -- init redstone RTU I/O controller self.io_ctl = rsctl.new(self.redstone) @@ -373,12 +379,6 @@ function unit.new(reactor_id, num_boilers, num_turbines) --#endregion - -- unlink disconnected units - ---@param sessions table - local function _unlink_disconnected_units(sessions) - util.filter_table(sessions, function (u) return u.is_connected() end) - end - -- PUBLIC FUNCTIONS -- ---@class reactor_unit @@ -413,6 +413,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) -- link a turbine RTU session ---@param turbine unit_session + ---@return boolean linked turbine accepted to associated device slot function public.add_turbine(turbine) if #self.turbines < num_turbines and turbine.get_device_idx() <= num_turbines then table.insert(self.turbines, turbine) @@ -422,13 +423,12 @@ function unit.new(reactor_id, num_boilers, num_turbines) _reset_dt(DT_KEYS.TurbinePower .. turbine.get_device_idx()) return true - else - return false - end + else return false end end -- link a boiler RTU session ---@param boiler unit_session + ---@return boolean linked boiler accepted to associated device slot function public.add_boiler(boiler) if #self.boilers < num_boilers and boiler.get_device_idx() <= num_boilers then table.insert(self.boilers, boiler) @@ -440,31 +440,37 @@ function unit.new(reactor_id, num_boilers, num_turbines) _reset_dt(DT_KEYS.BoilerHCool .. boiler.get_device_idx()) return true - else - return false - end + else return false end + end + + -- link a dynamic tank RTU session + ---@param dynamic_tank unit_session + ---@return boolean linked dynamic tank accepted (max 1) + function public.add_tank(dynamic_tank) + if #self.tanks == 0 then + table.insert(self.tanks, dynamic_tank) + return true + else return false end end -- link a solar neutron activator RTU session ---@param sna unit_session - function public.add_sna(sna) - table.insert(self.sna, sna) - end + function public.add_sna(sna) table.insert(self.snas, sna) end -- link an environment detector RTU session ---@param envd unit_session + ---@return boolean linked environment detector accepted (max 1) function public.add_envd(envd) - table.insert(self.envd, envd) + if #self.envd == 0 then + table.insert(self.envd, envd) + return true + else return false end end -- purge devices associated with the given RTU session ID ---@param session integer RTU session ID function public.purge_rtu_devices(session) - util.filter_table(self.redstone, function (s) return s.get_session_id() ~= session end) - util.filter_table(self.boilers, function (s) return s.get_session_id() ~= session end) - util.filter_table(self.turbines, function (s) return s.get_session_id() ~= session end) - util.filter_table(self.sna, function (s) return s.get_session_id() ~= session end) - util.filter_table(self.envd, function (s) return s.get_session_id() ~= session end) + for _, v in pairs(self.rtu_list) do util.filter_table(v, function (s) return s.get_session_id() ~= session end) end end --#endregion @@ -482,11 +488,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) end -- unlink RTU unit sessions if they are closed - _unlink_disconnected_units(self.redstone) - _unlink_disconnected_units(self.boilers) - _unlink_disconnected_units(self.turbines) - _unlink_disconnected_units(self.sna) - _unlink_disconnected_units(self.envd) + for _, v in pairs(self.rtu_list) do util.filter_table(v, function (u) return u.is_connected() end) end -- update degraded state for auto control self.db.control.degraded = (#self.boilers ~= num_boilers) or (#self.turbines ~= num_turbines) or (self.plc_i == nil) @@ -717,21 +719,25 @@ function unit.new(reactor_id, num_boilers, num_turbines) return false end - -- get build properties of all machines + -- get build properties of machines + -- + -- filter options + -- - nil to include all builds + -- - -1 to include only PLC build + -- - RTU_UNIT_TYPE to include all builds of machines of that type ---@nodiscard - ---@param inc_plc boolean? true/nil to include PLC build, false to exclude - ---@param inc_boilers boolean? true/nil to include boiler builds, false to exclude - ---@param inc_turbines boolean? true/nil to include turbine builds, false to exclude - function public.get_build(inc_plc, inc_boilers, inc_turbines) + ---@param filter -1|RTU_UNIT_TYPE? filter as described above + function public.get_build(filter) + local all = filter == nil local build = {} - if inc_plc ~= false then + if all or (filter == -1) then if self.plc_i ~= nil then build.reactor = self.plc_i.get_struct() end end - if inc_boilers ~= false then + if all or (filter == RTU_UNIT_TYPE.BOILER_VALVE) then build.boilers = {} for i = 1, #self.boilers do local boiler = self.boilers[i] ---@type unit_session @@ -739,7 +745,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) end end - if inc_turbines ~= false then + if all or (filter == RTU_UNIT_TYPE.TURBINE_VALVE) then build.turbines = {} for i = 1, #self.turbines do local turbine = self.turbines[i] ---@type unit_session @@ -747,6 +753,14 @@ function unit.new(reactor_id, num_boilers, num_turbines) end end + if all or (filter == RTU_UNIT_TYPE.DYNAMIC_VALVE) then + build.tanks = {} + for i = 1, #self.tanks do + local tank = self.tanks[i] ---@type unit_session + build.tanks[tank.get_device_idx()] = { tank.get_db().formed, tank.get_db().build } + end + end + return build end @@ -777,38 +791,35 @@ function unit.new(reactor_id, num_boilers, num_turbines) -- status of boilers (including tanks) status.boilers = {} for i = 1, #self.boilers do - local boiler = self.boilers[i] ---@type unit_session - status.boilers[boiler.get_device_idx()] = { - boiler.is_faulted(), - boiler.get_db().formed, - boiler.get_db().state, - boiler.get_db().tanks - } + local boiler = self.boilers[i] ---@type unit_session + local db = boiler.get_db() ---@type boilerv_session_db + status.boilers[boiler.get_device_idx()] = { boiler.is_faulted(), db.formed, db.state, db.tanks } end -- status of turbines (including tanks) status.turbines = {} for i = 1, #self.turbines do local turbine = self.turbines[i] ---@type unit_session - status.turbines[turbine.get_device_idx()] = { - turbine.is_faulted(), - turbine.get_db().formed, - turbine.get_db().state, - turbine.get_db().tanks - } + local db = turbine.get_db() ---@type turbinev_session_db + status.turbines[turbine.get_device_idx()] = { turbine.is_faulted(), db.formed, db.state, db.tanks } end - -- basic SNA statistical information, don't send everything, it's not necessary - status.sna = { #self.sna, public.get_sna_rate() } + -- status of dynamic tanks + status.tanks = {} + for i = 1, #self.tanks do + local tank = self.tanks[i] ---@type unit_session + local db = tank.get_db() ---@type dynamicv_session_db + status.turbines[tank.get_device_idx()] = { tank.is_faulted(), db.formed, db.state, db.tanks } + end + + -- basic SNA statistical information + status.sna = { #self.snas, public.get_sna_rate() } -- radiation monitors (environment detectors) status.rad_mon = {} for i = 1, #self.envd do - local envd = self.envd[i] ---@type unit_session - status.rad_mon[envd.get_device_idx()] = { - envd.is_faulted(), - envd.get_db().radiation - } + local envd = self.envd[i] ---@type unit_session + status.rad_mon[envd.get_device_idx()] = { envd.is_faulted(), envd.get_db().radiation } end return status @@ -820,8 +831,8 @@ function unit.new(reactor_id, num_boilers, num_turbines) function public.get_sna_rate() local total_avail_rate = 0 - for i = 1, #self.sna do - local db = self.sna[i].get_db() ---@type sna_session_db + for i = 1, #self.snas do + local db = self.snas[i].get_db() ---@type sna_session_db total_avail_rate = total_avail_rate + db.state.production_rate end From cff7c724beb1555db761c3e63ae4f5adeb210ea9 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 15 Jul 2023 13:31:48 -0400 Subject: [PATCH 26/34] #272 fixed bug with transmitting unit dynamic tank table --- supervisor/startup.lua | 2 +- supervisor/unit.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/supervisor/startup.lua b/supervisor/startup.lua index ce7beb6..5385ee6 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v0.20.0" +local SUPERVISOR_VERSION = "v0.20.1" local println = util.println local println_ts = util.println_ts diff --git a/supervisor/unit.lua b/supervisor/unit.lua index 2b1425c..c233631 100644 --- a/supervisor/unit.lua +++ b/supervisor/unit.lua @@ -809,7 +809,7 @@ function unit.new(reactor_id, num_boilers, num_turbines) for i = 1, #self.tanks do local tank = self.tanks[i] ---@type unit_session local db = tank.get_db() ---@type dynamicv_session_db - status.turbines[tank.get_device_idx()] = { tank.is_faulted(), db.formed, db.state, db.tanks } + status.tanks[tank.get_device_idx()] = { tank.is_faulted(), db.formed, db.state, db.tanks } end -- basic SNA statistical information From 6a0992c7a4cb864e09992c75f5bd9a0078fa3faf Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 15 Jul 2023 13:33:18 -0400 Subject: [PATCH 27/34] removed unused variable --- supervisor/session/coordinator.lua | 3 --- supervisor/startup.lua | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/supervisor/session/coordinator.lua b/supervisor/session/coordinator.lua index e6ddc20..98b7431 100644 --- a/supervisor/session/coordinator.lua +++ b/supervisor/session/coordinator.lua @@ -1,7 +1,6 @@ local comms = require("scada-common.comms") local log = require("scada-common.log") local mqueue = require("scada-common.mqueue") -local types = require("scada-common.types") local util = require("scada-common.util") local databus = require("supervisor.databus") @@ -16,8 +15,6 @@ local SCADA_CRDN_TYPE = comms.SCADA_CRDN_TYPE local UNIT_COMMAND = comms.UNIT_COMMAND local FAC_COMMAND = comms.FAC_COMMAND -local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE - local SV_Q_DATA = svqtypes.SV_Q_DATA -- retry time constants in ms diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 5385ee6..e9e82c9 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -21,7 +21,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v0.20.1" +local SUPERVISOR_VERSION = "v0.20.2" local println = util.println local println_ts = util.println_ts From e1b4d72ef82a617e33eeac846de32d90e0c47e89 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 15 Jul 2023 13:33:51 -0400 Subject: [PATCH 28/34] updated legacy install manifest --- install_manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install_manifest.json b/install_manifest.json index e0db13b..c16c871 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.0", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335422, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file From 2a541ef3fe88280a125a58223668257b0c765088 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 16 Jul 2023 19:42:20 -0400 Subject: [PATCH 29/34] #274 cleanup functionality added to installer --- ccmsi.lua | 154 ++++++++++++++++++++++++++++++------------ install_manifest.json | 2 +- 2 files changed, 112 insertions(+), 44 deletions(-) diff --git a/ccmsi.lua b/ccmsi.lua index 6d5e7e8..1405134 100644 --- a/ccmsi.lua +++ b/ccmsi.lua @@ -20,7 +20,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. local function println(message) print(tostring(message)) end local function print(message) term.write(tostring(message)) end -local CCMSI_VERSION = "v1.5a" +local CCMSI_VERSION = "v1.6" local install_dir = "/.install-cache" local manifest_path = "https://mikaylafischler.github.io/cc-mek-scada/manifests/" @@ -56,13 +56,13 @@ local function ask_y_n(question, default) end -- print out a white + blue text message -local function pkg_message(message, package) white(); print(message .. " "); blue(); println(package); white() end +local function pkg_message(message, package) white();print(message .. " ");blue();println(package);white() end -- indicate actions to be taken based on package differences for installs/updates local function show_pkg_change(name, v_local, v_remote) if v_local ~= nil then if v_local ~= v_remote then - print("[" .. name .. "] updating "); blue(); print(v_local); white(); print(" \xbb "); blue(); println(v_remote); white() + print("[" .. name .. "] updating ");blue();print(v_local);white();print(" \xbb ");blue();println(v_remote);white() elseif mode == "install" then pkg_message("[" .. name .. "] reinstalling", v_local) end @@ -87,15 +87,13 @@ end local function get_remote_manifest() local response, error = http.get(install_manifest) if response == nil then - orange(); println("failed to get installation manifest from GitHub, cannot update or install") - red(); println("HTTP error: " .. error); white() + orange();println("failed to get installation manifest from GitHub, cannot update or install") + red();println("HTTP error: " .. error);white() return false, {} end local ok, manifest = pcall(function () return textutils.unserializeJSON(response.readAll()) end) - if not ok then - red(); println("error parsing remote installation manifest"); white() - end + if not ok then red();println("error parsing remote installation manifest");white() end return ok, manifest end @@ -107,7 +105,7 @@ local function write_install_manifest(manifest, dependencies) local is_dependency = false for _, dependency in pairs(dependencies) do if (key == "bootloader" and dependency == "system") or key == dependency then - is_dependency = true; break + is_dependency = true;break end end if key == app or key == "comms" or is_dependency then versions[key] = value end @@ -120,6 +118,73 @@ local function write_install_manifest(manifest, dependencies) imfile.close() end +-- recursively build a tree out of the file manifest +local function gen_tree(manifest) + local function _tree_add(tree, split) + if #split > 1 then + local name = table.remove(split, 1) + if tree[name] == nil then tree[name] = {} end + table.insert(tree[name], _tree_add(tree[name], split)) + else return split[1] end + return nil + end + + local list, tree = {}, {} + + -- make a list of each and every file + for _, files in pairs(manifest.files) do for i = 1, #files do table.insert(list, files[i]) end end + + for i = 1, #list do + local split = {} + string.gsub(list[i], "([^/]+)", function(c) split[#split + 1] = c end) + if #split == 1 then table.insert(tree, list[i]) + else table.insert(tree, _tree_add(tree, split)) end + end + + return tree +end + +local function _in_array(val, array) + for _, v in pairs(array) do if v == val then return true end end + return false +end + +local function _clean_dir(dir, tree) + local ls = fs.list(dir) + for _, val in pairs(ls) do + local path = dir.."/"..val + if fs.isDir(path) then + _clean_dir(path, tree[val]) + if #fs.list(path) == 0 then + fs.delete(path);red();println("deleted dir " .. path);white() + end + elseif not _in_array(val, tree) then + fs.delete(val) + red();println("deleted " .. path);white() + end + end +end + +-- go through app/common directories to delete unused files +local function clean(manifest) + local root_ext = false + local tree = gen_tree(manifest) + table.insert(tree, "install_manifest.json") + table.insert(tree, "ccmsi.lua") + table.insert(tree, "log.txt") + local ls = fs.list("/") + for _, val in pairs(ls) do + if fs.isDir(val) then + if tree[val] ~= nil then _clean_dir("/" .. val, tree[val]) end + if #fs.list(val) == 0 then fs.delete(val) end + elseif not _in_array(val, tree) then + root_ext = true + yellow();println(val .. " not used");white() + end + end + if root_ext then println("Files in root directory won't be automatically deleted.") end +end + -- get and validate command line options println("-- CC Mekanism SCADA Installer " .. CCMSI_VERSION .. " --") @@ -136,33 +201,33 @@ if #opts == 0 or opts[1] == "help" then println(" update - update files EXCEPT for config/logs") println(" remove - delete files EXCEPT for config/logs") println(" purge - delete files INCLUDING config/logs") - white(); println(""); lgray() + white();println("");lgray() println(" reactor-plc - reactor PLC firmware") println(" rtu - RTU firmware") println(" supervisor - supervisor server application") println(" coordinator - coordinator application") println(" pocket - pocket application") - white(); println(""); yellow() + white();println("");yellow() println(" second parameter when used with check") - lgray(); println(" main (default) | latest | devel"); white() + lgray();println(" main (default) | latest | devel");white() return else mode = get_opt(opts[1], { "check", "install", "update", "remove", "purge" }) if mode == nil then - red(); println("Unrecognized mode."); white() + red();println("Unrecognized mode.");white() return end app = get_opt(opts[2], { "reactor-plc", "rtu", "supervisor", "coordinator", "pocket" }) if app == nil and mode ~= "check" then - red(); println("Unrecognized application."); white() + red();println("Unrecognized application.");white() return end -- determine target if mode == "check" then target = opts[2] else target = opts[3] end if (target ~= "main") and (target ~= "latest") and (target ~= "devel") then - if (target and target ~= "") then yellow(); println("Unknown target, defaulting to 'main'"); white() end + if (target and target ~= "") then yellow();println("Unknown target, defaulting to 'main'");white() end target = "main" end @@ -179,7 +244,7 @@ if mode == "check" then local local_ok, local_manifest = read_local_manifest() if not local_ok then - yellow(); println("failed to load local installation information"); white() + yellow();println("failed to load local installation information");white() local_manifest = { versions = { installer = CCMSI_VERSION } } else local_manifest.versions.installer = CCMSI_VERSION @@ -190,16 +255,16 @@ if mode == "check" then term.setTextColor(colors.purple) print(string.format("%-14s", "[" .. key .. "]")) if key == "installer" or (local_ok and (local_manifest.versions[key] ~= nil)) then - blue(); print(local_manifest.versions[key]) + blue();print(local_manifest.versions[key]) if value ~= local_manifest.versions[key] then - white(); print(" (") + white();print(" (") term.setTextColor(colors.cyan) - print(value); white(); println(" available)") - else green(); println(" (up to date)") end + print(value);white();println(" available)") + else green();println(" (up to date)") end else - lgray(); print("not installed"); white(); print(" (latest ") + lgray();print("not installed");white();print(" (latest ") term.setTextColor(colors.cyan) - print(value); white(); println(")") + print(value);white();println(")") end end elseif mode == "install" or mode == "update" then @@ -218,7 +283,7 @@ elseif mode == "install" or mode == "update" then local local_ok, local_manifest = read_local_manifest() if not local_ok then if mode == "update" then - red(); println("failed to load local installation information, cannot update"); white() + red();println("failed to load local installation information, cannot update");white() return end else @@ -229,13 +294,13 @@ elseif mode == "install" or mode == "update" then ver.lockbox.v_local = local_manifest.versions.lockbox if local_manifest.versions[app] == nil then - red(); println("another application is already installed, please purge it before installing a new application"); white() + red();println("another application is already installed, please purge it before installing a new application");white() return end local_manifest.versions.installer = CCMSI_VERSION if manifest.versions.installer ~= CCMSI_VERSION then - yellow(); println("a newer version of the installer is available, it is recommended to download it"); white() + yellow();println("a newer version of the installer is available, it is recommended to download it");white() end end @@ -265,7 +330,7 @@ elseif mode == "install" or mode == "update" then show_pkg_change("comms", ver.comms.v_local, ver.comms.v_remote) ver.comms.changed = ver.comms.v_local ~= ver.comms.v_remote if ver.comms.changed and ver.comms.v_local ~= nil then - print("[comms] "); yellow(); println("other devices on the network will require an update"); white() + print("[comms] ");yellow();println("other devices on the network will require an update");white() end -- display graphics version change information @@ -302,7 +367,7 @@ elseif mode == "install" or mode == "update" then -- check space constraints if space_available < space_required then single_file_mode = true - yellow(); println("WARNING: Insufficient space available for a full download!"); white() + yellow();println("WARNING: Insufficient space available for a full download!");white() println("Files can be downloaded one by one, so if you are replacing a current install this will not be a problem unless installation fails.") if mode == "update" then println("If installation still fails, delete this device's log file or uninstall the app (not purge) and try again.") end if not ask_y_n("Do you wish to continue?", false) then @@ -343,7 +408,7 @@ elseif mode == "install" or mode == "update" then local dl, err = http.get(repo_path .. file) if dl == nil then - red(); println("GET HTTP Error " .. err) + red();println("GET HTTP Error " .. err) success = false break else @@ -384,10 +449,12 @@ elseif mode == "install" or mode == "update" then if mode == "install" then println("Installation completed successfully.") else println("Update completed successfully.") end + println("Ready to clean up unused files, press enter to continue...") + read();clean(manifest) else if mode == "install" then - red(); println("Installation failed.") - else orange(); println("Update failed, existing files unmodified.") end + red();println("Installation failed.") + else orange();println("Update failed, existing files unmodified.") end end else -- go through all files and replace one by one @@ -405,7 +472,7 @@ elseif mode == "install" or mode == "update" then local dl, err = http.get(repo_path .. file) if dl == nil then - red(); println("GET HTTP Error " .. err) + red();println("GET HTTP Error " .. err) success = false break else @@ -424,6 +491,8 @@ elseif mode == "install" or mode == "update" then if mode == "install" then println("Installation completed successfully.") else println("Update completed successfully.") end + println("Ready to clean up unused files, press enter to continue...") + read();clean(manifest) else red() if mode == "install" then @@ -434,10 +503,10 @@ elseif mode == "install" or mode == "update" then elseif mode == "remove" or mode == "purge" then local ok, manifest = read_local_manifest() if not ok then - red(); println("Error parsing local installation manifest."); white() + red();println("Error parsing local installation manifest.");white() return elseif mode == "remove" and manifest.versions[app] == nil then - red(); println(app .. " is not installed, cannot remove."); white() + red();println(app .. " is not installed, cannot remove.");white() return end @@ -451,6 +520,9 @@ elseif mode == "remove" or mode == "purge" then -- ask for confirmation if not ask_y_n("Continue?", false) then return end + -- delete unused files first + clean(manifest) + local file_list = manifest.files local dependencies = manifest.depends[app] local config_file = app .. "/config.lua" @@ -469,9 +541,9 @@ elseif mode == "remove" or mode == "purge" then end) if not log_deleted then - red(); println("failed to delete log file") - white(); println("press enter to continue...") - read(); lgray() + red();println("failed to delete log file") + white();println("press enter to continue...") + read();lgray() end end @@ -480,10 +552,7 @@ elseif mode == "remove" or mode == "purge" then local files = file_list[dependency] for _, file in pairs(files) do if mode == "purge" or file ~= config_file then - if fs.exists(file) then - fs.delete(file) - println("deleted " .. file) - end + if fs.exists(file) then fs.delete(file);println("deleted " .. file) end end end @@ -508,8 +577,7 @@ elseif mode == "remove" or mode == "purge" then end if folder ~= app and fs.isDir(folder) then - fs.delete(folder) - println("deleted app subdirectory " .. folder) + fs.delete(folder);println("deleted app subdirectory " .. folder) end end end @@ -527,7 +595,7 @@ elseif mode == "remove" or mode == "purge" then imfile.close() end - green(); println("Done!") + green();println("Done!") end white() diff --git a/install_manifest.json b/install_manifest.json index c16c871..3d1ce41 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.5a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.6", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5788, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file From 5529774b0e466fe71e00598f62b0e0e57d222782 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 16 Jul 2023 20:53:39 -0400 Subject: [PATCH 30/34] changed installer press enter to continue to any key, fixed some text colors --- ccmsi.lua | 24 +++++++++++++++--------- install_manifest.json | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ccmsi.lua b/ccmsi.lua index 1405134..2045bef 100644 --- a/ccmsi.lua +++ b/ccmsi.lua @@ -20,7 +20,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. local function println(message) print(tostring(message)) end local function print(message) term.write(tostring(message)) end -local CCMSI_VERSION = "v1.6" +local CCMSI_VERSION = "v1.7" local install_dir = "/.install-cache" local manifest_path = "https://mikaylafischler.github.io/cc-mek-scada/manifests/" @@ -55,6 +55,10 @@ local function ask_y_n(question, default) else return nil end end +-- wait for any key to be pressed +---@diagnostic disable-next-line: undefined-field +local function any_key() os.pullEvent("key") end + -- print out a white + blue text message local function pkg_message(message, package) white();print(message .. " ");blue();println(package);white() end @@ -156,11 +160,11 @@ local function _clean_dir(dir, tree) if fs.isDir(path) then _clean_dir(path, tree[val]) if #fs.list(path) == 0 then - fs.delete(path);red();println("deleted dir " .. path);white() + fs.delete(path);lgray();println("deleted dir " .. path);white() end elseif not _in_array(val, tree) then fs.delete(val) - red();println("deleted " .. path);white() + lgray();println("deleted " .. path);white() end end end @@ -449,8 +453,9 @@ elseif mode == "install" or mode == "update" then if mode == "install" then println("Installation completed successfully.") else println("Update completed successfully.") end - println("Ready to clean up unused files, press enter to continue...") - read();clean(manifest) + white();println("Ready to clean up unused files, press any key to continue...") + any_key();clean(manifest) + white();println("Done.") else if mode == "install" then red();println("Installation failed.") @@ -491,8 +496,9 @@ elseif mode == "install" or mode == "update" then if mode == "install" then println("Installation completed successfully.") else println("Update completed successfully.") end - println("Ready to clean up unused files, press enter to continue...") - read();clean(manifest) + white();println("Ready to clean up unused files, press any key to continue...") + any_key();clean(manifest) + white();println("Done.") else red() if mode == "install" then @@ -542,8 +548,8 @@ elseif mode == "remove" or mode == "purge" then if not log_deleted then red();println("failed to delete log file") - white();println("press enter to continue...") - read();lgray() + white();println("press any key to continue...") + any_key();lgray() end end diff --git a/install_manifest.json b/install_manifest.json index 3d1ce41..6e30ff9 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.6", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5788, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.7", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5788, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file From 4d9783beca128ed57a28b0611e5144b6e306d872 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 16 Jul 2023 20:58:34 -0400 Subject: [PATCH 31/34] fixed installer clean bug --- ccmsi.lua | 3 ++- install_manifest.json | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/ccmsi.lua b/ccmsi.lua index 2045bef..b5970e6 100644 --- a/ccmsi.lua +++ b/ccmsi.lua @@ -20,7 +20,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. local function println(message) print(tostring(message)) end local function print(message) term.write(tostring(message)) end -local CCMSI_VERSION = "v1.7" +local CCMSI_VERSION = "v1.7a" local install_dir = "/.install-cache" local manifest_path = "https://mikaylafischler.github.io/cc-mek-scada/manifests/" @@ -154,6 +154,7 @@ local function _in_array(val, array) end local function _clean_dir(dir, tree) + if tree == nil then tree = {} end local ls = fs.list(dir) for _, val in pairs(ls) do local path = dir.."/"..val diff --git a/install_manifest.json b/install_manifest.json index 6e30ff9..46256b0 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.7", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5788, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.7a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file From b54f15bad6543f9233c1c1b74473a3b19c569d41 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 16 Jul 2023 21:07:37 -0400 Subject: [PATCH 32/34] #274 bugfixes and optimizations --- ccmsi.lua | 24 ++++++++++++++---------- install_manifest.json | 2 +- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/ccmsi.lua b/ccmsi.lua index b5970e6..afdb077 100644 --- a/ccmsi.lua +++ b/ccmsi.lua @@ -20,7 +20,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. local function println(message) print(tostring(message)) end local function print(message) term.write(tostring(message)) end -local CCMSI_VERSION = "v1.7a" +local CCMSI_VERSION = "v1.7b" local install_dir = "/.install-cache" local manifest_path = "https://mikaylafischler.github.io/cc-mek-scada/manifests/" @@ -57,7 +57,7 @@ end -- wait for any key to be pressed ---@diagnostic disable-next-line: undefined-field -local function any_key() os.pullEvent("key") end +local function any_key() os.pullEvent("key_up") end -- print out a white + blue text message local function pkg_message(message, package) white();print(message .. " ");blue();println(package);white() end @@ -157,15 +157,13 @@ local function _clean_dir(dir, tree) if tree == nil then tree = {} end local ls = fs.list(dir) for _, val in pairs(ls) do - local path = dir.."/"..val + local path = dir .. "/" .. val if fs.isDir(path) then _clean_dir(path, tree[val]) - if #fs.list(path) == 0 then - fs.delete(path);lgray();println("deleted dir " .. path);white() - end + if #fs.list(path) == 0 then fs.delete(path);println("deleted dir " .. path) end elseif not _in_array(val, tree) then - fs.delete(val) - lgray();println("deleted " .. path);white() + fs.delete(path) + println("deleted " .. path) end end end @@ -174,19 +172,25 @@ end local function clean(manifest) local root_ext = false local tree = gen_tree(manifest) + table.insert(tree, "install_manifest.json") table.insert(tree, "ccmsi.lua") table.insert(tree, "log.txt") + + lgray() + local ls = fs.list("/") for _, val in pairs(ls) do if fs.isDir(val) then if tree[val] ~= nil then _clean_dir("/" .. val, tree[val]) end - if #fs.list(val) == 0 then fs.delete(val) end + if #fs.list(val) == 0 then fs.delete(val);println("deleted dir " .. val) end elseif not _in_array(val, tree) then root_ext = true - yellow();println(val .. " not used");white() + yellow();println(val .. " not used") end end + + white() if root_ext then println("Files in root directory won't be automatically deleted.") end end diff --git a/install_manifest.json b/install_manifest.json index 46256b0..31062fb 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.7a", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.7b", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file From 353cb3622bbdf8fb4e488e6f37bbdad52d1f65a8 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 16 Jul 2023 21:11:27 -0400 Subject: [PATCH 33/34] improved installer any key detection --- ccmsi.lua | 8 ++++---- install_manifest.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ccmsi.lua b/ccmsi.lua index afdb077..27611ab 100644 --- a/ccmsi.lua +++ b/ccmsi.lua @@ -20,7 +20,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. local function println(message) print(tostring(message)) end local function print(message) term.write(tostring(message)) end -local CCMSI_VERSION = "v1.7b" +local CCMSI_VERSION = "v1.7c" local install_dir = "/.install-cache" local manifest_path = "https://mikaylafischler.github.io/cc-mek-scada/manifests/" @@ -57,7 +57,7 @@ end -- wait for any key to be pressed ---@diagnostic disable-next-line: undefined-field -local function any_key() os.pullEvent("key_up") end +local function any_key() os.pullEvent("key");os.pullEvent("key_up") end -- print out a white + blue text message local function pkg_message(message, package) white();print(message .. " ");blue();println(package);white() end @@ -160,7 +160,7 @@ local function _clean_dir(dir, tree) local path = dir .. "/" .. val if fs.isDir(path) then _clean_dir(path, tree[val]) - if #fs.list(path) == 0 then fs.delete(path);println("deleted dir " .. path) end + if #fs.list(path) == 0 then fs.delete(path);println("deleted " .. path) end elseif not _in_array(val, tree) then fs.delete(path) println("deleted " .. path) @@ -183,7 +183,7 @@ local function clean(manifest) for _, val in pairs(ls) do if fs.isDir(val) then if tree[val] ~= nil then _clean_dir("/" .. val, tree[val]) end - if #fs.list(val) == 0 then fs.delete(val);println("deleted dir " .. val) end + if #fs.list(val) == 0 then fs.delete(val);println("deleted " .. val) end elseif not _in_array(val, tree) then root_ext = true yellow();println(val .. " not used") diff --git a/install_manifest.json b/install_manifest.json index 31062fb..20cf443 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.7b", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.7c", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file From c544d140bf9a61d63ef43d0e0d02c66788058fa3 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sun, 16 Jul 2023 21:21:33 -0400 Subject: [PATCH 34/34] installer key handling improvements --- ccmsi.lua | 16 ++++++++-------- install_manifest.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ccmsi.lua b/ccmsi.lua index 27611ab..36a74c5 100644 --- a/ccmsi.lua +++ b/ccmsi.lua @@ -20,7 +20,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. local function println(message) print(tostring(message)) end local function print(message) term.write(tostring(message)) end -local CCMSI_VERSION = "v1.7c" +local CCMSI_VERSION = "v1.7d" local install_dir = "/.install-cache" local manifest_path = "https://mikaylafischler.github.io/cc-mek-scada/manifests/" @@ -44,21 +44,21 @@ local function get_opt(opt, options) return nil end +-- wait for any key to be pressed +---@diagnostic disable-next-line: undefined-field +local function any_key() os.pullEvent("key_up") end + -- ask the user yes or no local function ask_y_n(question, default) print(question) if default == true then print(" (Y/n)? ") else print(" (y/N)? ") end - local response = read() + local response = read();any_key() if response == "" then return default elseif response == "Y" or response == "y" then return true elseif response == "N" or response == "n" then return false else return nil end end --- wait for any key to be pressed ----@diagnostic disable-next-line: undefined-field -local function any_key() os.pullEvent("key");os.pullEvent("key_up") end - -- print out a white + blue text message local function pkg_message(message, package) white();print(message .. " ");blue();println(package);white() end @@ -351,7 +351,7 @@ elseif mode == "install" or mode == "update" then ver.lockbox.changed = ver.lockbox.v_local ~= ver.lockbox.v_remote -- ask for confirmation - if not ask_y_n("Continue?", false) then return end + if not ask_y_n("Continue", false) then return end -------------------------- -- START INSTALL/UPDATE -- @@ -529,7 +529,7 @@ elseif mode == "remove" or mode == "purge" then end -- ask for confirmation - if not ask_y_n("Continue?", false) then return end + if not ask_y_n("Continue", false) then return end -- delete unused files first clean(manifest) diff --git a/install_manifest.json b/install_manifest.json index 20cf443..97287cc 100644 --- a/install_manifest.json +++ b/install_manifest.json @@ -1 +1 @@ -{"versions": {"installer": "v1.7c", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file +{"versions": {"installer": "v1.7d", "bootloader": "0.2", "comms": "2.1.2", "graphics": "1.0.1", "lockbox": "1.0", "reactor-plc": "v1.5.5", "rtu": "v1.5.4", "supervisor": "v0.20.2", "coordinator": "v0.21.0", "pocket": "alpha-v0.5.2"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/ppm.lua", "scada-common/comms.lua", "scada-common/psil.lua", "scada-common/rsio.lua", "scada-common/constants.lua", "scada-common/mqueue.lua", "scada-common/tcd.lua", "scada-common/crash.lua", "scada-common/log.lua", "scada-common/types.lua", "scada-common/util.lua", "scada-common/network.lua"], "graphics": ["graphics/element.lua", "graphics/events.lua", "graphics/flasher.lua", "graphics/core.lua", "graphics/elements/listbox.lua", "graphics/elements/textbox.lua", "graphics/elements/displaybox.lua", "graphics/elements/pipenet.lua", "graphics/elements/rectangle.lua", "graphics/elements/div.lua", "graphics/elements/multipane.lua", "graphics/elements/tiling.lua", "graphics/elements/colormap.lua", "graphics/elements/indicators/alight.lua", "graphics/elements/indicators/icon.lua", "graphics/elements/indicators/power.lua", "graphics/elements/indicators/rad.lua", "graphics/elements/indicators/state.lua", "graphics/elements/indicators/light.lua", "graphics/elements/indicators/vbar.lua", "graphics/elements/indicators/led.lua", "graphics/elements/indicators/coremap.lua", "graphics/elements/indicators/data.lua", "graphics/elements/indicators/ledpair.lua", "graphics/elements/indicators/hbar.lua", "graphics/elements/indicators/trilight.lua", "graphics/elements/indicators/ledrgb.lua", "graphics/elements/controls/switch_button.lua", "graphics/elements/controls/spinbox_numeric.lua", "graphics/elements/controls/hazard_button.lua", "graphics/elements/controls/push_button.lua", "graphics/elements/controls/radio_button.lua", "graphics/elements/controls/multi_button.lua", "graphics/elements/controls/tabbar.lua", "graphics/elements/controls/checkbox.lua", "graphics/elements/controls/sidebar.lua", "graphics/elements/animations/waiting.lua"], "lockbox": ["lockbox/init.lua", "lockbox/LICENSE", "lockbox/kdf/pbkdf2.lua", "lockbox/util/bit.lua", "lockbox/util/array.lua", "lockbox/util/stream.lua", "lockbox/util/queue.lua", "lockbox/digest/sha2_224.lua", "lockbox/digest/sha1.lua", "lockbox/digest/sha2_256.lua", "lockbox/digest/md5.lua", "lockbox/mac/hmac.lua"], "reactor-plc": ["reactor-plc/renderer.lua", "reactor-plc/threads.lua", "reactor-plc/databus.lua", "reactor-plc/plc.lua", "reactor-plc/config.lua", "reactor-plc/startup.lua", "reactor-plc/panel/front_panel.lua", "reactor-plc/panel/style.lua"], "rtu": ["rtu/renderer.lua", "rtu/threads.lua", "rtu/rtu.lua", "rtu/databus.lua", "rtu/modbus.lua", "rtu/config.lua", "rtu/startup.lua", "rtu/panel/front_panel.lua", "rtu/panel/style.lua", "rtu/dev/sps_rtu.lua", "rtu/dev/envd_rtu.lua", "rtu/dev/boilerv_rtu.lua", "rtu/dev/redstone_rtu.lua", "rtu/dev/sna_rtu.lua", "rtu/dev/imatrix_rtu.lua", "rtu/dev/dynamicv_rtu.lua", "rtu/dev/turbinev_rtu.lua"], "supervisor": ["supervisor/renderer.lua", "supervisor/databus.lua", "supervisor/supervisor.lua", "supervisor/unit.lua", "supervisor/config.lua", "supervisor/startup.lua", "supervisor/unitlogic.lua", "supervisor/facility.lua", "supervisor/panel/pgi.lua", "supervisor/panel/front_panel.lua", "supervisor/panel/style.lua", "supervisor/panel/components/rtu_entry.lua", "supervisor/panel/components/pdg_entry.lua", "supervisor/session/coordinator.lua", "supervisor/session/svqtypes.lua", "supervisor/session/pocket.lua", "supervisor/session/svsessions.lua", "supervisor/session/rtu.lua", "supervisor/session/plc.lua", "supervisor/session/rsctl.lua", "supervisor/session/rtu/boilerv.lua", "supervisor/session/rtu/dynamicv.lua", "supervisor/session/rtu/txnctrl.lua", "supervisor/session/rtu/unit_session.lua", "supervisor/session/rtu/turbinev.lua", "supervisor/session/rtu/envd.lua", "supervisor/session/rtu/imatrix.lua", "supervisor/session/rtu/sps.lua", "supervisor/session/rtu/qtypes.lua", "supervisor/session/rtu/sna.lua", "supervisor/session/rtu/redstone.lua"], "coordinator": ["coordinator/coordinator.lua", "coordinator/renderer.lua", "coordinator/iocontrol.lua", "coordinator/sounder.lua", "coordinator/config.lua", "coordinator/startup.lua", "coordinator/process.lua", "coordinator/ui/dialog.lua", "coordinator/ui/pgi.lua", "coordinator/ui/style.lua", "coordinator/ui/layout/main_view.lua", "coordinator/ui/layout/unit_view.lua", "coordinator/ui/layout/front_panel.lua", "coordinator/ui/components/reactor.lua", "coordinator/ui/components/pkt_entry.lua", "coordinator/ui/components/process_ctl.lua", "coordinator/ui/components/unit_overview.lua", "coordinator/ui/components/boiler.lua", "coordinator/ui/components/unit_detail.lua", "coordinator/ui/components/imatrix.lua", "coordinator/ui/components/turbine.lua", "coordinator/session/pocket.lua", "coordinator/session/apisessions.lua"], "pocket": ["pocket/pocket.lua", "pocket/renderer.lua", "pocket/config.lua", "pocket/coreio.lua", "pocket/startup.lua", "pocket/ui/main.lua", "pocket/ui/style.lua", "pocket/ui/components/conn_waiting.lua", "pocket/ui/pages/turbine_page.lua", "pocket/ui/pages/reactor_page.lua", "pocket/ui/pages/home_page.lua", "pocket/ui/pages/unit_page.lua", "pocket/ui/pages/boiler_page.lua"]}, "depends": {"reactor-plc": ["system", "common", "graphics", "lockbox"], "rtu": ["system", "common", "graphics", "lockbox"], "supervisor": ["system", "common", "graphics", "lockbox"], "coordinator": ["system", "common", "graphics", "lockbox"], "pocket": ["system", "common", "graphics", "lockbox"]}, "sizes": {"manifest": 5789, "system": 1991, "common": 98474, "graphics": 147714, "lockbox": 34900, "reactor-plc": 95833, "rtu": 105477, "supervisor": 335329, "coordinator": 231949, "pocket": 37639}} \ No newline at end of file