Advertisement
IronicPickle

enderControlMaster.lua

Feb 27th, 2020
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.61 KB | None | 0 0
  1. -- Args
  2. local args = { ... }
  3. local pollDelay = tonumber(args[1]) or 30
  4. local channel = tonumber(args[2]) or 40
  5.  
  6. -- Libraries
  7. local setup = require("/lua/lib/setupUtils")
  8. local monUtils = require("/lua/lib/monitorUtils")
  9. local write = monUtils.write
  10. local drawBox = monUtils.drawBox
  11. local render = require("/lua/lib/render")
  12.  
  13. -- Peripherals
  14. local wrappedPers = setup.getPers({
  15.     "monitor", "modem"
  16. })
  17. local monitor = setup.setupMonitor(
  18.     wrappedPers.monitor[1], 0.5
  19. )
  20. local modem = wrappedPers.modem[1]
  21. local speaker = peripheral.find("speaker")
  22.  
  23. -- Setup
  24. local data = {}
  25. local fullData = {}
  26. local buttons = {}
  27. local lastUpdated = 0
  28.  
  29. -- Windows
  30. local winHeader = setup.setupWindow(
  31.     monitor, 1, 1, monitor.x, 5
  32. )
  33. local winMain = setup.setupWindow(
  34.     monitor, 1, 6, monitor.x, (monitor.y - (5 + 5))
  35. )
  36. local windows = render.setupWindows(winMain)
  37. local winFooter = setup.setupWindow(
  38.     monitor, 1, (monitor.y - 4), monitor.x, 5
  39. )
  40.  
  41. -- Main
  42. function start()
  43.     print("# Program Started")
  44.     modem.open(channel)
  45.    
  46.     drawHeader()
  47.     drawMain()
  48.     updateRender()
  49.    
  50.     parallel.waitForAny(await, drawFooter,
  51.         function()
  52.             while(true) do
  53.                 poll()
  54.                 sleep(pollDelay)
  55.             end
  56.         end
  57.     )
  58. end
  59.  
  60. function await()
  61.     while(true) do
  62.         local event, p1, p2, p3, p4, p5 = os.pullEvent()
  63.        
  64.         local isTouch = (event == "monitor_touch")
  65.        
  66.         local isModemMessage = (event == "modem_message")
  67.        
  68.         if(isTouch) then
  69.             local x = p2
  70.             local y = p3 - winHeader.y
  71.            
  72.             for i, slave in pairs(fullData) do
  73.                 local window = slave.output
  74.                 local controlWindow = slave.controlOutput
  75.                 local slaveData = slave.data
  76.                
  77.                 local relX = x - (window.posX + controlWindow.posX)
  78.                 local relY = y - (window.posY + controlWindow.posY) + 2
  79.                
  80.                 if(relX >= 0 and relX <= 12) then
  81.                     for i, button in pairs(buttons) do
  82.                         if(relY == button.y) then
  83.                             if(speaker) then
  84.                                 speaker.playSound(
  85.                                     "minecraft:block.lever.click",
  86.                                     1, 0.8
  87.                                 )
  88.                             end
  89.                             modifySlave(slaveData.num,
  90.                                 {action = button.action}
  91.                             )
  92.                         end
  93.                     end
  94.                 end
  95.             end
  96.         elseif(isModemMessage) then
  97.             local body = p4
  98.             if(body.type == "pollRes") then
  99.                 local slaveData = body.slaveData
  100.                 local index = #data + 1
  101.                 table.insert(data, slaveData)
  102.                 table.sort(data,
  103.                     function(a, b)
  104.                         return a.num < b.num
  105.                     end
  106.                 )
  107.                 updateRender()
  108.             elseif(body.type == "updatePending") then
  109.                 poll()
  110.             end
  111.         end
  112.     end
  113. end
  114.  
  115. function modifySlave(num, changeData)
  116.     modem.transmit(channel, channel,
  117.         {
  118.             type = "modify",
  119.             slaveNum = num,
  120.             change = changeData
  121.         }
  122.     )
  123. end
  124.  
  125. function poll()
  126.     data = {}
  127.     lastUpdated = 0
  128.    
  129.     write(winFooter,
  130.         "Loading...", 2, 3, "right"
  131.     )
  132.    
  133.     modem.transmit(channel, channel,
  134.         {
  135.             type = "poll"
  136.         }
  137.     )
  138. end
  139.  
  140. function updateRender()
  141.     fullData = {}
  142.     for i, slaveData in pairs(data) do
  143.         table.insert(fullData, {
  144.             data = slaveData,
  145.             output = windows[i].window,
  146.             controlOutput = windows[i].controlWindow
  147.         })
  148.     end
  149.     winMain.clear()
  150.     drawHeader()
  151.     buttons = render.ender(fullData)
  152. end
  153.  
  154. function drawHeader()
  155.     winHeader.bg = colors.blue
  156.     winHeader.setBackgroundColor(winHeader.bg)
  157.    
  158.     drawBox(winHeader,
  159.         1, 1, winHeader.x, winHeader.y,
  160.         true
  161.     )
  162.    
  163.     write(winHeader,
  164.         "Endergenic Resonation Monitor",
  165.         0, 2, "centre"
  166.     )
  167.     write(winHeader,
  168.         "Monitoring " .. #data .. " units",
  169.         0, 4, "centre"
  170.     )
  171. end
  172.  
  173. function drawFooter()
  174.     winFooter.bg = colors.blue
  175.     winFooter.setBackgroundColor(winFooter.bg)
  176.    
  177.     drawBox(winFooter,
  178.         1, 1, winFooter.x, winFooter.y,
  179.         true
  180.     )
  181.    
  182.     while(true) do
  183.         winFooter.clear()
  184.         drawBox(winFooter,
  185.             1, 1, winFooter.x, 1,
  186.             true, colors.white
  187.         )
  188.         local msg = "Last Updated: "
  189.         if(lastUpdated == 0) then
  190.             msg = msg .. "Just now"
  191.         else
  192.             msg = msg .. lastUpdated .. " seconds ago"
  193.         end
  194.         write(winFooter,
  195.             msg, 0, 3, "centre"
  196.         )
  197.         lastUpdated = lastUpdated + 1
  198.         sleep(1)
  199.     end
  200. end
  201.  
  202. function drawMain()
  203.     winMain.bg = colors.white
  204.     winMain.setBackgroundColor(winMain.bg)
  205.    
  206.     drawBox(winMain,
  207.         1, 1, winMain.x, winMain.y,
  208.         true
  209.     )
  210.    
  211.     for i, window in pairs(windows) do
  212.         windows[i].window.bg = colors.purple
  213.         windows[i].window.setBackgroundColor(
  214.             colors.purple
  215.         )
  216.        
  217.         local window = windows[i].window
  218.        
  219.         drawBox(window,
  220.             1, 1, window.x, window.y,
  221.             true
  222.         )
  223.        
  224.     end
  225. end
  226.  
  227. setup.utilsWrapper(start, modem, channel)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement