From 11d86d92eb47daf45a63f3358d893f8c9d20bea2 Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Sat, 19 Aug 2023 20:06:37 -0400 Subject: [PATCH] #232 bugfixes and linked up indicators to data --- coordinator/iocontrol.lua | 172 +++++++++++++++++++++--- coordinator/ui/components/turbine.lua | 2 +- coordinator/ui/components/unit_flow.lua | 57 +++++--- coordinator/ui/layout/flow_view.lua | 40 ++++-- coordinator/ui/style.lua | 10 +- supervisor/unit.lua | 7 +- 6 files changed, 232 insertions(+), 56 deletions(-) diff --git a/coordinator/iocontrol.lua b/coordinator/iocontrol.lua index 9345075..9944fe7 100644 --- a/coordinator/iocontrol.lua +++ b/coordinator/iocontrol.lua @@ -48,6 +48,7 @@ end ---@param conf facility_conf configuration ---@param comms coord_comms comms reference function iocontrol.init(conf, comms) + -- facility data structure ---@class ioctl_facility io.facility = { num_units = conf.num_units, @@ -104,6 +105,101 @@ function iocontrol.init(conf, comms) table.insert(io.facility.sps_ps_tbl, psil.create()) table.insert(io.facility.sps_data_tbl, {}) + -- determine tank information + if io.facility.tank_mode == 0 then + io.facility.tank_defs = {} + -- on facility tank mode 0, setup tank defs to match unit TANK option + for i = 1, conf.num_units do + io.facility.tank_defs[i] = util.trinary(conf.cooling.r_cool[i].TANK, 1, 0) + end + + io.facility.tank_list = { table.unpack(io.facility.tank_defs) } + else + -- decode the layout of tanks from the connections definitions + local tank_mode = io.facility.tank_mode + local tank_defs = io.facility.tank_defs + local tank_list = { table.unpack(tank_defs) } + + local function calc_fdef(start_idx, end_idx) + local first = 4 + for i = start_idx, end_idx do + if io.facility.tank_defs[i] == 2 then + if i < first then first = i end + end + end + return first + end + + if tank_mode == 1 then + -- (1) 1 total facility tank (A A A A) + local first_fdef = calc_fdef(1, #tank_defs) + for i = 1, #tank_defs do + if i > first_fdef and tank_defs[i] == 2 then + tank_list[i] = 0 + end + end + elseif tank_mode == 2 then + -- (2) 2 total facility tanks (A A A B) + local first_fdef = calc_fdef(1, math.min(3, #tank_defs)) + for i = 1, #tank_defs do + if (i ~= 4) and (i > first_fdef) and (tank_defs[i] == 2) then + tank_list[i] = 0 + end + end + elseif tank_mode == 3 then + -- (3) 2 total facility tanks (A A B B) + for _, a in pairs({ 1, 3 }) do + local b = a + 1 + if (tank_defs[a] == 2) and (tank_defs[b] == 2) then + tank_list[b] = 0 + end + end + elseif tank_mode == 4 then + -- (4) 2 total facility tanks (A B B B) + local first_fdef = calc_fdef(2, #tank_defs) + for i = 1, #tank_defs do + if (i ~= 1) and (i > first_fdef) and (tank_defs[i] == 2) then + tank_list[i] = 0 + end + end + elseif tank_mode == 5 then + -- (5) 3 total facility tanks (A A B C) + local first_fdef = calc_fdef(1, math.min(2, #tank_defs)) + for i = 1, #tank_defs do + if (not (i == 3 or i == 4)) and (i > first_fdef) and (tank_defs[i] == 2) then + tank_list[i] = 0 + end + end + elseif tank_mode == 6 then + -- (6) 3 total facility tanks (A B B C) + local first_fdef = calc_fdef(2, math.min(3, #tank_defs)) + for i = 1, #tank_defs do + if (not (i == 1 or i == 4)) and (i > first_fdef) and (tank_defs[i] == 2) then + tank_list[i] = 0 + end + end + elseif tank_mode == 7 then + -- (7) 3 total facility tanks (A B C C) + local first_fdef = calc_fdef(3, #tank_defs) + for i = 1, #tank_defs do + if (not (i == 1 or i == 2)) and (i > first_fdef) and (tank_defs[i] == 2) then + tank_list[i] = 0 + end + end + end + + io.facility.tank_list = tank_list + end + + -- create facility tanks + for i = 1, #io.facility.tank_list do + if io.facility.tank_list[i] == 2 then + table.insert(io.facility.tank_ps_tbl, psil.create()) + table.insert(io.facility.tank_data_tbl, {}) + end + end + + -- create unit data structures io.units = {} for i = 1, conf.num_units do local function ack(alarm) process.ack_alarm(i, alarm) end @@ -191,18 +287,27 @@ function iocontrol.init(conf, comms) tank_data_tbl = {} } + -- on other facility modes, overwrite unit TANK option with facility tank defs + if io.facility.tank_mode ~= 0 then + entry.has_tank = conf.cooling.fac_tank_defs[i] > 0 + end + -- create boiler tables for _ = 1, conf.cooling.r_cool[i].BOILERS do - local data = {} ---@type boilerv_session_db table.insert(entry.boiler_ps_tbl, psil.create()) - table.insert(entry.boiler_data_tbl, data) + table.insert(entry.boiler_data_tbl, {}) end -- create turbine tables for _ = 1, conf.cooling.r_cool[i].TURBINES do - local data = {} ---@type turbinev_session_db table.insert(entry.turbine_ps_tbl, psil.create()) - table.insert(entry.turbine_data_tbl, data) + table.insert(entry.turbine_data_tbl, {}) + end + + -- create tank tables + if entry.has_tank then + table.insert(entry.tank_ps_tbl, psil.create()) + table.insert(entry.tank_data_tbl, {}) end entry.num_boilers = #entry.boiler_data_tbl @@ -211,18 +316,6 @@ function iocontrol.init(conf, comms) table.insert(io.units, entry) end - -- on facility tank mode 0, setup tank list to match unit TANK option - if io.facility.tank_mode == 0 then - for i = 1, #io.units do - io.facility.tank_defs[i] = util.trinary(conf.cooling.r_cool[i].TANK, 1, 0) - end - -- on other facility modes, overwrite unit TANK option with facility tank list - else - for i = 1, #io.units do - io.units[i].has_tank = conf.cooling.fac_tank_defs[i] > 0 - end - end - -- pass IO control here since it can't be require'd due to a require loop process.init(io, comms) end @@ -697,8 +790,7 @@ function iocontrol.update_unit_statuses(statuses) else local burn_rate_sum = 0.0 local sna_count_sum = 0 - local pu_rate = 0.0 - local po_rate = 0.0 + local pu_rate, po_rate, po_am_rate = 0.0, 0.0, 0.0 -- get all unit statuses for i = 1, #statuses do @@ -792,6 +884,8 @@ function iocontrol.update_unit_statuses(statuses) if type(rtu_statuses) == "table" then -- boiler statuses if type(rtu_statuses.boilers) == "table" then + local boil_sum = 0 + for id = 1, #unit.boiler_ps_tbl do if rtu_statuses.boilers[i] == nil then -- disconnected @@ -809,6 +903,8 @@ function iocontrol.update_unit_statuses(statuses) if rtu_faulted then ps.publish("computed_status", 3) -- faulted elseif data.formed then + boil_sum = boil_sum + data.state.boil_rate + if data.state.boil_rate > 0 then ps.publish("computed_status", 5) -- active else @@ -822,6 +918,8 @@ function iocontrol.update_unit_statuses(statuses) valid = false end end + + unit.unit_ps.publish("boiler_boil_sum", boil_sum) else log.debug(log_header .. "boiler list not a table") valid = false @@ -829,6 +927,8 @@ function iocontrol.update_unit_statuses(statuses) -- turbine statuses if type(rtu_statuses.turbines) == "table" then + local flow_sum = 0 + for id = 1, #unit.turbine_ps_tbl do if rtu_statuses.turbines[i] == nil then -- disconnected @@ -846,6 +946,8 @@ function iocontrol.update_unit_statuses(statuses) if rtu_faulted then ps.publish("computed_status", 3) -- faulted elseif data.formed then + flow_sum = flow_sum + data.state.flow_rate + if data.tanks.energy_fill >= 0.99 then ps.publish("computed_status", 6) -- trip elseif data.state.flow_rate < 100 then @@ -861,6 +963,8 @@ function iocontrol.update_unit_statuses(statuses) valid = false end end + + unit.unit_ps.publish("turbine_flow_sum", flow_sum) else log.debug(log_header .. "turbine list not a table") valid = false @@ -909,8 +1013,11 @@ function iocontrol.update_unit_statuses(statuses) if type(rtu_statuses.sna) == "table" then unit.num_snas = rtu_statuses.sna[1] ---@type integer unit.sna_prod_rate = rtu_statuses.sna[2] ---@type number + unit.sna_peak_rate = rtu_statuses.sna[3] ---@type number + unit.unit_ps.publish("sna_count", unit.num_snas) unit.unit_ps.publish("sna_prod_rate", unit.sna_prod_rate) + unit.unit_ps.publish("sna_peak_rate", unit.sna_peak_rate) sna_count_sum = sna_count_sum + unit.num_snas else @@ -1016,9 +1123,33 @@ function iocontrol.update_unit_statuses(statuses) end -- determine waste production for this unit, add to statistics + local is_pu = unit.waste_product == types.WASTE_PRODUCT.PLUTONIUM - pu_rate = pu_rate + util.trinary(is_pu, burn_rate / 10.0, 0.0) - po_rate = po_rate + util.trinary(not is_pu, math.min(burn_rate / 10.0, unit.sna_prod_rate), 0.0) + local waste_rate = burn_rate / 10.0 + + local u_pu_rate = util.trinary(is_pu, waste_rate, 0.0) + local u_po_rate = util.trinary(not is_pu, math.min(waste_rate, unit.sna_prod_rate), 0.0) + + unit.unit_ps.publish("ws_rate", waste_rate) + unit.unit_ps.publish("pu_rate", u_pu_rate) + unit.unit_ps.publish("po_rate", u_po_rate) + + unit.unit_ps.publish("sna_in", util.trinary(is_pu, 0, burn_rate)) + + if unit.waste_product == types.WASTE_PRODUCT.POLONIUM then + unit.unit_ps.publish("po_pl_rate", u_po_rate) + unit.unit_ps.publish("po_am_rate", 0) + elseif unit.waste_product == types.WASTE_PRODUCT.ANTI_MATTER then + unit.unit_ps.publish("po_pl_rate", 0) + unit.unit_ps.publish("po_am_rate", u_po_rate) + po_am_rate = po_am_rate + u_po_rate + else + unit.unit_ps.publish("po_pl_rate", 0) + unit.unit_ps.publish("po_am_rate", 0) + end + + pu_rate = pu_rate + u_pu_rate + po_rate = po_rate + u_po_rate end end @@ -1026,6 +1157,7 @@ function iocontrol.update_unit_statuses(statuses) io.facility.ps.publish("sna_count", sna_count_sum) io.facility.ps.publish("pu_rate", pu_rate) io.facility.ps.publish("po_rate", po_rate) + io.facility.ps.publish("po_am_rate", po_am_rate) -- update alarm sounder sounder.eval(io.units) diff --git a/coordinator/ui/components/turbine.lua b/coordinator/ui/components/turbine.lua index 0e4cb21..9fb6f50 100644 --- a/coordinator/ui/components/turbine.lua +++ b/coordinator/ui/components/turbine.lua @@ -31,7 +31,7 @@ local function new_view(root, x, y, ps) local flow_rate = DataIndicator{parent=turbine,x=5,y=4,lu_colors=lu_col,label="",unit="mB/t",format="%10.0f",value=0,commas=true,width=16,fg_bg=text_fg_bg} status.register(ps, "computed_status", status.update) - prod_rate.register(ps, "prod_rate", function (val) prod_rate.update(util.joules_to_fe(val)) end) + prod_rate.register(ps, "steam_input_rate", function (val) prod_rate.update(util.joules_to_fe(val)) end) flow_rate.register(ps, "flow_rate", flow_rate.update) local steam = VerticalBar{parent=turbine,x=2,y=1,fg_bg=cpair(colors.white,colors.gray),height=4,width=1} diff --git a/coordinator/ui/components/unit_flow.lua b/coordinator/ui/components/unit_flow.lua index 2c8db41..6a81e22 100644 --- a/coordinator/ui/components/unit_flow.lua +++ b/coordinator/ui/components/unit_flow.lua @@ -103,8 +103,11 @@ local function make(parent, x, y, wide, unit) PipeNetwork{parent=root,x=20,y=1,pipes=rc_pipes,bg=colors.lightGray} if unit.num_boilers > 0 then - local hc_rate = DataIndicator{parent=root,x=_wide(25,22),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=287000000,commas=true,width=16,fg_bg=bw_fg_bg} - local cc_rate = DataIndicator{parent=root,x=_wide(25,22),y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=287000000,commas=true,width=16,fg_bg=bw_fg_bg} + local cc_rate = DataIndicator{parent=root,x=_wide(25,22),y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} + local hc_rate = DataIndicator{parent=root,x=_wide(25,22),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} + + cc_rate.register(unit.unit_ps, "boil_sum", cc_rate.update) + hc_rate.register(unit.unit_ps, "heating_rate", hc_rate.update) local boiler = Rectangle{parent=root,x=_wide(47,40),y=1,border=border(1, colors.gray, true),width=19,height=5,fg_bg=wh_gray} TextBox{parent=boiler,y=1,text="THERMO-ELECTRIC",alignment=TEXT_ALIGN.CENTER,height=1} @@ -112,22 +115,29 @@ local function make(parent, x, y, wide, unit) TextBox{parent=root,x=_wide(47,40),y=2,text="\x1b \x80 \x1a",width=1,height=3,fg_bg=lg_gray} TextBox{parent=root,x=_wide(65,58),y=2,text="\x1b \x80 \x1a",width=1,height=3,fg_bg=lg_gray} - local wt_rate = DataIndicator{parent=root,x=_wide(71,61),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=287000000,commas=true,width=16,fg_bg=bw_fg_bg} - local st_rate = DataIndicator{parent=root,x=_wide(71,61),y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=287000000,commas=true,width=16,fg_bg=bw_fg_bg} + local wt_rate = DataIndicator{parent=root,x=_wide(71,61),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} + local st_rate = DataIndicator{parent=root,x=_wide(71,61),y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} + + wt_rate.register(unit.unit_ps, "turbine_flow_sum", wt_rate.update) + st_rate.register(unit.unit_ps, "boil_sum", st_rate.update) else - local wt_rate = DataIndicator{parent=root,x=28,y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=287000000,commas=true,width=16,fg_bg=bw_fg_bg} - local st_rate = DataIndicator{parent=root,x=28,y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=287000000,commas=true,width=16,fg_bg=bw_fg_bg} + local wt_rate = DataIndicator{parent=root,x=28,y=3,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} + local st_rate = DataIndicator{parent=root,x=28,y=5,lu_colors=lu_c,label="",unit="mB/t",format="%11.0f",value=0,commas=true,width=16,fg_bg=bw_fg_bg} + + wt_rate.register(unit.unit_ps, "turbine_flow_sum", wt_rate.update) + st_rate.register(unit.unit_ps, "heating_rate", st_rate.update) end local turbine = Rectangle{parent=root,x=_wide(93,79),y=1,border=border(1, colors.gray, true),width=19,height=5,fg_bg=wh_gray} TextBox{parent=turbine,y=1,text="STEAM TURBINE",alignment=TEXT_ALIGN.CENTER,height=1} - TextBox{parent=turbine,y=3,text="GENERATORS",alignment=TEXT_ALIGN.CENTER,height=1} + TextBox{parent=turbine,y=3,text=util.trinary(unit.num_turbines>1,"GENERATORS","GENERATOR"),alignment=TEXT_ALIGN.CENTER,height=1} TextBox{parent=root,x=_wide(93,79),y=2,text="\x1a \x80 \x1b",width=1,height=3,fg_bg=lg_gray} for i = 1, unit.num_turbines do local ry = 1 + (2 * (i - 1)) + prv_yo TextBox{parent=root,x=_wide(125,103),y=ry,text="\x10\x11\x7f",fg_bg=text_c,width=3,height=1} local state = TriIndicatorLight{parent=root,x=_wide(129,107),y=ry,label=v_names[i+4],c1=colors.gray,c2=colors.yellow,c3=colors.red} + state.register(unit.turbine_ps_tbl[i], "SteamDumpOpen", state.update) end ---------------------- @@ -168,12 +178,19 @@ local function make(parent, x, y, wide, unit) TextBox{parent=waste,x=mx,y=my+1,text=name,alignment=TEXT_ALIGN.CENTER,fg_bg=wh_gray,width=l,height=1} end - local waste_rate = DataIndicator{parent=waste,x=1,y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.2f",value=1234.56,width=12,fg_bg=bw_fg_bg} - local pu_rate = DataIndicator{parent=waste,x=_wide(82,70),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=123.456,width=12,fg_bg=bw_fg_bg} - local po_rate = DataIndicator{parent=waste,x=_wide(52,45),y=6,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=123.456,width=12,fg_bg=bw_fg_bg} - local popl_rate = DataIndicator{parent=waste,x=_wide(82,70),y=6,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=123.456,width=12,fg_bg=bw_fg_bg} - local poam_rate = DataIndicator{parent=waste,x=_wide(82,70),y=10,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=123.456,width=12,fg_bg=bw_fg_bg} - local spent_rate = DataIndicator{parent=waste,x=_wide(117,99),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=123.456,width=12,fg_bg=bw_fg_bg} + local waste_rate = DataIndicator{parent=waste,x=1,y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.2f",value=0,width=12,fg_bg=bw_fg_bg} + local pu_rate = DataIndicator{parent=waste,x=_wide(82,70),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} + local po_rate = DataIndicator{parent=waste,x=_wide(52,45),y=6,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} + local popl_rate = DataIndicator{parent=waste,x=_wide(82,70),y=6,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} + local poam_rate = DataIndicator{parent=waste,x=_wide(82,70),y=10,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} + local spent_rate = DataIndicator{parent=waste,x=_wide(117,99),y=3,lu_colors=lu_c,label="",unit="mB/t",format="%7.3f",value=0,width=12,fg_bg=bw_fg_bg} + + waste_rate.register(unit.unit_ps, "act_burn_rate", waste_rate.update) + pu_rate.register(unit.unit_ps, "pu_rate", pu_rate.update) + po_rate.register(unit.unit_ps, "po_rate", po_rate.update) + popl_rate.register(unit.unit_ps, "po_pl_rate", popl_rate.update) + poam_rate.register(unit.unit_ps, "po_am_rate", poam_rate.update) + spent_rate.register(unit.unit_ps, "ws_rate", spent_rate.update) _valve(_wide(21, 18), 2, 1) _valve(_wide(21, 18), 6, 2) @@ -188,10 +205,16 @@ local function make(parent, x, y, wide, unit) TextBox{parent=waste,x=_wide(30,25),y=3,text="SNAs [Po]",alignment=TEXT_ALIGN.CENTER,width=19,height=1,fg_bg=wh_gray} local sna_po = Rectangle{parent=waste,x=_wide(30,25),y=4,border=border(1, colors.gray, true),width=19,height=7,thin=true,fg_bg=bw_fg_bg} local sna_act = IndicatorLight{parent=sna_po,label="ACTIVE",colors=ind_grn} - local sna_cnt = DataIndicator{parent=sna_po,x=12,y=1,lu_colors=lu_c,label="CNT",unit="",format="%2d",value=99,width=7} - local sna_pk = DataIndicator{parent=sna_po,y=3,lu_colors=lu_c,label="PEAK",unit="mB/t",format="%7.2f",value=1000,width=17} - local sna_max = DataIndicator{parent=sna_po,lu_colors=lu_c,label="MAX ",unit="mB/t",format="%7.2f",value=1000,width=17} - local sna_in = DataIndicator{parent=sna_po,lu_colors=lu_c,label="IN ",unit="mB/t",format="%7.2f",value=1000,width=17} + local sna_cnt = DataIndicator{parent=sna_po,x=12,y=1,lu_colors=lu_c,label="CNT",unit="",format="%2d",value=0,width=7} + local sna_pk = DataIndicator{parent=sna_po,y=3,lu_colors=lu_c,label="PEAK",unit="mB/t",format="%7.2f",value=0,width=17} + local sna_max = DataIndicator{parent=sna_po,lu_colors=lu_c,label="MAX ",unit="mB/t",format="%7.2f",value=0,width=17} + local sna_in = DataIndicator{parent=sna_po,lu_colors=lu_c,label="IN ",unit="mB/t",format="%7.2f",value=0,width=17} + + sna_act.register(unit.unit_ps, "po_rate", function (r) sna_act.update(r > 0) end) + sna_cnt.register(unit.unit_ps, "sna_count", sna_cnt.update) + sna_pk.register(unit.unit_ps, "sna_peak_rate", sna_pk.update) + sna_max.register(unit.unit_ps, "sna_prod_rate", sna_max.update) + sna_in.register(unit.unit_ps, "sna_in", sna_in.update) return root end diff --git a/coordinator/ui/layout/flow_view.lua b/coordinator/ui/layout/flow_view.lua index f309b63..ef527cf 100644 --- a/coordinator/ui/layout/flow_view.lua +++ b/coordinator/ui/layout/flow_view.lua @@ -39,7 +39,7 @@ local function init(main) local units = iocontrol.get_db().units local tank_defs = facility.tank_defs - local tank_draw = { table.unpack(tank_defs) } + local tank_list = facility.tank_list -- window header message local header = TextBox{parent=main,y=1,text="Facility Coolant and Waste Flow Monitor",alignment=TEXT_ALIGN.CENTER,height=1,fg_bg=style.header} @@ -106,7 +106,6 @@ local function init(main) if i == first_fdef then table.insert(water_pipes, pipe(0, y, 1, y + 6, colors.blue, true)) elseif i > first_fdef then - if tank_defs[i] == 2 then tank_draw[i] = 0 end if i == last_fdef then table.insert(water_pipes, pipe(0, y - 13, 0, y, colors.blue, true)) elseif i < last_fdef then @@ -127,7 +126,6 @@ local function init(main) elseif i == first_fdef then table.insert(water_pipes, pipe(0, y, 1, y + 6, colors.blue, true)) elseif i > first_fdef then - if tank_defs[i] == 2 then tank_draw[i] = 0 end if i == last_fdef then table.insert(water_pipes, pipe(0, y - 13, 0, y, colors.blue, true)) elseif i < last_fdef then @@ -143,7 +141,6 @@ local function init(main) table.insert(water_pipes, pipe(0, y_ofs(a), 1, y_ofs(a) + 6, colors.blue, true)) if tank_defs[b] == 2 then table.insert(water_pipes, pipe(0, y_ofs(b) - 13, 1, y_ofs(b), colors.blue, true)) - tank_draw[b] = 0 end elseif tank_defs[b] == 2 then table.insert(water_pipes, pipe(0, y_ofs(b), 1, y_ofs(b) + 6, colors.blue, true)) @@ -162,7 +159,6 @@ local function init(main) elseif i == first_fdef then table.insert(water_pipes, pipe(0, y, 1, y + 6, colors.blue, true)) elseif i > first_fdef then - if tank_defs[i] == 2 then tank_draw[i] = 0 end if i == last_fdef then table.insert(water_pipes, pipe(0, y - 13, 0, y, colors.blue, true)) elseif i < last_fdef then @@ -183,7 +179,6 @@ local function init(main) elseif i == first_fdef then table.insert(water_pipes, pipe(0, y, 1, y + 6, colors.blue, true)) elseif i > first_fdef then - if tank_defs[i] == 2 then tank_draw[i] = 0 end if i == last_fdef then table.insert(water_pipes, pipe(0, y - 13, 0, y, colors.blue, true)) elseif i < last_fdef then @@ -204,7 +199,6 @@ local function init(main) elseif i == first_fdef then table.insert(water_pipes, pipe(0, y, 1, y + 6, colors.blue, true)) elseif i > first_fdef then - if tank_defs[i] == 2 then tank_draw[i] = 0 end if i == last_fdef then table.insert(water_pipes, pipe(0, y - 13, 0, y, colors.blue, true)) elseif i < last_fdef then @@ -225,7 +219,6 @@ local function init(main) elseif i == first_fdef then table.insert(water_pipes, pipe(0, y, 1, y + 6, colors.blue, true)) elseif i > first_fdef then - if tank_defs[i] == 2 then tank_draw[i] = 0 end if i == last_fdef then table.insert(water_pipes, pipe(0, y - 13, 0, y, colors.blue, true)) elseif i < last_fdef then @@ -267,10 +260,11 @@ local function init(main) -- DYNAMIC TANKS -- - for i = 1, #tank_draw do - if tank_draw[i] > 0 then + for i = 1, #tank_list do + if tank_list[i] > 0 then local id = "U-" .. i - if tank_draw[i] == 2 then + local f_id = next_f_id + if tank_list[i] == 2 then id = "F-" .. next_f_id next_f_id = next_f_id + 1 end @@ -291,7 +285,19 @@ local function init(main) local tank_amnt = DataIndicator{parent=tank_box,x=2,label="",format="%13d",value=0,unit="mB",lu_colors=lu_col,width=16,fg_bg=bw_fg_bg} TextBox{parent=tank_box,x=2,y=6,text="Water Level",height=1,width=11,fg_bg=style.label} - local ccool = HorizontalBar{parent=tank_box,x=2,y=7,bar_fg_bg=cpair(colors.blue,colors.gray),height=1,width=16} + local level = HorizontalBar{parent=tank_box,x=2,y=7,bar_fg_bg=cpair(colors.blue,colors.gray),height=1,width=16} + + if tank_list[i] == 1 then + status.register(units[i].tank_ps_tbl[1], "computed_status", status.update) + tank_pcnt.register(units[i].tank_ps_tbl[1], "fill", function (f) tank_pcnt.update(f * 100) end) + tank_amnt.register(units[i].tank_ps_tbl[1], "stored", function (sto) tank_amnt.update(sto.amount) end) + level.register(units[i].tank_ps_tbl[1], "fill", level.update) + else + status.register(facility.tank_ps_tbl[f_id], "computed_status", status.update) + tank_pcnt.register(facility.tank_ps_tbl[f_id], "fill", function (f) tank_pcnt.update(f * 100) end) + tank_amnt.register(facility.tank_ps_tbl[f_id], "stored", function (sto) tank_amnt.update(sto.amount) end) + level.register(facility.tank_ps_tbl[f_id], "fill", level.update) + end end end @@ -306,11 +312,17 @@ local function init(main) local status = StateIndicator{parent=sps_box,x=5,y=1,states=style.sps.states,value=1,min_width=14} + status.register(facility.sps_ps_tbl[1], "computed_status", status.update) + TextBox{parent=sps_box,x=2,y=3,text="Input Rate",height=1,width=10,fg_bg=style.label} - local sps_in = DataIndicator{parent=sps_box,x=2,label="",format="%15.2f",value=0,unit="mB/t",lu_colors=lu_col,width=20,fg_bg=bw_fg_bg} + local sps_in = DataIndicator{parent=sps_box,x=2,label="",format="%15.3f",value=0,unit="mB/t",lu_colors=lu_col,width=20,fg_bg=bw_fg_bg} + + sps_in.register(facility.ps, "po_am_rate", sps_in.update) TextBox{parent=sps_box,x=2,y=6,text="Production Rate",height=1,width=15,fg_bg=style.label} - local sps_rate = DataIndicator{parent=sps_box,x=2,label="",format="%15.2f",value=0,unit="\xb5B/t",lu_colors=lu_col,width=20,fg_bg=bw_fg_bg} + local sps_rate = DataIndicator{parent=sps_box,x=2,label="",format="%15d",value=0,unit="\xb5B/t",lu_colors=lu_col,width=20,fg_bg=bw_fg_bg} + + sps_rate.register(facility.sps_ps_tbl[1], "process_rate", function (r) sps_rate.update(r * 1000) end) end return init diff --git a/coordinator/ui/style.lua b/coordinator/ui/style.lua index 837b879..c759643 100644 --- a/coordinator/ui/style.lua +++ b/coordinator/ui/style.lua @@ -219,11 +219,11 @@ style.sps = { text = "RTU FAULT" }, { - color = cpair(colors.black, colors.gray), + color = cpair(colors.white, colors.gray), text = "IDLE" }, { - color = cpair(colors.black, colors.blue), + color = cpair(colors.black, colors.green), text = "ACTIVE" } } @@ -251,7 +251,11 @@ style.dtank = { { color = cpair(colors.black, colors.yellow), text = "LOW FILL" - } + }, + { + color = cpair(colors.black, colors.green), + text = "FILLED" + }, } } diff --git a/supervisor/unit.lua b/supervisor/unit.lua index c233631..ae646f9 100644 --- a/supervisor/unit.lua +++ b/supervisor/unit.lua @@ -813,7 +813,12 @@ function unit.new(reactor_id, num_boilers, num_turbines) end -- basic SNA statistical information - status.sna = { #self.snas, public.get_sna_rate() } + local total_peak = 0 + for i = 1, #self.snas do + local db = self.snas[i].get_db() ---@type sna_session_db + total_peak = total_peak + db.state.peak_production + end + status.sna = { #self.snas, public.get_sna_rate(), total_peak } -- radiation monitors (environment detectors) status.rad_mon = {}