feat: Super Check Partial + N+1 helper; fix Flex binding to SmartSDR CAT; telemetry callsign wait
- SCP/N+1: new internal/scp downloads the community MASTER.SCP master list and a docked two-column widget shows, as you type a call, the known calls containing it (Partial) and the calls one edit away (N+1) — click to fix a busted call. Opt-in in Settings → General; top-bar toggle; queried debounced on callsign input. - Flex: OpsLog's GUI-client detection was too loose and could bind to "SmartSDR CAT" (or DAX) — both carry "smartsdr" in the program name — instead of the real GUI client, making SmartSDR CAT drop and reconnect in a loop while OpsLog was open. Now it binds only to a real SmartSDR/Maestro GUI client (e.g. a FLEX-8600M's integrated screen) and excludes cat/dax; dropped the risky empty-program fallback. - Telemetry: on a fresh install the callsign isn't set at launch, so the once-a-day heartbeat recorded the machine UUID. Now it waits (~10 min) for the operator to enter their callsign before sending, falling back to the UUID only if none appears.
This commit is contained in:
+22
-4
@@ -88,12 +88,30 @@ func (a *App) sendTelemetryHeartbeat() {
|
||||
// distinct_id identifies the USER. Prefer the station callsign — it's stable
|
||||
// across every machine/reinstall the same operator runs, so one op counts as
|
||||
// one user (a callsign is public in amateur radio). The random per-install ID
|
||||
// is only a fallback until a callsign is configured; without it the same op on
|
||||
// a laptop + desktop + Maestro showed up as three "users". install_id rides
|
||||
// along as a property so multiple machines under one callsign stay visible.
|
||||
// is only a fallback; without it the same op on a laptop + desktop + Maestro
|
||||
// showed up as three "users". install_id rides along as a property so multiple
|
||||
// machines under one callsign stay visible.
|
||||
//
|
||||
// On a FRESH INSTALL the callsign isn't configured yet at launch, so sending
|
||||
// straight away would record the machine's random UUID (and the once-a-day lock
|
||||
// would then keep it that way even after the op enters their call). Instead wait
|
||||
// a while for the callsign to appear (Settings → Station Information) and only
|
||||
// fall back to the UUID if none shows up within the grace window — so a genuine
|
||||
// no-callsign install is still counted, but the normal case gets the callsign.
|
||||
call := a.activeCallsign()
|
||||
for i := 0; call == "" && i < 60; i++ { // up to ~10 min (60 × 10 s)
|
||||
time.Sleep(10 * time.Second)
|
||||
if a.settings == nil || !a.GetTelemetryEnabled() {
|
||||
return // disabled meanwhile
|
||||
}
|
||||
if last, _ := a.settings.GetGlobal(a.ctx, keyTelemetryLastSent); strings.TrimSpace(last) == today {
|
||||
return // sent by another path in the meantime
|
||||
}
|
||||
call = a.activeCallsign()
|
||||
}
|
||||
installID := a.telemetryInstallID()
|
||||
distinctID := installID
|
||||
if call := a.activeCallsign(); call != "" {
|
||||
if call != "" {
|
||||
distinctID = call
|
||||
}
|
||||
payload := map[string]any{
|
||||
|
||||
Reference in New Issue
Block a user