Advertisement
iMajesticButter

Untitled

Feb 14th, 2022
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.51 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. if qlast < 0 then
  50. return 0
  51. end
  52. return qlast - qfirst
  53. end
  54.  
  55. function log(string)
  56. print(string)
  57. rednet.broadcast("[" .. errorName .. "] " ..string, logging)
  58. end
  59.  
  60. function watchdogTimeout(funcName)
  61. -- wait for timeout
  62. sleep(timeoutTime)
  63. log(funcName.." Timed out! Took longer than " .. timeoutTime .. " seconds!")
  64. rednet.broadcast(errorName, timeoutErrorProtocol)
  65. error = true
  66. end
  67.  
  68. function dispenseItem(string)
  69.  
  70. parallel.waitForAny(
  71. function()
  72. log("attempting to dispense " .. string)
  73.  
  74. -- request that the item is dispensed
  75. rednet.broadcast(eventDispenseItem .. string, dispenserNodeProtocol)
  76. local message = ""
  77. local senderID = 0
  78.  
  79. log("dispense request sent to nodes")
  80.  
  81. -- wait for the response from the dispenser node
  82. while message ~= eventDispenseItemStarted .. string do
  83. senderID, message = rednet.receive(dispenserNodeProtocol)
  84. end
  85.  
  86. log("response received")
  87.  
  88. message = ""
  89. -- wait for the item to be detected on the conveyor
  90. while message ~= eventScanner .. scannerDispenser do
  91. senderID, message = rednet.receive(scannerProtocol)
  92. end
  93.  
  94. log("item detected! dispense successful!")
  95. end,
  96. watchdogTimeout("dispenseItem")
  97. )
  98. end
  99.  
  100. function selectBelt(beltSelector, beltNumber)
  101.  
  102. parallel.waitForAny(
  103. function()
  104. log("setting belt to "..beltNumber)
  105.  
  106. -- request a bet change
  107. local eventName = eventSelectBelt..beltSelector.." "
  108. rednet.broadcast(eventName..beltNumber, beltSelectorProtocol)
  109.  
  110. log("belt change request sent to belt selectors")
  111.  
  112. -- wait for the response from the belt selector
  113. local message = ""
  114. local senderID = 0
  115. while message ~= eventSelectBeltFinnished..beltSelector do
  116. senderID, message = rednet.receive(beltSelectorProtocol)
  117. end
  118.  
  119. log("Belt change confirmed! Successful!")
  120.  
  121. end,
  122. watchdogTimeout("selectBelt")
  123. )
  124. end
  125.  
  126. function errorCheck()
  127. if error == true then
  128. log("[ERROR] ERROR ENCOUNTERED!!!")
  129. error = false
  130. return true
  131. end
  132. return false
  133. end
  134.  
  135. function main()
  136.  
  137. parallel.waitForAny(
  138. function()
  139.  
  140. while true do
  141. if queue.length() > 0 then
  142. local request = queue.pop()
  143.  
  144. log("Processing request: " request.data.id)
  145.  
  146. -- select the beltNumber
  147. selectBelt(beltSelectorDispenser, request.data.id)
  148. if ~errorCheck() then
  149.  
  150. local numItems = request.data.length
  151.  
  152. -- loop over items
  153. for i = 0,numItems,1 do
  154. local item = request.data.items[i]
  155. if item ~= nil then
  156. log("Processing request item: " item)
  157. dispenseItem(item)
  158. if errorCheck() then
  159. break
  160. end
  161. end
  162. end
  163. end
  164. end
  165. end
  166. end,
  167. function()
  168.  
  169. while true do
  170. -- wait for requests
  171. local senderID, message = rednet.receive(dispenserRequestProtocol)
  172. print(message)
  173.  
  174. log("request received")
  175.  
  176. -- add it to the queue
  177. local request = {}
  178. request.data = textutils.unserialize(message)
  179.  
  180. queue.push(request)
  181.  
  182. -- respond with a confirmation
  183. rednet.broadcast(request.data.id, dispenserConfirmProtocol)
  184. end
  185. end
  186. )
  187.  
  188. end
  189.  
  190. main()
  191.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement