From 069a7ce0ad0da1f74e86606396c1b5ea136e1deb Mon Sep 17 00:00:00 2001 From: Mikayla Fischler Date: Wed, 7 May 2025 20:03:48 -0400 Subject: [PATCH] #604 front panel updates and hw state tracking fixes --- rtu/panel/front_panel.lua | 30 +++++++++++++++++++++++------- rtu/startup.lua | 15 ++++++++------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/rtu/panel/front_panel.lua b/rtu/panel/front_panel.lua index 51adf30..02f5979 100644 --- a/rtu/panel/front_panel.lua +++ b/rtu/panel/front_panel.lua @@ -19,7 +19,8 @@ local LED = require("graphics.elements.indicators.LED") local LEDPair = require("graphics.elements.indicators.LEDPair") local RGBLED = require("graphics.elements.indicators.RGBLED") -local LINK_STATE = types.PANEL_LINK_STATE +local LINK_STATE = types.PANEL_LINK_STATE +local RTU_UNIT_TYPE = types.RTU_UNIT_TYPE local ALIGN = core.ALIGN @@ -129,30 +130,45 @@ local function init(panel, units) -- show routine statuses for i = 1, list_length do TextBox{parent=threads,x=1,y=i,text=util.sprintf("%02d",i)} - local rt_unit = LED{parent=threads,x=4,y=i,label="RT",colors=ind_grn} + local rt_unit = LED{parent=threads,x=4,y=i,label="RT",colors=util.trinary(units[i].type~=RTU_UNIT_TYPE.REDSTONE,ind_grn,cpair(style.ind_bkg,style.ind_bkg))} rt_unit.register(databus.ps, "routine__unit_" .. i, rt_unit.update) end local unit_hw_statuses = Div{parent=panel,height=term_h-3,x=25,y=3} + local relay_counter = 0 + -- show hardware statuses for i = 1, list_length do local unit = units[i] + local is_rs = unit.type == RTU_UNIT_TYPE.REDSTONE + -- hardware status local unit_hw = RGBLED{parent=unit_hw_statuses,y=i,label="",colors={colors.red,colors.orange,colors.yellow,colors.green}} unit_hw.register(databus.ps, "unit_hw_" .. i, unit_hw.update) -- unit name identifier (type + index) - local function get_name(t) return util.c(UNIT_TYPE_LABELS[t + 1], " ", util.trinary(util.is_int(unit.index), unit.index, "")) end - local name_box = TextBox{parent=unit_hw_statuses,y=i,x=3,text=get_name(unit.type),width=15} + local function get_name() + if is_rs then + local is_local = unit.name == "redstone_local" + relay_counter = relay_counter + util.trinary(is_local, 0, 1) + return util.c("REDSTONE", util.trinary(is_local, "", " RELAY "..relay_counter)) + else + return util.c(UNIT_TYPE_LABELS[unit.type + 1], " ", util.trinary(util.is_int(unit.index), unit.index, "")) + end + end - name_box.register(databus.ps, "unit_type_" .. i, function (t) name_box.set_value(get_name(t)) end) + local name_box = TextBox{parent=unit_hw_statuses,y=i,x=3,text=get_name(),width=util.trinary(is_rs,24,15)} + + name_box.register(databus.ps, "unit_type_" .. i, function () name_box.set_value(get_name()) end) -- assignment (unit # or facility) - local for_unit = util.trinary(unit.reactor == 0, "\x1a FACIL ", "\x1a UNIT " .. unit.reactor) - TextBox{parent=unit_hw_statuses,y=i,x=term_w-32,text=for_unit,fg_bg=disabled_fg} + if unit.reactor then + local for_unit = util.trinary(unit.reactor == 0, "\x1a FACIL ", "\x1a UNIT " .. unit.reactor) + TextBox{parent=unit_hw_statuses,y=i,x=term_w-32,text=for_unit,fg_bg=disabled_fg} + end end end diff --git a/rtu/startup.lua b/rtu/startup.lua index 314c2c7..69e3a56 100644 --- a/rtu/startup.lua +++ b/rtu/startup.lua @@ -151,7 +151,7 @@ local function main() local function sys_config() --#region Redstone Interfaces - local rs_rtus = {} ---@type { name: string, rtu: rtu_rs_device, phy: table, banks: rtu_rs_definition[][] }[] + local rs_rtus = {} ---@type { name: string, hw_state: RTU_HW_STATE, rtu: rtu_rs_device, phy: table, banks: rtu_rs_definition[][] }[] local all_conns = { [0] = {}, {}, {}, {}, {} } -- go through redstone definitions list @@ -187,21 +187,24 @@ local function main() elseif not rs_rtus[entry.relay] then log.debug(util.c("sys_config> allocated relay redstone RTU on interface ", entry.relay)) - local relay = ppm.get_device(entry.relay) + local hw_state = RTU_HW_STATE.OK + local relay = ppm.get_periph(entry.relay) if not relay then + hw_state = RTU_HW_STATE.OFFLINE log.warning(util.c("sys_config> redstone relay ", entry.relay, " is not connected")) local _, v_device = ppm.mount_virtual() relay = v_device elseif ppm.get_type(entry.relay) ~= "redstone_relay" then + hw_state = RTU_HW_STATE.FAULTED log.warning(util.c("sys_config> redstone relay ", entry.relay, " is not a redstone relay")) end - rs_rtus[entry.relay] = { name = entry.relay, rtu = redstone_rtu.new(relay), phy = relay, banks = { [0] = {}, {}, {}, {}, {} } } + rs_rtus[entry.relay] = { name = entry.relay, hw_state = hw_state, rtu = redstone_rtu.new(relay), phy = relay, banks = { [0] = {}, {}, {}, {}, {} } } end elseif rs_rtus[0] == nil then log.debug(util.c("sys_config> allocated local redstone RTU")) - rs_rtus[0] = { name = "redstone_local", rtu = redstone_rtu.new(), phy = rs, banks = { [0] = {}, {}, {}, {}, {} } } + rs_rtus[0] = { name = "redstone_local", hw_state = RTU_HW_STATE.OK, rtu = redstone_rtu.new(), phy = rs, banks = { [0] = {}, {}, {}, {}, {} } } end -- verify configuration @@ -291,8 +294,6 @@ local function main() end end - local hw_state = util.trinary(def.phy, RTU_HW_STATE.OK, RTU_HW_STATE.OFFLINE) - ---@type rtu_registry_entry local unit = { uid = 0, @@ -304,7 +305,7 @@ local function main() rs_conns = rtu_conns, is_multiblock = false, formed = nil, - hw_state = hw_state, + hw_state = def.hw_state, rtu = def.rtu, modbus_io = modbus.new(def.rtu, false), pkt_queue = nil,