diff --git a/AirlockRTL.lua b/AirlockRTL.lua index 6af27d7..e5d4c54 100644 --- a/AirlockRTL.lua +++ b/AirlockRTL.lua @@ -25,17 +25,16 @@ -- Направление (flow) запоминается при входе. -- -- Сценарий FLOW_OUT (в море): --- btn3 → если воды >10% — осушить → открыть внутрь → войти --- → авто/btn4 → закрыть внутрь → затопить → открыть внешнюю --- → выйти → авто/btn4 → закрыть внешнюю → IDLE +-- btn3 → открыть внутрь → войти → btn4 (1-е) → закрыть внутрь +-- → затопить → открыть внешнюю → выйти → btn4 (2-е) → закрыть внешнюю → IDLE -- -- Сценарий FLOW_IN (в отсек): --- btn5 → затопить → открыть внешнюю → войти --- → авто/btn4 → закрыть внешнюю → осушить → открыть внутрь --- → войти → авто/btn4 → закрыть внутрь → IDLE +-- btn5 → затопить → открыть внешнюю → войти → btn4 (1-е) → закрыть внешнюю +-- → осушить → открыть внутрь → выйти → btn4 (2-е) → закрыть внутрь → IDLE -- --- btn4/timer: таймер 2с; btn4 = пропустить ожидание сейчас. --- В DRAIN/FLOOD: btn4 или таймаут 15с — пропустить и открыть дверь. +-- btn4: единственный способ перехода через WAIT_* состояния (без таймера). +-- Таймер WAIT_TIMEOUT (10с) — только аварийная страховка. +-- В DRAIN/FLOOD: btn4 или PUMP_TIMEOUT — пропустить и открыть дверь. -- btn4 из IDLE: направление по flow (запомнен при входе), иначе по воде. -- Состояния автомата @@ -56,18 +55,18 @@ local FLOW_OUT = 1 -- Из сухого наружу local FLOW_IN = 2 -- Снаружи в сухой -- Статусы (с ведущим пробелом для отступа на дисплее) -local S_READY = "Готов" -local S_DRAIN_PRE = "Осушение перед входом" -local S_OPEN_IN = "Открытие внутренней двери" -local S_WAIT_IN = "Внутренняя дверь открыта" -local S_CLOSE_IN = "Закрытие внутренней двери" -local S_FLOOD = "Заполнение шлюза" -local S_DRAIN_OUT = "Осушение для выхода" -local S_DRAIN_RET = "Осушение для отсека" -local S_OPEN_OUT = "Открытие внешней двери" -local S_WAIT_OUT = "Внешняя дверь открыта" -local S_CLOSE_OUT = "Закрытие внешней двери" -local S_DRAIN_AFTER = "Осушение после входа" +local TXT_READY = " Готов" +local TXT_DRAIN_PRE = " Осушение перед входом" +local TXT_OPEN_IN = " Открытие внутренней двери" +local TXT_WAIT_IN = " Внутренняя дверь открыта" +local TXT_CLOSE_IN = " Закрытие внутренней двери" +local TXT_FLOOD = " Заполнение шлюза" +local TXT_DRAIN_OUT = " Осушение для выхода" +local TXT_DRAIN_RET = " Осушение для отсека" +local TXT_OPEN_OUT = " Открытие внешней двери" +local TXT_WAIT_OUT = " Внешняя дверь открыта" +local TXT_CLOSE_OUT = " Закрытие внешней двери" +local TXT_DRAIN_AFTER = " Осушение после входа" -- Цвета local C_GREEN = "0,255,0" @@ -75,11 +74,11 @@ local C_CYAN = "0,200,255" local C_YELLOW = "255,200,0" -- Параметры (шкала воды: 0 = пусто, 100 = полно) -local WAIT_TIMEOUT = 3 -- секунд ожидания у открытой двери -local PUMP_TIMEOUT = 15 -- макс. секунд работы насоса до принудительного продолжения -local DRAIN_THRESHOLD = 10 -- почти пусто (выход в море) -local INNER_THRESHOLD = 10 -- можно открыть внутрь (по запросу: вода ниже 10%) -local FLOOD_THRESHOLD = 90 -- почти полно (вход снаружи) +local WAIT_TIMEOUT = 5 -- аварийный таймаут открытой двери (основное — btn4) +local PUMP_TIMEOUT = 10 -- макс. секунд работы насоса до принудительного продолжения +local DRAIN_THRESHOLD = 5 -- осушить до 5% перед выходом в море +local INNER_THRESHOLD = 0 -- открыть внутрь при воде ≤ 10% +local FLOOD_THRESHOLD = 90 -- заполнить до 90% перед открытием внешней local WATER_OPEN_SAFE = 10 -- при btn3: если воды > 10%, сначала осушить -- Переменные состояния @@ -95,7 +94,7 @@ local prev5 = false -- Установка текста и цвета статуса local function setStatus(text, color) - out[5] = " " .. text + out[5] = text out[6] = color end @@ -104,16 +103,15 @@ local function goIdle() out[1] = 0 out[2] = 0 out[3] = 0 - setStatus(S_READY, C_GREEN) + setStatus(TXT_READY, C_GREEN) state = ST_IDLE timer = 0 end -- Инициализация при старте -out[1] = 0 -out[2] = 0 -out[3] = 0 -setStatus(S_READY, C_GREEN) +-- out[1] = 0 +-- out[2] = 0 +-- out[3] = 0 inp = {} @@ -154,20 +152,20 @@ function upd(dt) if press3 then -- Вход из сухого отсека: если есть вода — сначала осушаем, затем внутрь if water > WATER_OPEN_SAFE then - setStatus(S_DRAIN_PRE, C_CYAN) + setStatus(TXT_DRAIN_PRE, C_CYAN) out[3] = 1 out[4] = -100 flow = FLOW_OUT state = ST_DRAIN_RET else - setStatus(S_OPEN_IN, C_GREEN) + setStatus(TXT_OPEN_IN, C_GREEN) out[2] = 1 flow = FLOW_OUT state = ST_OPEN_IN end elseif press5 then -- Вход снаружи → заполнить шлюз водой, затем открыть внешнюю дверь - setStatus(S_FLOOD, C_YELLOW) + setStatus(TXT_FLOOD, C_YELLOW) out[3] = 1 out[4] = 100 flow = FLOW_IN @@ -181,12 +179,12 @@ function upd(dt) flow = dir end if dir == FLOW_OUT then - setStatus(S_DRAIN_OUT, C_CYAN) + setStatus(TXT_DRAIN_OUT, C_CYAN) out[3] = 1 out[4] = -100 state = ST_DRAIN_EXIT else - setStatus(S_DRAIN_RET, C_CYAN) + setStatus(TXT_DRAIN_RET, C_CYAN) out[3] = 1 out[4] = -100 state = ST_DRAIN_RET @@ -198,17 +196,21 @@ function upd(dt) out[2] = 1 if doorIn then timer = 0 - setStatus(S_WAIT_IN, C_GREEN) + setStatus(TXT_WAIT_IN, C_GREEN) state = ST_WAIT_IN end elseif state == ST_WAIT_IN then - -- Внутренняя дверь открыта. Ждём прохода человека (btn4 или таймер). + -- Внутренняя дверь открыта. Ждём btn4 (подтверждение прохода). out[2] = 1 timer = timer + dt - if press4 or timer >= WAIT_TIMEOUT then - press4consumed = press4 - setStatus(S_CLOSE_IN, C_YELLOW) + if press4 then + press4consumed = true + setStatus(TXT_CLOSE_IN, C_YELLOW) + out[2] = 0 + state = ST_CLOSE_IN + elseif timer >= WAIT_TIMEOUT then + setStatus(TXT_CLOSE_IN, C_YELLOW) out[2] = 0 state = ST_CLOSE_IN end @@ -218,13 +220,13 @@ function upd(dt) if not doorIn then if flow == FLOW_OUT then -- Сценарий "в море": после входа → заполнить (давление) и открыть внешнюю - setStatus(S_FLOOD, C_YELLOW) + setStatus(TXT_FLOOD, C_YELLOW) out[3] = 1 out[4] = 100 state = ST_FLOOD else -- Вернулись в отсек: завершено - setStatus(S_READY, C_GREEN) + setStatus(TXT_READY, C_GREEN) flow = FLOW_NONE state = ST_IDLE end @@ -236,7 +238,7 @@ function upd(dt) out[4] = -100 if water <= DRAIN_THRESHOLD or press4 or pumpTimer >= PUMP_TIMEOUT then press4consumed = press4 - setStatus(S_OPEN_OUT, C_CYAN) + setStatus(TXT_OPEN_OUT, C_CYAN) out[3] = 0 out[1] = 1 state = ST_OPEN_OUT @@ -248,7 +250,7 @@ function upd(dt) out[4] = 100 if water >= FLOOD_THRESHOLD or press4 or pumpTimer >= PUMP_TIMEOUT then press4consumed = press4 - setStatus(S_OPEN_OUT, C_YELLOW) + setStatus(TXT_OPEN_OUT, C_YELLOW) out[3] = 0 out[1] = 1 state = ST_OPEN_OUT @@ -260,7 +262,7 @@ function upd(dt) out[4] = -100 if water <= INNER_THRESHOLD or press4 or pumpTimer >= PUMP_TIMEOUT then press4consumed = press4 - setStatus(S_OPEN_IN, C_GREEN) + setStatus(TXT_OPEN_IN, C_GREEN) out[3] = 0 out[2] = 1 state = ST_OPEN_IN @@ -271,17 +273,21 @@ function upd(dt) out[1] = 1 if doorOut then timer = 0 - setStatus(S_WAIT_OUT, C_CYAN) + setStatus(TXT_WAIT_OUT, C_CYAN) state = ST_WAIT_OUT end elseif state == ST_WAIT_OUT then - -- Внешняя дверь открыта. Ждём прохода человека (btn4 или таймер). + -- Внешняя дверь открыта. Ждём btn4 (подтверждение прохода). out[1] = 1 timer = timer + dt - if press4 or timer >= WAIT_TIMEOUT then - press4consumed = press4 - setStatus(S_CLOSE_OUT, C_YELLOW) + if press4 then + press4consumed = true + setStatus(TXT_CLOSE_OUT, C_YELLOW) + out[1] = 0 + state = ST_CLOSE_OUT + elseif timer >= WAIT_TIMEOUT then + setStatus(TXT_CLOSE_OUT, C_YELLOW) out[1] = 0 state = ST_CLOSE_OUT end @@ -291,13 +297,13 @@ function upd(dt) if not doorOut then if flow == FLOW_IN then -- Сценарий "снаружи": после закрытия — осушение и вход в отсек - setStatus(S_DRAIN_AFTER, C_CYAN) + setStatus(TXT_DRAIN_AFTER, C_CYAN) out[3] = 1 out[4] = -100 state = ST_DRAIN_RET else -- Сценарий "наружу": завершён - setStatus(S_READY, C_GREEN) + setStatus(TXT_READY, C_GREEN) state = ST_IDLE flow = FLOW_NONE end diff --git a/AtlasOS.lua b/AtlasOS/AtlasOS.lua similarity index 100% rename from AtlasOS.lua rename to AtlasOS/AtlasOS.lua