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["flowOn"] = "Flow: On" | |
57 | uiText["flowOff"] = "Flow: Off" | |
58 | uiText["coilsOn"] = "Coils: On" | |
59 | uiText["coilsOff"] = "Coils: Off" | |
60 | ||
61 | ||
62 | ||
63 | -- Edit below at your your own risk | |
64 | -- !#!#!#!#!#!#!#!#!#!#!#!#!#!#!#!# | |
65 | ||
66 | -- Global Variables | |
67 | ||
68 | t = {} -- Holds turbines | |
69 | m = {} -- Holds monitor | |
70 | w = {} -- Holds windows | |
71 | ||
72 | -- Other Functions | |
73 | ||
74 | function round(num) | |
75 | return math.floor(num + 0.5) | |
76 | end | |
77 | ||
78 | -- Program Functions | |
79 | ||
80 | -- Finds all devices. Puts turbines in `t` table | |
81 | -- and monitors in `m` table | |
82 | function getDevices() | |
83 | for _, name in pairs(peripheral.getNames()) do | |
84 | if peripheral.getType(name) == "BigReactors-Turbine" then | |
85 | table.insert(t, peripheral.wrap(name)) | |
86 | end | |
87 | if peripheral.getType(name) == "monitor" then | |
88 | table.insert(m, peripheral.wrap(name)) | |
89 | end | |
90 | end | |
91 | end | |
92 | ||
93 | -- Determines if the coil should be turned on | |
94 | function needCoilOn(i) | |
95 | if t[i].getEnergyStored() < minEnergy then | |
96 | return true | |
97 | else | |
98 | return false | |
99 | end | |
100 | end | |
101 | ||
102 | -- Determines if the coil should be turned off | |
103 | function needCoilOff(i) | |
104 | if t[i].getEnergyStored() > maxEnergy then | |
105 | return true | |
106 | else | |
107 | return false | |
108 | end | |
109 | end | |
110 | ||
111 | -- Turns coil on | |
112 | function coilOn(i) | |
113 | t[i].setInductorEngaged(true) | |
114 | end | |
115 | ||
116 | -- Tuns coil off | |
117 | function coilOff(i) | |
118 | t[i].setInductorEngaged(false) | |
119 | end | |
120 | ||
121 | -- Checks if coil in on or off | |
122 | function isCoilOn(i) | |
123 | return t[i].getInductorEngaged() | |
124 | end | |
125 | ||
126 | -- Determines if flow should turn on | |
127 | function needFlowOn(i) | |
128 | if t[i].getRotorSpeed() < minSpeed then | |
129 | return true | |
130 | else | |
131 | return false | |
132 | end | |
133 | end | |
134 | ||
135 | -- Determines if flow should turn off | |
136 | function needFlowOff(i) | |
137 | if t[i].getRotorSpeed() > maxSpeed then | |
138 | return true | |
139 | else | |
140 | return false | |
141 | end | |
142 | end | |
143 | ||
144 | -- Turns flow on | |
145 | -- (Sets flow to MAX) | |
146 | function flowOn(i) | |
147 | t[i].setFluidFlowRateMax(t[i].getFluidFlowRateMaxMax()) | |
148 | end | |
149 | ||
150 | -- Turns flow off | |
151 | -- (Sets flow to 0) | |
152 | function flowOff(i) | |
153 | t[i].setFluidFlowRateMax(0) | |
154 | end | |
155 | ||
156 | -- Checks if flow is on or off | |
157 | -- (Assumes MAX is on, other is off) | |
158 | function isFlowOn(i) | |
159 | return t[i].getFluidFlowRateMax() == t[i].getFluidFlowRateMaxMax() | |
160 | end | |
161 | ||
162 | -- Get Rotor Speed | |
163 | function getRotorSpeed(i) | |
164 | return math.floor(t[i].getRotorSpeed()) | |
165 | end | |
166 | ||
167 | -- Get Power Generation | |
168 | function getPowerGeneration(i) | |
169 | return math.floor(t[i].getEnergyProducedLastTick()) | |
170 | end | |
171 | ||
172 | -- Returns text scale for best fit | |
173 | -- TODO Figure out if there is a better way than | |
174 | -- brute forcing | |
175 | function getScaleForBox(baseWidth, baseHeight, fitWidth, fitHeight, count) | |
176 | local best = 0.5 | |
177 | ||
178 | for i = best, 5, 0.5 do | |
179 | local cWidth = baseWidth / i | |
180 | local cHeight = baseHeight / i | |
181 | ||
182 | local cPerRow = math.floor(cWidth / fitWidth) | |
183 | local cPerCol = math.floor(cHeight / fitHeight) | |
184 | ||
185 | if cPerRow * cPerCol >= count then | |
186 | best = i | |
187 | else | |
188 | break | |
189 | end | |
190 | end | |
191 | ||
192 | return best | |
193 | end | |
194 | ||
195 | -- Determins offset to center the windows in the | |
196 | -- monitor. | |
197 | function getOffsetForWindow(monitorWidth, monitorHeight, desiredWidth, desiredHeight, count) | |
198 | local columnsNeeded = math.min(math.floor(monitorWidth / desiredWidth), count) | |
199 | local rowsNeeded = math.ceil(count / columnsNeeded) | |
200 | ||
201 | local widthUsed = desiredWidth * columnsNeeded | |
202 | local heightUsed = desiredHeight * rowsNeeded | |
203 | ||
204 | local offsetLeft = math.ceil((monitorWidth - widthUsed) / 2) | |
205 | local offsetRight = math.ceil((monitorHeight - heightUsed) / 2) | |
206 | ||
207 | return offsetLeft, offsetRight | |
208 | end | |
209 | ||
210 | -- Clears each connected monitor | |
211 | function clearMonitors() | |
212 | for i = 1, #m do | |
213 | m[i].setBackgroundColor(uiColors["border"]) | |
214 | m[i].clear() | |
215 | end | |
216 | end | |
217 | ||
218 | -- Setup each monitor | |
219 | -- (Put a window in each monitor for each turbine) | |
220 | function setupMonitors() | |
221 | if #t > 0 then | |
222 | local monitorWidth | |
223 | local monitorHeight | |
224 | local desiredW = 14 | |
225 | local desiredH = 8 | |
226 | local currentX | |
227 | local currentY | |
228 | ||
229 | for i = 1, #m do | |
230 | print("Setting Up " .. i) | |
231 | ||
232 | table.insert(w, {}) | |
233 | ||
234 | m[i].setTextScale(1) | |
235 | monitorWidth, monitorHeight = m[i].getSize() | |
236 | ||
237 | print("Initial Size: " .. monitorWidth .. " " .. monitorHeight) | |
238 | ||
239 | scale = getScaleForBox(monitorWidth, monitorHeight, desiredW, desiredH, #t) | |
240 | ||
241 | print("Scale: " .. scale) | |
242 | ||
243 | m[i].setTextScale(scale) | |
244 | monitorWidth, monitorHeight = m[i].getSize() | |
245 | ||
246 | offsetX, offsetY = getOffsetForWindow(monitorWidth, monitorHeight, desiredW, desiredH, #t) | |
247 | ||
248 | print("Offset: " .. offsetX .. " " .. offsetY) | |
249 | ||
250 | currentX = offsetX | |
251 | currentY = offsetY | |
252 | ||
253 | for ii = 1, #t do | |
254 | print(currentX .. " " .. currentY .. " " .. desiredW .. " " .. desiredH) | |
255 | table.insert(w[i], window.create(m[i], currentX, currentY, desiredW, desiredH)) | |
256 | ||
257 | currentX = currentX + desiredW | |
258 | if (currentX + desiredW > monitorWidth) then | |
259 | currentX = offsetX | |
260 | currentY = currentY + desiredH | |
261 | end | |
262 | end | |
263 | end | |
264 | end | |
265 | end | |
266 | ||
267 | -- Write status of turn to window | |
268 | function writeStatus(turbine, screen) | |
269 | screen.setBackgroundColor(uiColors["border"]) | |
270 | screen.clear() | |
271 | ||
272 | -- Write Title | |
273 | screen.setBackgroundColor(uiColors["headerBackground"]) | |
274 | screen.setTextColor(uiColors["headerText"]) | |
275 | screen.setCursorPos(2, 2) | |
276 | screen.clearLine() | |
277 | screen.write(uiText["name"] .. turbine) | |
278 | ||
279 | --Filler | |
280 | screen.setBackgroundColor(uiColors["background"]) | |
281 | screen.setCursorPos(1, 3) | |
282 | screen.clearLine() | |
283 | ||
284 | -- Write Rotor Speed | |
285 | screen.setBackgroundColor(uiColors["currentSpeedBackground"]) | |
286 | screen.setTextColor(uiColors["currentSpeedText"]) | |
287 | screen.setCursorPos(2, 4) | |
288 | screen.clearLine() | |
289 | screen.write(getRotorSpeed(turbine) .. uiText["rpm"]) | |
290 | ||
291 | -- Write Power Generation | |
292 | screen.setBackgroundColor(uiColors["currentPowerGenBackground"]) | |
293 | screen.setTextColor(uiColors["currentPowerGenText"]) | |
294 | screen.setCursorPos(2, 5) | |
295 | screen.clearLine() | |
296 | screen.write(getPowerGeneration(turbine) .. uiText["rft"]) | |
297 | ||
298 | --Filler | |
299 | screen.setBackgroundColor(uiColors["background"]) | |
300 | screen.setCursorPos(1, 6) | |
301 | screen.clearLine() | |
302 | ||
303 | -- Write Coil Status | |
304 | if isCoilOn(turbine) then | |
305 | screen.setBackgroundColor(uiColors["coilOnBackground"]) | |
306 | screen.setTextColor(uiColors["coilOnText"]) | |
307 | screen.setCursorPos(2, 7) | |
308 | screen.clearLine() | |
309 | screen.write(uiText["coilsOn"]) | |
310 | else | |
311 | screen.setBackgroundColor(uiColors["coilOffBackground"]) | |
312 | screen.setTextColor(uiColors["coilOffText"]) | |
313 | screen.setCursorPos(2, 7) | |
314 | screen.clearLine() | |
315 | screen.write(uiText["coilsOff"]) | |
316 | end | |
317 | ||
318 | -- Write Flow Status | |
319 | if isFlowOn(turbine) then | |
320 | screen.setBackgroundColor(uiColors["flowOnBackground"]) | |
321 | screen.setTextColor(uiColors["flowOnText"]) | |
322 | screen.setCursorPos(2, 8) | |
323 | screen.clearLine() | |
324 | screen.write(uiText["flowOn"]) | |
325 | else | |
326 | screen.setBackgroundColor(uiColors["flowOffBackground"]) | |
327 | screen.setTextColor(uiColors["flowOffText"]) | |
328 | screen.setCursorPos(2, 8) | |
329 | screen.clearLine() | |
330 | screen.write(uiText["flowOff"]) | |
331 | end | |
332 | ||
333 | -- Draw Right Border | |
334 | screen.setBackgroundColor(uiColors["border"]) | |
335 | for i = 1, 8 do | |
336 | screen.setCursorPos(14, i) | |
337 | screen.write(" ") | |
338 | end | |
339 | end | |
340 | ||
341 | -- Write status of each turbine to appropiate windows | |
342 | function writeStatuses() | |
343 | for i = 1, #m do | |
344 | for ii = 1, #t do | |
345 | writeStatus(ii, w[i][ii]) | |
346 | end | |
347 | end | |
348 | end | |
349 | ||
350 | -- Setup | |
351 | function setup() | |
352 | w = {} | |
353 | m = {} | |
354 | t = {} | |
355 | ||
356 | getDevices() | |
357 | ||
358 | if (#t == 0) then | |
359 | error("No Turbines. You did something wrong") | |
360 | end | |
361 | ||
362 | if (#m > 0) then | |
363 | clearMonitors() | |
364 | setupMonitors() | |
365 | end | |
366 | end | |
367 | ||
368 | -- Main Loop | |
369 | function main() | |
370 | for i = 1, #t do | |
371 | if isCoilOn(i) then | |
372 | if needCoilOff(i) then | |
373 | print("turning off " .. i) | |
374 | coilOff(i) | |
375 | end | |
376 | else | |
377 | if needCoilOn(i) then | |
378 | print("turning on " .. i) | |
379 | coilOn(i) | |
380 | end | |
381 | end | |
382 | if isFlowOn(i) then | |
383 | if needFlowOff(i) then | |
384 | print("stopping flow " .. i) | |
385 | flowOff(i) | |
386 | end | |
387 | else | |
388 | if needFlowOn(i) then | |
389 | print("starting flow " .. i) | |
390 | flowOn(i) | |
391 | end | |
392 | end | |
393 | end | |
394 | writeStatuses() | |
395 | end | |
396 | ||
397 | -- Program Run | |
398 | setup() | |
399 | while true do | |
400 | main() | |
401 | os.sleep(1) | |
402 | end |