Jyzarc

ModemRS

Dec 13th, 2013
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.80 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.0"
  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.         --bundledValues[i] = 2^(i-2)
  46.     end
  47. end
  48.  
  49. local function getState()
  50.     rsState = false
  51.     for i = 1,#rsSides do
  52.         rsState = rsState or rs.getInput(rsSides[i])
  53.     end
  54.     temp = rsState
  55.     if rsState == lastState then
  56.         rsState = 0
  57.     else
  58.         if rsState then
  59.             rsState = 1
  60.         else
  61.             rsState = -1
  62.         end
  63.     end
  64.     lastState = temp
  65.     return rsState
  66. end
  67.  
  68. local function setState(rsState)
  69.     if rsState == 1 then
  70.         stateStack = stateStack + 1
  71.     elseif rsState == -1 then
  72.         stateStack = stateStack -1
  73.     end
  74.     for i = 1, #rsSides do
  75.         if stateStack > 0 then
  76.             rs.setOutput(rsSides[i],true)
  77.         else
  78.             rs.setOutput(rsSides[i],false)
  79.         end
  80.     end
  81. end
  82.  
  83. local function getAnalog()
  84.     analogNumber = 0
  85.     for i = 1,#rsSides do
  86.         analogNumber = analogNumber + rs.getAnalogInput(rsSides[i])
  87.     end
  88.     temp = analogNumber
  89.     analogNumber = analogNumber - lastAnalog
  90.     lastAnalog = temp
  91.     return analogNumber
  92. end
  93.  
  94. local function setAnalog(analogNumber)
  95.     analogStack = analogStack + analogNumber
  96.     if analogStack < 0 then
  97.         analogStack = 0
  98.     end
  99.     for i = 1,#rsSides do
  100.         if analogStack > 15 then
  101.             rs.setAnalogOutput(rsSides[i],15)
  102.         else
  103.             rs.setAnalogOutput(rsSides[i],analogStack)
  104.         end
  105.     end
  106. end
  107.  
  108. local function getBundled()
  109.     for i = 1,16 do
  110.         bundledStates[i] = false
  111.     end
  112.     for i = 1,16 do
  113.         for l = 1,#rsSides do
  114.             bundledStates[i] = bundledStates[i] or rs.testBundledInput(rsSides[l],bundledValues[i])
  115.         end
  116.         temp = bundledStates[i]
  117.         if bundledStates[i] == lastBundled[i] then
  118.             bundledStates[i] = 0
  119.         else
  120.             if bundledStates[i] then
  121.                 bundledStates[i] = 1
  122.             else
  123.                 bundledStates[i] = -1
  124.             end
  125.         end
  126.         lastBundled[i] = temp
  127.     end
  128.     bundledString = textutils.serialize(bundledStates)
  129.     return bundledString
  130. end
  131.  
  132. local function setBundled(bundledString)
  133.     bundledNumber = 0
  134.     bundledStates = textutils.unserialize(bundledString)
  135.     for i = 1,16 do
  136.         if bundledStates[i] == 1 then
  137.             bundledStack[i] = bundledStack[i] + 1
  138.         elseif bundledStates[i] == -1 then
  139.             bundledStack[i] = bundledStack[i] - 1
  140.         end
  141.         if bundledStack[i] > 1 then
  142.             bundledNumber = bundledNumber + colorValues[i]
  143.         end
  144.     end
  145.     for i = 1,#rsSides do
  146.         rs.setBundledOutput(rsSides[i],bundledNumber)
  147.     end
  148. end
  149.  
  150. startup()
  151.  
  152. if computerType == "input" then
  153.     while true do
  154.         rsData.state = getState()
  155.         rsData.analog = getAnalog()
  156.         rsData.bundled = getBundled()
  157.         message = textutils.serialize(rsData)
  158.         for i = 1,#modems do
  159.             for l = 1,#channels do
  160.                 modems[i].transmit(channels[l],channels[1],message)
  161.             end
  162.         end
  163.         os.pullEvent("redstone")
  164.     end
  165. end
  166.  
  167. if computerType == "output" then
  168.     while true do
  169.         _,_,_,_,message = os.pullEvent("modem_message")
  170.         rsData = textutils.unserialize(message)
  171.         if analog then
  172.             setAnalog(rsData.analog)
  173.         else
  174.             setState(rsData.state)
  175.         end
  176.         setBundled(rsData.bundled)
  177.     end
  178. end
Advertisement
Add Comment
Please, Sign In to add comment