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