Перейти к публикации
Форум - ComputerCraft
  • 0
BrightYC

Обработка сигналов во время 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) 

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


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

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

  • 0
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

 

  • Like 2

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


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

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

 

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


Ссылка на сообщение
Поделиться на других сайтах
  • 0
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

 

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×