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
+20 -2
View File
@@ -105,6 +105,7 @@ type flexSlice struct {
nrf bool // NRF — noise reduction w/ filter
nrfLevel int
dspV4 bool
daxCh int // DAX audio channel for this slice (0 = off, 1-8)
rit bool // receive incremental tuning enabled
ritFreq int // RIT offset in Hz (negative = down)
xit bool // transmit incremental tuning enabled
@@ -844,6 +845,8 @@ func (f *Flex) handleStatus(payload string) {
s.nrf, s.dspV4 = val == "1", true
case "nrf_level":
s.nrfLevel, s.dspV4 = atoiDefault(val, s.nrfLevel), true
case "dax":
s.daxCh = atoiDefault(val, s.daxCh)
case "rit_on":
s.rit = val == "1"
case "rit_freq":
@@ -1374,6 +1377,7 @@ func (f *Flex) FlexState() FlexTXState {
st.NRF = rx.nrf
st.NRFLevel = rx.nrfLevel
st.DSPV4 = rx.dspV4
st.DAXCh = rx.daxCh
st.RIT = rx.rit
st.RITFreq = rx.ritFreq
st.XIT = rx.xit
@@ -1462,6 +1466,8 @@ func (f *Flex) sendSlice(param string, val any) error {
rx.nrf = val == "1"
case "nrf_level":
rx.nrfLevel = toInt(val)
case "dax":
rx.daxCh = toInt(val)
case "rxant":
rx.rxAnt = fmt.Sprint(val)
case "txant":
@@ -1617,8 +1623,20 @@ func (f *Flex) SetRNN(on bool) error { return f.sendSlice("rnnoise", bool
func (f *Flex) SetANFT(on bool) error { return f.sendSlice("anft", boolFlex(on)) }
func (f *Flex) SetNRF(on bool) error { return f.sendSlice("nrf", boolFlex(on)) }
func (f *Flex) SetNRFLevel(l int) error { return f.sendSlice("nrf_level", clampLevel(l)) }
func (f *Flex) SetWNB(on bool) error { return f.sendSlice("wnb", boolFlex(on)) }
func (f *Flex) SetWNBLevel(l int) error { return f.sendSlice("wnb_level", clampLevel(l)) }
// SetDAX routes the active slice's RX audio to a DAX channel (0 = off, 1-8) —
// the SmartSDR slice "DAX" selector, e.g. to feed WSJT-X via DAX audio.
func (f *Flex) SetDAX(ch int) error {
if ch < 0 {
ch = 0
}
if ch > 8 {
ch = 8
}
return f.sendSlice("dax", ch)
}
func (f *Flex) SetWNB(on bool) error { return f.sendSlice("wnb", boolFlex(on)) }
func (f *Flex) SetWNBLevel(l int) error { return f.sendSlice("wnb_level", clampLevel(l)) }
// ── CW keyer controls (top-level "cw" commands) ──