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

Ошибка через время

Вопрос

Дисклеймер: я - лютый новичок и с прогами на Lua знаком 1 день, да и в остальных языках не шарю почти никак. Не бейте)
Хочу сделать защищённую дверь из OpenSecurity на контроллере дверей оттуда же, открывающуюся при помощи RFID-карты.
C записью карт проблем не возникло, а вот простенькая читалка, которую я намастрячил, хоть и срабатывает, но потом через небольшое время крашится. Вот её код
 

local component = require("component")
local door = component.os_door
local rfid = component.os_rfidreader

local password = "1qf4suio8"
  
while true do
  local scan = rfid.scan()[1]
  if scan and scan.data == password and scan.range <= 3 then
  door.open()
  else
  door.close()
  end
end


Ошибку выдаёт следующего толка:

 

/home/simplesearch:8: attempt to index a boolean value:
stack traceback:
		/home/simplesearch:8: in main chunk
        (...tail calls...)
        [C]: in function 'xpcall'
        machine:798: in fucntion 'xpcall'
        /lib/process.lua:63: in function </lib/process.lua:59>

Т.е., я так понял, ему не нравится чем-то 8 строчка. Причём не сразу не нравится, а ровно через минуту, в течение которой программа функционирует полностью штатно.

P.S. я знаю, что переменную пароля можно задавать через select и io.read, задача пока сделать абсолютно минимальный рабочий вариант.

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


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

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

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

rfid.scan()

В некоторый момент не таблица, а boolean. Почему - не знаю, видимо, ты не учел какой-то функционал считывателя, типо, scan возвращает false, когда в него не вставлена карта. Попробуй прочитать документацию к нему внимательней. Попробуй ловить событие появления карты в считывателе или чекать что это таблица

local component = require("component")
local door = component.os_door
local rfid = component.os_rfidreader

local password = "1qf4suio8"
  
while true do
  local scan = rfid.scan()
  if type(scan)=="table" then
    local scan = scan[1]
    if scan and scan.data == password and scan.range <= 3 then
      door.open()
    else
      door.close()
    end
  end
end

 

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


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, Nova_Novator сказал:

Дисклеймер: я - лютый новичок и с прогами на Lua знаком 1 день, да и в остальных языках не шарю почти никак. Не бейте)
Хочу сделать защищённую дверь из OpenSecurity на контроллере дверей оттуда же, открывающуюся при помощи RFID-карты.
C записью карт проблем не возникло, а вот простенькая читалка, которую я намастрячил, хоть и срабатывает, но потом через небольшое время крашится. Вот её код
 


local component = require("component")
local door = component.os_door
local rfid = component.os_rfidreader

local password = "1qf4suio8"
  
while true do
  local scan = rfid.scan()[1]
  if scan and scan.data == password and scan.range <= 3 then
  door.open()
  else
  door.close()
  end
end


Ошибку выдаёт следующего толка:

 


/home/simplesearch:8: attempt to index a boolean value:
stack traceback:
		/home/simplesearch:8: in main chunk
        (...tail calls...)
        [C]: in function 'xpcall'
        machine:798: in fucntion 'xpcall'
        /lib/process.lua:63: in function </lib/process.lua:59>

Т.е., я так понял, ему не нравится чем-то 8 строчка. Причём не сразу не нравится, а ровно через минуту, в течение которой программа функционирует полностью штатно.

P.S. я знаю, что переменную пароля можно задавать через select и io.read, задача пока сделать абсолютно минимальный рабочий вариант.

Немного странно, учитывая что проверяя rfid.scan()[1] у тебя либо nil должно быть, либо таблица.

В общем вот рабочий вариант, проверил.

local component = require("component")
local door = component.os_door
local rfid = component.os_rfidreader

local password = "1234"
local maxRange = 3

while true do
	local rfids = rfid.scan()

	if #rfids > 0 then
		for i = 1, #rfids do 
			if rfids[i].range <= maxRange and rfids[i].data == password then
				door.open()
				os.sleep(3)
				door.close()
				break
			end
		end
		os.sleep(5)
	end

	os.sleep(0)
end

 

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


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

@BrightYC @hohserg Спасибо, товарищи!

Учти, что просто обращаясь по rfid.scan()[1] ты обращаешься только по 1 RFID карте. А их может быть несколько. Поэтому мой вариант лучше, советую использовать цикл for i

 

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


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

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

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

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

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

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

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

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

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


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