From c995b5a3e8ecf7efe5e7bd7f5f6f204bc779d7e3 Mon Sep 17 00:00:00 2001 From: UzixLS Date: Mon, 2 May 2016 15:24:29 +0300 Subject: [PATCH] TS-50 IF and FA commands --- .gitignore | 3 +- README.md | 8 ++++ SDRSharp.SerialController.csproj | 23 +++++------ SDRSharp.SerialController.csproj.user | 2 +- SDRSharp.SerialController.sln | 6 ++- SerialControllerPanel.Designer.cs | 6 +-- SerialControllerPanel.cs | 6 ++- SerialControllerPanel.resx | 4 +- SerialControllerPlugin.cs | 6 ++- SerialPort.cs | 56 +++++++++++++++++++-------- 10 files changed, 82 insertions(+), 38 deletions(-) create mode 100644 README.md diff --git a/.gitignore b/.gitignore index 91401b6..cf9ff6c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ obj/ - +Release/ +ReferencedDLLs/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..036b2e7 --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# sdrsharp-catcontroller + +This plugin allow SDR# to be controlled via serial (COM) interface with subset of TS-50 receiver commands. +Supported commands: +* IF - get frequency +* FA - set frequency + +This plugin based on code by pewusoft (http://users.vline.pl/~pewusoft/) diff --git a/SDRSharp.SerialController.csproj b/SDRSharp.SerialController.csproj index 8ea448f..008d63f 100644 --- a/SDRSharp.SerialController.csproj +++ b/SDRSharp.SerialController.csproj @@ -1,5 +1,5 @@  - + Debug AnyCPU @@ -10,7 +10,7 @@ Properties SDRSharp.SerialController SDRSharp.SerialController - v3.5 + v4.5.2 512 False @@ -63,7 +63,7 @@ true - ..\Release\ + Release\ TRACE True PdbOnly @@ -82,6 +82,15 @@ Auto + + 4.0 + + + ReferencedDLLs\SDRSharp.Common.dll + + + ReferencedDLLs\SDRSharp.Radio.dll + @@ -93,18 +102,10 @@ - - False - ../Common/SDRSharp.Common.dll - - - False - ../Common/SDRSharp.Radio.dll - UserControl diff --git a/SDRSharp.SerialController.csproj.user b/SDRSharp.SerialController.csproj.user index 4fdffd5..76fe5a5 100644 --- a/SDRSharp.SerialController.csproj.user +++ b/SDRSharp.SerialController.csproj.user @@ -1,5 +1,5 @@  - + ProjectFiles diff --git a/SDRSharp.SerialController.sln b/SDRSharp.SerialController.sln index 742eb61..ef05109 100644 --- a/SDRSharp.SerialController.sln +++ b/SDRSharp.SerialController.sln @@ -1,7 +1,9 @@  -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 # SharpDevelop 5.1 +VisualStudioVersion = 12.0.20827.3 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SDRSharp.SerialController", "SDRSharp.SerialController.csproj", "{41C6CC2E-5F1D-4BFC-9676-381AD488FCD6}" EndProject Global diff --git a/SerialControllerPanel.Designer.cs b/SerialControllerPanel.Designer.cs index 4bfcb6d..198d8d7 100644 --- a/SerialControllerPanel.Designer.cs +++ b/SerialControllerPanel.Designer.cs @@ -61,7 +61,7 @@ this.btnRefreshPorts.Image = ((System.Drawing.Image)(resources.GetObject("btnRefreshPorts.Image"))); this.btnRefreshPorts.Location = new System.Drawing.Point(188, 2); this.btnRefreshPorts.Name = "btnRefreshPorts"; - this.btnRefreshPorts.Size = new System.Drawing.Size(30, 23); + this.btnRefreshPorts.Size = new System.Drawing.Size(30, 30); this.btnRefreshPorts.TabIndex = 3; this.btnRefreshPorts.UseVisualStyleBackColor = true; this.btnRefreshPorts.Click += new System.EventHandler(this.BtnRefreshPortsClick); @@ -89,8 +89,8 @@ this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(215, 46); this.label1.TabIndex = 6; - this.label1.Text = "This plugin receives AR ONE commands from UniTrunker and sets frequency according" + - "ly. Made by pewusoft, 2015"; + this.label1.Text = "Accept some TS-50 CAT commands via serial interface. " + + "Made by Uzix, 2016. Based on plugin by pewusoft, 2015"; // // SerialControllerPanel // diff --git a/SerialControllerPanel.cs b/SerialControllerPanel.cs index b5a9af0..2a0cfc1 100644 --- a/SerialControllerPanel.cs +++ b/SerialControllerPanel.cs @@ -45,7 +45,11 @@ namespace SDRSharp.SerialController } void CbEnableClick(object sender, EventArgs e) { - cbEnable.Checked = cbEnable.Checked ? _serialPort.openPort(comboPorts.Text) : _serialPort.closePort(); + if (! _serialPort.IsOpen) + _serialPort.openPort(comboPorts.Text); + else + _serialPort.closePort(); + cbEnable.Checked = _serialPort.IsOpen; comboPorts.Enabled = !cbEnable.Checked; btnRefreshPorts.Enabled = !cbEnable.Checked; cbLogToFile.Enabled = !cbEnable.Checked; diff --git a/SerialControllerPanel.resx b/SerialControllerPanel.resx index fcf672d..e7e9463 100644 --- a/SerialControllerPanel.resx +++ b/SerialControllerPanel.resx @@ -112,10 +112,10 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/SerialControllerPlugin.cs b/SerialControllerPlugin.cs index e4bd7d1..dc51192 100644 --- a/SerialControllerPlugin.cs +++ b/SerialControllerPlugin.cs @@ -33,6 +33,7 @@ namespace SDRSharp.SerialController _control = control; _serialPort = new SerialPortCtrl(); _serialPort.OnFrequencyChange += UpdateFrequency; + _serialPort.OnGetFrequency += GetFrequency; _controlPanel = new SerialControllerPanel(_serialPort); _controlPanel.readSettings(); @@ -41,7 +42,10 @@ namespace SDRSharp.SerialController void UpdateFrequency(object sender, long freq) { _control.Frequency = freq; _controlPanel.addToLogList(freq.ToString("N0")+" Hz"); - + } + + long GetFrequency() { + return _control.Frequency; } public void Close() diff --git a/SerialPort.cs b/SerialPort.cs index ab81503..893f8b9 100644 --- a/SerialPort.cs +++ b/SerialPort.cs @@ -20,36 +20,41 @@ namespace SDRSharp.SerialController set { this._enableLogging = value; } get { return this._enableLogging; } } + public bool IsOpen { + get { return _port != null && _port.IsOpen; } + } StreamWriter logger; SerialPort _port; public delegate void FrequencyChangeHandler(object sender, long freq); public event FrequencyChangeHandler OnFrequencyChange; + + public delegate long GetFrequencyHandler(); + public event GetFrequencyHandler OnGetFrequency; + public static string[] GetAllPorts() { try { return SerialPort.GetPortNames(); - } catch { - MessageBox.Show("Exception while getting available serial ports", "SerialController", MessageBoxButtons.OK, MessageBoxIcon.Error); + } catch (Exception e) { + MessageBox.Show("Cannot read port list:\n"+e.ToString(), "SerialController", MessageBoxButtons.OK, MessageBoxIcon.Error); return new string[0]; } } public bool openPort(string portName) { try { - if (_port != null && _port.IsOpen) { + if (_port != null && _port.IsOpen) return false; - } if (portName == null || (portName.Trim().Equals(""))) return false; _port = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One); - _port.DataReceived += Port_DataReceived; - - + _port.DataReceived += new SerialDataReceivedEventHandler( Port_DataReceived ); + if (_port != null) { _port.Open(); if (_enableLogging) { @@ -59,8 +64,9 @@ namespace SDRSharp.SerialController return true; } return false; - } catch (Exception) { - MessageBox.Show("Couldn't open port "+portName, "SerialController", MessageBoxButtons.OK, MessageBoxIcon.Error); + } catch (Exception e) { + MessageBox.Show("Couldn't open port "+portName+":\n"+e.ToString(), "SerialController", + MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } @@ -87,15 +93,33 @@ namespace SDRSharp.SerialController void Port_DataReceived(object sender, SerialDataReceivedEventArgs e) { - if (OnFrequencyChange == null) return; + string data = ""; + while( data.IndexOf(';') < 0 ) { + byte[] bytes = new byte[_port.BytesToRead+32]; + try { + _port.Read(bytes, 0, _port.BytesToRead); + } + catch (Exception) { + log("Error reading COM port"); + return; + } + data += System.Text.Encoding.UTF8.GetString(bytes); + } + data = data.Substring(0, data.IndexOf(';')); - string data = _port.ReadLine(); - // log commands to file - log("Received on COM port: "+data); - // AR-ONE RF command parse, as simple as can be, but faster than regex - if (data.StartsWith("RF", StringComparison.Ordinal)) { + // TS-50 command parse + if (data.StartsWith("IF", StringComparison.Ordinal)) { + long freq = OnGetFrequency(); + string response = "IF"; + response += String.Format("{0:00000000000}", freq); + response += "000000000000000000000000;"; + _port.Write(response); + } + if (data.StartsWith("FA", StringComparison.Ordinal)) { long freq; - if (long.TryParse(data.Substring("RF".Length), out freq)) { + if (long.TryParse(data.Substring(2), out freq)) { + log("Received on COM port: "+data); + if (OnFrequencyChange == null) return; OnFrequencyChange(this, freq); log("Changing frequency to: "+freq.ToString("N0")); }