Merge branch 'devel' into pocket-alpha-dev

This commit is contained in:
Mikayla Fischler
2024-11-09 12:56:36 -05:00
21 changed files with 232 additions and 164 deletions

View File

@@ -28,7 +28,10 @@ def minify(path: str):
contents = f.read() contents = f.read()
f.close() f.close()
if re.search(r'--+\[(?!\[@as)+', contents) != None: # remove --[[@as type]] hints before anything, since it would detect as multiline comments
contents = re.sub(r' --+\[.+]]', '', contents)
if re.search(r'--+\[+', contents) != None:
# absolutely not dealing with lua multiline comments # absolutely not dealing with lua multiline comments
# - there are more important things to do # - there are more important things to do
# - this minification is intended to be 100% safe, so working with multiline comments is asking for trouble # - this minification is intended to be 100% safe, so working with multiline comments is asking for trouble

152
ccmsi.lua
View File

@@ -15,7 +15,7 @@ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
]]-- ]]--
local CCMSI_VERSION = "v1.19" local CCMSI_VERSION = "v1.19b"
local install_dir = "/.install-cache" local install_dir = "/.install-cache"
local manifest_path = "https://mikaylafischler.github.io/cc-mek-scada/manifests/" local manifest_path = "https://mikaylafischler.github.io/cc-mek-scada/manifests/"
@@ -149,16 +149,16 @@ local function get_remote_manifest()
end end
-- record the local installation manifest -- record the local installation manifest
local function write_install_manifest(manifest, dependencies) local function write_install_manifest(manifest, deps)
local versions = {} local versions = {}
for key, value in pairs(manifest.versions) do for key, value in pairs(manifest.versions) do
local is_dependency = false local is_dep = false
for _, dependency in pairs(dependencies) do for _, dep in pairs(deps) do
if (key == "bootloader" and dependency == "system") or key == dependency then if (key == "bootloader" and dep == "system") or key == dep then
is_dependency = true;break is_dep = true;break
end end
end end
if key == app or key == "comms" or is_dependency then versions[key] = value end if key == app or key == "comms" or is_dep then versions[key] = value end
end end
manifest.versions = versions manifest.versions = versions
@@ -383,8 +383,10 @@ if mode == "check" then
yellow();println("\nA different version of the installer is available, it is recommended to update (use 'ccmsi update installer').");white() yellow();println("\nA different version of the installer is available, it is recommended to update (use 'ccmsi update installer').");white()
end end
elseif mode == "install" or mode == "update" then elseif mode == "install" or mode == "update" then
local ok, r_manifest, l_manifest
local update_installer = app == "installer" local update_installer = app == "installer"
local ok, manifest = get_remote_manifest() ok, r_manifest = get_remote_manifest()
if not ok then return end if not ok then return end
local ver = { local ver = {
@@ -397,27 +399,27 @@ elseif mode == "install" or mode == "update" then
} }
-- try to find local versions -- try to find local versions
local local_ok, lmnf = read_local_manifest() ok, l_manifest = read_local_manifest()
if not local_ok then if mode == "update" and not update_installer then
if mode == "update" then if not ok then
red();println("Failed to load local installation information, cannot update.");white() red();println("Failed to load local installation information, cannot update.");white()
return return
end else
elseif not update_installer then ver.boot.v_local = l_manifest.versions.bootloader
ver.boot.v_local = lmnf.versions.bootloader ver.app.v_local = l_manifest.versions[app]
ver.app.v_local = lmnf.versions[app] ver.comms.v_local = l_manifest.versions.comms
ver.comms.v_local = lmnf.versions.comms ver.common.v_local = l_manifest.versions.common
ver.common.v_local = lmnf.versions.common ver.graphics.v_local = l_manifest.versions.graphics
ver.graphics.v_local = lmnf.versions.graphics ver.lockbox.v_local = l_manifest.versions.lockbox
ver.lockbox.v_local = lmnf.versions.lockbox
if lmnf.versions[app] == nil then if l_manifest.versions[app] == nil then
red();println("Another application is already installed, please uninstall it before installing a new application.");white() red();println("Another application is already installed, please uninstall it before installing a new application.");white()
return return
end end
end end
end
if manifest.versions.installer ~= CCMSI_VERSION then if r_manifest.versions.installer ~= CCMSI_VERSION then
if not update_installer then yellow();println("A different version of the installer is available, it is recommended to update to it.");white() end if not update_installer then yellow();println("A different version of the installer is available, it is recommended to update to it.");white() end
if update_installer or ask_y_n("Would you like to update now", true) then if update_installer or ask_y_n("Would you like to update now", true) then
lgray();println("GET ccmsi.lua") lgray();println("GET ccmsi.lua")
@@ -440,12 +442,12 @@ elseif mode == "install" or mode == "update" then
return return
end end
ver.boot.v_remote = manifest.versions.bootloader ver.boot.v_remote = r_manifest.versions.bootloader
ver.app.v_remote = manifest.versions[app] ver.app.v_remote = r_manifest.versions[app]
ver.comms.v_remote = manifest.versions.comms ver.comms.v_remote = r_manifest.versions.comms
ver.common.v_remote = manifest.versions.common ver.common.v_remote = r_manifest.versions.common
ver.graphics.v_remote = manifest.versions.graphics ver.graphics.v_remote = r_manifest.versions.graphics
ver.lockbox.v_remote = manifest.versions.lockbox ver.lockbox.v_remote = r_manifest.versions.lockbox
green() green()
if mode == "install" then print("Installing ") else print("Updating ") end if mode == "install" then print("Installing ") else print("Updating ") end
@@ -461,36 +463,33 @@ elseif mode == "install" or mode == "update" then
ver.graphics.changed = show_pkg_change("graphics", ver.graphics) ver.graphics.changed = show_pkg_change("graphics", ver.graphics)
ver.lockbox.changed = show_pkg_change("lockbox", ver.lockbox) ver.lockbox.changed = show_pkg_change("lockbox", ver.lockbox)
-------------------------- -- start install/update
-- START INSTALL/UPDATE --
--------------------------
local space_required = manifest.sizes.manifest local space_req = r_manifest.sizes.manifest
local space_available = fs.getFreeSpace("/") local space_avail = fs.getFreeSpace("/")
local single_file_mode = false local file_list = r_manifest.files
local file_list = manifest.files local size_list = r_manifest.sizes
local size_list = manifest.sizes local deps = r_manifest.depends[app]
local dependencies = manifest.depends[app]
table.insert(dependencies, app) table.insert(deps, app)
-- helper function to check if a dependency is unchanged -- helper function to check if a dependency is unchanged
local function unchanged(dependency) local function unchanged(dep)
if dependency == "system" then return not ver.boot.changed if dep == "system" then return not ver.boot.changed
elseif dependency == "graphics" then return not ver.graphics.changed elseif dep == "graphics" then return not ver.graphics.changed
elseif dependency == "lockbox" then return not ver.lockbox.changed elseif dep == "lockbox" then return not ver.lockbox.changed
elseif dependency == "common" then return not (ver.common.changed or ver.comms.changed) elseif dep == "common" then return not (ver.common.changed or ver.comms.changed)
elseif dependency == app then return not ver.app.changed elseif dep == app then return not ver.app.changed
else return true end else return true end
end end
local any_change = false local any_change = false
for _, dependency in pairs(dependencies) do for _, dep in pairs(deps) do
local size = size_list[dependency] local size = size_list[dep]
space_required = space_required + size space_req = space_req + size
any_change = any_change or not unchanged(dependency) any_change = any_change or not unchanged(dep)
end end
if mode == "update" and not any_change then if mode == "update" and not any_change then
@@ -501,10 +500,7 @@ elseif mode == "install" or mode == "update" then
-- ask for confirmation -- ask for confirmation
if not ask_y_n("Continue", false) then return end if not ask_y_n("Continue", false) then return end
-- check space constraints local single_file_mode = space_avail < space_req
if space_available < space_required then
single_file_mode = true
end
local success = true local success = true
@@ -548,7 +544,7 @@ elseif mode == "install" or mode == "update" then
success = false success = false
return return
end end
clean(manifest) clean(r_manifest)
sf_install(3) sf_install(3)
elseif attempt == 3 then elseif attempt == 3 then
yellow() yellow()
@@ -574,30 +570,30 @@ elseif mode == "install" or mode == "update" then
local abort_attempt = false local abort_attempt = false
success = true success = true
for _, dependency in pairs(dependencies) do for _, dep in pairs(deps) do
if mode == "update" and unchanged(dependency) then if mode == "update" and unchanged(dep) then
pkg_message("skipping install of unchanged package", dependency) pkg_message("skipping install of unchanged package", dep)
else else
pkg_message("installing package", dependency) pkg_message("installing package", dep)
lgray() lgray()
-- beginning on the second try, delete the directory before starting -- beginning on the second try, delete the directory before starting
if attempt >= 2 then if attempt >= 2 then
if dependency == "system" then if dep == "system" then
elseif dependency == "common" then elseif dep == "common" then
if fs.exists("/scada-common") then if fs.exists("/scada-common") then
fs.delete("/scada-common") fs.delete("/scada-common")
println("deleted /scada-common") println("deleted /scada-common")
end end
else else
if fs.exists("/"..dependency) then if fs.exists("/"..dep) then
fs.delete("/"..dependency) fs.delete("/"..dep)
println("deleted /"..dependency) println("deleted /"..dep)
end end
end end
end end
local files = file_list[dependency] local files = file_list[dep]
for _, file in pairs(files) do for _, file in pairs(files) do
println("GET "..file) println("GET "..file)
mitigate_case(file) mitigate_case(file)
@@ -620,14 +616,14 @@ elseif mode == "install" or mode == "update" then
if fs.exists(install_dir) then fs.delete(install_dir);fs.makeDir(install_dir) end if fs.exists(install_dir) then fs.delete(install_dir);fs.makeDir(install_dir) end
-- download all dependencies -- download all dependencies
for _, dependency in pairs(dependencies) do for _, dep in pairs(deps) do
if mode == "update" and unchanged(dependency) then if mode == "update" and unchanged(dep) then
pkg_message("skipping download of unchanged package", dependency) pkg_message("skipping download of unchanged package", dep)
else else
pkg_message("downloading package", dependency) pkg_message("downloading package", dep)
lgray() lgray()
local files = file_list[dependency] local files = file_list[dep]
for _, file in pairs(files) do for _, file in pairs(files) do
println("GET "..file) println("GET "..file)
local dl_stat = http_get_file(file, install_dir.."/") local dl_stat = http_get_file(file, install_dir.."/")
@@ -650,14 +646,14 @@ elseif mode == "install" or mode == "update" then
-- copy in downloaded files (installation) -- copy in downloaded files (installation)
if success then if success then
for _, dependency in pairs(dependencies) do for _, dep in pairs(deps) do
if mode == "update" and unchanged(dependency) then if mode == "update" and unchanged(dep) then
pkg_message("skipping install of unchanged package", dependency) pkg_message("skipping install of unchanged package", dep)
else else
pkg_message("installing package", dependency) pkg_message("installing package", dep)
lgray() lgray()
local files = file_list[dependency] local files = file_list[dep]
for _, file in pairs(files) do for _, file in pairs(files) do
local temp_file = install_dir.."/"..file local temp_file = install_dir.."/"..file
if fs.exists(file) then fs.delete(file) end if fs.exists(file) then fs.delete(file) end
@@ -671,13 +667,13 @@ elseif mode == "install" or mode == "update" then
end end
if success then if success then
write_install_manifest(manifest, dependencies) write_install_manifest(r_manifest, deps)
green() green()
if mode == "install" then if mode == "install" then
println("Installation completed successfully.") println("Installation completed successfully.")
else println("Update completed successfully.") end else println("Update completed successfully.") end
white();println("Ready to clean up unused files, press any key to continue...") white();println("Ready to clean up unused files, press any key to continue...")
any_key();clean(manifest) any_key();clean(r_manifest)
white();println("Done.") white();println("Done.")
else else
red() red()
@@ -712,14 +708,14 @@ elseif mode == "uninstall" then
clean(manifest) clean(manifest)
local file_list = manifest.files local file_list = manifest.files
local dependencies = manifest.depends[app] local deps = manifest.depends[app]
table.insert(dependencies, app) table.insert(deps, app)
-- delete all installed files -- delete all installed files
lgray() lgray()
for _, dependency in pairs(dependencies) do for _, dep in pairs(deps) do
local files = file_list[dependency] local files = file_list[dep]
for _, file in pairs(files) do for _, file in pairs(files) do
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

View File

@@ -1,11 +1,12 @@
print("CONFIGURE> SCANNING FOR CONFIGURATOR...") print("CONFIGURE> SCANNING FOR CONFIGURATOR...")
if fs.exists("reactor-plc/configure.lua") then require("reactor-plc.configure").configure() for _, app in ipairs({ "reactor-plc", "rtu", "supervisor", "coordinator", "pocket" }) do
elseif fs.exists("rtu/configure.lua") then require("rtu.configure").configure() if fs.exists(app .. "/configure.lua") then
elseif fs.exists("supervisor/configure.lua") then require("supervisor.configure").configure() local _, _, launch = require(app .. ".configure").configure()
elseif fs.exists("coordinator/configure.lua") then require("coordinator.configure").configure() if launch then shell.execute("/startup") end
elseif fs.exists("pocket/configure.lua") then require("pocket.configure").configure() return
else end
end
print("CONFIGURE> NO CONFIGURATOR FOUND") print("CONFIGURE> NO CONFIGURATOR FOUND")
print("CONFIGURE> EXIT") print("CONFIGURE> EXIT")
end

View File

@@ -58,6 +58,7 @@ style.btn_dis_fg_bg = cpair(colors.lightGray,colors.white)
local tool_ctl = { local tool_ctl = {
sv_cool_conf = nil, ---@type [ integer, integer ][] list of boiler & turbine counts sv_cool_conf = nil, ---@type [ integer, integer ][] list of boiler & turbine counts
launch_startup = false,
start_fail = 0, start_fail = 0,
fail_message = "", fail_message = "",
has_config = false, has_config = false,
@@ -236,9 +237,17 @@ local function config_view(display)
main_pane.set_value(8) main_pane.set_value(8)
end end
local function startup()
tool_ctl.launch_startup = true
exit()
end
PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg}
tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)} local start_btn = PushButton{parent=main_page,x=42,y=17,min_width=9,text="Startup",callback=startup,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(10)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} tool_ctl.color_cfg = PushButton{parent=main_page,x=36,y=y_start,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=cpair(colors.lightGray,colors.white)}
PushButton{parent=main_page,x=39,y=y_start+2,min_width=12,text="Change Log",callback=function()main_pane.set_value(10)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
if tool_ctl.start_fail ~= 0 then start_btn.disable() end
if not tool_ctl.has_config then if not tool_ctl.has_config then
tool_ctl.view_cfg.disable() tool_ctl.view_cfg.disable()
@@ -372,7 +381,7 @@ function configurator.configure(start_code, message)
println("configurator error: " .. error) println("configurator error: " .. error)
end end
return status, error return status, error, tool_ctl.launch_startup
end end
return configurator return configurator

View File

@@ -94,7 +94,7 @@ function iocontrol.init(conf, comms, temp_scale, energy_scale)
auto_scram = false, auto_scram = false,
---@type ascram_status ---@type ascram_status
ascram_status = { ascram_status = {
matrix_dc = false, matrix_fault = false,
matrix_fill = false, matrix_fill = false,
crit_alarm = false, crit_alarm = false,
radiation = false, radiation = false,
@@ -540,7 +540,7 @@ function iocontrol.update_facility_status(status)
fac.auto_saturated = ctl_status[5] fac.auto_saturated = ctl_status[5]
fac.auto_scram = ctl_status[6] fac.auto_scram = ctl_status[6]
fac.ascram_status.matrix_dc = ctl_status[7] fac.ascram_status.matrix_fault = ctl_status[7]
fac.ascram_status.matrix_fill = ctl_status[8] fac.ascram_status.matrix_fill = ctl_status[8]
fac.ascram_status.crit_alarm = ctl_status[9] fac.ascram_status.crit_alarm = ctl_status[9]
fac.ascram_status.radiation = ctl_status[10] fac.ascram_status.radiation = ctl_status[10]
@@ -555,7 +555,7 @@ function iocontrol.update_facility_status(status)
fac.ps.publish("auto_ramping", fac.auto_ramping) fac.ps.publish("auto_ramping", fac.auto_ramping)
fac.ps.publish("auto_saturated", fac.auto_saturated) fac.ps.publish("auto_saturated", fac.auto_saturated)
fac.ps.publish("auto_scram", fac.auto_scram) fac.ps.publish("auto_scram", fac.auto_scram)
fac.ps.publish("as_matrix_dc", fac.ascram_status.matrix_dc) fac.ps.publish("as_matrix_fault", fac.ascram_status.matrix_fault)
fac.ps.publish("as_matrix_fill", fac.ascram_status.matrix_fill) fac.ps.publish("as_matrix_fill", fac.ascram_status.matrix_fill)
fac.ps.publish("as_crit_alarm", fac.ascram_status.crit_alarm) fac.ps.publish("as_crit_alarm", fac.ascram_status.crit_alarm)
fac.ps.publish("as_radiation", fac.ascram_status.radiation) fac.ps.publish("as_radiation", fac.ascram_status.radiation)

View File

@@ -19,7 +19,7 @@ local renderer = require("coordinator.renderer")
local sounder = require("coordinator.sounder") local sounder = require("coordinator.sounder")
local threads = require("coordinator.threads") local threads = require("coordinator.threads")
local COORDINATOR_VERSION = "v1.5.13" local COORDINATOR_VERSION = "v1.5.15"
local CHUNK_LOAD_DELAY_S = 30.0 local CHUNK_LOAD_DELAY_S = 30.0

View File

@@ -94,14 +94,14 @@ local function new_view(root, x, y)
main.line_break() main.line_break()
local auto_scram = IndicatorLight{parent=main,label="Automatic SCRAM",colors=ind_red,flash=true,period=period.BLINK_250_MS} local auto_scram = IndicatorLight{parent=main,label="Automatic SCRAM",colors=ind_red,flash=true,period=period.BLINK_250_MS}
local matrix_dc = IndicatorLight{parent=main,label="Matrix Disconnected",colors=ind_yel,flash=true,period=period.BLINK_500_MS} local matrix_flt = IndicatorLight{parent=main,label="Induction Matrix Fault",colors=ind_yel,flash=true,period=period.BLINK_500_MS}
local matrix_fill = IndicatorLight{parent=main,label="Matrix Charge High",colors=ind_red,flash=true,period=period.BLINK_500_MS} local matrix_fill = IndicatorLight{parent=main,label="Matrix Charge High",colors=ind_red,flash=true,period=period.BLINK_500_MS}
local unit_crit = IndicatorLight{parent=main,label="Unit Critical Alarm",colors=ind_red,flash=true,period=period.BLINK_250_MS} local unit_crit = IndicatorLight{parent=main,label="Unit Critical Alarm",colors=ind_red,flash=true,period=period.BLINK_250_MS}
local fac_rad_h = IndicatorLight{parent=main,label="Facility Radiation High",colors=ind_red,flash=true,period=period.BLINK_250_MS} local fac_rad_h = IndicatorLight{parent=main,label="Facility Radiation High",colors=ind_red,flash=true,period=period.BLINK_250_MS}
local gen_fault = IndicatorLight{parent=main,label="Gen. Control Fault",colors=ind_yel,flash=true,period=period.BLINK_500_MS} local gen_fault = IndicatorLight{parent=main,label="Gen. Control Fault",colors=ind_yel,flash=true,period=period.BLINK_500_MS}
auto_scram.register(facility.ps, "auto_scram", auto_scram.update) auto_scram.register(facility.ps, "auto_scram", auto_scram.update)
matrix_dc.register(facility.ps, "as_matrix_dc", matrix_dc.update) matrix_flt.register(facility.ps, "as_matrix_fault", matrix_flt.update)
matrix_fill.register(facility.ps, "as_matrix_fill", matrix_fill.update) matrix_fill.register(facility.ps, "as_matrix_fill", matrix_fill.update)
unit_crit.register(facility.ps, "as_crit_alarm", unit_crit.update) unit_crit.register(facility.ps, "as_crit_alarm", unit_crit.update)
fac_rad_h.register(facility.ps, "as_radiation", fac_rad_h.update) fac_rad_h.register(facility.ps, "as_radiation", fac_rad_h.update)

View File

@@ -50,6 +50,7 @@ style.btn_dis_fg_bg = cpair(colors.lightGray, colors.white)
---@class _pkt_cfg_tool_ctl ---@class _pkt_cfg_tool_ctl
local tool_ctl = { local tool_ctl = {
launch_startup = false,
ask_config = false, ask_config = false,
has_config = false, has_config = false,
viewing_config = false, viewing_config = false,
@@ -162,8 +163,16 @@ local function config_view(display)
if not tool_ctl.has_config then tool_ctl.view_cfg.disable() end if not tool_ctl.has_config then tool_ctl.view_cfg.disable() end
local function startup()
tool_ctl.launch_startup = true
exit()
end
PushButton{parent=main_page,x=2,y=18,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} PushButton{parent=main_page,x=2,y=18,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg}
PushButton{parent=main_page,x=14,y=18,min_width=12,text="Change Log",callback=function()main_pane.set_value(6)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} local start_btn = PushButton{parent=main_page,x=17,y=18,min_width=9,text="Startup",callback=startup,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
PushButton{parent=main_page,x=2,y=y_start+4,min_width=12,text="Change Log",callback=function()main_pane.set_value(6)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
if tool_ctl.ask_config then start_btn.disable() end
--#endregion --#endregion
@@ -254,7 +263,7 @@ function configurator.configure(ask_config)
println("configurator error: " .. error) println("configurator error: " .. error)
end end
return status, error return status, error, tool_ctl.launch_startup
end end
return configurator return configurator

View File

@@ -148,7 +148,7 @@ function iocontrol.init_fac(conf)
auto_scram = false, auto_scram = false,
---@type ascram_status ---@type ascram_status
ascram_status = { ascram_status = {
matrix_dc = false, matrix_fault = false,
matrix_fill = false, matrix_fill = false,
crit_alarm = false, crit_alarm = false,
radiation = false, radiation = false,
@@ -908,7 +908,7 @@ function iocontrol.record_process_data(data)
fac.ps.publish("auto_saturated", fac.auto_saturated) fac.ps.publish("auto_saturated", fac.auto_saturated)
fac.ps.publish("auto_scram", fac.auto_scram) fac.ps.publish("auto_scram", fac.auto_scram)
fac.ps.publish("as_matrix_dc", fac.ascram_status.matrix_dc) fac.ps.publish("as_matrix_fault", fac.ascram_status.matrix_fault)
fac.ps.publish("as_matrix_fill", fac.ascram_status.matrix_fill) fac.ps.publish("as_matrix_fill", fac.ascram_status.matrix_fill)
fac.ps.publish("as_crit_alarm", fac.ascram_status.crit_alarm) fac.ps.publish("as_crit_alarm", fac.ascram_status.crit_alarm)
fac.ps.publish("as_radiation", fac.ascram_status.radiation) fac.ps.publish("as_radiation", fac.ascram_status.radiation)

View File

@@ -20,7 +20,7 @@ local pocket = require("pocket.pocket")
local renderer = require("pocket.renderer") local renderer = require("pocket.renderer")
local threads = require("pocket.threads") local threads = require("pocket.threads")
local POCKET_VERSION = "v0.12.8-alpha" local POCKET_VERSION = "v0.12.10-alpha"
local println = util.println local println = util.println
local println_ts = util.println_ts local println_ts = util.println_ts

View File

@@ -269,7 +269,7 @@ local function new_view(root)
local auto_scram = IconIndicator{parent=a_div,y=3,label="Automatic SCRAM",states=red_ind_s} local auto_scram = IconIndicator{parent=a_div,y=3,label="Automatic SCRAM",states=red_ind_s}
TextBox{parent=a_div,y=5,text="Induction Matrix",fg_bg=label_fg_bg} TextBox{parent=a_div,y=5,text="Induction Matrix",fg_bg=label_fg_bg}
local matrix_dc = IconIndicator{parent=a_div,label="Disconnected",states=yel_ind_s} local matrix_flt = IconIndicator{parent=a_div,label="Matrix Fault",states=yel_ind_s}
local matrix_fill = IconIndicator{parent=a_div,label="Charge High",states=red_ind_s} local matrix_fill = IconIndicator{parent=a_div,label="Charge High",states=red_ind_s}
TextBox{parent=a_div,y=9,text="Assigned Units",fg_bg=label_fg_bg} TextBox{parent=a_div,y=9,text="Assigned Units",fg_bg=label_fg_bg}
@@ -282,7 +282,7 @@ local function new_view(root)
local gen_fault = IconIndicator{parent=a_div,label="Control Fault",states=yel_ind_s} local gen_fault = IconIndicator{parent=a_div,label="Control Fault",states=yel_ind_s}
auto_scram.register(f_ps, "auto_scram", auto_scram.update) auto_scram.register(f_ps, "auto_scram", auto_scram.update)
matrix_dc.register(f_ps, "as_matrix_dc", matrix_dc.update) matrix_flt.register(f_ps, "as_matrix_fault", matrix_flt.update)
matrix_fill.register(f_ps, "as_matrix_fill", matrix_fill.update) matrix_fill.register(f_ps, "as_matrix_fill", matrix_fill.update)
unit_crit.register(f_ps, "as_crit_alarm", unit_crit.update) unit_crit.register(f_ps, "as_crit_alarm", unit_crit.update)
fac_rad_h.register(f_ps, "as_radiation", fac_rad_h.update) fac_rad_h.register(f_ps, "as_radiation", fac_rad_h.update)

View File

@@ -148,7 +148,7 @@ doc("auto_ramping", "Process Ramping", "Automatic process control is performing
doc("auto_saturated", "Min/Max Burn Rate", "Auto control has either commanded 0 mB/t or the maximum total burn rate available (from assigned units).") doc("auto_saturated", "Min/Max Burn Rate", "Auto control has either commanded 0 mB/t or the maximum total burn rate available (from assigned units).")
sect("Automatic SCRAM") sect("Automatic SCRAM")
doc("auto_scram", "Automatic SCRAM", "Automatic control system SCRAM'ed the assigned reactors due to a safety hazard, shown by the below indicators.") doc("auto_scram", "Automatic SCRAM", "Automatic control system SCRAM'ed the assigned reactors due to a safety hazard, shown by the below indicators.")
doc("as_matrix_dc", "Matrix Disconnected", "Automatic SCRAM occurred due to loss of induction matrix connection.") doc("as_matrix_fault", "Matrix Fault", "Automatic SCRAM occurred due to the loss of the induction matrix connection, or the matrix being unformed or faulted.")
doc("as_matrix_fill", "Matrix Charge High", "Automatic SCRAM occurred due to induction matrix charge exceeding acceptable limit.") doc("as_matrix_fill", "Matrix Charge High", "Automatic SCRAM occurred due to induction matrix charge exceeding acceptable limit.")
doc("as_crit_alarm", "Unit Critical Alarm", "Automatic SCRAM occurred due to critical level unit alarm(s).") doc("as_crit_alarm", "Unit Critical Alarm", "Automatic SCRAM occurred due to critical level unit alarm(s).")
doc("as_radiation", "Facility Radiation High", "Automatic SCRAM occurred due to high facility radiation levels.") doc("as_radiation", "Facility Radiation High", "Automatic SCRAM occurred due to high facility radiation levels.")

View File

@@ -53,6 +53,7 @@ style.btn_dis_fg_bg = cpair(colors.lightGray, colors.white)
---@class _plc_cfg_tool_ctl ---@class _plc_cfg_tool_ctl
local tool_ctl = { local tool_ctl = {
launch_startup = false,
ask_config = false, ask_config = false,
has_config = false, has_config = false,
viewing_config = false, viewing_config = false,
@@ -184,10 +185,18 @@ local function config_view(display)
main_pane.set_value(5) main_pane.set_value(5)
end end
local function startup()
tool_ctl.launch_startup = true
exit()
end
PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg}
PushButton{parent=main_page,x=10,y=17,min_width=12,text="Self-Check",callback=function()main_pane.set_value(8)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg} local start_btn = PushButton{parent=main_page,x=42,y=17,min_width=9,text="Startup",callback=startup,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg} PushButton{parent=main_page,x=39,y=y_start,min_width=12,text="Self-Check",callback=function()main_pane.set_value(8)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} tool_ctl.color_cfg = PushButton{parent=main_page,x=36,y=y_start+2,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
PushButton{parent=main_page,x=39,y=y_start+4,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
if tool_ctl.ask_config then start_btn.disable() end
if not tool_ctl.has_config then if not tool_ctl.has_config then
tool_ctl.view_cfg.disable() tool_ctl.view_cfg.disable()
@@ -293,7 +302,7 @@ function configurator.configure(ask_config)
println("configurator error: " .. error) println("configurator error: " .. error)
end end
return status, error return status, error, tool_ctl.launch_startup
end end
return configurator return configurator

View File

@@ -18,7 +18,7 @@ local plc = require("reactor-plc.plc")
local renderer = require("reactor-plc.renderer") local renderer = require("reactor-plc.renderer")
local threads = require("reactor-plc.threads") local threads = require("reactor-plc.threads")
local R_PLC_VERSION = "v1.8.12" local R_PLC_VERSION = "v1.8.13"
local println = util.println local println = util.println
local println_ts = util.println_ts local println_ts = util.println_ts

View File

@@ -55,6 +55,7 @@ style.btn_dis_fg_bg = cpair(colors.lightGray, colors.white)
---@class _rtu_cfg_tool_ctl ---@class _rtu_cfg_tool_ctl
local tool_ctl = { local tool_ctl = {
launch_startup = false,
ask_config = false, ask_config = false,
has_config = false, has_config = false,
viewing_config = false, viewing_config = false,
@@ -218,9 +219,17 @@ local function config_view(display)
main_pane.set_value(5) main_pane.set_value(5)
end end
local function startup()
tool_ctl.launch_startup = true
exit()
end
PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg}
tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg} local start_btn = PushButton{parent=main_page,x=42,y=17,min_width=9,text="Startup",callback=startup,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} tool_ctl.color_cfg = PushButton{parent=main_page,x=36,y=y_start,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
PushButton{parent=main_page,x=39,y=y_start+2,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
if tool_ctl.ask_config then start_btn.disable() end
if not tool_ctl.has_config then if not tool_ctl.has_config then
tool_ctl.view_gw_cfg.disable() tool_ctl.view_gw_cfg.disable()
@@ -346,7 +355,7 @@ function configurator.configure(ask_config)
println("configurator error: " .. error) println("configurator error: " .. error)
end end
return status, error return status, error, tool_ctl.launch_startup
end end
return configurator return configurator

View File

@@ -31,7 +31,7 @@ local sna_rtu = require("rtu.dev.sna_rtu")
local sps_rtu = require("rtu.dev.sps_rtu") local sps_rtu = require("rtu.dev.sps_rtu")
local turbinev_rtu = require("rtu.dev.turbinev_rtu") local turbinev_rtu = require("rtu.dev.turbinev_rtu")
local RTU_VERSION = "v1.10.14" local RTU_VERSION = "v1.10.15"
local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE
local RTU_HW_STATE = databus.RTU_HW_STATE local RTU_HW_STATE = databus.RTU_HW_STATE

View File

@@ -1,4 +1,4 @@
local BOOTLOADER_VERSION = "1.1" local BOOTLOADER_VERSION = "1.2"
print("SCADA BOOTLOADER V" .. BOOTLOADER_VERSION) print("SCADA BOOTLOADER V" .. BOOTLOADER_VERSION)
print("BOOT> SCANNING FOR APPLICATIONS...") print("BOOT> SCANNING FOR APPLICATIONS...")

View File

@@ -51,6 +51,7 @@ style.btn_dis_fg_bg = cpair(colors.lightGray, colors.white)
---@class _svr_cfg_tool_ctl ---@class _svr_cfg_tool_ctl
local tool_ctl = { local tool_ctl = {
launch_startup = false,
ask_config = false, ask_config = false,
has_config = false, has_config = false,
viewing_config = false, viewing_config = false,
@@ -201,9 +202,17 @@ local function config_view(display)
main_pane.set_value(5) main_pane.set_value(5)
end end
local function startup()
tool_ctl.launch_startup = true
exit()
end
PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg} PushButton{parent=main_page,x=2,y=17,min_width=6,text="Exit",callback=exit,fg_bg=cpair(colors.black,colors.red),active_fg_bg=btn_act_fg_bg}
tool_ctl.color_cfg = PushButton{parent=main_page,x=23,y=17,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg} local start_btn = PushButton{parent=main_page,x=42,y=17,min_width=9,text="Startup",callback=startup,fg_bg=cpair(colors.black,colors.green),active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
PushButton{parent=main_page,x=39,y=17,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg} tool_ctl.color_cfg = PushButton{parent=main_page,x=36,y=y_start,min_width=15,text="Color Options",callback=jump_color,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg,dis_fg_bg=btn_dis_fg_bg}
PushButton{parent=main_page,x=39,y=y_start+2,min_width=12,text="Change Log",callback=function()main_pane.set_value(7)end,fg_bg=nav_fg_bg,active_fg_bg=btn_act_fg_bg}
if tool_ctl.ask_config then start_btn.disable() end
if not tool_ctl.has_config then if not tool_ctl.has_config then
tool_ctl.view_cfg.disable() tool_ctl.view_cfg.disable()
@@ -308,7 +317,7 @@ function configurator.configure(ask_config)
println("configurator error: " .. error) println("configurator error: " .. error)
end end
return status, error return status, error, tool_ctl.launch_startup
end end
return configurator return configurator

View File

@@ -17,7 +17,7 @@ local WASTE = types.WASTE_PRODUCT
---@enum AUTO_SCRAM ---@enum AUTO_SCRAM
local AUTO_SCRAM = { local AUTO_SCRAM = {
NONE = 0, NONE = 0,
MATRIX_DC = 1, MATRIX_FAULT = 1,
MATRIX_FILL = 2, MATRIX_FILL = 2,
CRIT_ALARM = 3, CRIT_ALARM = 3,
RADIATION = 4, RADIATION = 4,
@@ -81,7 +81,7 @@ function facility.new(config)
ascram_reason = AUTO_SCRAM.NONE, ascram_reason = AUTO_SCRAM.NONE,
---@class ascram_status ---@class ascram_status
ascram_status = { ascram_status = {
matrix_dc = false, matrix_fault = false,
matrix_fill = false, matrix_fill = false,
crit_alarm = false, crit_alarm = false,
radiation = false, radiation = false,
@@ -91,8 +91,8 @@ function facility.new(config)
charge_conversion = 1.0, charge_conversion = 1.0,
time_start = 0.0, time_start = 0.0,
initial_ramp = true, initial_ramp = true,
waiting_on_ramp = false, waiting_on_ramp = false, -- waiting on auto ramping
waiting_on_stable = false, waiting_on_stable = false, -- waiting on gen rate stabilization
accumulator = 0.0, accumulator = 0.0,
saturated = false, saturated = false,
last_update = 0, last_update = 0,
@@ -599,7 +599,7 @@ function facility.new(config)
self.waiting_on_ramp or self.waiting_on_stable, self.waiting_on_ramp or self.waiting_on_stable,
self.at_max_burn or self.saturated, self.at_max_burn or self.saturated,
self.ascram, self.ascram,
astat.matrix_dc, astat.matrix_fault,
astat.matrix_fill, astat.matrix_fill,
astat.crit_alarm, astat.crit_alarm,
astat.radiation, astat.radiation,

View File

@@ -341,9 +341,17 @@ function update.auto_control(ExtChargeIdling)
if state_changed then if state_changed then
self.time_start = now self.time_start = now
self.saturated = true self.saturated = true
self.waiting_on_ramp = true
self.status_text = { "MONITORED MODE", "ramping reactors to limit" }
log.info("FAC: MAX_BURN process mode started")
elseif self.waiting_on_ramp then
if all_units_ramped() then
self.waiting_on_ramp = false
self.status_text = { "MONITORED MODE", "running reactors at limit" } self.status_text = { "MONITORED MODE", "running reactors at limit" }
log.info("FAC: MAX_BURN process mode started") log.info("FAC: MAX_BURN process mode initial ramp completed")
end
end end
allocate_burn_rate(self.max_burn_combined, true) allocate_burn_rate(self.max_burn_combined, true)
@@ -351,8 +359,17 @@ function update.auto_control(ExtChargeIdling)
-- a total aggregate burn rate -- a total aggregate burn rate
if state_changed then if state_changed then
self.time_start = now self.time_start = now
self.status_text = { "BURN RATE MODE", "running" } self.waiting_on_ramp = true
self.status_text = { "BURN RATE MODE", "ramping to target" }
log.info("FAC: BURN_RATE process mode started") log.info("FAC: BURN_RATE process mode started")
elseif self.waiting_on_ramp then
if all_units_ramped() then
self.waiting_on_ramp = false
self.status_text = { "BURN RATE MODE", "running" }
log.info("FAC: BURN_RATE process mode initial ramp completed")
end
end end
local unallocated = allocate_burn_rate(self.burn_target, true) local unallocated = allocate_burn_rate(self.burn_target, true)
@@ -511,13 +528,19 @@ function update.auto_safety()
local astatus = self.ascram_status local astatus = self.ascram_status
-- matrix related checks
if self.induction[1] ~= nil then if self.induction[1] ~= nil then
local db = self.induction[1].get_db() local db = self.induction[1].get_db()
-- clear matrix disconnected -- check for unformed or faulted state
if astatus.matrix_dc then local i_ok = db.formed and not self.induction[1].is_faulted()
astatus.matrix_dc = false
log.info("FAC: induction matrix reconnected, clearing ASCRAM condition") -- clear matrix fault if ok again
if astatus.matrix_fault and i_ok then
astatus.matrix_fault = false
log.info("FAC: induction matrix OK, clearing ASCRAM condition")
else
astatus.matrix_fault = not i_ok
end end
-- check matrix fill too high -- check matrix fill too high
@@ -528,6 +551,13 @@ function update.auto_safety()
log.info(util.c("FAC: charge state of induction matrix entered acceptable range <= ", ALARM_LIMS.CHARGE_RE_ENABLE * 100, "%")) log.info(util.c("FAC: charge state of induction matrix entered acceptable range <= ", ALARM_LIMS.CHARGE_RE_ENABLE * 100, "%"))
end end
-- system not ready, will need to restart GEN_RATE mode
-- clears when we enter the fault waiting state
astatus.gen_fault = self.mode == PROCESS.GEN_RATE and not self.units_ready
else
astatus.matrix_fault = true
end
-- check for critical unit alarms -- check for critical unit alarms
astatus.crit_alarm = false astatus.crit_alarm = false
for i = 1, #self.units do for i = 1, #self.units do
@@ -555,15 +585,8 @@ function update.auto_safety()
-- operator can restart the system or hit the stop/reset button -- operator can restart the system or hit the stop/reset button
end end
-- system not ready, will need to restart GEN_RATE mode
-- clears when we enter the fault waiting state
astatus.gen_fault = self.mode == PROCESS.GEN_RATE and not self.units_ready
else
astatus.matrix_dc = true
end
if (self.mode ~= PROCESS.INACTIVE) and (self.mode ~= PROCESS.SYSTEM_ALARM_IDLE) then if (self.mode ~= PROCESS.INACTIVE) and (self.mode ~= PROCESS.SYSTEM_ALARM_IDLE) then
local scram = astatus.matrix_dc or astatus.matrix_fill or astatus.crit_alarm or astatus.gen_fault local scram = astatus.matrix_fault or astatus.matrix_fill or astatus.crit_alarm or astatus.gen_fault
if scram and not self.ascram then if scram and not self.ascram then
-- SCRAM all units -- SCRAM all units
@@ -587,14 +610,14 @@ function update.auto_safety()
self.status_text = { "AUTOMATIC SCRAM", "facility radiation high" } self.status_text = { "AUTOMATIC SCRAM", "facility radiation high" }
log.info("FAC: automatic SCRAM due to high facility radiation") log.info("FAC: automatic SCRAM due to high facility radiation")
elseif astatus.matrix_dc then elseif astatus.matrix_fault then
next_mode = PROCESS.MATRIX_FAULT_IDLE next_mode = PROCESS.MATRIX_FAULT_IDLE
self.ascram_reason = AUTO_SCRAM.MATRIX_DC self.ascram_reason = AUTO_SCRAM.MATRIX_FAULT
self.status_text = { "AUTOMATIC SCRAM", "induction matrix disconnected" } self.status_text = { "AUTOMATIC SCRAM", "induction matrix fault" }
if self.mode ~= PROCESS.MATRIX_FAULT_IDLE then self.return_mode = self.mode end if self.mode ~= PROCESS.MATRIX_FAULT_IDLE then self.return_mode = self.mode end
log.info("FAC: automatic SCRAM due to induction matrix disconnection") log.info("FAC: automatic SCRAM due to induction matrix disconnected, unformed, or faulted")
elseif astatus.matrix_fill then elseif astatus.matrix_fill then
next_mode = PROCESS.MATRIX_FAULT_IDLE next_mode = PROCESS.MATRIX_FAULT_IDLE
self.ascram_reason = AUTO_SCRAM.MATRIX_FILL self.ascram_reason = AUTO_SCRAM.MATRIX_FILL

View File

@@ -22,7 +22,7 @@ local supervisor = require("supervisor.supervisor")
local svsessions = require("supervisor.session.svsessions") local svsessions = require("supervisor.session.svsessions")
local SUPERVISOR_VERSION = "v1.5.10" local SUPERVISOR_VERSION = "v1.5.15"
local println = util.println local println = util.println
local println_ts = util.println_ts local println_ts = util.println_ts