Saltearse al contenido

Alertas de copiloto

Las alertas de copiloto son notificaciones reales, dirigidas por eventos, escritas a Firestore por los servicios de backend de ARGUS y mostradas en la tira Master Caution del operador (icono de campana en la barra de herramientas). A diferencia de las advertencias locales en memoria, estas persisten a través de refresco y se propagan a cada participante de la misión.

De dónde vienen las alertas

Los servicios de backend escriben a missions/{missionId}/copilot_alerts:

  • Agente CAS — lógica de evitación de colisiones. Escribe cuando dos aeronaves entran en umbrales de proximidad configurados. Tipo cas.
  • argus-copilot — el worker de inteligencia de misión respaldado por LLM. Escribe cuando correlaciona eventos que el operador debería conocer.
  • argus-wifi-sensing (cuando está desplegado) — anomalías de espectro, advertencias de interferencia.
  • DJI HMS — alertas del sistema de gestión de salud desde los docks. Traducidas a alertas de copiloto por el event-handler de argus-dji. Escritas con severidad + código + mensaje legible por humanos del diccionario DJI de 448 entradas.

Todos los escritores son exclusivamente del lado del servidor — la webapp no escribe alertas directamente, solo escucha.

El listener de Firestore

El componente de operación configura un listener en tiempo real con alcance a la sesión actual:

query(
collection(fs, 'missions', missionId, 'copilot_alerts'),
where('type', '==', 'cas'),
where('createdOn', '>', sessionStart),
orderBy('createdOn', 'desc'),
firestoreLimit(20)
)

Observa el filtro type === 'cas' — en la build actual solo las alertas CAS aparecen en la consola. Otros tipos de alerta (HMS, wifi-sensing, dirigidos por copilot) escriben a la misma colección pero aún no se enrutan a master caution. Esto es una limitación, no un diseño — el filtro del listener se ampliará a medida que más fuentes de alertas maduren.

Forma de la alerta

Cada doc copilot_alert:

  • typecas, hms, copilot, etc.
  • severityinfo / warning / critical.
  • sourcecas / flag / system / drone / geofence / comms.
  • title + detail — cadenas.
  • location — lat/lng/alt opcional para integración con el mapa.
  • createdOn — ms de época.

Integración con master-caution

Al llegar una alerta, el listener llama a MasterCautionService.pushAlert():

  1. Actualización del badge — el icono de campana gana un badge de conteo.
  2. Estado de color — si la severidad es critical, la campana se pone roja con un pulso sutil; warning la pone en ámbar.
  3. Tono audible — un tono corto estilo F-18 suena para alertas critical (a menos que el audio esté silenciado globalmente).
  4. Registro en blackbox — cada alerta se escribe a la sesión de replay de blackbox para que la revisión after-action la vea.

Reconocer alertas

Desde el menú master-caution (haz clic en la campana):

  • Clic por alerta — descarta esa alerta (tu descarte; los demás siguen viéndola).
  • Borrar todo — descarte masivo.

El descarte es por usuario — el doc de alerta permanece en Firestore de modo que otros participantes siguen viéndola hasta que la descartan por sí mismos. Para eliminarla permanentemente, un admin debe borrar el doc directamente.

Silencio / snooze

Una opción silenciar durante N minutos suprime nuevas alertas de una clase durante N minutos. Útil cuando una advertencia de viento se repite cada 10 s — silénciala mientras te enfocas en otra tarea.

Click-jump desde el menú

Las alertas con un campo location obtienen un chip “ir a”. Al hacer clic:

  • El mapa se desplaza a la lat/lng de la alerta.
  • Un anillo pulsante destella en la ubicación durante unos segundos.
  • El tile de mapa se pone en primer plano si está minimizado.

Integración con comandos de voz

Los operadores que dicen EMERGENCY (o cualquiera de las 43 variantes de frase EMERGENCY — ver Comandos de voz) durante una ráfaga PTT disparan una alerta master-caution critical directamente desde el cliente, con la posición mapeada del hablante como ubicación de la alerta. Este es el único caso en que la webapp escribe una alerta (con una etiqueta source: 'voice') para difusión inmediata a todo el equipo.

Elementos aspiracionales

  • Coincidencias de watchlist en detección → alerta de copiloto — que YOLO encuentre una coincidencia de watchlist registraría una alerta de detection-hit. La infraestructura existe; aún no está cableada.
  • Enrutamiento de alertas más allá del filtro CAS — el listener se ampliará.

Relacionado