#123 RTU startup without devices, fixed repeat RTU advert handling, added PPM virtual devices, fixed log out of space detection, updated RTU type conversion functions in comms

This commit is contained in:
Mikayla Fischler
2022-11-12 01:35:31 -05:00
parent f940c136bf
commit 1a01bec7e4
18 changed files with 205 additions and 109 deletions

View File

@@ -89,8 +89,12 @@ function rtu.new_session(id, in_queue, out_queue, advertisement, facility_units)
-- parse the recorded advertisement and create unit sub-sessions
local function _handle_advertisement()
self.units = {}
self.rs_io_q = {}
_reset_config()
for i = 1, #self.f_units do
local unit = self.f_units[i] ---@type reactor_unit
unit.purge_rtu_devices(self.id)
end
for i = 1, #self.advert do
local unit = nil ---@type unit_session|nil
@@ -130,6 +134,7 @@ function rtu.new_session(id, in_queue, out_queue, advertisement, facility_units)
if u_type == false then
-- validation fail
log.debug(log_header .. "advertisement unit validation failure")
else
local target_unit = self.f_units[unit_advert.reactor] ---@type reactor_unit
@@ -285,8 +290,13 @@ function rtu.new_session(id, in_queue, out_queue, advertisement, facility_units)
_close()
elseif pkt.type == SCADA_MGMT_TYPES.RTU_ADVERT then
-- RTU unit advertisement
-- handle advertisement; this will re-create all unit sub-sessions
log.debug(log_header .. "received updated advertisement")
-- copy advertisement and remove version tag
self.advert = pkt.data
table.remove(self.advert, 1)
-- handle advertisement; this will re-create all unit sub-sessions
_handle_advertisement()
elseif pkt.type == SCADA_MGMT_TYPES.RTU_DEV_REMOUNT then
if pkt.length == 1 then

View File

@@ -46,7 +46,7 @@ function boilerv.new(session_id, unit_id, advert, out_queue)
local log_tag = "session.rtu(" .. session_id .. ").boilerv(" .. advert.index .. "): "
local self = {
session = unit_session.new(unit_id, advert, out_queue, log_tag, TXN_TAGS),
session = unit_session.new(session_id, unit_id, advert, out_queue, log_tag, TXN_TAGS),
has_build = false,
periodics = {
next_formed_req = 0,

View File

@@ -37,7 +37,7 @@ function envd.new(session_id, unit_id, advert, out_queue)
local log_tag = "session.rtu(" .. session_id .. ").envd(" .. advert.index .. "): "
local self = {
session = unit_session.new(unit_id, advert, out_queue, log_tag, TXN_TAGS),
session = unit_session.new(session_id, unit_id, advert, out_queue, log_tag, TXN_TAGS),
periodics = {
next_rad_req = 0
},

View File

@@ -46,7 +46,7 @@ function imatrix.new(session_id, unit_id, advert, out_queue)
local log_tag = "session.rtu(" .. session_id .. ").imatrix(" .. advert.index .. "): "
local self = {
session = unit_session.new(unit_id, advert, out_queue, log_tag, TXN_TAGS),
session = unit_session.new(session_id, unit_id, advert, out_queue, log_tag, TXN_TAGS),
has_build = false,
periodics = {
next_formed_req = 0,

View File

@@ -61,7 +61,7 @@ function redstone.new(session_id, unit_id, advert, out_queue)
local log_tag = "session.rtu(" .. session_id .. ").redstone(" .. unit_id .. "): "
local self = {
session = unit_session.new(unit_id, advert, out_queue, log_tag, TXN_TAGS),
session = unit_session.new(session_id, unit_id, advert, out_queue, log_tag, TXN_TAGS),
in_q = mqueue.new(),
has_di = false,
has_ai = false,

View File

@@ -43,7 +43,7 @@ function sna.new(session_id, unit_id, advert, out_queue)
local log_tag = "session.rtu(" .. session_id .. ").sna(" .. advert.index .. "): "
local self = {
session = unit_session.new(unit_id, advert, out_queue, log_tag, TXN_TAGS),
session = unit_session.new(session_id, unit_id, advert, out_queue, log_tag, TXN_TAGS),
has_build = false,
periodics = {
next_build_req = 0,

View File

@@ -46,7 +46,7 @@ function sps.new(session_id, unit_id, advert, out_queue)
local log_tag = "session.rtu(" .. session_id .. ").sps(" .. advert.index .. "): "
local self = {
session = unit_session.new(unit_id, advert, out_queue, log_tag, TXN_TAGS),
session = unit_session.new(session_id, unit_id, advert, out_queue, log_tag, TXN_TAGS),
has_build = false,
periodics = {
next_formed_req = 0,

View File

@@ -66,7 +66,7 @@ function turbinev.new(session_id, unit_id, advert, out_queue)
local log_tag = "session.rtu(" .. session_id .. ").turbinev(" .. advert.index .. "): "
local self = {
session = unit_session.new(unit_id, advert, out_queue, log_tag, TXN_TAGS),
session = unit_session.new(session_id, unit_id, advert, out_queue, log_tag, TXN_TAGS),
in_q = mqueue.new(),
has_build = false,
periodics = {

View File

@@ -22,12 +22,13 @@ unit_session.RTU_US_CMDS = RTU_US_CMDS
unit_session.RTU_US_DATA = RTU_US_DATA
-- create a new unit session runner
---@param session_id integer RTU session ID
---@param unit_id integer MODBUS unit ID
---@param advert rtu_advertisement RTU advertisement for this unit
---@param out_queue mqueue send queue
---@param log_tag string logging tag
---@param txn_tags table transaction log tags
function unit_session.new(unit_id, advert, out_queue, log_tag, txn_tags)
function unit_session.new(session_id, unit_id, advert, out_queue, log_tag, txn_tags)
local self = {
log_tag = log_tag,
txn_tags = txn_tags,
@@ -132,6 +133,8 @@ function unit_session.new(unit_id, advert, out_queue, log_tag, txn_tags)
-- PUBLIC FUNCTIONS --
-- get the unit ID
function public.get_session_id() return session_id end
-- get the unit ID
function public.get_unit_id() return self.unit_id end
-- get the device index

View File

@@ -401,6 +401,14 @@ function unit.new(for_reactor, num_boilers, num_turbines)
table.insert(self.redstone[field], accessor)
end
-- purge devices associated with the given RTU session ID
---@param session integer RTU session ID
function public.purge_rtu_devices(session)
util.filter_table(self.turbines, function (s) return s.get_session_id() ~= session end)
util.filter_table(self.boilers, function (s) return s.get_session_id() ~= session end)
util.filter_table(self.redstone, function (s) return s.get_session_id() ~= session end)
end
-- UPDATE SESSION --
-- update (iterate) this unit

View File

@@ -13,7 +13,7 @@ local svsessions = require("supervisor.session.svsessions")
local config = require("supervisor.config")
local supervisor = require("supervisor.supervisor")
local SUPERVISOR_VERSION = "beta-v0.7.3"
local SUPERVISOR_VERSION = "beta-v0.7.4"
local print = util.print
local println = util.println