babulm

Untitled

Apr 5th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.46 KB | None | 0 0
  1. -- modifiable variables
  2. local reactorSide = "back"
  3. local fluxgateSide = "right"
  4.  
  5. local targetStrength = 50
  6. local maxTemperature = 8000
  7. local safeTemperature = 3000
  8. local lowestFieldPercent = 15
  9.  
  10. local activateOnCharged = 1
  11.  
  12. -- please leave things untouched from here on
  13. os.loadAPI("lib/f")
  14.  
  15. local version = "0.25"
  16. -- toggleable via the monitor, use our algorithm to achieve our target field strength or let the user tweak it
  17. local autoInputGate = 1
  18. local curInputGate = 222000
  19.  
  20. -- monitor
  21. local mon, monitor, monX, monY
  22.  
  23. -- peripherals
  24. local reactor
  25. local fluxgate
  26. local inputfluxgate
  27.  
  28. -- reactor information
  29. local ri
  30.  
  31. -- last performed action
  32. local action = "None since reboot"
  33. local emergencyCharge = false
  34. local emergencyTemp = false
  35.  
  36. monitor = f.periphSearch("monitor")
  37. inputfluxgate = f.periphSearch("flux_gate")
  38. fluxgate = peripheral.wrap(fluxgateSide)
  39. reactor = peripheral.wrap(reactorSide)
  40.  
  41. if monitor == null then
  42. error("No valid monitor was found")
  43. end
  44.  
  45. if fluxgate == null then
  46. error("No valid fluxgate was found")
  47. end
  48.  
  49. if reactor == null then
  50. error("No valid reactor was found")
  51. end
  52.  
  53. if inputfluxgate == null then
  54. error("No valid flux gate was found")
  55. end
  56.  
  57. monX, monY = monitor.getSize()
  58. mon = {}
  59. mon.monitor,mon.X, mon.Y = monitor, monX, monY
  60.  
  61. --write settings to config file
  62. function save_config()
  63. sw = fs.open("config.txt", "w")
  64. sw.writeLine(version)
  65. sw.writeLine(autoInputGate)
  66. sw.writeLine(curInputGate)
  67. sw.close()
  68. end
  69.  
  70. --read settings from file
  71. function load_config()
  72. sr = fs.open("config.txt", "r")
  73. version = sr.readLine()
  74. autoInputGate = tonumber(sr.readLine())
  75. curInputGate = tonumber(sr.readLine())
  76. sr.close()
  77. end
  78.  
  79.  
  80. -- 1st time? save our settings, if not, load our settings
  81. if fs.exists("config.txt") == false then
  82. save_config()
  83. else
  84. load_config()
  85. end
  86.  
  87. function buttons()
  88.  
  89. while true do
  90. -- button handler
  91. event, side, xPos, yPos = os.pullEvent("monitor_touch")
  92.  
  93. -- output gate controls
  94. -- 2-4 = -1000, 6-9 = -10000, 10-12,8 = -100000
  95. -- 17-19 = +1000, 21-23 = +10000, 25-27 = +100000
  96. if yPos == 8 then
  97. local cFlow = fluxgate.getSignalLowFlow()
  98. if xPos >= 2 and xPos <= 4 then
  99. cFlow = cFlow-1000
  100. elseif xPos >= 6 and xPos <= 9 then
  101. cFlow = cFlow-10000
  102. elseif xPos >= 10 and xPos <= 12 then
  103. cFlow = cFlow-100000
  104. elseif xPos >= 17 and xPos <= 19 then
  105. cFlow = cFlow+100000
  106. elseif xPos >= 21 and xPos <= 23 then
  107. cFlow = cFlow+10000
  108. elseif xPos >= 25 and xPos <= 27 then
  109. cFlow = cFlow+1000
  110. end
  111. fluxgate.setSignalLowFlow(cFlow)
  112. end
  113.  
  114. -- input gate controls
  115. -- 2-4 = -1000, 6-9 = -10000, 10-12,8 = -100000
  116. -- 17-19 = +1000, 21-23 = +10000, 25-27 = +100000
  117. if yPos == 10 and autoInputGate == 0 and xPos ~= 14 and xPos ~= 15 then
  118. if xPos >= 2 and xPos <= 4 then
  119. curInputGate = curInputGate-1000
  120. elseif xPos >= 6 and xPos <= 9 then
  121. curInputGate = curInputGate-10000
  122. elseif xPos >= 10 and xPos <= 12 then
  123. curInputGate = curInputGate-100000
  124. elseif xPos >= 17 and xPos <= 19 then
  125. curInputGate = curInputGate+100000
  126. elseif xPos >= 21 and xPos <= 23 then
  127. curInputGate = curInputGate+10000
  128. elseif xPos >= 25 and xPos <= 27 then
  129. curInputGate = curInputGate+1000
  130. end
  131. inputfluxgate.setSignalLowFlow(curInputGate)
  132. save_config()
  133. end
  134.  
  135. -- input gate toggle
  136. if yPos == 10 and ( xPos == 14 or xPos == 15) then
  137. if autoInputGate == 1 then
  138. autoInputGate = 0
  139. else
  140. autoInputGate = 1
  141. end
  142. save_config()
  143. end
  144.  
  145. end
  146. end
  147.  
  148. function drawButtons(y)
  149.  
  150. -- 2-4 = -1000, 6-9 = -10000, 10-12,8 = -100000
  151. -- 17-19 = +1000, 21-23 = +10000, 25-27 = +100000
  152.  
  153. f.draw_text(mon, 2, y, " < ", colors.white, colors.gray)
  154. f.draw_text(mon, 6, y, " <<", colors.white, colors.gray)
  155. f.draw_text(mon, 10, y, "<<<", colors.white, colors.gray)
  156.  
  157. f.draw_text(mon, 17, y, ">>>", colors.white, colors.gray)
  158. f.draw_text(mon, 21, y, ">> ", colors.white, colors.gray)
  159. f.draw_text(mon, 25, y, " > ", colors.white, colors.gray)
  160. end
  161.  
  162.  
  163.  
  164. function update()
  165. while true do
  166.  
  167. f.clear(mon)
  168.  
  169. ri = reactor.getReactorInfo()
  170.  
  171. -- print out all the infos from .getReactorInfo() to term
  172.  
  173. if ri == nil then
  174. error("reactor has an invalid setup")
  175. end
  176.  
  177. for k, v in pairs (ri) do
  178. print(k.. ": ".. v)
  179. end
  180. print("Output Gate: ", fluxgate.getSignalLowFlow())
  181. print("Input Gate: ", inputfluxgate.getSignalLowFlow())
  182.  
  183. -- monitor output
  184.  
  185. local statusColor
  186. statusColor = colors.red
  187.  
  188. if ri.status == "online" or ri.status == "charged" then
  189. statusColor = colors.green
  190. elseif ri.status == "offline" then
  191. statusColor = colors.gray
  192. elseif ri.status == "charging" then
  193. statusColor = colors.orange
  194. end
  195.  
  196. f.draw_text_lr(mon, 2, 2, 1, "Reactor Status", string.upper(ri.status), colors.white, statusColor, colors.black)
  197.  
  198. f.draw_text_lr(mon, 2, 4, 1, "Generation", f.format_int(ri.generationRate) .. " rf/t", colors.white, colors.lime, colors.black)
  199.  
  200. local tempColor = colors.red
  201. if ri.temperature <= 5000 then tempColor = colors.green end
  202. if ri.temperature >= 5000 and ri.temperature <= 6500 then tempColor = colors.orange end
  203. f.draw_text_lr(mon, 2, 6, 1, "Temperature", f.format_int(ri.temperature) .. "C", colors.white, tempColor, colors.black)
  204.  
  205. f.draw_text_lr(mon, 2, 7, 1, "Output Gate", f.format_int(fluxgate.getSignalLowFlow()) .. " rf/t", colors.white, colors.blue, colors.black)
  206.  
  207. -- buttons
  208. drawButtons(8)
  209.  
  210. f.draw_text_lr(mon, 2, 9, 1, "Input Gate", f.format_int(inputfluxgate.getSignalLowFlow()) .. " rf/t", colors.white, colors.blue, colors.black)
  211.  
  212. if autoInputGate == 1 then
  213. f.draw_text(mon, 14, 10, "AU", colors.white, colors.gray)
  214. else
  215. f.draw_text(mon, 14, 10, "MA", colors.white, colors.gray)
  216. drawButtons(10)
  217. end
  218.  
  219. local satPercent
  220. satPercent = math.ceil(ri.energySaturation / ri.maxEnergySaturation * 10000)*.01
  221.  
  222. f.draw_text_lr(mon, 2, 11, 1, "Energy Saturation", satPercent .. "%", colors.white, colors.white, colors.black)
  223. f.progress_bar(mon, 2, 12, mon.X-2, satPercent, 100, colors.blue, colors.gray)
  224.  
  225. local fieldPercent, fieldColor
  226. fieldPercent = math.ceil(ri.fieldStrength / ri.maxFieldStrength * 10000)*.01
  227.  
  228. fieldColor = colors.red
  229. if fieldPercent >= 50 then fieldColor = colors.green end
  230. if fieldPercent < 50 and fieldPercent > 30 then fieldColor = colors.orange end
  231.  
  232. if autoInputGate == 1 then
  233. f.draw_text_lr(mon, 2, 14, 1, "Field Strength T:" .. targetStrength, fieldPercent .. "%", colors.white, fieldColor, colors.black)
  234. else
  235. f.draw_text_lr(mon, 2, 14, 1, "Field Strength", fieldPercent .. "%", colors.white, fieldColor, colors.black)
  236. end
  237. f.progress_bar(mon, 2, 15, mon.X-2, fieldPercent, 100, fieldColor, colors.gray)
  238.  
  239. local fuelPercent, fuelColor
  240.  
  241. fuelPercent = 100 - math.ceil(ri.fuelConversion / ri.maxFuelConversion * 10000)*.01
  242.  
  243. fuelColor = colors.red
  244.  
  245. if fuelPercent >= 70 then fuelColor = colors.green end
  246. if fuelPercent < 70 and fuelPercent > 30 then fuelColor = colors.orange end
  247.  
  248. f.draw_text_lr(mon, 2, 17, 1, "Fuel ", fuelPercent .. "%", colors.white, fuelColor, colors.black)
  249. f.progress_bar(mon, 2, 18, mon.X-2, fuelPercent, 100, fuelColor, colors.gray)
  250.  
  251. f.draw_text_lr(mon, 2, 19, 1, "Action ", action, colors.gray, colors.gray, colors.black)
  252.  
  253. -- actual reactor interaction
  254. --
  255. if emergencyCharge == true then
  256. reactor.chargeReactor()
  257. end
  258.  
  259. -- are we charging? open the floodgates
  260. if ri.status == "charging" then
  261. inputfluxgate.setSignalLowFlow(900000)
  262. emergencyCharge = false
  263. end
  264.  
  265. -- are we stopping from a shutdown and our temp is better? activate
  266. if emergencyTemp == true and ri.status == "stopping" and ri.temperature < safeTemperature then
  267. reactor.activateReactor()
  268. emergencyTemp = false
  269. end
  270.  
  271. -- are we charged? lets activate
  272. if ri.status == "charged" and activateOnCharged == 1 then
  273. reactor.activateReactor()
  274. end
  275.  
  276. -- are we on? regulate the input fludgate to our target field strength
  277. -- or set it to our saved setting since we are on manual
  278. if ri.status == "online" then
  279. if autoInputGate == 1 then
  280. fluxval = ri.fieldDrainRate / (1 - (targetStrength/100) )
  281. print("Target Gate: ".. fluxval)
  282. inputfluxgate.setSignalLowFlow(fluxval)
  283. else
  284. inputfluxgate.setSignalLowFlow(curInputGate)
  285. end
  286. end
  287.  
  288. -- safeguards
  289. --
  290.  
  291. -- out of fuel, kill it
  292. if fuelPercent <= 10 then
  293. reactor.stopReactor()
  294. action = "Fuel below 10%, refuel"
  295. end
  296.  
  297. -- field strength is too dangerous, kill and it try and charge it before it blows
  298. if fieldPercent <= lowestFieldPercent and ri.status == "online" then
  299. action = "Field Str < " ..lowestFieldPercent.."%"
  300. reactor.stopReactor()
  301. reactor.chargeReactor()
  302. emergencyCharge = true
  303. end
  304.  
  305. -- temperature too high, kill it and activate it when its cool
  306. if ri.temperature > maxTemperature then
  307. reactor.stopReactor()
  308. action = "Temp > " .. maxTemperature
  309. emergencyTemp = true
  310. end
  311.  
  312. sleep(0.1)
  313. end
  314. end
  315.  
  316. parallel.waitForAny(buttons, update)
Add Comment
Please, Sign In to add comment