Рабочий шлюз RTL УРАААА
This commit is contained in:
@@ -25,15 +25,17 @@
|
||||
-- Направление (flow) запоминается при входе.
|
||||
--
|
||||
-- Сценарий FLOW_OUT (в море):
|
||||
-- btn3 → если вода >10 осушить → открыть внутрь → войти
|
||||
-- → btn4/timer → закрыть внутрь → осушить (btn4 = пропуск) → открыть внешнюю
|
||||
-- → выйти → btn4/timer → закрыть внешнюю → IDLE
|
||||
-- btn3 → если воды >10% — осушить → открыть внутрь → войти
|
||||
-- → авто/btn4 → закрыть внутрь → затопить → открыть внешнюю
|
||||
-- → выйти → авто/btn4 → закрыть внешнюю → IDLE
|
||||
--
|
||||
-- Сценарий FLOW_IN (в отсек):
|
||||
-- btn5 → затопить (btn4 = пропуск) → открыть внешнюю → войти
|
||||
-- → btn4/timer → закрыть внешнюю → осушить (btn4 = пропуск)
|
||||
-- → открыть внутрь → войти → btn4/timer → закрыть внутрь → IDLE
|
||||
-- btn5 → затопить → открыть внешнюю → войти
|
||||
-- → авто/btn4 → закрыть внешнюю → осушить → открыть внутрь
|
||||
-- → войти → авто/btn4 → закрыть внутрь → IDLE
|
||||
--
|
||||
-- btn4/timer: таймер 2с; btn4 = пропустить ожидание сейчас.
|
||||
-- В DRAIN/FLOOD: btn4 или таймаут 15с — пропустить и открыть дверь.
|
||||
-- btn4 из IDLE: направление по flow (запомнен при входе), иначе по воде.
|
||||
|
||||
-- Состояния автомата
|
||||
@@ -54,16 +56,18 @@ local FLOW_OUT = 1 -- Из сухого наружу
|
||||
local FLOW_IN = 2 -- Снаружи в сухой
|
||||
|
||||
-- Параметры (шкала воды: 0 = пусто, 100 = полно)
|
||||
local WAIT_TIMEOUT = 5 -- секунд ожидания у открытой двери
|
||||
local DRAIN_THRESHOLD = 5 -- почти пусто (выход в море)
|
||||
local WAIT_TIMEOUT = 3 -- секунд ожидания у открытой двери
|
||||
local PUMP_TIMEOUT = 15 -- макс. секунд работы насоса до принудительного продолжения
|
||||
local DRAIN_THRESHOLD = 10 -- почти пусто (выход в море)
|
||||
local INNER_THRESHOLD = 10 -- можно открыть внутрь (по запросу: вода ниже 10%)
|
||||
local FLOOD_THRESHOLD = 95 -- почти полно (вход снаружи)
|
||||
local FLOOD_THRESHOLD = 90 -- почти полно (вход снаружи)
|
||||
local WATER_OPEN_SAFE = 10 -- при btn3: если воды > 10%, сначала осушить
|
||||
|
||||
-- Переменные состояния
|
||||
local state = ST_IDLE
|
||||
local flow = FLOW_NONE
|
||||
local timer = 0
|
||||
local pumpTimer = 0 -- сколько работает насос в текущем цикле
|
||||
|
||||
-- Предыдущие значения кнопок для детекции фронта
|
||||
local prev3 = false
|
||||
@@ -114,6 +118,13 @@ function upd(dt)
|
||||
prev4 = btn4
|
||||
prev5 = btn5
|
||||
|
||||
-- Сброс таймера насоса при входе в состояния с насосом
|
||||
if state == ST_DRAIN_EXIT or state == ST_FLOOD or state == ST_DRAIN_RET then
|
||||
pumpTimer = pumpTimer + dt
|
||||
else
|
||||
pumpTimer = 0
|
||||
end
|
||||
|
||||
-- Флаг: была ли кнопка 4 обработана в машине состояний
|
||||
local press4consumed = false
|
||||
|
||||
@@ -187,11 +198,11 @@ function upd(dt)
|
||||
-- Закрытие внутренней двери. Ждём полного закрытия.
|
||||
if not doorIn then
|
||||
if flow == FLOW_OUT then
|
||||
-- Сценарий "в море": после входа → осушение и выход
|
||||
setStatus("Осушение для выхода...", "0,200,255")
|
||||
-- Сценарий "в море": после входа → заполнить (давление) и открыть внешнюю
|
||||
setStatus("Заполнение шлюза...", "255,200,0")
|
||||
out[3] = 1
|
||||
out[4] = -100
|
||||
state = ST_DRAIN_EXIT
|
||||
out[4] = 100
|
||||
state = ST_FLOOD
|
||||
else
|
||||
-- Вернулись в отсек: завершено
|
||||
setStatus("Готов", "0,255,0")
|
||||
@@ -204,7 +215,7 @@ function upd(dt)
|
||||
-- Осушение шлюза перед выходом в море.
|
||||
out[3] = 1
|
||||
out[4] = -100
|
||||
if water <= DRAIN_THRESHOLD or press4 then
|
||||
if water <= DRAIN_THRESHOLD or press4 or pumpTimer >= PUMP_TIMEOUT then
|
||||
press4consumed = press4
|
||||
setStatus("Открытие внеш. двери...", "0,200,255")
|
||||
out[3] = 0
|
||||
@@ -216,7 +227,7 @@ function upd(dt)
|
||||
-- Заполнение шлюза для входа снаружи (уравнивание давления).
|
||||
out[3] = 1
|
||||
out[4] = 100
|
||||
if water >= FLOOD_THRESHOLD or press4 then
|
||||
if water >= FLOOD_THRESHOLD or press4 or pumpTimer >= PUMP_TIMEOUT then
|
||||
press4consumed = press4
|
||||
setStatus("Открытие внеш. двери...", "255,200,0")
|
||||
out[3] = 0
|
||||
@@ -228,7 +239,7 @@ function upd(dt)
|
||||
-- Осушение шлюза для входа в сухой отсек (можно раньше, порог INNER_THRESHOLD).
|
||||
out[3] = 1
|
||||
out[4] = -100
|
||||
if water <= INNER_THRESHOLD or press4 then
|
||||
if water <= INNER_THRESHOLD or press4 or pumpTimer >= PUMP_TIMEOUT then
|
||||
press4consumed = press4
|
||||
setStatus("Открытие внутр. двери...", "0,255,0")
|
||||
out[3] = 0
|
||||
|
||||
Reference in New Issue
Block a user