View difference between Paste ID: aMAu4X5J and A7iGzTCH
SHOW: | | - or go back to the newest paste.
1
--[[
2
	Program name: EZ-NUKE reactor control system
3
	Version: v0001 Beta
4
	Programmer: ScatmanJohn
5-
	Last update: 10.1.2014
5+
	Last update: 16.1.2014
6-
	Pastebin: http://pastebin.com/A7iGzTCH
6+
	Pastebin: http://pastebin.com/aMAu4X5J
7
	Description: 
8
	This program controls a Big Reactors nuclear reactor
9
	in Minecraft with a Computercraft computer, using Computercraft's
10
	own wired modem connected to the reactors computer control port.
11
	Resources:
12-
	Reactor control:
12+
	Other reactor control which I based my program on:
13
		http://pastebin.com/HjUVNDau
14-
	FC API:
14+
	FC API, required:
15
		http://pastebin.com/A9hcbZWe
16
	Stargate control startup:
17
		http://pastebin.com/L4yhWweE
18-
	My gate:
18+
19-
		FUEHMVD
19+
20-
	Enderchests:
20+
21-
		Red-Blue-Red, for leaf blocks and herba jars
21+
22-
		Black-Blue-Black, feeds directly into AE
22+
23
if not os.loadAPI("FC_API") then
24
    error("Missing FC_API")
25
end
26
--Done loading API
27
28
function wrapThis(thing)
29
        local wrapped, f = nil, 0
30
        while wrapped == nil and f <= 100 do
31
                wrapped = peripheral.wrap(thing.."_"..f)
32
                f = f + 1
33
        end
34
 
35
        if wrapped == nil then
36
                side = getDeviceSide(thing)
37
                if side ~= nil then
38
                        return peripheral.wrap(side)
39
                else
40
                        return nil
41
                end
42
        else
43
                return wrapped
44
        end
45
end
46
47
local function print(str, x, y)
48
	term.setCursorPos(x, y)
49
	term.write(str)	
50
end
51
-- Done helper functions
52
53
-- Then initialize the monitor
54
local monitor = wrapThis("monitor")
55
local monitorx, monitory = monitor.getSize()
56
if monitorx ~= 29 or monitory ~= 12 then
57
	error("Monitor is the wrong size! Needs to be 3x2.")
58
end
59
60
if  monitor then
61
	--error("No Monitor Attached")
62-
if monitorx ~= 29 and monitory ~= 12 then
62+
63
	term.setCursorPos(1,1)
64
	term.write("Display redirected to Monitor")
65
	term.redirect(monitor)
66
end
67
68
-- Let's connect to the reactor peripheral
69
local reactor = wrapThis("BigReactors-Reactor")
70
if reactor == nil then
71
	error("Can't find reactor.")
72
end
73
74
local xClick, yClick = 0,0
75
local loopTime = 1
76
local adjustamount = 5
77
local dataLogging = false
78
local basecontrolrodlevel = 0
79
80
--Load saved data
81-
local controlRodLevel = 0
81+
file = fs.open("ReactorOptions", "r")
82-
local loopTime = 0.5
82+
if file then
83
	basecontrolrodlevel = tonumber(file.readLine())
84-
local basecontrolrodlevel = 40
84+
	file.close()
85
end
86
if not file then
87
	basecontrolrodlevel = 40
88
end
89
90
--Save some stuff
91
local function save()
92
    file = fs.open("ReactorOptions", "w")
93
    file.writeLine(rodpercentage)
94
    file.close()
95
end
96
97
reactor.setAllControlRodLevels(basecontrolrodlevel)
98
99
FC_API.clearMonitor("EZ-NUKE Control")
100
101
--Done initializing
102
103
local function displayBars()
104
	
105
	-- Draw some cool lines
106
	term.setBackgroundColor(colors.black)
107
	local width, height = term.getSize()
108
109
	for i=3, 5 do
110
		term.setCursorPos(22, i)
111
		term.write("|")
112
	end
113
	
114
	for i=1, width do
115
		term.setCursorPos(i, 2)
116
		term.write("-")
117
	end
118
	
119
	for i=1, width do
120
		term.setCursorPos(i, 6)
121
		term.write("-")
122
	end
123
	
124
	-- Draw some text
125
	
126
	fuelstring = "Fuel: "
127
	tempstring = "Temp: "
128
	energystring = "Producing: "
129
	
130-
	reactortemp = reactor.getTemperature()
130+
131
	
132
	fuelpercentage = math.ceil(reactor.getFuelAmount()/reactor.getFuelAmountMax()*100)
133
	print(fuelstring,2,3)
134
	print(fuelpercentage.." %",padding+2,3)
135
	
136
	energy = reactor.getEnergyProducedLastTick()
137
	print(energystring,2,4)
138
	print(math.ceil(energy).."RF/t",padding+2,4)
139
	
140
	reactortemp = reactor.getFuelTemperature()
141
	print(tempstring,2,5)
142
	print(reactortemp.." C",padding+2,5)
143
	
144
	-- Decrease rod button: 22X, 4Y
145
	-- Increase rod button: 28X, 4Y
146
	
147
	local rodamount = reactor.getNumberOfControlRods() - 1
148
	local rodtotal = 0
149
	for i=0, rodamount do
150
		rodtotal = rodtotal + reactor.getControlRodLevel(i)
151
	end
152
	rodpercentage = math.ceil(rodtotal/(rodamount+1))
153
	
154
	print("Control",23,3)
155
	print("<     >",23,4)
156
	print(rodpercentage,25,4)
157
	print("percent",23,5)
158
	
159
	if (xClick == 22  and yClick == 4) then
160
		--Decrease rod level by amount
161
		newrodpercentage = rodpercentage - adjustamount
162
		if newrodpercentage < 0 then
163
			newrodpercentage = 0
164
		end
165
		xClick, yClick = 0,0
166
		reactor.setAllControlRodLevels(newrodpercentage)
167
	end
168
	
169
	if (xClick == 28  and yClick == 4) then
170
		--Increase rod level by amount
171
		newrodpercentage = rodpercentage + adjustamount
172-
	if storagepercent > 0 then
172+
173-
		paintutils.drawLine(2, 8, math.floor(27*storagepercent/100)+2, 8, colors.yellow)
173+
174
		end
175
		xClick, yClick = 0,0
176
		reactor.setAllControlRodLevels(newrodpercentage)
177
	end
178
	
179
	local energystorage = reactor.getEnergyStored()
180
	storagepercent = math.floor(energystorage/10000000*100)
181
	paintutils.drawLine(2, 8, 28, 8, colors.gray)
182
	if storagepercent > 4 then
183
		paintutils.drawLine(2, 8, math.floor(26*storagepercent/100)+2, 8, colors.yellow)
184
	elseif storagepercent > 0 then
185
		paintutils.drawPixel(2,8,colors.yellow)
186
	end
187
	term.setBackgroundColor(colors.black)
188
	print("Energy",2,7)
189
	print(storagepercent, width-(string.len(storagepercent)+3),7)
190
	print("%",28,7)
191
	term.setBackgroundColor(colors.black)
192
	
193
end
194
195
196
function reactorStatus()
197
	local width, height = term.getSize()
198
	local str = ""
199
	if reactor.getConnected() then
200
		if reactor.getActive() then
201
			str = "ONLINE"
202
			term.setTextColor(colors.green)
203
		else
204
			if autoStart then
205
				reactor.setActive(true)
206
			end
207
			str = "OFFLINE"
208
			term.setTextColor(colors.red)
209
		end
210
		
211
		if(xClick >= (width - string.len(str) - 1) and xClick <= (width-1)) then
212
			if yClick == 1 and not autoStart then
213
				reactor.setActive(not reactor.getActive())
214
				xClick, yClick = 0,0
215
			end
216
		end	
217
		
218
	else
219
		str = "DISCONNECTED"
220
		term.setTextColor(colors.red)
221
	end	
222
	
223
	print(str, width - string.len(str) - 1, 1)
224
	term.setTextColor(colors.white)
225
end
226
227
228
function main()
229
	while not finished do
230
		FC_API.clearMonitor("EZ-NUKE control")
231
		reactorStatus()
232
		if reactor.getConnected() then
233
			displayBars()
234
			save()
235
			sleep(loopTime)
236
		end
237
	end
238
end
239
240
function eventHandler()
241
	while not finished do
242
		event, arg1, arg2, arg3 = os.pullEvent()
243
		
244
		if event == "monitor_touch" then
245
			xClick, yClick = math.floor(arg2), math.floor(arg3)
246
			-- Draw debug stuff
247
			--print("Monitor touch X: "..xClick.." Y: "..yClick, 1, 10)
248
		elseif event == "mouse_click" and not monitor then
249
			xClick, yClick = math.floor(arg2), math.floor(arg3)
250
			--print("Mouse click X: "..xClick.." Y: "..yClick, 1, 11)
251
		elseif event == "char" and not inManualMode then
252
			local ch = string.lower(arg1)
253
			if ch == "q" then
254
				finished = true
255
			elseif ch == "r" then
256
				finished = true	
257
				os.reboot()
258
			end
259
		end
260
	end
261
end
262
263
while not finished do
264
	parallel.waitForAny(eventHandler, main)
265
	sleep(loopTime)
266
end
267
268
term.clear()
269
term.setCursorPos(1,1)
270
FC_API.restoreNativeTerminal()
271
term.clear()
272
term.setCursorPos(1,1)
273
274
--[[ OLD CODE USED FOR TESTING
275
276
print("Program loaded. Scanning for reactor...");
277
local reactor
278
reactor = peripheral.wrap("back")
279
isactive = reactor.getActive();
280
if isactive == true
281
	print("Reactor active.");
282
	monitor.print("All's well!");
283
else
284
	print("Reactor inactive.");
285
end
286
287
]]--