Enhanced Dashboard

This commit is contained in:
2026-09-01 17:46:12 +02:00
parent 637926c3ae
commit 2ec8251605
3 changed files with 265 additions and 159 deletions
+39 -1
View File
@@ -120,6 +120,9 @@ class OpenBridgeRxClient(asyncio.DatagramProtocol):
src_id = int.from_bytes(data[5:8], 'big')
tg_arrivo = str(int.from_bytes(data[8:11], 'big'))
# Traccia il traffico a prescindere da chi lo ascolta
self.server_app.aggiorna_traffico_globale(src_id, tg_arrivo)
# Ricava l'elenco dei TG attualmente richiesti da almeno un utente Web
tg_attivi = {client_data["tg"] for client_data in self.server_app.clients.values()}
@@ -156,6 +159,27 @@ class WebDmrServer:
# Dizionario stati indipendenti per TG: "222" -> {"rx_in_corso": False, ...}
self.tg_states = {}
# Dizionario globale traffico
self.traffico_globale = {}
def aggiorna_traffico_globale(self, src_id, tg):
"""Aggiorna il monitor globale e avvisa i client se c'è un nuovo TX"""
ora = time.time()
nuovo = tg not in self.traffico_globale or self.traffico_globale[tg]["src_id"] != src_id
self.traffico_globale[tg] = {"src_id": src_id, "time": ora}
if nuovo:
print(f"[Traffico Globale] Rilevato TX su TG {tg} da ID {src_id}") # <--- AGGIUNGI QUESTA RIGA
asyncio.create_task(self.invia_stato_traffico())
async def invia_stato_traffico(self):
"""Invia la lista dei TG attivi a tutti i WebSocket connessi"""
attivi = [{"tg": k, "src": cerca_nominativo(v["src_id"])} for k, v in self.traffico_globale.items()]
msg_str = json.dumps({"action": "global_traffic", "data": attivi})
for ws in list(self.clients.keys()):
try: await ws.send_str(msg_str)
except Exception: pass
def ricevi_frame_dmr(self, ambe_frames, src_id, tg):
if tg not in self.tg_states:
@@ -181,10 +205,12 @@ class WebDmrServer:
asyncio.create_task(self.processa_audio_dmr(ambe_frames, tg))
async def watchdog_rx(self):
"""Monitora il silenzio e ripristina lo stato per i singoli TG"""
"""Monitora il silenzio e ripristina lo stato per i singoli TG e per il traffico globale"""
while True:
await asyncio.sleep(0.4)
ora = time.time()
# Watchdog TG sintonizzati
for tg, stato_tg in list(self.tg_states.items()):
if stato_tg["rx_in_corso"] and (ora - stato_tg["ultimo_frame_time"] > 1.2):
stato_tg["rx_in_corso"] = False
@@ -195,6 +221,15 @@ class WebDmrServer:
"text": "IN ASCOLTO",
"active": False
})
# Watchdog traffico globale
cambiamento = False
for tg in list(self.traffico_globale.keys()):
if ora - self.traffico_globale[tg]["time"] > 1.5:
del self.traffico_globale[tg]
cambiamento = True
if cambiamento:
await self.invia_stato_traffico()
async def processa_audio_dmr(self, ambe_27_bytes, tg):
try:
@@ -264,6 +299,9 @@ async def websocket_handler(request):
print(f"[WebSocket] Nuovo client connesso (Totali: {len(server_app.clients)}/{MAX_UTENTI_WEB})")
try:
# Invia subito lo stato del traffico globale al nuovo connesso
await server_app.invia_stato_traffico()
async for msg in ws:
if msg.type == web.WSMsgType.TEXT:
dati = json.loads(msg.data)