Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local computer = require("computer")
- local c = require("component")
- local fl = require("filesystem")
- local event = require("event")
- local term = require("term")
- local unicode = require("unicode")
- local gpu = c.gpu
- local red = c.redstone
- local box1 = c.mfe
- local box2 = c.batbox
- --local mic = c.microcontroller
- local function printCmd(text) --статус строка
- gpu.fill(settingCmd[1], settingCmd[2], settingCmd[3], settingCmd[4], ' ')
- if text ~= nil then
- sms[#sms+1] = text
- end
- while #sms>3 do
- table.remove(sms, 1)
- end
- for i = 1, #sms do
- if sms[i] ~= nil then
- gpu.set(2, settingCmd[2]-1+i, tostring(unicode.sub(sms[i], 1, 47)))
- end
- end
- os.sleep(0)
- end
- local function iventorySize()
- for i=0,5 do
- if c.proxy(tr[1]).getInventorySize(i) and c.proxy(tr[1]).getInventorySize(i) >= 27 then
- printCmd('найден сундук')
- return true
- end
- end
- printCmd('сундук не найден')
- return false
- end
- local function boilerSearch()
- for boiler = 0, 5 do --поиск котла
- if c.proxy(tr[1]).getFluidInTank(boiler).n == 2 then
- printCmd('сторона с котлом найдена '..boiler)
- for water = 0, 5 do --поиск воды
- if c.proxy(tr[1]).getTankLevel(water) == 1000 then
- printCmd('сторона с водой найдена '..water)
- for chest = 0, 5 do --поиск сундука с топливом
- if c.proxy(tr[1]).getInventorySize(chest) and c.proxy(tr[1]).getInventorySize(chest) >= 27 then
- printCmd('сторона с топливным сундуком найдена '..chest)
- tr[1] = {tr[1], water, boiler, chest}
- return true
- end
- end
- end
- end
- end
- end
- return false
- end
- local function turbineSearch()
- for turbine = 0, 5 do --поиск турбины
- if c.proxy(tr[2]).getFluidInTank(turbine).n == 2 then
- printCmd('сторона с турбиной найдена '..turbine)
- for boiler = 0, 5 do --поиск резервуара
- if c.proxy(tr[2]).getTankCapacity(boiler) > 10000 then
- printCmd('сторона с резервуаром найдена '..boiler)
- tr[2] = {tr[2], 100, turbine, boiler}
- return true
- end
- end
- end
- end
- return false
- end
- local function partySetting()
- printCmd('запуск настройки сторон транспозеров')
- for i, _ in pairs(c.list('transposer')) do
- tr[#tr+1] = i
- end
- if #tr == 1 then
- printCmd('ошибка! подключено мало транспозеров ('..#tr..')')
- printCmd('проверьте систему')
- os.exit()
- elseif #tr > 2 then
- printCmd('ошибка! подключено много транспозеров ('..#tr..')')
- printCmd('проверьте систему')
- os.exit()
- else
- printCmd('транспозеры подключены, начинаю анализ')
- end
- if not iventorySize() then
- local vr = tr[1]
- tr[1] = tr[2]
- tr[2] = vr
- end
- if not iventorySize() then
- printCmd('ОШИБКА! не вижу сундука, возможно вы забыли')
- printCmd('его поставить или нет доступа к привату')
- os.exit()
- end
- boilerSearch()
- turbineSearch()
- printCmd('настройка завершена')
- end
- local function redstoneSetting()
- tr[#tr+1] = {'addres'}
- printCmd('настройка редстоун управления')
- printCmd('укажите стороны для управления (цифрами)')
- local text, vr, i={'??','основной веткой','веткой питания компьютера','аварийной веткой'}, {}, 2
- while i<#text+1 do
- printCmd('сторона управления '..text[i])
- printCmd('>>')
- term.setCursor(4,16-1)
- tr[#tr][i] = tonumber(io.read())
- printCmd("Активирую сторону "..tr[#tr][i]..". Проверьте все верно? (y/n)")
- printCmd('>>')
- term.setCursor(4,16-1)
- red.setOutput(tr[#tr][i],255)
- local t = io.read()
- if t == '' or t == 'y' then
- red.setOutput(tonumber(tr[#tr][i]),0)
- i=i+1
- else
- red.setOutput(tonumber(tr[#tr][i]),0)
- end
- end
- end
- local function saveSetting()
- local file = io.open("../etc/SteamTurbine.cnf",'w')
- for i=1,#tr do
- for i1=1,#tr[i] do
- file:write(tostring(tr[i][i1])..'\n')
- end
- file:write('#####\n')
- end
- file:close()
- end
- local function readSetting()
- local file = io.open("../etc/SteamTurbine.cnf",'r')
- if file then
- printCmd('загружаю сохранение')
- for i=1,3 do
- local t = file:read()
- tr[i] = {}
- i1=1
- while t ~= '#####' and t ~= nil do
- if i1==1 then
- tr[i][i1] = t
- else
- tr[i][i1] = tonumber(t)
- end
- i1=i1+1
- t = file:read()
- os.sleep(0)
- end
- end
- file:close()
- if #tr[1] < 4 then
- printCmd('ОШИБКА в сохранении.')
- printCmd('удаляю файл конфигурации.')
- printCmd('перезагрузите программу')
- fl.remove("../etc/SteamTurbine.cnf")
- os.exit()
- end
- printCmd('сохранение загружено')
- else
- printCmd('нету файла! создаю файл настройки')
- partySetting()
- redstoneSetting()
- saveSetting()
- end
- end
- local function percent(max,per)
- return math.ceil((100*per)/max)
- end
- local function energyCheckBox2()
- local time, pam = 0, 0
- if percent(box2.getEUCapacity(),box2.getEUStored()) <= 10 then
- printCmd('уровень энергии компьютера низкий')
- if box1.getEUStored() > 40000 then
- printCmd('подключаю зарядку от основного источника')
- red.setOutput(tr[#tr][3],0)--комп вкл
- pam = red.getOutput(tr[#tr][2])
- red.setOutput(tr[#tr][2],0)
- while box1.getEUStored() > 1500 and box2.getEUStored() < 40000 and time < 20 do
- time = time +1
- os.sleep(1)
- end
- red.setOutput(tr[#tr][3],255)
- red.setOutput(tr[#tr][2],pam)
- else
- printCmd('подключаю зарядку от аварийного источника')
- pam = red.getOutput(tr[#tr][2])
- red.setOutput(tr[#tr][2],255)--основная откл
- red.setOutput(tr[#tr][3],0)--комп вкл
- red.setOutput(tr[#tr][4],0)--аварийка вкл
- while box1.getEUStored() < 40000 and time < 10 do
- time = time +1
- os.sleep(1)
- end
- red.setOutput(tr[#tr][3],255)--комп выкл
- red.setOutput(tr[#tr][4],255)--аварийка выкл
- red.setOutput(tr[#tr][2],pam)
- end
- printCmd('Зарядка завершена.')
- printCmd('Уровень энергии компьютера ' ..percent(box2.getEUCapacity(),box2.getEUStored())..' %')
- end
- end
- local function itemCol()
- local num = 0
- for i=3,6 do
- num = num + c.proxy(tr[1][1]).getSlotStackSize(tr[1][3],i)
- end
- return num
- end
- local function fire()
- printCmd('накачка воды')
- while percent(c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[1].capacity, c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[1].amount) < 98 do
- c.proxy(tr[1][1]).transferFluid(tr[1][2],tr[1][3],1000)
- end
- printCmd('проверка пара')
- if c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[2].amount > 0 then
- printCmd('температура есть')
- else
- printCmd('температуры нет')
- printCmd('проверка топлива')
- if itemCol()>0 then
- printCmd('топливо есть')
- else
- printCmd('топлива нет. загружаю')
- for i=1,c.proxy(tr[1][1]).getInventorySize(tr[1][4]) do
- if c.proxy(tr[1][1]).getSlotStackSize(tr[1][4],i)~= 0 then
- c.proxy(tr[1][1]).transferItem(tr[1][4],tr[1][3],64,i)
- end
- if itemCol() >= 250 then
- printCmd('топливо загружено')
- break
- end
- end
- end
- end
- end
- local function infoSys(n)
- local info = {}
- info[#info+1] = {['pr'] = percent(box1.getEUCapacity(),box1.getEUStored())..'%', ['st'] = box1.getEUStored(), ['ca'] = box1.getEUCapacity()}
- info[#info+1] = {['pr'] = percent(box2.getEUCapacity(),box2.getEUStored())..'%', ['st'] = box2.getEUStored(), ['ca'] = box2.getEUCapacity()}
- info[#info+1] = {['pr'] = percent(computer.maxEnergy(), computer.energy())..'%', ['st'] = math.ceil(computer.energy()) , ['ca'] = computer.maxEnergy()}
- info[#info+1] = {['pr'] = percent(c.proxy(tr[2][1]).getTankCapacity(tr[2][4]), c.proxy(tr[2][1]).getTankLevel(tr[2][4]))..'%', ['st'] = c.proxy(tr[2][1]).getTankLevel(tr[2][4]), ['ca'] = c.proxy(tr[2][1]).getTankCapacity(tr[2][4])}
- info[#info+1] = {['pr'] = percent(c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[1].capacity, c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[1].amount)..'%', ['st'] = c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[1].amount, ['ca'] = c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[1].capacity}
- info[#info+1] = {['pr'] = percent(c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[2].capacity, c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[2].amount)..'%', ['st'] = c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[2].amount, ['ca'] = c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[2].capacity}
- info[#info+1] = {['pr'] = percent(64*4, itemCol())..'%', ['st'] = itemCol(), ['ca'] = 64*4}
- info[#info+1] = {['pr'] = '', ['st'] = tostring(red.getOutput(tr[3][2])<200), ['ca'] = 'time:'}
- info[#info+1] = {['pr'] = '', ['st'] = tostring(red.getOutput(tr[3][3])<200), ['ca'] = ' '..tostring(n)}
- info[#info+1] = {['pr'] = '', ['st'] = tostring(red.getOutput(tr[3][4])<200), ['ca'] = ''}
- for i=1,#info do
- gpu.set(26,i+1,(' '):rep(4))
- gpu.set(31,i+1,(' '):rep(8))
- gpu.set(40,i+1,(' '):rep(10))
- gpu.set(26,i+1,tostring(info[i].pr))
- gpu.set(31,i+1,tostring(info[i].st))
- gpu.set(40,i+1,tostring(info[i].ca))
- end
- end
- local function infoTr()
- for i=1,3 do
- print('#####')
- for i1=1,#tr[i] do
- printCmd(tr[i][i1])
- end
- end
- end
- local function testComponent()
- local vr, err = {}, false
- printCmd("тестирую транспозеры")
- for i, _ in pairs(c.list('transposer')) do
- vr[#vr+1] = i
- end
- repeat
- err = false
- for i=1,#tr do
- if vr[1]~= nil and vr[1] == tr[i][1] then
- table.remove(vr,1)
- err = true
- break
- end
- end
- until vr[1] == nil or err == false
- printCmd("тест завершен")
- if err then
- printCmd("все в норме")
- else
- printCmd("обнаружено несоответствие адресов. Перезагрузка файла конфигурации")
- fl.remove("../etc/SteamTurbine.cnf")
- readSetting()
- end
- end
- local function PrintLine(x1, y1, x2, y2, sms, vertical, colorBr, colorLet) -- быстрая отрисовка рамок
- local vr = ''
- if not vertical then vertical = false end
- if not x2 then x2 = x1 end
- if not y2 then y2 = y1 end
- if not colorBr then gpu.setBackground(0x000000) else gpu.setBackground(colorBr) end
- if not colorLet then gpu.setForeground(0xffffff) else gpu.setForeground(colorLet) end
- if not vertical then -- если нарисовать горизонтальную строку
- vr = (sms):rep(x2 - x1 + 1)
- else -- если нарисовать вертикальную строку
- vr = (sms):rep(y2 - y1 + 1)
- end
- gpu.set(x1, y1, vr, vertical)
- gpu.setBackground(0x000000)
- gpu.setForeground(0xffffff)
- end
- local function frame() -- рамка, а что ж еще
- local h, w = 16, 50
- local text = {'Энергия основной ветки', 'Энергия контрол. ветки', 'Энергия внутренняя', 'Пар в резервуаре', 'Уровень воды в котле', 'Уровень пара в котле', 'Количество топлива', 'Статус основной ветки', 'Статус контрол. ветки', 'Статус аварийной ветки'}
- term.clear()
- PrintLine(1, 1, nil, nil, '╔')
- PrintLine(w, 1, nil, nil, '╗')
- PrintLine(1, h, nil, nil, '╚')
- PrintLine(w, h, nil, nil, '╝')
- PrintLine(2, 1, w - 1, nil, '═')
- PrintLine(1, 2, nil, h-1, '║', true)
- PrintLine(w, 2, nil, h-1, '║', true)
- PrintLine(2, h, w - 1, nil, '═')
- PrintLine(25, 1, nil, nil, '╦')
- PrintLine(30, 1, nil, nil, '╦')
- PrintLine(39, 1, nil, nil, '╦')
- PrintLine(25, 2, nil, h-4, '║', true)
- PrintLine(30, 2, nil, h-4, '║', true)
- PrintLine(39, 2, nil, h-4, '║', true)
- PrintLine(2, h-(h-#text)+2, w - 1, nil, '═')
- PrintLine(1, h-(h-#text)+2, nil, nil, '╠')
- PrintLine(w, h-(h-#text)+2, nil, nil, '╣')
- PrintLine(25, h-(h-#text)+2, nil, nil, '╩')
- PrintLine(30, h-(h-#text)+2, nil, nil, '╩')
- PrintLine(39, h-(h-#text)+2, nil, nil, '╩')
- for i=1,#text do
- gpu.set(2,i+1,text[i])
- end
- return h-(h-#text)+2
- end
- local function micOnOff(n)
- for i, _ in pairs(c.list('microcontroller')) do
- if n then
- if c.proxy(i).isRunning() then
- c.proxy(i).stop()
- end
- else
- if not c.proxy(i).isRunning() then
- c.proxy(i).start()
- end
- end
- end
- end
- ------------------------------
- print('Очистить конфигурацию?')
- local t = event.pull(2,'key_down')
- if t then
- fl.remove("../etc/SteamTurbine.cnf")
- end
- tr = {}
- mass = {}
- sms = {'start system'}
- local n = frame()+1
- settingCmd = {2,n,48,16-n}
- os.sleep(1)
- readSetting()
- testComponent()
- n, t = 0, 0
- printCmd('Отключаю все источники')
- for i = 1,3 do
- red.setOutput(tr[#tr][i+1],255)
- end
- printCmd('запуск')
- --'0''основной','компьютера','аварийной'
- --tr[1] = {tr[1], water, boiler, chest}
- --tr[2] = {tr[2], 100, turbine, boiler}
- while true do
- infoSys(n)
- energyCheckBox2()
- if percent(box1.getEUCapacity(),box1.getEUStored()) <= 1 then
- red.setOutput(tr[#tr][2],255)
- printCmd('Отсечка энергии!')
- if c.proxy(tr[2][1]).getTankLevel(tr[2][4]) > 16000 then
- local i, pr = 0, 0
- printCmd('турбина активирована')
- micOnOff()
- else
- printCmd('нету пара. запуск печки')
- fire()
- printCmd('ждем генерации пара')
- os.sleep(10)
- end
- elseif red.getOutput(tr[3][2]) > 0 then
- red.setOutput(tr[3][2],0)
- elseif percent(box1.getEUCapacity(),box1.getEUStored()) > 95 or percent(c.proxy(tr[2][1]).getTankCapacity(tr[2][4]), c.proxy(tr[2][1]).getTankLevel(tr[2][4])) == 1 then
- micOnOff(true)
- elseif percent(box1.getEUCapacity(),box1.getEUStored()) < 80 and percent(c.proxy(tr[2][1]).getTankCapacity(tr[2][4]), c.proxy(tr[2][1]).getTankLevel(tr[2][4])) > 10 then
- micOnOff()
- elseif c.proxy(tr[2][1]).getTankLevel(tr[2][4]) < 16000 then
- fire()
- end
- n=n+1
- os.sleep(0.8)
- if n>30 then
- mass[#mass+1] = box1.getEUStored()
- if #mass >= 2 then
- if mass[1] == mass[2] then
- printCmd('система стабильна, ухожу в режим ожидания')
- energyCheckBox2()
- mass = {event.pull(60,'redstone_changed')}
- if mass[1] == nil then
- n, mass[1] ,mass[2] = 32, 1, 1
- t = t+1
- printCmd(t..' цикл сна')
- if t>5 and percent(c.proxy(tr[2][1]).getTankCapacity(tr[2][4]), c.proxy(tr[2][1]).getTankLevel(tr[2][4])) <= 40 then
- fire()
- t=0
- end
- else
- n, mass = 0, {}
- printCmd('режим ожидания offline')
- end
- else
- mass = {}
- end
- else
- n=0
- end
- end
- end
- --[[
- http://pastebin.com/A0EhA36t
- http://pastebin.com/CH3BQQ0z
- транспозер 1:
- контроль пара в генераторе
- контроль воды в генераторе
- накачка воды
- транспозер 2:
- накачка пара в турбину
- контроль турбины
- контроль пара в баке
- адаптер 1:
- контроль энергии
- контроллер кр.камня:
- управление питанием основной ветки
- управление питанием аварийной ветки
- управление питанием контроллирующей системы
- визуализация через очки:
- уровни:
- пар бойлера
- вода бойлера
- статус турбины
- пар в бочке
- объем энергии основной ветки
- объем энергии контролирующей
- статус веток
- ]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement