Belzebub

euNtps_monitoring.lua

Dec 11th, 2021 (edited)
542
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- демон для вывода eu/s и примерный tps на второй экран
  2. -- софт рендерит новый фрейм средне-медианное tps и eu/s каждую секунду
  3. -- credits: Beelzebub#0281 incredible-gmod.ru ??.12.2021
  4.  
  5. -- скачивание: wget https://pastebin.com/raw/guHTzhQG /home/monitoring.lua
  6. -- остановить прогу: /home/monitoring.lua stop
  7. -- автозапуск проги: добавьте путь к файлу в конец /home/.shrc
  8.  
  9. local frametime = 3 -- раз в сколько секунд будет рендериться новый кадр?
  10.  
  11. local event = require("event")
  12. local component = require("component")
  13. local fs = require("filesystem")
  14. local internet = require("internet")
  15. local energy_counter = component.energy_counter
  16. local gpu = component.gpu
  17.  
  18. local eu, last_eu = {}, 0
  19.  
  20. function math.median(t)
  21.     table.sort(t)
  22.  
  23.     if math.fmod(#t, 2) == 0 then
  24.         return (t[#t * 0.5] + t[(#t * 0.5) + 1]) * 0.5
  25.     else
  26.         return t[math.ceil(#t * 0.5)]
  27.     end
  28. end
  29.  
  30. function string.comma(num)
  31.     local formatted = tostring(math.floor(num))
  32.  
  33.     while true do  
  34.         formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", "%1 %2")
  35.         if k == 0 then
  36.             break
  37.         end
  38.     end
  39.  
  40.     return formatted
  41. end
  42.  
  43. local function getenergy()
  44.     local cur = energy_counter.getCount()
  45.    
  46.     if #eu >= 10 then table.remove(eu, 1) end
  47.     eu[#eu + 1] = cur - last_eu
  48.     last_eu = cur
  49.  
  50.     return #eu == 1 and eu[1] or math.median(eu)
  51. end
  52.  
  53. local function getSecondaryComponent(component_name, primary_adress)
  54.     local list = component.list(component_name)
  55.     local secondary = list()
  56.  
  57.     if secondary == primary_adress then
  58.         secondary = list()
  59.     end
  60.  
  61.     return secondary
  62. end
  63.  
  64. local function time()
  65.     local f = io.open("/tmp/tps", "w")
  66.     f:write("test")
  67.     f:close()
  68.     return (fs.lastModified("/tmp/tps"))
  69. end
  70.  
  71. local lastTime = 0
  72. local tps = {}
  73. local function getTps()
  74.     local curTime = time()
  75.     local time_diff = curTime - lastTime
  76.    
  77.     if #tps >= 10 then table.remove(tps, 1) end
  78.     tps[#tps + 1] = 20000 / time_diff
  79.     lastTime = curTime
  80.  
  81.     return math.median(tps), time_diff
  82. end
  83.  
  84. local function draw()
  85.     local tps, time_diff = getTps()
  86.     if tps > 20 then tps = 20 end -- мерило крайне неточное, приходиться работать с тем что имеем
  87.     local tps_str = math.floor(tps) .." tps"
  88.  
  89.     local eups_str = string.comma(getenergy() * time_diff / 1000 / frametime) .." eu/s"
  90.  
  91.     local wide = math.max(#tps_str, #eups_str)
  92.  
  93.     gpu.setResolution(wide, 2)
  94.    
  95.     gpu.setBackground(0x000000)
  96.     gpu.setForeground(0xFFFFFF)
  97.     gpu.fill(1, 1, wide, 2, " ")
  98.  
  99.     gpu.set(wide * 0.5 - #tps_str * 0.5, 1, tps_str)
  100.     gpu.set(wide * 0.5 - #eups_str * 0.5, 2, eups_str)
  101. end
  102.  
  103. function stop()
  104.     if _G.MonitoringTimerID == nil then return end
  105.  
  106.     event.cancel(_G.MonitoringTimerID)
  107.     _G.MonitoringTimerID = nil
  108. end
  109.  
  110. function start()
  111.     local screen_primary = require("term").screen()
  112.     local screen_secondary = getSecondaryComponent("screen", screen_primary)
  113.  
  114.     if screen_primary == screen_secondary then return print("К компьютеру не подключен второй экран!") end
  115.  
  116.     lastTime = time()
  117.  
  118.     _G.MonitoringTimerID = event.timer(frametime, function()
  119.         local w, h = gpu.getResolution()
  120.         gpu.bind(screen_secondary, false)
  121.             local succ, err = pcall(draw)
  122.             if err then
  123.                 gpu.setResolution(gpu.maxResolution())
  124.                 print(err)
  125.             end
  126.         gpu.bind(screen_primary, false)
  127.         gpu.setResolution(w, h)
  128.     end, math.huge)
  129. end
  130.  
  131. local arg = ...
  132. if arg == "stop" then return stop() end
  133.  
  134. local succ, err = pcall(start)
  135. if err then
  136.     print(err)
  137. end
RAW Paste Data Copied