Рабочий шлюз RTL УРАААА

This commit is contained in:
2026-06-07 03:36:24 +03:00
parent 13afc4f69e
commit 365bd743c5

View File

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