Advertisement
Asioron

Untitled

Mar 3rd, 2017
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.36 KB | None | 0 0
  1. local computer = require("computer")
  2. local c = require("component")
  3. local fl = require("filesystem")
  4. local event = require("event")
  5. local term = require("term")
  6. local unicode = require("unicode")
  7. local gpu = c.gpu
  8. local red = c.redstone
  9. local box1 = c.mfe
  10. local box2 = c.batbox
  11. --local mic = c.microcontroller
  12.  
  13. local function printCmd(text) --статус строка
  14. gpu.fill(settingCmd[1], settingCmd[2], settingCmd[3], settingCmd[4], ' ')
  15. if text ~= nil then
  16. sms[#sms+1] = text
  17. end
  18. while #sms>3 do
  19. table.remove(sms, 1)
  20. end
  21. for i = 1, #sms do
  22. if sms[i] ~= nil then
  23. gpu.set(2, settingCmd[2]-1+i, tostring(unicode.sub(sms[i], 1, 47)))
  24. end
  25. end
  26. os.sleep(0)
  27. end
  28.  
  29. local function iventorySize()
  30. for i=0,5 do
  31. if c.proxy(tr[1]).getInventorySize(i) and c.proxy(tr[1]).getInventorySize(i) >= 27 then
  32. printCmd('найден сундук')
  33. return true
  34. end
  35. end
  36. printCmd('сундук не найден')
  37. return false
  38. end
  39.  
  40. local function boilerSearch()
  41. for boiler = 0, 5 do --поиск котла
  42. if c.proxy(tr[1]).getFluidInTank(boiler).n == 2 then
  43. printCmd('сторона с котлом найдена '..boiler)
  44. for water = 0, 5 do --поиск воды
  45. if c.proxy(tr[1]).getTankLevel(water) == 1000 then
  46. printCmd('сторона с водой найдена '..water)
  47. for chest = 0, 5 do --поиск сундука с топливом
  48. if c.proxy(tr[1]).getInventorySize(chest) and c.proxy(tr[1]).getInventorySize(chest) >= 27 then
  49. printCmd('сторона с топливным сундуком найдена '..chest)
  50. tr[1] = {tr[1], water, boiler, chest}
  51. return true
  52. end
  53. end
  54. end
  55. end
  56. end
  57. end
  58. return false
  59. end
  60.  
  61. local function turbineSearch()
  62. for turbine = 0, 5 do --поиск турбины
  63. if c.proxy(tr[2]).getFluidInTank(turbine).n == 2 then
  64. printCmd('сторона с турбиной найдена '..turbine)
  65. for boiler = 0, 5 do --поиск резервуара
  66. if c.proxy(tr[2]).getTankCapacity(boiler) > 10000 then
  67. printCmd('сторона с резервуаром найдена '..boiler)
  68. tr[2] = {tr[2], 100, turbine, boiler}
  69. return true
  70. end
  71. end
  72. end
  73. end
  74. return false
  75. end
  76.  
  77. local function partySetting()
  78. printCmd('запуск настройки сторон транспозеров')
  79. for i, _ in pairs(c.list('transposer')) do
  80. tr[#tr+1] = i
  81. end
  82. if #tr == 1 then
  83. printCmd('ошибка! подключено мало транспозеров ('..#tr..')')
  84. printCmd('проверьте систему')
  85. os.exit()
  86. elseif #tr > 2 then
  87. printCmd('ошибка! подключено много транспозеров ('..#tr..')')
  88. printCmd('проверьте систему')
  89. os.exit()
  90. else
  91. printCmd('транспозеры подключены, начинаю анализ')
  92. end
  93. if not iventorySize() then
  94. local vr = tr[1]
  95. tr[1] = tr[2]
  96. tr[2] = vr
  97. end
  98. if not iventorySize() then
  99. printCmd('ОШИБКА! не вижу сундука, возможно вы забыли')
  100. printCmd('его поставить или нет доступа к привату')
  101. os.exit()
  102. end
  103. boilerSearch()
  104. turbineSearch()
  105. printCmd('настройка завершена')
  106. end
  107.  
  108. local function redstoneSetting()
  109. tr[#tr+1] = {'addres'}
  110. printCmd('настройка редстоун управления')
  111. printCmd('укажите стороны для управления (цифрами)')
  112. local text, vr, i={'??','основной веткой','веткой питания компьютера','аварийной веткой'}, {}, 2
  113. while i<#text+1 do
  114. printCmd('сторона управления '..text[i])
  115. printCmd('>>')
  116. term.setCursor(4,16-1)
  117. tr[#tr][i] = tonumber(io.read())
  118. printCmd("Активирую сторону "..tr[#tr][i]..". Проверьте все верно? (y/n)")
  119. printCmd('>>')
  120. term.setCursor(4,16-1)
  121. red.setOutput(tr[#tr][i],255)
  122. local t = io.read()
  123. if t == '' or t == 'y' then
  124. red.setOutput(tonumber(tr[#tr][i]),0)
  125. i=i+1
  126. else
  127. red.setOutput(tonumber(tr[#tr][i]),0)
  128. end
  129. end
  130. end
  131.  
  132. local function saveSetting()
  133. local file = io.open("../etc/SteamTurbine.cnf",'w')
  134. for i=1,#tr do
  135. for i1=1,#tr[i] do
  136. file:write(tostring(tr[i][i1])..'\n')
  137. end
  138. file:write('#####\n')
  139. end
  140. file:close()
  141. end
  142.  
  143. local function readSetting()
  144. local file = io.open("../etc/SteamTurbine.cnf",'r')
  145. if file then
  146. printCmd('загружаю сохранение')
  147. for i=1,3 do
  148. local t = file:read()
  149. tr[i] = {}
  150. i1=1
  151. while t ~= '#####' and t ~= nil do
  152. if i1==1 then
  153. tr[i][i1] = t
  154. else
  155. tr[i][i1] = tonumber(t)
  156. end
  157. i1=i1+1
  158. t = file:read()
  159. os.sleep(0)
  160. end
  161. end
  162. file:close()
  163. if #tr[1] < 4 then
  164. printCmd('ОШИБКА в сохранении.')
  165. printCmd('удаляю файл конфигурации.')
  166. printCmd('перезагрузите программу')
  167. fl.remove("../etc/SteamTurbine.cnf")
  168. os.exit()
  169. end
  170. printCmd('сохранение загружено')
  171. else
  172. printCmd('нету файла! создаю файл настройки')
  173. partySetting()
  174. redstoneSetting()
  175. saveSetting()
  176. end
  177. end
  178.  
  179. local function percent(max,per)
  180. return math.ceil((100*per)/max)
  181. end
  182.  
  183. local function energyCheckBox2()
  184. local time, pam = 0, 0
  185. if percent(box2.getEUCapacity(),box2.getEUStored()) <= 10 then
  186. printCmd('уровень энергии компьютера низкий')
  187. if box1.getEUStored() > 40000 then
  188. printCmd('подключаю зарядку от основного источника')
  189. red.setOutput(tr[#tr][3],0)--комп вкл
  190. pam = red.getOutput(tr[#tr][2])
  191. red.setOutput(tr[#tr][2],0)
  192. while box1.getEUStored() > 1500 and box2.getEUStored() < 40000 and time < 20 do
  193. time = time +1
  194. os.sleep(1)
  195. end
  196. red.setOutput(tr[#tr][3],255)
  197. red.setOutput(tr[#tr][2],pam)
  198. else
  199. printCmd('подключаю зарядку от аварийного источника')
  200. pam = red.getOutput(tr[#tr][2])
  201. red.setOutput(tr[#tr][2],255)--основная откл
  202. red.setOutput(tr[#tr][3],0)--комп вкл
  203. red.setOutput(tr[#tr][4],0)--аварийка вкл
  204. while box1.getEUStored() < 40000 and time < 10 do
  205. time = time +1
  206. os.sleep(1)
  207. end
  208. red.setOutput(tr[#tr][3],255)--комп выкл
  209. red.setOutput(tr[#tr][4],255)--аварийка выкл
  210. red.setOutput(tr[#tr][2],pam)
  211. end
  212. printCmd('Зарядка завершена.')
  213. printCmd('Уровень энергии компьютера ' ..percent(box2.getEUCapacity(),box2.getEUStored())..' %')
  214. end
  215. end
  216.  
  217. local function itemCol()
  218. local num = 0
  219. for i=3,6 do
  220. num = num + c.proxy(tr[1][1]).getSlotStackSize(tr[1][3],i)
  221. end
  222. return num
  223. end
  224.  
  225. local function fire()
  226. printCmd('накачка воды')
  227. 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
  228. c.proxy(tr[1][1]).transferFluid(tr[1][2],tr[1][3],1000)
  229. end
  230. printCmd('проверка пара')
  231. if c.proxy(tr[1][1]).getFluidInTank(tr[1][3])[2].amount > 0 then
  232. printCmd('температура есть')
  233. else
  234. printCmd('температуры нет')
  235. printCmd('проверка топлива')
  236. if itemCol()>0 then
  237. printCmd('топливо есть')
  238. else
  239. printCmd('топлива нет. загружаю')
  240. for i=1,c.proxy(tr[1][1]).getInventorySize(tr[1][4]) do
  241. if c.proxy(tr[1][1]).getSlotStackSize(tr[1][4],i)~= 0 then
  242. c.proxy(tr[1][1]).transferItem(tr[1][4],tr[1][3],64,i)
  243. end
  244. if itemCol() >= 250 then
  245. printCmd('топливо загружено')
  246. break
  247. end
  248. end
  249. end
  250. end
  251. end
  252.  
  253. local function infoSys(n)
  254. local info = {}
  255. info[#info+1] = {['pr'] = percent(box1.getEUCapacity(),box1.getEUStored())..'%', ['st'] = box1.getEUStored(), ['ca'] = box1.getEUCapacity()}
  256. info[#info+1] = {['pr'] = percent(box2.getEUCapacity(),box2.getEUStored())..'%', ['st'] = box2.getEUStored(), ['ca'] = box2.getEUCapacity()}
  257. info[#info+1] = {['pr'] = percent(computer.maxEnergy(), computer.energy())..'%', ['st'] = math.ceil(computer.energy()) , ['ca'] = computer.maxEnergy()}
  258. 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])}
  259. 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}
  260. 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}
  261. info[#info+1] = {['pr'] = percent(64*4, itemCol())..'%', ['st'] = itemCol(), ['ca'] = 64*4}
  262. info[#info+1] = {['pr'] = '', ['st'] = tostring(red.getOutput(tr[3][2])<200), ['ca'] = 'time:'}
  263. info[#info+1] = {['pr'] = '', ['st'] = tostring(red.getOutput(tr[3][3])<200), ['ca'] = ' '..tostring(n)}
  264. info[#info+1] = {['pr'] = '', ['st'] = tostring(red.getOutput(tr[3][4])<200), ['ca'] = ''}
  265.  
  266. for i=1,#info do
  267. gpu.set(26,i+1,(' '):rep(4))
  268. gpu.set(31,i+1,(' '):rep(8))
  269. gpu.set(40,i+1,(' '):rep(10))
  270. gpu.set(26,i+1,tostring(info[i].pr))
  271. gpu.set(31,i+1,tostring(info[i].st))
  272. gpu.set(40,i+1,tostring(info[i].ca))
  273. end
  274. end
  275.  
  276. local function infoTr()
  277. for i=1,3 do
  278. print('#####')
  279. for i1=1,#tr[i] do
  280. printCmd(tr[i][i1])
  281. end
  282. end
  283. end
  284.  
  285. local function testComponent()
  286. local vr, err = {}, false
  287. printCmd("тестирую транспозеры")
  288. for i, _ in pairs(c.list('transposer')) do
  289. vr[#vr+1] = i
  290. end
  291. repeat
  292. err = false
  293. for i=1,#tr do
  294. if vr[1]~= nil and vr[1] == tr[i][1] then
  295. table.remove(vr,1)
  296. err = true
  297. break
  298. end
  299. end
  300. until vr[1] == nil or err == false
  301. printCmd("тест завершен")
  302. if err then
  303. printCmd("все в норме")
  304. else
  305. printCmd("обнаружено несоответствие адресов. Перезагрузка файла конфигурации")
  306. fl.remove("../etc/SteamTurbine.cnf")
  307. readSetting()
  308. end
  309. end
  310.  
  311. local function PrintLine(x1, y1, x2, y2, sms, vertical, colorBr, colorLet) -- быстрая отрисовка рамок
  312. local vr = ''
  313. if not vertical then vertical = false end
  314. if not x2 then x2 = x1 end
  315. if not y2 then y2 = y1 end
  316. if not colorBr then gpu.setBackground(0x000000) else gpu.setBackground(colorBr) end
  317. if not colorLet then gpu.setForeground(0xffffff) else gpu.setForeground(colorLet) end
  318. if not vertical then -- если нарисовать горизонтальную строку
  319. vr = (sms):rep(x2 - x1 + 1)
  320. else -- если нарисовать вертикальную строку
  321. vr = (sms):rep(y2 - y1 + 1)
  322. end
  323. gpu.set(x1, y1, vr, vertical)
  324. gpu.setBackground(0x000000)
  325. gpu.setForeground(0xffffff)
  326. end
  327.  
  328. local function frame() -- рамка, а что ж еще
  329. local h, w = 16, 50
  330. local text = {'Энергия основной ветки', 'Энергия контрол. ветки', 'Энергия внутренняя', 'Пар в резервуаре', 'Уровень воды в котле', 'Уровень пара в котле', 'Количество топлива', 'Статус основной ветки', 'Статус контрол. ветки', 'Статус аварийной ветки'}
  331. term.clear()
  332. PrintLine(1, 1, nil, nil, '╔')
  333. PrintLine(w, 1, nil, nil, '╗')
  334. PrintLine(1, h, nil, nil, '╚')
  335. PrintLine(w, h, nil, nil, '╝')
  336. PrintLine(2, 1, w - 1, nil, '═')
  337. PrintLine(1, 2, nil, h-1, '║', true)
  338. PrintLine(w, 2, nil, h-1, '║', true)
  339. PrintLine(2, h, w - 1, nil, '═')
  340.  
  341. PrintLine(25, 1, nil, nil, '╦')
  342. PrintLine(30, 1, nil, nil, '╦')
  343. PrintLine(39, 1, nil, nil, '╦')
  344. PrintLine(25, 2, nil, h-4, '║', true)
  345. PrintLine(30, 2, nil, h-4, '║', true)
  346. PrintLine(39, 2, nil, h-4, '║', true)
  347. PrintLine(2, h-(h-#text)+2, w - 1, nil, '═')
  348. PrintLine(1, h-(h-#text)+2, nil, nil, '╠')
  349. PrintLine(w, h-(h-#text)+2, nil, nil, '╣')
  350. PrintLine(25, h-(h-#text)+2, nil, nil, '╩')
  351. PrintLine(30, h-(h-#text)+2, nil, nil, '╩')
  352. PrintLine(39, h-(h-#text)+2, nil, nil, '╩')
  353. for i=1,#text do
  354. gpu.set(2,i+1,text[i])
  355. end
  356. return h-(h-#text)+2
  357. end
  358.  
  359. local function micOnOff(n)
  360. for i, _ in pairs(c.list('microcontroller')) do
  361. if n then
  362. if c.proxy(i).isRunning() then
  363. c.proxy(i).stop()
  364. end
  365. else
  366. if not c.proxy(i).isRunning() then
  367. c.proxy(i).start()
  368. end
  369. end
  370. end
  371. end
  372.  
  373. ------------------------------
  374. print('Очистить конфигурацию?')
  375. local t = event.pull(2,'key_down')
  376. if t then
  377. fl.remove("../etc/SteamTurbine.cnf")
  378. end
  379.  
  380. tr = {}
  381. mass = {}
  382. sms = {'start system'}
  383. local n = frame()+1
  384. settingCmd = {2,n,48,16-n}
  385. os.sleep(1)
  386.  
  387. readSetting()
  388. testComponent()
  389. n, t = 0, 0
  390. printCmd('Отключаю все источники')
  391. for i = 1,3 do
  392. red.setOutput(tr[#tr][i+1],255)
  393. end
  394.  
  395. printCmd('запуск')
  396. --'0''основной','компьютера','аварийной'
  397. --tr[1] = {tr[1], water, boiler, chest}
  398. --tr[2] = {tr[2], 100, turbine, boiler}
  399. while true do
  400. infoSys(n)
  401. energyCheckBox2()
  402. if percent(box1.getEUCapacity(),box1.getEUStored()) <= 1 then
  403. red.setOutput(tr[#tr][2],255)
  404. printCmd('Отсечка энергии!')
  405. if c.proxy(tr[2][1]).getTankLevel(tr[2][4]) > 16000 then
  406. local i, pr = 0, 0
  407. printCmd('турбина активирована')
  408. micOnOff()
  409. else
  410. printCmd('нету пара. запуск печки')
  411. fire()
  412. printCmd('ждем генерации пара')
  413. os.sleep(10)
  414. end
  415. elseif red.getOutput(tr[3][2]) > 0 then
  416. red.setOutput(tr[3][2],0)
  417. 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
  418. micOnOff(true)
  419. 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
  420. micOnOff()
  421. elseif c.proxy(tr[2][1]).getTankLevel(tr[2][4]) < 16000 then
  422. fire()
  423. end
  424. n=n+1
  425. os.sleep(0.8)
  426.  
  427. if n>30 then
  428. mass[#mass+1] = box1.getEUStored()
  429. if #mass >= 2 then
  430. if mass[1] == mass[2] then
  431. printCmd('система стабильна, ухожу в режим ожидания')
  432. energyCheckBox2()
  433. mass = {event.pull(60,'redstone_changed')}
  434. if mass[1] == nil then
  435. n, mass[1] ,mass[2] = 32, 1, 1
  436. t = t+1
  437. printCmd(t..' цикл сна')
  438. 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
  439. fire()
  440. t=0
  441. end
  442. else
  443. n, mass = 0, {}
  444. printCmd('режим ожидания offline')
  445. end
  446. else
  447. mass = {}
  448. end
  449. else
  450. n=0
  451. end
  452. end
  453. end
  454.  
  455. --[[
  456. http://pastebin.com/A0EhA36t
  457. http://pastebin.com/CH3BQQ0z
  458. транспозер 1:
  459. контроль пара в генераторе
  460. контроль воды в генераторе
  461. накачка воды
  462.  
  463. транспозер 2:
  464. накачка пара в турбину
  465. контроль турбины
  466. контроль пара в баке
  467.  
  468. адаптер 1:
  469. контроль энергии
  470.  
  471. контроллер кр.камня:
  472. управление питанием основной ветки
  473. управление питанием аварийной ветки
  474. управление питанием контроллирующей системы
  475.  
  476. визуализация через очки:
  477. уровни:
  478. пар бойлера
  479. вода бойлера
  480. статус турбины
  481. пар в бочке
  482. объем энергии основной ветки
  483. объем энергии контролирующей
  484. статус веток
  485. ]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement