панель: живой хотспот выглядел мёртвым

Мастер считает время по monotonic, панель по time.time(). В зеркале состояния
last_seen не обновлялся вовсе, поэтому «простой» рос вместе со временем в сети:
хотспот, живой 44 минуты, показывался как молчащий 44 минуты. Оператор решил бы,
что связь отвалилась.

Заодно счётчик принятых кадров: был вечный ноль, теперь считается в маршрутизаторе.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XvX94Vwy7vXWEuiFm1g9Av
Этот коммит содержится в:
2026-07-29 01:17:07 +09:00
co-authored by Claude Opus 4.8
родитель 8e3b9144c3
Коммит 47cb85327a
2 изменённых файлов: 11 добавлений и 0 удалений
+6
Просмотреть файл
@@ -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)
+5
Просмотреть файл
@@ -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)