Перейти к содержимому

Koteyk0o

Пользователи
  • Публикации

    53
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Сообщения, опубликованные пользователем Koteyk0o


  1. Так я все таки не понял. Функция должна выполняться один раз или в цикле? Если один раз, то зачем ее в цикл ставить?

    Вся функция должна выполняться в цикле, но в функции есть команда, которая выполняется один раз, помимо другого

    То-есть вот так примерно

    local function kek()
    print('Привет') -- print надо выполнить один раз
    if rs.getBundledInput(1,1) > 0 then
    rs.setBundledOutput(1,5,255)
    else
    rs.setBundledOutput(1,5,0)
    end
    end
    
    while true do
    kek()
    os.sleep(0.5)
    end

  2. Почему же? Сколько раз выполнится функция в цикле, столько же раз выполнится и print

    я неправильно написал, как раз таки да, сколько выполнится функция, столько выполнится и print

    а мне надо чтобы Print выполнился только один раз, хоть и функция в цикле

    По идее надо сделать переменную, и если print выполняется один раз, то записываем это в переменную, и print больше не выполняется

    Или можно сделать как-то еще?


  3. То-есть допустим есть цикл, есть функция

    В функции есть команда print('Привет')

    Функция находится в цикле, ибо там обновляется информация

    Но в функции команда print('Привет') выполняется только один раз, хоть и функция в цикле


  4. Это я знаю, да

    Но так как страница находится в цикле, если поместить в код страницы term.clear() допустим, то страница будет постоянно очищаться, то-есть мигать


  5. Спасибо, а как очистить экран один раз после переключения страницы?

    То-есть убрать старую инфу с экрана

    А то бывает что символы после переключения накладываются 


  6. Наверное это глупая тема, но все же.
    Допустим у меня есть несколько страниц в дисплее с информацией и графикой.
    Как очистить один раз экран в цикле?
    И когда осуществляется переход между страницами дисплея, надо его чистить.
    Но при этом, на некоторых страницах есть информация, которая обновляется в реал тайме.
    И как сделать переход между страницами, не останавливая выполнение программы? Ну то-есть не используя os.sleep, чтобы информация на экранах могла обновляться, но и при этом был переход между страницами.

    local component = require("component")
    local term = require("term")
    local gpu = component.gpu 
    local computer = require('computer')
    local rs = component.redstone
    
    local green = 0x04ff00 -- зеленый цвет
    local red = 0xff0000 -- красный цвет
    local gray = 0x262525 -- серый цвет
    local white = 0xffffff -- белый цвет
    local yellow = 0xfaff00 -- желтый
    local purple = 0xc300ff -- фиолетовый
    local black = 0x000000 -- черный
    local blue = 0x000cff -- синий
    
    gpu.setBackground(black)
    
    local function getAllSpecificComponets(filter)
    local tableObjects ={}
    for address, componentType in component.list(filter) do 
    table.insert(tableObjects, component.proxy(address))
    end
    return tableObjects
    end
    
    local function mfsu() -- первая страница информации
    gpu.setResolution(4,3)
    gpu.setForeground(white)
    gpu.set(1,1,'MFSU')
    myMFSU = getAllSpecificComponets('mfsu')
    gpu.set(1,3,tostring(math.floor(myMFSU[6].getStored()*100/40000000))..' %')
    end
    
    local function clocks() -- вторая страница информации
    gpu.setResolution(5,3)
    gpu.setForeground(white)
    gpu.set(2,1,'TIME')
    myMFSU = getAllSpecificComponets('mfsu')
    gpu.set(1,3,os.date('%H:%M'))
    end
    
    while true do
    mfsu()
    -- Как вот тут сделать переход между страницами, не прерывая обновление информации?
    clocks()
    end
    

  7.  

    по идее как-то так

    string.gmatch(s, pattern)
    ​s:gmatch(pattern)

    то есть есть стринги какие-то, которые летят из чата, а комп их в цикле принимает 

    local e, adr, ...,  msg = event.pull("chat_command")
    

    и обрабатывает строку msg

     

     

    Попробуй так:

    local function split(str)
      local data = {}
      for word in str:gmatch("%a+") do 
        table.insert(data, word) 
      end
      return data
    end
    
    words = split('Hello Bob')
    print(words[1])  --> Hello
    print(words[2])  --> Bob
    

    Спасибо большое, все работает

    И как раз понял как это все работает :)


  8. чатбокс юзера в вайт-лист сам по себе не добавит. Нужен, видимо, еще и комблок какой-нибудь к компу прикрутить. То есть, этой системой должен обладать админ какой-то. Но зачем тогда этот компутронис, если админ может просто набрать /whitelist add nick

     

    Ну а так-то,  сообщения из чата  нужно просто распарсить на слова отдельные и проверить: если первое слово == adduser, то проверим, есть ли второе слово, и если есть, то это и есть ник.

    Да, забыл написать, есть компик с прогой, прога чекает чат чатбоксом

    А как разобрать сообщение на отдельные слова и проверить ник? В инете не нашел инфы

    И забыл написать, вайт-лист в проге, не на сервере

    То-есть список тех игроков, на сообщения которых чатбокс будет реагировать 


  9. В общем есть чат бокс из Computronics

    И надо сделать добавление юзера в вайт-лист командой из чата

    допустим $$adduser НИК

    Как считать ник?

     

    Допустим отправляем в чат $$adduser Koteyk0o и получаем сообщение "$$adduser Koteyk0o"

    Как из этого сообщения считать ник?


  10. после else  в строчках 173 и 182 добавь gpu.setForeground(red)

    А вообще, зачем столько лишних символов? Код можно в трое сократить

    Даа, точно, после else забыл про gpu.setForeground(red)

    Жесть, целый час искал проблему, не мог понять в чем косяк

    Да, код попробую сократить

    Огромное спасибо

     

    a еще лучше назначить каждой иконке координаты и значение в таблице, чтобы не путаться

    Да, спасибо, поправлю код


  11. Сделал небольшую хрень для визуализации питания систем дома
    Но есть проблема с 3 последними стрелками 

    Именно почему-то последние 3 стрелки тупят, со всем остальным норм
    Мне кажется это потому, что возможно я неправильно использую gpu.setForeground
    Проблема находится на строчках 157-185
    При активации стрелки на строчке 157, активируются все стрелки которые находятся ниже, то-есть 169,178 строчки
    С остальными стрелками все нормально, они загораются как надо
     

    Буду очень благодарен за помощь

     

    Код говнокод проги

     

     

    local component = require("component")
    local term = require("term")
    local gpu = component.gpu 
    local rs = component.redstone
    
    namecolor = 0xffffff -- цвет названия программы
    fontcolor = 0x77f3f9 -- цвет названия систем
    green = 0x04ff00 -- зеленый цвет
    red = 0xff0000 -- красный цвет
    gray = 0x636363 -- серый цвет
    white = 0xffffff -- белый цвет
    timing = 0.5 -- задержка обновления информации (в секундах)
    
    gpu.setResolution(60,20)
    gpu.setBackground(0x000000)
    rs.setBundledOutput(3,4,255) -- ПОСЛЕ НАСТРОЙКИ УБРАТЬ ЭТОТ МУСОР
    rs.setBundledOutput(3,3,255) -- И ЭТО ДЕРЬМО ТОЖЕ НАХЕР
    term.clear()
    -- Выводим название проги на экран
    gpu.setForeground(namecolor)
    gpu.set(20,1,'ENERGY SUPPLY MONITOR')
    
    -- Выводим названия систем
    gpu.setForeground(fontcolor)
    gpu.set(19,6,'HV Solar Panel Supply')
    gpu.set(2,11,'Primary---MFSU---System')
    gpu.set(37,11,'Secondary-MFSU-System')
    gpu.set(37,15,'Computers / AE Supply')
    gpu.set(1,15,'Tools')
    gpu.set(8,15,'User1')
    gpu.set(16,15,'User2')
    gpu.set(24,15,'AE Tools')
    -- рисуем одну одинокую полосочку
    gpu.setForeground(gray)
    gpu.set(27,11,'─')
    gpu.set(28,11,'─')
    gpu.set(29,11,'─')
    gpu.set(30,11,'─')
    gpu.set(31,11,'─')
    gpu.set(32,11,'─')
    gpu.set(33,11,'─')
    gpu.set(34,11,'─')
    
    while true do -- Цикл рисования хлама
    os.sleep(timing)
    
    -- Отображение отключенных систем
    if rs.getBundledInput(3,13) > 0 then -- Питание комнаты приборов отключено
    gpu.setForeground(white)
    gpu.set(1,20,'Tools OFF')
    else
    gpu.setForeground(white)
    gpu.set(1,20,'         ')
    end
    
    if rs.getBundledInput(3,14) > 0 then -- Питание комнаты User1 отключено
    gpu.setForeground(white)
    gpu.set(15,20,'User1 OFF')
    else
    gpu.setForeground(white)
    gpu.set(15,20,'         ')
    end
    
    if rs.getBundledInput(3,15) > 0 then -- Питание комнаты User1 отключено
    gpu.setForeground(white)
    gpu.set(29,20,'User2 OFF')
    else
    gpu.setForeground(white)
    gpu.set(29,20,'         ')
    end
    
    if rs.getBundledInput(3,12) > 0 then -- Питание приборов МЭ системы отключено
    gpu.setForeground(white)
    gpu.set(43,20,'AE Tools OFF')
    else
    gpu.setForeground(white)
    gpu.set(43,20,'            ')
    end
    
    -- Отображение стрелок
    if rs.getBundledInput(3,0) > 0 then -- стрелка подачи питания на компы и мэ
    gpu.setForeground(green)
    gpu.set(47,12,'│')
    gpu.set(47,13,'│')
    gpu.set(47,14,'▼')
    else
    gpu.setForeground(red)
    gpu.set(47,12,'│')
    gpu.set(47,13,'│')
    gpu.set(47,14,'▼')
    end
    
    if rs.getBundledInput(3,2) > 0 then -- стрелка зарядки вторичной МФСУ системы от солнечных панелей
    gpu.setForeground(green)
    gpu.set(39,7,'│')
    gpu.set(39,8,'│')
    gpu.set(39,9,'│')
    gpu.set(39,10,'▼')
    else
    gpu.setForeground(red)
    gpu.set(39,7,'│')
    gpu.set(39,8,'│')
    gpu.set(39,9,'│')
    gpu.set(39,10,'▼')
    end
    
    if rs.getBundledInput(3,6) > 0 then -- стрелка подзарядки основной МФСУ системы от солнечных панелей
    gpu.setForeground(green)
    gpu.set(19,7,'│')
    gpu.set(19,8,'│')
    gpu.set(19,9,'│')
    gpu.set(19,10,'▼')
    else
    gpu.setForeground(red)
    gpu.set(19,7,'│')
    gpu.set(19,8,'│')
    gpu.set(19,9,'│')
    gpu.set(19,10,'▼')
    end
    
    if rs.getBundledInput(3,7) > 0 then -- стрелка питания комнаты с приборами
    gpu.setForeground(green)
    gpu.set(3,12,'│')
    gpu.set(3,13,'│')
    gpu.set(3,14,'▼')
    else
    gpu.setForeground(red)
    gpu.set(3,12,'│')
    gpu.set(3,13,'│')
    gpu.set(3,14,'▼')
    end
    
    if rs.getBundledInput(3,8) > 0 then -- стрелка питания комнаты user 1
    gpu.setForeground(green)
    gpu.set(10,12,'│')
    gpu.set(10,13,'│')
    gpu.set(10,14,'▼')
    else
    gpu.setForeground(red)
    gpu.set(10,12,'│')
    gpu.set(10,13,'│')
    gpu.set(10,14,'▼')
    end
    
    if rs.getBundledInput(3,9) > 0 then -- стрелка питания комнаты user 2
    gpu.setForeground(green)
    gpu.set(18,12,'│')
    gpu.set(18,13,'│')
    gpu.set(18,14,'▼')
    else
    gpu.setForeground(red)
    gpu.set(18,12,'│')
    gpu.set(18,13,'│')
    gpu.set(18,14,'▼')
    end
    
    if rs.getBundledInput(3,10) > 0 then -- стрелка питания приборов МЭ системы
    gpu.setForeground(green)
    gpu.set(24,12,'│')
    gpu.set(24,13,'│')
    gpu.set(24,14,'▼')
    else
    gpu.setForeground(red)
    gpu.set(24,12,'│')
    gpu.set(24,13,'│')
    gpu.set(24,14,'▼')
    end
    
    if rs.getBundledInput(3,1) > 0 then -- стрелка подзарядки первичной системы от вторичной
    gpu.setForeground(green)
    gpu.set(26,11,'─')
    gpu.set(25,11,'◄')
    else
    gpu.set(26,11,'─')
    gpu.set(25,11,'◄')
    end
    
    if rs.getBundledInput(3,5) > 0 then -- стрелка подзарядки вторичной системы от первичной
    gpu.setForeground(green)
    gpu.set(35,11,'─')
    gpu.set(36,11,'►')
    else
    gpu.set(35,11,'─')
    gpu.set(36,11,'►')
    end
    
    end
     

     

     

     

    Работает нормально, загорается одна стрелочка, как и надо

     

    c77814569d383781851dcac74b303a0e.png

     

     

    А вот тут косяк, должна гореть одна нижняя стрелочка, горят все три сразу

     

    a20b874befc6ac4b9ada38a40b794999.png

     


  12. И слипы тут использовать уже нельзя иначе событие от модема может быть пропущено. Таймаут должен задаваться первым параметром функции pull.

    Т.е. алгоритм должен быть где то таким:

    while true do
      Ждем событие от модема в течение времени 0.5 сек
      Если пришло "LampON", blink = true
      Если пришло "LampOFF", blink = false
      Если blink == true             -- настоящие программеры пишут просто blink --
         изменяем состояние лампы    -- именно изменяем, а не включаем, ждем, выключаем и снова ждем --
      иначе выключаем лампу
    end
    

    А можно использовать слушателя или многопоточность, но это на крайний случай.

    Спасибо, понял

    Получается когда лампа мигает с помощью слипов, и приходит событие от модема, то оно просто пропускается из-за сна системы

    Спасибо большое за помощь


  13. Ты меня не слушаешь.

    blink - это не эвент. Это переменная с флагом. Она сохраняет своё состояние. Пока в переменной находится значение true - лампа будет мигать.

    Потому что главный цикл повторяется снова и снова.

    А чтобы главный цикл повторялся без задержек - тебе надо модифицировать вызов event.pull() и добавить туда ограничение на время.

    Тогда функция будет ждать эвентов пару десятых секунды, затем завершаться, потом будет мигать лампа (один раз), потом снова будет пара десятых секунды ожидания эвентов - а потом снова одно мигание. И так пока ты не сменишь значение флага.

    Что blink это не эвент а переменная это я понял, просто не так выразился

    Я имел ввиду то, что когда эвент blinkOFF, то переменной blink присваивается значение false

     

    добавил в event.pull таймаут 0.5 секунд, но все равно комп отказывается видеть команду на выключение, и из-за этого не присваивает переменной blink значение false, и мигание просто не отключается

    чувствую себя тупым(((

    local component = require("component")
    local event = require("event")
    local m = component.modem 
    local rs = component.redstone
     
    m.open(27) -- открываем порт 
     
    rs.setBundledOutput(4,0,0) -- вырубаем все сигналы
    rs.setBundledOutput(4,3,0)
    rs.setBundledOutput(4,9,0)
    rs.setBundledOutput(4,15,0)
    rs.setBundledOutput(4,1,0)
    rs.setBundledOutput(4,4,0)
    rs.setBundledOutput(4,14,0)
    rs.setBundledOutput(4,6,0)
    os.sleep(0.2)
    m.broadcast(80,'Компьютер загружен') -- сообщаем главному компьютеру о загрузке
     
    while true do
    local _, _, from, port, _, message = event.pull(0.5,modem_message)
    print('message= ',message)
     
    if message == 'LampON' then -- значение переменной 1
    local blink = true
    end
     
    if message == 'LampOFF' then -- значение переменной 0
    local blink = false
    end
     
    if blink == true then -- если переменная больше нуля, то мигаем
    rs.setBundledOutput(4,4,255)
    os.sleep(0.4)
    rs.setBundledOutput(4,4,0)
    os.sleep(0.3)
    end
     
    end
    

  14. Нет. У тебя же есть флаг, который отвечает за то, что хранит инфу о том, надо мигать или нет.

    Тут можно даже использовать логическое значение: local blink = false.

    Когда получаешь соообщение на включение - переключаешь флаг на true.

     

    А дальше главный цикл начинает выглядеть так (условно):

     

    * проверили эвенты

    * если эвент на включение - blink = true

    * если эвент на выключение - blink = false

    * if blink then  мигаем один раз  end

    В таком случае лампа мигает один раз, и на этом все

    А необходимо сделать так, что когда blink = true лампа мигает бесконечное кол-во раз, пока не будет эвента на выключение, то-есть blink = false


  15. А чтобы лампа мигала постоянно, предлагаю снизить время ожидания эвентов в том случае, если выполняется условие мигания. Тогда программа будет проверять эвенты, мигать, потом снова проверять эвенты, потом снова мигать.

    Спасибо за разъяснение, но как я понимаю она будет мигать тогда, когда будет команда на включение

    И выходит придется постоянно подавать команду на включение?


  16. В общем когда в комп по сети отправлена команда "LampON", то он должен мигать лампой которая подключена к нему бандлед кабелем.

    Команда принимается, все ок, но это нельзя выключить

    когда подается команда "LampOFF" компьютер на нее не реагирует, пока не убьешь цикл мигания

    В чем косяк?

    Подскажите пожалуйста, какая у меня ошибка в моем коде  говнокоде))

    local component = require("component")
    local event = require("event")
    local m = component.modem 
    local rs = component.redstone
    
    m.open(27) -- открываем порт 
    
    rs.setBundledOutput(4,0,0) -- вырубаем все сигналы
    rs.setBundledOutput(4,3,0)
    rs.setBundledOutput(4,9,0)
    rs.setBundledOutput(4,15,0)
    rs.setBundledOutput(4,1,0)
    rs.setBundledOutput(4,4,0)
    rs.setBundledOutput(4,14,0)
    rs.setBundledOutput(4,6,0)
    os.sleep(0.2)
    m.broadcast(80,'Компьютер загружен') -- сообщаем главному компьютеру о загрузке
    
    while true do
    local _, _, from, port, _, message = event.pull("modem_message")
    print("Got a message from " .. from .. " on port " .. port .. ": " .. tostring(message))
    
    if message == 'LampON' then -- значение переменной 1
    lampstatus = 1
    end
    
    if message == 'LampOFF' then -- значение переменной 0
    lampstatus = 0
    end
    
    while lampstatus > 0 do -- если переменная больше нуля, то мигаем
    rs.setBundledOutput(4,4,255)
    os.sleep(0.4)
    rs.setBundledOutput(4,4,0)
    os.sleep(0.3)
    end
    
    end
    

  17. Можно ловить событие redstone_changed. Но оно не работает с цветными кабелями.

    Спасибо большое, этого в принципе хватило

    Если сигнал изменился -> какой сигнал изменился -> если тот сигнал который нам надо -> выполняем то что задано


  18. И еще вопрос, есть обычная физическая кнопка, она подключена допустим к красному проводу в шине.

    Когда ее нажимаю, должно написать button pressed.

    Но ничего не происходит.

    Что не так?

    local component = require("component")
    local rs = component.redstone
    
    while true do
    if rs.getBundledInput(left,red) > 0 then
    print("BUTTON PRESSED")
    end
    end
    
    

  19. Всем привет

    В общем есть прога, она установлена на главном компе, и чекает все сообщения в сети на 3333 порту

    И есть второй комп, который при нажатии на кнопку отправляет в сеть сообщение с цифрой нажатой кнопки (То-есть пятая кнопка это сообщение в виде "5555")

    То-есть на кнопку нажал, сообщение отправилось, главный комп сообщение принял, включил определенный редстоун сигнал, и выключил его

    У меня такого не происходит, пока не нажмешь какую нибудь другую кнопку на втором компе

     

    И как можно реализовать вкл/выкл одной кнопкой?

    То-есть пришло сообщение, сигнал включился, пришло сообщение еще раз - выключился

     

    И еще вопрос, как помигать лампочкой через редстоун адаптер?

    То-есть допустим 1 секунду горит, 1 секунду не горит. и так бесконечно пока не прекратишь этот цикл

    На ардуинке все просто, там через delay можно сделать)) или millis, а тут не особо врубаюсь как это сделать

     

    Сорян за такие тупые вопросы, но только начал осваивать Lua((

    local component = require("component")
    local event = require("event")
    local m = component.modem 
    local rs = component.redstone
    local sides = require("sides")
    local colors = require("colors")
    
    m.open(3333)
    print(m.isOpen(3333))
    
    while true do
    local _, _, from, port, _, message = event.pull("modem_message")
    print("Got a message from " .. from .. " on port " .. port .. ": " .. tostring(message))
    
     if message == 5555 then
    rs.setBundledOutput(5,11,255)
    print("button5")
    end
     if message == 1111 then
    print("button1")
    end
     if message == 2222 then
    print("button2")
    end
     if message == 3333 then
    print("button3")
    end
     if message == 4444 then
    print("button4")
    end
    end
    
×
×
  • Создать...