/* * Author: Pawel Walczak (pewusoft) * Date: 2015-01-12 20:50 * */ using System; using System.IO.Ports; using System.IO; using System.Windows.Forms; namespace SDRSharp.SerialController { /// /// Description of SerialPort. /// public class SerialPortCtrl { bool _enableLogging = true; public bool EnableLogging { 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 (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) return false; if (portName == null || (portName.Trim().Equals(""))) return false; _port = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One); _port.DataReceived += new SerialDataReceivedEventHandler( Port_DataReceived ); if (_port != null) { _port.Open(); if (_enableLogging) { prepareLogger(); log("Port " + _port.PortName + " opened"); } return true; } return false; } catch (Exception e) { MessageBox.Show("Couldn't open port "+portName+":\n"+e.ToString(), "SerialController", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } public bool closePort() { if (_port != null) { if (_port.IsOpen) { try { _port.Close(); if (_enableLogging) { log("Port " + _port.PortName + " closed"); closeLogger(); } return true; } catch (IOException) { return false; } } else { return false; } } return false; } void Port_DataReceived(object sender, SerialDataReceivedEventArgs e) { 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(';')); // 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(2), out freq)) { log("Received on COM port: "+data); if (OnFrequencyChange == null) return; OnFrequencyChange(this, freq); log("Changing frequency to: "+freq.ToString("N0")); } } } void log(String str) { if (logger!=null) { logger.WriteLine("[" + DateTime.Now + "]: " + str.Trim()); } } void prepareLogger() { try { if (logger != null) { logger.Close(); } logger = new StreamWriter(new FileStream("serial.log", FileMode.Append, FileAccess.Write, FileShare.ReadWrite, 1024, FileOptions.WriteThrough)); logger.AutoFlush = true; } catch (Exception) { logger = null; } } void closeLogger() { try { if (logger != null) { logger.Close(); } logger = null; } catch (Exception) { logger = null; } } } }