#604 work on redstone RTU rework
This commit is contained in:
parent
fa2a6d7786
commit
1dc3d82e59
@ -36,7 +36,7 @@ function redstone_rtu.new(relay)
|
|||||||
|
|
||||||
-- change the phy in use (a relay or rs)
|
-- change the phy in use (a relay or rs)
|
||||||
---@param new_phy table
|
---@param new_phy table
|
||||||
function public.change_phy(new_phy) phy = new_phy end
|
function public.remount_phy(new_phy) phy = new_phy end
|
||||||
|
|
||||||
-- NOTE: for runtime speed, inversion logic results in extra code here but less code when functions are called
|
-- NOTE: for runtime speed, inversion logic results in extra code here but less code when functions are called
|
||||||
|
|
||||||
@ -49,15 +49,15 @@ function redstone_rtu.new(relay)
|
|||||||
|
|
||||||
if color then
|
if color then
|
||||||
if invert then
|
if invert then
|
||||||
f_read = function () return digital_read(not rs.testBundledInput(side, color)) end
|
f_read = function () return digital_read(not phy.testBundledInput(side, color)) end
|
||||||
else
|
else
|
||||||
f_read = function () return digital_read(rs.testBundledInput(side, color)) end
|
f_read = function () return digital_read(phy.testBundledInput(side, color)) end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if invert then
|
if invert then
|
||||||
f_read = function () return digital_read(not rs.getInput(side)) end
|
f_read = function () return digital_read(not phy.getInput(side)) end
|
||||||
else
|
else
|
||||||
f_read = function () return digital_read(rs.getInput(side)) end
|
f_read = function () return digital_read(phy.getInput(side)) end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -74,50 +74,50 @@ function redstone_rtu.new(relay)
|
|||||||
|
|
||||||
if color then
|
if color then
|
||||||
if invert then
|
if invert then
|
||||||
f_read = function () return digital_read(not colors.test(rs.getBundledOutput(side), color)) end
|
f_read = function () return digital_read(not colors.test(phy.getBundledOutput(side), color)) end
|
||||||
|
|
||||||
f_write = function (level)
|
f_write = function (level)
|
||||||
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
||||||
local output = rs.getBundledOutput(side)
|
local output = phy.getBundledOutput(side)
|
||||||
|
|
||||||
-- inverted conditions
|
-- inverted conditions
|
||||||
if digital_write(level) then
|
if digital_write(level) then
|
||||||
output = colors.subtract(output, color)
|
output = colors.subtract(output, color)
|
||||||
else output = colors.combine(output, color) end
|
else output = colors.combine(output, color) end
|
||||||
|
|
||||||
rs.setBundledOutput(side, output)
|
phy.setBundledOutput(side, output)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
f_read = function () return digital_read(colors.test(rs.getBundledOutput(side), color)) end
|
f_read = function () return digital_read(colors.test(phy.getBundledOutput(side), color)) end
|
||||||
|
|
||||||
f_write = function (level)
|
f_write = function (level)
|
||||||
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
||||||
local output = rs.getBundledOutput(side)
|
local output = phy.getBundledOutput(side)
|
||||||
|
|
||||||
if digital_write(level) then
|
if digital_write(level) then
|
||||||
output = colors.combine(output, color)
|
output = colors.combine(output, color)
|
||||||
else output = colors.subtract(output, color) end
|
else output = colors.subtract(output, color) end
|
||||||
|
|
||||||
rs.setBundledOutput(side, output)
|
phy.setBundledOutput(side, output)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if invert then
|
if invert then
|
||||||
f_read = function () return digital_read(not rs.getOutput(side)) end
|
f_read = function () return digital_read(not phy.getOutput(side)) end
|
||||||
|
|
||||||
f_write = function (level)
|
f_write = function (level)
|
||||||
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
||||||
rs.setOutput(side, not digital_write(level))
|
phy.setOutput(side, not digital_write(level))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
f_read = function () return digital_read(rs.getOutput(side)) end
|
f_read = function () return digital_read(phy.getOutput(side)) end
|
||||||
|
|
||||||
f_write = function (level)
|
f_write = function (level)
|
||||||
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
if level ~= IO_LVL.FLOATING and level ~= IO_LVL.DISCONNECT then
|
||||||
rs.setOutput(side, digital_write(level))
|
phy.setOutput(side, digital_write(level))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -129,15 +129,15 @@ function redstone_rtu.new(relay)
|
|||||||
-- link analog input
|
-- link analog input
|
||||||
---@param side string
|
---@param side string
|
||||||
function public.link_ai(side)
|
function public.link_ai(side)
|
||||||
unit.connect_input_reg(function () return rs.getAnalogInput(side) end)
|
unit.connect_input_reg(function () return phy.getAnalogInput(side) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- link analog output
|
-- link analog output
|
||||||
---@param side string
|
---@param side string
|
||||||
function public.link_ao(side)
|
function public.link_ao(side)
|
||||||
unit.connect_holding_reg(
|
unit.connect_holding_reg(
|
||||||
function () return rs.getAnalogOutput(side) end,
|
function () return phy.getAnalogOutput(side) end,
|
||||||
function (value) rs.setAnalogOutput(side, value) end
|
function (value) phy.setAnalogOutput(side, value) end
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@ -140,10 +140,19 @@ local function main()
|
|||||||
local rtu_redstone = config.Redstone
|
local rtu_redstone = config.Redstone
|
||||||
local rtu_devices = config.Peripherals
|
local rtu_devices = config.Peripherals
|
||||||
|
|
||||||
|
-- get a string representation of a port interface
|
||||||
|
---@param entry rtu_rs_definition
|
||||||
|
---@return string
|
||||||
|
local function entry_iface_name(entry)
|
||||||
|
return util.trinary(entry.color ~= nil, util.c(entry.side, "/", rsio.color_name(entry.color)), entry.side)
|
||||||
|
end
|
||||||
|
|
||||||
-- configure RTU gateway based on settings file definitions
|
-- configure RTU gateway based on settings file definitions
|
||||||
local function sys_config()
|
local function sys_config()
|
||||||
-- redstone interfaces
|
-- redstone interfaces
|
||||||
local rs_rtus = {} ---@type { name: string, rtu: rtu_rs_device, phy: table|nil, banks: IO_PORT[][] }[]
|
local rs_rtus = {} ---@type { name: string, rtu: rtu_rs_device, phy: table|nil, banks: rtu_rs_definition[][] }[]
|
||||||
|
|
||||||
|
local all_conns = {}
|
||||||
|
|
||||||
-- go through redstone definitions list
|
-- go through redstone definitions list
|
||||||
for entry_idx = 1, #rtu_redstone do
|
for entry_idx = 1, #rtu_redstone do
|
||||||
@ -152,7 +161,7 @@ local function main()
|
|||||||
local assignment
|
local assignment
|
||||||
local for_reactor = entry.unit
|
local for_reactor = entry.unit
|
||||||
local phy = entry.relay or 0
|
local phy = entry.relay or 0
|
||||||
local iface_name = util.trinary(entry.color ~= nil, util.c(entry.side, "/", rsio.color_name(entry.color)), entry.side)
|
local iface_name = entry_iface_name(entry)
|
||||||
|
|
||||||
if util.is_int(entry.unit) and entry.unit > 0 and entry.unit < 5 then
|
if util.is_int(entry.unit) and entry.unit > 0 and entry.unit < 5 then
|
||||||
---@cast for_reactor integer
|
---@cast for_reactor integer
|
||||||
@ -175,12 +184,12 @@ local function main()
|
|||||||
log.fatal(message)
|
log.fatal(message)
|
||||||
return false
|
return false
|
||||||
elseif not rs_rtus[entry.relay] then
|
elseif not rs_rtus[entry.relay] then
|
||||||
log.debug(util.c("sys_config> allocated relay redstone RTU for interface ", entry.relay))
|
log.debug(util.c("sys_config> allocated relay redstone RTU on interface ", entry.relay))
|
||||||
|
|
||||||
local relay = ppm.get_device(entry.relay)
|
local relay = ppm.get_device(entry.relay)
|
||||||
|
|
||||||
if not relay then
|
if not relay then
|
||||||
log.warning(util.c("sys_config> redstone relay ", entry.relay, " not connected"))
|
log.warning(util.c("sys_config> redstone relay ", entry.relay, " is not connected"))
|
||||||
elseif ppm.get_type(entry.relay) ~= "redstone_relay" then
|
elseif ppm.get_type(entry.relay) ~= "redstone_relay" then
|
||||||
log.warning(util.c("sys_config> redstone relay ", entry.relay, " is not a redstone relay"))
|
log.warning(util.c("sys_config> redstone relay ", entry.relay, " is not a redstone relay"))
|
||||||
end
|
end
|
||||||
@ -198,8 +207,9 @@ local function main()
|
|||||||
valid = util.trinary(entry.color == nil, true, rsio.is_color(entry.color))
|
valid = util.trinary(entry.color == nil, true, rsio.is_color(entry.color))
|
||||||
end
|
end
|
||||||
|
|
||||||
local rs_rtu = rs_rtus[for_reactor].rtu
|
-- local rs_rtu = rs_rtus[phy].rtu
|
||||||
local conns = rs_rtus[phy].banks[for_reactor]
|
local bank = rs_rtus[phy].banks[for_reactor]
|
||||||
|
local conns = all_conns[for_reactor]
|
||||||
|
|
||||||
if not valid then
|
if not valid then
|
||||||
local message = util.c("sys_config> invalid redstone definition at block index #", entry_idx)
|
local message = util.c("sys_config> invalid redstone definition at block index #", entry_idx)
|
||||||
@ -216,10 +226,12 @@ local function main()
|
|||||||
println(message)
|
println(message)
|
||||||
log.warning(message)
|
log.warning(message)
|
||||||
else
|
else
|
||||||
rs_rtu.link_di(entry.side, entry.color, entry.invert)
|
table.insert(bank, entry)
|
||||||
|
-- rs_rtu.link_di(entry.side, entry.color, entry.invert)
|
||||||
end
|
end
|
||||||
elseif mode == rsio.IO_MODE.DIGITAL_OUT then
|
elseif mode == rsio.IO_MODE.DIGITAL_OUT then
|
||||||
rs_rtu.link_do(entry.side, entry.color, entry.invert)
|
table.insert(bank, entry)
|
||||||
|
-- rs_rtu.link_do(entry.side, entry.color, entry.invert)
|
||||||
elseif mode == rsio.IO_MODE.ANALOG_IN then
|
elseif mode == rsio.IO_MODE.ANALOG_IN then
|
||||||
-- can't have duplicate inputs
|
-- can't have duplicate inputs
|
||||||
if util.table_contains(conns, entry.port) then
|
if util.table_contains(conns, entry.port) then
|
||||||
@ -227,25 +239,55 @@ local function main()
|
|||||||
println(message)
|
println(message)
|
||||||
log.warning(message)
|
log.warning(message)
|
||||||
else
|
else
|
||||||
rs_rtu.link_ai(entry.side)
|
table.insert(bank, entry)
|
||||||
|
-- rs_rtu.link_ai(entry.side)
|
||||||
end
|
end
|
||||||
elseif mode == rsio.IO_MODE.ANALOG_OUT then
|
elseif mode == rsio.IO_MODE.ANALOG_OUT then
|
||||||
rs_rtu.link_ao(entry.side)
|
table.insert(bank, entry)
|
||||||
|
-- rs_rtu.link_ao(entry.side)
|
||||||
else
|
else
|
||||||
-- should be unreachable code, we already validated ports
|
-- should be unreachable code, we already validated ports
|
||||||
log.error("sys_config> fell through if chain attempting to identify IO mode at block index #" .. entry_idx, true)
|
log.error("sys_config> failed to identify IO mode at block index #" .. entry_idx, true)
|
||||||
println("sys_config> encountered a software error, check logs")
|
println("sys_config> encountered a software error, check logs")
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
table.insert(conns, entry.port)
|
table.insert(conns, entry.port)
|
||||||
|
|
||||||
log.debug(util.c("sys_config> linked redstone ", #conns, ": ", rsio.to_string(entry.port), " (", iface_name, ") for ", assignment))
|
log.debug(util.c("sys_config> banked redstone ", #conns, ": ", rsio.to_string(entry.port), " (", iface_name, ") for ", assignment))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- create unit entries for redstone RTUs
|
-- create unit entries for redstone RTUs
|
||||||
for _, def in pairs(rs_rtus) do
|
for _, def in pairs(rs_rtus) do
|
||||||
|
local rtu_conns = { [0] = {}, {}, {}, {}, {}}
|
||||||
|
|
||||||
|
-- connect the IO banks
|
||||||
|
for for_reactor = 0, #def.banks do
|
||||||
|
local bank = def.banks[for_reactor]
|
||||||
|
local conns = rtu_conns[for_reactor]
|
||||||
|
|
||||||
|
-- link redstone to the RTU
|
||||||
|
for i = 1, #bank do
|
||||||
|
local conn = bank[i]
|
||||||
|
|
||||||
|
local mode = rsio.get_io_mode(conn.port)
|
||||||
|
if mode == rsio.IO_MODE.DIGITAL_IN then
|
||||||
|
def.rtu.link_di(conn.side, conn.color, conn.invert)
|
||||||
|
elseif mode == rsio.IO_MODE.DIGITAL_OUT then
|
||||||
|
def.rtu.link_do(conn.side, conn.color, conn.invert)
|
||||||
|
elseif mode == rsio.IO_MODE.ANALOG_IN then
|
||||||
|
def.rtu.link_ai(conn.side)
|
||||||
|
elseif mode == rsio.IO_MODE.ANALOG_OUT then
|
||||||
|
def.rtu.link_ao(conn.side)
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(conns, conn.port)
|
||||||
|
|
||||||
|
log.debug(util.c("sys_config> linked redstone ", for_reactor, ".", #conns, ": ", rsio.to_string(conn.port), " (", entry_iface_name(conn), ")"))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local hw_state = util.trinary(def.phy, RTU_HW_STATE.OK, RTU_HW_STATE.OFFLINE)
|
local hw_state = util.trinary(def.phy, RTU_HW_STATE.OK, RTU_HW_STATE.OFFLINE)
|
||||||
|
|
||||||
---@class rtu_registry_entry
|
---@class rtu_registry_entry
|
||||||
@ -256,7 +298,7 @@ local function main()
|
|||||||
index = false, ---@type integer|false
|
index = false, ---@type integer|false
|
||||||
reactor = nil, ---@type nil
|
reactor = nil, ---@type nil
|
||||||
device = def.phy, ---@type table|nil
|
device = def.phy, ---@type table|nil
|
||||||
banks = def.banks, ---@type IO_PORT[][]
|
rs_conns = rtu_conns, ---@type IO_PORT[][]|nil
|
||||||
is_multiblock = false, ---@type boolean
|
is_multiblock = false, ---@type boolean
|
||||||
formed = nil, ---@type boolean|nil
|
formed = nil, ---@type boolean|nil
|
||||||
hw_state = hw_state, ---@type RTU_HW_STATE
|
hw_state = hw_state, ---@type RTU_HW_STATE
|
||||||
|
|||||||
@ -133,7 +133,7 @@ local function handle_unit_mount(smem, println_ts, iface, type, device, unit)
|
|||||||
elseif unit.type == RTU_UNIT_TYPE.ENV_DETECTOR then
|
elseif unit.type == RTU_UNIT_TYPE.ENV_DETECTOR then
|
||||||
unit.rtu, faulted = envd_rtu.new(device)
|
unit.rtu, faulted = envd_rtu.new(device)
|
||||||
elseif unit.type == RTU_UNIT_TYPE.REDSTONE then
|
elseif unit.type == RTU_UNIT_TYPE.REDSTONE then
|
||||||
unit.rtu.change_phy(device)
|
unit.rtu.remount_phy(device)
|
||||||
else
|
else
|
||||||
unknown = true
|
unknown = true
|
||||||
log.error(util.c("failed to identify reconnected RTU unit type (", unit.name, ")"), true)
|
log.error(util.c("failed to identify reconnected RTU unit type (", unit.name, ")"), true)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user