View difference between Paste ID: 3eCrKyiw and WKSNB0vh
SHOW: | | - or go back to the newest paste.
1
--------------------------------------------------
2
-- Клиентская программа для шахтерских лазеров из кросоварпа.
3
-- Ставится на компьютер возле лазера
4
-- и подключается сетевыми кабелями к серверу,
5
-- стоящему в кабине. На тот компьютер
6
-- нужно поставить серверную программу.
7
-- И то, и то нужно поставить в autostart.
8
--
9
-- (c) Efrim
10
-- skype: gods_pee
11
-- 05.10.2013
12
--------------------------------------------------
13
-- Changelog:
14
-- 1.0: release
15
-- 1.1: forced opening networking
16
--------------------------------------------------
17
18
19
NETWORK_SIDE = "back" -- Сторона, к которой подключен модем
20
LASER_SIDE = "left" -- Сторона, к которой подключен лазер
21
DATA_FILE = "miner.dat" -- Файл для сохранения данных
22
TEMP_FILE = "miner.temp" -- Временное хранилище
23
TIMEOUTS_MAX = 3 -- Максимальное количество таймаутов в сетевом общении
24
TIMEOUT = 1 -- Время таймаута
25
REFRESH_PERIOD = 5 -- Период обновления экрана
26
27
--------------------------------------------------
28
29
ownID = os.getComputerID()
30
31
mLayerOffset = 30
32
initialized = 0
33
34
miner = peripheral.wrap(LASER_SIDE)
35
36
--------------------------------------------------
37
-- Графическая часть
38
--------------------------------------------------
39
40
function DisplayStats()
41
	local state, energy, currentLayer, mined, total = miner.getMinerState()
42
	term.clear()
43
	term.setCursorPos(1,1)
44
45
	print("State: " .. state)
46
	print("Energy: " .. energy .. " Eu")
47
	print("Mined " .. mined .. "/" .. total .." at layer " .. currentLayer)
48
	print("Offset: " .. mLayerOffset)
49
	print("Initialized: " .. initialized)
50
end
51
52
--------------------------------------------------
53-
	if not rednet.isOpen(NETWORK_SIDE) then
53+
54-
		rednet.open(NETWORK_SIDE)
54+
55
56
function Initialize()
57
	rednet.open(NETWORK_SIDE)
58
59
	serverID = -1
60
61
	term.clear()
62
	term.setCursorPos(1,1)
63
	print("Initializing...")
64
65
	while true do
66
		local receivedID, receivedMessage, _ = rednet.receive()
67
		print("Received message.")
68
		if receivedMessage == "Server is here" then
69
			serverID = receivedID
70
			rednet.send(serverID, "Miner " .. ownID .. " is here")
71
			local receivedID, receivedMessage, _ = rednet.receive(TIMEOUT)
72
			if receivedID == serverID and receivedMessage == "Gotcha" then
73
				initialized = 1
74
				return 0
75
			end
76
		end
77
	end
78
	return 1
79
end
80
81
--------------------------------------------------
82
-- Общение с сервером после инициализации
83
--------------------------------------------------
84
85
function SendStatus()
86
	-- local state = {miner.getMinerState()}
87
	-- table.insert(state, mLayerOffset)
88
	rednet.send(serverID, textutils.serialize({miner.getMinerState()}))
89
	return 0
90
end
91
92
function ProcessCommand(command)
93
	local _, _, text, number = string.find(command, "([%a%d]+)% ?([%a%d]*)")
94
95
	if text == "start" or text == "startall" then
96
		miner.setStartLayerOffset(mLayerOffset)
97
		miner.startMining()
98
	elseif text == "stop" or text == "stopall" then
99
		miner.stop()
100
	elseif text == "quarry" or text == "quarryall" then
101
		miner.setStartLayerOffset(mLayerOffset)
102
		miner.startQuarry()
103
	elseif text == "reinit" then
104
		initialized = 0
105
		Initialize()
106
	elseif text == "offset" and number ~= "" then
107
		mLayerOffset = tonumber(number)
108
		miner.setStartLayerOffset(mLayerOffset)
109
	elseif text == "restart" then
110
		os.reboot()
111
	elseif text == "update" and number ~= "" then
112
		fs.delete("autostart")
113
		os.run({}, "pastebin", "get " .. number .. " autostart")
114
		os.reboot()
115
	elseif text == "statusrequest" then
116
		SendStatus()
117
	end
118
119
	return command
120
end
121
122
--------------------------------------------------
123
-- Сохранение и загрузка
124
--------------------------------------------------
125
126
function SaveDataToFile()
127
	local file = fs.open(TEMP_FILE, "w")
128
	file.writeLine(serverID .. " " .. mLayerOffset .. " " .. initialized)
129
	file.close()
130
131
	fs.delete(DATA_FILE)
132
	fs.move(TEMP_FILE, DATA_FILE)
133
134
	return 0
135
end
136
137
function LoadDataFromFile()
138
	local file = fs.open(DATA_FILE, "r")
139
	local line = file.readAll()
140
	_, _, param1, param2, param3 = string.find(line, "(%d+) (%d+) (%d)")
141
	file.close()
142
143
	serverID = tonumber(param1)
144
	mLayerOffset = tonumber(param2)
145
	initialized = tonumber(param3)
146
147
	return 0
148
end
149
150
--------------------------------------------------
151
-- Главный луп
152
--------------------------------------------------
153-
	if not rednet.isOpen(NETWORK_SIDE) then
153+
154-
		print("Opening networking...")
154+
155-
		rednet.open(NETWORK_SIDE)
155+
	print("Opening networking...")
156
	rednet.open(NETWORK_SIDE)
157
158
	if fs.exists(DATA_FILE) then
159
		print("Loading previous data...")
160
		LoadDataFromFile()
161
	end
162
163
	if not initialized then
164
		print("Initializing...")
165
		Initialize()
166
	end
167
168
	while true do
169
		DisplayStats()
170
171
		local timeout = os.startTimer(REFRESH_PERIOD)
172
		while true do
173
			local event, id, text = os.pullEvent()
174
			if event == "rednet_message" then
175
				ProcessCommand(text)
176
				DisplayStats()
177
				SaveDataToFile()
178
				timeout = os.startTimer(REFRESH_PERIOD)
179
			elseif event == "timer" and id == timeout then
180
			    break
181
			end
182
		end
183
	end
184
end
185
186
main()