diff --git a/app.go b/app.go
index 8ea4326..1aa256a 100644
--- a/app.go
+++ b/app.go
@@ -7406,6 +7406,13 @@ func (a *App) FlexSetAudioLevel(l int) error {
return a.cat.FlexDo(func(fc cat.FlexController) error { return fc.SetAudioLevel(l) })
}
+func (a *App) FlexSetMute(on bool) error {
+ if a.cat == nil {
+ return fmt.Errorf("cat not initialized")
+ }
+ return a.cat.FlexDo(func(fc cat.FlexController) error { return fc.SetMute(on) })
+}
+
func (a *App) FlexSetNB(on bool) error {
if a.cat == nil {
return fmt.Errorf("cat not initialized")
diff --git a/frontend/src/components/FlexPanel.tsx b/frontend/src/components/FlexPanel.tsx
index c4ade41..135da99 100644
--- a/frontend/src/components/FlexPanel.tsx
+++ b/frontend/src/components/FlexPanel.tsx
@@ -1,11 +1,11 @@
import { useEffect, useRef, useState } from 'react';
-import { Radio, Zap, Power, AudioLines, Flame, Gauge } from 'lucide-react';
+import { Radio, Zap, Power, AudioLines, Flame, Gauge, Volume2, VolumeX } from 'lucide-react';
import {
GetFlexState, FlexSetPower, FlexSetTunePower, FlexTune, FlexSetVox, FlexSetVoxLevel, FlexSetVoxDelay,
FlexSetProcessor, FlexSetProcessorLevel, FlexSetMon, FlexSetMonLevel, FlexSetMic,
FlexMox, FlexAmpOperate,
GetPGXLStatus, PGXLSetFanMode,
- FlexSetAGCMode, FlexSetAGCThreshold, FlexSetAudioLevel,
+ FlexSetAGCMode, FlexSetAGCThreshold, FlexSetAudioLevel, FlexSetMute,
FlexSetNB, FlexSetNBLevel, FlexSetNR, FlexSetNRLevel, FlexSetANF, FlexSetANFLevel,
FlexSetAPF, FlexSetAPFLevel, FlexSetCWSpeed, FlexSetCWPitch, FlexSetCWBreakInDelay,
FlexSetCWSidetone, FlexSetSidetoneLevel, FlexSetCWFilter, FlexSetFilter,
@@ -19,7 +19,7 @@ type FlexState = {
proc_enable: boolean; proc_level: number;
mon: boolean; mon_level: number; mic_level: number;
atu_status?: string; atu_memories: boolean;
- rx_avail: boolean; agc_mode?: string; agc_threshold: number; audio_level: number;
+ rx_avail: boolean; agc_mode?: string; agc_threshold: number; audio_level: number; mute: boolean;
nb: boolean; nb_level: number; nr: boolean; nr_level: number; anf: boolean; anf_level: number;
mode?: string;
cw_speed: number; cw_pitch: number; cw_break_in_delay: number; cw_sidetone: boolean; cw_mon_level: number;
@@ -34,7 +34,7 @@ const ZERO: FlexState = {
available: false, rf_power: 0, tune_power: 0, tune: false, transmitting: false,
vox_enable: false, vox_level: 0, vox_delay: 0, proc_enable: false, proc_level: 0,
mon: false, mon_level: 0, mic_level: 0, atu_memories: false,
- rx_avail: false, agc_threshold: 0, audio_level: 0,
+ rx_avail: false, agc_threshold: 0, audio_level: 0, mute: false,
nb: false, nb_level: 0, nr: false, nr_level: 0, anf: false, anf_level: 0,
cw_speed: 25, cw_pitch: 600, cw_break_in_delay: 30, cw_sidetone: true, cw_mon_level: 0,
apf: false, apf_level: 0, filter_lo: 0, filter_hi: 0,
@@ -363,14 +363,21 @@ export function FlexPanel() {
onChange={(v) => change('agc_mode', v, () => FlexSetAGCMode(v))} />
- Thresh
- change('agc_threshold', v, () => FlexSetAGCThreshold(v))} />
- {st.agc_threshold}
+ AF
+
+ change('audio_level', v, () => FlexSetAudioLevel(v))} />
+ {st.mute ? '—' : st.audio_level}
- AF
- change('audio_level', v, () => FlexSetAudioLevel(v))} />
- {st.audio_level}
+ AGC-T
+ change('agc_threshold', v, () => FlexSetAGCThreshold(v))} />
+ {st.agc_threshold}
;
export function FlexSetMonLevel(arg1:number):Promise;
+export function FlexSetMute(arg1:boolean):Promise;
+
export function FlexSetNB(arg1:boolean):Promise;
export function FlexSetNBLevel(arg1:number):Promise;
diff --git a/frontend/wailsjs/go/main/App.js b/frontend/wailsjs/go/main/App.js
index 3b53248..3dbe839 100644
--- a/frontend/wailsjs/go/main/App.js
+++ b/frontend/wailsjs/go/main/App.js
@@ -314,6 +314,10 @@ export function FlexSetMonLevel(arg1) {
return window['go']['main']['App']['FlexSetMonLevel'](arg1);
}
+export function FlexSetMute(arg1) {
+ return window['go']['main']['App']['FlexSetMute'](arg1);
+}
+
export function FlexSetNB(arg1) {
return window['go']['main']['App']['FlexSetNB'](arg1);
}
diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts
index 5518311..a021ca8 100644
--- a/frontend/wailsjs/go/models.ts
+++ b/frontend/wailsjs/go/models.ts
@@ -515,6 +515,7 @@ export namespace cat {
agc_mode?: string;
agc_threshold: number;
audio_level: number;
+ mute: boolean;
nb: boolean;
nb_level: number;
nr: boolean;
@@ -563,6 +564,7 @@ export namespace cat {
this.agc_mode = source["agc_mode"];
this.agc_threshold = source["agc_threshold"];
this.audio_level = source["audio_level"];
+ this.mute = source["mute"];
this.nb = source["nb"];
this.nb_level = source["nb_level"];
this.nr = source["nr"];
diff --git a/internal/cat/cat.go b/internal/cat/cat.go
index 25a79bb..6e15835 100644
--- a/internal/cat/cat.go
+++ b/internal/cat/cat.go
@@ -251,6 +251,7 @@ type FlexTXState struct {
AGCMode string `json:"agc_mode,omitempty"`
AGCThreshold int `json:"agc_threshold"`
AudioLevel int `json:"audio_level"`
+ Mute bool `json:"mute"`
NB bool `json:"nb"`
NBLevel int `json:"nb_level"`
NR bool `json:"nr"`
@@ -312,6 +313,7 @@ type FlexController interface {
SetAGCMode(string) error
SetAGCThreshold(int) error
SetAudioLevel(int) error
+ SetMute(bool) error
SetNB(bool) error
SetNBLevel(int) error
SetNR(bool) error
diff --git a/internal/cat/flex.go b/internal/cat/flex.go
index f1aafac..d64d139 100644
--- a/internal/cat/flex.go
+++ b/internal/cat/flex.go
@@ -73,6 +73,7 @@ type flexSlice struct {
agcMode string // off | slow | med | fast
agcThreshold int // 0-100
audioLevel int // 0-100 (RX volume)
+ mute bool // RX audio muted
nb bool // noise blanker
nbLevel int
nr bool // noise reduction
@@ -670,6 +671,8 @@ func (f *Flex) handleStatus(payload string) {
s.agcThreshold = atoiDefault(val, s.agcThreshold)
case "audio_level":
s.audioLevel = atoiDefault(val, s.audioLevel)
+ case "audio_mute", "mute":
+ s.mute = val == "1"
case "nb":
s.nb = val == "1"
case "nb_level":
@@ -1029,6 +1032,7 @@ func (f *Flex) FlexState() FlexTXState {
st.AGCMode = rx.agcMode
st.AGCThreshold = rx.agcThreshold
st.AudioLevel = rx.audioLevel
+ st.Mute = rx.mute
st.NB = rx.nb
st.NBLevel = rx.nbLevel
st.NR = rx.nr
@@ -1076,6 +1080,8 @@ func (f *Flex) sendSlice(param string, val any) error {
rx.agcThreshold = toInt(val)
case "audio_level":
rx.audioLevel = toInt(val)
+ case "audio_mute", "mute":
+ rx.mute = fmt.Sprint(val) == "1"
case "nb":
rx.nb = val == "1"
case "nb_level":
@@ -1126,6 +1132,7 @@ func (f *Flex) SetAGCMode(m string) error {
}
func (f *Flex) SetAGCThreshold(l int) error { return f.sendSlice("agc_threshold", clampLevel(l)) }
func (f *Flex) SetAudioLevel(l int) error { return f.sendSlice("audio_level", clampLevel(l)) }
+func (f *Flex) SetMute(on bool) error { return f.sendSlice("audio_mute", boolFlex(on)) }
func (f *Flex) SetNB(on bool) error { return f.sendSlice("nb", boolFlex(on)) }
func (f *Flex) SetNBLevel(l int) error { return f.sendSlice("nb_level", clampLevel(l)) }
func (f *Flex) SetNR(on bool) error { return f.sendSlice("nr", boolFlex(on)) }