diff --git a/supervisor/facility.lua b/supervisor/facility.lua
index d03ad94..641f0c5 100644
--- a/supervisor/facility.lua
+++ b/supervisor/facility.lua
@@ -1,22 +1,27 @@
-local const = require("scada-common.constants")
-local log = require("scada-common.log")
-local rsio = require("scada-common.rsio")
-local types = require("scada-common.types")
-local util = require("scada-common.util")
+local const = require("scada-common.constants")
+local log = require("scada-common.log")
+local rsio = require("scada-common.rsio")
+local types = require("scada-common.types")
+local util = require("scada-common.util")
-local unit = require("supervisor.unit")
+local unit = require("supervisor.unit")
-local rsctl = require("supervisor.session.rsctl")
+local qtypes = require("supervisor.session.rtu.qtypes")
-local PROCESS = types.PROCESS
-local PROCESS_NAMES = types.PROCESS_NAMES
-local PRIO = types.ALARM_PRIORITY
-local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE
-local WASTE = types.WASTE_PRODUCT
-local WASTE_MODE = types.WASTE_MODE
+local rsctl = require("supervisor.session.rsctl")
+
+local PROCESS = types.PROCESS
+local PROCESS_NAMES = types.PROCESS_NAMES
+local PRIO = types.ALARM_PRIORITY
+local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE
+local CONTAINER_MODE = types.CONTAINER_MODE
+local WASTE = types.WASTE_PRODUCT
+local WASTE_MODE = types.WASTE_MODE
local IO = rsio.IO
+local DTV_RTU_S_DATA = qtypes.DTV_RTU_S_DATA
+
-- 7.14 kJ per blade for 1 mB of fissile fuel
-- 2856 FE per blade per 1 mB, 285.6 FE per blade per 0.1 mB (minimum)
local POWER_PER_BLADE = util.joules_to_fe(7140)
@@ -732,24 +737,47 @@ function facility.new(num_reactors, cooling_conf)
self.io_ctl.digital_write(IO.F_ALARM, has_alarm)
end
- -----------------------------
- -- Update Waste Processing --
- -----------------------------
+ ----------------
+ -- Unit Tasks --
+ ----------------
local insufficent_po_rate = false
+ local need_emcool = false
+
for i = 1, #self.units do
local u = self.units[i] ---@type reactor_unit
+
+ -- update auto waste processing
if u.get_control_inf().waste_mode == WASTE_MODE.AUTO then
if (u.get_sna_rate() * 10.0) < u.get_burn_rate() then
insufficent_po_rate = true
- break
end
end
+
+ -- check if unit activated emergency coolant & uses facility tanks
+ if (cooling_conf.fac_tank_mode > 0) and u.is_emer_cool_tripped() and (cooling_conf.fac_tank_defs[i] == 2) then
+ need_emcool = true
+ end
end
+ -- update waste product
if self.waste_product == WASTE.PLUTONIUM or (self.pu_fallback and insufficent_po_rate) then
self.current_waste_product = WASTE.PLUTONIUM
else self.current_waste_product = self.waste_product end
+
+ -- make sure dynamic tanks are allowing outflow if required
+ -- set all, rather than trying to determine which is for which (simpler & safer)
+ -- there should be no need for any to be in fill only mode
+ if need_emcool then
+ for i = 1, #self.tanks do
+ local session = self.tanks[i] ---@type unit_session
+ local tank = session.get_db() ---@type dynamicv_session_db
+
+ if tank.state.container_mode == CONTAINER_MODE.FILL then
+ session.get_cmd_queue().push_data(DTV_RTU_S_DATA.SET_CONT_MODE, CONTAINER_MODE.BOTH)
+ end
+ end
+ end
end
-- call the update function of all units in the facility
diff --git a/supervisor/unit.lua b/supervisor/unit.lua
index cae748d..1d3dd60 100644
--- a/supervisor/unit.lua
+++ b/supervisor/unit.lua
@@ -733,6 +733,10 @@ function unit.new(reactor_id, num_boilers, num_turbines)
return false
end
+ -- check if emergency coolant activation has been tripped
+ ---@nodiscard
+ function public.is_emer_cool_tripped() return self.emcool_opened end
+
-- get build properties of machines
--
-- filter options
diff --git a/supervisor/unitlogic.lua b/supervisor/unitlogic.lua
index 6003ac8..080f529 100644
--- a/supervisor/unitlogic.lua
+++ b/supervisor/unitlogic.lua
@@ -10,11 +10,13 @@ local qtypes = require("supervisor.session.rtu.qtypes")
local RPS_TRIP_CAUSE = types.RPS_TRIP_CAUSE
local TRI_FAIL = types.TRI_FAIL
+local CONTAINER_MODE = types.CONTAINER_MODE
local DUMPING_MODE = types.DUMPING_MODE
local PRIO = types.ALARM_PRIORITY
local ALARM_STATE = types.ALARM_STATE
local TBV_RTU_S_DATA = qtypes.TBV_RTU_S_DATA
+local DTV_RTU_S_DATA = qtypes.DTV_RTU_S_DATA
local IO = rsio.IO
@@ -826,6 +828,16 @@ function logic.handle_redstone(self)
end
end
+ -- make sure dynamic tanks are allowing outflow
+ for i = 1, #self.tanks do
+ local session = self.tanks[i] ---@type unit_session
+ local tank = session.get_db() ---@type dynamicv_session_db
+
+ if tank.state.container_mode == CONTAINER_MODE.FILL then
+ session.get_cmd_queue().push_data(DTV_RTU_S_DATA.SET_CONT_MODE, CONTAINER_MODE.BOTH)
+ end
+ end
+
if self.db.annunciator.EmergencyCoolant > 1 and not self.emcool_opened then
log.info(util.c("UNIT ", self.r_id, " emergency coolant valve opened"))
log.info(util.c("UNIT ", self.r_id, " turbines set to dump excess steam"))