first commit

This commit is contained in:
2026-04-01 13:48:40 -07:00
commit 61d386a7c7
178 changed files with 3827 additions and 0 deletions

91
app/core/servo.py Normal file
View File

@@ -0,0 +1,91 @@
# 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