Decode standard PPS sub-types + RST CLK extension → ATR data rate

- capture.py: map GSMTAP PPS request/response (0x02/0x03) to 'pps',
  matching the pcap-import mapping (was decoded as TPDU live)
- decode.py: parse the optional RST CLK extension (sigrok v1.9.0+,
  payload flag bit 0); ATR gains clk_hz/data_rate/etu_us derived from
  TA1 Fi/Di (data_rate = clk_hz × D / F)
- database.py: CLK state is consumed by the next ATR (no stale rate
  for an ATR without preceding RST); a late-arriving RST measurement
  is backfilled onto the ATR it belongs to; replay context carries
  the CLK across pagination/live polling
- PWA: ATR detail shows CLK/Data rate/ETU; RST event detail shows CLK
- tests: PPS mapping, CLK parse with/without flag, rate math,
  DB consume + backfill round-trips
- README/RUS updated
- Bump 1.22.18, SW cache v49->v50
This commit is contained in:
catarrh committed 2026-09-18 00:30:26 +03:00
1 parent c2f605a391
commit a46667d93f
12 files changed
+211 -40

No files matched your search

+6 -2
View File
@@ -7,6 +7,7 @@ import time
import traceback
from ..gsmtap import (GsmtapReceiver, GSMTAP_SIM_ATR,
GSMTAP_SIM_PPS_REQ, GSMTAP_SIM_PPS_RSP,
GSMTAP_SIM_RST_EVENT, GSMTAP_SIM_VCC_EVENT)
@@ -22,11 +23,14 @@ def _log(msg):
def gsmtap_msg_type(sub_type):
"""Map a GSMTAP-SIM sub_type to a stored message type.
Custom sigrok-iso7816-stream line events (0x10/0x11) become 'rst'/'vcc';
everything except ATR defaults to 'tpdu'.
PPS request/response (0x02/0x03, standard GSMTAP) become 'pps'; custom
sigrok-iso7816-stream line events (0x10/0x11) become 'rst'/'vcc';
everything else defaults to 'tpdu'.
"""
return {
GSMTAP_SIM_ATR: 'atr',
GSMTAP_SIM_PPS_REQ: 'pps',
GSMTAP_SIM_PPS_RSP: 'pps',
GSMTAP_SIM_RST_EVENT: 'rst',
GSMTAP_SIM_VCC_EVENT: 'vcc',
}.get(sub_type, 'tpdu')