i2GR писал(а):только если не более 2 FPS
Надо всего лишь изменить принцип подсчета ТАБов.
Чтобы приняв первый ТАБ, светофор не начинал выполнять команду, а ждал, не придут ли ещё другие ТАБ-ы, которые можно рассматривать как один цельный запрос.
Я не знаю, актуально или нет, но на всякий случай покажу свое решение, может, что-то пригодится из него
. У меня использован именно такой принцип - пока не пройдет заданное время от последнего запроса, светофор ничего не делает. Каждый запрос обновляет таймер, поэтому количество ТАБ-ов не ограничено, как и время, за которое их надо сделать.
Итак, основная функция счетчика запросов:
- Код: Выделить всё
function RequestSPAD (mode)
if mode == "ctrl" then
return gRequest.Mode
elseif mode == "set" then
if gRequest.Setting then
gRequest.Setting = false
gRequest.Activation = false
gRequest.Mode = gRequest.Count
gRequest.Count = 0
if gRequest.Mode == 1 then
-- Ветка отработки 1 ТАВ
elseif gRequest.Mode == 2 then
-- Ветка отработки 2 ТАВ
elseif gRequest.Mode == 3 then
-- Ветка отработки 3 ТАВ
end
end
elseif mode == "reset" then
gRequest = {Timer = 0, Mode = 0, Count = 0, Activation = false, Setting = false}
end
end
Эта функция запоминает сам факт запроса, количество ТАБ-ов, по требованию
RequestSPAD ("ctrl") отчитывается о текущем состоянии и сбрасывается в исходное состояние по команде
RequestSPAD ("reset").
Инициализируется в функции
Initialise ():
- Код: Выделить всё
function Initialise ()
-- Script global variables
gRequest = {Timer = 0, Mode = 0, Count = 0, Activation = false, Setting = false}
end
Для отсчета времени в функции
Update (time) прописан контроллер:
- Код: Выделить всё
function Update (time)
if gRequest.Activation then -- Если работает счетчик запросов SPAD
if Call ("GetSimulationTime") - gRequest.Timer >= 0 then
gRequest.Setting = true
RequestSPAD ("set")
end
end
end -- end function Update
А при получении запроса ТАБ в функции
ReactToSignalMessage (message, parameter, direction, linkIndex) активируется контроллер запросов и происходит подсчет принятых ТАБ-ов. Здесь же установлена задержка, которую будет ожидать скрипт после приема очередного ТАБ-а, перед тем, как выполнить запрос:
- Код: Выделить всё
function ReactToSignalMessage (message, parameter, direction, linkIndex)
if message == REQUEST_TO_SPAD and (RequestSPAD ("ctrl") == 0 or (RequestSPAD ("ctrl") == 1 and gBlockState == "BLOCKED")) then
gRequest.Timer = Call ("GetSimulationTime") + 3 -- Перезапуск времени, истекшего с момента запроса. Реакция на запрос будет через 3 секунды
gRequest.Count = gRequest.Count + 1 -- Счетчик количества запросов. То есть, "количества ТАВ-ов"
gRequest.Activation = true -- Активация блока обработки системы запросов в Update
end
end
Если в процессе работы скрипту надо выяснить, был ли запрос, используется команда
RequestSPAD ("ctrl"). Возвращает количество принятых ТАБ-ов или 0, если запросов не было (в формате "number"). Если надо сделать сброс, используется команда
RequestSPAD ("reset") (ничего не возвращает).