Enhanced Dashboard
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user