Jyzarc

ModemRS 2.0

Dec 15th, 2013
297
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.88 KB | None | 0 0
  1. local modemSides = {}
  2. local rsSides = {}
  3. local channels = {}
  4. local computerType = "input"
  5. local analog = true
  6.  
  7. local version = "2.0.1"
  8. local i
  9. local l
  10. local _
  11. local temp
  12. local message
  13. local rsState
  14. local lastState = false
  15. local stateStack = 0
  16. local analogNumber
  17. local lastAnalog = 0
  18. local analogStack = 0
  19. local bundledStates = {}
  20. local bundledString
  21. local lastBundled = {}
  22. local bundledStack = {}
  23. local bundledNumber
  24. local modems = {}
  25. local bundledValues = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768}
  26. local rsData = {state,analog,bundled}
  27.  
  28. local function startup()
  29.     term.clear()
  30.     term.setCursorPos(1,1)
  31.     print("Running ModemRS version "..version.." by Jyzarc27")
  32.     for i = 1,#modemSides do
  33.         if peripheral.getType(modemSides[i]) == "modem" then
  34.             modems[#modems+1] = peripheral.wrap(modemSides[i])
  35.         end
  36.     end
  37.     for i = 1,#modems do
  38.         for l = 1,#channels do
  39.             modems[i].open(channels[l])
  40.         end
  41.     end
  42.     for i = 1,16 do
  43.         lastBundled[i] = false
  44.         bundledStack[i] = 0
  45.     end
  46. end
  47.  
  48. local function getState()
  49.     rsState = false
  50.     for i = 1,#rsSides do
  51.         rsState = rsState or rs.getInput(rsSides[i])
  52.     end
  53.     temp = rsState
  54.     if rsState == lastState then
  55.         rsState = 0
  56.     else
  57.         if rsState then
  58.             rsState = 1
  59.         else
  60.             rsState = -1
  61.         end
  62.     end
  63.     lastState = temp
  64.     return rsState
  65. end
  66.  
  67. local function setState(rsState)
  68.     if rsState == 1 then
  69.         stateStack = stateStack + 1
  70.     elseif rsState == -1 then
  71.         stateStack = stateStack -1
  72.     end
  73.     for i = 1, #rsSides do
  74.         if stateStack < 0 then
  75.             stateStack = 0
  76.         elseif stateStack > 0 then
  77.             rs.setOutput(rsSides[i],true)
  78.         else
  79.             rs.setOutput(rsSides[i],false)
  80.         end
  81.     end
  82. end
  83.  
  84. local function getAnalog()
  85.     analogNumber = 0
  86.     for i = 1,#rsSides do
  87.         analogNumber = analogNumber + rs.getAnalogInput(rsSides[i])
  88.     end
  89.     temp = analogNumber
  90.     analogNumber = analogNumber - lastAnalog
  91.     lastAnalog = temp
  92.     return analogNumber
  93. end
  94.  
  95. local function setAnalog(analogNumber)
  96.     analogStack = analogStack + analogNumber
  97.     if analogStack < 0 then
  98.         analogStack = 0
  99.     end
  100.     for i = 1,#rsSides do
  101.         if analogStack > 15 then
  102.             rs.setAnalogOutput(rsSides[i],15)
  103.         else
  104.             rs.setAnalogOutput(rsSides[i],analogStack)
  105.         end
  106.     end
  107. end
  108.  
  109. local function getBundled()
  110.     for i = 1,16 do
  111.         bundledStates[i] = false
  112.     end
  113.     for i = 1,16 do
  114.         for l = 1,#rsSides do
  115.             bundledStates[i] = bundledStates[i] or rs.testBundledInput(rsSides[l],bundledValues[i])
  116.         end
  117.         temp = bundledStates[i]
  118.         if bundledStates[i] == lastBundled[i] then
  119.             bundledStates[i] = 0
  120.         else
  121.             if bundledStates[i] then
  122.                 bundledStates[i] = 1
  123.             else
  124.                 bundledStates[i] = -1
  125.             end
  126.         end
  127.         lastBundled[i] = temp
  128.     end
  129.     bundledString = textutils.serialize(bundledStates)
  130.     return bundledString
  131. end
  132.  
  133. local function setBundled(bundledString)
  134.     bundledNumber = 0
  135.     bundledStates = textutils.unserialize(bundledString)
  136.     for i = 1,16 do
  137.         if bundledStates[i] == 1 then
  138.             bundledStack[i] = bundledStack[i] + 1
  139.         elseif bundledStates[i] == -1 then
  140.             bundledStack[i] = bundledStack[i] - 1
  141.         end
  142.         if bundledStack[i] < 0 then
  143.             bundledStack[i] = 0
  144.         elseif bundledStack[i] > 0 then
  145.             bundledNumber = bundledNumber + bundledValues[i]
  146.         end
  147.     end
  148.     for i = 1,#rsSides do
  149.         rs.setBundledOutput(rsSides[i],bundledNumber)
  150.     end
  151. end
  152.  
  153. startup()
  154.  
  155. if computerType == "input" then
  156.     while true do
  157.         rsData.state = getState()
  158.         rsData.analog = getAnalog()
  159.         rsData.bundled = getBundled()
  160.         message = textutils.serialize(rsData)
  161.         for i = 1,#modems do
  162.             for l = 1,#channels do
  163.                 modems[i].transmit(channels[l],channels[1],message)
  164.             end
  165.         end
  166.         os.pullEvent("redstone")
  167.     end
  168. end
  169.  
  170. if computerType == "output" then
  171.     while true do
  172.         _,_,_,_,message = os.pullEvent("modem_message")
  173.         rsData = textutils.unserialize(message)
  174.         if analog then
  175.             setAnalog(rsData.analog)
  176.         else
  177.             setState(rsData.state)
  178.         end
  179.         setBundled(rsData.bundled)
  180.     end
  181. end
Advertisement
Add Comment
Please, Sign In to add comment