Advertisement
efrim

Miner Controller 1.0 for Warpdrive 1.6.2

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