Jump to content

Recommended Posts

Довольно тупой вопрос.

Есть несколько магридеров с разными ивентами(именами ивентов). Каждый ивент обрабатывается правильно, но как запустить проверку сразу несколько ивентов? 

Общая задача:

Есть несколько дверей, у каждой свой magreader, при активации определённого открывается дверь.

Пример:

_,_,pName1,data1 = event.pull("magData1")

_,_,pName2,data2 = event.pull("magData2")

_,_,pName3,data3 = event.pull("magData3")

if pName1==data1 then 

os.door.open("pass")

end

if pName2==data2 then

os.door.open("pass")

end

if pName3==data3 then

os.door.open("pass")

end

Share this post


Link to post
eventName, _, pName, data = event.pull("magData1", "magData2", "magData3")

 

Share this post


Link to post

Обработку ивентов понял, а как связать каждый magreader с doorcontroller? Ибо открывает рандомную дверь. Может как то можно обращаться по адресам? Да и перенастраивать каждый раз вручную имена  ивентов reader'ов геморно.

17 часов назад, Scrag13 сказал:
eventName, _, pName, data = event.pull("magData1", "magData2", "magData3")

 

 

Edited by AlexApProd
Поправка

Share this post


Link to post
4 часа назад, AlexApProd сказал:

Может как то можно обращаться по адресам?

doorComponent = component.proxy(doorAddr)

Или прямой вызов:

component.invoke("адрес", "метод", параметры)

Вот так можно получить все прокси компонентов с определённым именем:
 

local doors = { }
for addr in component.list("имя компонента") do
  doors[addr] = component.proxy(addr)
end
4 часа назад, AlexApProd сказал:

а как связать каждый magreader с doorcontroller

Как-то так. Связываем адрес MagReader с компонентом контроллера двери:

-- таблица соответствия MagReader'ов и контроллеров дверей
-- адрес может быть сокращён, получить можно кликнув анализатором по блоку

local readerToDoor = {
  ["адрес magreader 1"] = "адрес контроллера двери 1",
  ["адрес magreader 2"] = "адрес контроллера двери 2"
}

-- в этой таблице храним прокси контроллеров дверей; ключ - адрес MagReader'а
local doors = { }

-- заполняем таблицу doors
for readerAddr, doorAddr in pairs(readerToDoor) do
  local readerAddrFull = component.get(readerAddr)
  if readerAddrFull then
    local doorAddrFull = component.get(doorAddr)
    if doorAddrFull then
      doors[readerAddrFull] = component.proxy(doorAddrFull)
    else
       print("не найден Door Controller: ", doorAddr)
    end
  else
    print("не найден Mag Reader: ", readerAddr)
  end
end

-- в обработчике события:
-- по адресу magreader получаем соответствующий контроллер
local door = doors[readerAddr]

Код не запускал. Возможны ошибки. Но идея надеюсь понятна.

Edited by Scrag13

Share this post


Link to post

Вот что получилось по итогу. Ваш способ связки работал, но связывали случайные magreader и doorcontroller, пришлось вручную вносить. Один сервер(плата) тянет без проблем,пришлось только компонентную плату вставить, но это мелочи.Если есть какие то нарекания , выслушаю и исправлю.

Скрытый текст

local event = require("event")
local component = require("component")
local pass = "password"
local off = true
local master = "MasterKey"
local wait = 2000
local i = 0
local c = 0
local k = 8
 
local doors = {
 "9ef75fe3-20c8-4bd3-8fb0-42b6002762f0",
 "aca1f68a-2527-4d29-be5f-d873ab247fa5",
 "3ac6844a-babd-4461-a0bc-d4c6bb80dc44",
 "4b821dd1-b956-4252-b0da-6ee8c3f91403",
 "52be3fbe-5c22-40d7-8827-6fa5f0e5d29b",
 "308bb094-36de-4b6a-9580-bfcf1fd996e1",
 "0e61f90e-8882-4530-8c19-6031d6eb347e",
 "f89d08d6-6ad6-4b8e-86b7-f8fbf5bb2695"
}
 
local reader = {
 "00b4d264-a022-4cb6-b51f-d75baa693ef3",
 "6549e4c7-8491-4d5a-aa12-360f9e4904c8",
 "0e7634ec-9420-4e45-8be9-8841ea54a5fa",
 "dcbec41e-7855-46e3-a433-40e40179469d",
 "242224b3-f525-44f4-b175-959d214c092e",
 "3c66955c-d647-465f-81e6-4c04f929a638",
 "cad08827-cd3f-48a3-8ae9-9c56b1efbee6",
 "32e8c885-33ab-4102-96dd-31351de96761"
}
 
local name = {
 "Applied Energetics серверная ",
 "Энергохранилище",
 "Переработка руд",
 "Open Computers серверная",
 "Главный вход",
 "Трансформаторная",
 "Комната Thermal Expansion",
 "Крафтильня"
 }
 
function sleep(ms)
 local z = os.clock() * 1000
 while os.clock() * 1000 - z < ms do end
end
 
for i=1,k do
 component.invoke(doors,"setPassword","",pass)
 component.invoke(doors,"close",pass)
end
 
while off do
 _,adress,pName,data = event.pull("magData")
 
 if data == master then
  off = false
  for i=1,k do
   component.invoke(doors,"open",pass)
  end
  print("Система безопастности отключена: " ..pName)
 end
 for i=1,k do
  if reader == adress then
   if pName == data then
    print("Активировал = " ..pName.." В " ..name .. " Статус = Открыто")
    component.invoke(doors,"open",pass)
    sleep(wait)
    component.invoke(doors,"close",pass)
    c=i
    i=500
   end
  end
 end
 if i == k then
  print("Активировал = " ..pName.. " Карта на имя = " ..data.. " В " ..name[c].. "Статус = Отказ")
 end
 i=0
 c=0
end

 

Share this post


Link to post

Для доступа к элементам doors и reader нужно использовать индексацию
doors и reader иначе вообще не будет работать.

Для выхода из цикла обработки сообщений лучше использовать break после print, вместо установки off

Вывод сообщения об отказе стоит внести в цикл поиска, после нахождения ридера. (ридеры невнесенные в спискок нас не интересуют). Так мы избавимся от переменной c. И некрасивого выхода из цикла через модификацию счётчика.

for i=1,k do
  if reader[i] == adress then
    if pName == data then
      print("Активировал = " ..pName.." В " ..name .. " Статус = Открыто")
      component.invoke(doors[i],"open",pass)
      sleep(wait)
      component.invoke(doors[i],"close",pass)
    else
      print("Активировал = " ..pName.. " Карта на имя = " ..data.. " В " ..name[i].. "Статус = Отказ")
    end
    break
  end
end

Таблицы doors reader name можно свести в одну, ключом будет адрес ридера, значением таблица содержащая адрес и имя двери,
тем самым можно избавиться от цикла поиска и от необходимости вручную указывать кол-во дверей.

Адреса можно указывать в сокращённой форме, перед начало работы заменить их "по-месту" с помощью component.get()

И еще про безопасность (Правда, я не игрался с модом OpenSecurity):

В карту ведь своё имя (значение data) может записать любой игрок? а условием открытия двери является совпадение значения data и имени игрока активировавшего карту. Следовательно, любой игрок сможет открыть дверь.

Edited by Scrag13

Share this post


Link to post
16 минут назад, Scrag13 сказал:

В карту ведь своё имя (значение data) может записать любой игрок? а условием открытия двери является совпадение значения data и имени игрока активировавшего карту. Следовательно, любой игрок сможет открыть дверь.

Я это понимаю, первоначальной целью была связка magreader с doorcontroller.
Дальше надо уже с вайтлистом химичить, но он отказывается нормально пахать.
Код на pastebin

Вообще вся задумка:
Открытие дверей по проверке Whitelist и уровня доступа(данные в data) и вывод соответствующих сообщений на экран.
Так как работа с разными мониторами дается туго, как и весь LUA ибо работает ОС очень странно(сам выбирает главный монитор, хотя он указан в авторане), пришлось переназначать главный монитор...

Edited by AlexApProd
  • good 1

Share this post


Link to post

Вот вариант.

Доступ по списку. Проверяется уровень доступа и код в карте. Можно сокращать адреса компонентов.

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...