Рабочий шлюз RTL УРАААА
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user