diff --git a/.gitignore b/.gitignore
index 17ae161..0688a64 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,2 @@
_notes/
-program.sh
\ No newline at end of file
+/*program.sh
\ No newline at end of file
diff --git a/ccmsi.lua b/ccmsi.lua
index a8fff8a..f3f74d1 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.2"
+local CCMSI_VERSION = "v1.4f"
local install_dir = "/.install-cache"
local manifest_path = "https://mikaylafischler.github.io/cc-mek-scada/manifests/"
@@ -29,6 +29,7 @@ local repo_path = "http://raw.githubusercontent.com/MikaylaFischler/cc-mek-scada
local opts = { ... }
local mode = nil
local app = nil
+local target
-- record the local installation manifest
---@param manifest table
@@ -38,7 +39,7 @@ local function write_install_manifest(manifest, dependencies)
for key, value in pairs(manifest.versions) do
local is_dependency = false
for _, dependency in pairs(dependencies) do
- if key == "bootloader" and dependency == "system" then
+ if (key == "bootloader" and dependency == "system") or key == dependency then
is_dependency = true
break
end
@@ -54,6 +55,68 @@ local function write_install_manifest(manifest, dependencies)
imfile.close()
end
+-- ask the user yes or no
+---@nodiscard
+---@param question string
+---@param default boolean
+---@return boolean|nil
+local function ask_y_n(question, default)
+ print(question)
+
+ if default == true then
+ print(" (Y/n)? ")
+ else
+ print(" (y/N)? ")
+ end
+
+ local response = read(nil, nil)
+
+ 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
+
+-- print out a white + blue text message
+-- automatically adds a space
+---@param message string message
+---@param package string dependency/package/version
+local function pkg_message(message, package)
+ term.setTextColor(colors.white)
+ print(message .. " ")
+ term.setTextColor(colors.blue)
+ println(package)
+ term.setTextColor(colors.white)
+end
+
+-- indicate actions to be taken based on package differences for installs/updates
+---@param name string package name
+---@param v_local string|nil local version
+---@param v_remote string remote version
+local function show_pkg_change(name, v_local, v_remote)
+ if v_local ~= nil then
+ if v_local ~= v_remote then
+ print("[" .. name .. "] updating ")
+ term.setTextColor(colors.blue)
+ print(v_local)
+ term.setTextColor(colors.white)
+ print(" \xbb ")
+ term.setTextColor(colors.blue)
+ println(v_local)
+ term.setTextColor(colors.white)
+ elseif mode == "install" then
+ pkg_message("[" .. name .. "] reinstalling", v_local)
+ end
+ else
+ pkg_message("[" .. name .. "] new install of", v_remote)
+ end
+end
+
--
-- get and validate command line options
--
@@ -61,12 +124,12 @@ end
println("-- CC Mekanism SCADA Installer " .. CCMSI_VERSION .. " --")
if #opts == 0 or opts[1] == "help" then
- println("usage: ccmsi ")
+ println("usage: ccmsi ")
println("")
term.setTextColor(colors.lightGray)
println(" check - check latest versions avilable")
term.setTextColor(colors.yellow)
- println(" ccmsi check for target")
+ println(" ccmsi check for target")
term.setTextColor(colors.lightGray)
println(" install - fresh install, overwrites config")
println(" update - update files EXCEPT for config/logs")
@@ -81,12 +144,11 @@ if #opts == 0 or opts[1] == "help" then
println(" coordinator - coordinator application")
println(" pocket - pocket application")
term.setTextColor(colors.white)
- println("")
+ println("")
term.setTextColor(colors.yellow)
println(" second parameter when used with check")
term.setTextColor(colors.lightGray)
- println(" note: defaults to main")
- println(" target GitHub tag or branch name")
+ println(" main (default) | latest | devel")
return
else
for _, v in pairs({ "check", "install", "update", "remove", "purge" }) do
@@ -112,6 +174,13 @@ else
println("unrecognized application")
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
+ target = "main"
+ println("unknown target, defaulting to 'main'")
+ end
end
--
@@ -123,7 +192,7 @@ if mode == "check" then
-- GET REMOTE MANIFEST --
-------------------------
- if opts[2] then manifest_path = manifest_path .. opts[2] .. "/" else manifest_path = manifest_path .. "main/" end
+ manifest_path = manifest_path .. target .. "/"
local install_manifest = manifest_path .. "install_manifest.json"
local response, error = http.get(install_manifest)
@@ -203,8 +272,8 @@ elseif mode == "install" or mode == "update" then
-- GET REMOTE MANIFEST --
-------------------------
- if opts[3] then repo_path = repo_path .. opts[3] .. "/" else repo_path = repo_path .. "main/" end
- if opts[3] then manifest_path = manifest_path .. opts[3] .. "/" else manifest_path = manifest_path .. "main/" end
+ repo_path = repo_path .. target .. "/"
+ manifest_path = manifest_path .. target .. "/"
local install_manifest = manifest_path .. "install_manifest.json"
local response, error = http.get(install_manifest)
@@ -230,6 +299,13 @@ elseif mode == "install" or mode == "update" then
-- GET LOCAL MANIFEST --
------------------------
+ local ver = {
+ app = { v_local = nil, v_remote = nil, changed = false },
+ boot = { v_local = nil, v_remote = nil, changed = false },
+ comms = { v_local = nil, v_remote = nil, changed = false },
+ graphics = { v_local = nil, v_remote = nil, changed = false }
+ }
+
local imfile = fs.open("install_manifest.json", "r")
local local_ok = false
local local_manifest = {}
@@ -239,10 +315,6 @@ elseif mode == "install" or mode == "update" then
imfile.close()
end
- local local_app_version = nil
- local local_comms_version = nil
- local local_boot_version = nil
-
-- try to find local versions
if not local_ok then
if mode == "update" then
@@ -252,9 +324,10 @@ elseif mode == "install" or mode == "update" then
return
end
else
- local_app_version = local_manifest.versions[app]
- local_comms_version = local_manifest.versions.comms
- local_boot_version = local_manifest.versions.bootloader
+ ver.boot.v_local = local_manifest.versions.bootloader
+ ver.app.v_local = local_manifest.versions[app]
+ ver.comms.v_local = local_manifest.versions.comms
+ ver.graphics.v_local = local_manifest.versions.graphics
if local_manifest.versions[app] == nil then
term.setTextColor(colors.red)
@@ -271,93 +344,43 @@ elseif mode == "install" or mode == "update" then
end
end
- local remote_app_version = manifest.versions[app]
- local remote_comms_version = manifest.versions.comms
- local remote_boot_version = manifest.versions.bootloader
+ ver.boot.v_remote = manifest.versions.bootloader
+ ver.app.v_remote = manifest.versions[app]
+ ver.comms.v_remote = manifest.versions.comms
+ ver.graphics.v_remote = manifest.versions.graphics
term.setTextColor(colors.green)
if mode == "install" then
- println("installing " .. app .. " files...")
+ println("Installing " .. app .. " files...")
elseif mode == "update" then
- println("updating " .. app .. " files... (keeping old config.lua)")
+ println("Updating " .. app .. " files... (keeping old config.lua)")
end
term.setTextColor(colors.white)
-- display bootloader version change information
- if local_boot_version ~= nil then
- if local_boot_version ~= remote_boot_version then
- print("[bootldr] updating ")
- term.setTextColor(colors.blue)
- print(local_boot_version)
- term.setTextColor(colors.white)
- print(" \xbb ")
- term.setTextColor(colors.blue)
- println(remote_boot_version)
- term.setTextColor(colors.white)
- elseif mode == "install" then
- print("[bootldr] reinstalling ")
- term.setTextColor(colors.blue)
- println(local_boot_version)
- term.setTextColor(colors.white)
- end
- else
- print("[bootldr] new install of ")
- term.setTextColor(colors.blue)
- println(remote_boot_version)
- term.setTextColor(colors.white)
- end
+ show_pkg_change("bootldr", ver.boot.v_local, ver.boot.v_remote)
+ ver.boot.changed = ver.boot.v_local ~= ver.boot.v_remote
-- display app version change information
- if local_app_version ~= nil then
- if local_app_version ~= remote_app_version then
- print("[" .. app .. "] updating ")
- term.setTextColor(colors.blue)
- print(local_app_version)
- term.setTextColor(colors.white)
- print(" \xbb ")
- term.setTextColor(colors.blue)
- println(remote_app_version)
- term.setTextColor(colors.white)
- elseif mode == "install" then
- print("[" .. app .. "] reinstalling ")
- term.setTextColor(colors.blue)
- println(local_app_version)
- term.setTextColor(colors.white)
- end
- else
- print("[" .. app .. "] new install of ")
- term.setTextColor(colors.blue)
- println(remote_app_version)
+ show_pkg_change(app, ver.app.v_local, ver.app.v_remote)
+ ver.app.changed = ver.app.v_local ~= ver.app.v_remote
+
+ -- display comms version change information
+ 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] ")
+ term.setTextColor(colors.yellow)
+ println("other devices on the network will require an update")
term.setTextColor(colors.white)
end
- -- display comms version change information
- if local_comms_version ~= nil then
- if local_comms_version ~= remote_comms_version then
- print("[comms] updating ")
- term.setTextColor(colors.blue)
- print(local_comms_version)
- term.setTextColor(colors.white)
- print(" \xbb ")
- term.setTextColor(colors.blue)
- println(remote_comms_version)
- term.setTextColor(colors.white)
- print("[comms] ")
- term.setTextColor(colors.yellow)
- println("other devices on the network will require an update")
- term.setTextColor(colors.white)
- elseif mode == "install" then
- print("[comms] reinstalling ")
- term.setTextColor(colors.blue)
- println(local_comms_version)
- term.setTextColor(colors.white)
- end
- else
- print("[comms] new install of ")
- term.setTextColor(colors.blue)
- println(remote_comms_version)
- term.setTextColor(colors.white)
- end
+ -- display graphics version change information
+ show_pkg_change("graphics", ver.graphics.v_local, ver.graphics.v_remote)
+ ver.graphics.changed = ver.graphics.v_local ~= ver.graphics.v_remote
+
+ -- ask for confirmation
+ if not ask_y_n("Continue?", false) then return end
--------------------------
-- START INSTALL/UPDATE --
@@ -386,20 +409,26 @@ elseif mode == "install" or mode == "update" then
println("WARNING: Insufficient space available for a full download!")
term.setTextColor(colors.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.")
- println("Do you wish to continue? (y/N)")
-
- local confirm = read()
- if confirm ~= "y" and confirm ~= "Y" then
- println("installation cancelled")
+ if mode == "update" then println("If installation still fails, delete this device's log file and try again.") end
+ if not ask_y_n("Do you wish to continue?", false) then
+ println("Operation cancelled.")
return
end
end
----@diagnostic disable-next-line: undefined-field
- os.sleep(2)
-
local success = true
+ -- helper function to check if a dependency is unchanged
+ ---@nodiscard
+ ---@param dependency string
+ ---@return boolean
+ local function unchanged(dependency)
+ if dependency == "system" then return not ver.boot.changed
+ elseif dependency == "graphics" then return not ver.graphics.changed
+ elseif dependency == app then return not ver.app.changed
+ else return true end
+ end
+
if not single_file_mode then
if fs.exists(install_dir) then
fs.delete(install_dir)
@@ -408,20 +437,12 @@ elseif mode == "install" or mode == "update" then
-- download all dependencies
for _, dependency in pairs(dependencies) do
- if mode == "update" and ((dependency == "system" and local_boot_version == remote_boot_version) or (local_app_version == remote_app_version)) then
- -- skip system package if unchanged, skip app package if not changed
- -- skip packages that have no version if app version didn't change
- term.setTextColor(colors.white)
- print("skipping download of unchanged package ")
- term.setTextColor(colors.blue)
- println(dependency)
+ if mode == "update" and unchanged(dependency) then
+ pkg_message("skipping download of unchanged package", dependency)
else
- term.setTextColor(colors.white)
- print("downloading package ")
- term.setTextColor(colors.blue)
- println(dependency)
-
+ pkg_message("downloading package", dependency)
term.setTextColor(colors.lightGray)
+
local files = file_list[dependency]
for _, file in pairs(files) do
println("GET " .. file)
@@ -444,20 +465,12 @@ elseif mode == "install" or mode == "update" then
-- copy in downloaded files (installation)
if success then
for _, dependency in pairs(dependencies) do
- if mode == "update" and ((dependency == "system" and local_boot_version == remote_boot_version) or (local_app_version == remote_app_version)) then
- -- skip system package if unchanged, skip app package if not changed
- -- skip packages that have no version if app version didn't change
- term.setTextColor(colors.white)
- print("skipping install of unchanged package ")
- term.setTextColor(colors.blue)
- println(dependency)
+ if mode == "update" and unchanged(dependency) then
+ pkg_message("skipping install of unchanged package", dependency)
else
- term.setTextColor(colors.white)
- print("installing package ")
- term.setTextColor(colors.blue)
- println(dependency)
-
+ pkg_message("installing package", dependency)
term.setTextColor(colors.lightGray)
+
local files = file_list[dependency]
for _, file in pairs(files) do
if mode == "install" or file ~= config_file then
@@ -478,36 +491,28 @@ elseif mode == "install" or mode == "update" then
write_install_manifest(manifest, dependencies)
term.setTextColor(colors.green)
if mode == "install" then
- println("installation completed successfully")
+ println("Installation completed successfully.")
else
- println("update completed successfully")
+ println("Update completed successfully.")
end
else
if mode == "install" then
term.setTextColor(colors.red)
- println("installation failed")
+ println("Installation failed.")
else
term.setTextColor(colors.orange)
- println("update failed, existing files unmodified")
+ println("Update failed, existing files unmodified.")
end
end
else
-- go through all files and replace one by one
for _, dependency in pairs(dependencies) do
- if mode == "update" and ((dependency == "system" and local_boot_version == remote_boot_version) or (local_app_version == remote_app_version)) then
- -- skip system package if unchanged, skip app package if not changed
- -- skip packages that have no version if app version didn't change
- term.setTextColor(colors.white)
- print("skipping install of unchanged package ")
- term.setTextColor(colors.blue)
- println(dependency)
+ if mode == "update" and unchanged(dependency) then
+ pkg_message("skipping install of unchanged package", dependency)
else
- term.setTextColor(colors.white)
- print("installing package ")
- term.setTextColor(colors.blue)
- println(dependency)
-
+ pkg_message("installing package", dependency)
term.setTextColor(colors.lightGray)
+
local files = file_list[dependency]
for _, file in pairs(files) do
if mode == "install" or file ~= config_file then
@@ -534,16 +539,16 @@ elseif mode == "install" or mode == "update" then
write_install_manifest(manifest, dependencies)
term.setTextColor(colors.green)
if mode == "install" then
- println("installation completed successfully")
+ println("Installation completed successfully.")
else
- println("update completed successfully")
+ println("Update completed successfully.")
end
else
term.setTextColor(colors.red)
if mode == "install" then
- println("installation failed, files may have been skipped")
+ println("Installation failed, files may have been skipped.")
else
- println("update failed, files may have been skipped")
+ println("Update failed, files may have been skipped.")
end
end
end
@@ -576,8 +581,8 @@ elseif mode == "remove" or mode == "purge" then
println("purging all " .. app .. " files...")
end
----@diagnostic disable-next-line: undefined-field
- os.sleep(2)
+ -- ask for confirmation
+ if not ask_y_n("Continue?", false) then return end
local file_list = manifest.files
local dependencies = manifest.depends[app]
@@ -666,7 +671,7 @@ elseif mode == "remove" or mode == "purge" then
end
term.setTextColor(colors.green)
- println("done!")
+ println("Done!")
end
term.setTextColor(colors.white)
diff --git a/graphics/core.lua b/graphics/core.lua
index 58b6b8c..d99ef3b 100644
--- a/graphics/core.lua
+++ b/graphics/core.lua
@@ -7,6 +7,8 @@ local flasher = require("graphics.flasher")
local core = {}
+core.version = "1.0.0"
+
core.flasher = flasher
core.events = events
diff --git a/imgen.py b/imgen.py
index bd34822..63f28cf 100644
--- a/imgen.py
+++ b/imgen.py
@@ -23,11 +23,11 @@ def dir_size(path):
return total
# get the version of an application at the provided path
-def get_version(path, is_comms = False):
+def get_version(path, is_lib = False):
ver = ""
- string = "comms.version = \""
+ string = ".version = \""
- if not is_comms:
+ if not is_lib:
string = "_VERSION = \""
f = open(path, "r")
@@ -49,6 +49,7 @@ def make_manifest(size):
"installer" : get_version("./ccmsi.lua"),
"bootloader" : get_version("./startup.lua"),
"comms" : get_version("./scada-common/comms.lua", True),
+ "graphics" : get_version("./graphics/core.lua", True),
"reactor-plc" : get_version("./reactor-plc/startup.lua"),
"rtu" : get_version("./rtu/startup.lua"),
"supervisor" : get_version("./supervisor/startup.lua"),
diff --git a/install_manifest.json b/install_manifest.json
index c75c072..dc82370 100644
--- a/install_manifest.json
+++ b/install_manifest.json
@@ -1 +1 @@
-{"versions": {"installer": "v1.2", "bootloader": "0.2", "comms": "2.0.0", "reactor-plc": "v1.4.6", "rtu": "v1.3.6", "supervisor": "v0.17.7", "coordinator": "v0.16.1", "pocket": "alpha-v0.4.5"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/crypto.lua", "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"], "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/cipher/aes128.lua", "lockbox/cipher/aes256.lua", "lockbox/cipher/aes192.lua", "lockbox/cipher/mode/ofb.lua", "lockbox/cipher/mode/cbc.lua", "lockbox/cipher/mode/ctr.lua", "lockbox/cipher/mode/cfb.lua", "lockbox/mac/hmac.lua", "lockbox/padding/ansix923.lua", "lockbox/padding/pkcs7.lua", "lockbox/padding/zero.lua", "lockbox/padding/isoiec7816.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"], "rtu": ["system", "common", "graphics"], "supervisor": ["system", "common", "graphics"], "coordinator": ["system", "common", "graphics"], "pocket": ["system", "common", "graphics"]}, "sizes": {"manifest": 5781, "system": 1991, "common": 92736, "graphics": 144532, "lockbox": 100797, "reactor-plc": 97335, "rtu": 102240, "supervisor": 315402, "coordinator": 197991, "pocket": 37581}}
\ No newline at end of file
+{"versions": {"installer": "v1.4f", "bootloader": "0.2", "comms": "2.0.0", "graphics": "1.0.0", "reactor-plc": "v1.4.6", "rtu": "v1.3.6", "supervisor": "v0.17.8", "coordinator": "v0.16.1", "pocket": "alpha-v0.4.5"}, "files": {"system": ["initenv.lua", "startup.lua"], "common": ["scada-common/crypto.lua", "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"], "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/cipher/aes128.lua", "lockbox/cipher/aes256.lua", "lockbox/cipher/aes192.lua", "lockbox/cipher/mode/ofb.lua", "lockbox/cipher/mode/cbc.lua", "lockbox/cipher/mode/ctr.lua", "lockbox/cipher/mode/cfb.lua", "lockbox/mac/hmac.lua", "lockbox/padding/ansix923.lua", "lockbox/padding/pkcs7.lua", "lockbox/padding/zero.lua", "lockbox/padding/isoiec7816.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"], "rtu": ["system", "common", "graphics"], "supervisor": ["system", "common", "graphics"], "coordinator": ["system", "common", "graphics"], "pocket": ["system", "common", "graphics"]}, "sizes": {"manifest": 5803, "system": 1991, "common": 92736, "graphics": 144556, "lockbox": 100797, "reactor-plc": 97335, "rtu": 102240, "supervisor": 315388, "coordinator": 197991, "pocket": 37581}}
\ No newline at end of file
diff --git a/supervisor/facility.lua b/supervisor/facility.lua
index e3b8059..5864ea5 100644
--- a/supervisor/facility.lua
+++ b/supervisor/facility.lua
@@ -75,7 +75,7 @@ function facility.new(num_reactors, cooling_conf)
burn_target = 0.1, -- burn rate target for aggregate burn mode
charge_setpoint = 0, -- FE charge target setpoint
gen_rate_setpoint = 0, -- FE/t charge rate target setpoint
- group_map = { 0, 0, 0, 0 }, -- units -> group IDs
+ group_map = {}, -- units -> group IDs
prio_defs = { {}, {}, {}, {} }, -- priority definitions (each level is a table of units)
at_max_burn = false,
ascram = false,
@@ -109,6 +109,7 @@ function facility.new(num_reactors, cooling_conf)
-- create units
for i = 1, num_reactors do
table.insert(self.units, unit.new(i, cooling_conf[i].BOILERS, cooling_conf[i].TURBINES))
+ table.insert(self.group_map, 0)
end
-- init redstone RTU I/O controller
@@ -790,7 +791,7 @@ function facility.new(num_reactors, cooling_conf)
---@param unit_id integer unit ID
---@param group integer group ID or 0 for independent
function public.set_group(unit_id, group)
- if group >= 0 and group <= 4 and self.mode == PROCESS.INACTIVE then
+ if (group >= 0 and group <= 4) and (unit_id > 0 and unit_id <= num_reactors) and self.mode == PROCESS.INACTIVE then
-- remove from old group if previously assigned
local old_group = self.group_map[unit_id]
if old_group ~= 0 then
diff --git a/supervisor/session/rtu.lua b/supervisor/session/rtu.lua
index d1fbaec..69ba796 100644
--- a/supervisor/session/rtu.lua
+++ b/supervisor/session/rtu.lua
@@ -120,7 +120,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
if u_type == false then
-- validation fail
- log.debug(log_header .. "advertisement unit validation failure")
+ log.debug(log_header .. "_handle_advertisement(): advertisement unit validation failure")
else
if unit_advert.reactor > 0 then
local target_unit = self.fac_units[unit_advert.reactor] ---@type reactor_unit
@@ -146,7 +146,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
-- skip virtual units
log.debug(util.c(log_header, "skipping virtual RTU unit #", i))
else
- log.error(util.c(log_header, "bad advertisement: encountered unsupported reactor-specific RTU type ", type_string))
+ log.warning(util.c(log_header, "_handle_advertisement(): encountered unsupported reactor-specific RTU type ", type_string))
end
else
-- facility RTUs
@@ -172,7 +172,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
-- skip virtual units
log.debug(util.c(log_header, "skipping virtual RTU unit #", i))
else
- log.error(util.c(log_header, "bad advertisement: encountered unsupported reactor-independent RTU type ", type_string))
+ log.warning(util.c(log_header, "_handle_advertisement(): encountered unsupported facility RTU type ", type_string))
end
end
end
@@ -181,9 +181,7 @@ function rtu.new_session(id, s_addr, in_queue, out_queue, timeout, advertisement
self.units[i] = unit
unit_count = unit_count + 1
elseif u_type ~= RTU_UNIT_TYPE.VIRTUAL then
- _reset_config()
- log.error(util.c(log_header, "bad advertisement: error occured while creating a unit (type is ", type_string, ")"))
- break
+ log.warning(util.c(log_header, "_handle_advertisement(): problem occured while creating a unit (type is ", type_string, ")"))
end
end
diff --git a/supervisor/startup.lua b/supervisor/startup.lua
index f03fe1e..0949573 100644
--- a/supervisor/startup.lua
+++ b/supervisor/startup.lua
@@ -20,7 +20,7 @@ local supervisor = require("supervisor.supervisor")
local svsessions = require("supervisor.session.svsessions")
-local SUPERVISOR_VERSION = "v0.17.7"
+local SUPERVISOR_VERSION = "v0.17.9"
local println = util.println
local println_ts = util.println_ts