feat: multiple amplifiers + SmartSDR v4 DSP filters

Multi-amp: Settings->Amplifier becomes a list (amps.json, legacy single-amp keys auto-migrate to entry #1); one client per enabled amp with per-id bindings (GetAmplifiers/SaveAmplifiers/GetAmpStatuses/AmpOperate/AmpPower/AmpPowerLevel/AmpFanMode); legacy a.pgxl/a.spe/a.acom point at the first enabled amp of each family. Amp cards in FlexPanel and Station Control gain a dropdown to pick the amp; the status bar shows one clickable chip per amp. Use case: two SPEs run in parallel.

Flex v4 DSP (8000/Aurora): NRL/ANFL (lms_nr/lms_anf), NRS (speex_nr), NRF (nrf) with level sliders, RNN (rnnoise) and ANFT on/off — keys per the FlexLib slice docs; the section only shows when the radio reports these keys (dsp_v4 flag), so 6000-series panels are unchanged.
This commit is contained in:
2026-07-22 17:25:10 +02:00
parent 4c75680689
commit b7dd8d4852
12 changed files with 1051 additions and 411 deletions
+34
View File
@@ -36,6 +36,14 @@ export function ActivateProfile(arg1:number):Promise<void>;
export function AddQSO(arg1:qso.QSO):Promise<number>;
export function AmpFanMode(arg1:string,arg2:string):Promise<void>;
export function AmpOperate(arg1:string,arg2:boolean):Promise<void>;
export function AmpPower(arg1:string,arg2:boolean):Promise<void>;
export function AmpPowerLevel(arg1:string,arg2:string):Promise<void>;
export function AntGeniusActivate(arg1:number,arg2:number):Promise<void>;
export function AntGeniusDeselect(arg1:number):Promise<void>;
@@ -210,6 +218,8 @@ export function FlexSetANF(arg1:boolean):Promise<void>;
export function FlexSetANFLevel(arg1:number):Promise<void>;
export function FlexSetANFT(arg1:boolean):Promise<void>;
export function FlexSetAPF(arg1:boolean):Promise<void>;
export function FlexSetAPFLevel(arg1:number):Promise<void>;
@@ -234,6 +244,14 @@ export function FlexSetFilter(arg1:number,arg2:number):Promise<void>;
export function FlexSetKeySpeed(arg1:number):Promise<void>;
export function FlexSetLMSANF(arg1:boolean):Promise<void>;
export function FlexSetLMSANFLevel(arg1:number):Promise<void>;
export function FlexSetLMSNR(arg1:boolean):Promise<void>;
export function FlexSetLMSNRLevel(arg1:number):Promise<void>;
export function FlexSetMic(arg1:number):Promise<void>;
export function FlexSetMicProfile(arg1:string):Promise<void>;
@@ -250,6 +268,10 @@ export function FlexSetNBLevel(arg1:number):Promise<void>;
export function FlexSetNR(arg1:boolean):Promise<void>;
export function FlexSetNRF(arg1:boolean):Promise<void>;
export function FlexSetNRFLevel(arg1:number):Promise<void>;
export function FlexSetNRLevel(arg1:number):Promise<void>;
export function FlexSetPower(arg1:number):Promise<void>;
@@ -262,10 +284,16 @@ export function FlexSetRIT(arg1:boolean):Promise<void>;
export function FlexSetRITFreq(arg1:number):Promise<void>;
export function FlexSetRNN(arg1:boolean):Promise<void>;
export function FlexSetRXAntenna(arg1:string):Promise<void>;
export function FlexSetSidetoneLevel(arg1:number):Promise<void>;
export function FlexSetSpeexNR(arg1:boolean):Promise<void>;
export function FlexSetSpeexNRLevel(arg1:number):Promise<void>;
export function FlexSetSplit(arg1:boolean):Promise<void>;
export function FlexSetTXAntenna(arg1:string):Promise<void>;
@@ -302,6 +330,10 @@ export function GetActiveProfile():Promise<profile.Profile>;
export function GetAlertEmailTo():Promise<string>;
export function GetAmpStatuses():Promise<Array<main.AmpStatus>>;
export function GetAmplifiers():Promise<Array<main.AmpConfig>>;
export function GetAntGeniusSettings():Promise<main.AntGeniusSettings>;
export function GetAntGeniusStatus():Promise<antgenius.Status>;
@@ -738,6 +770,8 @@ export function SaveADIFMonitor(arg1:main.ADIFMonitorConfig):Promise<void>;
export function SaveAlertRule(arg1:alerts.Rule):Promise<alerts.Rule>;
export function SaveAmplifiers(arg1:Array<main.AmpConfig>):Promise<void>;
export function SaveAntGeniusSettings(arg1:main.AntGeniusSettings):Promise<void>;
export function SaveAudioSettings(arg1:main.AudioSettings):Promise<void>;
+68
View File
@@ -26,6 +26,22 @@ export function AddQSO(arg1) {
return window['go']['main']['App']['AddQSO'](arg1);
}
export function AmpFanMode(arg1, arg2) {
return window['go']['main']['App']['AmpFanMode'](arg1, arg2);
}
export function AmpOperate(arg1, arg2) {
return window['go']['main']['App']['AmpOperate'](arg1, arg2);
}
export function AmpPower(arg1, arg2) {
return window['go']['main']['App']['AmpPower'](arg1, arg2);
}
export function AmpPowerLevel(arg1, arg2) {
return window['go']['main']['App']['AmpPowerLevel'](arg1, arg2);
}
export function AntGeniusActivate(arg1, arg2) {
return window['go']['main']['App']['AntGeniusActivate'](arg1, arg2);
}
@@ -374,6 +390,10 @@ export function FlexSetANFLevel(arg1) {
return window['go']['main']['App']['FlexSetANFLevel'](arg1);
}
export function FlexSetANFT(arg1) {
return window['go']['main']['App']['FlexSetANFT'](arg1);
}
export function FlexSetAPF(arg1) {
return window['go']['main']['App']['FlexSetAPF'](arg1);
}
@@ -422,6 +442,22 @@ export function FlexSetKeySpeed(arg1) {
return window['go']['main']['App']['FlexSetKeySpeed'](arg1);
}
export function FlexSetLMSANF(arg1) {
return window['go']['main']['App']['FlexSetLMSANF'](arg1);
}
export function FlexSetLMSANFLevel(arg1) {
return window['go']['main']['App']['FlexSetLMSANFLevel'](arg1);
}
export function FlexSetLMSNR(arg1) {
return window['go']['main']['App']['FlexSetLMSNR'](arg1);
}
export function FlexSetLMSNRLevel(arg1) {
return window['go']['main']['App']['FlexSetLMSNRLevel'](arg1);
}
export function FlexSetMic(arg1) {
return window['go']['main']['App']['FlexSetMic'](arg1);
}
@@ -454,6 +490,14 @@ export function FlexSetNR(arg1) {
return window['go']['main']['App']['FlexSetNR'](arg1);
}
export function FlexSetNRF(arg1) {
return window['go']['main']['App']['FlexSetNRF'](arg1);
}
export function FlexSetNRFLevel(arg1) {
return window['go']['main']['App']['FlexSetNRFLevel'](arg1);
}
export function FlexSetNRLevel(arg1) {
return window['go']['main']['App']['FlexSetNRLevel'](arg1);
}
@@ -478,6 +522,10 @@ export function FlexSetRITFreq(arg1) {
return window['go']['main']['App']['FlexSetRITFreq'](arg1);
}
export function FlexSetRNN(arg1) {
return window['go']['main']['App']['FlexSetRNN'](arg1);
}
export function FlexSetRXAntenna(arg1) {
return window['go']['main']['App']['FlexSetRXAntenna'](arg1);
}
@@ -486,6 +534,14 @@ export function FlexSetSidetoneLevel(arg1) {
return window['go']['main']['App']['FlexSetSidetoneLevel'](arg1);
}
export function FlexSetSpeexNR(arg1) {
return window['go']['main']['App']['FlexSetSpeexNR'](arg1);
}
export function FlexSetSpeexNRLevel(arg1) {
return window['go']['main']['App']['FlexSetSpeexNRLevel'](arg1);
}
export function FlexSetSplit(arg1) {
return window['go']['main']['App']['FlexSetSplit'](arg1);
}
@@ -558,6 +614,14 @@ export function GetAlertEmailTo() {
return window['go']['main']['App']['GetAlertEmailTo']();
}
export function GetAmpStatuses() {
return window['go']['main']['App']['GetAmpStatuses']();
}
export function GetAmplifiers() {
return window['go']['main']['App']['GetAmplifiers']();
}
export function GetAntGeniusSettings() {
return window['go']['main']['App']['GetAntGeniusSettings']();
}
@@ -1430,6 +1494,10 @@ export function SaveAlertRule(arg1) {
return window['go']['main']['App']['SaveAlertRule'](arg1);
}
export function SaveAmplifiers(arg1) {
return window['go']['main']['App']['SaveAmplifiers'](arg1);
}
export function SaveAntGeniusSettings(arg1) {
return window['go']['main']['App']['SaveAntGeniusSettings'](arg1);
}
+90
View File
@@ -777,6 +777,17 @@ export namespace cat {
anf_level: number;
wnb: boolean;
wnb_level: number;
lms_nr: boolean;
lms_nr_level: number;
lms_anf: boolean;
lms_anf_level: number;
speex_nr: boolean;
speex_nr_level: number;
rnn: boolean;
anft: boolean;
nrf: boolean;
nrf_level: number;
dsp_v4: boolean;
rit: boolean;
rit_freq: number;
xit: boolean;
@@ -844,6 +855,17 @@ export namespace cat {
this.anf_level = source["anf_level"];
this.wnb = source["wnb"];
this.wnb_level = source["wnb_level"];
this.lms_nr = source["lms_nr"];
this.lms_nr_level = source["lms_nr_level"];
this.lms_anf = source["lms_anf"];
this.lms_anf_level = source["lms_anf_level"];
this.speex_nr = source["speex_nr"];
this.speex_nr_level = source["speex_nr_level"];
this.rnn = source["rnn"];
this.anft = source["anft"];
this.nrf = source["nrf"];
this.nrf_level = source["nrf_level"];
this.dsp_v4 = source["dsp_v4"];
this.rit = source["rit"];
this.rit_freq = source["rit_freq"];
this.xit = source["xit"];
@@ -1400,6 +1422,74 @@ export namespace main {
}
}
export class AmpConfig {
id: string;
name: string;
enabled: boolean;
type: string;
transport: string;
host: string;
port: number;
com_port: string;
baud: number;
static createFrom(source: any = {}) {
return new AmpConfig(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.id = source["id"];
this.name = source["name"];
this.enabled = source["enabled"];
this.type = source["type"];
this.transport = source["transport"];
this.host = source["host"];
this.port = source["port"];
this.com_port = source["com_port"];
this.baud = source["baud"];
}
}
export class AmpStatus {
id: string;
name: string;
type: string;
pgxl?: powergenius.Status;
spe?: spe.Status;
acom?: acom.Status;
static createFrom(source: any = {}) {
return new AmpStatus(source);
}
constructor(source: any = {}) {
if ('string' === typeof source) source = JSON.parse(source);
this.id = source["id"];
this.name = source["name"];
this.type = source["type"];
this.pgxl = this.convertValues(source["pgxl"], powergenius.Status);
this.spe = this.convertValues(source["spe"], spe.Status);
this.acom = this.convertValues(source["acom"], acom.Status);
}
convertValues(a: any, classs: any, asMap: boolean = false): any {
if (!a) {
return a;
}
if (a.slice && a.map) {
return (a as any[]).map(elem => this.convertValues(elem, classs));
} else if ("object" === typeof a) {
if (asMap) {
for (const key of Object.keys(a)) {
a[key] = new classs(a[key]);
}
return a;
}
return new classs(a);
}
return a;
}
}
export class AntGeniusSettings {
enabled: boolean;
host: string;