import cv2 import numpy as np from typing import Dict from .config import Config, Colors class HUD: @staticmethod def draw(frame: np.ndarray, status: str, emergency_stop: bool, is_locked: bool, lock_trigger: bool, current_height: float, target_altitude: float, current_yaw: float, bat: int, depth_map_vis: np.ndarray, zones: Dict[str, bool]): cv2.rectangle(frame, (0, 0), (Config.WIDTH, 90), Colors.HUD_BG, -1) cv2.rectangle(frame, (0, Config.HEIGHT-90), (Config.WIDTH, Config.HEIGHT), Colors.HUD_BG, -1) stat_color = Colors.RED if "AVOIDING" in status or emergency_stop else Colors.GREEN if is_locked: stat_color = Colors.BLUE cv2.putText(frame, f"STATUS: {status}", (25, 40), cv2.FONT_HERSHEY_DUPLEX, 1.1, stat_color, 2) cv2.putText(frame, f"ALT: {current_height:.1f}m | BAT: {bat}% | YAW: {int(current_yaw)}o", (25, 75), cv2.FONT_HERSHEY_SIMPLEX, 0.7, Colors.WHITE, 2) if depth_map_vis is not None: mini = cv2.resize(depth_map_vis, (200, 150)) frame[100:250, 25:225] = mini cv2.rectangle(frame, (25, 100), (225, 250), Colors.WHITE, 2) cv2.putText(frame, "AI DEPTH", (25, 275), cv2.FONT_HERSHEY_SIMPLEX, 0.6, Colors.WHITE, 2) radar_x = Config.WIDTH - 220 for i, name in enumerate(["LEFT", "CENTER", "RIGHT"]): short_name = name[0] active = zones[name] col = Colors.RED if active else Colors.GREEN cv2.rectangle(frame, (radar_x + i*70, 100), (radar_x + (i+1)*60, 150), col, -1 if active else 2) cv2.putText(frame, short_name, (radar_x + 20 + i*70, 135), cv2.FONT_HERSHEY_DUPLEX, 0.8, Colors.WHITE, 2) stop_col = Colors.RED if not emergency_stop else (0, 255, 255) cv2.rectangle(frame, (Config.WIDTH - 250, Config.HEIGHT - 80), (Config.WIDTH - 25, Config.HEIGHT - 10), stop_col, -1) cv2.putText(frame, "STOP", (Config.WIDTH - 200, Config.HEIGHT - 35), cv2.FONT_HERSHEY_DUPLEX, 0.8, Colors.WHITE, 2) keys = ["T:Takeoff", "L:Land", "M:Manual", "K:LockOn", "R:Up", "F:Down", "1:Rotate", "Space:Stop", "ENTER:Quit"] for i, k in enumerate(keys): cv2.putText(frame, k, (25 + (i%5)*200, Config.HEIGHT - 55 + (i//5)*35), cv2.FONT_HERSHEY_SIMPLEX, 0.6, Colors.WHITE, 2) if lock_trigger: cv2.putText(frame, "LOCK TRIGGER ACTIVE: FINDING FACE...", (25, 120), cv2.FONT_HERSHEY_SIMPLEX, 0.7, Colors.BLUE, 2)