reorganize

This commit is contained in:
2026-06-13 23:53:48 +03:00
parent 8fb5a73bc2
commit e72128209a
2 changed files with 59 additions and 53 deletions

View File

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