Advertisement
efrim

Miner Controller 1.1 for Warpdrive 1.6.2

Oct 17th, 2013
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. -- Инициализация
  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.  
  154. function main()
  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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement