Advertisement
sanovskiy

Miner soft network

Nov 13th, 2013
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. DATA_FILE = "miners.dat" -- Файл для сохранения данных
  2. TEMP_FILE = "miners.temp" -- Временное хранилище
  3. REFRESH_RATE = 5        -- Seconds
  4.  
  5. BACKGROUND_COLOR = 1    -- White
  6. TEXT_COLOR = 32768      -- Black
  7.  
  8. nTotal = 0
  9. mLayerOffset = 30
  10.  
  11. nLowEnergy = 0
  12. nMining = 0
  13. nQuarry = 0
  14. nStopped = 0
  15. maxLayer = 0
  16. minLayer = 256
  17.  
  18. scrX, scrY = term.getSize()
  19.  
  20. peripherals = peripheral.getNames()
  21. for i = 1, #peripherals do
  22.   if peripheral.getType(peripherals[i]) == "modem" then
  23.     modem = peripheral.wrap(peripherals[i])
  24.   end
  25. end
  26. miner = {}
  27.  
  28. --------------------------------------------------
  29.  
  30.     -- Массив данных о майнерах:
  31.     -- 1 - 'state'
  32.     -- 2 - 'energy'
  33.     -- 3 - 'currentLayer'
  34.     -- 4 - 'mined'
  35.     -- 5 - 'total'
  36.  
  37. minersStats = {}
  38. for i = 1, 81 do
  39.     minersStats[i] = {}
  40.  
  41.     for j = 1, 7 do
  42.         minersStats[i][j] = 0 -- Fill the values here
  43.     end
  44. end
  45.  
  46. --------------------------------------------------
  47. -- Инициализация
  48. --------------------------------------------------
  49.  
  50. function updateSoftware()
  51.   if not(fs.exists("san")) then
  52.     shell.run("pastebin","get wf2EBfvT san")
  53.   end
  54.   shell.run("san"," update san")
  55.   shell.run("san"," update moneos1")
  56.   os.reboot()
  57. end
  58.  
  59. function FindMiners ()
  60.     for i = 1, #peripherals do
  61.         if peripheral.getType(peripherals[i]) == "mininglaser" then
  62.             nTotal = nTotal + 1
  63.             miner[nTotal] = peripherals[i]
  64.         end
  65.     end
  66. end
  67.  
  68. --------------------------------------------------
  69. -- Сбор статистики
  70. --------------------------------------------------
  71.  
  72. function UpdateMiner (minerN)
  73.     local state, energy, currentLayer, mined, total = modem.callRemote(miner[minerN], "state")
  74.  
  75.     minersStats[minerN][1] = state
  76.     minersStats[minerN][2] = energy
  77.     minersStats[minerN][3] = currentLayer
  78.     minersStats[minerN][4] = mined
  79.     minersStats[minerN][5] = total
  80.  
  81.     return 0
  82. end
  83.  
  84. function UpdateAllMiners() -- Обновление статусов всех майнеров
  85.     for i = 1, nTotal do
  86.         UpdateMiner(i)
  87.     end
  88.  
  89.     return 0
  90. end
  91.  
  92. function RecalculateStatistics ()
  93.     nOnline = 0
  94.     nLowEnergy = 0
  95.     nMining = 0
  96.     nQuarry = 0
  97.     nStopped = 0
  98.     maxLayer = 0
  99.     minLayer = 256
  100.  
  101.     for i = 1, nTotal do
  102.         -- nLowEnergyTemp
  103.         if minersStats[i][2] <= 20000 then
  104.             nLowEnergy = nLowEnergy + 1
  105.         end
  106.         -- Scanning ores
  107.         -- Mining ores
  108.         -- nMiningTemp, nQuarryTemp, nStoppedTemp
  109.         ooemessage = " - Out of energy"
  110.         if minersStats[i][1] == "IDLE (not mining)" or minersStats[i][1] == "IDLE (not mining)".. ooemessage then
  111.             nStopped = nStopped + 1
  112.         elseif minersStats[i][1] == "Mining ores" or minersStats[i][1] == "Mining ores" .. ooemessage then
  113.             nMining = nMining + 1
  114.         elseif minersStats[i][1] == "Mining all" or minersStats[i][1] == "Mining all"..ooemessage then
  115.             nQuarry = nQuarry + 1
  116.         end
  117.         -- maxLayerTemp
  118.         maxLayer = math.max(maxLayer, minersStats[i][3])
  119.         minLayer = math.min(minLayer, minersStats[i][3])
  120.     end
  121.  
  122.     return 0
  123. end
  124.  
  125. --------------------------------------------------
  126. -- Интерфейс
  127. --------------------------------------------------
  128.  
  129. function CommandAllMiners(command)
  130.     for i = 1, nTotal do
  131.         modem.callRemote(miner[i], "offset", mLayerOffset)
  132.         modem.callRemote(miner[i], command)
  133.     end
  134. end
  135.  
  136. function DrawBackground ()
  137.     term.setBackgroundColor(BACKGROUND_COLOR)
  138.     term.setTextColor(TEXT_COLOR)
  139.     term.setCursorBlink(false)
  140.     term.clear()
  141.     term.setCursorPos(1, 1)
  142.  
  143.     term.write("\t\t< Mining lasers >")
  144. end
  145.  
  146. function WriteStats ()
  147.     term.setCursorPos(1, 3)
  148.     term.write("Online:\t\t" .. nTotal)
  149.     term.setCursorPos(1, 4)
  150.     term.write("Mining, quarry:\t\t" .. nMining .. ":" .. nQuarry)
  151.     term.setCursorPos(1, 5)
  152.     term.write("Max/min level:\t\t" .. maxLayer .. "/" .. minLayer)
  153.     term.setCursorPos(1, 6)
  154.     term.write("Low energy:\t\t" .. nLowEnergy)
  155. end
  156.  
  157. function WriteButtonsExplanation ()
  158.     term.setCursorPos(1, scrY-4)
  159.     term.write("M - mine, Q - quarry, S - stop")
  160.     term.setCursorPos(1, scrY-3)
  161.     term.write("O - set offset")
  162.     term.setCursorPos(1, scrY-2)
  163.     term.write("R - refresh, X - exit, U - update soft")
  164. end
  165.  
  166. function ReceiveOffset ()
  167.     sleep(1/20)
  168.     term.setCursorPos(1, 3)
  169.     term.write("Enter offset:")
  170.     term.setCursorPos(1, 4)
  171.     term.write("> ")
  172.  
  173.     term.setCursorBlink(true)
  174.     local input = read()
  175.     term.setCursorBlink(false)
  176.  
  177.     mLayerOffset = tonumber(input)
  178.  
  179.     return mLayerOffset
  180. end
  181.  
  182. function Shutdown()
  183.     term.setBackgroundColor(32768)
  184.     term.setTextColor(1)
  185.     term.setCursorPos(1, 1)
  186.     term.clear()
  187.     print("Bye!..")
  188.     sleep(1)
  189. --  os.shutdown()
  190.     error()
  191. end
  192.  
  193. --------------------------------------------------
  194. -- Сохранение и загрузка
  195. --------------------------------------------------
  196.  
  197. function SaveToFile()
  198.     local file = fs.open(TEMP_FILE, "w")
  199.     file.writeLine(mLayerOffset .. "")
  200.     file.close()
  201.  
  202.     fs.delete(DATA_FILE)
  203.     fs.move(TEMP_FILE, DATA_FILE)
  204.  
  205.     return 0
  206. end
  207.  
  208. function LoadFromFile()
  209.     local file = fs.open(DATA_FILE, "r")
  210.     mLayerOffset = tonumber(file.readLine())
  211.     file.close()
  212.  
  213.     return 0
  214. end
  215.  
  216. --------------------------------------------------
  217. -- Главный луп
  218. --------------------------------------------------
  219.  
  220. function main ()
  221.     FindMiners()
  222.  
  223.     if fs.exists(DATA_FILE) then
  224.         LoadFromFile()
  225.     end
  226.  
  227.     while true do
  228.         UpdateAllMiners()
  229.         RecalculateStatistics()
  230.  
  231.         DrawBackground()
  232.         WriteStats()
  233.         WriteButtonsExplanation ()
  234.  
  235.         local timeout = os.startTimer(REFRESH_RATE)
  236.         while true do
  237.  
  238.             event = {os.pullEvent()}
  239.  
  240.             if event[1] == "key" then
  241.                 if event[2] == 50 then              -- M - mining
  242.                     CommandAllMiners("mine")
  243.                 elseif event[2] == 16 then          -- Q - quarry
  244.                     CommandAllMiners("quarry")
  245.                 elseif event[2] == 31 then          -- S - stop
  246.                     CommandAllMiners("stop")
  247.                 elseif event[2] == 24 then          -- O - offset
  248.                     DrawBackground()
  249.                     ReceiveOffset()
  250.                     SaveToFile()
  251.                     break
  252.                 elseif event[2] == 19 then          -- R - refresh
  253.                     break
  254.                 elseif event[2] == 45 then          -- X - shutdown
  255.                     Shutdown()
  256.                 elseif event[2] == 22 then          -- u
  257.                     updateSoftware()                   
  258.                 end
  259.                 local timeout2 = os.startTimer(REFRESH_RATE)
  260.  
  261.             elseif event[1] == "timer" and event[2] == timeout then
  262.                 break
  263.             end
  264.         end
  265.     end
  266. end
  267. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement