# ============================================================
# config_intercept.py
# Параметры для модулей перехвата.
# Импортируется в main.py ПОСЛЕ config.py
# ============================================================

# ─────────────────────────────────────────────────────────────
# 1. RANGE ESTIMATION  (range_estimation.py)
# ─────────────────────────────────────────────────────────────
RANGE_ENABLE = True

# Калибровка камеры (нужно измерить для вашего объектива)
# focal_length_px = focal_length_mm * image_width_px / sensor_width_mm
# Для типичной FPV камеры 2.1mm, 1/3" сенсор (4.8mm), 720px ширина:
#   focal_length_px ≈ 2.1 * 720 / 4.8 ≈ 315
CAMERA_FOCAL_LENGTH_PX = 315.0

# Известный размер цели (метры). Типичный FPV-дрон ~0.25-0.30м по диагонали
TARGET_KNOWN_SIZE_M = 0.27

# Минимальный размер bbox (пиксели) для оценки дальности
RANGE_MIN_APPARENT_SIZE_PX = 4.0

# Максимальная правдоподобная дальность (метры)
RANGE_MAX_M = 500.0
RANGE_MIN_M = 0.3

# Сглаживание оценки дальности (EMA alpha, 0=нет сглаживания, 0.9=сильное)
RANGE_SMOOTH_ALPHA = 0.65

# Tau (time-to-contact)
TAU_SMOOTH_ALPHA = 0.50
TAU_MIN_AREA_RATE = 0.5       # минимальная скорость роста площади (px²/s)
TAU_WARN_SEC = 3.0            # предупреждение: < N секунд до контакта
TAU_CRITICAL_SEC = 1.0        # критическая фаза

# ─────────────────────────────────────────────────────────────
# 2. PROPORTIONAL NAVIGATION  (proportional_navigation.py)
# ─────────────────────────────────────────────────────────────
PN_ENABLE = True

# Навигационная константа (N). Обычно 3-5.
# N=3 — базовый PN, N=4-5 — более агрессивный перехват
PN_NAV_GAIN = 4.0

# Использовать Augmented PN (учитывает ускорение цели)
PN_AUGMENTED = True
PN_AUG_GAIN = 0.5                # вес компенсации ускорения цели

# Максимальная команда ускорения (нормализованная, 0..1)
PN_MAX_ACCEL_CMD = 1.0

# Если range недоступен, fallback к screen-space PN
PN_SCREEN_FALLBACK = True

# Сглаживание LOS rate
PN_LOS_RATE_SMOOTH = 0.40

# Минимальная closing velocity для активации PN (м/с)
PN_MIN_CLOSING_VEL = 0.5

# Lead bias (секунды предсказания вперед для упреждения)
PN_LEAD_TIME_SEC = 0.15

# ─────────────────────────────────────────────────────────────
# 3. INTERCEPT FSM  (intercept_fsm.py)
# ─────────────────────────────────────────────────────────────
INTERCEPT_FSM_ENABLE = True

# Пороги перехода между фазами (по дальности, метры)
FSM_ACQUIRE_RANGE_M = 200.0      # SEARCH → ACQUIRE: цель обнаружена
FSM_TRACK_CONFIRM_HITS = 5       # ACQUIRE → TRACK: стабильный трек
FSM_INTERCEPT_RANGE_M = 80.0     # TRACK → INTERCEPT: начинаем атаку
FSM_TERMINAL_TAU_SEC = 1.5       # INTERCEPT → TERMINAL: осталось < N сек
FSM_TERMINAL_RANGE_M = 8.0       # или расстояние < N метров

# Таймауты (кадры)
FSM_ACQUIRE_TIMEOUT = 150        # не подтвердили → SEARCH
FSM_LOST_TIMEOUT = 60            # потеря в TRACK/INTERCEPT → LOST
FSM_LOST_RECOVER_TIMEOUT = 90    # LOST → SEARCH (полный сброс)

# Throttle / скорость сближения
FSM_INTERCEPT_THROTTLE_BIAS = 0.85  # базовый газ в фазе INTERCEPT
FSM_TERMINAL_THROTTLE = 1.0         # максимальный газ в TERMINAL
FSM_TRACK_THROTTLE_BIAS = 0.60      # удержание дистанции в TRACK

# Terminal phase — переход на инерциальную навигацию
FSM_TERMINAL_USE_KLT_ONLY = True     # в TERMINAL отключить YOLO, только KLT
FSM_TERMINAL_LOCK_COMMANDS = False   # заморозить команды в последний момент
FSM_TERMINAL_LOCK_TAU_SEC = 0.3      # за сколько секунд заморозить

# ─────────────────────────────────────────────────────────────
# 4. AUTOPILOT BRIDGE  (autopilot_bridge.py)
# ─────────────────────────────────────────────────────────────
AUTOPILOT_ENABLE = True
AUTOPILOT_BACKEND = "json"           # "json" | "mavlink" | "msp" | "proto_udp"

# JSON export (расширенный вариант текущего guidance_state.json)
AUTOPILOT_JSON_PATH = "autopilot_cmd.json"
AUTOPILOT_JSON_EVERY = 1             # каждый N-й кадр

# MAVLink
MAVLINK_CONNECTION = "udpout:127.0.0.1:14550"
MAVLINK_SYSTEM_ID = 1
MAVLINK_COMPONENT_ID = 191           # MAV_COMP_ID_ONBOARD_COMPUTER
MAVLINK_CMD_RATE_HZ = 30.0

# MSP (Betaflight / INAV)
MSP_PORT = "/dev/ttyUSB0"            # или "COM3" на Windows
MSP_BAUD = 115200
MSP_CMD_RATE_HZ = 50.0

# Испытательный UDP-протокол "нейросеть -> блок"
PROTO_UDP_ENABLE = False
PROTO_UDP_HOST = "127.0.0.1"
PROTO_UDP_PORT = 5005
PROTO_UDP_DESCRIPTOR = 1

# Маппинг команд наведения → управления дроном
# Коэффициенты конвертации steer → RC channels (микросекунды)
AUTOPILOT_ROLL_SCALE = 500.0         # steer_x * scale + 1500
AUTOPILOT_PITCH_SCALE = 500.0        # steer_y * scale + 1500
AUTOPILOT_YAW_SCALE = 300.0
AUTOPILOT_THROTTLE_CENTER = 1500
AUTOPILOT_RC_MIN = 1000
AUTOPILOT_RC_MAX = 2000

# Экстренный стоп (kill switch при потере цели)
AUTOPILOT_FAILSAFE_ENABLE = True
AUTOPILOT_FAILSAFE_MISS_FRAMES = 30  # потеря > N кадров → hover/RTL
AUTOPILOT_FAILSAFE_ACTION = "hover"  # "hover" | "rtl" | "land"

# ─────────────────────────────────────────────────────────────
# 5. IMM FILTER  (imm_filter.py)
# ─────────────────────────────────────────────────────────────
IMM_ENABLE = True

# Процессный шум для каждой модели
IMM_CV_Q_POS = 2.0        # Constant Velocity — позиция
IMM_CV_Q_VEL = 4.0        # Constant Velocity — скорость
IMM_CA_Q_POS = 1.5        # Constant Acceleration — позиция
IMM_CA_Q_VEL = 3.0        # Constant Acceleration — скорость
IMM_CA_Q_ACC = 12.0       # Constant Acceleration — ускорение
IMM_CT_Q_POS = 2.0        # Coordinated Turn — позиция
IMM_CT_Q_VEL = 5.0        # Coordinated Turn — скорость
IMM_CT_Q_OMEGA = 1.0      # Coordinated Turn — угловая скорость

# Начальные вероятности моделей [CV, CA, CT]
IMM_INIT_PROBS = [0.6, 0.25, 0.15]

# Матрица переходов между моделями (Markov)
# [из CV→CV, из CV→CA, из CV→CT]
# [из CA→CV, из CA→CA, из CA→CT]
# [из CT→CV, из CT→CA, из CT→CT]
IMM_TRANSITION_MATRIX = [
    [0.90, 0.07, 0.03],
    [0.10, 0.82, 0.08],
    [0.08, 0.07, 0.85],
]

# Measurement noise
IMM_R_POS = 16.0
IMM_R_SIZE = 25.0

# Заменить стандартный Kalman8D на IMM (если True, main.py использует IMM)
IMM_REPLACE_KALMAN = False  # включить после тестирования

# ─────────────────────────────────────────────────────────────
# 6. DRAW / DEBUG для новых модулей
# ─────────────────────────────────────────────────────────────
DRAW_RANGE_INFO = True
DRAW_INTERCEPT_FSM = True
DRAW_PN_VECTOR = True
DRAW_IMM_PROBS = True
DRAW_INTERCEPT_POINT = True

from runtime_env import apply_intercept_env_overrides

apply_intercept_env_overrides(globals())
