View difference between Paste ID: 8UY4A2JN and T8pMizre
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