diff --git a/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpClient.cs b/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpClient.cs index b8b715f..3fb5e0a 100644 --- a/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpClient.cs +++ b/Pepperdash Core/Pepperdash Core/Comm/GenericTcpIpClient.cs @@ -11,15 +11,18 @@ using Newtonsoft.Json.Linq; namespace PepperDash.Core { + /// + /// A class to handle basic TCP/IP communications with a server + /// public class GenericTcpIpClient : Device, ISocketStatus, IAutoReconnect { /// - /// + /// Fires when data is received from the server and returns it as a Byte array /// public event EventHandler BytesReceived; /// - /// + /// Fires when data is received from the server and returns it as text /// public event EventHandler TextReceived; @@ -72,12 +75,12 @@ namespace PepperDash.Core public int BufferSize { get; set; } /// - /// + /// The actual client class /// public TCPClient Client { get; private set; } /// - /// + /// True if connected to the server /// public bool IsConnected { @@ -93,7 +96,7 @@ namespace PepperDash.Core } /// - /// + /// Status of the socket /// public SocketStatus ClientStatus { @@ -115,23 +118,23 @@ namespace PepperDash.Core } /// - /// + /// Status of the socket /// public string ClientStatusText { get { return ClientStatus.ToString(); } } [Obsolete] /// - /// + /// Ushort representation of client status /// public ushort UClientStatus { get { return (ushort)ClientStatus; } } /// - /// + /// Connection failure reason /// public string ConnectionFailure { get { return ClientStatus.ToString(); } } /// - /// + /// If true, enables AutoConnect /// public bool AutoReconnect { get; set; } @@ -164,7 +167,7 @@ namespace PepperDash.Core CTimer RetryTimer; /// - /// + /// Constructor /// /// /// @@ -180,26 +183,10 @@ namespace PepperDash.Core AutoReconnectIntervalMs = 5000; CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); - - //if (string.IsNullOrEmpty(address)) - //{ - // Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': No address set", key); - // return; - //} - //if (port < 1 || port > 65535) - //{ - // { - // Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': Invalid port", key); - // return; - // } - //} - - //Client = new TCPClient(address, port, bufferSize); - //Client.SocketStatusChange += Client_SocketStatusChange; } /// - /// + /// Constructor /// /// public GenericTcpIpClient(string key) @@ -241,18 +228,23 @@ namespace PepperDash.Core } } - //public override bool CustomActivate() - //{ - // return true; - //} - + /// + /// + /// + /// public override bool Deactivate() { - if(Client != null) - Client.SocketStatusChange -= this.Client_SocketStatusChange; + if (Client != null) + { + Client.SocketStatusChange -= this.Client_SocketStatusChange; + DisconnectClient(); + } return true; } + /// + /// Attempts to connect to the server + /// public void Connect() { if (IsConnected) @@ -274,6 +266,7 @@ namespace PepperDash.Core if (Client == null) { Client = new TCPClient(Hostname, Port, BufferSize); + Client.SocketStatusChange -= Client_SocketStatusChange; Client.SocketStatusChange += Client_SocketStatusChange; } DisconnectCalledByUser = false; @@ -281,23 +274,37 @@ namespace PepperDash.Core Client.ConnectToServerAsync(ConnectToServerCallback); // (null); } + /// + /// Attempts to disconnect the client + /// public void Disconnect() { - DisconnectCalledByUser = true; - DisconnectClient(); + if (Client != null) + { + DisconnectCalledByUser = true; + DisconnectClient(); + Client = null; + Debug.Console(1, this, "Disconnected"); + } } + /// + /// Does the actual disconnect business + /// public void DisconnectClient() { if (Client != null) { Debug.Console(1, this, "Disconnecting client"); - //Client.SocketStatusChange -= Client_SocketStatusChange; if(IsConnected) Client.DisconnectFromServer(); } } + /// + /// Callback method for connection attempt + /// + /// void ConnectToServerCallback(TCPClient c) { Debug.Console(1, this, "Server connection result: {0}", c.ClientStatus); @@ -305,6 +312,9 @@ namespace PepperDash.Core WaitAndTryReconnect(); } + /// + /// Disconnects, waits and attemtps to connect again + /// void WaitAndTryReconnect() { DisconnectClient(); @@ -314,6 +324,11 @@ namespace PepperDash.Core RetryTimer = new CTimer(o => { Client.ConnectToServerAsync(ConnectToServerCallback); }, AutoReconnectIntervalMs); } + /// + /// Recieves incoming data + /// + /// + /// void Receive(TCPClient client, int numBytes) { if (numBytes > 0) @@ -358,6 +373,10 @@ namespace PepperDash.Core SendText(unescapedText); } + /// + /// Sends Bytes to the server + /// + /// public void SendBytes(byte[] bytes) { //if (Debug.Level == 2) @@ -366,7 +385,11 @@ namespace PepperDash.Core Client.SendData(bytes, bytes.Length); } - + /// + /// Socket Status Change Handler + /// + /// + /// void Client_SocketStatusChange(TCPClient client, SocketStatus clientSocketStatus) { Debug.Console(1, this, "Socket status change {0} ({1})", clientSocketStatus, ClientStatusText); @@ -393,15 +416,30 @@ namespace PepperDash.Core } } + /// + /// Configuration properties for TCP/SSH Connections + /// public class TcpSshPropertiesConfig { + /// + /// Address to connect to + /// [JsonProperty(Required = Required.Always)] public string Address { get; set; } + /// + /// Port to connect to + /// [JsonProperty(Required = Required.Always)] public int Port { get; set; } + /// + /// Username credential + /// public string Username { get; set; } + /// + /// Passord credential + /// public string Password { get; set; } /// @@ -430,35 +468,4 @@ namespace PepperDash.Core } - //public class TcpIpConfig - //{ - // [JsonProperty(Required = Required.Always)] - // public string Address { get; set; } - - // [JsonProperty(Required = Required.Always)] - // public int Port { get; set; } - - // /// - // /// Defaults to 32768 - // /// - // public int BufferSize { get; set; } - - // /// - // /// Defaults to true - // /// - // public bool AutoReconnect { get; set; } - - // /// - // /// Defaults to 5000ms - // /// - // public int AutoReconnectIntervalMs { get; set; } - - // public TcpIpConfig() - // { - // BufferSize = 32768; - // AutoReconnect = true; - // AutoReconnectIntervalMs = 5000; - // } - //} - } \ No newline at end of file