mirror of
https://github.com/PepperDash/PepperDashCore.git
synced 2026-02-16 05:04:48 +00:00
Merge pull request #101 from PepperDash/hotfix/udp-server-queue
removed udp server queue
This commit is contained in:
@@ -34,11 +34,6 @@ namespace PepperDash.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public event EventHandler<GenericUdpReceiveTextExtraArgs> DataRecievedExtra;
|
public event EventHandler<GenericUdpReceiveTextExtraArgs> DataRecievedExtra;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Queue to temporarily store received messages with the source IP and Port info
|
|
||||||
/// </summary>
|
|
||||||
private CrestronQueue<GenericUdpReceiveTextExtraArgs> MessageQueue;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -68,8 +63,6 @@ namespace PepperDash.Core
|
|||||||
get { return (ushort)Server.ServerStatus; }
|
get { return (ushort)Server.ServerStatus; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CCriticalSection DequeueLock;
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Address of server
|
/// Address of server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -124,8 +117,6 @@ namespace PepperDash.Core
|
|||||||
{
|
{
|
||||||
StreamDebugging = new CommunicationStreamDebugging(SplusKey);
|
StreamDebugging = new CommunicationStreamDebugging(SplusKey);
|
||||||
BufferSize = 5000;
|
BufferSize = 5000;
|
||||||
DequeueLock = new CCriticalSection();
|
|
||||||
MessageQueue = new CrestronQueue<GenericUdpReceiveTextExtraArgs>();
|
|
||||||
|
|
||||||
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
|
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
|
||||||
CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler);
|
CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler);
|
||||||
@@ -146,9 +137,6 @@ namespace PepperDash.Core
|
|||||||
Port = port;
|
Port = port;
|
||||||
BufferSize = buffefSize;
|
BufferSize = buffefSize;
|
||||||
|
|
||||||
DequeueLock = new CCriticalSection();
|
|
||||||
MessageQueue = new CrestronQueue<GenericUdpReceiveTextExtraArgs>();
|
|
||||||
|
|
||||||
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
|
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
|
||||||
CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler);
|
CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler);
|
||||||
}
|
}
|
||||||
@@ -186,11 +174,11 @@ namespace PepperDash.Core
|
|||||||
/// <param name="programEventType"></param>
|
/// <param name="programEventType"></param>
|
||||||
void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
|
void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
|
||||||
{
|
{
|
||||||
if (programEventType == eProgramStatusEventType.Stopping)
|
if (programEventType != eProgramStatusEventType.Stopping)
|
||||||
{
|
return;
|
||||||
Debug.Console(1, this, "Program stopping. Disabling Server");
|
|
||||||
Disconnect();
|
Debug.Console(1, this, "Program stopping. Disabling Server");
|
||||||
}
|
Disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -255,20 +243,27 @@ namespace PepperDash.Core
|
|||||||
{
|
{
|
||||||
Debug.Console(2, this, "Received {0} bytes", numBytes);
|
Debug.Console(2, this, "Received {0} bytes", numBytes);
|
||||||
|
|
||||||
if (numBytes > 0)
|
try
|
||||||
{
|
{
|
||||||
var sourceIp = Server.IPAddressLastMessageReceivedFrom;
|
if (numBytes <= 0)
|
||||||
var sourcePort = Server.IPPortLastMessageReceivedFrom;
|
return;
|
||||||
var bytes = server.IncomingDataBuffer.Take(numBytes).ToArray();
|
|
||||||
var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
|
|
||||||
MessageQueue.TryToEnqueue(new GenericUdpReceiveTextExtraArgs(str, sourceIp, sourcePort, bytes));
|
|
||||||
|
|
||||||
Debug.Console(2, this, "Bytes: {0}", bytes.ToString());
|
var sourceIp = Server.IPAddressLastMessageReceivedFrom;
|
||||||
|
var sourcePort = Server.IPPortLastMessageReceivedFrom;
|
||||||
|
var bytes = server.IncomingDataBuffer.Take(numBytes).ToArray();
|
||||||
|
var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
|
||||||
|
|
||||||
|
var dataRecivedExtra = DataRecievedExtra;
|
||||||
|
if (dataRecivedExtra != null)
|
||||||
|
dataRecivedExtra(this, new GenericUdpReceiveTextExtraArgs(str, sourceIp, sourcePort, bytes));
|
||||||
|
|
||||||
|
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
|
else
|
||||||
Debug.Console(2, this, "bytesHandler is null");
|
Debug.Console(2, this, "bytesHandler is null");
|
||||||
|
|
||||||
var textHandler = TextReceived;
|
var textHandler = TextReceived;
|
||||||
if (textHandler != null)
|
if (textHandler != null)
|
||||||
{
|
{
|
||||||
@@ -280,44 +275,16 @@ namespace PepperDash.Core
|
|||||||
else
|
else
|
||||||
Debug.Console(2, this, "textHandler is null");
|
Debug.Console(2, this, "textHandler is null");
|
||||||
}
|
}
|
||||||
server.ReceiveDataAsync(Receive);
|
catch (Exception ex)
|
||||||
|
{
|
||||||
// Attempt to enter the CCritical Secion and if we can, start the dequeue thread
|
Debug.Console(0, "GenericUdpServer Receive error: {0}{1}", ex.Message, ex.StackTrace);
|
||||||
var gotLock = DequeueLock.TryEnter();
|
}
|
||||||
if (gotLock)
|
finally
|
||||||
CrestronInvoke.BeginInvoke((o) => DequeueEvent());
|
{
|
||||||
|
server.ReceiveDataAsync(Receive);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This method gets spooled up in its own thread an protected by a CCriticalSection to prevent multiple threads from running concurrently.
|
|
||||||
/// It will dequeue items as they are enqueued automatically.
|
|
||||||
/// </summary>
|
|
||||||
void DequeueEvent()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
// Pull from Queue and fire an event. Block indefinitely until an item can be removed, similar to a Gather.
|
|
||||||
var message = MessageQueue.Dequeue();
|
|
||||||
var dataRecivedExtra = DataRecievedExtra;
|
|
||||||
if (dataRecivedExtra != null)
|
|
||||||
{
|
|
||||||
dataRecivedExtra(this, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GenericUdpServer DequeueEvent error: {0}\r", e);
|
|
||||||
}
|
|
||||||
// Make sure to leave the CCritical section in case an exception above stops this thread, or we won't be able to restart it.
|
|
||||||
if (DequeueLock != null)
|
|
||||||
{
|
|
||||||
DequeueLock.Leave();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// General send method
|
/// General send method
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user