# core/servo.py """ XMA Servomotor - Gestor simple del ciclo de vida """ import asyncio import signal import sys from enum import Enum from typing import Optional from datetime import datetime import logging from database import test_connection, dispose_engine logger = logging.getLogger(__name__) class ServoState(str, Enum): BOOT = "boot" RUN = "run" STOP = "stop" class XMAServo: """ Servomotor simple que: - Verifica BD al arrancar - Ejecuta tareas en segundo plano si es necesario - Maneja señales de apagado """ def __init__(self, mode: str = "dev"): self.mode = mode self.state = ServoState.BOOT self.boot_time = datetime.utcnow() self._tasks = [] self._running = False async def start(self): """Arranca el servomotor""" logger.info(f" XMA Servomotor iniciando (modo: {self.mode})") # Verificar BD if not test_connection(): logger.error(" Base de datos no disponible") sys.exit(1) logger.info(" Base de datos conectada") self.state = ServoState.RUN self._running = True logger.info(f" XMA Servomotor en estado RUN") # Si necesitas tareas en segundo plano, las agregas aquí # await self._start_background_tasks() async def stop(self): """Detiene el servomotor""" logger.info(" Deteniendo servomotor...") self.state = ServoState.STOP self._running = False # Cancelar tareas for task in self._tasks: task.cancel() # Cerrar conexiones dispose_engine() logger.info(" Servomotor detenido") def get_status(self) -> dict: return { "state": self.state.value, "mode": self.mode, "uptime": (datetime.utcnow() - self.boot_time).total_seconds(), "database": "connected" if test_connection() else "disconnected" } # Instancia global _servo = None def get_servo(mode: str = None) -> XMAServo: global _servo if _servo is None: import os mode = mode or os.getenv("XMA_MODE", "dev") _servo = XMAServo(mode=mode) return _servo