Advertisement
Kalearne

Untitled

Jun 23rd, 2019
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.73 KB | None | 0 0
  1. local component = require "component"
  2. local keyboard = require "keyboard"
  3. local term = require "term"
  4. local os = require "os"
  5. local event = require "event"
  6. local gpu = component.gpu
  7. local turbine = {}
  8. local turbineAvailable
  9.  
  10. local w, h = gpu.getResolution()
  11. defaultBgColour = gpu.getBackground()
  12. defaultFgColour = gpu.getForeground()
  13. local running = true
  14. local refreshRate = .8
  15.  
  16. local thTable = {"STEAM IN", "COOLANT OUT", "ROTOR SPEED", "ROTOR MASS", "EFFICIENCY", "INDUCTOR STATE", "RF OUT", "STORED RF"}
  17. local turbineMaxSteamIn = 0
  18.  
  19.  
  20. local powerON = 975001 -- Set here where the turbines should reactivate after a shutdown
  21. local powerOFF = 1000000 -- Turbine max energy buffer. Turbines will shutdown
  22.  
  23. --CLEAR THE SCREEN
  24. gpu.fill(1, 1, w, h, " ")
  25.  
  26. -- COLOURS
  27. local colours = {}
  28. colours.white = 0xFFFFFF
  29. colours.orange = 0xFFA500
  30. colours.magenta = 0xFF00FF
  31. colours.lightblue = 0x00AEEF
  32. colours.yellow = 0xFFFF00
  33. colours.lime = 0x00FF00
  34. colours.pink = 0xFFC0CB
  35. colours.gray = 0x555555
  36. colours.grey = 0x555555
  37. colours.silver = 0xAAAAAA
  38. colours.cyan = 0x00FFFF
  39. colours.purple = 0x800080
  40. colours.blue = 0x0000FF
  41. colours.brown = 0x603913
  42. colours.green = 0x008000
  43. colours.red = 0xFF0000
  44. colours.black = 0x000000
  45. local interfaceColour = colours.gray
  46.  
  47. if component.isAvailable("br_turbine") then
  48. turbineAvailable = true
  49. else
  50. turbineAvailable = false
  51. end
  52.  
  53. if not turbineAvailable then
  54. term.setCursor(1, 1)
  55. gpu.set(1, 1, "[ ! ] THIS PROGRAM REQUIRES AT LEAST (1) REACTOR OR (1) TURBINE TO RUN [ ! ]")
  56. os.sleep(7)
  57. captureKeys(q)
  58. end
  59.  
  60. function label(x, y, message, colour, ...)
  61. local colour = colour or gpu.getForeground()
  62. local oldColour = gpu.getForeground()
  63. end
  64.  
  65. --Turbines
  66. if turbineAvailable then
  67. local i = 1
  68. for address, type in component.list("br_turbine") do
  69. turbine[i] = component.proxy(address)
  70. i = i + 1
  71. end
  72. else
  73. label(1, 29, "%s", colours.red, "[ ! ] NO TURBINES CONNECTED [ ! ]")
  74. end
  75.  
  76. function drawInterface(colour)
  77. gpu.setBackground(colour)
  78. gpu.fill(1, 1, w, 1, " ") --Top
  79. gpu.fill(1, h, w, 1, " ") --Bottom
  80. gpu.fill(1, 2, 1, h - 2, " ") --Left
  81. gpu.fill(w, 2, 1, h - 2, " ") --Right
  82. gpu.fill(2, 3, w - 2, 1, " ") --End Reactor heading
  83. gpu.fill(2, 8, w - 43, 1, " ") --End Reactor number stats
  84. gpu.fill(2, 23, w, 1, " ") --End Reactor Information
  85. gpu.fill(2, 25, w - 2, 1, " ") --End Turbine heading
  86. gpu.fill(2, 30, w - 43, 1, " ") --End Turbine number stats
  87. gpu.fill(2, 45, w, 1, " ") --End Turbine Information
  88. gpu.fill(w - 42, 4, 1, 19, " ") --Reactor side box
  89. gpu.fill(w - 42, 26, 1, 19, " ") --Turbine side box
  90. --Start reactor meters
  91. gpu.set(4, 10, "COOLANT")
  92. gpu.fill(3, 11, 1, 12, " ") --Coolant level left side
  93. gpu.fill(11, 11, 1, 12, " ") --Coolant level right side
  94. gpu.fill(4, 11, 7, 1, " ") --Coolant level top
  95. gpu.fill(4, 22, 7, 1, " ")--Coolant level bottom
  96.  
  97. gpu.set(56, 10, " FUEL ")
  98. gpu.fill(55, 11, 1, 12, " ") --Fuel level left side
  99. gpu.fill(63, 11, 1, 12, " ") --Fuel level right side
  100. gpu.fill(56, 11, 7, 1, " ") --Fuel level top
  101. gpu.fill(56, 22, 7, 1, " ") --Fuel level bottom
  102.  
  103. gpu.set(109, 10, " STEAM ")
  104. gpu.fill(108, 11, 1, 12, " ") --Steam level left side
  105. gpu.fill(116, 11, 1, 12, " ") --Steam level right side
  106. gpu.fill(109, 11, 7, 1, " ") --Steam level top
  107. gpu.fill(109, 22, 7, 1, " ") --Steam level bottom
  108.  
  109. gpu.fill(119, 13, 2, 10, " ") --Control Rod level Left side
  110. gpu.fill(158, 13, 2, 10, " ") --Control Rod level Right side
  111. gpu.fill(119, 12, 41, 1, " ") --Control Rod level Top
  112.  
  113. --Start turbine meters
  114. gpu.set(4, 32, " STEAM ")
  115. gpu.fill(3, 33, 1, 12, " ") --Steam level left side
  116. gpu.fill(11, 33, 1, 12, " ") --Steam level right side
  117. gpu.fill(4, 33, 7, 1, " ") --Steam level top
  118. gpu.fill(4, 44, 7, 1, " ")--Steam level bottom
  119.  
  120. gpu.set(56, 32, " WATER ")
  121. gpu.fill(55, 33, 1, 12, " ") --Coolant level left side
  122. gpu.fill(63, 33, 1, 12, " ") --Coolant level right side
  123. gpu.fill(56, 33, 7, 1, " ") --Coolant level top
  124. gpu.fill(56, 44, 7, 1, " ")--Coolant level bottom
  125.  
  126. gpu.set(109, 32, " RF ")
  127. gpu.fill(108, 33, 1, 12, " ") --RF level left side
  128. gpu.fill(116, 33, 1, 12, " ") --RF level right side
  129. gpu.fill(109, 33, 7, 1, " ") --RF level top
  130. gpu.fill(109, 44, 7, 1, " ")--RF level bottom
  131.  
  132. gpu.setBackground(defaultBgColour)
  133. end
  134.  
  135. function turbineDataTable()
  136. for i = 1, #turbine do
  137. turbineSteamInput = turbine[turbineNum].getInputAmount()
  138. turbineCoolantOutput = turbine[turbineNum].getOutputAmount()
  139. turbineRotorSpeed = turbine[turbineNum].getRotorSpeed()
  140. turbineRotorMass = turbine[turbineNum].getRotorMass()
  141. turbineBladeEfficiency = turbine[turbineNum].getBladeEfficiency()
  142. turbineInductorState = turbine[turbineNum].getInductorEngaged()
  143. turbineCurrentEnergyOutput = turbine[turbineNum].getEnergyProducedLastTick()
  144. turbineEnergyStored = turbine[turbineNum].getEnergyStored()
  145. end
  146. startColumn = 2
  147. row = 28
  148. spaces = 5
  149. for i = 1, #thTable do
  150. if thTable[i] == "STEAM IN" then
  151. label(startColumn, row, "%d mB/t", nil, tostring(turbineSteamInput))
  152. startColumn = (startColumn + string.len(thTable[i])) + spaces
  153. elseif
  154. thTable[i] == "COOLANT OUT" then
  155. label(startColumn, row, "%d mB/t", nil, tostring(turbineCoolantOutput))
  156. startColumn = (startColumn + string.len(thTable[i])) + spaces
  157. elseif
  158. thTable[i] == "ROTOR SPEED" then
  159. label(startColumn, row, "%.1d RPM", nil, tostring(turbineRotorSpeed))
  160. startColumn = (startColumn + string.len(thTable[i])) + spaces
  161. elseif
  162. thTable[i] == "ROTOR MASS" then
  163. label(startColumn, row, "%d", nil, tostring(turbineRotorMass))
  164. startColumn = (startColumn + string.len(thTable[i])) + spaces
  165. elseif
  166. thTable[i] == "EFFICIENCY" then
  167. label(startColumn, row, "%.1d%%", nil, tostring(turbineBladeEfficiency))
  168. startColumn = (startColumn + string.len(thTable[i])) + spaces
  169. elseif
  170. thTable[i] == "INDUCTOR STATE" then
  171. if turbineInductorState then
  172. label(startColumn, row, "%s", colours.lime, "ENGAGED")
  173. startColumn = (startColumn + string.len(thTable[i])) + spaces
  174. else
  175. label(startColumn, row, "%s", colours.red, "DISENGAGED")
  176. startColumn = (startColumn + string.len(thTable[i])) + spaces
  177. end
  178. elseif
  179. thTable[i] == "RF OUT" then
  180. label(startColumn, row, "%d", colours.lime, tostring(turbineCurrentEnergyOutput))
  181. startColumn = (startColumn + string.len(thTable[i])) + spaces
  182. elseif
  183. thTable[i] == "STORED RF" then
  184. label(startColumn, row, "%d", colours.lime, tostring(turbineEnergyStored))
  185. startColumn = (startColumn + string.len(thTable[i])) + spaces
  186. end
  187. end
  188. end
  189.  
  190. --TURBINE AUTO EFFICIENCY MODE
  191. autoEfficiencyEnabled = false
  192. function autoEfficiency()
  193. if not autoEfficiencyEnabled then
  194. autoEfficiencyEnabled = false
  195. else
  196. autoEfficiencyEnabled = true
  197. for i = 1, #turbine do
  198. numBlades = turbine[i].getNumberOfBlades()
  199. flowRate = numBlades * 25
  200. turbine[i].setFluidFlowRateMax(flowRate)
  201. end
  202. end
  203. end
  204. function cycleEfficiencyMode()
  205. if autoEfficiencyEnabled then
  206. autoEfficiencyEnabled = false
  207. else
  208. if not autoEfficiencyEnabled then
  209. autoEfficiencyEnabled = true
  210. end
  211. end
  212. end
  213.  
  214. function toggleAutoEfficiencyIndicator()
  215. if autoEfficiencyEnabled then
  216. gpu.setBackground(colours.lime)
  217. gpu.fill(149, 29, 10, 3, " ")
  218. label(153, 30, "ON", colours.white)
  219. gpu.setBackground(defaultBgColour)
  220. gpu.set(149, 28, "Efficiency")
  221. else
  222. gpu.setBackground(colours.red)
  223. gpu.fill(149, 29, 10, 3, " ")
  224. label(152, 30, "OFF", colours.pink)
  225. gpu.setBackground(defaultBgColour)
  226. gpu.set(149, 28, "Efficiency")
  227. end
  228. end
  229.  
  230. function autoPowerCycle()
  231. if powerCycleActive then
  232. for i = 1, #turbine do
  233. if turbine[i].getEnergyStored() == powerOFF then
  234. turbine[i].setActive(false)
  235. end
  236. if turbine[i].getEnergyStored() < powerON then
  237. turbine[i].setActive(true)
  238. end
  239. end
  240. end
  241. end
  242.  
  243. function autoPowerCycleControl()
  244. if powerCycleActive then
  245. powerCycleActive = false
  246. tpcStatus = false
  247. else
  248. powerCycleActive = true
  249. tpcStatus = true
  250. end
  251. end
  252.  
  253. function toggleAutoPowerCycleIndicator()
  254. if powerCycleActive then
  255. gpu.setBackground(colours.lime)
  256. gpu.fill(120, 29, 10, 3, " ")
  257. label(124, 30, "ON", colours.white)
  258. gpu.setBackground(defaultBgColour)
  259. gpu.set(120, 28, "Auto Power")
  260. else
  261. gpu.setBackground(colours.red)
  262. gpu.fill(120, 29, 10, 3, " ")
  263. label(124, 30, "OFF", colours.pink)
  264. gpu.setBackground(defaultBgColour)
  265. gpu.set(120, 28, "Auto Power")
  266. end
  267. end
  268.  
  269. function turbinePower()
  270. if turbine[turbineNum].getActive() then
  271. turbine[turbineNum].setActive(false)
  272. else
  273. turbine[turbineNum].setActive(true)
  274. end
  275. end
  276.  
  277. function turbineStatus()
  278. if turbine[turbineNum].getActive() then
  279. gpu.set(119, 26, "Turbine Status: Active")
  280. else
  281. gpu.set(119, 26, "Turbine Status: Inactive")
  282. end
  283. end
  284.  
  285. function percent(curValue, maxValue)
  286. return (curValue / maxValue) * 100
  287. end
  288.  
  289. function totalTurbineEnergyStored()
  290. tCap = 1000000
  291. turbineTotalEnergyStored = 0
  292. for i = 1, #turbine do
  293. turbineTotalEnergyStored = turbineTotalEnergyStored + turbine[i].getEnergyStored()
  294. end
  295. turbineEnergyPercentage = percent(turbineTotalEnergyStored, tCap * #turbine)
  296. end
  297.  
  298. function turbineSideBox() --Starts at column 119 & row 26
  299. startColumn = 119
  300. startRow = 27
  301. boxWidth = 159 - 119
  302. label(startColumn, startRow + 6, "[COMBINED TURBINE STORED ENERGY]", nil)
  303. totalTurbineEnergyStored()
  304. label(startColumn, startRow + 7, "Combined Energy: " .. turbineTotalEnergyStored .." RF", nil)
  305. label(startColumn, startRow + 8, "Maximum Storage: " .. 1000000 * #turbine .. " RF", nil)
  306. label(startColumn, startRow + 9, "To max capacity: " .. (1000000 * #turbine) - turbineTotalEnergyStored .. " RF", colours.red)
  307. label(startColumn, startRow + 16, "All Stored Energy: " .. reactorTotalEnergyStored + turbineTotalEnergyStored .. " RF", colours.lime)
  308. label(startColumn, startRow + 11, "[While Auto Power Mode Is Active]", nil)
  309. label(startColumn, startRow + 12, "Auto Power Off: 1000000 Stored RF", colours.red)
  310. label(startColumn, startRow + 13, "Auto Power On: 975000 Stored RF", colours.lime)
  311. total_r_RfOutput = 0
  312.  
  313. for i = 1, #turbine do
  314. total_t_RfOutput = total_t_RfOutput + turbine[i].getEnergyProducedLastTick()
  315. i = i + 1
  316. end
  317. totalRfOutput = math.floor(total_t_RfOutput)
  318. label(startColumn, startRow + 17, "Total RF Output: " .. totalRfOutput .. " RF/t", colours.green)
  319. end
  320.  
  321. function controlKeysTable()
  322. keyCol = 2
  323. keyRow = 46
  324. ckList = {"Exit", "Prev Reactor", "Next Reactor", "Prev Turbine", "Next Turbine", "Reactor Power", "Turbine Power", "Auto Power", "Auto Efficiency", "Eject Waste", "Eject Fuel", "Inductor"}
  325. label(keyCol, keyRow, "-- Program control keys --", colours.orange)
  326. for i = 1, #ckList do
  327. label(keyCol, keyRow + 1, ckList[i], colours.orange)
  328. keyCol = keyCol + string.len(ckList[i]) + 2
  329. end
  330. function half(value)
  331. return math.floor(value / 2)
  332. end
  333. keyVal = {"[q]", "[down]", "[up]", "[left]", "[right]", "[r]", "[t]", "[a]", "[e]", "[w]", "[f]", "[i]"}
  334. keyCol = 2
  335. keyRow = 46
  336. for x = 1, #keyVal do
  337. label((keyCol + half(string.len(ckList[x]))) - 2, keyRow + 2, keyVal[x], nil)
  338. keyCol = keyCol + string.len(ckList[x]) + 2
  339. end
  340. end
  341.  
  342. -- START COLLECTING DATA IN REALTIME
  343. while running do
  344. drawInterface(interfaceColour)
  345.  
  346. if turbineAvailable then
  347. totalTurbineEnergyStored()
  348. t_currentSteamLevel = turbine[turbineNum].getInputAmount()
  349. t_fluidAmountMax = turbine[turbineNum].getFluidAmountMax()
  350. t_coolantAmount = turbine[turbineNum].getOutputAmount()
  351. t_coolantAmountMax = 4000
  352. t_rfStored = turbineTotalEnergyStored
  353. t_rfMax = 1000000 * #turbine
  354. toggleAutoEfficiencyIndicator()
  355. toggleAutoPowerCycleIndicator()
  356. autoPowerCycle()
  357. turbineStatus()
  358. turbineMainHeader()
  359. turbineLabels()
  360. turbineDataTable()
  361. turbineSideBox()
  362. -- TURBINE AUTO EFFICIENCY MODE SETS THE TURBINE FLOW RATE FOR MAXIMUM EFFICIENCY
  363. autoEfficiency()
  364. -- TURBINE METERS
  365. fillMeters(4, 43, 7, t_currentSteamLevel, t_fluidAmountMax, colours.white) --Turbine Steam Meter
  366. fillMeters(56, 43, 7, t_coolantAmount, t_coolantAmountMax, colours.lightblue) --Turbine Coolant Out Meter
  367. fillMeters(109, 43, 7, t_rfStored, t_rfMax, colours.green) --Turbine RF Meter
  368. end
  369. end
  370.  
  371. os.sleep(refreshRate)
  372. term.clear()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement