Advertisement
iMajesticButter

Untitled

Feb 14th, 2022
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.31 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 - 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. watchdogTimeout("dispenseItem")
  94. )
  95. end
  96.  
  97. function selectBelt(beltSelector, beltNumber)
  98.  
  99. parallel.waitForAny(
  100. function()
  101. log("setting belt to "..beltNumber)
  102.  
  103. -- request a bet change
  104. local eventName = eventSelectBelt..beltSelector.." "
  105. rednet.broadcast(eventName..beltNumber, beltSelectorProtocol)
  106.  
  107. log("belt change request sent to belt selectors")
  108.  
  109. -- wait for the response from the belt selector
  110. local message = ""
  111. local senderID = 0
  112. while message ~= eventSelectBeltFinnished..beltSelector do
  113. senderID, message = rednet.receive(beltSelectorProtocol)
  114. end
  115.  
  116. log("Belt change confirmed! Successful!")
  117.  
  118. end,
  119. watchdogTimeout("selectBelt")
  120. )
  121. end
  122.  
  123. function errorCheck()
  124. if error == true then
  125. log("[ERROR] ERROR ENCOUNTERED!!!")
  126. error = false
  127. goto ERROR
  128. end
  129. end
  130.  
  131. function main()
  132.  
  133. parallel.waitForAny(
  134. function()
  135.  
  136. ::ERROR::
  137.  
  138. while true do
  139. if queue.length() > 0 then
  140. local request = queue.pop()
  141.  
  142. log("Processing request: " request.data.id)
  143.  
  144. -- select the beltNumber
  145. selectBelt(beltSelectorDispenser, request.data.id)
  146. errorCheck()
  147.  
  148. local numItems = request.data.length
  149.  
  150. -- loop over items
  151. for i = 0,numItems,1 do
  152. local item = request.data.items[i]
  153. if item ~= nil then
  154. log("Processing request item: " item)
  155. dispenseItem(item)
  156. errorCheck()
  157. end
  158. end
  159. end
  160. end
  161. end,
  162. function()
  163.  
  164. while true do
  165. -- wait for requests
  166. local senderID, message = rednet.receive(dispenserRequestProtocol)
  167. print(message)
  168.  
  169. log("request received")
  170.  
  171. -- add it to the queue
  172. local request = {}
  173. request.data = textutils.unserialize(message)
  174.  
  175. queue.push(request)
  176.  
  177. -- respond with a confirmation
  178. rednet.broadcast(request.data.id, dispenserConfirmProtocol)
  179. end
  180. end
  181. )
  182.  
  183. end
  184.  
  185. main()
  186.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement