Skip to content

POCSAG Pager Monitor

hardcoreerik edited this page Sep 29, 2026 · 3 revisions

POCSAG Pager Monitor

The populated pictures and test results below document an earlier controlled test. Current empty-state device captures appear at the end and are indexed in Screenshot Catalog. Session messages remain RAM-only.

Status: verified in a controlled in-house test. OrcSDR Tab5 decodes the tested POCSAG 1200 transmission at 433.920 MHz. Field reception depends on local paging systems, modulation, signal quality, and applicable regulations.

First use

Choose a frequency and baud rate appropriate to a local, authorized signal, attach a suitable antenna, and watch Signal before expecting messages on Live. The controlled test pictured below is historical; current empty screenshots do not demonstrate a fresh decode.

Monitor views

The monitor keeps the receiver state, newest message, recent-session inbox, and FEC health visible together. The message list and CAPCODE directory are local to the Tab5. The Session tab intentionally states when no messages are retained: session messages are RAM-only and clear on restart.

Live

Live pager monitor showing the verified TEST message

The newest-message card identifies the CAPCODE, POCSAG function, message type, baud rate, decode quality, and receive age. The inbox keeps recent messages in arrival order. The button states SCAN n FREQS before discovery starts, so the operator can see the active profile size. It becomes Stop Scan while discovery is active.

Frequency profiles and discovery

The Live screen is built to discover POCSAG frequencies. During a scan it shows SCANNING POCSAG FREQUENCIES, the exact candidate frequency, CHANNEL n OF n, and measured progress. OrcSDR dwells four seconds per candidate and tunes to a winner only after observing BCH-valid paging data. A corrected-only result is reported as weak evidence rather than a confirmed channel.

The frequency database is the SD-card file /orcsdr/pocsag_scan.cfg: one Hz frequency per non-comment line. It is intentionally user-editable so a device can use a regional or national profile anywhere in the world. OrcSDR does not ship a Lane County list. If no usable file is present, it uses a small generic US paging seed as a starting point; it is not a global frequency claim and it does not imply that every listed channel carries POCSAG.

# Profile: region or service area
# Source: public licensing record, monitoring notes, or operator authorization
# Reviewed: YYYY-MM-DD
433920000

Maintain profile files by region on a computer, retain the source and review date for each candidate, and copy the chosen profile to the SD card before scanning. The CAPCODE directory is a separate local database, populated only by pages the Tab5 has decoded; it does not identify a transmitter by frequency.

IDs

CAPCODE directory and selected ID detail

The directory is built from CAPCODEs observed by the current session. Selecting an ID shows its hit count, group, last-seen time, and most recent retained message. Alias and group editing remain follow-up work.

Signal

Decoder status, soft decisions, and FEC quality

Signal view exposes the measured decoder state: lock, detected baud, polarity, FSK deviation, sync losses, codeword outcomes, recent soft decisions, and FEC history. The two buttons cycle the receiver's Baud and Polarity controls; a change resets decoding briefly while it resynchronizes.

Session

Empty Session tab after a restart

The Session view provides a selectable recent-message list and full retained message detail. This capture was taken immediately after a reboot and correctly shows the empty state; it is not a claim that the verified message history is persistent.

Verified lab transmission

The test used an in-house OrcPager quick app on a M5Stack Cardputer ADV. Its CC1101 transmitted a POCSAG alpha page with these fixed test settings:

Setting Value
Frequency 433.920 MHz
Baud rate 1200
Power -30 dBm configured
CAPCODE 1234560
Text TEST
Repeats 3 per trigger

The same transmissions were independently received and decoded on a Flipper Zero using the POCSAG_Pager application. That gave us an independent receiver-side check that the test signal was valid before diagnosing the Tab5 path.

On the Tab5, after the receiver fix, serial telemetry reported POCSAG 1200, inverted polarity, 14 decoded messages, 224 valid codewords, no corrected or uncorrectable codewords, and zero USB or application IQ drops. The operator also confirmed 1234560 and TEST in the Tab5 message list.

The clean dashboard captures above are from a later fresh-boot run of the same three-repeat test: three displayed TEST messages, 48 valid codewords, and no corrected or uncorrectable codewords.

What was fixed

The initial implementation could render RF activity but still miss pager messages. Capture and replay isolated three contributing issues:

  • full-rate double-precision DSP work caused application IQ blocks to drop;
  • the measured transmitter tones were displaced from the receiver LO, so the old discriminator rate could wrap their phase;
  • symbol phase tracking mixed adjacent symbols around transitions.

The decoder now uses bounded single-precision boxcar sums, discriminates before the final reduction to 38.4 kS/s, centers carrier offset, and makes one-sample symbol-boundary corrections. The host test suite covers both polarities, arbitrary phase, ±6 kHz and ±13.5 kHz offsets, and ±1% symbol clock error.

This implementation was developed independently. The Flipper project was read only to compare observable protocol behavior and test parameters; no Flipper code was copied or redistributed.

Verification boundaries

The source tests, firmware build, app-only flash, serial counters, and on-screen message confirmation are separate evidence:

  • tools/test-pocsag-core.ps1 passed optimized and ASan/LSan/UBSan runs.
  • tools/test-pocsag-store.ps1 and tools/test-radio-scan.sh passed.
  • The native ESP-IDF build passed.
  • The app image was flashed only at 0x10000; the transfer reported a verified data hash. Bootloader, partitions, and NVS were not rewritten.
  • The final UI image SHA-256 is 9d081e6c935e130aa0f26becf21357e529cee2a69a9147af13c28bc0bb7918cc.

This is a successful test of the stated 433.920 MHz / 1200 baud setup. It does not establish sensitivity, long-term reliability, or live 512/2400 baud acceptance.

Screens on the Tab5

These are actual 1280 × 720 Tab5 captures from 29 September 2026, using PNG-capable source 897c60a. They show the interface, not proof of reception. Live and demo refer to capture mode; the source is newer than the published release binary. See Screenshot Catalog for file hashes and provenance.

These current empty-state captures differ from the older controlled-transmission pictures above.

Live (live)

Live view on Tab5, live capture

Ids (live)

Ids view on Tab5, live capture

Signal (live)

Signal view on Tab5, live capture

Activity (live)

Activity view on Tab5, live capture

Session (live)

Session view on Tab5, live capture

Development and verification

PR #63: offset-signal decoding and monitor records the implementation. The controlled 1200-baud result below is a specific test, not broad field acceptance. The published release identifies the installed package. A merged PR or source test alone does not establish live reception on every setup. Screenshots from the later capture build are identified in Screenshot Catalog.

Clone this wiki locally