View difference between Paste ID: VXaqemj5 and d545CEm0
SHOW: | | - or go back to the newest paste.
1-
NETWORK_SIDE = "bottom" -- Сторона, к которой подключен модем
1+
2
TEMP_FILE = "miners.temp" -- Временное хранилище
3
REFRESH_RATE = 5		-- Seconds
4
5
BACKGROUND_COLOR = 1	-- White
6
TEXT_COLOR = 32768		-- Black
7
8
nTotal = 0
9
mLayerOffset = 30
10
11
nLowEnergy = 0
12
nMining = 0
13
nQuarry = 0
14
nStopped = 0
15
maxLayer = 0
16
minLayer = 256
17
18
scrX, scrY = term.getSize()
19
20
peripherals = peripheral.getNames()
21-
modem = peripheral.wrap(NETWORK_SIDE)
21+
for i = 1, #peripherals do
22
  if peripheral.getType(peripherals[i]) == "modem" then
23-
peripherals = modem.getNamesRemote()
23+
    modem = peripheral.wrap(peripherals[i])
24
  end
25
end
26
miner = {}
27
28
--------------------------------------------------
29
30
	-- Массив данных о майнерах:
31
	-- 1 - 'state'
32
	-- 2 - 'energy'
33
	-- 3 - 'currentLayer'
34
	-- 4 - 'mined'
35
	-- 5 - 'total'
36
37
minersStats = {}
38
for i = 1, 81 do
39
    minersStats[i] = {}
40
41
    for j = 1, 7 do
42
        minersStats[i][j] = 0 -- Fill the values here
43
    end
44
end
45
46
--------------------------------------------------
47
-- Инициализация
48
--------------------------------------------------
49
50-
		if modem.getTypeRemote(peripherals[i]) == "mininglaser" then
50+
function updateSoftware()
51
  if not(fs.exists("san")) then
52
    shell.run("pastebin","get wf2EBfvT san")
53
  end
54
  shell.run("san"," update san")
55
  shell.run("san"," update moneos1")
56
  os.reboot()
57
end
58
59
function FindMiners ()
60
	for i = 1, #peripherals do
61
		if peripheral.getType(peripherals[i]) == "mininglaser" then
62-
	local state, energy, currentLayer, mined, total = modem.callRemote(miner[minerN], "getMinerState")
62+
63
			miner[nTotal] = peripherals[i]
64
		end
65
	end
66
end
67
68
--------------------------------------------------
69
-- Сбор статистики
70
--------------------------------------------------
71
72
function UpdateMiner (minerN)
73
	local state, energy, currentLayer, mined, total = modem.callRemote(miner[minerN], "state")
74
75
	minersStats[minerN][1] = state
76
	minersStats[minerN][2] = energy
77
	minersStats[minerN][3] = currentLayer
78
	minersStats[minerN][4] = mined
79
	minersStats[minerN][5] = total
80
81
	return 0
82
end
83
84
function UpdateAllMiners() -- Обновление статусов всех майнеров
85
	for i = 1, nTotal do
86
		UpdateMiner(i)
87
	end
88
89
	return 0
90
end
91
92
function RecalculateStatistics ()
93
	nOnline = 0
94
	nLowEnergy = 0
95
	nMining = 0
96-
		if minersStats[i][1] == "not mining" then
96+
97
	nStopped = 0
98-
		elseif minersStats[i][1] == "mining" then
98+
99
	minLayer = 256
100-
		elseif minersStats[i][1] == "mining (quarry mode)" then
100+
101
	for i = 1, nTotal do
102
		-- nLowEnergyTemp
103
		if minersStats[i][2] <= 20000 then
104
			nLowEnergy = nLowEnergy + 1
105
		end
106
		-- Scanning ores
107
		-- Mining ores
108
		-- nMiningTemp, nQuarryTemp, nStoppedTemp
109
		ooemessage = " - Out of energy"
110
		if minersStats[i][1] == "IDLE (not mining)" or minersStats[i][1] == "IDLE (not mining)".. ooemessage then
111
			nStopped = nStopped + 1
112
		elseif minersStats[i][1] == "Mining ores" or minersStats[i][1] == "Mining ores" .. ooemessage then
113
			nMining = nMining + 1
114
		elseif minersStats[i][1] == "Mining all" or minersStats[i][1] == "Mining all"..ooemessage then
115
			nQuarry = nQuarry + 1
116
		end
117-
		modem.callRemote(miner[i], "setStartLayerOffset", mLayerOffset)
117+
118
		maxLayer = math.max(maxLayer, minersStats[i][3])
119
		minLayer = math.min(minLayer, minersStats[i][3])
120
	end
121
122
	return 0
123
end
124
125
--------------------------------------------------
126
-- Интерфейс
127
--------------------------------------------------
128
129
function CommandAllMiners(command)
130
	for i = 1, nTotal do
131
		modem.callRemote(miner[i], "offset", mLayerOffset)
132
		modem.callRemote(miner[i], command)
133
	end
134
end
135
136
function DrawBackground ()
137
	term.setBackgroundColor(BACKGROUND_COLOR)
138
	term.setTextColor(TEXT_COLOR)
139
	term.setCursorBlink(false)
140
	term.clear()
141
	term.setCursorPos(1, 1)
142
143
	term.write("\t\t< Mining lasers >")
144
end
145
146
function WriteStats ()
147-
	term.write("O - set offset, X - shutdown, R - refresh")
147+
148
	term.write("Online:\t\t" .. nTotal)
149
	term.setCursorPos(1, 4)
150
	term.write("Mining, quarry:\t\t" .. nMining .. ":" .. nQuarry)
151
	term.setCursorPos(1, 5)
152
	term.write("Max/min level:\t\t" .. maxLayer .. "/" .. minLayer)
153
	term.setCursorPos(1, 6)
154
	term.write("Low energy:\t\t" .. nLowEnergy)
155
end
156
157
function WriteButtonsExplanation ()
158
	term.setCursorPos(1, scrY-4)
159
	term.write("M - mine, Q - quarry, S - stop")
160
	term.setCursorPos(1, scrY-3)
161
	term.write("O - set offset")
162
	term.setCursorPos(1, scrY-2)
163
	term.write("R - refresh, X - exit, U - update soft")
164
end
165
166
function ReceiveOffset ()
167
	sleep(1/20)
168
	term.setCursorPos(1, 3)
169
	term.write("Enter offset:")
170
	term.setCursorPos(1, 4)
171
	term.write("> ")
172
173-
	os.shutdown()
173+
174
	local input = read()
175
	term.setCursorBlink(false)
176
177
	mLayerOffset = tonumber(input)
178
179
	return mLayerOffset
180
end
181
182
function Shutdown()
183
	term.setBackgroundColor(32768)
184
	term.setTextColor(1)
185
	term.setCursorPos(1, 1)
186
	term.clear()
187
	print("Bye!..")
188
	sleep(1)
189
--	os.shutdown()
190
	error()
191
end
192
193
--------------------------------------------------
194
-- Сохранение и загрузка
195
--------------------------------------------------
196
197
function SaveToFile()
198
	local file = fs.open(TEMP_FILE, "w")
199
	file.writeLine(mLayerOffset .. "")
200
	file.close()
201
202
	fs.delete(DATA_FILE)
203
	fs.move(TEMP_FILE, DATA_FILE)
204
205
	return 0
206
end
207
208
function LoadFromFile()
209
	local file = fs.open(DATA_FILE, "r")
210
	mLayerOffset = tonumber(file.readLine())
211
	file.close()
212
213
	return 0
214
end
215
216
--------------------------------------------------
217
-- Главный луп
218
--------------------------------------------------
219
220
function main ()
221
	FindMiners()
222
223
	if fs.exists(DATA_FILE) then
224
		LoadFromFile()
225-
					CommandAllMiners("startMining")
225+
226
227-
					CommandAllMiners("startQuarry")
227+
228
		UpdateAllMiners()
229
		RecalculateStatistics()
230
231
		DrawBackground()
232
		WriteStats()
233
		WriteButtonsExplanation ()
234
235
		local timeout = os.startTimer(REFRESH_RATE)
236
		while true do
237
238
			event = {os.pullEvent()}
239
240
			if event[1] == "key" then
241
				if event[2] == 50 then				-- M - mining
242
					CommandAllMiners("mine")
243
				elseif event[2] == 16 then			-- Q - quarry
244
					CommandAllMiners("quarry")
245
				elseif event[2] == 31 then			-- S - stop
246
					CommandAllMiners("stop")
247
				elseif event[2] == 24 then			-- O - offset
248
					DrawBackground()
249
					ReceiveOffset()
250
					SaveToFile()
251
					break
252
				elseif event[2] == 19 then			-- R - refresh
253
					break
254
				elseif event[2] == 45 then			-- X - shutdown
255
					Shutdown()
256
				elseif event[2] == 22 then          -- u
257
					updateSoftware()					
258
				end
259
				local timeout2 = os.startTimer(REFRESH_RATE)
260
261
			elseif event[1] == "timer" and event[2] == timeout then
262
				break
263
			end
264
		end
265
	end
266
end
267
main()