diff --git a/coordinator/renderer.lua b/coordinator/renderer.lua index ffb36bc..fec6629 100644 --- a/coordinator/renderer.lua +++ b/coordinator/renderer.lua @@ -138,9 +138,9 @@ function renderer.close_ui() -- stop blinking indicators flasher.clear() - -- hide to stop animation callbacks - if engine.ui.main_display ~= nil then engine.ui.main_display.hide() end - for _, display in ipairs(engine.ui.unit_displays) do display.hide() end + -- delete element trees + if engine.ui.main_display ~= nil then engine.ui.main_display.delete() end + for _, display in ipairs(engine.ui.unit_displays) do display.delete() end -- report ui as not ready engine.ui_ready = false diff --git a/coordinator/startup.lua b/coordinator/startup.lua index 2944c14..2e08061 100644 --- a/coordinator/startup.lua +++ b/coordinator/startup.lua @@ -20,7 +20,7 @@ local sounder = require("coordinator.sounder") local apisessions = require("coordinator.session.apisessions") -local COORDINATOR_VERSION = "v0.14.0" +local COORDINATOR_VERSION = "v0.15.0" local println = util.println local println_ts = util.println_ts diff --git a/coordinator/ui/components/boiler.lua b/coordinator/ui/components/boiler.lua index 9ed497c..114a0bb 100644 --- a/coordinator/ui/components/boiler.lua +++ b/coordinator/ui/components/boiler.lua @@ -27,9 +27,9 @@ local function new_view(root, x, y, ps) local temp = DataIndicator{parent=boiler,x=5,y=3,lu_colors=lu_col,label="Temp:",unit="K",format="%10.2f",value=0,width=22,fg_bg=text_fg_bg} local boil_r = DataIndicator{parent=boiler,x=5,y=4,lu_colors=lu_col,label="Boil:",unit="mB/t",format="%10.0f",value=0,commas=true,width=22,fg_bg=text_fg_bg} - ps.subscribe("computed_status", status.update) - ps.subscribe("temperature", temp.update) - ps.subscribe("boil_rate", boil_r.update) + status.register(ps, "computed_status", status.update) + temp.register(ps, "temperature", temp.update) + boil_r.register(ps, "boil_rate", boil_r.update) TextBox{parent=boiler,text="H",x=2,y=5,height=1,width=1,fg_bg=text_fg_bg} TextBox{parent=boiler,text="W",x=3,y=5,height=1,width=1,fg_bg=text_fg_bg} @@ -41,10 +41,10 @@ local function new_view(root, x, y, ps) local steam = VerticalBar{parent=boiler,x=27,y=1,fg_bg=cpair(colors.white,colors.gray),height=4,width=1} local ccool = VerticalBar{parent=boiler,x=28,y=1,fg_bg=cpair(colors.lightBlue,colors.gray),height=4,width=1} - ps.subscribe("hcool_fill", hcool.update) - ps.subscribe("water_fill", water.update) - ps.subscribe("steam_fill", steam.update) - ps.subscribe("ccool_fill", ccool.update) + hcool.register(ps, "hcool_fill", hcool.update) + water.register(ps, "water_fill", water.update) + steam.register(ps, "steam_fill", steam.update) + ccool.register(ps, "ccool_fill", ccool.update) end return new_view diff --git a/coordinator/ui/components/imatrix.lua b/coordinator/ui/components/imatrix.lua index c94ff9f..a234cbc 100644 --- a/coordinator/ui/components/imatrix.lua +++ b/coordinator/ui/components/imatrix.lua @@ -50,15 +50,15 @@ local function new_view(root, x, y, data, ps, id) local avg_in = PowerIndicator{parent=rect,x=7,y=9,lu_colors=lu_col,label="Avg. In: ",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg_bg} local avg_out = PowerIndicator{parent=rect,x=7,y=10,lu_colors=lu_col,label="Avg. Out:",format="%8.2f",rate=true,value=0,width=26,fg_bg=text_fg_bg} - ps.subscribe("computed_status", status.update) - ps.subscribe("energy", function (val) energy.update(util.joules_to_fe(val)) end) - ps.subscribe("max_energy", function (val) capacity.update(util.joules_to_fe(val)) end) - ps.subscribe("last_input", function (val) input.update(util.joules_to_fe(val)) end) - ps.subscribe("last_output", function (val) output.update(util.joules_to_fe(val)) end) + status.register(ps, "computed_status", status.update) + energy.register(ps, "energy", function (val) energy.update(util.joules_to_fe(val)) end) + capacity.register(ps, "max_energy", function (val) capacity.update(util.joules_to_fe(val)) end) + input.register(ps, "last_input", function (val) input.update(util.joules_to_fe(val)) end) + output.register(ps, "last_output", function (val) output.update(util.joules_to_fe(val)) end) - ps.subscribe("avg_charge", avg_chg.update) - ps.subscribe("avg_inflow", avg_in.update) - ps.subscribe("avg_outflow", avg_out.update) + avg_chg.register(ps, "avg_charge", avg_chg.update) + avg_in.register(ps, "avg_inflow", avg_in.update) + avg_out.register(ps, "avg_outflow", avg_out.update) local fill = DataIndicator{parent=rect,x=11,y=12,lu_colors=lu_col,label="Fill:",unit="%",format="%8.2f",value=0,width=18,fg_bg=text_fg_bg} @@ -68,10 +68,10 @@ local function new_view(root, x, y, data, ps, id) TextBox{parent=rect,text="Transfer Capacity",x=11,y=17,height=1,width=17,fg_bg=label_fg_bg} local trans_cap = PowerIndicator{parent=rect,x=19,y=18,lu_colors=lu_col,label="",format="%5.2f",rate=true,value=0,width=12,fg_bg=text_fg_bg} - ps.subscribe("cells", cells.update) - ps.subscribe("providers", providers.update) - ps.subscribe("energy_fill", function (val) fill.update(val * 100) end) - ps.subscribe("transfer_cap", function (val) trans_cap.update(util.joules_to_fe(val)) end) + cells.register(ps, "cells", cells.update) + providers.register(ps, "providers", providers.update) + fill.register(ps, "energy_fill", function (val) fill.update(val * 100) end) + trans_cap.register(ps, "transfer_cap", function (val) trans_cap.update(util.joules_to_fe(val)) end) local charge = VerticalBar{parent=rect,x=2,y=2,fg_bg=cpair(colors.green,colors.gray),height=17,width=4} local in_cap = VerticalBar{parent=rect,x=7,y=12,fg_bg=cpair(colors.red,colors.gray),height=7,width=1} @@ -88,9 +88,9 @@ local function new_view(root, x, y, data, ps, id) end end - ps.subscribe("energy_fill", charge.update) - ps.subscribe("last_input", function (val) in_cap.update(calc_saturation(val)) end) - ps.subscribe("last_output", function (val) out_cap.update(calc_saturation(val)) end) + charge.register(ps, "energy_fill", charge.update) + in_cap.register(ps, "last_input", function (val) in_cap.update(calc_saturation(val)) end) + out_cap.register(ps, "last_output", function (val) out_cap.update(calc_saturation(val)) end) end return new_view diff --git a/coordinator/ui/components/processctl.lua b/coordinator/ui/components/processctl.lua index 8719968..a238a8c 100644 --- a/coordinator/ui/components/processctl.lua +++ b/coordinator/ui/components/processctl.lua @@ -55,9 +55,9 @@ local function new_view(root, x, y) local ind_mat = IndicatorLight{parent=main,label="Induction Matrix",colors=cpair(colors.green,colors.gray)} local rad_mon = TriIndicatorLight{parent=main,label="Radiation Monitor",c1=colors.gray,c2=colors.yellow,c3=colors.green} - facility.ps.subscribe("all_sys_ok", all_ok.update) - facility.induction_ps_tbl[1].subscribe("computed_status", function (status) ind_mat.update(status > 1) end) - facility.ps.subscribe("rad_computed_status", rad_mon.update) + all_ok.register(facility.ps, "all_sys_ok", all_ok.update) + ind_mat.register(facility.induction_ps_tbl[1], "computed_status", function (status) ind_mat.update(status > 1) end) + rad_mon.register(facility.ps, "rad_computed_status", rad_mon.update) main.line_break() @@ -66,10 +66,10 @@ local function new_view(root, x, y) local auto_ramp = IndicatorLight{parent=main,label="Process Ramping",colors=cpair(colors.white,colors.gray),flash=true,period=period.BLINK_250_MS} local auto_sat = IndicatorLight{parent=main,label="Min/Max Burn Rate",colors=cpair(colors.yellow,colors.gray)} - facility.ps.subscribe("auto_ready", auto_ready.update) - facility.ps.subscribe("auto_active", auto_act.update) - facility.ps.subscribe("auto_ramping", auto_ramp.update) - facility.ps.subscribe("auto_saturated", auto_sat.update) + auto_ready.register(facility.ps, "auto_ready", auto_ready.update) + auto_act.register(facility.ps, "auto_active", auto_act.update) + auto_ramp.register(facility.ps, "auto_ramping", auto_ramp.update) + auto_sat.register(facility.ps, "auto_saturated", auto_sat.update) main.line_break() @@ -80,20 +80,20 @@ local function new_view(root, x, y) local fac_rad_h = IndicatorLight{parent=main,label="Facility Radiation High",colors=cpair(colors.red,colors.gray),flash=true,period=period.BLINK_250_MS} local gen_fault = IndicatorLight{parent=main,label="Gen. Control Fault",colors=cpair(colors.yellow,colors.gray),flash=true,period=period.BLINK_500_MS} - facility.ps.subscribe("auto_scram", auto_scram.update) - facility.ps.subscribe("as_matrix_dc", matrix_dc.update) - facility.ps.subscribe("as_matrix_fill", matrix_fill.update) - facility.ps.subscribe("as_crit_alarm", unit_crit.update) - facility.ps.subscribe("as_radiation", fac_rad_h.update) - facility.ps.subscribe("as_gen_fault", gen_fault.update) + auto_scram.register(facility.ps, "auto_scram", auto_scram.update) + matrix_dc.register(facility.ps, "as_matrix_dc", matrix_dc.update) + matrix_fill.register(facility.ps, "as_matrix_fill", matrix_fill.update) + unit_crit.register(facility.ps, "as_crit_alarm", unit_crit.update) + fac_rad_h.register(facility.ps, "as_radiation", fac_rad_h.update) + gen_fault.register(facility.ps, "as_gen_fault", gen_fault.update) TextBox{parent=main,y=23,text="Radiation",height=1,width=13,fg_bg=style.label} local radiation = RadIndicator{parent=main,label="",format="%9.3f",lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} - facility.ps.subscribe("radiation", radiation.update) + radiation.register(facility.ps, "radiation", radiation.update) TextBox{parent=main,x=15,y=23,text="Linked RTUs",height=1,width=11,fg_bg=style.label} local rtu_count = DataIndicator{parent=main,x=15,y=24,label="",format="%11d",value=0,lu_colors=lu_cpair,width=11,fg_bg=bw_fg_bg} - facility.ps.subscribe("rtu_count", rtu_count.update) + rtu_count.register(facility.ps, "rtu_count", rtu_count.update) --------------------- -- process control -- @@ -115,8 +115,8 @@ local function new_view(root, x, y) TextBox{parent=burn_target,x=18,y=2,text="mB/t"} local burn_sum = DataIndicator{parent=targets,x=9,y=4,label="",format="%18.1f",value=0,unit="mB/t",commas=true,lu_colors=cpair(colors.black,colors.black),width=23,fg_bg=cpair(colors.black,colors.brown)} - facility.ps.subscribe("process_burn_target", b_target.set_value) - facility.ps.subscribe("burn_sum", burn_sum.update) + b_target.register(facility.ps, "process_burn_target", b_target.set_value) + burn_sum.register(facility.ps, "burn_sum", burn_sum.update) local chg_tag = Div{parent=targets,x=1,y=6,width=8,height=4,fg_bg=cpair(colors.black,colors.purple)} TextBox{parent=chg_tag,x=2,y=2,text="Charge Target",width=7,height=2} @@ -126,8 +126,8 @@ local function new_view(root, x, y) TextBox{parent=chg_target,x=18,y=2,text="MFE"} local cur_charge = DataIndicator{parent=targets,x=9,y=9,label="",format="%19d",value=0,unit="MFE",commas=true,lu_colors=cpair(colors.black,colors.black),width=23,fg_bg=cpair(colors.black,colors.brown)} - facility.ps.subscribe("process_charge_target", c_target.set_value) - facility.induction_ps_tbl[1].subscribe("energy", function (j) cur_charge.update(util.joules_to_fe(j) / 1000000) end) + c_target.register(facility.ps, "process_charge_target", c_target.set_value) + cur_charge.register(facility.induction_ps_tbl[1], "energy", function (j) cur_charge.update(util.joules_to_fe(j) / 1000000) end) local gen_tag = Div{parent=targets,x=1,y=11,width=8,height=4,fg_bg=cpair(colors.black,colors.purple)} TextBox{parent=gen_tag,x=2,y=2,text="Gen. Target",width=7,height=2} @@ -137,8 +137,8 @@ local function new_view(root, x, y) TextBox{parent=gen_target,x=18,y=2,text="kFE/t"} local cur_gen = DataIndicator{parent=targets,x=9,y=14,label="",format="%17d",value=0,unit="kFE/t",commas=true,lu_colors=cpair(colors.black,colors.black),width=23,fg_bg=cpair(colors.black,colors.brown)} - facility.ps.subscribe("process_gen_target", g_target.set_value) - facility.induction_ps_tbl[1].subscribe("last_input", function (j) cur_gen.update(util.round(util.joules_to_fe(j) / 1000)) end) + g_target.register(facility.ps, "process_gen_target", g_target.set_value) + cur_gen.register(facility.induction_ps_tbl[1], "last_input", function (j) cur_gen.update(util.round(util.joules_to_fe(j) / 1000)) end) ----------------- -- unit limits -- @@ -160,12 +160,12 @@ local function new_view(root, x, y) rate_limits[i] = SpinboxNumeric{parent=lim_ctl,x=2,y=1,whole_num_precision=4,fractional_precision=1,min=0.1,arrow_fg_bg=cpair(colors.gray,colors.white),fg_bg=bw_fg_bg} TextBox{parent=lim_ctl,x=9,y=2,text="mB/t",width=4,height=1} - unit.unit_ps.subscribe("max_burn", rate_limits[i].set_max) - unit.unit_ps.subscribe("burn_limit", rate_limits[i].set_value) + rate_limits[i].register(unit.unit_ps, "max_burn", rate_limits[i].set_max) + rate_limits[i].register(unit.unit_ps, "burn_limit", rate_limits[i].set_value) local cur_burn = DataIndicator{parent=limit_div,x=9,y=_y+3,label="",format="%7.1f",value=0,unit="mB/t",commas=false,lu_colors=cpair(colors.black,colors.black),width=14,fg_bg=cpair(colors.black,colors.brown)} - unit.unit_ps.subscribe("act_burn_rate", cur_burn.update) + cur_burn.register(unit.unit_ps, "act_burn_rate", cur_burn.update) end ------------------- @@ -186,8 +186,8 @@ local function new_view(root, x, y) local ready = IndicatorLight{parent=lights,x=2,y=2,label="Ready",colors=cpair(colors.green,colors.gray)} local degraded = IndicatorLight{parent=lights,x=2,y=3,label="Degraded",colors=cpair(colors.red,colors.gray),flash=true,period=period.BLINK_250_MS} - unit.unit_ps.subscribe("U_AutoReady", ready.update) - unit.unit_ps.subscribe("U_AutoDegraded", degraded.update) + ready.register(unit.unit_ps, "U_AutoReady", ready.update) + degraded.register(unit.unit_ps, "U_AutoDegraded", degraded.update) end ------------------------- @@ -197,14 +197,14 @@ local function new_view(root, x, y) local ctl_opts = { "Monitored Max Burn", "Combined Burn Rate", "Charge Level", "Generation Rate" } local mode = RadioButton{parent=proc,x=34,y=1,options=ctl_opts,callback=function()end,radio_colors=cpair(colors.purple,colors.black),radio_bg=colors.gray} - facility.ps.subscribe("process_mode", mode.set_value) + mode.register(facility.ps, "process_mode", mode.set_value) local u_stat = Rectangle{parent=proc,border=border(1,colors.gray,true),thin=true,width=31,height=4,x=1,y=16,fg_bg=bw_fg_bg} local stat_line_1 = TextBox{parent=u_stat,x=1,y=1,text="UNKNOWN",width=31,height=1,alignment=TEXT_ALIGN.CENTER,fg_bg=bw_fg_bg} local stat_line_2 = TextBox{parent=u_stat,x=1,y=2,text="awaiting data...",width=31,height=1,alignment=TEXT_ALIGN.CENTER,fg_bg=cpair(colors.gray, colors.white)} - facility.ps.subscribe("status_line_1", stat_line_1.set_value) - facility.ps.subscribe("status_line_2", stat_line_2.set_value) + stat_line_1.register(facility.ps, "status_line_1", stat_line_1.set_value) + stat_line_2.register(facility.ps, "status_line_2", stat_line_2.set_value) local auto_controls = Div{parent=proc,x=1,y=20,width=31,height=5,fg_bg=cpair(colors.gray,colors.white)} @@ -233,11 +233,14 @@ local function new_view(root, x, y) tcd.dispatch(0.2, function () save.on_response(ack) end) end - facility.ps.subscribe("auto_ready", function (ready) + start.register(facility.ps, "auto_ready", function (ready) if ready and (not facility.auto_active) then start.enable() else start.disable() end end) - facility.ps.subscribe("auto_active", function (active) + -- REGISTER_NOTE: for optimization/brevity, due to not deleting anything but the whole element tree when it comes + -- to the process control display and coordinator GUI as a whole, child elements will not directly be registered here + -- (preventing garbage collection until the parent 'proc' is deleted) + proc.register(facility.ps, "auto_active", function (active) if active then b_target.disable() c_target.disable() @@ -246,9 +249,7 @@ local function new_view(root, x, y) mode.disable() start.disable() - for i = 1, #rate_limits do - rate_limits[i].disable() - end + for i = 1, #rate_limits do rate_limits[i].disable() end else b_target.enable() c_target.enable() @@ -257,9 +258,7 @@ local function new_view(root, x, y) mode.enable() if facility.auto_ready then start.enable() end - for i = 1, #rate_limits do - rate_limits[i].enable() - end + for i = 1, #rate_limits do rate_limits[i].enable() end end end) end diff --git a/coordinator/ui/components/reactor.lua b/coordinator/ui/components/reactor.lua index 578bbba..b4a2c1b 100644 --- a/coordinator/ui/components/reactor.lua +++ b/coordinator/ui/components/reactor.lua @@ -30,10 +30,10 @@ local function new_view(root, x, y, ps) local burn_r = DataIndicator{parent=reactor,x=2,y=4,lu_colors=lu_col,label="Burn Rate:",unit="mB/t",format="%10.2f",value=0,width=26,fg_bg=text_fg_bg} local heating_r = DataIndicator{parent=reactor,x=2,y=5,lu_colors=lu_col,label="Heating:",unit="mB/t",format="%12.0f",value=0,commas=true,width=26,fg_bg=text_fg_bg} - ps.subscribe("computed_status", status.update) - ps.subscribe("temp", core_temp.update) - ps.subscribe("act_burn_rate", burn_r.update) - ps.subscribe("heating_rate", heating_r.update) + status.register(ps, "computed_status", status.update) + core_temp.register(ps, "temp", core_temp.update) + burn_r.register(ps, "act_burn_rate", burn_r.update) + heating_r.register(ps, "heating_rate", heating_r.update) local reactor_fills = Rectangle{parent=root,border=border(1, colors.gray, true),width=24,height=7,x=(x + 29),y=y} @@ -47,7 +47,7 @@ local function new_view(root, x, y, ps) local hcool = HorizontalBar{parent=reactor_fills,x=8,y=4,show_percent=true,bar_fg_bg=cpair(colors.white,colors.gray),height=1,width=14} local waste = HorizontalBar{parent=reactor_fills,x=8,y=5,show_percent=true,bar_fg_bg=cpair(colors.brown,colors.gray),height=1,width=14} - ps.subscribe("ccool_type", function (type) + ccool.register(ps, "ccool_type", function (type) if type == types.FLUID.SODIUM then ccool.recolor(cpair(colors.lightBlue, colors.gray)) else @@ -55,7 +55,7 @@ local function new_view(root, x, y, ps) end end) - ps.subscribe("hcool_type", function (type) + hcool.register(ps, "hcool_type", function (type) if type == types.FLUID.SUPERHEATED_SODIUM then hcool.recolor(cpair(colors.orange, colors.gray)) else @@ -63,10 +63,10 @@ local function new_view(root, x, y, ps) end end) - ps.subscribe("fuel_fill", fuel.update) - ps.subscribe("ccool_fill", ccool.update) - ps.subscribe("hcool_fill", hcool.update) - ps.subscribe("waste_fill", waste.update) + fuel.register(ps, "fuel_fill", fuel.update) + ccool.register(ps, "ccool_fill", ccool.update) + hcool.register(ps, "hcool_fill", hcool.update) + waste.register(ps, "waste_fill", waste.update) end return new_view diff --git a/coordinator/ui/components/turbine.lua b/coordinator/ui/components/turbine.lua index 3bfd731..0e4cb21 100644 --- a/coordinator/ui/components/turbine.lua +++ b/coordinator/ui/components/turbine.lua @@ -30,9 +30,9 @@ local function new_view(root, x, y, ps) local prod_rate = PowerIndicator{parent=turbine,x=5,y=3,lu_colors=lu_col,label="",format="%10.2f",value=0,rate=true,width=16,fg_bg=text_fg_bg} 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} - ps.subscribe("computed_status", status.update) - ps.subscribe("prod_rate", function (val) prod_rate.update(util.joules_to_fe(val)) end) - ps.subscribe("flow_rate", flow_rate.update) + status.register(ps, "computed_status", status.update) + prod_rate.register(ps, "prod_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} local energy = VerticalBar{parent=turbine,x=3,y=1,fg_bg=cpair(colors.green,colors.gray),height=4,width=1} @@ -40,8 +40,8 @@ local function new_view(root, x, y, ps) TextBox{parent=turbine,text="S",x=2,y=5,height=1,width=1,fg_bg=text_fg_bg} TextBox{parent=turbine,text="E",x=3,y=5,height=1,width=1,fg_bg=text_fg_bg} - ps.subscribe("steam_fill", steam.update) - ps.subscribe("energy_fill", energy.update) + steam.register(ps, "steam_fill", steam.update) + energy.register(ps, "energy_fill", energy.update) end return new_view diff --git a/coordinator/ui/components/unit_detail.lua b/coordinator/ui/components/unit_detail.lua index 7181430..12dc6b2 100644 --- a/coordinator/ui/components/unit_detail.lua +++ b/coordinator/ui/components/unit_detail.lua @@ -79,16 +79,16 @@ local function init(parent, id) ----------------------------- local core_map = CoreMap{parent=main,x=2,y=3,reactor_l=18,reactor_w=18} - u_ps.subscribe("temp", core_map.update) - u_ps.subscribe("size", function (s) core_map.resize(s[1], s[2]) end) + core_map.register(u_ps, "temp", core_map.update) + core_map.register(u_ps, "size", function (s) core_map.resize(s[1], s[2]) end) TextBox{parent=main,x=12,y=22,text="Heating Rate",height=1,width=12,fg_bg=style.label} local heating_r = DataIndicator{parent=main,x=12,label="",format="%14.0f",value=0,unit="mB/t",commas=true,lu_colors=lu_cpair,width=19,fg_bg=bw_fg_bg} - u_ps.subscribe("heating_rate", heating_r.update) + heating_r.register(u_ps, "heating_rate", heating_r.update) TextBox{parent=main,x=12,y=25,text="Commanded Burn Rate",height=1,width=19,fg_bg=style.label} local burn_r = DataIndicator{parent=main,x=12,label="",format="%14.2f",value=0,unit="mB/t",lu_colors=lu_cpair,width=19,fg_bg=bw_fg_bg} - u_ps.subscribe("burn_rate", burn_r.update) + burn_r.register(u_ps, "burn_rate", burn_r.update) TextBox{parent=main,text="F",x=2,y=22,width=1,height=1,fg_bg=style.label} TextBox{parent=main,text="C",x=4,y=22,width=1,height=1,fg_bg=style.label} @@ -102,12 +102,12 @@ local function init(parent, id) local hcool = VerticalBar{parent=main,x=8,y=23,fg_bg=cpair(colors.white,colors.gray),height=4,width=1} local waste = VerticalBar{parent=main,x=10,y=23,fg_bg=cpair(colors.brown,colors.gray),height=4,width=1} - u_ps.subscribe("fuel_fill", fuel.update) - u_ps.subscribe("ccool_fill", ccool.update) - u_ps.subscribe("hcool_fill", hcool.update) - u_ps.subscribe("waste_fill", waste.update) + fuel.register(u_ps, "fuel_fill", fuel.update) + ccool.register(u_ps, "ccool_fill", ccool.update) + hcool.register(u_ps, "hcool_fill", hcool.update) + waste.register(u_ps, "waste_fill", waste.update) - u_ps.subscribe("ccool_type", function (type) + ccool.register(u_ps, "ccool_type", function (type) if type == "mekanism:sodium" then ccool.recolor(cpair(colors.lightBlue, colors.gray)) else @@ -115,7 +115,7 @@ local function init(parent, id) end end) - u_ps.subscribe("hcool_type", function (type) + hcool.register(u_ps, "hcool_type", function (type) if type == "mekanism:superheated_sodium" then hcool.recolor(cpair(colors.orange, colors.gray)) else @@ -125,19 +125,19 @@ local function init(parent, id) TextBox{parent=main,x=32,y=22,text="Core Temp",height=1,width=9,fg_bg=style.label} local core_temp = DataIndicator{parent=main,x=32,label="",format="%11.2f",value=0,unit="K",lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} - u_ps.subscribe("temp", core_temp.update) + core_temp.register(u_ps, "temp", core_temp.update) TextBox{parent=main,x=32,y=25,text="Burn Rate",height=1,width=9,fg_bg=style.label} local act_burn_r = DataIndicator{parent=main,x=32,label="",format="%8.2f",value=0,unit="mB/t",lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} - u_ps.subscribe("act_burn_rate", act_burn_r.update) + act_burn_r.register(u_ps, "act_burn_rate", act_burn_r.update) TextBox{parent=main,x=32,y=28,text="Damage",height=1,width=6,fg_bg=style.label} local damage_p = DataIndicator{parent=main,x=32,label="",format="%11.0f",value=0,unit="%",lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} - u_ps.subscribe("damage", damage_p.update) + damage_p.register(u_ps, "damage", damage_p.update) TextBox{parent=main,x=32,y=31,text="Radiation",height=1,width=21,fg_bg=style.label} local radiation = RadIndicator{parent=main,x=32,label="",format="%9.3f",lu_colors=lu_cpair,width=13,fg_bg=bw_fg_bg} - u_ps.subscribe("radiation", radiation.update) + radiation.register(u_ps, "radiation", radiation.update) ------------------- -- system status -- @@ -147,8 +147,8 @@ local function init(parent, id) local stat_line_1 = TextBox{parent=u_stat,x=1,y=1,text="UNKNOWN",width=33,height=1,alignment=TEXT_ALIGN.CENTER,fg_bg=bw_fg_bg} local stat_line_2 = TextBox{parent=u_stat,x=1,y=2,text="awaiting data...",width=33,height=1,alignment=TEXT_ALIGN.CENTER,fg_bg=cpair(colors.gray, colors.white)} - u_ps.subscribe("U_StatusLine1", stat_line_1.set_value) - u_ps.subscribe("U_StatusLine2", stat_line_2.set_value) + stat_line_1.register(u_ps, "U_StatusLine1", stat_line_1.set_value) + stat_line_2.register(u_ps, "U_StatusLine2", stat_line_2.set_value) ----------------- -- annunciator -- @@ -163,9 +163,9 @@ local function init(parent, id) local plc_hbeat = IndicatorLight{parent=annunciator,label="PLC Heartbeat",colors=cpair(colors.white,colors.gray)} local rad_mon = TriIndicatorLight{parent=annunciator,label="Radiation Monitor",c1=colors.gray,c2=colors.yellow,c3=colors.green} - u_ps.subscribe("PLCOnline", plc_online.update) - u_ps.subscribe("PLCHeartbeat", plc_hbeat.update) - u_ps.subscribe("RadiationMonitor", rad_mon.update) + plc_online.register(u_ps, "PLCOnline", plc_online.update) + plc_hbeat.register(u_ps, "PLCHeartbeat", plc_hbeat.update) + rad_mon.register(u_ps, "RadiationMonitor", rad_mon.update) annunciator.line_break() @@ -173,8 +173,8 @@ local function init(parent, id) local r_active = IndicatorLight{parent=annunciator,label="Active",colors=cpair(colors.green,colors.gray)} local r_auto = IndicatorLight{parent=annunciator,label="Automatic Control",colors=cpair(colors.white,colors.gray)} - u_ps.subscribe("status", r_active.update) - u_ps.subscribe("AutoControl", r_auto.update) + r_active.register(u_ps, "status", r_active.update) + r_auto.register(u_ps, "AutoControl", r_auto.update) -- main unit transient/warning annunciator panel local r_scram = IndicatorLight{parent=annunciator,label="Reactor SCRAM",colors=cpair(colors.red,colors.gray)} @@ -190,18 +190,18 @@ local function init(parent, id) local r_wloc = IndicatorLight{parent=annunciator,label="Waste Line Occlusion",colors=cpair(colors.yellow,colors.gray)} local r_hsrt = IndicatorLight{parent=annunciator,label="Startup Rate High",colors=cpair(colors.yellow,colors.gray)} - u_ps.subscribe("ReactorSCRAM", r_scram.update) - u_ps.subscribe("ManualReactorSCRAM", r_mscrm.update) - u_ps.subscribe("AutoReactorSCRAM", r_ascrm.update) - u_ps.subscribe("RadiationWarning", rad_wrn.update) - u_ps.subscribe("RCPTrip", r_rtrip.update) - u_ps.subscribe("RCSFlowLow", r_cflow.update) - u_ps.subscribe("CoolantLevelLow", r_clow.update) - u_ps.subscribe("ReactorTempHigh", r_temp.update) - u_ps.subscribe("ReactorHighDeltaT", r_rhdt.update) - u_ps.subscribe("FuelInputRateLow", r_firl.update) - u_ps.subscribe("WasteLineOcclusion", r_wloc.update) - u_ps.subscribe("HighStartupRate", r_hsrt.update) + r_scram.register(u_ps, "ReactorSCRAM", r_scram.update) + r_mscrm.register(u_ps, "ManualReactorSCRAM", r_mscrm.update) + r_ascrm.register(u_ps, "AutoReactorSCRAM", r_ascrm.update) + rad_wrn.register(u_ps, "RadiationWarning", rad_wrn.update) + r_rtrip.register(u_ps, "RCPTrip", r_rtrip.update) + r_cflow.register(u_ps, "RCSFlowLow", r_cflow.update) + r_clow.register(u_ps, "CoolantLevelLow", r_clow.update) + r_temp.register(u_ps, "ReactorTempHigh", r_temp.update) + r_rhdt.register(u_ps, "ReactorHighDeltaT", r_rhdt.update) + r_firl.register(u_ps, "FuelInputRateLow", r_firl.update) + r_wloc.register(u_ps, "WasteLineOcclusion", r_wloc.update) + r_hsrt.register(u_ps, "HighStartupRate", r_hsrt.update) -- RPS annunciator panel @@ -220,16 +220,16 @@ local function init(parent, id) local rps_tmo = IndicatorLight{parent=rps_annunc,label="Connection Timeout",colors=cpair(colors.yellow,colors.gray),flash=true,period=period.BLINK_500_MS} local rps_sfl = IndicatorLight{parent=rps_annunc,label="System Failure",colors=cpair(colors.orange,colors.gray),flash=true,period=period.BLINK_500_MS} - u_ps.subscribe("rps_tripped", rps_trp.update) - u_ps.subscribe("high_dmg", rps_dmg.update) - u_ps.subscribe("ex_hcool", rps_exh.update) - u_ps.subscribe("ex_waste", rps_exw.update) - u_ps.subscribe("high_temp", rps_tmp.update) - u_ps.subscribe("no_fuel", rps_nof.update) - u_ps.subscribe("low_cool", rps_loc.update) - u_ps.subscribe("fault", rps_flt.update) - u_ps.subscribe("timeout", rps_tmo.update) - u_ps.subscribe("sys_fail", rps_sfl.update) + rps_trp.register(u_ps, "rps_tripped", rps_trp.update) + rps_dmg.register(u_ps, "high_dmg", rps_dmg.update) + rps_exh.register(u_ps, "ex_hcool", rps_exh.update) + rps_exw.register(u_ps, "ex_waste", rps_exw.update) + rps_tmp.register(u_ps, "high_temp", rps_tmp.update) + rps_nof.register(u_ps, "no_fuel", rps_nof.update) + rps_loc.register(u_ps, "low_cool", rps_loc.update) + rps_flt.register(u_ps, "fault", rps_flt.update) + rps_tmo.register(u_ps, "timeout", rps_tmo.update) + rps_sfl.register(u_ps, "sys_fail", rps_sfl.update) -- cooling annunciator panel @@ -245,12 +245,12 @@ local function init(parent, id) local c_sfm = IndicatorLight{parent=rcs_annunc,label="Steam Feed Mismatch",colors=cpair(colors.yellow,colors.gray)} local c_mwrf = IndicatorLight{parent=rcs_annunc,label="Max Water Return Feed",colors=cpair(colors.yellow,colors.gray)} - u_ps.subscribe("RCSFault", c_flt.update) - u_ps.subscribe("EmergencyCoolant", c_emg.update) - u_ps.subscribe("CoolantFeedMismatch", c_cfm.update) - u_ps.subscribe("BoilRateMismatch", c_brm.update) - u_ps.subscribe("SteamFeedMismatch", c_sfm.update) - u_ps.subscribe("MaxWaterReturnFeed", c_mwrf.update) + c_flt.register(u_ps, "RCSFault", c_flt.update) + c_emg.register(u_ps, "EmergencyCoolant", c_emg.update) + c_cfm.register(u_ps, "CoolantFeedMismatch", c_cfm.update) + c_brm.register(u_ps, "BoilRateMismatch", c_brm.update) + c_sfm.register(u_ps, "SteamFeedMismatch", c_sfm.update) + c_mwrf.register(u_ps, "MaxWaterReturnFeed", c_mwrf.update) local available_space = 16 - (unit.num_boilers * 2 + unit.num_turbines * 4) @@ -267,11 +267,11 @@ local function init(parent, id) if unit.num_boilers > 0 then TextBox{parent=rcs_tags,x=1,text="B1",width=2,height=1,fg_bg=bw_fg_bg} local b1_wll = IndicatorLight{parent=rcs_annunc,label="Water Level Low",colors=cpair(colors.red,colors.gray)} - b_ps[1].subscribe("WasterLevelLow", b1_wll.update) + b1_wll.register(b_ps[1], "WasterLevelLow", b1_wll.update) TextBox{parent=rcs_tags,text="B1",width=2,height=1,fg_bg=bw_fg_bg} local b1_hr = IndicatorLight{parent=rcs_annunc,label="Heating Rate Low",colors=cpair(colors.yellow,colors.gray)} - b_ps[1].subscribe("HeatingRateLow", b1_hr.update) + b1_hr.register(b_ps[1], "HeatingRateLow", b1_hr.update) end if unit.num_boilers > 1 then -- note, can't (shouldn't for sure...) have 0 turbines @@ -283,11 +283,11 @@ local function init(parent, id) TextBox{parent=rcs_tags,text="B2",width=2,height=1,fg_bg=bw_fg_bg} local b2_wll = IndicatorLight{parent=rcs_annunc,label="Water Level Low",colors=cpair(colors.red,colors.gray)} - b_ps[2].subscribe("WasterLevelLow", b2_wll.update) + b2_wll.register(b_ps[2], "WasterLevelLow", b2_wll.update) TextBox{parent=rcs_tags,text="B2",width=2,height=1,fg_bg=bw_fg_bg} local b2_hr = IndicatorLight{parent=rcs_annunc,label="Heating Rate Low",colors=cpair(colors.yellow,colors.gray)} - b_ps[2].subscribe("HeatingRateLow", b2_hr.update) + b2_hr.register(b_ps[2], "HeatingRateLow", b2_hr.update) end -- turbine annunciator panels @@ -296,19 +296,19 @@ local function init(parent, id) TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=bw_fg_bg} local t1_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=colors.gray,c2=colors.yellow,c3=colors.red} - t_ps[1].subscribe("SteamDumpOpen", t1_sdo.update) + t1_sdo.register(t_ps[1], "SteamDumpOpen", t1_sdo.update) TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=bw_fg_bg} local t1_tos = IndicatorLight{parent=rcs_annunc,label="Turbine Over Speed",colors=cpair(colors.red,colors.gray)} - t_ps[1].subscribe("TurbineOverSpeed", t1_tos.update) + t1_tos.register(t_ps[1], "TurbineOverSpeed", t1_tos.update) TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=bw_fg_bg} local t1_gtrp = IndicatorLight{parent=rcs_annunc,label="Generator Trip",colors=cpair(colors.yellow,colors.gray),flash=true,period=period.BLINK_250_MS} - t_ps[1].subscribe("GeneratorTrip", t1_gtrp.update) + t1_gtrp.register(t_ps[1], "GeneratorTrip", t1_gtrp.update) TextBox{parent=rcs_tags,text="T1",width=2,height=1,fg_bg=bw_fg_bg} local t1_trp = IndicatorLight{parent=rcs_annunc,label="Turbine Trip",colors=cpair(colors.red,colors.gray),flash=true,period=period.BLINK_250_MS} - t_ps[1].subscribe("TurbineTrip", t1_trp.update) + t1_trp.register(t_ps[1], "TurbineTrip", t1_trp.update) if unit.num_turbines > 1 then if (available_space > 2 and unit.num_turbines == 2) or available_space > 3 then @@ -317,19 +317,19 @@ local function init(parent, id) TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=bw_fg_bg} local t2_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=colors.gray,c2=colors.yellow,c3=colors.red} - t_ps[2].subscribe("SteamDumpOpen", t2_sdo.update) + t2_sdo.register(t_ps[2], "SteamDumpOpen", t2_sdo.update) TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=bw_fg_bg} local t2_tos = IndicatorLight{parent=rcs_annunc,label="Turbine Over Speed",colors=cpair(colors.red,colors.gray)} - t_ps[2].subscribe("TurbineOverSpeed", t2_tos.update) + t2_tos.register(t_ps[2], "TurbineOverSpeed", t2_tos.update) TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=bw_fg_bg} local t2_gtrp = IndicatorLight{parent=rcs_annunc,label="Generator Trip",colors=cpair(colors.yellow,colors.gray),flash=true,period=period.BLINK_250_MS} - t_ps[2].subscribe("GeneratorTrip", t2_gtrp.update) + t2_gtrp.register(t_ps[2], "GeneratorTrip", t2_gtrp.update) TextBox{parent=rcs_tags,text="T2",width=2,height=1,fg_bg=bw_fg_bg} local t2_trp = IndicatorLight{parent=rcs_annunc,label="Turbine Trip",colors=cpair(colors.red,colors.gray),flash=true,period=period.BLINK_250_MS} - t_ps[2].subscribe("TurbineTrip", t2_trp.update) + t2_trp.register(t_ps[2], "TurbineTrip", t2_trp.update) end if unit.num_turbines > 2 then @@ -337,19 +337,19 @@ local function init(parent, id) TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=bw_fg_bg} local t3_sdo = TriIndicatorLight{parent=rcs_annunc,label="Steam Relief Valve Open",c1=colors.gray,c2=colors.yellow,c3=colors.red} - t_ps[3].subscribe("SteamDumpOpen", t3_sdo.update) + t3_sdo.register(t_ps[3], "SteamDumpOpen", t3_sdo.update) TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=bw_fg_bg} local t3_tos = IndicatorLight{parent=rcs_annunc,label="Turbine Over Speed",colors=cpair(colors.red,colors.gray)} - t_ps[3].subscribe("TurbineOverSpeed", t3_tos.update) + t3_tos.register(t_ps[3], "TurbineOverSpeed", t3_tos.update) TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=bw_fg_bg} local t3_gtrp = IndicatorLight{parent=rcs_annunc,label="Generator Trip",colors=cpair(colors.yellow,colors.gray),flash=true,period=period.BLINK_250_MS} - t_ps[3].subscribe("GeneratorTrip", t3_gtrp.update) + t3_gtrp.register(t_ps[3], "GeneratorTrip", t3_gtrp.update) TextBox{parent=rcs_tags,text="T3",width=2,height=1,fg_bg=bw_fg_bg} local t3_trp = IndicatorLight{parent=rcs_annunc,label="Turbine Trip",colors=cpair(colors.red,colors.gray),flash=true,period=period.BLINK_250_MS} - t_ps[3].subscribe("TurbineTrip", t3_trp.update) + t3_trp.register(t_ps[3], "TurbineTrip", t3_trp.update) end ---------------------- @@ -365,8 +365,8 @@ local function init(parent, id) local set_burn = function () unit.set_burn(burn_rate.get_value()) end local set_burn_btn = PushButton{parent=burn_control,x=14,y=2,text="SET",min_width=5,fg_bg=cpair(colors.black,colors.yellow),active_fg_bg=cpair(colors.white,colors.gray),dis_fg_bg=dis_colors,callback=set_burn} - u_ps.subscribe("burn_rate", burn_rate.set_value) - u_ps.subscribe("max_burn", burn_rate.set_max) + burn_rate.register(u_ps, "burn_rate", burn_rate.set_value) + burn_rate.register(u_ps, "max_burn", burn_rate.set_max) local start = HazardButton{parent=main,x=2,y=28,text="START",accent=colors.lightBlue,dis_colors=dis_colors,callback=unit.start,fg_bg=hzd_fg_bg} local ack_a = HazardButton{parent=main,x=12,y=32,text="ACK \x13",accent=colors.orange,dis_colors=dis_colors,callback=unit.ack_alarms,fg_bg=hzd_fg_bg} @@ -387,9 +387,12 @@ local function init(parent, id) end end - u_ps.subscribe("status", start_button_en_check) - u_ps.subscribe("rps_tripped", start_button_en_check) - u_ps.subscribe("rps_tripped", function (active) if active then reset.enable() else reset.disable() end end) + start.register(u_ps, "status", start_button_en_check) + start.register(u_ps, "rps_tripped", start_button_en_check) + start.register(u_ps, "auto_group_id", start_button_en_check) + start.register(u_ps, "AutoControl", start_button_en_check) + + reset.register(u_ps, "rps_tripped", function (active) if active then reset.enable() else reset.disable() end end) TextBox{parent=main,text="WASTE PROCESSING",fg_bg=cpair(colors.black,colors.brown),alignment=TEXT_ALIGN.CENTER,width=33,height=1,x=46,y=48} local waste_proc = Rectangle{parent=main,border=border(1,colors.brown,true),thin=true,width=33,height=3,x=46,y=49} @@ -397,7 +400,7 @@ local function init(parent, id) local waste_mode = MultiButton{parent=waste_div,x=1,y=1,options=waste_opts,callback=unit.set_waste,min_width=6} - u_ps.subscribe("U_WasteMode", waste_mode.set_value) + waste_mode.register(u_ps, "U_WasteMode", waste_mode.set_value) ---------------------- -- alarm management -- @@ -420,20 +423,20 @@ local function init(parent, id) local a_clt = AlarmLight{parent=alarm_panel,x=6,label="RCS Transient",c1=colors.gray,c2=colors.yellow,c3=colors.green,flash=true,period=period.BLINK_500_MS} local a_tbt = AlarmLight{parent=alarm_panel,x=6,label="Turbine Trip",c1=colors.gray,c2=colors.red,c3=colors.green,flash=true,period=period.BLINK_250_MS} - u_ps.subscribe("Alarm_1", a_brc.update) - u_ps.subscribe("Alarm_2", a_rad.update) - u_ps.subscribe("Alarm_4", a_dmg.update) + a_brc.register(u_ps, "Alarm_1", a_brc.update) + a_rad.register(u_ps, "Alarm_2", a_rad.update) + a_dmg.register(u_ps, "Alarm_4", a_dmg.update) - u_ps.subscribe("Alarm_3", a_rcl.update) - u_ps.subscribe("Alarm_5", a_rcd.update) - u_ps.subscribe("Alarm_6", a_rot.update) - u_ps.subscribe("Alarm_7", a_rht.update) - u_ps.subscribe("Alarm_8", a_rwl.update) - u_ps.subscribe("Alarm_9", a_rwh.update) + a_rcl.register(u_ps, "Alarm_3", a_rcl.update) + a_rcd.register(u_ps, "Alarm_5", a_rcd.update) + a_rot.register(u_ps, "Alarm_6", a_rot.update) + a_rht.register(u_ps, "Alarm_7", a_rht.update) + a_rwl.register(u_ps, "Alarm_8", a_rwl.update) + a_rwh.register(u_ps, "Alarm_9", a_rwh.update) - u_ps.subscribe("Alarm_10", a_rps.update) - u_ps.subscribe("Alarm_11", a_clt.update) - u_ps.subscribe("Alarm_12", a_tbt.update) + a_rps.register(u_ps, "Alarm_10", a_rps.update) + a_clt.register(u_ps, "Alarm_11", a_clt.update) + a_tbt.register(u_ps, "Alarm_12", a_tbt.update) -- ack's and resets @@ -487,7 +490,7 @@ local function init(parent, id) local group = RadioButton{parent=auto_div,options=ctl_opts,callback=function()end,radio_colors=cpair(colors.blue,colors.white),radio_bg=colors.gray} - u_ps.subscribe("auto_group_id", function (gid) group.set_value(gid + 1) end) + group.register(u_ps, "auto_group_id", function (gid) group.set_value(gid + 1) end) auto_div.line_break() @@ -499,24 +502,28 @@ local function init(parent, id) TextBox{parent=auto_div,text="Prio. Group",height=1,width=11,fg_bg=style.label} local auto_grp = TextBox{parent=auto_div,text="Manual",height=1,width=11,fg_bg=bw_fg_bg} - u_ps.subscribe("auto_group", auto_grp.set_value) + auto_grp.register(u_ps, "auto_group", auto_grp.set_value) auto_div.line_break() local a_rdy = IndicatorLight{parent=auto_div,label="Ready",x=2,colors=cpair(colors.green,colors.gray)} local a_stb = IndicatorLight{parent=auto_div,label="Standby",x=2,colors=cpair(colors.white,colors.gray),flash=true,period=period.BLINK_1000_MS} - u_ps.subscribe("U_AutoReady", a_rdy.update) + a_rdy.register(u_ps, "U_AutoReady", a_rdy.update) -- update standby indicator - u_ps.subscribe("status", function (active) + a_stb.register(u_ps, "status", function (active) a_stb.update(unit.annunciator.AutoControl and (not active)) end) + a_stb.register(u_ps, "AutoControl", function (auto_active) + if auto_active then + a_stb.update(unit.reactor_data.mek_status.status == false) + else a_stb.update(false) end + end) - -- enable and disable controls based on group assignment - u_ps.subscribe("auto_group_id", function (gid) - start_button_en_check() - + -- enable/disable controls based on group assignment (start button is separate) + -- REGISTER_NOTE: register to parent element for brevity + burn_control.register(u_ps, "auto_group_id", function (gid) if gid == 0 then burn_rate.enable() set_burn_btn.enable() @@ -526,17 +533,8 @@ local function init(parent, id) end end) - -- enable and disable controls based on auto control state (start button is handled separately) - u_ps.subscribe("AutoControl", function (auto_active) - start_button_en_check() - - if auto_active then - a_stb.update(unit.reactor_data.mek_status.status == false) - else a_stb.update(false) end - end) - -- can't change group if auto is engaged regardless of if this unit is part of auto control - f_ps.subscribe("auto_active", function (auto_active) + set_grp_btn.register(f_ps, "auto_active", function (auto_active) if auto_active then set_grp_btn.disable() else set_grp_btn.enable() end end) diff --git a/coordinator/ui/layout/main_view.lua b/coordinator/ui/layout/main_view.lua index 5510382..a758b24 100644 --- a/coordinator/ui/layout/main_view.lua +++ b/coordinator/ui/layout/main_view.lua @@ -34,8 +34,8 @@ local function init(main) -- max length example: "01:23:45 AM - Wednesday, September 28 2022" local datetime = TextBox{parent=main,x=(header.width()-42),y=1,text="",alignment=TEXT_ALIGN.RIGHT,width=42,height=1,fg_bg=style.header} - facility.ps.subscribe("sv_ping", ping.update) - facility.ps.subscribe("date_time", datetime.set_value) + ping.register(facility.ps, "sv_ping", ping.update) + datetime.register(facility.ps, "date_time", datetime.set_value) local uo_1, uo_2, uo_3, uo_4 ---@type graphics_element