Advertisement
iMajesticButter

Untitled

Feb 15th, 2022
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.09 KB | None | 0 0
  1. local modem = peripheral.find("modem", rednet.open);
  2.  
  3. local logging = "Potion_Brewer_LOGGER"
  4.  
  5. local errorName = "DISPENSER_CONTROLLER"
  6.  
  7. -- different protocols used by this program
  8. local dispenserRequestProtocol = "Potion_Brewer_Dispenser_Request_v001"
  9. local dispenserConfirmProtocol = "Potion_Brewer_Dispenser_Confirm_v001"
  10. local dispenserCompleteProtocol = "Potion_Brewer_Dispenser_Complete_v001"
  11. local dispenserNodeProtocol = "Potion_Brewer_Ingredient_Dispenser_Node_v001"
  12. local beltSelectorProtocol = "Potion_Brewer_BELT_SELECTOR"
  13. local scannerProtocol = "Potion_Brewer_SCANNER"
  14.  
  15. local timeoutErrorProtocol = "Potion_Brewer_ERROR_PROTOCOL_TIMEOUT"
  16.  
  17. -- different event names used by this program (lets just use protocols in future)
  18. local eventDispenseItem = "EVENT_DISPENSE_"
  19. local eventDispenseItemStarted = "EVENT_DISPENSE_STARTED_"
  20. local eventSelectBelt = "EVENT_BELT_SELECT_"
  21. local eventSelectBeltFinnished = "EVENT_BELT_SELECT_FINNISHED_"
  22. local eventScanner = "EVENT_SCANNER_"
  23.  
  24. local scannerDispenser = "dispenser"
  25. local beltSelectorDispenser = "dispenser"
  26.  
  27. local timeoutTime = 10
  28.  
  29. local error = false
  30.  
  31. -- the queue of requests
  32. local qfirst = 0
  33. local qlast = -1
  34. local queue = {}
  35.  
  36. queue.push = function(item)
  37. qlast = qlast + 1
  38. queue[qlast] = item
  39. end
  40. queue.pop = function()
  41. if qfirst <= qlast then
  42. local value = queue[qfirst]
  43. queue[qfirst] = nil
  44. qfirst = qfirst + 1
  45. return value
  46. end
  47. end
  48. queue.length = function()
  49. return (qlast + 1) - qfirst
  50. end
  51.  
  52. function log(string)
  53. print(string)
  54. rednet.broadcast("[" .. errorName .. "] " ..string, logging)
  55. end
  56.  
  57. function watchdogTimeout(funcName)
  58. -- wait for timeout
  59. sleep(timeoutTime)
  60. log(funcName.." Timed out! Took longer than " .. timeoutTime .. " seconds!")
  61. rednet.broadcast(errorName, timeoutErrorProtocol)
  62. error = true
  63. end
  64.  
  65. function dispenseItem(string)
  66.  
  67. parallel.waitForAny(
  68. function()
  69. log("attempting to dispense " .. string)
  70.  
  71. -- request that the item is dispensed
  72. rednet.broadcast(eventDispenseItem .. string, dispenserNodeProtocol)
  73. local message = ""
  74. local senderID = 0
  75.  
  76. log("dispense request sent to nodes")
  77.  
  78. -- wait for the response from the dispenser node
  79. while message ~= eventDispenseItemStarted .. string do
  80. senderID, message = rednet.receive(dispenserNodeProtocol)
  81. end
  82.  
  83. log("response received")
  84.  
  85. message = ""
  86. -- wait for the item to be detected on the conveyor
  87. while message ~= eventScanner .. scannerDispenser do
  88. senderID, message = rednet.receive(scannerProtocol)
  89. end
  90.  
  91. log("item detected! dispense successful!")
  92. end,
  93. function()
  94. watchdogTimeout("dispenseItem")
  95. end
  96. )
  97. end
  98.  
  99. function selectBelt(beltSelector, beltNumber)
  100.  
  101. parallel.waitForAny(
  102. function()
  103. log("setting belt to "..beltNumber)
  104.  
  105. -- request a bet change
  106. local eventName = eventSelectBelt..beltSelector.." "
  107. rednet.broadcast(eventName..beltNumber, beltSelectorProtocol)
  108.  
  109. log("belt change request sent to belt selectors")
  110.  
  111. -- wait for the response from the belt selector
  112. local message = ""
  113. local senderID = 0
  114. while message ~= eventSelectBeltFinnished..beltSelector.." "..beltNumber do
  115. senderID, message = rednet.receive(beltSelectorProtocol)
  116. end
  117.  
  118. log("Belt change confirmed! Successful!")
  119.  
  120. end,
  121. function()
  122. watchdogTimeout("selectBelt")
  123. end
  124. )
  125. end
  126.  
  127. function errorCheck()
  128. if error == true then
  129. log("[ERROR] ERROR ENCOUNTERED!!!")
  130. error = false
  131. return true
  132. end
  133. return false
  134. end
  135.  
  136. function main()
  137.  
  138. -- stop the machine
  139. redstone.setOutput("back", true)
  140.  
  141. parallel.waitForAny(
  142. function()
  143.  
  144. while true do
  145. if queue.length() > 0 then
  146. local request = queue.pop()
  147.  
  148. redstone.setOutput("back", false)
  149.  
  150. if(request ~= nil and request.data ~= nil and request.data.id ~= nil and request.data.length ~= nil and request.data.items ~= nil) then
  151.  
  152. log("Processing request: " .. request.data.id)
  153.  
  154. -- select the beltNumber
  155. selectBelt(beltSelectorDispenser, request.data.id)
  156. if errorCheck() == false then
  157.  
  158. local numItems = request.data.length
  159.  
  160. -- loop over items
  161. for i = 0,numItems,1 do
  162. local item = request.data.items[i]
  163. if item ~= nil then
  164. log("Processing request item: " .. item)
  165. dispenseItem(item)
  166. if errorCheck() == true then
  167. break
  168. end
  169. end
  170. end
  171. end
  172. end
  173.  
  174. sleep(0.2)
  175.  
  176. else
  177. redstone.setOutput("back", true)
  178. end
  179.  
  180. os.sleep(0.5)
  181.  
  182. end
  183. end,
  184. function()
  185.  
  186. while true do
  187. -- wait for requests
  188. local senderID, message = rednet.receive(dispenserRequestProtocol)
  189. print(message)
  190.  
  191. log("request received")
  192.  
  193. -- add it to the queue
  194. local request = {}
  195. request.data = textutils.unserialize(message)
  196.  
  197. queue.push(request)
  198.  
  199. -- respond with a confirmation
  200. rednet.broadcast(request.data.id, dispenserConfirmProtocol)
  201. end
  202. end
  203. )
  204.  
  205. end
  206.  
  207. main()
  208.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement