Updates to Device to add PreActivate and PostActivate methods. GenericUdpServer initially tested and working.

This commit is contained in:
Neil Dorin
2018-12-14 16:54:31 -07:00
parent 61a94ec6d6
commit 4fc70731c1
3 changed files with 80 additions and 19 deletions

View File

@@ -13,7 +13,7 @@ using Newtonsoft.Json.Linq;
namespace PepperDash.Core namespace PepperDash.Core
{ {
public class GenericUdpServer : Device public class GenericUdpServer : Device, IBasicCommunication
{ {
/// <summary> /// <summary>
/// ///
@@ -31,6 +31,14 @@ namespace PepperDash.Core
//public event GenericSocketStatusChangeEventDelegate SocketStatusChange; //public event GenericSocketStatusChangeEventDelegate SocketStatusChange;
public event EventHandler<GenericSocketStatusChageEventArgs> ConnectionChange; public event EventHandler<GenericSocketStatusChageEventArgs> ConnectionChange;
public SocketStatus ClientStatus
{
get
{
return Server.ServerStatus;
}
}
/// <summary> /// <summary>
/// Address of server /// Address of server
/// </summary> /// </summary>
@@ -54,7 +62,7 @@ namespace PepperDash.Core
/// <summary> /// <summary>
/// Indicates that the UDP Server is enabled /// Indicates that the UDP Server is enabled
/// </summary> /// </summary>
public bool IsEnabled public bool IsConnected
{ {
get; get;
private set; private set;
@@ -75,6 +83,17 @@ namespace PepperDash.Core
BufferSize = buffefSize; BufferSize = buffefSize;
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); 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) void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
@@ -82,35 +101,53 @@ namespace PepperDash.Core
if (programEventType == eProgramStatusEventType.Stopping) if (programEventType == eProgramStatusEventType.Stopping)
{ {
Debug.Console(1, this, "Program stopping. Disabling Server"); Debug.Console(1, this, "Program stopping. Disabling Server");
Disable(); Disconnect();
} }
} }
/// <summary> /// <summary>
/// Enables the UDP Server /// Enables the UDP Server
/// </summary> /// </summary>
public void Enable() public void Connect()
{ {
if (Server == null) if (Server == null)
{ {
Server = new UDPServer(); Server = new UDPServer();
// Start receiving data
Server.ReceiveDataAsync(Receive);
} }
if (Server.EnableUDPServer() == SocketErrorCodes.SOCKET_OK) if (string.IsNullOrEmpty(Hostname))
IsEnabled = true; {
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);
} }
/// <summary> /// <summary>
/// Disabled the UDP Server /// Disabled the UDP Server
/// </summary> /// </summary>
public void Disable() public void Disconnect()
{ {
Server.DisableUDPServer(); if(Server != null)
Server.DisableUDPServer();
IsEnabled = false; IsConnected = false;
} }
@@ -121,20 +158,29 @@ namespace PepperDash.Core
/// <param name="numBytes"></param> /// <param name="numBytes"></param>
void Receive(UDPServer server, int numBytes) void Receive(UDPServer server, int numBytes)
{ {
Debug.Console(2, this, "Received {0} bytes", numBytes);
if (numBytes > 0) if (numBytes > 0)
{ {
var bytes = server.IncomingDataBuffer.Take(numBytes).ToArray(); var bytes = server.IncomingDataBuffer.Take(numBytes).ToArray();
Debug.Console(2, this, "Bytes: {0}", bytes.ToString());
var bytesHandler = BytesReceived; var bytesHandler = BytesReceived;
if (bytesHandler != null) if (bytesHandler != null)
bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes)); bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
else
Debug.Console(2, this, "bytesHandler is null");
var textHandler = TextReceived; var textHandler = TextReceived;
if (textHandler != null) if (textHandler != null)
{ {
var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length); var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
Debug.Console(2, this, "RX: {0}", str);
textHandler(this, new GenericCommMethodReceiveTextArgs(str)); textHandler(this, new GenericCommMethodReceiveTextArgs(str));
} }
else
Debug.Console(2, this, "textHandler is null");
} }
server.ReceiveDataAsync(Receive); server.ReceiveDataAsync(Receive);
} }
/// <summary> /// <summary>
@@ -145,15 +191,18 @@ namespace PepperDash.Core
{ {
var bytes = Encoding.GetEncoding(28591).GetBytes(text); 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); Server.SendData(bytes, bytes.Length);
}
} }
public void SendBytes(byte[] bytes) public void SendBytes(byte[] bytes)
{ {
//if (Debug.Level == 2) //if (Debug.Level == 2)
// Debug.Console(2, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes)); // 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); Server.SendData(bytes, bytes.Length);
} }

View File

@@ -68,6 +68,12 @@ namespace PepperDash.Core
_PostActivationActions.Add(act); _PostActivationActions.Add(act);
} }
public void PreActivate()
{
if (_PreActivationActions != null)
_PreActivationActions.ForEach(a => a.Invoke());
}
/// <summary> /// <summary>
/// Gets this device ready to be used in the system. Runs any added pre-activation items, and /// 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 /// all post-activation at end. Classes needing additional logic to
@@ -75,14 +81,20 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public bool Activate() public bool Activate()
{ {
if (_PreActivationActions != null) //if (_PreActivationActions != null)
_PreActivationActions.ForEach(a => a.Invoke()); // _PreActivationActions.ForEach(a => a.Invoke());
var result = CustomActivate(); var result = CustomActivate();
if(result && _PostActivationActions != null) //if(result && _PostActivationActions != null)
_PostActivationActions.ForEach(a => a.Invoke()); // _PostActivationActions.ForEach(a => a.Invoke());
return result; return result;
} }
public void PostActivate()
{
if (_PostActivationActions != null)
_PostActivationActions.ForEach(a => a.Invoke());
}
/// <summary> /// <summary>
/// Called in between Pre and PostActivationActions when Activate() is called. /// Called in between Pre and PostActivationActions when Activate() is called.
/// Override to provide addtitional setup when calling activation. Overriding classes /// Override to provide addtitional setup when calling activation. Overriding classes

View File

@@ -4,4 +4,4 @@
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Pepperdash_Core")] [assembly: AssemblyProduct("Pepperdash_Core")]
[assembly: AssemblyCopyright("Copyright © PepperDash 2016")] [assembly: AssemblyCopyright("Copyright © PepperDash 2016")]
[assembly: AssemblyVersion("1.0.10.*")] [assembly: AssemblyVersion("1.0.11.*")]