-- Constants
local ALARM_INPUT = 6 -- Шлейф для тревоги
local INPUT_STATE = {
OFF = 0,
ON = 1
}
-- Simple logger implementation
local logger = {
debug = function(msg) print("[DEBUG] " .. tostring(msg)) end,
info = function(msg) print("[INFO] " .. tostring(msg)) end,
warning = function(msg) print("[WARNING] " .. tostring(msg)) end,
error = function(msg) print("[ERROR] " .. tostring(msg)) end
}
-- AccessControl class definition
local AccessControl = {}
AccessControl.__index = AccessControl
-- Utility function to read controller token
function AccessControl:read_controller_token()
local success, token = pcall(function()
-- Попытка чтения токена из системной конфигурации
-- Предполагается, что токен хранится в конфигурации контроллера
return pacs.get_controller_token() -- Предполагаемый метод API
end)
if not success then
logger.error("Ошибка при чтении токена контроллера: " .. tostring(token))
return nil
end
if not token then
logger.warning("Токен контроллера не найден, используется значение по умолчанию: 1")
return 1
end
logger.info("Успешно получен токен контроллера: " .. tostring(token))
return token
end
-- Constructor
function AccessControl:create()
local instance = {}
setmetatable(instance, AccessControl)
instance.access_point = nil -- Будет установлено при инициализации
return instance
end
-- Initialization
function AccessControl:init()
logger.debug(">> Инициализация системы контроля доступа...")
-- Получаем токен контроллера
self.access_point = self:read_controller_token()
if not self.access_point then
logger.error("!!! Критическая ошибка: Не удалось инициализировать токен контроллера !!!")
return false
end
-- Добавляем слушателя событий
-- Simulate fec API for testing
_G.fec = _G.fec or {
add_listener = function(name, listener)
logger.info("Добавлен слушатель: " .. name)
end,
TYPE = {
RADIAL_INPUT = "RADIAL_INPUT"
}
}
-- Simulate pacs API for testing
_G.pacs = _G.pacs or {
block = function(point)
logger.info("Блокировка точки доступа: " .. tostring(point))
end,
unblock = function(point)
logger.info("Разблокировка точки доступа: " .. tostring(point))
end,
get_controller_token = function()
return 2 -- Simulated token value
end
}
fec.add_listener("access_control", self)
logger.info("Инициализация завершена. Активная точка доступа: " .. tostring(self.access_point))
return true
end
-- Alarm handler
function AccessControl:on_alarm_triggered()
logger.error("!!! Тревога в шлейфе #6 !!! Блокировка точки доступа " .. tostring(self.access_point))
local success, error = pcall(function()
pacs.block(self.access_point)
end)
if not success then
logger.error("Ошибка при блокировке точки доступа: " .. tostring(error))
end
end
-- FEC object processor
function AccessControl:process_fec_object(object)
if object.type == fec.TYPE.RADIAL_INPUT and object.id == ALARM_INPUT then
local state = object.state
if state == INPUT_STATE.ON then
self:on_alarm_triggered()
else
logger.info("Тревога снята в шлейфе #6")
local success, error = pcall(function()
pacs.unblock(self.access_point)
end)
if not success then
logger.error("Ошибка при разблокировке точки доступа: " .. tostring(error))
end
end
end
end
-- FEC object change handler
function AccessControl:on_fec_object_changed(panel, object)
if panel == 0 then
self:process_fec_object(object)
end
end
-- System initialization
local function initialize_system()
local accessControl = AccessControl:create()
local init_success = accessControl:init()
if init_success then
logger.info("=== Система контроля доступа успешно инициализирована ===")
else
logger.error("=== Ошибка инициализации системы контроля доступа ===")
end
return accessControl
end
-- Return the initialization function instead of calling it
return initialize_system