diff --git a/scada-common/comms.lua b/scada-common/comms.lua index 2f3ef71..18f2d48 100644 --- a/scada-common/comms.lua +++ b/scada-common/comms.lua @@ -17,7 +17,7 @@ local max_distance = nil local comms = {} -- protocol/data versions (protocol/data independent changes tracked by util.lua version) -comms.version = "3.0.7" +comms.version = "3.0.8" comms.api_version = "0.0.10" ---@enum PROTOCOL @@ -52,9 +52,10 @@ local MGMT_TYPE = { RTU_ADVERT = 3, -- RTU capability advertisement RTU_DEV_REMOUNT = 4, -- RTU multiblock possbily changed (formed, unformed) due to PPM remount RTU_TONE_ALARM = 5, -- instruct RTUs to play specified alarm tones - DIAG_TONE_GET = 6, -- diagnostic: get alarm tones - DIAG_TONE_SET = 7, -- diagnostic: set alarm tones - DIAG_ALARM_SET = 8 -- diagnostic: set alarm to simulate audio for + DIAG_TONE_GET = 6, -- (API) diagnostic: get alarm tones + DIAG_TONE_SET = 7, -- (API) diagnostic: set alarm tones + DIAG_ALARM_SET = 8, -- (API) diagnostic: set alarm to simulate audio for + INFO_LIST_CMP = 9 -- (API) info: list all computers on the network } ---@enum CRDN_TYPE diff --git a/supervisor/session/pocket.lua b/supervisor/session/pocket.lua index fc7098e..b229286 100644 --- a/supervisor/session/pocket.lua +++ b/supervisor/session/pocket.lua @@ -6,6 +6,7 @@ local databus = require("supervisor.databus") local pocket = {} +local DEV_TYPE = comms.DEVICE_TYPE local PROTOCOL = comms.PROTOCOL local MGMT_TYPE = comms.MGMT_TYPE @@ -34,9 +35,10 @@ local PERIODICS = { ---@param in_queue mqueue in message queue ---@param out_queue mqueue out message queue ---@param timeout number communications timeout +---@param sessions svsessions_list list of computer sessions, read-only ---@param facility facility facility data table ---@param fp_ok boolean if the front panel UI is running -function pocket.new_session(id, s_addr, i_seq_num, in_queue, out_queue, timeout, facility, fp_ok) +function pocket.new_session(id, s_addr, i_seq_num, in_queue, out_queue, timeout, sessions, facility, fp_ok) -- print a log message to the terminal as long as the UI isn't running local function println(message) if not fp_ok then util.println_ts(message) end end @@ -182,6 +184,38 @@ function pocket.new_session(id, s_addr, i_seq_num, in_queue, out_queue, timeout, end if not valid then _send_mgmt(MGMT_TYPE.DIAG_ALARM_SET, { false }) end + elseif pkt.type == MGMT_TYPE.INFO_LIST_CMP then + local read = databus.ps.get + +---@diagnostic disable-next-line: undefined-field + local devices = { { DEV_TYPE.SVR, os.getComputerID(), read("version"), 0 } } + + -- add the coordinator if connected + if read("crd_conn") then + table.insert(devices, { DEV_TYPE.CRD, read("crd_addr"), read("crd_fw"), databus.read("crd_rtt") }) + end + + -- add the PLCs if connected + for i = 1, #facility.get_units() do + local tag = "plc_" .. i + if read(tag .. "_conn") then + table.insert(devices, { DEV_TYPE.CRD, read(tag .. "_addr"), read(tag .. "_fw"), read(tag .. "_rtt") }) + end + end + + -- add connected RTUs + for i = 1, #sessions.rtu do + local s = sessions.rtu[i] + table.insert(devices, { DEV_TYPE.RTU, s.s_addr, s.version, read(s.instance.get_id() .. "_rtt") }) + end + + -- add connected pocket computers + for i = 1, #sessions.pdg do + local s = sessions.pdg[i] + table.insert(devices, { DEV_TYPE.PKT, s.s_addr, s.version, read(s.instance.get_id() .. "_rtt") }) + end + + _send_mgmt(MGMT_TYPE.INFO_LIST_CMP, devices) else log.debug(log_tag .. "handler received unsupported SCADA_MGMT packet type " .. pkt.type) end diff --git a/supervisor/session/svsessions.lua b/supervisor/session/svsessions.lua index 087fe19..cb37881 100644 --- a/supervisor/session/svsessions.lua +++ b/supervisor/session/svsessions.lua @@ -47,12 +47,13 @@ local self = { facility = nil, ---@type facility|nil plc_ini_reset = {}, -- lists of connected sessions + ---@class svsessions_list ---@diagnostic disable: missing-fields sessions = { - rtu = {}, ---@type rtu_session_struct - plc = {}, ---@type plc_session_struct - crd = {}, ---@type crd_session_struct - pdg = {} ---@type pdg_session_struct + rtu = {}, ---@type rtu_session_struct[] + plc = {}, ---@type plc_session_struct[] + crd = {}, ---@type crd_session_struct[] + pdg = {} ---@type pdg_session_struct[] }, ---@diagnostic enable: missing-fields -- next session IDs @@ -621,7 +622,7 @@ function svsessions.establish_pdg_session(source_addr, i_seq_num, version) local id = self.next_ids.pdg - pdg_s.instance = pocket.new_session(id, source_addr, i_seq_num, pdg_s.in_queue, pdg_s.out_queue, self.config.PKT_Timeout, self.facility, self.fp_ok) + pdg_s.instance = pocket.new_session(id, source_addr, i_seq_num, pdg_s.in_queue, pdg_s.out_queue, self.config.PKT_Timeout, self.sessions, self.facility, self.fp_ok) table.insert(self.sessions.pdg, pdg_s) local mt = { diff --git a/supervisor/startup.lua b/supervisor/startup.lua index 4a88018..fe49bec 100644 --- a/supervisor/startup.lua +++ b/supervisor/startup.lua @@ -23,7 +23,7 @@ local supervisor = require("supervisor.supervisor") local svsessions = require("supervisor.session.svsessions") -local SUPERVISOR_VERSION = "v1.7.0" +local SUPERVISOR_VERSION = "v1.7.1" local println = util.println local println_ts = util.println_ts