Releases: disturbedkh/scanner-manager
Releases · disturbedkh/scanner-manager
Scanner Manager 0.9.0b2
First beta release on GitHub. Big jump from v0.9.0a2: a
real-map heatmap that scales, multiple virtual SD card profiles with
snapshot history, comprehensive deleted-tower visibility, a
user-facing language cleanup, and a backend driver layer that readies
the app for more than one scanner model without any frontend changes
today.
Highlights
- Coverage Heatmap rebuilt on real map tiles with smooth zoom,
tower clustering, scanner-button simulation, and a grayed-out
overlay of removed towers. - Workspaces now hold multiple virtual SD card profiles with
snapshot history; one click to swap which profile lives on the
physical card, automatic pre-swap snapshot of the outgoing profile. - Plain-English UI sweep across tooltips, dialogs, status text,
and the wiki, governed by a new style guide and a tone linter. - Scanner-profile driver layer abstracts every BearTracker-885
specific assumption behind aScannerProfileinterface, ready for
additional models.
Added - Coverage tools
- Map-tile heatmap.
CoverageHeatmapDialogrenders on real
OpenStreetMap / Google tiles whentkintermapviewis installed,
with a tile-provider dropdown and tower-marker toggle. Falls back
to the legacy Tk-canvas density grid when the map extra is missing. - Heatmap performance. Intensity is quantized into a handful of
buckets and adjacent same-bucket cells are merged into rectangles
before hand-off totkintermapview. On realistic inputs this cuts
the number of polygons the map view has to reproject on each
zoom/pan from 700+ cells down to ~60 rectangles. Default grid
resolution tightened from 60 to 36. - Tower clustering. Co-located repeaters collapse into a single
marker on both the heatmap andCoverageMapDialog. Clicking the
marker opensTowerClusterDialog- a tree of every system / group
homed on that tower, so sites shared by multiple trunked systems no
longer paint unreadable stacks of overlapping labels. - Span actually prunes markers. Changing the heatmap's Span (mi)
field now limits not just the heat grid but also which tower
markers and coverage circles render. Zooming to 5 mi shows only the
towers inside that box. - Per-tower coverage circles. New Show coverage circles toggle
outlines each active tower's advertised radius on the heatmap. - Scanner button simulation on the heatmap. Police / Fire / EMS /
DOT / Multi checkboxes plus an Other types toggle mirror the
main toolbar's filter so the heatmap shows exactly what the scanner
will scan for a given button combo. - Removed-tower overlay. A Show removed towers (grayed) toggle
draws every group or system the user has deleted since the last
SD-card sync as a gray marker (and optional gray coverage ring),
making it obvious what was pruned vs. what still lives on the card. - Comprehensive deleted-tower diff. Detection no longer relies on
delete events alone. The overlay parses the.session.baksession
snapshot (the real HPD file as it was when you opened it), diffs
it against the live tree, and unions in any unreverted delete
events. Whole deleted systems, bulk-entry cleanups that emptied a
group, and external edits all surface uniformly.
Added - Workspaces and profiles
- Multiple virtual SD card profiles with snapshot history. Each
workspace now keeps a per-profile snapshot vault under
<profile_dir>/.snapshots/. Newsdcard.snapshot_workspace/
sdcard.restore_snapshot/sdcard.prune_snapshotsroutines power
one-click Activate on SD card, Snapshots..., and Restore
Snapshot... entries on the Workspaces manager. Activation
automatically takes a pre-swap snapshot of the outgoing profile.
Retention policy (max count, keep-manual flag) is stored per
profile inGlobalMetaStore. - Toolbar Swap Profile button plus a per-profile entry on the
Restore Session menu, alongside the single legacy
.session.bak.
Added - Scanner-profile driver layer
scanner_profiles/package encapsulates every scanner-specific
piece of behavior behind aScannerProfileABC. The BearTracker
885 lives inscanner_profiles.bt885asBt885Profile, registered
as the default.scanner_manager.ACTIVE_PROFILEis the single
entry point; hot paths (entry_passes_button_filter,
_rr_trs_mode_to_hpd,_detect_updater_path's installer
preference order) route through it.- Sidecars get a new nullable
scanner_profile_idfield. data/scanner_profiles.jsonships the manifest of known
profiles.docs/adding-a-scanner.mdwalks through adding a new profile.
Changed - Language
- Plain-English UI sweep. Rewrote
SERVICE_TYPE_HELP_TEXTto lead
with user outcomes, moved numeric service-type IDs into an
"Advanced" paragraph. Status pill reads Update pipeline: Ready /
Needs attention / Blocked instead of traffic-light colors.
Tooltips on the service-type and mode columns explain what the
control does in user terms. The MetaStore dialog is now
Change History; the RadioReference URL hint talks about pasting
URLs instead of editingcid=parameters; the TGID-edit mode blurb
no longer opens with FDMA/TDMA acronyms; encrypted-talkgroup
guidance leads with "the BearTracker 885 can't play them." - Wiki sweep.
Channel-List-Management.md,
RadioReference-Import.md,Quickstart.md, andGlossary.md
replace opcode-level jargon with plain English; remaining
internals are parked under explicit Internals headings. - Development status. Classifier bumped from alpha to beta;
about-dialog subtitle updated to match.
Added - Tooling
scripts/check_wiki_tone.pylintswiki/*.mdagainst a
denylist of developer-jargon strings forbidden in user-facing copy.
Developer-by-design pages (Architecture.md) are exempt; per-page
## Internalssections are exempt too.docs/style-guide.mdcodifies the three rules that govern
user-facing text: lead with outcome, park internals under
Internals heading, no scaffolding phrases.tests/test_coverage_maps.py,tests/test_profiles_and_snapshots.py,
tests/test_scanner_profiles.py,tests/test_bt885_parity.py.
The parity suite locks every BT885 constant down against the new
profile methods so the refactor never silently drifts.
Internals
- New helpers in
coverage_maps.py:quantize_intensity,
heat_rectangles,rectangle_polygon,iter_coverage_items,
iter_coverage_circles,iter_deleted_tower_items,
iter_deleted_tower_items_comprehensive,
iter_hpd_session_snapshot_items,cluster_tower_points,
cluster_passes_button_filter,clusters_within_span. metastore.GlobalMetaStore.upsert_profilenow initializes
snapshots,retention, andscanner_profile_idfields for every
profile it stores. Pre-existing profiles are upgraded lazily on
read.- New constants in
sdcard.py:SNAPSHOT_DIRNAME,
SNAP_REASON_MANUAL,SNAP_REASON_PRE_SWAP,
SNAP_REASON_PRE_RESTORE,SNAP_REASON_AUTO,
DEFAULT_MAX_SNAPSHOTS. Snapshot payloads are content-hashed
(SHA-256) for deduplication. - PyInstaller spec
dataslist addsscanner_profiles/and
data/scanner_profiles.json.
Scanner Manager 0.9.0a2
Cross-platform alpha. Scanner Manager now builds and runs on Windows,
macOS, and Linux. The Uniden vendor tools (Sentinel, BT885 Update
Manager) remain Windows-only because Uniden doesn't publish macOS /
Linux builds of them; the Uniden Tools panel now shows a clear
"Windows only" notice on other platforms instead of appearing broken.
Added
- macOS and Linux builds. Tag-triggered release workflow now
matrix-builds onwindows-latest,macos-latest, and
ubuntu-latest, attachingScannerManager-windows-x64.zip,
ScannerManager-macos.tar.gz, andScannerManager-linux-x64.tar.gz
(plus per-file SHA-256 sidecars) to every GitHub Release. - macOS
.appbundle. PyInstaller spec now emits a proper
ScannerManager.appwithInfo.plist(display name, version,
removable-volume usage description). Bundle identifier:
org.disturbedkh.scanner-manager. - Cross-platform file-manager opener. "Open Data Folder" now
usesos.startfileon Windows,openon macOS, andxdg-open
on Linux. - CI smoke-import check. CI now asserts every top-level module
imports cleanly on all three OSes before running the test matrix.
Changed
- PyInstaller spec is single-source. One
packaging/scanner-manager.spec
now branches onsys.platformto produce a Windows EXE, a macOS
.app, or a Linux binary. Icon selection prefersicon.icnson
macOS when present, else falls back toicon.ico. - Uniden Tools detection is OS-aware.
_candidate_exe_paths()
returns an empty list on non-Windows (truthfully, there's nowhere
real to look) and normalizes path separators so the unit tests
exercise the detection code on Linux CI runners too. - PyInstaller-aware state dir. When running from a frozen bundle,
app_settings.json/ MetaStore /.session.baklive next to the
binary instead of inside_MEIPASS(which is wiped on exit). - Bundled resource lookup. Added
bundled_resources_dir()so
data/uniden_installers.jsonanddata/zip_county_map_sample.json
are read from_MEIPASSwhen frozen and from the checkout dir
otherwise. - CI matrix extended to macOS.
.github/workflows/ci.ymlnow
runs onmacos-latest(py3.11 + py3.12) alongside Windows and
Ubuntu.
Fixed
test_detect_picks_up_installed_exewas red on Ubuntu CI. Root
cause was hard-coded backslash separators in the Uniden installer
relpaths plus%VAR%env expansion that only works on Windows.
Detection now normalizes separators and reads env vars directly,
so the same test passes on all three OSes.