#159 linked up redstone I/O
This commit is contained in:
@@ -11,7 +11,7 @@ local rsio = {}
|
||||
-- RS I/O CONSTANTS --
|
||||
----------------------
|
||||
|
||||
---@alias IO_LVL integer
|
||||
---@enum IO_LVL I/O logic level
|
||||
local IO_LVL = {
|
||||
DISCONNECT = -1, -- use for RTU session to indicate this RTU is not connected to this port
|
||||
LOW = 0,
|
||||
@@ -19,13 +19,13 @@ local IO_LVL = {
|
||||
FLOATING = 2 -- use for RTU session to indicate this RTU is connected but not yet read
|
||||
}
|
||||
|
||||
---@alias IO_DIR integer
|
||||
---@enum IO_DIR I/O direction
|
||||
local IO_DIR = {
|
||||
IN = 0,
|
||||
OUT = 1
|
||||
}
|
||||
|
||||
---@alias IO_MODE integer
|
||||
---@enum IO_MODE I/O mode (digital/analog input/output)
|
||||
local IO_MODE = {
|
||||
DIGITAL_IN = 0,
|
||||
DIGITAL_OUT = 1,
|
||||
@@ -33,45 +33,50 @@ local IO_MODE = {
|
||||
ANALOG_OUT = 3
|
||||
}
|
||||
|
||||
---@alias IO_PORT integer
|
||||
---@enum IO_PORT redstone I/O logic port
|
||||
local IO_PORT = {
|
||||
-- digital inputs --
|
||||
|
||||
-- facility
|
||||
F_SCRAM = 1, -- active low, facility-wide scram
|
||||
F_ACK = 2, -- active high, facility alarm acknowledge
|
||||
|
||||
-- reactor
|
||||
R_SCRAM = 2, -- active low, reactor scram
|
||||
R_ENABLE = 3, -- active high, reactor enable
|
||||
R_SCRAM = 3, -- active low, reactor scram
|
||||
R_RESET = 4, -- active high, reactor RPS reset
|
||||
R_ENABLE = 5, -- active high, reactor enable
|
||||
|
||||
-- unit
|
||||
U_ACK = 6, -- active high, unit alarm acknowledge
|
||||
|
||||
-- digital outputs --
|
||||
|
||||
-- facility
|
||||
F_ALARM = 4, -- active high, facility safety alarm
|
||||
F_ALARM = 7, -- active high, facility alarm (any high priority unit alarm)
|
||||
|
||||
-- waste
|
||||
WASTE_PU = 5, -- active low, waste -> plutonium -> pellets route
|
||||
WASTE_PO = 6, -- active low, waste -> polonium route
|
||||
WASTE_POPL = 7, -- active low, polonium -> pellets route
|
||||
WASTE_AM = 8, -- active low, polonium -> anti-matter route
|
||||
WASTE_PU = 8, -- active low, waste -> plutonium -> pellets route
|
||||
WASTE_PO = 9, -- active low, waste -> polonium route
|
||||
WASTE_POPL = 10, -- active low, polonium -> pellets route
|
||||
WASTE_AM = 11, -- active low, polonium -> anti-matter route
|
||||
|
||||
-- reactor
|
||||
R_ALARM = 9, -- active high, reactor safety alarm
|
||||
R_SCRAMMED = 10, -- active high, if the reactor is scrammed
|
||||
R_AUTO_SCRAM = 11, -- active high, if the reactor was automatically scrammed
|
||||
R_ACTIVE = 12, -- active high, if the reactor is active
|
||||
R_AUTO_CTRL = 13, -- active high, if the reactor burn rate is automatic
|
||||
R_DMG_CRIT = 14, -- active high, if the reactor damage is critical
|
||||
R_HIGH_TEMP = 15, -- active high, if the reactor is at a high temperature
|
||||
R_NO_COOLANT = 16, -- active high, if the reactor has no coolant
|
||||
R_EXCESS_HC = 17, -- active high, if the reactor has excess heated coolant
|
||||
R_EXCESS_WS = 18, -- active high, if the reactor has excess waste
|
||||
R_INSUFF_FUEL = 19, -- active high, if the reactor has insufficent fuel
|
||||
R_PLC_FAULT = 20, -- active high, if the reactor PLC reports a device access fault
|
||||
R_PLC_TIMEOUT = 21, -- active high, if the reactor PLC has not been heard from
|
||||
R_SCRAMMED = 14, -- active high, if the reactor is scrammed
|
||||
R_AUTO_SCRAM = 15, -- active high, if the reactor was automatically scrammed
|
||||
R_DMG_CRIT = 16, -- active high, if the reactor damage is critical
|
||||
R_HIGH_TEMP = 17, -- active high, if the reactor is at a high temperature
|
||||
R_NO_COOLANT = 18, -- active high, if the reactor has no coolant
|
||||
R_EXCESS_HC = 19, -- active high, if the reactor has excess heated coolant
|
||||
R_EXCESS_WS = 20, -- active high, if the reactor has excess waste
|
||||
R_INSUFF_FUEL = 21, -- active high, if the reactor has insufficent fuel
|
||||
R_PLC_FAULT = 22, -- active high, if the reactor PLC reports a device access fault
|
||||
R_PLC_TIMEOUT = 23, -- active high, if the reactor PLC has not been heard from
|
||||
|
||||
-- unit outputs
|
||||
U_EMER_COOL = 22 -- active low, emergency coolant control
|
||||
U_ALARM = 24, -- active high, unit alarm
|
||||
U_EMER_COOL = 25 -- active low, emergency coolant control
|
||||
}
|
||||
|
||||
rsio.IO_LVL = IO_LVL
|
||||
@@ -88,18 +93,20 @@ rsio.IO = IO_PORT
|
||||
function rsio.to_string(port)
|
||||
local names = {
|
||||
"F_SCRAM",
|
||||
"F_ACK",
|
||||
"R_SCRAM",
|
||||
"R_RESET",
|
||||
"R_ENABLE",
|
||||
"U_ACK",
|
||||
"F_ALARM",
|
||||
"WASTE_PU",
|
||||
"WASTE_PO",
|
||||
"WASTE_POPL",
|
||||
"WASTE_AM",
|
||||
"R_ALARM",
|
||||
"R_SCRAMMED",
|
||||
"R_AUTO_SCRAM",
|
||||
"R_ACTIVE",
|
||||
"R_AUTO_CTRL",
|
||||
"R_SCRAMMED",
|
||||
"R_AUTO_SCRAM",
|
||||
"R_DMG_CRIT",
|
||||
"R_HIGH_TEMP",
|
||||
"R_NO_COOLANT",
|
||||
@@ -108,6 +115,7 @@ function rsio.to_string(port)
|
||||
"R_INSUFF_FUEL",
|
||||
"R_PLC_FAULT",
|
||||
"R_PLC_TIMEOUT",
|
||||
"U_ALARM",
|
||||
"U_EMER_COOL"
|
||||
}
|
||||
|
||||
@@ -129,12 +137,22 @@ local function _O_ACTIVE_LOW(active) if active then return IO_LVL.LOW else retur
|
||||
local RS_DIO_MAP = {
|
||||
-- F_SCRAM
|
||||
{ _in = _I_ACTIVE_LOW, _out = _O_ACTIVE_LOW, mode = IO_DIR.IN },
|
||||
-- F_ACK
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.IN },
|
||||
|
||||
-- R_SCRAM
|
||||
{ _in = _I_ACTIVE_LOW, _out = _O_ACTIVE_LOW, mode = IO_DIR.IN },
|
||||
-- R_RESET
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.IN },
|
||||
-- R_ENABLE
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.IN },
|
||||
|
||||
-- U_ACK
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.IN },
|
||||
|
||||
-- F_ALARM
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
|
||||
-- WASTE_PU
|
||||
{ _in = _I_ACTIVE_LOW, _out = _O_ACTIVE_LOW, mode = IO_DIR.OUT },
|
||||
-- WASTE_PO
|
||||
@@ -143,16 +161,15 @@ local RS_DIO_MAP = {
|
||||
{ _in = _I_ACTIVE_LOW, _out = _O_ACTIVE_LOW, mode = IO_DIR.OUT },
|
||||
-- WASTE_AM
|
||||
{ _in = _I_ACTIVE_LOW, _out = _O_ACTIVE_LOW, mode = IO_DIR.OUT },
|
||||
-- R_ALARM
|
||||
|
||||
-- R_ACTIVE
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
-- R_AUTO_CTRL
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
-- R_SCRAMMED
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
-- R_AUTO_SCRAM
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
-- R_ACTIVE
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
-- R_AUTO_CTRL
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
-- R_DMG_CRIT
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
-- R_HIGH_TEMP
|
||||
@@ -169,6 +186,9 @@ local RS_DIO_MAP = {
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
-- R_PLC_TIMEOUT
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
|
||||
-- U_ALARM
|
||||
{ _in = _I_ACTIVE_HIGH, _out = _O_ACTIVE_HIGH, mode = IO_DIR.OUT },
|
||||
-- U_EMER_COOL
|
||||
{ _in = _I_ACTIVE_LOW, _out = _O_ACTIVE_LOW, mode = IO_DIR.OUT }
|
||||
}
|
||||
@@ -179,18 +199,20 @@ local RS_DIO_MAP = {
|
||||
function rsio.get_io_mode(port)
|
||||
local modes = {
|
||||
IO_MODE.DIGITAL_IN, -- F_SCRAM
|
||||
IO_MODE.DIGITAL_IN, -- F_ACK
|
||||
IO_MODE.DIGITAL_IN, -- R_SCRAM
|
||||
IO_MODE.DIGITAL_IN, -- R_RESET
|
||||
IO_MODE.DIGITAL_IN, -- R_ENABLE
|
||||
IO_MODE.DIGITAL_IN, -- U_ACK
|
||||
IO_MODE.DIGITAL_OUT, -- F_ALARM
|
||||
IO_MODE.DIGITAL_OUT, -- WASTE_PU
|
||||
IO_MODE.DIGITAL_OUT, -- WASTE_PO
|
||||
IO_MODE.DIGITAL_OUT, -- WASTE_POPL
|
||||
IO_MODE.DIGITAL_OUT, -- WASTE_AM
|
||||
IO_MODE.DIGITAL_OUT, -- R_ALARM
|
||||
IO_MODE.DIGITAL_OUT, -- R_SCRAMMED
|
||||
IO_MODE.DIGITAL_OUT, -- R_AUTO_SCRAM
|
||||
IO_MODE.DIGITAL_OUT, -- R_ACTIVE
|
||||
IO_MODE.DIGITAL_OUT, -- R_AUTO_CTRL
|
||||
IO_MODE.DIGITAL_OUT, -- R_SCRAMMED
|
||||
IO_MODE.DIGITAL_OUT, -- R_AUTO_SCRAM
|
||||
IO_MODE.DIGITAL_OUT, -- R_DMG_CRIT
|
||||
IO_MODE.DIGITAL_OUT, -- R_HIGH_TEMP
|
||||
IO_MODE.DIGITAL_OUT, -- R_NO_COOLANT
|
||||
@@ -199,6 +221,7 @@ function rsio.get_io_mode(port)
|
||||
IO_MODE.DIGITAL_OUT, -- R_INSUFF_FUEL
|
||||
IO_MODE.DIGITAL_OUT, -- R_PLC_FAULT
|
||||
IO_MODE.DIGITAL_OUT, -- R_PLC_TIMEOUT
|
||||
IO_MODE.DIGITAL_OUT, -- U_ALARM
|
||||
IO_MODE.DIGITAL_OUT -- U_EMER_COOL
|
||||
}
|
||||
|
||||
@@ -249,11 +272,7 @@ end
|
||||
---@param rs_value boolean
|
||||
---@return IO_LVL
|
||||
function rsio.digital_read(rs_value)
|
||||
if rs_value then
|
||||
return IO_LVL.HIGH
|
||||
else
|
||||
return IO_LVL.LOW
|
||||
end
|
||||
if rs_value then return IO_LVL.HIGH else return IO_LVL.LOW end
|
||||
end
|
||||
|
||||
-- get redstone boolean output value corresponding to a digital I/O level
|
||||
@@ -280,7 +299,7 @@ end
|
||||
---@param level IO_LVL
|
||||
---@return boolean|nil
|
||||
function rsio.digital_is_active(port, level)
|
||||
if (not util.is_int(port)) or (port > IO_PORT.R_ENABLE) then
|
||||
if (not util.is_int(port)) or (port > IO_PORT.U_ACK) then
|
||||
return nil
|
||||
elseif level == IO_LVL.FLOATING or level == IO_LVL.DISCONNECT then
|
||||
return nil
|
||||
@@ -310,7 +329,7 @@ end
|
||||
---@return number rs_value scaled redstone reading (0 to 15)
|
||||
function rsio.analog_write(value, min, max)
|
||||
local scaled_value = (value - min) / (max - min)
|
||||
return scaled_value * 15
|
||||
return math.floor(scaled_value * 15)
|
||||
end
|
||||
|
||||
return rsio
|
||||
|
||||
Reference in New Issue
Block a user