diff --git a/pocket/iorx.lua b/pocket/iorx.lua index 90db0ae..aea9699 100644 --- a/pocket/iorx.lua +++ b/pocket/iorx.lua @@ -824,13 +824,18 @@ function iorx.record_radiation_data(data) -- unit radiation monitors for u_id = 1, #io.units do - local unit = io.units[u_id] + local unit = io.units[u_id] + local max_rad = 0 + local connected = {} unit.radiation = types.new_zero_radiation_reading() unit.rad_monitors = data[u_id] - local max_rad = 0 - for _, mon in pairs(unit.rad_monitors) do + for id, mon in pairs(unit.rad_monitors) do + table.insert(connected, id) + + unit.unit_ps.publish("radiation@" .. id, mon.radiation) + if mon.raw > max_rad then max_rad = mon.raw unit.radiation = mon.radiation @@ -838,7 +843,7 @@ function iorx.record_radiation_data(data) end unit.unit_ps.publish("radiation", unit.radiation) - unit.unit_ps.publish("radiation_monitors", textutils.serialize(unit.rad_monitors)) + unit.unit_ps.publish("radiation_monitors", textutils.serialize(connected)) end -- facility radiation monitors @@ -849,7 +854,13 @@ function iorx.record_radiation_data(data) fac.rad_monitors = data[#io.units + 1] local max_rad = 0 - for _, mon in pairs(fac.rad_monitors) do + local connected = {} + + for id, mon in pairs(fac.rad_monitors) do + table.insert(connected, id) + + fac.ps.publish("radiation@" .. id, mon.radiation) + if mon.raw > max_rad then max_rad = mon.raw fac.radiation = mon.radiation @@ -857,7 +868,7 @@ function iorx.record_radiation_data(data) end fac.ps.publish("radiation", fac.radiation) - fac.ps.publish("radiation_monitors", textutils.serialize(fac.rad_monitors)) + fac.ps.publish("radiation_monitors", textutils.serialize(connected)) end return function (io_obj) diff --git a/pocket/ui/apps/radiation.lua b/pocket/ui/apps/radiation.lua index b4b7482..d0fccd8 100644 --- a/pocket/ui/apps/radiation.lua +++ b/pocket/ui/apps/radiation.lua @@ -75,6 +75,39 @@ local function new_view(root) end end + -- create a new radiation monitor list + ---@param parent Container + ---@param ps psil + local function new_mon_list(parent, ps) + local mon_list = ListBox{parent=parent,y=6,scroll_height=100,nav_fg_bg=cpair(colors.lightGray,colors.gray),nav_active=cpair(colors.white,colors.gray)} + + local elem_list = {} ---@type graphics_element[] + + mon_list.register(ps, "radiation", function (data) + local ids = textutils.unserialize(data) + + -- delete any disconnected monitors + for id, elem in pairs(elem_list) do + if util.table_contains(ids, id) then + elem.delete() + elem_list[id] = nil + end + end + + -- add newly connected monitors + for _, id in pairs(ids) do + if not elem_list[id] then + elem_list[id] = Div{parent=mon_list,height=4} + local mon_rect = Rectangle{parent=elem_list[id],height=5,x=2,width=20,border=border(1,colors.gray,true),thin=true,fg_bg=cpair(colors.black,colors.lightGray)} + + TextBox{parent=mon_rect,text="Env. Detector "..id} + local mon_rad = RadIndicator{parent=mon_rect,x=2,label="",format="%13.3f",lu_colors=cpair(colors.gray,colors.gray),width=18} + mon_rad.register(ps, "radiation@" .. id, mon_rad.update) + end + end + end) + end + --#region unit radiation monitors for i = 1, db.facility.num_units do @@ -92,29 +125,7 @@ local function new_view(root) local radiation = RadIndicator{parent=u_div,x=2,label="",format="%17.3f",lu_colors=lu_col,width=21} radiation.register(u_ps, "radiation", radiation.update) - local mon_list = ListBox{parent=u_div,y=6,scroll_height=100,nav_fg_bg=cpair(colors.lightGray,colors.gray),nav_active=cpair(colors.white,colors.gray)} - - -- local last_list = {} - -- local new_list = {} - - mon_list.register(u_ps, "radiation", function () - -- for k, _ in pairs(unit.rad_monitors) do - -- if last_list[k] then last_list[k] = nil end - -- end - - -- re-create due to new items - -- if util.table_len(last_list) > 0 then - mon_list.remove_all() - - for k, v in pairs(unit.rad_monitors) do - local mon_div = Div{parent=mon_list,height=4} - local mon_rect = Rectangle{parent=mon_div,height=5,x=2,width=20,border=border(1,colors.gray,true),thin=true,fg_bg=cpair(colors.black,colors.lightGray)} - TextBox{parent=mon_rect,text="Env. Detector "..k} - local mon_rad = RadIndicator{parent=mon_rect,x=2,label="",format="%13.3f",value=v.radiation,lu_colors=cpair(colors.gray,colors.gray),width=18} - -- radiation.register(u_ps, "radiation", mon_rad.update) - end - -- end - end) + new_mon_list(u_div, u_ps) end --#endregion @@ -159,7 +170,7 @@ local function new_view(root) local f_rad = RadIndicator{parent=f_div,x=2,label="",format="%17.3f",lu_colors=lu_col,width=21} f_rad.register(f_ps, "radiation", f_rad.update) - local f_mon_list = ListBox{parent=f_div,y=6,scroll_height=100,nav_fg_bg=cpair(colors.lightGray,colors.gray),nav_active=cpair(colors.white,colors.gray)} + new_mon_list(f_div, f_ps) --#endregion