feat: DAX selector on the Flex panel — routes the active slice's RX audio to a DAX channel (slice dax=0-8, Off..8 dropdown next to the antenna selection, highlighted when active); changelog updated

This commit is contained in:
2026-07-22 17:33:45 +02:00
parent 77e3d011a0
commit 512b5fd35b
9 changed files with 54 additions and 7 deletions
+12 -1
View File
@@ -10,7 +10,7 @@ import {
FlexSetRIT, FlexSetRITFreq, FlexSetXIT, FlexSetXITFreq,
FlexSetNB, FlexSetNBLevel, FlexSetNR, FlexSetNRLevel, FlexSetANF, FlexSetANFLevel,
FlexSetLMSNR, FlexSetLMSNRLevel, FlexSetLMSANF, FlexSetLMSANFLevel,
FlexSetSpeexNR, FlexSetSpeexNRLevel, FlexSetRNN, FlexSetANFT, FlexSetNRF, FlexSetNRFLevel,
FlexSetSpeexNR, FlexSetSpeexNRLevel, FlexSetRNN, FlexSetANFT, FlexSetNRF, FlexSetNRFLevel, FlexSetDAX,
FlexSetWNB, FlexSetWNBLevel, FlexSetTXFilter, FlexSetMicProfile,
FlexSetAPF, FlexSetAPFLevel, FlexSetCWSpeed, FlexSetCWPitch, FlexSetCWBreakInDelay,
FlexSetCWSidetone, FlexSetSidetoneLevel, FlexSetCWFilter, FlexSetFilter,
@@ -37,6 +37,7 @@ type FlexState = {
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;
dax_ch?: number;
tx_filter_low: number; tx_filter_high: number; mic_profile?: string; mic_profiles?: string[];
mode?: string;
cw_speed: number; cw_pitch: number; cw_break_in_delay: number; cw_sidetone: boolean; cw_mon_level: number;
@@ -732,6 +733,16 @@ export function FlexPanel({ onCWSpeed, onReportRST }: { onCWSpeed?: (wpm: number
className="h-7 flex-1 min-w-0 rounded-md border border-input bg-background px-1.5 text-xs font-mono disabled:opacity-40">
{((st.tx_ant_list?.length ? st.tx_ant_list : st.ant_list) ?? []).map((a) => <option key={a} value={a}>{a}</option>)}
</select>
{/* DAX audio channel of the active slice (0 = off) — the SmartSDR
slice DAX selector, e.g. to feed WSJT-X over DAX audio. */}
<span className="text-[10px] text-muted-foreground" title={t('flxp.daxHint')}>DAX</span>
<select disabled={rxOff} value={String(st.dax_ch ?? 0)}
onChange={(e) => { const ch = parseInt(e.target.value, 10) || 0; change('dax_ch', ch, () => FlexSetDAX(ch)); }}
className={cn('h-7 w-14 shrink-0 rounded-md border px-1.5 text-xs font-mono disabled:opacity-40',
(st.dax_ch ?? 0) > 0 ? 'border-info bg-info-muted text-info-muted-foreground font-bold' : 'border-input bg-background')}>
<option value="0">Off</option>
{[1, 2, 3, 4, 5, 6, 7, 8].map((c) => <option key={c} value={String(c)}>{c}</option>)}
</select>
</div>
</div>
)}