View difference between Paste ID: j3rNaKMN and v49i8z3T
SHOW: | | - or go back to the newest paste.
1
-- TODO: actually make graph?
2
3
local monitor = peripheral.find "monitor"
4-
local storage = peripheral.find(settings.get "storage_type" or "draconic_rf_storage")
4+
local storage = peripheral.find "draconic_rf_storage"
5
local re_in_gate = peripheral.wrap "flux_gate_3"
6
local re_out_gate = peripheral.wrap "flux_gate_6"
7
local dist_gate = peripheral.wrap "flux_gate_7"
8
local reactor = peripheral.find "draconic_reactor"
9
local capacity = (storage.getMaxEnergyStored or storage.getEnergyCapacity)()
10
local delay = 0.1
11
local ticks_delay = 0.1 / 0.05
12
local threshold = 1e9
13
local tx_out = 1e8
14
local target_field = 0.4
15
local target_saturation = 0.3
16
17
local function read_energy()
18
	return storage.getEnergyStored()
19
end
20
21
monitor.setTextScale(1)
22
monitor.setBackgroundColor(colors.black)
23
monitor.setTextColor(colors.white)
24
local data = {}
25
26
local prefixes = {"", "k", "M", "G", "T", "P", "E", "Z", "Y", "R", "Q"}
27
local function SI_prefix(value, unit)
28
    local i = 1
29
    local x = value
30
    while x > 1000 or x < -1000 do
31
        x = x / 1000
32
        i = i + 1
33
    end
34
    return ("%.3f%s%s"):format(x, prefixes[i], unit)
35
end
36
37
local function display(data)
38
	monitor.clear()
39
	local longest_label = 0
40
	for _, val in pairs(data) do
41
		if #val[1] > longest_label then longest_label = #val[1] end
42
	end
43
	local i = 1
44
	for _, val in pairs(data) do
45
		monitor.setCursorPos(1, i)
46
		monitor.setTextColor(val[3] or colors.white)
47
		monitor.write(val[1] .. ":" .. (" "):rep(longest_label - #val[1] + 2) .. val[2])
48
		i = i + 1
49
	end
50
end
51
52
re_in_gate.setOverrideEnabled(true)
53
re_out_gate.setOverrideEnabled(true)
54
dist_gate.setOverrideEnabled(true)
55
local past_RF_per_tick = {}
56
local history_length = 1200 / ticks_delay
57
local function display_stats()
58
	local previous
59-
				{ "Time", ("%s.%03d"):format(os.date "!%X", os.epoch "utc" % 1000) },
59+
60-
				{ "Stored", SI_prefix(energy, "RF") },
60+
61
		local reactor_state = reactor.getReactorInfo()
62
		if previous then
63
			local diff = energy - previous
64
			local RF_per_tick = diff / ticks_delay
65
			table.insert(past_RF_per_tick, RF_per_tick)
66
			if #past_RF_per_tick > history_length then table.remove(past_RF_per_tick, 1) end
67
			local total = 0
68
			for _, h in pairs(past_RF_per_tick) do total = total + h end
69
			local average = total / #past_RF_per_tick
70
			
71
			local status = "OK"
72
			local status_col = colors.green
73
			if energy < threshold then
74
				status = "Storage Low"
75
				status_col = colors.yellow
76
			end
77
			if reactor_state.status == "warming_up" then
78
				status = "Reactor Precharge"
79
				status_col = colors.blue
80
			elseif reactor_state.status ~= "cold" and (reactor_state.status == "stopping" or reactor_state.temperature > 8000 or reactor_state.fieldStrength / reactor_state.maxFieldStrength < 0.2 or reactor_state.fuelConversion / reactor_state.maxFuelConversion > 0.83) then
81
				status = "Emergency Shutdown"
82
				status_col = colors.orange
83
				reactor.stopReactor()
84
				re_out_gate.setFlowOverride(0)
85
				re_in_gate.setFlowOverride(1e7)
86
			elseif reactor_state.status == "cold" then
87
				status = "Reactor Off"
88
				status_col = colors.pink
89
			end
90
			if reactor_state.temperature > 9000 then
91
				status = "Imminent Death"
92
				status_col = colors.red
93
			end
94
			if status == "OK" or status == "Storage Low" then
95
				re_in_gate.setFlowOverride(reactor_state.fieldDrainRate / (1 - target_field))
96
				local base_max_rft = reactor_state.maxEnergySaturation / 1000 * 1.5
97
				local conv_level = (reactor_state.fuelConversion / reactor_state.maxFuelConversion) * 1.3 - 0.3
98
				local max_rft = base_max_rft * (1 + conv_level * 2)
99
				re_out_gate.setFlowOverride(math.min(max_rft * 0.7, 5 * reactor_state.fieldDrainRate / (1 - target_field)))
100
			end
101
			dist_gate.setFlowOverride(energy > threshold and tx_out or 0)
102
103
			display {
104
				{ "Status", status, status_col },
105
				{ "Time", os.date "!%X" },
106
				{ "Stored", SI_prefix(energy, "RF"), energy < threshold and colors.yellow },
107
				{ "Capacity", SI_prefix(capacity, "RF") },
108
				{ "% filled", ("%.4f%%"):format(energy / capacity * 100) },
109
				{ "Inst I/O", SI_prefix(RF_per_tick, "RF/t") },
110
				{ "60s I/O" , SI_prefix(average, "RF/t") },
111
				{ "Fuel Consumed", ("%.4f%%"):format(100 * reactor_state.fuelConversion / reactor_state.maxFuelConversion) },
112
				{ "Saturation", ("%.4f%%"):format(100 * reactor_state.energySaturation / reactor_state.maxEnergySaturation) },
113
				{ "Field Strength", ("%.4f%%"):format(100 * reactor_state.fieldStrength / reactor_state.maxFieldStrength) },
114
				{ "Field Input", SI_prefix(re_in_gate.getFlow(), "RF/t") },
115
				{ "Generation Rate", SI_prefix(reactor_state.generationRate, "RF/t") },
116
				{ "Temperature", reactor_state.temperature }
117
			}
118
		end
119
		previous = energy
120
		sleep(delay)
121
	end
122
end
123
124
display_stats()