Codeine commited on
Commit
0931481
·
verified ·
1 Parent(s): 35a128e

Look at that PYTHON script and extract all functions and options, separately and provide in free text prompt, to me please! Here is my PYTHON script:

Browse files

```python
# camera_controller_fixed.py
import pygame
import cv2
import threading
import requests
import os
import time
from datetime import datetime
import json
import numpy as np
from pygame import gfxdraw
import subprocess
import signal
import sys


class CameraController:
def __init__(self):
# Инициализация на Pygame
pygame.init()
try:
pygame.mixer.init(frequency=22050, size=-16, channels=2, buffer=512)
except Exception as e:
print("Warning: mixer init failed:", e)

# Начални размери
self.screen_width = 1400
self.screen_height = 900

# Опитваме се да избегнем OpenGL/GL контекст проблеми като не искаме
# явно OPENGL флаг — използваме HWSURFACE | DOUBLEBUF за по-стабилен fullscreen
self.screen = pygame.display.set_mode(
(self.screen_width, self.screen_height),
pygame.RESIZABLE | pygame.DOUBLEBUF | pygame.HWSURFACE,
)
pygame.display.set_caption("IP Камера Контрол - Pygame")

# Цветова палитра
self.colors = {
"background": (25, 25, 35),
"panel": (35, 35, 45),
"accent": (70, 130, 180),
"accent_hover": (100, 160, 210),
"success": (46, 204, 113),
"warning": (241, 196, 15),
"danger": (231, 76, 60),
"text": (240, 240, 240),
"text_secondary": (180, 180, 180),
"border": (60, 60, 70),
}

# Шрифтове
self.font_large = pygame.font.SysFont("Arial", 16, bold=True)
self.font_medium = pygame.font.SysFont("Arial", 14)
self.font_small = pygame.font.SysFont("Arial", 12)

# Конфигурация на камерата
self.camera_ip = "192.168.1.178"
self.rtsp_base_url = f"rtsp://admin:@{self.camera_ip}:"

# Видеонастройки
self.fps_options = ["5", "10", "12", "15", "20", "25", "30"]
self.bitrate_options = ["512k", "1024k", "2048k", "4096k", "8192k"]
self.resolution_options = ["640x360", "1280x720", "1920x1080", "2560x1440"]

self.current_fps = "30"
self.current_bitrate = "64k"
self.current_resolution = "1920x1080"
self.current_port = "8001"

# Запис
self.is_recording = False
self.cap = None
self.out = None
self.current_stream = None

# Зуум
self.zoom_factor = 1.0
self.max_zoom = 8.0
self.zoom_step = 0.1

# Статус
self.white_light_status = False
self.ir_light_status = False
self.day_night_status = True

# Калибровъчни стойности (по подразбиране)
self.calibration_data = {
"pan_min": 0.0, # крайно дясно = 0
"pan_max": 355.0, # ще се запълни при калибрация
"tilt_min": 0.0, # крайно долно = 0
"tilt_max": 180.0, # ще се запълни при калибрация
"zoom_min": 1.0,
"zoom_max": 8.0,
"current_pan": 0.0,
"current_tilt": 0.0,
"current_zoom": 1.0,
"calibrated": False,
}

# Състояние на калибрация (автоматичен режим)
self.calibration_state = "idle" # idle, auto_calibrating
self.calibration_thread = None
self.calibration_cancelled = False

# Fullscreen
self.fullscreen_mode = False

# Запис директория
self.record_duration = 10
self.max_recordings = 5
self.delete_oldest = False
self.save_directory = "./recordings"

# UI state
self.crosshair_x = None
self.crosshair_y = None
self.crosshair_time = 0
self.crosshair_duration = 5

self.video_offset_x = 0
self.video_offset_y = 0
self.video_surface_width = 0
self.video_surface_height = 0

# Автозапис
self.last_save_time = time.time()
self.save_interval = 1800

# Конфиг файл
self.config_file = "camera_config.json"
self.load_config() # зареждаме предишните стойности (ако има)

# Убедим се че записовата директория съществува
if not os.path.exists(self.save_directory):
try:
os.makedirs(self.save_directory, exist_ok=True)
except Exception as e:
print("Не може да се създаде save директория, ще използвам cwd:", e)
self.save_directory = os.getcwd()

# UI status
self.status_message = "Готов за работа"
self.status_timer = 0

# Video surface
self.video_surface = None
self.video_rect = None

# Buttons threading state
self.pressed_buttons = {}
self.button_press_times = {}
self.button_threads = {}
self.button_cooldowns = {} # Нов речник за cooldown на бутоните

# Movement control flags
self.stop_all_movements_flag = False

# Running
self.running = True

# Lock for thread synchronization
self.position_lock = threading.Lock()

# Key mapping for keyboard controls
self.key_map = {
pygame.K_UP: "ptzu",
pygame.K_w: "ptzu",
pygame.K_DOWN: "ptzd",
pygame.K_s: "ptzd",
pygame.K_LEFT: "ptzl",
pygame.K_a: "ptzl",
pygame.K_RIGHT: "ptzr",
pygame.K_d: "ptzr",
}

# Audio process
self.audio_process = None
self.audio_process_pid = None

# Movement blocking
self.movement_blocking_enabled = True

# Connection monitoring
self.connection_monitor_thread = None
self.connection_lost = False
self.reconnection_attempt = 0

# Session for HTTP requests with connection pooling
self.http_session = requests.Session()
adapter = requests.adapters.HTTPAdapter(
pool_connections=10,
pool_maxsize=10,
max_retries=0, # Без автоматични повторни опити
)
self.http_session.mount("http://", adapter)

# Регистрираме сигнал handler за коректно спиране
signal.signal(signal.SIGINT, self.signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler)

# Стартираме потоците
self.start_connection_monitor()
self.start_audio_stream()
self.start_video_stream()
self.start_auto_save()
self.start_crosshair_fade()

# Главен цикъл
self.main_loop()

# -----------------------
# Signal handler за коректно спиране
# -----------------------
def signal_handler(self, signum, frame):
print(f"Получен сигнал {signum}, спиране на приложението...")
self.cleanup_and_exit()

# -----------------------
# Cleanup and exit
# -----------------------
def cleanup_and_exit(self):
print("Изчистване преди изход...")
self.running = False

# Спираме всички движения
self.stop_all_movements()

# Спираме аудио процеса
self.stop_audio_stream()

# Запазваме конфигурацията
try:
self.save_config()
except:
pass

# Освобождаваме ресурси
if self.cap:
try:
self.cap.release()
except:
pass
if self.out:
try:
self.out.release()
except:
pass

# Спираме всички бутони
self.release_all_buttons()

# Изчакваме всички нишки да приключат
main_thread = threading.current_thread()
for thread in threading.enumerate():
if thread != main_thread:
thread.join(timeout=1)

# Спираме pygame
try:
pygame.quit()
except:
pass

print("Приложението е спряно коректно")
sys.exit(0)

# -----------------------
# Конфиг зареждане/запазване
# -----------------------
def load_config(self):
try:
if os.path.exists(self.config_file):
with open(self.config_file, "r") as f:
config = json.load(f)

self.current_fps = config.get("fps", self.current_fps)
self.current_bitrate = config.get("bitrate", self.current_bitrate)
self.current_resolution = config.get(
"resolution", self.current_resolution
)
self.current_port = config.get("port", self.current_port)
self.save_directory = config.get("save_directory", self.save_directory)
self.record_duration = config.get(
"record_duration", self.record_duration
)
self.max_recordings = config.get("max_recordings", self.max_recordings)
self.delete_oldest = config.get("delete_oldest", self.delete_oldest)

self.white_light_status = config.get(
"white_light_status", self.white_light_status
)
self.ir_light_status = config.get(
"ir_light_status", self.ir_light_status
)

Files changed (0) hide show