Advertisement
iMajesticButter

Untitled

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