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

Обработка сигналов во время sleep в EEPROM

Вопрос

Всем привет, есть один вопрос и код:

gpu = component.proxy(component.list("gpu")())
modem = component.proxy(component.list("modem")())
red = component.proxy(component.list("redstone")())
screen = component.proxy(component.list("screen")())

modem.open(1)
modem.setWakeMessage("start")

users = {
	"BrightYC" 
}

if gpu.getScreen() == nil then
	gpu.bind(screen.address)
end
gpu.setBackground(0xffffff)
gpu.setForeground(0x4c4c4c)
gpu.setResolution(8, 4)
gpu.fill(1, 1, 8, 4, " ")
gpu.set(1, 2, "Press Me")

function sleep(timeout)
    checkArg(1, timeout, "number", "nil")
    local deadline = computer.uptime() + (timeout or 0)
    repeat
        computer.pullSignal(deadline - computer.uptime())
    until computer.uptime() >= deadline
end

function open()
	red.setOutput(4, 15)
	gpu.set(1, 2, "  Yay!  ")
	sleep(1.5)
	red.setOutput(4, 0)
	gpu.set(1, 2, "Press Me")
end

function getout()
	gpu.set(1, 2, "GET OUT!")
	sleep(1.5)
    gpu.set(1, 2, "Press Me")
end
	
function returnuser()
	for _, player in pairs(users) do 
		if player == info then
			return player
		end
	end
end

while true do 
	evt, _, _, _, _, info = computer.pullSignal()
	if evt == "touch" and info == returnuser() or evt == "modem_message" and info == "open" then 
		open()
	elseif evt == "touch" and info ~= returnuser() then
		getout()
	elseif evt == "modem_message" and info == "ping" then
		modem.broadcast(1, "pong")
	end
end

(Как-то странно тут код отображается) Простой замок срабатывающий на нажатие, на eeprom'е. Хочу узнавать его статус, но есть проблема. Во время вызова функции open() или getout() разумеется обработка ивентов прекращается на 1.5 секунды, но если я в это время хочу получить запрос на пинг? Как решить эту проблему? (Не предлагать использовать OpenOS) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

2 часа назад, BrightYC сказал:

каким же образом сделать аналог слушателя на биосе.


local function myYobaPullSignal(...)
	evt, _, _, _, _, info = computer.pullSignal(...)
	if evt == "touch" and info == returnuser() or evt == "modem_message" and info == "open" then 
		open()
	elseif evt == "touch" and info ~= returnuser() then
		getout()
	elseif evt == "modem_message" and info == "ping" then
		modem.broadcast(1, "pong")
	end
end

...

local function sleep(timeout)
	local deadline = computer.uptime() + (timeout or 0)
	repeat
		myYobaPullSignal(deadline - computer.uptime())
	until computer.uptime() >= deadline
end

...

while true do 
	myYobaPullSignal()
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 минуту назад, ECS сказал:


local function myYobaPullSignal(...)
	evt, _, _, _, _, info = computer.pullSignal(...)
	if evt == "touch" and info == returnuser() or evt == "modem_message" and info == "open" then 
		open()
	elseif evt == "touch" and info ~= returnuser() then
		getout()
	elseif evt == "modem_message" and info == "ping" then
		modem.broadcast(1, "pong")
	end
end

...

local function sleep(timeout)
	local deadline = computer.uptime() + (timeout or 0)
	repeat
		myYobaPullSignal(deadline - computer.uptime())
	until computer.uptime() >= deadline
end

...

while true do 
	myYobaPullSignal()
end

 

Спасиб, я уже догадался, но тем не менее ещё раз спасибо. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...