diff --git a/Pepperdash Core/Pepperdash Core/Comm/GenericUdpServer.cs b/Pepperdash Core/Pepperdash Core/Comm/GenericUdpServer.cs index 06dd17c..a67a05f 100644 --- a/Pepperdash Core/Pepperdash Core/Comm/GenericUdpServer.cs +++ b/Pepperdash Core/Pepperdash Core/Comm/GenericUdpServer.cs @@ -13,7 +13,7 @@ using Newtonsoft.Json.Linq; namespace PepperDash.Core { - public class GenericUdpServer : Device + public class GenericUdpServer : Device, IBasicCommunication { /// /// @@ -31,6 +31,14 @@ namespace PepperDash.Core //public event GenericSocketStatusChangeEventDelegate SocketStatusChange; public event EventHandler ConnectionChange; + public SocketStatus ClientStatus + { + get + { + return Server.ServerStatus; + } + } + /// /// Address of server /// @@ -54,7 +62,7 @@ namespace PepperDash.Core /// /// Indicates that the UDP Server is enabled /// - public bool IsEnabled + public bool IsConnected { get; private set; @@ -75,6 +83,17 @@ namespace PepperDash.Core BufferSize = buffefSize; CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); + CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler); + } + + void CrestronEnvironment_EthernetEventHandler(EthernetEventArgs ethernetEventArgs) + { + // Re-enable the server if the link comes back up and the status should be connected + if (ethernetEventArgs.EthernetEventType == eEthernetEventType.LinkUp + && IsConnected) + { + Connect(); + } } void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType) @@ -82,35 +101,53 @@ namespace PepperDash.Core if (programEventType == eProgramStatusEventType.Stopping) { Debug.Console(1, this, "Program stopping. Disabling Server"); - Disable(); + Disconnect(); } } /// /// Enables the UDP Server /// - public void Enable() + public void Connect() { if (Server == null) { Server = new UDPServer(); - // Start receiving data - Server.ReceiveDataAsync(Receive); } - if (Server.EnableUDPServer() == SocketErrorCodes.SOCKET_OK) - IsEnabled = true; + if (string.IsNullOrEmpty(Hostname)) + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericUdpServer '{0}': No address set", Key); + return; + } + if (Port < 1 || Port > 65535) + { + { + Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericUdpServer '{0}': Invalid port", Key); + return; + } + } + + var status = Server.EnableUDPServer(Hostname, Port); + + Debug.Console(2, this, "SocketErrorCode: {0}", status); + if (status == SocketErrorCodes.SOCKET_OK) + IsConnected = true; + + // Start receiving data + Server.ReceiveDataAsync(Receive); } /// /// Disabled the UDP Server /// - public void Disable() + public void Disconnect() { - Server.DisableUDPServer(); + if(Server != null) + Server.DisableUDPServer(); - IsEnabled = false; + IsConnected = false; } @@ -121,20 +158,29 @@ namespace PepperDash.Core /// void Receive(UDPServer server, int numBytes) { + Debug.Console(2, this, "Received {0} bytes", numBytes); + if (numBytes > 0) { var bytes = server.IncomingDataBuffer.Take(numBytes).ToArray(); + + Debug.Console(2, this, "Bytes: {0}", bytes.ToString()); var bytesHandler = BytesReceived; if (bytesHandler != null) bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes)); + else + Debug.Console(2, this, "bytesHandler is null"); var textHandler = TextReceived; if (textHandler != null) { var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length); + Debug.Console(2, this, "RX: {0}", str); textHandler(this, new GenericCommMethodReceiveTextArgs(str)); } + else + Debug.Console(2, this, "textHandler is null"); } - server.ReceiveDataAsync(Receive); + server.ReceiveDataAsync(Receive); } /// @@ -145,15 +191,18 @@ namespace PepperDash.Core { var bytes = Encoding.GetEncoding(28591).GetBytes(text); - if (IsEnabled && Server != null) + if (IsConnected && Server != null) + { + Debug.Console(2, this, "TX: {0}", text); Server.SendData(bytes, bytes.Length); + } } public void SendBytes(byte[] bytes) { //if (Debug.Level == 2) // Debug.Console(2, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes)); - if (IsEnabled && Server != null) + if (IsConnected && Server != null) Server.SendData(bytes, bytes.Length); } diff --git a/Pepperdash Core/Pepperdash Core/Device.cs b/Pepperdash Core/Pepperdash Core/Device.cs index 6f02fc4..7132f94 100644 --- a/Pepperdash Core/Pepperdash Core/Device.cs +++ b/Pepperdash Core/Pepperdash Core/Device.cs @@ -68,6 +68,12 @@ namespace PepperDash.Core _PostActivationActions.Add(act); } + public void PreActivate() + { + if (_PreActivationActions != null) + _PreActivationActions.ForEach(a => a.Invoke()); + } + /// /// Gets this device ready to be used in the system. Runs any added pre-activation items, and /// all post-activation at end. Classes needing additional logic to @@ -75,14 +81,20 @@ namespace PepperDash.Core /// public bool Activate() { - if (_PreActivationActions != null) - _PreActivationActions.ForEach(a => a.Invoke()); + //if (_PreActivationActions != null) + // _PreActivationActions.ForEach(a => a.Invoke()); var result = CustomActivate(); - if(result && _PostActivationActions != null) - _PostActivationActions.ForEach(a => a.Invoke()); + //if(result && _PostActivationActions != null) + // _PostActivationActions.ForEach(a => a.Invoke()); return result; } + public void PostActivate() + { + if (_PostActivationActions != null) + _PostActivationActions.ForEach(a => a.Invoke()); + } + /// /// Called in between Pre and PostActivationActions when Activate() is called. /// Override to provide addtitional setup when calling activation. Overriding classes diff --git a/Pepperdash Core/Pepperdash Core/Properties/AssemblyInfo.cs b/Pepperdash Core/Pepperdash Core/Properties/AssemblyInfo.cs index 499d151..f1c301a 100644 --- a/Pepperdash Core/Pepperdash Core/Properties/AssemblyInfo.cs +++ b/Pepperdash Core/Pepperdash Core/Properties/AssemblyInfo.cs @@ -4,4 +4,4 @@ [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Pepperdash_Core")] [assembly: AssemblyCopyright("Copyright © PepperDash 2016")] -[assembly: AssemblyVersion("1.0.10.*")] +[assembly: AssemblyVersion("1.0.11.*")]