Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local modemSides = {}
- local rsSides = {}
- local channels = {}
- local computerType = "input"
- local analog = true
- local version = "2.0.1"
- local i
- local l
- local _
- local temp
- local message
- local rsState
- local lastState = false
- local stateStack = 0
- local analogNumber
- local lastAnalog = 0
- local analogStack = 0
- local bundledStates = {}
- local bundledString
- local lastBundled = {}
- local bundledStack = {}
- local bundledNumber
- local modems = {}
- local bundledValues = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768}
- local rsData = {state,analog,bundled}
- local function startup()
- term.clear()
- term.setCursorPos(1,1)
- print("Running ModemRS version "..version.." by Jyzarc27")
- for i = 1,#modemSides do
- if peripheral.getType(modemSides[i]) == "modem" then
- modems[#modems+1] = peripheral.wrap(modemSides[i])
- end
- end
- for i = 1,#modems do
- for l = 1,#channels do
- modems[i].open(channels[l])
- end
- end
- for i = 1,16 do
- lastBundled[i] = false
- bundledStack[i] = 0
- end
- end
- local function getState()
- rsState = false
- for i = 1,#rsSides do
- rsState = rsState or rs.getInput(rsSides[i])
- end
- temp = rsState
- if rsState == lastState then
- rsState = 0
- else
- if rsState then
- rsState = 1
- else
- rsState = -1
- end
- end
- lastState = temp
- return rsState
- end
- local function setState(rsState)
- if rsState == 1 then
- stateStack = stateStack + 1
- elseif rsState == -1 then
- stateStack = stateStack -1
- end
- for i = 1, #rsSides do
- if stateStack < 0 then
- stateStack = 0
- elseif stateStack > 0 then
- rs.setOutput(rsSides[i],true)
- else
- rs.setOutput(rsSides[i],false)
- end
- end
- end
- local function getAnalog()
- analogNumber = 0
- for i = 1,#rsSides do
- analogNumber = analogNumber + rs.getAnalogInput(rsSides[i])
- end
- temp = analogNumber
- analogNumber = analogNumber - lastAnalog
- lastAnalog = temp
- return analogNumber
- end
- local function setAnalog(analogNumber)
- analogStack = analogStack + analogNumber
- if analogStack < 0 then
- analogStack = 0
- end
- for i = 1,#rsSides do
- if analogStack > 15 then
- rs.setAnalogOutput(rsSides[i],15)
- else
- rs.setAnalogOutput(rsSides[i],analogStack)
- end
- end
- end
- local function getBundled()
- for i = 1,16 do
- bundledStates[i] = false
- end
- for i = 1,16 do
- for l = 1,#rsSides do
- bundledStates[i] = bundledStates[i] or rs.testBundledInput(rsSides[l],bundledValues[i])
- end
- temp = bundledStates[i]
- if bundledStates[i] == lastBundled[i] then
- bundledStates[i] = 0
- else
- if bundledStates[i] then
- bundledStates[i] = 1
- else
- bundledStates[i] = -1
- end
- end
- lastBundled[i] = temp
- end
- bundledString = textutils.serialize(bundledStates)
- return bundledString
- end
- local function setBundled(bundledString)
- bundledNumber = 0
- bundledStates = textutils.unserialize(bundledString)
- for i = 1,16 do
- if bundledStates[i] == 1 then
- bundledStack[i] = bundledStack[i] + 1
- elseif bundledStates[i] == -1 then
- bundledStack[i] = bundledStack[i] - 1
- end
- if bundledStack[i] < 0 then
- bundledStack[i] = 0
- elseif bundledStack[i] > 0 then
- bundledNumber = bundledNumber + bundledValues[i]
- end
- end
- for i = 1,#rsSides do
- rs.setBundledOutput(rsSides[i],bundledNumber)
- end
- end
- startup()
- if computerType == "input" then
- while true do
- rsData.state = getState()
- rsData.analog = getAnalog()
- rsData.bundled = getBundled()
- message = textutils.serialize(rsData)
- for i = 1,#modems do
- for l = 1,#channels do
- modems[i].transmit(channels[l],channels[1],message)
- end
- end
- os.pullEvent("redstone")
- end
- end
- if computerType == "output" then
- while true do
- _,_,_,_,message = os.pullEvent("modem_message")
- rsData = textutils.unserialize(message)
- if analog then
- setAnalog(rsData.analog)
- else
- setState(rsData.state)
- end
- setBundled(rsData.bundled)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment