Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --Скрипт openComputers, для мониторинга заряда Power Sub-Station батарейки из GT++
- --Автор: aka_zaratustra весна 2021
- --Версия сборки под которую писался скрипт: GTNH 2.1.0.0
- --Минимальная конфигурация компьютера openComputers - любой минимальный сэтап со сдвоенным монитором T1.
- --Для цветного вывода рекомендуемая конфигурация компьютера openComputers - Т2 видеокарта, сдвоенный монитор Т2, остальное может быть минимальным.
- --Адаптер с пустым внутренним слотом установлен в смежном блоке с контроллером Power Sub-Station.
- --Никаких других адаптеров, подключенных к греговским механизмам в сети компьютера openComputers быть не должно.
- local ver = "1.0" -- версия программы
- local component = require("component")
- local computer = require("computer")
- --local ADDRESS_PSS = "9885"
- local object = {}
- object.PSS = {}
- local PSS = object.PSS
- --PSS.component = component.proxy(component.get(ADDRESS_PSS))
- PSS.component = component.proxy(component.gt_machine.address)
- --PSS.address = address
- local gpu = component.gpu
- local PrintChargePercent --процент заряда батареи
- local PrintChargeAmount -- количество заряда в eu
- -- скорость изменения заряда eu/t
- local PrintChargeChange
- local iChargeChange = 0
- local PrintChargeTime -- время за которое произойдет полная зарядка/разрядка
- local LastTime = computer.uptime() -- счетчик времени
- local iLastChargeAmount = 0 -- количество заряда в eu, которое было на прошлой итерации
- local info = object.PSS.component.getSensorInformation() --получаем таблицу с текстом состояния батареи
- function howManyYears(t) -- преобразовать секунды в количество лет, месяцев, дней, часов, минут, секунд
- if t < 60 then --если осталось меньше минуты
- return tostring(math.floor(t)) .. " сек"
- elseif t < 60*60 then --если осталось меньше часа
- local minutes = math.floor(t/60)
- local seconds = math.floor(math.fmod(t, 60))
- return tostring(minutes) .. " мин " .. tostring(seconds) .. " сек"
- elseif t < 60*60*24 then --если осталось меньше суток
- local hours = math.floor(t/(60*60))
- local minutes = math.floor(math.fmod(t, 60*60)/60)
- return tostring(hours) .. " ч " .. tostring(minutes) .. " мин"
- elseif t < 60*60*24*30 then --если осталось меньше месяца
- local days = math.floor(t/(60*60*24))
- local hours = math.floor(math.fmod(t, 60*60*24)/(60*60))
- return tostring(days) .. " д " .. tostring(hours) .. " ч"
- elseif t < 60*60*24*30*12 then --если осталось меньше года
- local months = math.floor(t/(60*60*24*30))
- local days = math.floor(math.fmod(t, 60*60*24*30)/(60*60*24))
- return tostring(months) .. " мес " .. tostring(days) .. " д "
- else --если осталось больше года
- local years = math.floor(t/(60*60*24*30*12))
- local months = math.floor(math.fmod(t, 60*60*24*30*12)/(60*60*24*30))
- return tostring(years) .. " год " .. tostring(months) .. " мес"
- end
- end
- function draw() --отрисовать значения на экране
- if gpu ~= nil then
- gpu.fill(1,1,19,4,' ')
- gpu.set(1,1, "Заряд: "..PrintChargePercent)
- gpu.set(1,2, " "..PrintChargeAmount)
- if iChargeChange < 0 then
- gpu.setForeground(0xFF0000)
- elseif iChargeChange > 0 then
- gpu.setForeground(0x00FF00)
- end
- gpu.set(1,3, " "..PrintChargeChange)
- gpu.setForeground(0xFFFFFF)
- gpu.set(1,4, "Время: "..PrintChargeTime)
- end
- end
- function formatGrade(n, postscriptum) --преобразует число в выводимую строку с сокращением триад 123456789 -> 123 M, присоединяет в концу строки второй параметр
- local sn = ""
- if math.abs(n) < 10000 then
- sn = tostring(n).." "
- elseif math.abs(n) < 10000000 then
- sn = tostring(math.floor(n/1000)).." K"
- elseif math.abs(n) < 10000000000 then
- sn = tostring(math.floor(n/1000000)).." M"
- elseif math.abs(n) < 10000000000000 then
- sn = tostring(math.floor(n/1000000000)).." G"
- else
- sn = tostring(math.floor(n/1000000000000)).." T"
- end
- return sn..postscriptum
- end
- function update() --обновление инфы о состоянии батареи
- local ThisTime = computer.uptime()
- local deltaTicks = (ThisTime - LastTime)*20 --сколько времени в тиках прошло после последнего обновления
- LastTime = ThisTime
- --print(deltaTicks)
- info = object.PSS.component.getSensorInformation() --получаем таблицу с текстом состояния батареи
- local s = info[3] --строчка с текущим зарядом
- s = string.sub(s,15,string.len(s)-3) --отрезаем лишние куски от строки
- s,_ = s:gsub(',','') --вырезаем запятые
- --print(s)
- local iChargeAmount = tonumber(s)
- --print(iChargeAmount)
- local s = info[4] --строчка с полной емкостью батареи
- s = string.sub(s,14,string.len(s)-3) --отрезаем лишние куски от строки
- s,_ = s:gsub(',','') --вырезаем запятые
- --print(s)
- local iBatteryCap = tonumber(s)
- --print(iBatteryCap)
- local dChargePercent = iChargeAmount / iBatteryCap * 100 --процент заряда батареи неокругленный
- dChargePercent = math.floor(dChargePercent*100)/100 --округляем с масштабированием, так чтобы получилось два знака после запятой (например 33.33%)
- PrintChargePercent = tostring(dChargePercent) .. " %"
- --print(PrintChargePercent)
- PrintChargeAmount = formatGrade(iChargeAmount, "eu") --форматируем в выводимую строку
- --print(PrintChargeAmount)
- iChargeChange = math.floor((iChargeAmount - iLastChargeAmount)/deltaTicks) -- скорость зарядки батареи в eu/t
- PrintChargeChange = formatGrade(iChargeChange, "eu/t") --форматируем в выводимую строку
- if iChargeChange > 0 then --добавим плюс в начале, если идет прирост энергии
- PrintChargeChange = "+"..PrintChargeChange
- end
- --print(PrintChargeChange)
- iLastChargeAmount = iChargeAmount
- --время, оставшееся до полной зарядки или полной разрядки батареи
- local ticksRemain
- if iChargeChange < 0 then --если батарея разряжается
- ticksRemain = -iChargeAmount/iChargeChange
- elseif iChargeChange > 0 then --если батарея заряжается
- ticksRemain = (iBatteryCap - iChargeAmount)/iChargeChange
- else --если батарея разрядилась до нуля
- ticksRemain = 0
- end
- --print(ticksRemain/20)
- PrintChargeTime = howManyYears(ticksRemain/20)
- --print(PrintChargeTime)
- draw() --отрисовываем на экране
- end
- --for name, val in pairs(info) do --просмотрим таблицу
- --print(name, val)
- --end
- require("component").gpu.setResolution(19, 4)
- while true do --вечный главный цикл программы
- update()
- os.sleep(1)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement