SHOW:
|
|
- or go back to the newest paste.
1 | -- TurbineMonitor | |
2 | -- Made By: MrKMG <mrkmg.com> | |
3 | -- | |
4 | -- This program will keep your turbines up to speed | |
5 | -- and turn the coil on and off as needed. | |
6 | -- | |
7 | -- To Use: | |
8 | -- | |
9 | -- Attach as many Turbines and Monitors as you | |
10 | -- would like via wired modems. Monitors will all | |
11 | -- display the same information for each turbine: | |
12 | -- Current Speed | |
13 | -- Current Power Generation, | |
14 | -- Coil On/Off | |
15 | -- Flow On/Off | |
16 | -- | |
17 | -- Monitors can be of any size | |
18 | -- | |
19 | ||
20 | --Edit these to fit your turbines | |
21 | ||
22 | -- Speed to keep rotors between. Recommend putting | |
23 | -- just above the best your turbine can do. | |
24 | minSpeed = 1800 | |
25 | maxSpeed = 1820 | |
26 | ||
27 | -- Range of RF to keep in turbine. Recommend to | |
28 | -- keep low to avoid waste. | |
29 | minEnergy = 1 | |
30 | maxEnergy = 200000 | |
31 | ||
32 | -- Colors for the monitor | |
33 | uiColors = {} | |
34 | uiColors["background"] = colors.gray | |
35 | uiColors["border"] = colors.black | |
36 | uiColors["headerBackground"] = colors.blue | |
37 | uiColors["headerText"] = colors.black | |
38 | uiColors["currentSpeedBackground"] = colors.black | |
39 | uiColors["currentSpeedText"] = colors.white | |
40 | uiColors["currentPowerGenBackground"] = colors.black | |
41 | uiColors["currentPowerGenText"] = colors.white | |
42 | uiColors["coilOnBackground"] = colors.green | |
43 | uiColors["coilOnText"] = colors.white | |
44 | uiColors["coilOffBackground"] = colors.red | |
45 | uiColors["coilOffText"] = colors.white | |
46 | uiColors["flowOnBackground"] = colors.green | |
47 | uiColors["flowOnText"] = colors.white | |
48 | uiColors["flowOffBackground"] = colors.red | |
49 | uiColors["flowOffText"] = colors.white | |
50 | ||
51 | -- Text for the monitor. | |
52 | uiText = {} | |
53 | uiText["name"] = "Turbine " | |
54 | uiText["rpm"] = " rpm" | |
55 | uiText["rft"] = " RF/t" | |
56 | uiText["rfs"] = " RF/s" | |
57 | uiText["/"] = " / " | |
58 | uiText["flowOn"] = "Flow: On" | |
59 | uiText["flowOff"] = "Flow: Off" | |
60 | uiText["coilsOn"] = "Coils: On" | |
61 | uiText["coilsOff"] = "Coils: Off" | |
62 | uiText["title"] = "Turbine Monitor" | |
63 | ||
64 | ||
65 | ||
66 | -- Edit below at your your own risk | |
67 | -- !#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!# | |
68 | ||
69 | function drawPixel(x, y, col) | |
70 | mon.setTextColor(uiColors["coilOnText"]) | |
71 | mon.setCursorPos(x, y) | |
72 | mon.setBackgroundColor(col) | |
73 | mon.write(" ") | |
74 | end | |
75 | ||
76 | function drawLine(x, y, length, col) | |
77 | for i = 0, length - 1 do | |
78 | drawPixel(x + i, y, col) | |
79 | end | |
80 | end | |
81 | ||
82 | -- Center Text | |
83 | local function printCenter(mon, y, txt) | |
84 | local w, h = mon.getSize() | |
85 | local x = math.floor((w / 2) - (#txt / 2)) | |
86 | ||
87 | mon.setBackgroundColor(uiColors["flowOffBackground"]) | |
88 | mon.setTextColor(uiColors["coilOnText"]) | |
89 | mon.setCursorPos(x, y) | |
90 | mon.write(txt) | |
91 | end | |
92 | ||
93 | -- Global Variables | |
94 | mon = peripheral.wrap("right") | |
95 | ||
96 | t = {} -- Holds turbines | |
97 | m = {} -- Holds monitor | |
98 | w = {} -- Holds windows | |
99 | ||
100 | -- Other Functions | |
101 | ||
102 | function round(num) | |
103 | return math.floor(num + 0.5) | |
104 | end | |
105 | ||
106 | -- Program Functions | |
107 | ||
108 | -- Finds all devices. Puts turbines in `t` table | |
109 | -- and monitors in `m` table | |
110 | function getDevices() | |
111 | for _, name in pairs(peripheral.getNames()) do | |
112 | if peripheral.getType(name) == "BigReactors-Turbine" then | |
113 | table.insert(t, peripheral.wrap(name)) | |
114 | end | |
115 | if peripheral.getType(name) == "monitor" then | |
116 | table.insert(m, peripheral.wrap(name)) | |
117 | end | |
118 | end | |
119 | end | |
120 | ||
121 | -- Determines if the coil should be turned on | |
122 | function needCoilOn(i) | |
123 | if t[i].getEnergyStored() < minEnergy then | |
124 | return true | |
125 | else | |
126 | return false | |
127 | end | |
128 | end | |
129 | ||
130 | -- Determines if the coil should be turned off | |
131 | function needCoilOff(i) | |
132 | if t[i].getEnergyStored() > maxEnergy then | |
133 | return true | |
134 | else | |
135 | return false | |
136 | end | |
137 | end | |
138 | ||
139 | -- Turns coil on | |
140 | function coilOn(i) | |
141 | t[i].setInductorEngaged(true) | |
142 | end | |
143 | ||
144 | -- Tuns coil off | |
145 | function coilOff(i) | |
146 | t[i].setInductorEngaged(false) | |
147 | end | |
148 | ||
149 | -- Checks if coil in on or off | |
150 | function isCoilOn(i) | |
151 | return t[i].getInductorEngaged() | |
152 | end | |
153 | ||
154 | -- Determines if flow should turn on | |
155 | function needFlowOn(i) | |
156 | if t[i].getRotorSpeed() < minSpeed then | |
157 | return true | |
158 | else | |
159 | return false | |
160 | end | |
161 | end | |
162 | ||
163 | -- Determines if flow should turn off | |
164 | function needFlowOff(i) | |
165 | if t[i].getRotorSpeed() > maxSpeed then | |
166 | return true | |
167 | else | |
168 | return false | |
169 | end | |
170 | end | |
171 | ||
172 | -- Turns flow on | |
173 | -- (Sets flow to MAX) | |
174 | function flowOn(i) | |
175 | t[i].setFluidFlowRateMax(t[i].getFluidFlowRateMaxMax()) | |
176 | end | |
177 | ||
178 | -- Turns flow off | |
179 | -- (Sets flow to 0) | |
180 | function flowOff(i) | |
181 | t[i].setFluidFlowRateMax(0) | |
182 | end | |
183 | ||
184 | -- Checks if flow is on or off | |
185 | -- (Assumes MAX is on, other is off) | |
186 | function isFlowOn(i) | |
187 | return t[i].getFluidFlowRateMax() == t[i].getFluidFlowRateMaxMax() | |
188 | end | |
189 | ||
190 | -- Get Rotor Speed | |
191 | function getRotorSpeed(i) | |
192 | return math.floor(t[i].getRotorSpeed()) | |
193 | end | |
194 | ||
195 | -- Get Power Generation | |
196 | function getPowerGeneration(i) | |
197 | return math.floor(t[i].getEnergyProducedLastTick()) | |
198 | end | |
199 | ||
200 | -- Get Sum Power Generation | |
201 | function getSumPowerGeneration() | |
202 | local sum = 0 | |
203 | for i = 1, #t ,1 do | |
204 | sum = sum + getPowerGeneration(i) | |
205 | end | |
206 | return sum | |
207 | end | |
208 | ||
209 | function getSumPowerGeneration20() | |
210 | local sum = 0 | |
211 | for i = 1, #t ,1 do | |
212 | sum = getSumPowerGeneration() * 20 | |
213 | end | |
214 | return sum | |
215 | end | |
216 | ||
217 | -- Returns text scale for best fit | |
218 | -- TODO Figure out if there is a better way than | |
219 | -- brute forcing | |
220 | function getScaleForBox(baseWidth, baseHeight, fitWidth, fitHeight, count) | |
221 | local best = 0.5 | |
222 | ||
223 | for i = best, 5, 0.5 do | |
224 | local cWidth = baseWidth / i | |
225 | local cHeight = baseHeight / i | |
226 | ||
227 | local cPerRow = math.floor(cWidth / fitWidth) | |
228 | local cPerCol = math.floor(cHeight / fitHeight) | |
229 | ||
230 | if cPerRow * cPerCol >= count then | |
231 | best = i | |
232 | else | |
233 | break | |
234 | end | |
235 | end | |
236 | ||
237 | return best | |
238 | end | |
239 | ||
240 | -- Determins offset to center the windows in the | |
241 | -- monitor. | |
242 | function getOffsetForWindow(monitorWidth, monitorHeight, desiredWidth, desiredHeight, count) | |
243 | local columnsNeeded = math.min(math.floor(monitorWidth / desiredWidth), count) | |
244 | local rowsNeeded = math.ceil(count / columnsNeeded) | |
245 | ||
246 | local widthUsed = desiredWidth * columnsNeeded | |
247 | local heightUsed = desiredHeight * rowsNeeded | |
248 | ||
249 | local offsetLeft = math.ceil((monitorWidth - widthUsed) / 2) | |
250 | local offsetRight = math.ceil((monitorHeight - heightUsed) / 2) | |
251 | ||
252 | return offsetLeft, offsetRight | |
253 | end | |
254 | ||
255 | -- Clears each connected monitor | |
256 | function clearMonitors() | |
257 | for i = 1, #m do | |
258 | m[i].setBackgroundColor(uiColors["border"]) | |
259 | m[i].clear() | |
260 | end | |
261 | end | |
262 | ||
263 | -- Setup each monitor | |
264 | -- (Put a window in each monitor for each turbine) | |
265 | function setupMonitors() | |
266 | if #t > 0 then | |
267 | local monitorWidth | |
268 | local monitorHeight | |
269 | local desiredW = 14 | |
270 | local desiredH = 8 | |
271 | local currentX | |
272 | local currentY | |
273 | ||
274 | for i = 1, #m do | |
275 | print("Setting Up " .. i) | |
276 | ||
277 | table.insert(w, {}) | |
278 | ||
279 | m[i].setTextScale(1) | |
280 | monitorWidth, monitorHeight = m[i].getSize() | |
281 | ||
282 | print("Initial Size: " .. monitorWidth .. " " .. monitorHeight) | |
283 | ||
284 | scale = getScaleForBox(monitorWidth, monitorHeight, desiredW, desiredH, #t) | |
285 | ||
286 | print("Scale: " .. scale) | |
287 | ||
288 | m[i].setTextScale(scale) | |
289 | monitorWidth, monitorHeight = m[i].getSize() | |
290 | ||
291 | offsetX, offsetY = getOffsetForWindow(monitorWidth, monitorHeight, desiredW, desiredH, #t) | |
292 | ||
293 | print("Offset: " .. offsetX .. " " .. offsetY) | |
294 | ||
295 | currentX = offsetX | |
296 | currentY = offsetY | |
297 | ||
298 | for ii = 1, #t do | |
299 | print(currentX .. " " .. currentY .. " " .. desiredW .. " " .. desiredH) | |
300 | table.insert(w[i], window.create(m[i], currentX, currentY, desiredW, desiredH)) | |
301 | ||
302 | currentX = currentX + desiredW | |
303 | if (currentX + desiredW > monitorWidth) then | |
304 | currentX = offsetX | |
305 | currentY = currentY + desiredH | |
306 | end | |
307 | end | |
308 | end | |
309 | end | |
310 | end | |
311 | ||
312 | -- Write status of turn to window | |
313 | function writeStatus(turbine, screen) | |
314 | screen.setBackgroundColor(uiColors["border"]) | |
315 | screen.clear() | |
316 | ||
317 | -- Write Title | |
318 | screen.setBackgroundColor(uiColors["headerBackground"]) | |
319 | screen.setTextColor(uiColors["headerText"]) | |
320 | screen.setCursorPos(2, 2) | |
321 | screen.clearLine() | |
322 | screen.write(uiText["name"] .. turbine) | |
323 | ||
324 | --Filler | |
325 | screen.setBackgroundColor(uiColors["background"]) | |
326 | screen.setCursorPos(1, 3) | |
327 | screen.clearLine() | |
328 | ||
329 | -- Write Rotor Speed | |
330 | screen.setBackgroundColor(uiColors["currentSpeedBackground"]) | |
331 | screen.setTextColor(uiColors["currentSpeedText"]) | |
332 | screen.setCursorPos(2, 4) | |
333 | screen.clearLine() | |
334 | screen.write(getRotorSpeed(turbine) .. uiText["rpm"]) | |
335 | ||
336 | -- Write Power Generation | |
337 | screen.setBackgroundColor(uiColors["currentPowerGenBackground"]) | |
338 | screen.setTextColor(uiColors["currentPowerGenText"]) | |
339 | screen.setCursorPos(2, 5) | |
340 | screen.clearLine() | |
341 | screen.write(getPowerGeneration(turbine) .. uiText["rft"]) | |
342 | ||
343 | --Filler | |
344 | screen.setBackgroundColor(uiColors["background"]) | |
345 | screen.setCursorPos(1, 6) | |
346 | screen.clearLine() | |
347 | ||
348 | -- Write Coil Status | |
349 | if isCoilOn(turbine) then | |
350 | screen.setBackgroundColor(uiColors["coilOnBackground"]) | |
351 | screen.setTextColor(uiColors["coilOnText"]) | |
352 | screen.setCursorPos(2, 7) | |
353 | screen.clearLine() | |
354 | screen.write(uiText["coilsOn"]) | |
355 | else | |
356 | screen.setBackgroundColor(uiColors["coilOffBackground"]) | |
357 | screen.setTextColor(uiColors["coilOffText"]) | |
358 | screen.setCursorPos(2, 7) | |
359 | screen.clearLine() | |
360 | screen.write(uiText["coilsOff"]) | |
361 | end | |
362 | ||
363 | -- Write Flow Status | |
364 | if isFlowOn(turbine) then | |
365 | screen.setBackgroundColor(uiColors["flowOnBackground"]) | |
366 | screen.setTextColor(uiColors["flowOnText"]) | |
367 | screen.setCursorPos(2, 8) | |
368 | screen.clearLine() | |
369 | screen.write(uiText["flowOn"]) | |
370 | else | |
371 | screen.setBackgroundColor(uiColors["flowOffBackground"]) | |
372 | screen.setTextColor(uiColors["flowOffText"]) | |
373 | screen.setCursorPos(2, 8) | |
374 | screen.clearLine() | |
375 | screen.write(uiText["flowOff"]) | |
376 | end | |
377 | ||
378 | -- Draw Right Border | |
379 | screen.setBackgroundColor(uiColors["border"]) | |
380 | for i = 1, 8 do | |
381 | screen.setCursorPos(14, i) | |
382 | screen.write(" ") | |
383 | end | |
384 | ||
385 | end | |
386 | ||
387 | -- Write status of each turbine to appropiate windows | |
388 | function writeStatuses() | |
389 | for i = 1, #m do | |
390 | for ii = 1, #t do | |
391 | writeStatus(ii, w[i][ii]) | |
392 | end | |
393 | end | |
394 | end | |
395 | ||
396 | -- Setup | |
397 | function setup() | |
398 | w = {} | |
399 | m = {} | |
400 | t = {} | |
401 | ||
402 | getDevices() | |
403 | ||
404 | if (#t == 0) then | |
405 | error("No Turbines. You did something wrong") | |
406 | end | |
407 | ||
408 | if (#m > 0) then | |
409 | clearMonitors() | |
410 | setupMonitors() | |
411 | end | |
412 | end | |
413 | ||
414 | -- Main Loop | |
415 | function main() | |
416 | for i = 1, #t do | |
417 | if isCoilOn(i) then | |
418 | if needCoilOff(i) then | |
419 | print("turning off " .. i) | |
420 | coilOff(i) | |
421 | end | |
422 | else | |
423 | if needCoilOn(i) then | |
424 | print("turning on " .. i) | |
425 | coilOn(i) | |
426 | end | |
427 | end | |
428 | if isFlowOn(i) then | |
429 | if needFlowOff(i) then | |
430 | print("stopping flow " .. i) | |
431 | flowOff(i) | |
432 | end | |
433 | else | |
434 | if needFlowOn(i) then | |
435 | print("starting flow " .. i) | |
436 | flowOn(i) | |
437 | end | |
438 | end | |
439 | end | |
440 | writeStatuses() | |
441 | end | |
442 | ||
443 | -- Program Run | |
444 | setup() | |
445 | while true do | |
446 | main() | |
447 | ||
448 | drawLine(1, 2, 4, colors.black) | |
449 | drawLine(5, 2, 69, colors.red) | |
450 | drawLine(74, 2, 6, colors.black) | |
451 | ||
452 | drawLine(1, 3, 4, colors.black) | |
453 | drawLine(5, 3, 69, colors.red) | |
454 | printCenter(mon, 3, uiText["title"]) | |
455 | drawLine(74, 3, 6, colors.black) | |
456 | ||
457 | drawLine(1, 4, 4, colors.black) | |
458 | drawLine(5, 4, 69, colors.red) | |
459 | drawLine(74, 4, 6, colors.black) | |
460 | ||
461 | drawLine(1, 48, 4, colors.black) | |
462 | drawLine(5, 48, 69, colors.red) | |
463 | drawLine(74, 48, 6, colors.black) | |
464 | ||
465 | drawLine(1, 49, 4, colors.black) | |
466 | drawLine(5, 49, 69, colors.red) | |
467 | printCenter(mon, 49, getSumPowerGeneration() .. uiText["rft"] .. uiText["/"] .. getSumPowerGeneration20() .. uiText["rfs"]) | |
468 | drawLine(74, 49, 6, colors.black) | |
469 | ||
470 | drawLine(1, 50, 4, colors.black) | |
471 | drawLine(5, 50, 69, colors.red) | |
472 | drawLine(74, 50, 6, colors.black) | |
473 | ||
474 | os.sleep(1) | |
475 | end |