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() |