diff --git a/coordinator/session/pocket.lua b/coordinator/session/pocket.lua index aba0584..fa702c9 100644 --- a/coordinator/session/pocket.lua +++ b/coordinator/session/pocket.lua @@ -238,6 +238,26 @@ function pocket.new_session(id, s_addr, i_seq_num, in_queue, out_queue, timeout) _send(CRDN_TYPE.API_GET_UNIT, data) end end + elseif pkt.type == CRDN_TYPE.API_GET_CTRL then + local data = {} + + for i = 1, #db.units do + local u = db.units[i] + + data[i] = { + u.connected, + u.reactor_data.rps_tripped, + u.reactor_data.mek_status.status, + u.reactor_data.mek_status.temp, + u.reactor_data.mek_status.burn_rate, + u.reactor_data.mek_status.act_burn_rate, + u.reactor_data.mek_struct.max_burn, + u.annunciator.AutoControl, + u.a_group + } + + _send(CRDN_TYPE.API_GET_CTRL, data) + end else log.debug(log_tag .. "handler received unsupported CRDN packet type " .. pkt.type) end diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 950fdfc..d712fa9 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -19,7 +19,7 @@ local renderer = require("coordinator.renderer") local sounder = require("coordinator.sounder") local threads = require("coordinator.threads") -local COORDINATOR_VERSION = "v1.5.10" +local COORDINATOR_VERSION = "v1.5.11" local CHUNK_LOAD_DELAY_S = 30.0 diff --git a/pocket/iocontrol.lua b/pocket/iocontrol.lua index 89b96c5..3850795 100644 --- a/pocket/iocontrol.lua +++ b/pocket/iocontrol.lua @@ -6,6 +6,7 @@ local const = require("scada-common.constants") local psil = require("scada-common.psil") local types = require("scada-common.types") local util = require("scada-common.util") +local log = require("scada-common.log") local process = require("pocket.process") @@ -92,7 +93,8 @@ function iocontrol.init_core(pkt_comms, nav, cfg) -- API access ---@class pocket_ioctl_api io.api = { - get_unit = function (unit) comms.api__get_unit(unit) end + get_unit = function (unit) comms.api__get_unit(unit) end, + get_ctrl = function () comms.api__get_control() end } end @@ -526,6 +528,12 @@ function iocontrol.record_unit_data(data) end end + if type(unit.reactor_data.mek_struct) == "table" then + for key, val in pairs(unit.reactor_data.mek_struct) do + unit.unit_ps.publish(key, val) + end + end + if type(unit.reactor_data.mek_status) == "table" then for key, val in pairs(unit.reactor_data.mek_status) do unit.unit_ps.publish(key, val) @@ -823,6 +831,54 @@ function iocontrol.record_unit_data(data) --#endregion end +---@param data table +function iocontrol.record_control_data(data) + for u_id = 1, #data do + local unit = io.units[u_id] + local u_data = data[u_id] + + if type(u_data) ~= "table" then + log.debug(util.c("iocontrol.record_control_data: unit ", u_id, " data invalid")) + else + unit.connected = u_data[1] + + unit.reactor_data.rps_tripped = u_data[2] + unit.unit_ps.publish("rps_tripped", u_data[2]) + unit.reactor_data.mek_status.status = u_data[3] + unit.unit_ps.publish("status", u_data[3]) + unit.reactor_data.mek_status.temp = u_data[4] + unit.unit_ps.publish("temp", u_data[4]) + unit.reactor_data.mek_status.burn_rate = u_data[5] + unit.unit_ps.publish("burn_rate", u_data[5]) + unit.reactor_data.mek_status.act_burn_rate = u_data[6] + unit.unit_ps.publish("act_burn_rate", u_data[6]) + unit.reactor_data.mek_struct.max_burn = u_data[7] + unit.unit_ps.publish("max_burn", u_data[7]) + + unit.annunciator.AutoControl = u_data[8] + unit.unit_ps.publish("AutoControl", u_data[8]) + + unit.a_group = u_data[9] + unit.unit_ps.publish("auto_group_id", unit.a_group) + unit.unit_ps.publish("auto_group", types.AUTO_GROUP_NAMES[unit.a_group + 1]) + + local control_status = 1 + + if unit.connected then + if unit.reactor_data.rps_tripped then + control_status = 2 + end + + if unit.reactor_data.mek_status.status then + control_status = util.trinary(unit.annunciator.AutoControl, 4, 3) + end + end + + unit.unit_ps.publish("U_ControlStatus", control_status) + end + end +end + -- get the IO controller database function iocontrol.get_db() return io end diff --git a/pocket/pocket.lua b/pocket/pocket.lua index b8038f5..a625907 100644 --- a/pocket/pocket.lua +++ b/pocket/pocket.lua @@ -550,6 +550,11 @@ function pocket.comms(version, nic, sv_watchdog, api_watchdog, nav) if self.api.linked then _send_api(CRDN_TYPE.API_GET_UNIT, { unit }) end end + -- coordinator get control app data + function public.api__get_control() + if self.api.linked then _send_api(CRDN_TYPE.API_GET_CTRL, {}) end + end + -- send a facility command ---@param cmd FAC_COMMAND command ---@param option any? optional option options for the optional options (like waste mode) @@ -702,6 +707,10 @@ function pocket.comms(version, nic, sv_watchdog, api_watchdog, nav) if _check_length(packet, 12) and type(packet.data[1]) == "number" and iocontrol.get_db().units[packet.data[1]] then iocontrol.record_unit_data(packet.data) end + elseif packet.type == CRDN_TYPE.API_GET_CTRL then + if _check_length(packet, #iocontrol.get_db().units) then + iocontrol.record_control_data(packet.data) + end else _fail_type(packet) end else log.debug("discarding coordinator SCADA_CRDN packet before linked") diff --git a/pocket/startup.lua b/pocket/startup.lua index c31b599..2a508e3 100644 --- a/pocket/startup.lua +++ b/pocket/startup.lua @@ -20,7 +20,7 @@ local pocket = require("pocket.pocket") local renderer = require("pocket.renderer") local threads = require("pocket.threads") -local POCKET_VERSION = "v0.12.2-alpha" +local POCKET_VERSION = "v0.12.3-alpha" local println = util.println local println_ts = util.println_ts diff --git a/pocket/ui/apps/control.lua b/pocket/ui/apps/control.lua index a9129b4..59b1ffd 100644 --- a/pocket/ui/apps/control.lua +++ b/pocket/ui/apps/control.lua @@ -105,21 +105,21 @@ local function new_view(root) app.switcher(active_unit) end + local last_update = 0 + -- refresh data callback, every 500ms it will re-send the query + local function update() + if util.time_ms() - last_update >= 500 then + db.api.get_ctrl() + last_update = util.time_ms() + end + end + for i = 1, db.facility.num_units do local u_pane = panes[i] local u_div = Div{parent=u_pane,x=2,width=main.get_width()-2} local unit = db.units[i] local u_ps = unit.unit_ps - -- refresh data callback, every 500ms it will re-send the query - local last_update = 0 - local function update() - if util.time_ms() - last_update >= 500 then - db.api.get_unit(i) - last_update = util.time_ms() - end - end - local u_page = app.new_page(nil, i) u_page.tasks = { update } diff --git a/scada-common/comms.lua b/scada-common/comms.lua index 6f12fb2..a1281ce 100644 --- a/scada-common/comms.lua +++ b/scada-common/comms.lua @@ -18,7 +18,7 @@ local comms = {} -- protocol/data versions (protocol/data independent changes tracked by util.lua version) comms.version = "3.0.0" -comms.api_version = "0.0.4" +comms.api_version = "0.0.5" ---@enum PROTOCOL local PROTOCOL = { @@ -67,7 +67,8 @@ local CRDN_TYPE = { UNIT_STATUSES = 5, -- state of each of the reactor units UNIT_CMD = 6, -- command a reactor unit API_GET_FAC = 7, -- API: get all the facility data - API_GET_UNIT = 8 -- API: get reactor unit data + API_GET_UNIT = 8, -- API: get reactor unit data + API_GET_CTRL = 9 -- API: get data used for the control app } ---@enum ESTABLISH_ACK