Skip to content

Releases: disturbedkh/scanner-manager

Scanner Manager 0.9.0b2

25 Apr 03:03

Choose a tag to compare

Pre-release

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 a ScannerProfile interface, ready for
    additional models.

Added - Coverage tools

  • Map-tile heatmap. CoverageHeatmapDialog renders on real
    OpenStreetMap / Google tiles when tkintermapview is 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 to tkintermapview. 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 and CoverageMapDialog. Clicking the
    marker opens TowerClusterDialog - 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.bak session
    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/. New sdcard.snapshot_workspace /
    sdcard.restore_snapshot / sdcard.prune_snapshots routines 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 in GlobalMetaStore.
  • 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 a ScannerProfile ABC. The BearTracker
    885 lives in scanner_profiles.bt885 as Bt885Profile, registered
    as the default. scanner_manager.ACTIVE_PROFILE is 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_id field.
  • data/scanner_profiles.json ships the manifest of known
    profiles.
  • docs/adding-a-scanner.md walks through adding a new profile.

Changed - Language

  • Plain-English UI sweep. Rewrote SERVICE_TYPE_HELP_TEXT to 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 editing cid= 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, and Glossary.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.py lints wiki/*.md against a
    denylist of developer-jargon strings forbidden in user-facing copy.
    Developer-by-design pages (Architecture.md) are exempt; per-page
    ## Internals sections are exempt too.
  • docs/style-guide.md codifies 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_profile now initializes
    snapshots, retention, and scanner_profile_id fields 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 datas list adds scanner_profiles/ and
    data/scanner_profiles.json.

Scanner Manager 0.9.0a2

24 Apr 12:20

Choose a tag to compare

Pre-release

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 on windows-latest, macos-latest, and
    ubuntu-latest, attaching ScannerManager-windows-x64.zip,
    ScannerManager-macos.tar.gz, and ScannerManager-linux-x64.tar.gz
    (plus per-file SHA-256 sidecars) to every GitHub Release.
  • macOS .app bundle. PyInstaller spec now emits a proper
    ScannerManager.app with Info.plist (display name, version,
    removable-volume usage description). Bundle identifier:
    org.disturbedkh.scanner-manager.
  • Cross-platform file-manager opener. "Open Data Folder" now
    uses os.startfile on Windows, open on macOS, and xdg-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 on sys.platform to produce a Windows EXE, a macOS
    .app, or a Linux binary. Icon selection prefers icon.icns on
    macOS when present, else falls back to icon.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.bak live next to the
    binary instead of inside _MEIPASS (which is wiped on exit).
  • Bundled resource lookup. Added bundled_resources_dir() so
    data/uniden_installers.json and data/zip_county_map_sample.json
    are read from _MEIPASS when frozen and from the checkout dir
    otherwise.
  • CI matrix extended to macOS. .github/workflows/ci.yml now
    runs on macos-latest (py3.11 + py3.12) alongside Windows and
    Ubuntu.

Fixed

  • test_detect_picks_up_installed_exe was 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.