Advertisement
iMajesticButter

Untitled

Feb 14th, 2022
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.47 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 + 1)
  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. return true
  128. end
  129. return false
  130. end
  131.  
  132. function main()
  133.  
  134. parallel.waitForAny(
  135. function()
  136.  
  137. while true do
  138. if queue.length() > 0 then
  139. local request = queue.pop()
  140.  
  141. log("Processing request: " request.data.id)
  142.  
  143. -- select the beltNumber
  144. selectBelt(beltSelectorDispenser, request.data.id)
  145. if ~errorCheck() then
  146.  
  147. local numItems = request.data.length
  148.  
  149. -- loop over items
  150. for i = 0,numItems,1 do
  151. local item = request.data.items[i]
  152. if item ~= nil then
  153. log("Processing request item: " item)
  154. dispenseItem(item)
  155. if errorCheck() then
  156. break
  157. end
  158. end
  159. end
  160. end
  161. end
  162. end
  163. end,
  164. function()
  165.  
  166. while true do
  167. -- wait for requests
  168. local senderID, message = rednet.receive(dispenserRequestProtocol)
  169. print(message)
  170.  
  171. log("request received")
  172.  
  173. -- add it to the queue
  174. local request = {}
  175. request.data = textutils.unserialize(message)
  176.  
  177. queue.push(request)
  178.  
  179. -- respond with a confirmation
  180. rednet.broadcast(request.data.id, dispenserConfirmProtocol)
  181. end
  182. end
  183. )
  184.  
  185. end
  186.  
  187. main()
  188.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement