From b98f15ac5658b77d724297632e3f280beac325c8 Mon Sep 17 00:00:00 2001 From: talkkonnect Date: Sat, 29 Jan 2022 05:31:11 +0000 Subject: [PATCH] added channel up and down to sa818 --- client.go | 9 +++-- commandkeys.go | 18 ++++++++++ radio.go | 95 ++++++++++++++++++++++++++++++++++++++++++-------- talkkonnect.go | 24 ++++++------- version.go | 6 ++-- xmlparser.go | 44 ++++++++++++++++------- 6 files changed, 150 insertions(+), 46 deletions(-) diff --git a/client.go b/client.go index e99006d..9f30723 100644 --- a/client.go +++ b/client.go @@ -502,6 +502,7 @@ func (b *Talkkonnect) ClientStart() { if !(Config.Global.Hardware.Radio.Sa818.Enabled && Config.Global.Hardware.Radio.Sa818.Serial.Enabled) { log.Println("error: Radio Module Not Configured Properly") } else { + createEnabledRadioChannels() go radioSetup() } } @@ -572,10 +573,12 @@ keyPressListenerLoop: b.cmdAudioMicTrafficRecord() case term.KeyCtrlL: b.cmdClearScreen() + case term.KeyCtrlM: + b.cmdRadioChannelMove("Up") + case term.KeyCtrlN: + b.cmdRadioChannelMove("Down") case term.KeyCtrlO: b.cmdPingServers() - case term.KeyCtrlN: - b.cmdConnNextServer() case term.KeyCtrlP: b.cmdPanicSimulation() case term.KeyCtrlG: @@ -592,6 +595,8 @@ keyPressListenerLoop: b.cmdDisplayVersion() case term.KeyCtrlX: b.cmdDumpXMLConfig() + case term.KeyCtrlZ: + b.cmdConnNextServer() default: if _, ok := TTYKeyMap[ev.Ch]; ok { switch strings.ToLower(TTYKeyMap[ev.Ch].Command) { diff --git a/commandkeys.go b/commandkeys.go index e935f68..09c3562 100644 --- a/commandkeys.go +++ b/commandkeys.go @@ -547,6 +547,24 @@ func (b *Talkkonnect) cmdClearScreen() { } } +func (b *Talkkonnect) cmdRadioChannelMove(command string) { + log.Printf("debug: Ctrl-M Radio Channel %v\n", command) + if Config.Global.Hardware.TargetBoard == "rpi" { + if Config.Global.Hardware.Radio.Enabled { + if !(Config.Global.Hardware.Radio.Sa818.Enabled && Config.Global.Hardware.Radio.Sa818.Serial.Enabled) { + log.Println("error: Radio Module Not Configured Properly") + } else { + if command == "Up" { + go radioChannelChange("up") + } + if command == "Down" { + go radioChannelChange("down") + } + } + } + } +} + func (b *Talkkonnect) cmdPingServers() { log.Printf("debug: Ctrl-O Pressed \n") log.Println("info: Ping Servers") diff --git a/radio.go b/radio.go index 03dd24a..3ee245e 100644 --- a/radio.go +++ b/radio.go @@ -36,6 +36,10 @@ import ( "github.com/talkkonnect/sa818" ) +var CurrentChannelIndex = 0 +var MoveChannelIndex = 0 +var EnabledChannelCounter = 0 + func radioSetup() { DMOSetup.SerialOptions.PortName = Config.Global.Hardware.Radio.Sa818.Serial.Port DMOSetup.SerialOptions.BaudRate = Config.Global.Hardware.Radio.Sa818.Serial.Baud @@ -46,8 +50,63 @@ func radioSetup() { RadioModuleSA818Channel(Config.Global.Hardware.Radio.ConnectChannelID) } +func radioChannelChange(command string) { + DMOSetup.SerialOptions.PortName = Config.Global.Hardware.Radio.Sa818.Serial.Port + DMOSetup.SerialOptions.BaudRate = Config.Global.Hardware.Radio.Sa818.Serial.Baud + DMOSetup.SerialOptions.DataBits = Config.Global.Hardware.Radio.Sa818.Serial.Databits + DMOSetup.SerialOptions.StopBits = Config.Global.Hardware.Radio.Sa818.Serial.Stopbits + DMOSetup.SerialOptions.MinimumReadSize = 2 + DMOSetup.SerialOptions.InterCharacterTimeout = 200 + + if command == "up" { + if len(radioChannels)-1 < CurrentChannelIndex+1 { + MoveChannelIndex = 0 + CurrentChannelIndex = 0 + log.Printf("info: Moving %v To Channel ID %v Name %v\n", command, radioChannels[MoveChannelIndex].ID, radioChannels[MoveChannelIndex].Name) + RadioModuleSA818Channel(radioChannels[MoveChannelIndex].ID) + return + } + if len(radioChannels)-1 >= CurrentChannelIndex+1 { + MoveChannelIndex = CurrentChannelIndex + 1 + CurrentChannelIndex++ + log.Printf("info: Moving %v To Channel ID %v Name %v\n", command, radioChannels[MoveChannelIndex].ID, radioChannels[MoveChannelIndex].Name) + RadioModuleSA818Channel(radioChannels[MoveChannelIndex].ID) + return + } + } + + if command == "down" { + if CurrentChannelIndex-1 < 0 { + MoveChannelIndex = len(radioChannels) - 1 + CurrentChannelIndex = len(radioChannels) - 1 + log.Printf("info: Moving %v To Channel ID %v Name %v\n", command, radioChannels[MoveChannelIndex].ID, radioChannels[MoveChannelIndex].Name) + RadioModuleSA818Channel(radioChannels[MoveChannelIndex].ID) + return + } + if CurrentChannelIndex-1 >= 0 { + MoveChannelIndex = CurrentChannelIndex - 1 + CurrentChannelIndex-- + log.Printf("info: Moving %v To Channel ID %v Name %v\n", command, radioChannels[MoveChannelIndex].ID, radioChannels[MoveChannelIndex].Name) + RadioModuleSA818Channel(radioChannels[MoveChannelIndex].ID) + return + } + } +} + +func createEnabledRadioChannels() { + for _, channel := range Config.Global.Hardware.Radio.Sa818.Channels.Channel { + if channel.Enabled { + EnabledChannelCounter++ + if channel.ID == Config.Global.Hardware.Radio.ConnectChannelID { + CurrentChannelIndex = EnabledChannelCounter - 1 + } + radioChannels = append(radioChannels, radioChannelsStruct{channel.ID, channel.Name, channel.ItemInList, channel.Bandwidth, channel.Rxfreq, channel.Txfreq, channel.Squelch, channel.Ctcsstone, channel.Dcstone, channel.Predeemph, channel.Highpass, channel.Lowpass, channel.Volume}) + } + } +} + func RadioModuleSA818Channel(useChannelID string) { - found, name := findChannelByID(useChannelID) + found, name := findChannelNameByID(useChannelID) if found { log.Printf("info: Found Channel ID %v Name %v\n", useChannelID, name) setFrequency() @@ -56,20 +115,25 @@ func RadioModuleSA818Channel(useChannelID string) { } } -func findChannelByID(findChannelID string) (bool, string) { - for _, channel := range Config.Global.Hardware.Radio.Sa818.Channels.Channel { - if channel.ID == findChannelID && channel.Enabled { - DMOSetup.Band = channel.Bandwidth - DMOSetup.Rxfreq = channel.Rxfreq - DMOSetup.Txfreq = channel.Txfreq - DMOSetup.Ctsstone = channel.Ctcsstone - DMOSetup.Squelch = channel.Squelch - DMOSetup.Dcstone = channel.Dcstone - DMOSetup.Predeemph = channel.Predeemph - DMOSetup.Highpass = channel.Highpass - DMOSetup.Lowpass = channel.Lowpass - DMOSetup.Volume = channel.Volume - return true, channel.Name +func findChannelNameByID(findChannelID string) (bool, string) { + var EnabledItemInList int = 0 + for Item, channel := range Config.Global.Hardware.Radio.Sa818.Channels.Channel { + if channel.Enabled { + EnabledItemInList++ + Config.Global.Hardware.Radio.Sa818.Channels.Channel[Item].ItemInList = EnabledItemInList + if channel.ID == findChannelID { + DMOSetup.Band = channel.Bandwidth + DMOSetup.Rxfreq = channel.Rxfreq + DMOSetup.Txfreq = channel.Txfreq + DMOSetup.Ctsstone = channel.Ctcsstone + DMOSetup.Squelch = channel.Squelch + DMOSetup.Dcstone = channel.Dcstone + DMOSetup.Predeemph = channel.Predeemph + DMOSetup.Highpass = channel.Highpass + DMOSetup.Lowpass = channel.Lowpass + DMOSetup.Volume = channel.Volume + return true, channel.Name + } } } return false, "not found channel" @@ -87,6 +151,7 @@ func checkRSSI() { func setFrequency() { err := sa818.Callsa818("DMOSetupGroup", DMOSetup) + log.Printf("debug: actual data sent to module %#v", DMOSetup) if err != nil { log.Println("info: SAModule Set Frequecy Error ", err) } else { diff --git a/talkkonnect.go b/talkkonnect.go index fe094c9..6e9c534 100644 --- a/talkkonnect.go +++ b/talkkonnect.go @@ -105,24 +105,22 @@ func (b *Talkkonnect) talkkonnectMenu(backgroundcolor string) { log.Println("info: " + backgroundcolor + "│ Stop Transmitting │ List Online Users │" + backgroundreset) log.Println("info: " + backgroundcolor + "│ Playback/Stop Stream │ For GPS Position │" + backgroundreset) log.Println("info: " + backgroundcolor + "├─────────────────────────────┼────────────────────────────────┤" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Reload XML Config │ Debug Stacktrace │" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Check XML Config │ │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Reload XML Config │ Stop Talkkonnect │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Debug Stacktrace │ Send Email │" + backgroundreset) log.Println("info: " + backgroundcolor + "├─────────────────────────────┼────────────────────────────────┤" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Send Email │ Conn Next Server │" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Conn Previous Server│ Panic Simulation │" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Send Repeater Tone │ Scan Channels │" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Display Version │ Thanks/Acknowledgements│" + backgroundreset) - log.Println("info: " + backgroundcolor + "├─────────────────────────────┼────────────────────────────────┤" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Clear Screen │ Ping Servers │" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Repeat TX Loop Test │ Dump XML Config │" + backgroundreset) - log.Println("info: " + backgroundcolor + "├─────────────────────────────┼────────────────────────────────┤" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Traffic Record │ Mic Record │" + backgroundreset) - log.Println("info: " + backgroundcolor + "│ Traffic & Mic Record│ Show Uptime │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Conn Previous Server│ Send Repeater Tone │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ XML Config Checker │ Traffic Record │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Mic Record │ Traffic & Mic Record │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Clear Screen │ Radio Channel (+) │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Next Server │ Ping Servers │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Panic Simulation │ Repeat TX Loop Test │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Scan Channels │ Thanks/Acknowledgements│" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Show Uptime │ Display Version │" + backgroundreset) + log.Println("info: " + backgroundcolor + "│ Dump XML Config │ │" + backgroundreset) log.Println("info: " + backgroundcolor + "├─────────────────────────────┼────────────────────────────────┤" + backgroundreset) log.Println("info: " + backgroundcolor + "│ Visit us at www.talkkonnect.com and github.com/talkkonnect │" + backgroundreset) log.Println("info: " + backgroundcolor + "│ Thanks to Global Coders Co., Ltd. for their sponsorship │" + backgroundreset) log.Println("info: " + backgroundcolor + "└──────────────────────────────────────────────────────────────┘" + backgroundreset) - log.Println("info: IP Address & Session Information") b.pingconnectedserver() localAddresses() diff --git a/version.go b/version.go index 15d901a..2309bdb 100644 --- a/version.go +++ b/version.go @@ -31,10 +31,10 @@ package talkkonnect const ( - talkkonnectVersion string = "2.09.04" - talkkonnectReleased string = "Jan 28 2022" + talkkonnectVersion string = "2.09.05" + talkkonnectReleased string = "Jan 29 2022" ) /* Release Notes -1. Fixed Broken Implementation of SA818 Causing talkkonnect not to compile +1. Added Channel Up and Down to SA818 from talkkonnect */ diff --git a/xmlparser.go b/xmlparser.go index 1161b64..c5aa8f6 100644 --- a/xmlparser.go +++ b/xmlparser.go @@ -477,19 +477,20 @@ type ConfigStruct struct { } `xml:"serial"` Channels struct { Channel []struct { - ID string `xml:"id,attr"` - Name string `xml:"name,attr"` - Enabled bool `xml:"enabled,attr"` - Bandwidth int `xml:"bandwidth"` - Rxfreq float32 `xml:"rxfreq"` - Txfreq float32 `xml:"txfreq"` - Squelch int `xml:"squelch"` - Ctcsstone int `xml:"ctcsstone"` - Dcstone int `xml:"dcstone"` - Predeemph int `xml:"predeemph"` - Highpass int `xml:"highpass"` - Lowpass int `xml:"lowpass"` - Volume int `xml:"volume"` + ID string `xml:"id,attr"` + Name string `xml:"name,attr"` + Enabled bool `xml:"enabled,attr"` + ItemInList int `xml:""` + Bandwidth int `xml:"bandwidth"` + Rxfreq float32 `xml:"rxfreq"` + Txfreq float32 `xml:"txfreq"` + Squelch int `xml:"squelch"` + Ctcsstone int `xml:"ctcsstone"` + Dcstone int `xml:"dcstone"` + Predeemph int `xml:"predeemph"` + Highpass int `xml:"highpass"` + Lowpass int `xml:"lowpass"` + Volume int `xml:"volume"` } `xml:"channel"` } `xml:"channels"` } `xml:"sa818"` @@ -595,9 +596,26 @@ type mqttPubButtonStruct struct { Enabled bool } +type radioChannelsStruct struct { + ID string + Name string + ItemInList int + Bandwidth int + Rxfreq float32 + Txfreq float32 + Squelch int + Ctcsstone int + Dcstone int + Predeemph int + Highpass int + Lowpass int + Volume int +} + // Generic Global Config Variables var Config ConfigStruct var ConfigXMLFile string +var radioChannels []radioChannelsStruct // Generic Global State Variables var (