mirror of
https://github.com/nonoo/kappanhang.git
synced 2026-01-14 04:39:57 +01:00
Add split/DUP+- toggle support
This commit is contained in:
parent
0efe58b892
commit
5056437bb3
|
|
@ -161,6 +161,7 @@ Some basic CAT control hotkeys are also supported:
|
|||
- `p`: toggles preamp
|
||||
- `a`: toggles AGC
|
||||
- `o`: toggles VFO A/B
|
||||
- `s`: toggles split/DUP+- operation
|
||||
|
||||
## Icom IC-705 Wi-Fi notes
|
||||
|
||||
|
|
|
|||
|
|
@ -64,6 +64,15 @@ var civBands = []civBand{
|
|||
{freqFrom: 0, freqTo: 0}, // GENE
|
||||
}
|
||||
|
||||
type splitMode int
|
||||
|
||||
const (
|
||||
splitModeOff = iota
|
||||
splitModeOn
|
||||
splitModeDUPMinus
|
||||
splitModeDUPPlus
|
||||
)
|
||||
|
||||
type civControlStruct struct {
|
||||
st *serialStream
|
||||
deinitNeeded chan bool
|
||||
|
|
@ -98,6 +107,7 @@ type civControlStruct struct {
|
|||
setNREnabledSent bool
|
||||
setTSSent bool
|
||||
setVFOSent bool
|
||||
setSplitSent bool
|
||||
|
||||
freq uint
|
||||
ptt bool
|
||||
|
|
@ -117,6 +127,7 @@ type civControlStruct struct {
|
|||
tsValue byte
|
||||
ts uint
|
||||
vfoBActive bool
|
||||
splitMode splitMode
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -145,6 +156,8 @@ func (s *civControlStruct) decode(d []byte) bool {
|
|||
return s.decodeMode(payload)
|
||||
case 0x07:
|
||||
return s.decodeVFO(payload)
|
||||
case 0x0f:
|
||||
return s.decodeSplit(payload)
|
||||
case 0x10:
|
||||
return s.decodeTS(payload)
|
||||
case 0x1a:
|
||||
|
|
@ -264,6 +277,34 @@ func (s *civControlStruct) decodeVFO(d []byte) bool {
|
|||
return true
|
||||
}
|
||||
|
||||
func (s *civControlStruct) decodeSplit(d []byte) bool {
|
||||
if len(d) < 1 {
|
||||
return !s.state.setSplitSent
|
||||
}
|
||||
|
||||
var str string
|
||||
switch d[0] {
|
||||
default:
|
||||
s.state.splitMode = splitModeOff
|
||||
case 0x01:
|
||||
s.state.splitMode = splitModeOn
|
||||
str = "SPLIT"
|
||||
case 0x11:
|
||||
s.state.splitMode = splitModeDUPMinus
|
||||
str = "DUP-"
|
||||
case 0x12:
|
||||
s.state.splitMode = splitModeDUPPlus
|
||||
str = "DUP+"
|
||||
}
|
||||
statusLog.reportSplit(str)
|
||||
|
||||
if s.state.setSplitSent {
|
||||
s.state.setSplitSent = false
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *civControlStruct) decodeTS(d []byte) bool {
|
||||
if len(d) < 1 {
|
||||
return !s.state.setTSSent
|
||||
|
|
@ -856,6 +897,22 @@ func (s *civControlStruct) toggleVFO() error {
|
|||
return s.st.send([]byte{254, 254, civAddress, 224, 0x07, b, 253})
|
||||
}
|
||||
|
||||
func (s *civControlStruct) toggleSplit() error {
|
||||
s.state.setSplitSent = true
|
||||
var b byte
|
||||
switch s.state.splitMode {
|
||||
case splitModeOff:
|
||||
b = 0x01
|
||||
case splitModeOn:
|
||||
b = 0x011
|
||||
case splitModeDUPMinus:
|
||||
b = 0x12
|
||||
default:
|
||||
b = 0x10
|
||||
}
|
||||
return s.st.send([]byte{254, 254, civAddress, 224, 0x0f, b, 253})
|
||||
}
|
||||
|
||||
func (s *civControlStruct) getFreq() error {
|
||||
s.state.getFreqSent = true
|
||||
return s.st.send([]byte{254, 254, civAddress, 224, 3, 253})
|
||||
|
|
@ -994,6 +1051,10 @@ func (s *civControlStruct) init(st *serialStream) error {
|
|||
if err := s.getNREnabled(); err != nil {
|
||||
return err
|
||||
}
|
||||
// Querying split.
|
||||
if err := s.st.send([]byte{254, 254, civAddress, 224, 0x0f, 253}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s.deinitNeeded = make(chan bool)
|
||||
s.deinitFinished = make(chan bool)
|
||||
|
|
|
|||
|
|
@ -218,6 +218,12 @@ func handleHotkey(k byte) {
|
|||
log.Error("can't change vfo: ", err)
|
||||
}
|
||||
}
|
||||
case 's':
|
||||
if civControl != nil {
|
||||
if err := civControl.toggleSplit(); err != nil {
|
||||
log.Error("can't change split: ", err)
|
||||
}
|
||||
}
|
||||
case '\n':
|
||||
if statusLog.isRealtime() {
|
||||
statusLog.mutex.Lock()
|
||||
|
|
|
|||
24
statuslog.go
24
statuslog.go
|
|
@ -33,6 +33,7 @@ type statusLogData struct {
|
|||
ovf bool
|
||||
swr string
|
||||
ts string
|
||||
split string
|
||||
|
||||
startTime time.Time
|
||||
rttStr string
|
||||
|
|
@ -52,6 +53,7 @@ type statusLogStruct struct {
|
|||
rxColor *color.Color
|
||||
retransmitsColor *color.Color
|
||||
lostColor *color.Color
|
||||
splitColor *color.Color
|
||||
|
||||
stateStr struct {
|
||||
tx string
|
||||
|
|
@ -289,6 +291,20 @@ func (s *statusLogStruct) reportNR(percent int) {
|
|||
s.data.nr = fmt.Sprint(percent, "%")
|
||||
}
|
||||
|
||||
func (s *statusLogStruct) reportSplit(split string) {
|
||||
s.mutex.Lock()
|
||||
defer s.mutex.Unlock()
|
||||
|
||||
if s.data == nil {
|
||||
return
|
||||
}
|
||||
if split == "" {
|
||||
s.data.split = ""
|
||||
} else {
|
||||
s.data.split = s.preGenerated.splitColor.Sprint(split)
|
||||
}
|
||||
}
|
||||
|
||||
func (s *statusLogStruct) clearInternal() {
|
||||
fmt.Printf("%c[2K", 27)
|
||||
}
|
||||
|
|
@ -399,12 +415,16 @@ func (s *statusLogStruct) update() {
|
|||
if s.data.txPower != "" {
|
||||
txPowerStr = " txpwr " + s.data.txPower
|
||||
}
|
||||
var splitStr string
|
||||
if s.data.split != "" {
|
||||
splitStr = " " + s.data.split
|
||||
}
|
||||
var swrStr string
|
||||
if (s.data.tune || s.data.ptt) && s.data.swr != "" {
|
||||
swrStr = " SWR" + s.data.swr
|
||||
}
|
||||
s.data.line2 = fmt.Sprint(stateStr, " ", fmt.Sprintf("%.6f", float64(s.data.frequency)/1000000),
|
||||
tsStr, modeStr, vdStr, txPowerStr, swrStr)
|
||||
tsStr, modeStr, splitStr, vdStr, txPowerStr, swrStr)
|
||||
|
||||
up, down, lost, retransmits := netstat.get()
|
||||
lostStr := "0"
|
||||
|
|
@ -530,4 +550,6 @@ func (s *statusLogStruct) initIfNeeded() {
|
|||
s.preGenerated.retransmitsColor.Add(color.BgYellow)
|
||||
s.preGenerated.lostColor = color.New(color.FgHiWhite)
|
||||
s.preGenerated.lostColor.Add(color.BgRed)
|
||||
|
||||
s.preGenerated.splitColor = color.New(color.FgHiMagenta)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue