feat(sat): Doppler tracking on the radio
The hard part of satellite tuning is not the arithmetic, it is deciding who owns the dial. A tracker that forces both frequencies fights the operator every time they turn the knob to follow a station across a linear transponder; one that never touches the receiver leaves them chasing a signal that slides nine kilohertz across a 70 cm pass. So the operator owns the receiver and the tracker follows them. Every second it asks the radio where the receiver actually is. Where it put it, nothing has changed. Further than a dial-turn's tolerance, and the operator has chosen a station: what they landed on is converted back into a nominal frequency, and the transmitter is derived from that. Which is the division of labour on a linear bird — the operator listens, the radio does the sums. Three ways to reach the radio, because a satellite pair is a shape of operating rather than a manufacturer's feature. An IC-9700 or IC-9100 is asked for its OWN satellite mode: it pairs main and sub, gives full duplex, and keeps the dials linked the way its designers meant, which is always better than an imitation built out of split. A Flex gets two slices, A the downlink and B the uplink, created when missing, because "slice B does not exist" is not something to make an operator fix at the start of a ten-minute pass. Everything else gets the downlink, and is told so — half the job announced beats half the job hidden. What goes in the log is the NOMINAL pair. Two stations working each other through a transponder read different numbers off their dials at the same instant; the only figure they can both agree on is the transponder's own. FREQ is the uplink and FREQ_RX the downlink — the one place a satellite QSO differs from every other kind, and the reason FREQ alone cannot describe one.
This commit is contained in:
Vendored
+6
@@ -605,6 +605,8 @@ export function GetSatellitePositions(arg1:Array<string>):Promise<Array<sat.Posi
|
||||
|
||||
export function GetSatelliteTLEInfo():Promise<main.SatTLEInfo>;
|
||||
|
||||
export function GetSatelliteTracking():Promise<main.SatTrackStatus>;
|
||||
|
||||
export function GetSatelliteTuning(arg1:string,arg2:number,arg3:number):Promise<main.SatTuning>;
|
||||
|
||||
export function GetScpStatus():Promise<main.ScpStatus>;
|
||||
@@ -1379,10 +1381,14 @@ export function SetYaesuVOX(arg1:boolean):Promise<void>;
|
||||
|
||||
export function StartCWDecoder():Promise<void>;
|
||||
|
||||
export function StartSatelliteTracking(arg1:string,arg2:number):Promise<void>;
|
||||
|
||||
export function StationSetRelay(arg1:string,arg2:number,arg3:boolean):Promise<void>;
|
||||
|
||||
export function StopCWDecoder():Promise<void>;
|
||||
|
||||
export function StopSatelliteTracking():Promise<void>;
|
||||
|
||||
export function SwitchCATRig(arg1:number):Promise<void>;
|
||||
|
||||
export function SyncFolderNow():Promise<number>;
|
||||
|
||||
@@ -1142,6 +1142,10 @@ export function GetSatelliteTLEInfo() {
|
||||
return window['go']['main']['App']['GetSatelliteTLEInfo']();
|
||||
}
|
||||
|
||||
export function GetSatelliteTracking() {
|
||||
return window['go']['main']['App']['GetSatelliteTracking']();
|
||||
}
|
||||
|
||||
export function GetSatelliteTuning(arg1, arg2, arg3) {
|
||||
return window['go']['main']['App']['GetSatelliteTuning'](arg1, arg2, arg3);
|
||||
}
|
||||
@@ -2690,6 +2694,10 @@ export function StartCWDecoder() {
|
||||
return window['go']['main']['App']['StartCWDecoder']();
|
||||
}
|
||||
|
||||
export function StartSatelliteTracking(arg1, arg2) {
|
||||
return window['go']['main']['App']['StartSatelliteTracking'](arg1, arg2);
|
||||
}
|
||||
|
||||
export function StationSetRelay(arg1, arg2, arg3) {
|
||||
return window['go']['main']['App']['StationSetRelay'](arg1, arg2, arg3);
|
||||
}
|
||||
@@ -2698,6 +2706,10 @@ export function StopCWDecoder() {
|
||||
return window['go']['main']['App']['StopCWDecoder']();
|
||||
}
|
||||
|
||||
export function StopSatelliteTracking() {
|
||||
return window['go']['main']['App']['StopSatelliteTracking']();
|
||||
}
|
||||
|
||||
export function SwitchCATRig(arg1) {
|
||||
return window['go']['main']['App']['SwitchCATRig'](arg1);
|
||||
}
|
||||
|
||||
@@ -4136,6 +4136,42 @@ export namespace main {
|
||||
return a;
|
||||
}
|
||||
}
|
||||
export class SatTrackStatus {
|
||||
on: boolean;
|
||||
name: string;
|
||||
transponder: string;
|
||||
mode: string;
|
||||
nominal_down: number;
|
||||
nominal_up: number;
|
||||
down_hz: number;
|
||||
up_hz: number;
|
||||
az: number;
|
||||
el: number;
|
||||
visible: boolean;
|
||||
radio: string;
|
||||
error: string;
|
||||
|
||||
static createFrom(source: any = {}) {
|
||||
return new SatTrackStatus(source);
|
||||
}
|
||||
|
||||
constructor(source: any = {}) {
|
||||
if ('string' === typeof source) source = JSON.parse(source);
|
||||
this.on = source["on"];
|
||||
this.name = source["name"];
|
||||
this.transponder = source["transponder"];
|
||||
this.mode = source["mode"];
|
||||
this.nominal_down = source["nominal_down"];
|
||||
this.nominal_up = source["nominal_up"];
|
||||
this.down_hz = source["down_hz"];
|
||||
this.up_hz = source["up_hz"];
|
||||
this.az = source["az"];
|
||||
this.el = source["el"];
|
||||
this.visible = source["visible"];
|
||||
this.radio = source["radio"];
|
||||
this.error = source["error"];
|
||||
}
|
||||
}
|
||||
|
||||
export class SatTuning {
|
||||
name: string;
|
||||
|
||||
Reference in New Issue
Block a user