feat: Support for Antenna Genius
This commit is contained in:
@@ -356,6 +356,70 @@ func (m *Manager) FlexDo(fn func(FlexController) error) error {
|
||||
})
|
||||
}
|
||||
|
||||
// IcomTXState is the Icom receive-DSP state surfaced to the dedicated Icom
|
||||
// control tab. Levels are 0-100 (scaled from the rig's 0-255). Unlike Flex,
|
||||
// the Icom doesn't push changes, so these reflect the last RefreshIcom() read
|
||||
// plus the optimistic updates each setter applies.
|
||||
type IcomTXState struct {
|
||||
Available bool `json:"available"`
|
||||
Model string `json:"model,omitempty"`
|
||||
Mode string `json:"mode,omitempty"`
|
||||
AFGain int `json:"af_gain"`
|
||||
RFGain int `json:"rf_gain"`
|
||||
NB bool `json:"nb"`
|
||||
NBLevel int `json:"nb_level"`
|
||||
NR bool `json:"nr"`
|
||||
NRLevel int `json:"nr_level"`
|
||||
ANF bool `json:"anf"`
|
||||
AGC string `json:"agc,omitempty"` // FAST | MID | SLOW
|
||||
Preamp int `json:"preamp"` // 0=off, 1=P.AMP1, 2=P.AMP2
|
||||
Att int `json:"att"` // dB attenuation, 0=off
|
||||
Filter int `json:"filter"` // 1 | 2 | 3 (FIL1/2/3)
|
||||
}
|
||||
|
||||
// IcomController is an OPTIONAL backend capability (the Icom CI-V backend): the
|
||||
// receive-DSP controls shown on the Icom tab. IcomState() is mutex-guarded in
|
||||
// the backend so it's safe off the CAT goroutine; setters dispatch via IcomDo.
|
||||
type IcomController interface {
|
||||
IcomState() IcomTXState
|
||||
RefreshIcom() error // re-read all DSP state from the rig
|
||||
SetAFGain(int) error
|
||||
SetRFGain(int) error
|
||||
SetNB(bool) error
|
||||
SetNBLevel(int) error
|
||||
SetNR(bool) error
|
||||
SetNRLevel(int) error
|
||||
SetANF(bool) error
|
||||
SetAGC(string) error
|
||||
SetPreamp(int) error
|
||||
SetAtt(int) error
|
||||
SetIcomFilter(int) error
|
||||
}
|
||||
|
||||
// IcomState returns the current Icom DSP state, or (zero, false) when the active
|
||||
// backend isn't an Icom. Safe to call from any goroutine.
|
||||
func (m *Manager) IcomState() (IcomTXState, bool) {
|
||||
m.mu.RLock()
|
||||
b := m.backend
|
||||
m.mu.RUnlock()
|
||||
if ic, ok := b.(IcomController); ok {
|
||||
return ic.IcomState(), true
|
||||
}
|
||||
return IcomTXState{}, false
|
||||
}
|
||||
|
||||
// IcomDo dispatches an Icom control onto the CAT goroutine. Errors if the
|
||||
// active backend isn't an Icom.
|
||||
func (m *Manager) IcomDo(fn func(IcomController) error) error {
|
||||
return m.exec(func(b Backend) error {
|
||||
ic, ok := b.(IcomController)
|
||||
if !ok {
|
||||
return fmt.Errorf("active CAT backend is not an Icom")
|
||||
}
|
||||
return fn(ic)
|
||||
})
|
||||
}
|
||||
|
||||
// exec marshals a backend operation onto the CAT goroutine. Returns the
|
||||
// operation's error or a "busy"/"not running" error if dispatch failed.
|
||||
func (m *Manager) exec(fn func(Backend) error) error {
|
||||
|
||||
Reference in New Issue
Block a user