2022-05-29 18:34:09 +00:00
|
|
|
|
2022-05-04 17:37:01 +00:00
|
|
|
local comms = require("scada-common.comms")
|
2022-05-29 18:34:09 +00:00
|
|
|
local log = require("scada-common.log")
|
|
|
|
local ppm = require("scada-common.ppm")
|
|
|
|
local util = require("scada-common.util")
|
|
|
|
|
|
|
|
local dialog = require("coordinator.util.dialog")
|
|
|
|
|
|
|
|
local print = util.print
|
|
|
|
local println = util.println
|
|
|
|
local print_ts = util.print_ts
|
|
|
|
local println_ts = util.println_ts
|
2022-03-25 16:17:46 +00:00
|
|
|
|
2022-05-10 21:09:02 +00:00
|
|
|
local coordinator = {}
|
|
|
|
|
2022-05-29 18:34:09 +00:00
|
|
|
local function ask_monitor(names)
|
|
|
|
println("available monitors:")
|
|
|
|
for i = 1, #names do
|
|
|
|
print(" " .. names[i])
|
|
|
|
end
|
|
|
|
println("")
|
|
|
|
println("select a monitor or type c to cancel")
|
|
|
|
|
|
|
|
local iface = dialog.ask_options(names, "c")
|
|
|
|
|
|
|
|
if iface ~= false and iface ~= nil then
|
|
|
|
util.filter_table(names, function (x) return x ~= iface end)
|
|
|
|
end
|
|
|
|
|
|
|
|
return iface
|
|
|
|
end
|
|
|
|
|
|
|
|
function coordinator.configure_monitors(num_units)
|
|
|
|
---@class monitors_struct
|
|
|
|
local monitors = {
|
|
|
|
primary = nil,
|
|
|
|
unit_displays = {}
|
|
|
|
}
|
|
|
|
|
|
|
|
local monitors_avail = ppm.get_monitor_list()
|
|
|
|
local names = {}
|
|
|
|
|
|
|
|
-- get all interface names
|
|
|
|
for iface, _ in pairs(monitors_avail) do
|
|
|
|
table.insert(names, iface)
|
|
|
|
end
|
|
|
|
|
|
|
|
-- we need a certain number of monitors (1 per unit + 1 primary display)
|
|
|
|
if #names ~= num_units + 1 then
|
|
|
|
println("not enough monitors connected (need " .. num_units + 1 .. ")")
|
|
|
|
log.warning("insufficient monitors present (need " .. num_units + 1 .. ")")
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
-- attempt to load settings
|
|
|
|
settings.load("/coord.settings")
|
|
|
|
|
|
|
|
---------------------
|
|
|
|
-- PRIMARY DISPLAY --
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
local iface_primary_display = settings.get("PRIMARY_DISPLAY")
|
|
|
|
|
|
|
|
if not util.table_contains(names, iface_primary_display) then
|
|
|
|
println("primary display is not connected")
|
|
|
|
local response = dialog.ask_y_n("would you like to change it", true)
|
|
|
|
if response == false then return false end
|
|
|
|
iface_primary_display = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
while iface_primary_display == nil and #names > 0 do
|
|
|
|
-- lets get a monitor
|
|
|
|
iface_primary_display = ask_monitor(names)
|
|
|
|
end
|
|
|
|
|
|
|
|
if iface_primary_display == false then return false end
|
|
|
|
|
|
|
|
settings.set("PRIMARY_DISPLAY", iface_primary_display)
|
|
|
|
util.filter_table(names, function (x) return x ~= iface_primary_display end)
|
|
|
|
|
|
|
|
monitors.primary = ppm.get_periph(iface_primary_display)
|
|
|
|
|
|
|
|
-------------------
|
|
|
|
-- UNIT DISPLAYS --
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
local unit_displays = settings.get("UNIT_DISPLAYS")
|
|
|
|
|
|
|
|
if unit_displays == nil then
|
|
|
|
unit_displays = {}
|
|
|
|
for i = 1, num_units do
|
|
|
|
local display = nil
|
|
|
|
|
|
|
|
while display == nil and #names > 0 do
|
|
|
|
-- lets get a monitor
|
|
|
|
println("please select monitor for unit " .. i)
|
|
|
|
display = ask_monitor(names)
|
|
|
|
end
|
|
|
|
|
|
|
|
if display == false then return false end
|
|
|
|
|
|
|
|
unit_displays[i] = display
|
|
|
|
end
|
|
|
|
else
|
|
|
|
-- make sure all displays are connected
|
|
|
|
for i = 1, num_units do
|
|
|
|
---@diagnostic disable-next-line: need-check-nil
|
|
|
|
local display = unit_displays[i]
|
|
|
|
|
|
|
|
if not util.table_contains(names, display) then
|
|
|
|
local response = dialog.ask_y_n("unit display " .. i .. " is not connected, would you like to change it?", true)
|
|
|
|
if response == false then return false end
|
|
|
|
display = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
while display == nil and #names > 0 do
|
|
|
|
-- lets get a monitor
|
|
|
|
display = ask_monitor(names)
|
|
|
|
end
|
|
|
|
|
|
|
|
if display == false then return false end
|
|
|
|
|
|
|
|
unit_displays[i] = display
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
settings.set("UNIT_DISPLAYS", unit_displays)
|
|
|
|
settings.save("/coord.settings")
|
|
|
|
|
|
|
|
for i = 1, #unit_displays do
|
|
|
|
monitors.unit_displays[i] = ppm.get_periph(unit_displays[i])
|
|
|
|
end
|
|
|
|
|
|
|
|
return true, monitors
|
|
|
|
end
|
|
|
|
|
2022-03-25 16:17:46 +00:00
|
|
|
-- coordinator communications
|
2022-05-29 18:34:09 +00:00
|
|
|
function coordinator.coord_comms()
|
2022-03-25 16:17:46 +00:00
|
|
|
local self = {
|
|
|
|
reactor_struct_cache = nil
|
|
|
|
}
|
|
|
|
end
|
2022-05-10 21:09:02 +00:00
|
|
|
|
|
|
|
return coordinator
|