# Marine Compass Display — Estado del Proyecto

## Qué funciona

### Ventana principal (`ui/main_window.py`)
- Layout 60/40: rosa de los vientos (izq) + panel de info (der)
- Modo fullscreen con F para toggle, Escape para cerrar
- Modo kiosk (`--kiosk`): cursor oculto, screensaver desactivado (Linux/RPi)
- Smoothing de rumbo configurable en `config.py` (`HEADING_SMOOTHING`)

### Rosa de los vientos (`ui/compass_widget.py`)
- Tarjeta giratoria: el norte siempre apunta al norte real
- Línea lubber fija en rojo (arriba = rumbo del barco)
- Readout digital del rumbo **arriba** de la rosa, justo bajo la línea lubber
  - Formato: `045.0°M` o `045.0°T` según modo seleccionado
- Estrella de 16 puntas: N=rojo, cardinales=blanco, intercardinales=oro
- Ring de ticks cada 5°, números cada 10°
- Modo noche / día
- Ball central muestra pitch+roll del buque

### Panel de información (`ui/info_panel.py`)
- **HDG grande**: muestra °M o °T según el botón HDG seleccionado ← bug corregido hoy
- Filas de datos: HDG(T), ROT, PITCH, ROLL, VAR, HEAVE, YAW RATE
- ROT Arc: semicírculo animado, azul=estribor, rojo=babor, escala ±60°/min
- Siluetas de barco animadas (motor-cruiser 40ft):
  - **PITCH** (vista lateral): hull completo, cabina, flybridge, radar arch, línea de boot roja, línea de vida punteada, arco de proa
  - **ROLL** (vista de proa): casco V, francobordo con curvatura, raíl de rociada, windshield en V con cristales azules separados, arco radar, luces de navegación rojo/verde
  - **YAW** (vista de planta): casco cúbico bezier, cockpit con bancadas, cabina, flybridge, escotillas de cubierta, púlpito de proa, luces de nav
- Botones táctiles: HDG °M/°T, NIGHT, PORTS
- Marcos separados por gaps (para case con compartimentos físicos)
- Responsive: se adapta a cualquier tamaño de pantalla

### Simulador NMEA (`simulator/nmea_simulator.py`)
- Secuencia realista: INITIAL → TURN_STBD → COMP_STBD → STEADY_STBD → TURN_PORT → COMP_PORT → NORMAL
- Genera: HCHDG (rumbo), IIROT (ROT), IIXDR (pitch, roll, aceleración, giroscopio)
- Servidor TCP en 127.0.0.1:10110
- Variación magnética: -7.5° (Stuart, FL)
- SOG: 8.5 kn, ROT máx: 60°/min

### Lanzamiento (`launch.bat`)
- `launch.bat --sim` → usa `python` (con consola), se ven logs del simulador en tiempo real
- `launch.bat` → usa `pythonw` (sin consola), modo kiosk limpio para hardware

### Parser NMEA (`core/nmea_parser.py`)
- Parsea HCHDG, IIROT, IIXDR
- `NavData.hdg_true_calc` = hdg_mag + variation (calculo automático)

---

## Pendiente / Mejoras posibles

- [ ] Silueta ROLL (vista de proa): el usuario quiere más detalle y mejores proporciones
- [ ] Test en hardware real con puerto serial
- [ ] Modo RPi: probar con `--kiosk` en Raspberry Pi con pantalla táctil
- [ ] NMEA: agregar soporte para VHW, MWV, GGA si se necesita más datos

---

## Cómo probar

```
# Simulador (muestra logs en consola):
launch.bat --sim

# Con hardware real en COM3:
launch.bat --port COM3 --baud 4800

# Puerto configurado en config.py:
launch.bat

# Python directo (más control):
python main.py --sim
python main.py --port COM3
```

---

## Archivos clave

| Archivo | Función |
|---------|---------|
| `main.py` | Entry point, args, QApplication |
| `config.py` | Puertos serial, smoothing, FPS |
| `ui/main_window.py` | Ventana principal, layout, timer |
| `ui/compass_widget.py` | Rosa de los vientos (QPainter) |
| `ui/info_panel.py` | Panel derecho: datos, siluetas, botones |
| `ui/styles.py` | Colores y helpers de tema |
| `core/nmea_parser.py` | Parser NMEA 0183 |
| `core/serial_reader.py` | Lector serial (QThread) |
| `simulator/nmea_simulator.py` | Simulador de maniobras + TCP server |
