From 47cb85327adf0c55b172d857acf86dff454cee02 Mon Sep 17 00:00:00 2001 From: viktor Date: Wed, 29 Jul 2026 01:17:07 +0900 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D1=8C:=20=D0=B6?= =?UTF-8?q?=D0=B8=D0=B2=D0=BE=D0=B9=20=D1=85=D0=BE=D1=82=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D1=82=20=D0=B2=D1=8B=D0=B3=D0=BB=D1=8F=D0=B4=D0=B5=D0=BB=20?= =?UTF-8?q?=D0=BC=D1=91=D1=80=D1=82=D0=B2=D1=8B=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Мастер считает время по monotonic, панель по time.time(). В зеркале состояния last_seen не обновлялся вовсе, поэтому «простой» рос вместе со временем в сети: хотспот, живой 44 минуты, показывался как молчащий 44 минуты. Оператор решил бы, что связь отвалилась. Заодно счётчик принятых кадров: был вечный ноль, теперь считается в маршрутизаторе. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01XvX94Vwy7vXWEuiFm1g9Av --- dmrsrv/__main__.py | 6 ++++++ dmrsrv/router.py | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/dmrsrv/__main__.py b/dmrsrv/__main__.py index e9100b1..74df845 100644 --- a/dmrsrv/__main__.py +++ b/dmrsrv/__main__.py @@ -10,6 +10,7 @@ import asyncio import contextlib import signal import sys +import time from . import config as cfgmod from . import log as logmod @@ -47,6 +48,11 @@ def _wire_state(master: HomebrewMaster, state: State) -> None: sp.colorcode = cfgp.get("colorcode", "") sp.rx_freq = cfgp.get("rx_freq", "") sp.tx_freq = cfgp.get("tx_freq", "") + # Мастер считает время по monotonic, панель — по time.time(). + # Без пересчёта панель показывала «простой» равным времени в сети, + # то есть живой хотспот выглядел мёртвым. + if p.last_seen: + sp.last_seen = time.time() - max(0.0, master._now() - p.last_seen) for pid in list(state.peers): if pid not in master.peers: gone = state.peer_del(pid) diff --git a/dmrsrv/router.py b/dmrsrv/router.py index 3a0e4e7..eb43950 100644 --- a/dmrsrv/router.py +++ b/dmrsrv/router.py @@ -75,6 +75,11 @@ class Router: # ── собственно маршрут ────────────────────────────────────────────────── def route(self, peer_id: int, dmr, connected: list[int]) -> list[int]: + # счётчик принятых кадров для панели: иначе там вечный ноль + if self.state is not None: + sp = self.state.peer_get(peer_id) + if sp is not None: + sp.rx_packets += 1 # запоминаем, через какой хотспот слышали передающего if dmr.src: self.set_radio_loc(dmr.src, peer_id)