#144 added radiation monitor integration; displays, unit alarms, connection states, other bugfixes

This commit is contained in:
Mikayla Fischler
2023-02-13 22:11:31 -05:00
parent ef27da8daf
commit 1fe2acb5c5
14 changed files with 224 additions and 52 deletions

View File

@@ -149,15 +149,12 @@ function coordinator.new_session(id, in_queue, out_queue, timeout, facility)
for i = 1, #self.units do
local unit = self.units[i] ---@type reactor_unit
local auto_ctl = {}
status[unit.get_id()] = {
unit.get_reactor_status(),
unit.get_rtu_statuses(),
unit.get_annunciator(),
unit.get_alarms(),
unit.get_state(),
auto_ctl
unit.get_state()
}
end

View File

@@ -49,8 +49,9 @@ local facility = {}
function facility.new(num_reactors, cooling_conf)
local self = {
units = {},
induction = {},
redstone = {},
induction = {},
envd = {},
status_text = { "START UP", "initializing..." },
all_sys_ok = false,
-- process control
@@ -199,11 +200,18 @@ function facility.new(num_reactors, cooling_conf)
table.insert(self.induction, imatrix)
end
-- link an environment detector RTU session
---@param envd unit_session
function public.add_envd(envd)
table.insert(self.envd, envd)
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.redstone, function (s) return s.get_session_id() ~= session end)
util.filter_table(self.induction, function (s) return s.get_session_id() ~= session end)
util.filter_table(self.envd, function (s) return s.get_session_id() ~= session end)
end
-- UPDATE --
@@ -211,8 +219,9 @@ function facility.new(num_reactors, cooling_conf)
-- update (iterate) the facility management
function public.update()
-- unlink RTU unit sessions if they are closed
_unlink_disconnected_units(self.induction)
_unlink_disconnected_units(self.redstone)
_unlink_disconnected_units(self.induction)
_unlink_disconnected_units(self.envd)
-- current state for process control
local charge_update = 0
@@ -785,7 +794,15 @@ function facility.new(num_reactors, cooling_conf)
}
end
---@todo other RTU statuses
-- radiation monitors (environment detectors)
status.rad_mon = {}
for i = 1, #self.envd do
local envd = self.envd[i] ---@type unit_session
status.rad_mon[envd.get_device_idx()] = {
envd.is_faulted(),
envd.get_db().radiation
}
end
return status
end

View File

@@ -136,6 +136,10 @@ function rtu.new_session(id, in_queue, out_queue, timeout, advertisement, facili
-- turbine (Mekanism 10.1+)
unit = svrs_turbinev.new(id, i, unit_advert, self.modbus_q)
if type(unit) ~= "nil" then target_unit.add_turbine(unit) end
elseif u_type == RTU_UNIT_TYPES.ENV_DETECTOR then
-- environment detector
unit = svrs_envd.new(id, i, unit_advert, self.modbus_q)
if type(unit) ~= "nil" then target_unit.add_envd(unit) end
else
log.error(util.c(log_header, "bad advertisement: encountered unsupported reactor-specific RTU type ", type_string))
end
@@ -157,6 +161,7 @@ function rtu.new_session(id, in_queue, out_queue, timeout, advertisement, facili
elseif u_type == RTU_UNIT_TYPES.ENV_DETECTOR then
-- environment detector
unit = svrs_envd.new(id, i, unit_advert, self.modbus_q)
if type(unit) ~= "nil" then facility.add_envd(unit) end
else
log.error(util.c(log_header, "bad advertisement: encountered unsupported reactor-independent RTU type ", type_string))
end

View File

@@ -44,7 +44,7 @@ function envd.new(session_id, unit_id, advert, out_queue)
---@class envd_session_db
db = {
last_update = 0,
radiation = {},
radiation = { radiation = 0, unit = "nSv" }, ---@type radiation_reading
radiation_raw = 0
}
}

View File

@@ -73,9 +73,10 @@ function unit.new(for_reactor, num_boilers, num_turbines)
num_turbines = num_turbines,
types = { DT_KEYS = DT_KEYS, AISTATE = AISTATE },
defs = { FLOW_STABILITY_DELAY_MS = FLOW_STABILITY_DELAY_MS },
turbines = {},
boilers = {},
redstone = {},
boilers = {},
turbines = {},
envd = {},
-- auto control
ramp_target_br100 = 0,
-- state tracking
@@ -397,12 +398,19 @@ function unit.new(for_reactor, num_boilers, num_turbines)
end
end
-- link an environment detector RTU session
---@param envd unit_session
function public.add_envd(envd)
table.insert(self.envd, envd)
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)
util.filter_table(self.boilers, function (s) return s.get_session_id() ~= session end)
util.filter_table(self.turbines, function (s) return s.get_session_id() ~= session end)
util.filter_table(self.envd, function (s) return s.get_session_id() ~= session end)
end
--#endregion
@@ -420,9 +428,10 @@ function unit.new(for_reactor, num_boilers, num_turbines)
end
-- unlink RTU unit sessions if they are closed
_unlink_disconnected_units(self.redstone)
_unlink_disconnected_units(self.boilers)
_unlink_disconnected_units(self.turbines)
_unlink_disconnected_units(self.redstone)
_unlink_disconnected_units(self.envd)
-- update degraded state for auto control
self.db.control.degraded = (#self.boilers ~= num_boilers) or (#self.turbines ~= num_turbines) or (self.plc_i == nil)
@@ -709,7 +718,15 @@ function unit.new(for_reactor, num_boilers, num_turbines)
}
end
---@todo other RTU statuses
-- radiation monitors (environment detectors)
status.rad_mon = {}
for i = 1, #self.envd do
local envd = self.envd[i] ---@type unit_session
status.rad_mon[envd.get_device_idx()] = {
envd.is_faulted(),
envd.get_db().radiation
}
end
return status
end

View File

@@ -16,6 +16,11 @@ local aistate_string = {
"RING_BACK_TRIPPING"
}
-- background radiation 0.0000001 Sv/h (99.99 nSv/h)
-- "green tint" radiation 0.00001 Sv/h (10 uSv/h)
-- damaging radiation 0.00006 Sv/h (60 uSv/h)
local RADIATION_ALARM_LEVEL = 0.00005 -- 50 uSv/h, not yet damaging but this isn't good
---@class unit_logic_extension
local logic = {}
@@ -388,8 +393,12 @@ function logic.update_alarms(self)
_update_alarm_state(self, (not plc_cache.ok) and (plc_cache.damage > 99), self.alarms.ContainmentBreach)
-- Containment Radiation
---@todo containment radiation alarm
_update_alarm_state(self, false, self.alarms.ContainmentRadiation)
local rad_alarm = false
for i = 1, #self.envd do
rad_alarm = self.envd[i].get_db().radiation_raw > RADIATION_ALARM_LEVEL
break
end
_update_alarm_state(self, rad_alarm, self.alarms.ContainmentRadiation)
-- Reactor Lost
_update_alarm_state(self, self.had_reactor and self.plc_i == nil, self.alarms.ReactorLost)

View File

@@ -14,7 +14,7 @@ local svsessions = require("supervisor.session.svsessions")
local config = require("supervisor.config")
local supervisor = require("supervisor.supervisor")
local SUPERVISOR_VERSION = "beta-v0.11.4"
local SUPERVISOR_VERSION = "beta-v0.11.5"
local print = util.print
local println = util.println