From 365bd743c5e5bb2551ec8c8234c64249a922e84e Mon Sep 17 00:00:00 2001 From: SlavaVlad Date: Sun, 7 Jun 2026 03:36:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=87=D0=B8=D0=B9=20?= =?UTF-8?q?=D1=88=D0=BB=D1=8E=D0=B7=20RTL=20=D0=A3=D0=A0=D0=90=D0=90=D0=90?= =?UTF-8?q?=D0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AirlockRTL.lua | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/AirlockRTL.lua b/AirlockRTL.lua index a1fbabc..8cfa062 100644 --- a/AirlockRTL.lua +++ b/AirlockRTL.lua @@ -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