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

+2 -1
View File
@@ -19,7 +19,8 @@ class TestGsmtapSubtypeMapping(unittest.TestCase):
def test_standard_subtypes(self):
self.assertEqual(gsmtap_msg_type(0x00), 'tpdu')
self.assertEqual(gsmtap_msg_type(0x01), 'atr')
self.assertEqual(gsmtap_msg_type(0x02), 'tpdu') # PPS combined
self.assertEqual(gsmtap_msg_type(0x02), 'pps') # PPS request
self.assertEqual(gsmtap_msg_type(0x03), 'pps') # PPS response
class _FakeBackend: