feat(flex): chase a split pile-up on the skimmer's report marker

Working a DXpedition split means guessing where it listens. The useful
information is not the callsign the DX answered but the FREQUENCY that
station was calling on, and a CW skimmer already marks it: SDC posts each
decoded report to the panadapter as a spot.

Those spots reach OpsLog through the radio's spot feed. On a marker, the
TRANSMIT slice moves there plus a signed offset; the receive slice never
moves, because losing the DX is worse than missing a call. The marker
text is a setting -- it is chosen in SDC by the operator, so any constant
here would be wrong for whoever chose otherwise -- and the switch is a
button beside SPLIT, since it is turned on when a DXpedition appears and
off when it is worked.

Moves are throttled and ignore a marker landing where the slice already
is: a busy pile-up produces several reports a second and the slice would
otherwise never be anywhere long enough to call.

The spot feed is now subscribed to unconditionally. It was tied to
OpsLog's own spot overlay, so an operator running SDC with the overlay
off received nothing -- the reason no foreign spot was ever logged. The
connect-time 'spot clear' stays behind the overlay flag: it wipes every
spot on the radio, a skimmer's included.
This commit is contained in:
2026-08-23 18:49:40 +02:00
parent 65991be09d
commit 2dd68da284
10 changed files with 356 additions and 8 deletions
+6
View File
@@ -471,6 +471,8 @@ export function GetFlexBandAntennas():Promise<Record<string, main.FlexBandAnt>>;
export function GetFlexBandPower():Promise<Record<string, main.FlexBandPower>>;
export function GetFlexRSTChase():Promise<main.FlexRSTChase>;
export function GetFlexState():Promise<cat.FlexTXState>;
export function GetFlexZoom():Promise<main.FlexZoomSettings>;
@@ -991,6 +993,8 @@ export function SaveFlexBandAntennas(arg1:Record<string, main.FlexBandAnt>):Prom
export function SaveFlexBandPower(arg1:Record<string, main.FlexBandPower>):Promise<void>;
export function SaveFlexRSTChase(arg1:main.FlexRSTChase):Promise<void>;
export function SaveFlexZoom(arg1:main.FlexZoomSettings):Promise<void>;
export function SaveFolderSync(arg1:main.FolderSyncConfig):Promise<void>;
@@ -1093,6 +1097,8 @@ export function SetCompactMode(arg1:boolean):Promise<void>;
export function SetDVKLabel(arg1:number,arg2:string):Promise<void>;
export function SetFlexRSTChaseEnabled(arg1:boolean):Promise<void>;
export function SetKenwoodKeySpeed(arg1:number):Promise<void>;
export function SetLinkedAmps(arg1:Array<string>):Promise<void>;
+12
View File
@@ -882,6 +882,10 @@ export function GetFlexBandPower() {
return window['go']['main']['App']['GetFlexBandPower']();
}
export function GetFlexRSTChase() {
return window['go']['main']['App']['GetFlexRSTChase']();
}
export function GetFlexState() {
return window['go']['main']['App']['GetFlexState']();
}
@@ -1922,6 +1926,10 @@ export function SaveFlexBandPower(arg1) {
return window['go']['main']['App']['SaveFlexBandPower'](arg1);
}
export function SaveFlexRSTChase(arg1) {
return window['go']['main']['App']['SaveFlexRSTChase'](arg1);
}
export function SaveFlexZoom(arg1) {
return window['go']['main']['App']['SaveFlexZoom'](arg1);
}
@@ -2126,6 +2134,10 @@ export function SetDVKLabel(arg1, arg2) {
return window['go']['main']['App']['SetDVKLabel'](arg1, arg2);
}
export function SetFlexRSTChaseEnabled(arg1) {
return window['go']['main']['App']['SetFlexRSTChaseEnabled'](arg1);
}
export function SetKenwoodKeySpeed(arg1) {
return window['go']['main']['App']['SetKenwoodKeySpeed'](arg1);
}
+18
View File
@@ -2537,6 +2537,24 @@ export namespace main {
this.body = source["body"];
}
}
export class FlexRSTChase {
enabled: boolean;
markers: string;
offset_hz: number;
split_only: boolean;
static createFrom(source: any = {}) {
return new FlexRSTChase(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.enabled = source["enabled"];
this.markers = source["markers"];
this.offset_hz = source["offset_hz"];
this.split_only = source["split_only"];
}
}
export class FlexZoomSettings {
enabled: boolean;
cw_khz: number;