diff --git a/.gitignore b/.gitignore
index 6c7cb0d..744fc2c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -397,3 +397,5 @@ FodyWeavers.xsd
# JetBrains Rider
*.sln.iml
*.projectinfo
+
+output/
\ No newline at end of file
diff --git a/output/PepperDashCore.2.0.0-local.clz b/output/PepperDashCore.2.0.0-local.clz
deleted file mode 100644
index c4f7a62..0000000
Binary files a/output/PepperDashCore.2.0.0-local.clz and /dev/null differ
diff --git a/src/Comm/._GenericSshClient.cs b/src/Comm/._GenericSshClient.cs
deleted file mode 100644
index 583c583..0000000
Binary files a/src/Comm/._GenericSshClient.cs and /dev/null differ
diff --git a/src/Comm/._GenericTcpIpClient.cs b/src/Comm/._GenericTcpIpClient.cs
deleted file mode 100644
index b65487e..0000000
Binary files a/src/Comm/._GenericTcpIpClient.cs and /dev/null differ
diff --git a/src/Comm/DynamicTCPServer.cs b/src/Comm/DynamicTCPServer.cs
deleted file mode 100644
index c74219d..0000000
--- a/src/Comm/DynamicTCPServer.cs
+++ /dev/null
@@ -1,684 +0,0 @@
-/*PepperDash Technology Corp.
-JAG
-Copyright: 2017
-------------------------------------
-***Notice of Ownership and Copyright***
-The material in which this notice appears is the property of PepperDash Technology Corporation,
-which claims copyright under the laws of the United States of America in the entire body of material
-and in all parts thereof, regardless of the use to which it is being put. Any use, in whole or in part,
-of this material by another party without the express written permission of PepperDash Technology Corporation is prohibited.
-PepperDash Technology Corporation reserves all rights under applicable laws.
------------------------------------- */
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharp.CrestronSockets;
-using PepperDash.Core;
-
-namespace DynamicTCP
-{
- public class DynamicTCPServer : Device
- {
- #region Events
- ///
- /// Event for Receiving text
- ///
- public event EventHandler TextReceived;
-
- ///
- /// Event for client connection socket status change
- ///
- public event EventHandler ClientConnectionChange;
-
- ///
- /// Event for Server State Change
- ///
- public event EventHandler ServerStateChange;
- #endregion
-
- #region Properties/Variables
- ///
- /// Secure or unsecure TCP server. Defaults to Unsecure or standard TCP server without SSL
- ///
- public bool Secure { get; set; }
-
- ///
- /// S+ Helper for Secure bool. Parameter in SIMPL+ so there is no get, one way set from simpl+ Param to property in func main of SIMPL+
- ///
- public ushort USecure
- {
- set
- {
- if (value == 1)
- Secure = true;
- else if (value == 0)
- Secure = false;
- }
- }
-
- ///
- /// Text representation of the Socket Status enum values for the server
- ///
- public string Status
- {
- get
- {
- if (Secure ? SecureServer != null : UnsecureServer != null)
- return Secure ? SecureServer.State.ToString() : UnsecureServer.State.ToString();
- else
- return "";
- }
-
- }
-
- ///
- /// Bool showing if socket is connected
- ///
- public bool IsConnected
- {
- get
- {
- return (Secure ? SecureServer != null : UnsecureServer != null) &&
- (Secure ? SecureServer.State == ServerState.SERVER_CONNECTED : UnsecureServer.State == ServerState.SERVER_CONNECTED);
- }
- }
-
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsConnected
- {
- get { return (ushort)(IsConnected ? 1 : 0); }
- }
-
- ///
- /// Bool showing if socket is connected
- ///
- public bool IsListening
- {
- get { return (Secure ? SecureServer != null : UnsecureServer != null) &&
- (Secure ? SecureServer.State == ServerState.SERVER_LISTENING : UnsecureServer.State == ServerState.SERVER_LISTENING); }
- }
-
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsListening
- {
- get { return (ushort)(IsListening ? 1 : 0); }
- }
-
- public ushort MaxClients { get; set; } // should be set by parameter in SIMPL+ in the MAIN method, Should not ever need to be configurable
- ///
- /// Number of clients currently connected.
- ///
- public ushort NumberOfClientsConnected
- {
- get
- {
- if (Secure ? SecureServer != null : UnsecureServer != null)
- return Secure ? (ushort)SecureServer.NumberOfClientsConnected : (ushort)UnsecureServer.NumberOfClientsConnected;
- return 0;
- }
- }
-
- ///
- /// Port Server should listen on
- ///
- public int Port { get; set; }
-
- ///
- /// S+ helper for Port
- ///
- public ushort UPort
- {
- get { return Convert.ToUInt16(Port); }
- set { Port = Convert.ToInt32(value); }
- }
-
- ///
- /// Bool to show whether the server requires a preshared key. Must be set the same in the client, and if true shared keys must be identical on server/client
- ///
- public bool SharedKeyRequired { get; set; }
-
- ///
- /// S+ helper for requires shared key bool
- ///
- public ushort USharedKeyRequired
- {
- set
- {
- if (value == 1)
- SharedKeyRequired = true;
- else
- SharedKeyRequired = false;
- }
- }
-
- ///
- /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module.
- /// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called
- ///
- public string SharedKey { get; set; }
-
- ///
- /// Heartbeat Required bool sets whether server disconnects client if heartbeat is not received
- ///
- public bool HeartbeatRequired { get; set; }
-
- ///
- /// S+ Helper for Heartbeat Required
- ///
- public ushort UHeartbeatRequired
- {
- set
- {
- if (value == 1)
- HeartbeatRequired = true;
- else
- HeartbeatRequired = false;
- }
- }
-
- ///
- /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+
- ///
- public int HeartbeatRequiredIntervalMs { get; set; }
-
- ///
- /// Simpl+ Heartbeat Analog value in seconds
- ///
- public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } }
-
- ///
- /// String to Match for heartbeat. If null or empty any string will reset heartbeat timer
- ///
- public string HeartbeatStringToMatch { get; set; }
-
- //private timers for Heartbeats per client
- Dictionary HeartbeatTimerDictionary = new Dictionary();
-
- //flags to show the secure server is waiting for client at index to send the shared key
- List WaitingForSharedKey = new List();
-
- //Store the connected client indexes
- List ConnectedClientsIndexes = new List();
-
- ///
- /// Defaults to 2000
- ///
- public int BufferSize { get; set; }
-
- ///
- /// Private flag to note that the server has stopped intentionally
- ///
- private bool ServerStopped { get; set; }
-
- //Servers
- SecureTCPServer SecureServer;
- TCPServer UnsecureServer;
-
- #endregion
-
- #region Constructors
- ///
- /// constructor
- ///
- public DynamicTCPServer()
- : base("Uninitialized Dynamic TCP Server")
- {
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- BufferSize = 2000;
- Secure = false;
- }
- #endregion
-
- #region Methods - Server Actions
- ///
- /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+
- ///
- ///
- public void Initialize(string key)
- {
- Key = key;
- }
-
- ///
- /// Start listening on the specified port
- ///
- public void Listen()
- {
- try
- {
- if (Port < 1 || Port > 65535)
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericSecureTcpClient '{0}': Invalid port", Key);
- ErrorLog.Warn(string.Format("GenericSecureTcpClient '{0}': Invalid port", Key));
- return;
- }
- if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericSecureTcpClient '{0}': No Shared Key set", Key);
- ErrorLog.Warn(string.Format("GenericSecureTcpClient '{0}': No Shared Key set", Key));
- return;
- }
- if (IsListening)
- return;
- if (Secure)
- {
- SecureServer = new SecureTCPServer(Port, MaxClients);
- SecureServer.SocketStatusChange += new SecureTCPServerSocketStatusChangeEventHandler(SecureServer_SocketStatusChange);
- ServerStopped = false;
- SecureServer.WaitForConnectionAsync(IPAddress.Any, SecureConnectCallback);
- onServerStateChange();
- Debug.Console(2, "Secure Server Status: {0}, Socket Status: {1}\r\n", SecureServer.State.ToString(), SecureServer.ServerSocketStatus);
- }
- else
- {
- UnsecureServer = new TCPServer(Port, MaxClients);
- UnsecureServer.SocketStatusChange += new TCPServerSocketStatusChangeEventHandler(UnsecureServer_SocketStatusChange);
- ServerStopped = false;
- UnsecureServer.WaitForConnectionAsync(IPAddress.Any, UnsecureConnectCallback);
- onServerStateChange();
- Debug.Console(2, "Unsecure Server Status: {0}, Socket Status: {1}\r\n", UnsecureServer.State.ToString(), UnsecureServer.ServerSocketStatus);
- }
- }
- catch (Exception ex)
- {
- ErrorLog.Error("Error with Dynamic Server: {0}", ex.ToString());
- }
- }
-
- ///
- /// Stop Listeneing
- ///
- public void StopListening()
- {
- Debug.Console(2, "Stopping Listener");
- if (SecureServer != null)
- SecureServer.Stop();
- if (UnsecureServer != null)
- UnsecureServer.Stop();
- ServerStopped = true;
- onServerStateChange();
- }
-
- ///
- /// Disconnect All Clients
- ///
- public void DisconnectAllClients()
- {
- Debug.Console(2, "Disconnecting All Clients");
- if (SecureServer != null)
- SecureServer.DisconnectAll();
- if (UnsecureServer != null)
- UnsecureServer.DisconnectAll();
- onConnectionChange();
- onServerStateChange(); //State shows both listening and connected
- }
-
- ///
- /// Broadcast text from server to all connected clients
- ///
- ///
- public void BroadcastText(string text)
- {
- if (ConnectedClientsIndexes.Count > 0)
- {
- byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
- if (Secure)
- foreach (uint i in ConnectedClientsIndexes)
- SecureServer.SendDataAsync(i, b, b.Length, SecureSendDataAsyncCallback);
- else
- foreach (uint i in ConnectedClientsIndexes)
- UnsecureServer.SendDataAsync(i, b, b.Length, UnsecureSendDataAsyncCallback);
- }
- }
-
- ///
- /// Not sure this is useful in library, maybe Pro??
- ///
- ///
- ///
- public void SendTextToClient(string text, uint clientIndex)
- {
- byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
- if (Secure)
- SecureServer.SendDataAsync(clientIndex, b, b.Length, SecureSendDataAsyncCallback);
- else
- UnsecureServer.SendDataAsync(clientIndex, b, b.Length, UnsecureSendDataAsyncCallback);
- }
-
- //private method to check heartbeat requirements and start or reset timer
- void checkHeartbeat(uint clientIndex, string received)
- {
- if (HeartbeatRequired)
- {
- if (!string.IsNullOrEmpty(HeartbeatStringToMatch))
- {
- if (received == HeartbeatStringToMatch)
- {
- if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
- HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs);
- else
- {
- CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
- HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
- }
- }
- }
- else
- {
- if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
- HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs);
- else
- {
- CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
- HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
- }
- }
- }
- }
- #endregion
-
- #region Methods - HeartbeatTimer Callback
-
- void HeartbeatTimer_CallbackFunction(object o)
- {
- uint clientIndex = (uint)o;
-
- string address = Secure ? SecureServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex) :
- UnsecureServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex);
-
- ErrorLog.Error("Heartbeat not received for Client at IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE", address);
- Debug.Console(2, "Heartbeat not received for Client at IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE", address);
-
- SendTextToClient("Heartbeat not received by server, closing connection", clientIndex);
-
- if (Secure)
- SecureServer.Disconnect(clientIndex);
- else
- UnsecureServer.Disconnect(clientIndex);
- HeartbeatTimerDictionary.Remove(clientIndex);
- }
-
- #endregion
-
- #region Methods - Socket Status Changed Callbacks
- ///
- /// Secure Server Socket Status Changed Callback
- ///
- ///
- ///
- ///
- void SecureServer_SocketStatusChange(SecureTCPServer server, uint clientIndex, SocketStatus serverSocketStatus)
- {
- Debug.Console(2, "Client at {0} ServerSocketStatus {1}",
- server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), serverSocketStatus.ToString());
- if (server.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- if (SharedKeyRequired && !WaitingForSharedKey.Contains(clientIndex))
- WaitingForSharedKey.Add(clientIndex);
- if (!ConnectedClientsIndexes.Contains(clientIndex))
- ConnectedClientsIndexes.Add(clientIndex);
- }
- else
- {
- if (ConnectedClientsIndexes.Contains(clientIndex))
- ConnectedClientsIndexes.Remove(clientIndex);
- if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex))
- HeartbeatTimerDictionary.Remove(clientIndex);
- }
- if(SecureServer.ServerSocketStatus.ToString() != Status)
- onConnectionChange();
- }
-
- ///
- /// TCP Server (Unsecure) Socket Status Change Callback
- ///
- ///
- ///
- ///
- void UnsecureServer_SocketStatusChange(TCPServer server, uint clientIndex, SocketStatus serverSocketStatus)
- {
- Debug.Console(2, "Client at {0} ServerSocketStatus {1}",
- server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), serverSocketStatus.ToString());
- if (server.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- if (SharedKeyRequired && !WaitingForSharedKey.Contains(clientIndex))
- WaitingForSharedKey.Add(clientIndex);
- if (!ConnectedClientsIndexes.Contains(clientIndex))
- ConnectedClientsIndexes.Add(clientIndex);
- }
- else
- {
- if (ConnectedClientsIndexes.Contains(clientIndex))
- ConnectedClientsIndexes.Remove(clientIndex);
- if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex))
- HeartbeatTimerDictionary.Remove(clientIndex);
- }
- if (UnsecureServer.ServerSocketStatus.ToString() != Status)
- onConnectionChange();
- }
- #endregion
-
- #region Methods Connected Callbacks
- ///
- /// Secure TCP Client Connected to Secure Server Callback
- ///
- ///
- ///
- void SecureConnectCallback(SecureTCPServer mySecureTCPServer, uint clientIndex)
- {
- if (mySecureTCPServer.ClientConnected(clientIndex))
- {
- if (SharedKeyRequired)
- {
- byte[] b = Encoding.GetEncoding(28591).GetBytes(SharedKey + "\n");
- mySecureTCPServer.SendDataAsync(clientIndex, b, b.Length, SecureSendDataAsyncCallback);
- Debug.Console(2, "Sent Shared Key to client at {0}", mySecureTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
- }
- if (HeartbeatRequired)
- {
- CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
- HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
- }
- mySecureTCPServer.ReceiveDataAsync(clientIndex, SecureReceivedDataAsyncCallback);
- if (mySecureTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped)
- mySecureTCPServer.WaitForConnectionAsync(IPAddress.Any, SecureConnectCallback);
- }
- }
-
- ///
- /// Unsecure TCP Client Connected to Unsecure Server Callback
- ///
- ///
- ///
- void UnsecureConnectCallback(TCPServer myTCPServer, uint clientIndex)
- {
- if (myTCPServer.ClientConnected(clientIndex))
- {
- if (SharedKeyRequired)
- {
- byte[] b = Encoding.GetEncoding(28591).GetBytes(SharedKey + "\n");
- myTCPServer.SendDataAsync(clientIndex, b, b.Length, UnsecureSendDataAsyncCallback);
- Debug.Console(2, "Sent Shared Key to client at {0}", myTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
- }
- if (HeartbeatRequired)
- {
- CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
- HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
- }
- myTCPServer.ReceiveDataAsync(clientIndex, UnsecureReceivedDataAsyncCallback);
- if (myTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped)
- myTCPServer.WaitForConnectionAsync(IPAddress.Any, UnsecureConnectCallback);
- }
- if (myTCPServer.State != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped)
- myTCPServer.WaitForConnectionAsync(IPAddress.Any, UnsecureConnectCallback);
- }
- #endregion
-
- #region Methods - Send/Receive Callbacks
- ///
- /// Secure Send Data Async Callback
- ///
- ///
- ///
- ///
- void SecureSendDataAsyncCallback(SecureTCPServer mySecureTCPServer, uint clientIndex, int numberOfBytesSent)
- {
- //Seems there is nothing to do here
- }
-
- ///
- /// Unsecure Send Data Asyc Callback
- ///
- ///
- ///
- ///
- void UnsecureSendDataAsyncCallback(TCPServer myTCPServer, uint clientIndex, int numberOfBytesSent)
- {
- //Seems there is nothing to do here
- }
-
- ///
- /// Secure Received Data Async Callback
- ///
- ///
- ///
- ///
- void SecureReceivedDataAsyncCallback(SecureTCPServer mySecureTCPServer, uint clientIndex, int numberOfBytesReceived)
- {
- if (numberOfBytesReceived > 0)
- {
- string received = "Nothing";
- byte[] bytes = mySecureTCPServer.GetIncomingDataBufferForSpecificClient(clientIndex);
- received = System.Text.Encoding.GetEncoding(28591).GetString(bytes, 0, numberOfBytesReceived);
- if (WaitingForSharedKey.Contains(clientIndex))
- {
- received = received.Replace("\r", "");
- received = received.Replace("\n", "");
- if (received != SharedKey)
- {
- byte[] b = Encoding.GetEncoding(28591).GetBytes("Shared key did not match server. Disconnecting");
- Debug.Console(2, "Client at index {0} Shared key did not match the server, disconnecting client", clientIndex);
- ErrorLog.Error("Client at index {0} Shared key did not match the server, disconnecting client", clientIndex);
- mySecureTCPServer.SendDataAsync(clientIndex, b, b.Length, null);
- mySecureTCPServer.Disconnect(clientIndex);
- }
- if (mySecureTCPServer.NumberOfClientsConnected > 0)
- mySecureTCPServer.ReceiveDataAsync(SecureReceivedDataAsyncCallback);
- WaitingForSharedKey.Remove(clientIndex);
- byte[] skResponse = Encoding.GetEncoding(28591).GetBytes("Shared Key Match, Connected and ready for communication");
- mySecureTCPServer.SendDataAsync(clientIndex, skResponse, skResponse.Length, null);
- mySecureTCPServer.ReceiveDataAsync(SecureReceivedDataAsyncCallback);
- }
- else
- {
- mySecureTCPServer.ReceiveDataAsync(SecureReceivedDataAsyncCallback);
- Debug.Console(2, "Secure Server Listening on Port: {0}, client IP: {1}, NumberOfBytesReceived: {2}, Received: {3}\r\n",
- mySecureTCPServer.PortNumber, mySecureTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), numberOfBytesReceived, received);
- onTextReceived(received);
- }
- checkHeartbeat(clientIndex, received);
- }
- if (mySecureTCPServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
- mySecureTCPServer.ReceiveDataAsync(clientIndex, SecureReceivedDataAsyncCallback);
- }
-
- ///
- /// Unsecure Received Data Async Callback
- ///
- ///
- ///
- ///
- void UnsecureReceivedDataAsyncCallback(TCPServer myTCPServer, uint clientIndex, int numberOfBytesReceived)
- {
- if (numberOfBytesReceived > 0)
- {
- string received = "Nothing";
- byte[] bytes = myTCPServer.GetIncomingDataBufferForSpecificClient(clientIndex);
- received = System.Text.Encoding.GetEncoding(28591).GetString(bytes, 0, numberOfBytesReceived);
- if (WaitingForSharedKey.Contains(clientIndex))
- {
- received = received.Replace("\r", "");
- received = received.Replace("\n", "");
- if (received != SharedKey)
- {
- byte[] b = Encoding.GetEncoding(28591).GetBytes("Shared key did not match server. Disconnecting");
- Debug.Console(2, "Client at index {0} Shared key did not match the server, disconnecting client", clientIndex);
- ErrorLog.Error("Client at index {0} Shared key did not match the server, disconnecting client", clientIndex);
- myTCPServer.SendDataAsync(clientIndex, b, b.Length, null);
- myTCPServer.Disconnect(clientIndex);
- }
- if (myTCPServer.NumberOfClientsConnected > 0)
- myTCPServer.ReceiveDataAsync(UnsecureReceivedDataAsyncCallback);
- WaitingForSharedKey.Remove(clientIndex);
- byte[] skResponse = Encoding.GetEncoding(28591).GetBytes("Shared Key Match, Connected and ready for communication");
- myTCPServer.SendDataAsync(clientIndex, skResponse, skResponse.Length, null);
- myTCPServer.ReceiveDataAsync(UnsecureReceivedDataAsyncCallback);
- }
- else
- {
- myTCPServer.ReceiveDataAsync(UnsecureReceivedDataAsyncCallback);
- Debug.Console(2, "Secure Server Listening on Port: {0}, client IP: {1}, NumberOfBytesReceived: {2}, Received: {3}\r\n",
- myTCPServer.PortNumber, myTCPServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex), numberOfBytesReceived, received);
- onTextReceived(received);
- }
- checkHeartbeat(clientIndex, received);
- }
- if (myTCPServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
- myTCPServer.ReceiveDataAsync(clientIndex, UnsecureReceivedDataAsyncCallback);
- }
- #endregion
-
- #region Methods - EventHelpers/Callbacks
- //Private Helper method to call the Connection Change Event
- void onConnectionChange()
- {
- var handler = ClientConnectionChange;
- if (handler != null)
- {
- if (Secure)
- handler(this, new DynamicTCPSocketStatusChangeEventArgs(SecureServer, Secure));
- else
- handler(this, new DynamicTCPSocketStatusChangeEventArgs(UnsecureServer, Secure));
- }
- }
-
- //Private Helper Method to call the Text Received Event
- void onTextReceived(string text)
- {
- var handler = TextReceived;
- if (handler != null)
- handler(this, new CopyCoreForSimplpGenericCommMethodReceiveTextArgs(text));
- }
-
- //Private Helper Method to call the Server State Change Event
- void onServerStateChange()
- {
- var handler = ServerStateChange;
- if(handler != null)
- {
- if(Secure)
- handler(this, new DynamicTCPServerStateChangedEventArgs(SecureServer, Secure));
- else
- handler(this, new DynamicTCPServerStateChangedEventArgs(UnsecureServer, Secure));
- }
- }
-
- //Private Event Handler method to handle the closing of connections when the program stops
- void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
- {
- if (programEventType == eProgramStatusEventType.Stopping)
- {
- Debug.Console(1, this, "Program stopping. Closing server");
- DisconnectAllClients();
- StopListening();
- }
- }
- #endregion
- }
-}
\ No newline at end of file
diff --git a/src/Comm/FINISH CommStatic.cs b/src/Comm/FINISH CommStatic.cs
deleted file mode 100644
index 70f105e..0000000
--- a/src/Comm/FINISH CommStatic.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-
-namespace PepperDash.Core
-{
- ///
- /// Background class that manages debug features for sockets
- ///
- public static class CommStatic
- {
- static List Sockets = new List();
-
- ///
- /// Sets up the backing class. Adds console commands for S#Pro programs
- ///
- static CommStatic()
- {
- if (CrestronEnvironment.RuntimeEnvironment == eRuntimeEnvironment.SimplSharpPro)
- {
- CrestronConsole.AddNewConsoleCommand(SocketCommand, "socket", "socket commands: list, send, connect, disco",
- ConsoleAccessLevelEnum.AccessOperator);
- }
- }
-
- static void SocketCommand(string s)
- {
- // 0 1 2
- //socket command number/key/all param
- //socket list
- //socket send 4 ver -v\n
-
- if (string.IsNullOrEmpty(s))
- return;
- var tokens = s.Split(' ');
- if (tokens.Length == 0)
- return;
- var command = tokens[0].ToLower();
- if(command == "connect")
- {
-
- }
- else if(command == "disco")
- {
-
- }
- else if(command =="list")
- {
- CrestronConsole.ConsoleCommandResponse("{0} sockets", Sockets.Count);
- if(Sockets.Count == 0)
- return;
- // get the longest key name, for formatting
- var longestLength = Sockets.Aggregate("",
- (max, cur) => max.Length > cur.Key.Length ? max : cur.Key).Length;
- for(int i = 0; i < Sockets.Count; i++)
- {
- var sock = Sockets[i];
- CrestronConsole.ConsoleCommandResponse("{0} {1} {2} {3}",
- i, sock.Key, GetSocketType(sock), sock.ClientStatus);
- }
- }
- else if(command == "send")
- {
-
- }
- }
-
- ///
- /// Helper for socket list, to show types
- ///
- static string GetSocketType(ISocketStatus sock)
- {
- if (sock is GenericSshClient)
- return "SSH";
- else if (sock is GenericTcpIpClient)
- return "TCP-IP";
- else
- return "?";
- }
-
-
- ///
- ///
- ///
- ///
- public static void AddSocket(ISocketStatus socket)
- {
- if(!Sockets.Contains(socket))
- Sockets.Add(socket);
- }
-
- ///
- ///
- ///
- ///
- public static void RemoveSocket(ISocketStatus socket)
- {
- if (Sockets.Contains(socket))
- Sockets.Remove(socket);
- }
- }
-}
\ No newline at end of file
diff --git a/src/Comm/GenericHttpSseClient.cs b/src/Comm/GenericHttpSseClient.cs
deleted file mode 100644
index 6992ef7..0000000
--- a/src/Comm/GenericHttpSseClient.cs
+++ /dev/null
@@ -1,314 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharp.CrestronIO;
-using Crestron.SimplSharp.Net.Http;
-
-namespace PepperDash.Core
-{
- ///
- /// Client for communicating with an HTTP Server Side Event pattern
- ///
- public class GenericHttpSseClient : ICommunicationReceiver
- {
- ///
- /// Notifies when bytes have been received
- ///
- public event EventHandler BytesReceived;
- ///
- /// Notifies when text has been received
- ///
- public event EventHandler TextReceived;
-
- ///
- /// Indicates connection status
- ///
- public bool IsConnected
- {
- get;
- private set;
- }
-
- ///
- /// Unique identifier for the instance
- ///
- public string Key
- {
- get;
- private set;
- }
-
- ///
- /// Name for the instance
- ///
- public string Name
- {
- get;
- private set;
- }
-
- ///
- /// URL of the server
- ///
- public string Url { get; set; }
-
- HttpClient Client;
- HttpClientRequest Request;
-
- ///
- /// Constructor
- ///
- ///
- ///
- public GenericHttpSseClient(string key, string name)
- {
- Key = key;
- Name = name;
- }
-
- ///
- /// Connects to the server. Requires Url to be set first.
- ///
- public void Connect()
- {
- InitiateConnection(Url);
- }
-
- ///
- /// Disconnects from the server
- ///
- public void Disconnect()
- {
- CloseConnection(null);
- }
-
- ///
- /// Initiates connection to the server
- ///
- ///
- public void InitiateConnection(string url)
- {
- CrestronInvoke.BeginInvoke(o =>
- {
- try
- {
- if(string.IsNullOrEmpty(url))
- {
- Debug.Console(0, this, "Error connecting to Server. No URL specified");
- return;
- }
-
- Client = new HttpClient();
- Request = new HttpClientRequest();
- Client.Verbose = true;
- Client.KeepAlive = true;
- Request.Url.Parse(url);
- Request.RequestType = RequestType.Get;
- Request.Header.SetHeaderValue("Accept", "text/event-stream");
-
- // In order to get a handle on the response stream, we have to get
- // the request stream first. Boo
- Client.BeginGetRequestStream(GetRequestStreamCallback, Request, null);
- CrestronConsole.PrintLine("Request made!");
- }
- catch (Exception e)
- {
- ErrorLog.Notice("Exception occured in AsyncWebPostHttps(): " + e.ToString());
- }
- });
- }
-
- ///
- /// Closes the connection to the server
- ///
- ///
- public void CloseConnection(string s)
- {
- if (Client != null)
- {
- Client.Abort();
- IsConnected = false;
-
- Debug.Console(1, this, "Client Disconnected");
- }
- }
-
- private void GetRequestStreamCallback(HttpClientRequest request, HTTP_CALLBACK_ERROR error, object status)
- {
-
- try
- {
- // End the the async request operation and return the data stream
- Stream requestStream = request.ThisClient.EndGetRequestStream(request, null);
- // If this were something other than a GET we could write to the stream here
-
- // Closing makes the request happen
- requestStream.Close();
-
- // Get a handle on the response stream.
- request.ThisClient.BeginGetResponseStream(GetResponseStreamCallback, request, status);
- }
- catch (Exception e)
- {
- ErrorLog.Notice("Exception occured in GetSecureRequestStreamCallback(): " + e.ToString());
- }
- }
-
- ///
- ///
- ///
- ///
- ///
- ///
- private void GetResponseStreamCallback(HttpClientRequest request, HTTP_CALLBACK_ERROR error, object status)
- {
- try
- {
- // This closes up the GetResponseStream async
- var response = request.ThisClient.EndGetResponseStream(request);
-
- response.DataConnection.OnBytesReceived += new EventHandler(DataConnection_OnBytesReceived);
-
- IsConnected = true;
-
- Debug.Console(1, this, "Client Disconnected");
-
- Stream streamResponse = response.ContentStream;
- // Object containing various states to be passed back to async callback below
- RequestState asyncState = new RequestState();
- asyncState.Request = request;
- asyncState.Response = response;
- asyncState.StreamResponse = streamResponse;
- asyncState.HttpClient = request.ThisClient;
-
- // This processes the ongoing data stream
- Crestron.SimplSharp.CrestronIO.IAsyncResult asyncResult = null;
- do
- {
- asyncResult = streamResponse.BeginRead(asyncState.BufferRead, 0, RequestState.BUFFER_SIZE,
- new Crestron.SimplSharp.CrestronIO.AsyncCallback(ReadCallBack), asyncState);
- }
- while (asyncResult.CompletedSynchronously && !asyncState.Done);
-
- //Console.WriteLine("\r\nExit Response Callback\r\n");
- }
- catch (Exception e)
- {
- ErrorLog.Notice("Exception occured in GetSecureRequestStreamCallback(): " + e.ToString());
- }
- }
-
- void DataConnection_OnBytesReceived(object sender, EventArgs e)
- {
- Debug.Console(1, this, "DataConnection OnBytesReceived Fired");
- }
-
- private void ReadCallBack(Crestron.SimplSharp.CrestronIO.IAsyncResult asyncResult)
- {
- //we are getting back everything here, so cast the state from the call
- RequestState requestState = asyncResult.AsyncState as RequestState;
- Stream responseStream = requestState.StreamResponse;
-
- int read = responseStream.EndRead(asyncResult);
- // Read the HTML page and then print it to the console.
- if (read > 0)
- {
- var bytes = requestState.BufferRead;
-
- var bytesHandler = BytesReceived;
- if (bytesHandler != null)
- bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
- var textHandler = TextReceived;
- if (textHandler != null)
- {
- var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
- textHandler(this, new GenericCommMethodReceiveTextArgs(str));
- }
-
- //requestState.RequestData.Append(Encoding.ASCII.GetString(requestState.BufferRead, 0, read));
- //CrestronConsole.PrintLine(requestState.RequestData.ToString());
-
- //clear the byte array buffer used.
- Array.Clear(requestState.BufferRead, 0, requestState.BufferRead.Length);
-
- if (asyncResult.CompletedSynchronously)
- {
- return;
- }
-
- Crestron.SimplSharp.CrestronIO.IAsyncResult asynchronousResult;
- do
- {
- asynchronousResult = responseStream.BeginRead(requestState.BufferRead, 0, RequestState.BUFFER_SIZE,
- new Crestron.SimplSharp.CrestronIO.AsyncCallback(ReadCallBack), requestState);
- }
- while (asynchronousResult.CompletedSynchronously && !requestState.Done);
- }
- else
- {
- requestState.Done = true;
- }
- }
- }
-
- ///
- /// Stores the state of the request
- ///
- public class RequestState
- {
- ///
- ///
- ///
- public const int BUFFER_SIZE = 10000;
- ///
- ///
- ///
- public byte[] BufferRead;
- ///
- ///
- ///
- public HttpClient HttpClient;
- ///
- ///
- ///
- public HttpClientRequest Request;
- ///
- ///
- ///
- public HttpClientResponse Response;
- ///
- ///
- ///
- public Stream StreamResponse;
- ///
- ///
- ///
- public bool Done;
-
- ///
- /// Constructor
- ///
- public RequestState()
- {
- BufferRead = new byte[BUFFER_SIZE];
- HttpClient = null;
- Request = null;
- Response = null;
- StreamResponse = null;
- Done = false;
- }
- }
-
- ///
- /// Waithandle for main thread.
- ///
- public class StreamAsyncTest
- {
- ///
- ///
- ///
- public CEvent wait_for_response = new CEvent(true, false);
- }
-}
\ No newline at end of file
diff --git a/src/Comm/GenericSshClient.cs b/src/Comm/GenericSshClient.cs
index ea24876..94dd5a6 100644
--- a/src/Comm/GenericSshClient.cs
+++ b/src/Comm/GenericSshClient.cs
@@ -14,125 +14,125 @@ namespace PepperDash.Core
///
///
public class GenericSshClient : Device, ISocketStatusWithStreamDebugging, IAutoReconnect
- {
- private const string SPlusKey = "Uninitialized SshClient";
+ {
+ private const string SPlusKey = "Uninitialized SshClient";
///
/// Object to enable stream debugging
///
public CommunicationStreamDebugging StreamDebugging { get; private set; }
- ///
- /// Event that fires when data is received. Delivers args with byte array
- ///
- public event EventHandler BytesReceived;
+ ///
+ /// Event that fires when data is received. Delivers args with byte array
+ ///
+ public event EventHandler BytesReceived;
- ///
- /// Event that fires when data is received. Delivered as text.
- ///
- public event EventHandler TextReceived;
+ ///
+ /// Event that fires when data is received. Delivered as text.
+ ///
+ public event EventHandler TextReceived;
- ///
- /// Event when the connection status changes.
- ///
- public event EventHandler ConnectionChange;
+ ///
+ /// Event when the connection status changes.
+ ///
+ public event EventHandler ConnectionChange;
/////
/////
/////
//public event GenericSocketStatusChangeEventDelegate SocketStatusChange;
- ///
- /// Address of server
- ///
- public string Hostname { get; set; }
+ ///
+ /// Address of server
+ ///
+ public string Hostname { get; set; }
- ///
- /// Port on server
- ///
- public int Port { get; set; }
+ ///
+ /// Port on server
+ ///
+ public int Port { get; set; }
- ///
- /// Username for server
- ///
- public string Username { get; set; }
+ ///
+ /// Username for server
+ ///
+ public string Username { get; set; }
- ///
- /// And... Password for server. That was worth documenting!
- ///
- public string Password { get; set; }
+ ///
+ /// And... Password for server. That was worth documenting!
+ ///
+ public string Password { get; set; }
- ///
- /// True when the server is connected - when status == 2.
- ///
- public bool IsConnected
- {
- // returns false if no client or not connected
+ ///
+ /// True when the server is connected - when status == 2.
+ ///
+ public bool IsConnected
+ {
+ // returns false if no client or not connected
get { return Client != null && ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
- }
+ }
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsConnected
- {
- get { return (ushort)(IsConnected ? 1 : 0); }
- }
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsConnected
+ {
+ get { return (ushort)(IsConnected ? 1 : 0); }
+ }
- ///
- ///
- ///
- public SocketStatus ClientStatus
- {
- get { return _ClientStatus; }
- private set
- {
- if (_ClientStatus == value)
- return;
- _ClientStatus = value;
- OnConnectionChange();
- }
- }
- SocketStatus _ClientStatus;
+ ///
+ ///
+ ///
+ public SocketStatus ClientStatus
+ {
+ get { return _ClientStatus; }
+ private set
+ {
+ if (_ClientStatus == value)
+ return;
+ _ClientStatus = value;
+ OnConnectionChange();
+ }
+ }
+ SocketStatus _ClientStatus;
- ///
- /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
- /// and IsConnected with be true when this == 2.
- ///
- public ushort UStatus
- {
- get { return (ushort)_ClientStatus; }
- }
+ ///
+ /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
+ /// and IsConnected with be true when this == 2.
+ ///
+ public ushort UStatus
+ {
+ get { return (ushort)_ClientStatus; }
+ }
- ///
- /// Determines whether client will attempt reconnection on failure. Default is true
- ///
- public bool AutoReconnect { get; set; }
+ ///
+ /// Determines whether client will attempt reconnection on failure. Default is true
+ ///
+ public bool AutoReconnect { get; set; }
- ///
- /// Will be set and unset by connect and disconnect only
- ///
- public bool ConnectEnabled { get; private set; }
+ ///
+ /// Will be set and unset by connect and disconnect only
+ ///
+ public bool ConnectEnabled { get; private set; }
- ///
- /// S+ helper for AutoReconnect
- ///
- public ushort UAutoReconnect
- {
- get { return (ushort)(AutoReconnect ? 1 : 0); }
- set { AutoReconnect = value == 1; }
- }
+ ///
+ /// S+ helper for AutoReconnect
+ ///
+ public ushort UAutoReconnect
+ {
+ get { return (ushort)(AutoReconnect ? 1 : 0); }
+ set { AutoReconnect = value == 1; }
+ }
- ///
- /// Millisecond value, determines the timeout period in between reconnect attempts.
- /// Set to 5000 by default
- ///
- public int AutoReconnectIntervalMs { get; set; }
+ ///
+ /// Millisecond value, determines the timeout period in between reconnect attempts.
+ /// Set to 5000 by default
+ ///
+ public int AutoReconnectIntervalMs { get; set; }
- SshClient Client;
+ SshClient Client;
- ShellStream TheStream;
+ ShellStream TheStream;
- CTimer ReconnectTimer;
+ CTimer ReconnectTimer;
//Lock object to prevent simulatneous connect/disconnect operations
//private CCriticalSection connectLock = new CCriticalSection();
@@ -140,12 +140,12 @@ namespace PepperDash.Core
private bool DisconnectLogged = false;
- ///
- /// Typical constructor.
- ///
- public GenericSshClient(string key, string hostname, int port, string username, string password) :
- base(key)
- {
+ ///
+ /// Typical constructor.
+ ///
+ public GenericSshClient(string key, string hostname, int port, string username, string password) :
+ base(key)
+ {
StreamDebugging = new CommunicationStreamDebugging(key);
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
Key = key;
@@ -182,14 +182,6 @@ namespace PepperDash.Core
}, System.Threading.Timeout.Infinite);
}
- ///
- /// Just to help S+ set the key
- ///
- public void Initialize(string key)
- {
- Key = key;
- }
-
///
/// Handles closing this up when the program shuts down
///
@@ -201,14 +193,14 @@ namespace PepperDash.Core
{
this.LogDebug("Program stopping. Closing connection");
Disconnect();
- }
- }
- }
+ }
+ }
+ }
- ///
- /// Connect to the server, using the provided properties.
- ///
- public void Connect()
+ ///
+ /// Connect to the server, using the provided properties.
+ ///
+ public void Connect()
{
// Don't go unless everything is here
if (string.IsNullOrEmpty(Hostname) || Port < 1 || Port > 65535
@@ -259,7 +251,7 @@ namespace PepperDash.Core
try
{
Client.Connect();
- TheStream = Client.CreateShellStream("PDTShell", 100, 80, 100, 200, 65534);
+ TheStream = Client.CreateShellStream("PDTShell", 0, 0, 0, 0, 65534);
if (TheStream.DataAvailable)
{
// empty the buffer if there is data
@@ -277,18 +269,17 @@ namespace PepperDash.Core
if (ie is SocketException)
{
- this.LogException(ie, "CONNECTION failure: Cannot reach host, ({1})", Key, ie.Message);
+ this.LogException(ie, "CONNECTION failure: Cannot reach host");
}
if (ie is System.Net.Sockets.SocketException socketException)
{
- this.LogException(ie, "'{0}' Connection failure: Cannot reach host '{1}' on port {2}, ({3})",
- Key, Hostname, Port, ie.GetType());
+ this.LogException(ie, "Connection failure: Cannot reach {host} on {port}",
+ Hostname, Port);
}
if (ie is SshAuthenticationException)
{
- this.LogException(ie, "Authentication failure for username '{0}', ({1})", this,
- Username, ie.Message);
+ this.LogException(ie, "Authentication failure for username {userName}", Username);
}
else
this.LogException(ie, "Error on connect");
@@ -297,7 +288,7 @@ namespace PepperDash.Core
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
if (AutoReconnect)
{
- this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
+ this.LogDebug("Checking autoreconnect: {autoReconnect}, {autoReconnectInterval}ms", AutoReconnect, AutoReconnectIntervalMs);
ReconnectTimer.Reset(AutoReconnectIntervalMs);
}
}
@@ -347,7 +338,7 @@ namespace PepperDash.Core
}
KillClient(SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY);
- }
+ }
///
/// Kills the stream, cleans up the client and sets it to null
@@ -468,18 +459,18 @@ namespace PepperDash.Core
ReconnectTimer.Reset(AutoReconnectIntervalMs);
}
});
- }
+ }
- ///
- /// Helper for ConnectionChange event
- ///
- void OnConnectionChange()
- {
- if (ConnectionChange != null)
- ConnectionChange(this, new GenericSocketStatusChageEventArgs(this));
- }
+ ///
+ /// Helper for ConnectionChange event
+ ///
+ void OnConnectionChange()
+ {
+ if (ConnectionChange != null)
+ ConnectionChange(this, new GenericSocketStatusChageEventArgs(this));
+ }
- #region IBasicCommunication Members
+ #region IBasicCommunication Members
///
/// Sends text to the server
@@ -507,14 +498,14 @@ namespace PepperDash.Core
}
catch (ObjectDisposedException ex)
{
- this.LogException(ex, "ObjectDisposedException sending {message}", text);
+ this.LogError("ObjectDisposedException sending '{message}'. Restarting connection...", text.Trim());
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
ReconnectTimer.Reset();
}
catch (Exception ex)
{
- this.LogException(ex, "Exception sending text: {message}", text);
+ this.LogException(ex, "Exception sending text: '{message}'", text);
}
}
@@ -582,10 +573,10 @@ public class SshConnectionChangeEventArgs : EventArgs
///
public ushort Status { get { return Client.UStatus; } }
- ///
+ ///
/// S+ Constructor
- ///
- public SshConnectionChangeEventArgs() { }
+ ///
+ public SshConnectionChangeEventArgs() { }
///
/// EventArgs class
@@ -593,9 +584,9 @@ public class SshConnectionChangeEventArgs : EventArgs
/// Connection State
/// The Client
public SshConnectionChangeEventArgs(bool isConnected, GenericSshClient client)
- {
- IsConnected = isConnected;
- Client = client;
- }
- }
-}
+ {
+ IsConnected = isConnected;
+ Client = client;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Comm/QscCoreDoubleTcpIpClient.cs b/src/Comm/QscCoreDoubleTcpIpClient.cs
deleted file mode 100644
index 7011325..0000000
--- a/src/Comm/QscCoreDoubleTcpIpClient.cs
+++ /dev/null
@@ -1,351 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-
-namespace PepperDash.Core
-{
- ///
- /// Allows for two simultaneous TCP clients to connect to a redundant pair of QSC Core DSPs and manages
- ///
- public class QscCoreDoubleTcpIpClient : IKeyed
- {
- ///
- /// Key to uniquely identify the instance of the class
- ///
- public string Key { get; private set; }
-
- ///
- /// Fires when a bool value changes to notify the S+ module
- ///
- public event EventHandler BoolChange;
- ///
- /// Fires when a ushort value changes to notify the S+ module
- ///
- public event EventHandler UshortChange;
- ///
- /// Fires when a string value changes to notify the S+ module
- ///
- public event EventHandler StringChange;
-
- ///
- /// The client for the master DSP unit
- ///
- public GenericTcpIpClient MasterClient { get; private set; }
- ///
- /// The client for the slave DSP unit
- ///
- public GenericTcpIpClient SlaveClient { get; private set; }
-
- string Username;
- string Password;
- string LineEnding;
-
- CommunicationGather MasterGather;
- CommunicationGather SlaveGather;
-
- bool IsPolling;
- int PollingIntervalSeconds;
- CTimer PollTimer;
-
- bool SlaveIsActive;
-
- ///
- /// Default constuctor for S+
- ///
- public QscCoreDoubleTcpIpClient()
- {
- MasterClient = new GenericTcpIpClient("temp-master");
- MasterClient.AutoReconnect = true;
- MasterClient.AutoReconnectIntervalMs = 2000;
- SlaveClient = new GenericTcpIpClient("temp-slave");
- SlaveClient.AutoReconnect = true;
- SlaveClient.AutoReconnectIntervalMs = 2000;
-
- }
-
- ///
- /// Connects to both DSP units
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public void Connect(string key, string masterAddress, int masterPort,
- string slaveAddress, int slavePort, string username, string password,
- int pollingIntervalSeconds, string lineEnding)
- {
- Key = key;
-
- PollingIntervalSeconds = pollingIntervalSeconds;
- Username = username;
- Password = password;
- LineEnding = lineEnding;
-
- MasterClient.Initialize(key + "-master");
- SlaveClient.Initialize(key + "-slave");
-
- MasterClient.Hostname = masterAddress;
- MasterClient.Port = masterPort;
-
- if (MasterClient != null)
- {
- MasterClient.Disconnect();
- }
-
- if (SlaveClient != null)
- {
- SlaveClient.Disconnect();
- }
-
- if (MasterGather == null)
- {
- MasterGather = new CommunicationGather(MasterClient, lineEnding);
- MasterGather.IncludeDelimiter = true;
- }
-
- MasterGather.LineReceived -= MasterGather_LineReceived;
- MasterGather.LineReceived += new EventHandler(MasterGather_LineReceived);
-
- MasterClient.ConnectionChange -= MasterClient_SocketStatusChange;
- MasterClient.ConnectionChange += MasterClient_SocketStatusChange;
-
- SlaveClient.Hostname = slaveAddress;
- SlaveClient.Port = slavePort;
-
- if (SlaveGather == null)
- {
- SlaveGather = new CommunicationGather(SlaveClient, lineEnding);
- SlaveGather.IncludeDelimiter = true;
- }
-
- SlaveGather.LineReceived -= MasterGather_LineReceived;
- SlaveGather.LineReceived += new EventHandler(SlaveGather_LineReceived);
-
- SlaveClient.ConnectionChange -= SlaveClient_SocketStatusChange;
- SlaveClient.ConnectionChange += SlaveClient_SocketStatusChange;
-
- MasterClient.Connect();
- SlaveClient.Connect();
- }
-
- ///
- ///
- ///
- public void Disconnect()
- {
- if (MasterClient != null)
- {
- MasterGather.LineReceived -= MasterGather_LineReceived;
- MasterClient.Disconnect();
- }
- if (SlaveClient != null)
- {
- SlaveGather.LineReceived -= SlaveGather_LineReceived;
- SlaveClient.Disconnect();
- }
- if (PollTimer != null)
- {
- IsPolling = false;
-
- PollTimer.Stop();
- PollTimer = null;
- }
- }
-
- ///
- /// Does not include line feed
- ///
- public void SendText(string s)
- {
- if (SlaveIsActive)
- {
- if (SlaveClient != null)
- {
- Debug.Console(2, this, "Sending to Slave: {0}", s);
- SlaveClient.SendText(s);
- }
- }
- else
- {
- if (MasterClient != null)
- {
- Debug.Console(2, this, "Sending to Master: {0}", s);
- MasterClient.SendText(s);
- }
- }
- }
-
- void MasterClient_SocketStatusChange(object sender, GenericSocketStatusChageEventArgs args)
- {
- OnUshortChange((ushort)args.Client.ClientStatus, MasterClientStatusId);
-
- if (args.Client.IsConnected)
- {
- MasterGather.LineReceived += MasterGather_LineReceived;
-
- StartPolling();
- }
- else
- MasterGather.LineReceived -= MasterGather_LineReceived;
- }
-
- void SlaveClient_SocketStatusChange(object sender, GenericSocketStatusChageEventArgs args)
- {
- OnUshortChange((ushort)args.Client.ClientStatus, SlaveClientStatusId);
-
- if (args.Client.IsConnected)
- {
- SlaveGather.LineReceived += SlaveGather_LineReceived;
-
- StartPolling();
- }
- else
- SlaveGather.LineReceived -= SlaveGather_LineReceived;
-
- }
-
-
- void MasterGather_LineReceived(object sender, GenericCommMethodReceiveTextArgs e)
- {
- if (e.Text.Contains("login_required"))
- {
- MasterClient.SendText(string.Format("login {0} {1} \x0d\x0a", Username, Password));
- }
- else if (e.Text.Contains("login_success"))
- {
- // START THE POLLING, YO!
- }
- else if (e.Text.StartsWith("sr"))
- {
- // example response "sr "MyDesign" "NIEC2bxnVZ6a" 1 1"
-
- var split = e.Text.Trim().Split(' ');
- if (split[split.Length - 1] == "1")
- {
- SlaveIsActive = false;
- OnBoolChange(false, SlaveIsActiveId);
- OnBoolChange(true, MasterIsActiveId);
- }
- }
- if (!SlaveIsActive)
- OnStringChange(e.Text, LineReceivedId);
- }
-
- void SlaveGather_LineReceived(object sender, GenericCommMethodReceiveTextArgs e)
- {
- if (e.Text.Contains("login_required"))
- {
- SlaveClient.SendText(string.Format("login {0} {1} \x0d\x0a", Username, Password));
- }
- else if (e.Text.Contains("login_success"))
- {
- // START THE POLLING, YO!
- }
- else if (e.Text.StartsWith("sr"))
- {
- var split = e.Text.Trim().Split(' ');
- if (split[split.Length - 1] == "1")
- {
- SlaveIsActive = true;
- OnBoolChange(true, SlaveIsActiveId);
- OnBoolChange(false, MasterIsActiveId);
- }
- }
- if (SlaveIsActive)
- OnStringChange(e.Text, LineReceivedId);
- }
-
- void StartPolling()
- {
- if (!IsPolling)
- {
- IsPolling = true;
-
- Poll();
- if (PollTimer != null)
- PollTimer.Stop();
-
- PollTimer = new CTimer(o => Poll(), null, PollingIntervalSeconds * 1000, PollingIntervalSeconds * 1000);
- }
- }
-
- void Poll()
- {
- if (MasterClient != null && MasterClient.IsConnected)
- {
- Debug.Console(2, this, "Polling Master.");
- MasterClient.SendText("sg\x0d\x0a");
-
- }
- if (SlaveClient != null && SlaveClient.IsConnected)
- {
- Debug.Console(2, this, "Polling Slave.");
- SlaveClient.SendText("sg\x0d\x0a");
- }
- }
-
-
-
- // login NAME PIN ---> login_success, login_failed
-
- // status get
- // sg --> sr DESIGN_NAME DESIGN_ID IS_PRIMARY IS_ACTIVE
-
- // CRLF
-
- void OnBoolChange(bool state, ushort type)
- {
- var handler = BoolChange;
- if (handler != null)
- handler(this, new BoolChangeEventArgs(state, type));
- }
-
- void OnUshortChange(ushort state, ushort type)
- {
- var handler = UshortChange;
- if (handler != null)
- handler(this, new UshrtChangeEventArgs(state, type));
- }
-
- void OnStringChange(string value, ushort type)
- {
- var handler = StringChange;
- if (handler != null)
- handler(this, new StringChangeEventArgs(value, type));
- }
-
- ///
- ///
- ///
- public const ushort MasterIsActiveId = 3;
- ///
- ///
- ///
- public const ushort SlaveIsActiveId = 4;
- ///
- ///
- ///
- public const ushort MainModuleInitiailzeId = 5;
-
- ///
- ///
- ///
- public const ushort MasterClientStatusId = 101;
- ///
- ///
- ///
- public const ushort SlaveClientStatusId = 102;
-
- ///
- ///
- ///
- public const ushort LineReceivedId = 201;
- }
-}
\ No newline at end of file
diff --git a/src/CommunicationExtras.cs b/src/CommunicationExtras.cs
index e780efd..81fd76c 100644
--- a/src/CommunicationExtras.cs
+++ b/src/CommunicationExtras.cs
@@ -5,6 +5,7 @@ using System.Text;
using Crestron.SimplSharp;
using Crestron.SimplSharp.CrestronSockets;
using System.Text.RegularExpressions;
+using Newtonsoft.Json;
namespace PepperDash.Core
{
@@ -25,6 +26,7 @@ namespace PepperDash.Core
///
/// Indicates connection status
///
+ [JsonProperty("isConnected")]
bool IsConnected { get; }
///
/// Connect to the device
@@ -70,6 +72,7 @@ namespace PepperDash.Core
///
/// Object to enable stream debugging
///
+ [JsonProperty("streamDebugging")]
CommunicationStreamDebugging StreamDebugging { get; }
}
@@ -87,7 +90,9 @@ namespace PepperDash.Core
///
/// The current socket status of the client
///
- SocketStatus ClientStatus { get; }
+ [JsonProperty("clientStatus")]
+ [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
+ SocketStatus ClientStatus { get; }
}
///
@@ -106,10 +111,12 @@ namespace PepperDash.Core
///
/// Enable automatic recconnect
///
+ [JsonProperty("autoReconnect")]
bool AutoReconnect { get; set; }
///
/// Interval in ms to attempt automatic recconnections
///
+ [JsonProperty("autoReconnectIntervalMs")]
int AutoReconnectIntervalMs { get; set; }
}
diff --git a/src/Config/PortalConfigReader.cs b/src/Config/PortalConfigReader.cs
index f639f0c..59a8164 100644
--- a/src/Config/PortalConfigReader.cs
+++ b/src/Config/PortalConfigReader.cs
@@ -98,9 +98,22 @@ namespace PepperDash.Core.Config
merged.Add("destinationLists",
Merge(template["destinationLists"], system["destinationLists"], "destinationLists"));
- // Template tie lines take precedence. Config tool doesn't do them at system
- // level anyway...
- if (template["tieLines"] != null)
+
+ if (system["cameraLists"] == null)
+ merged.Add("cameraLists", template["cameraLists"]);
+ else
+ merged.Add("cameraLists", Merge(template["cameraLists"], system["cameraLists"], "cameraLists"));
+
+ if (system["audioControlPointLists"] == null)
+ merged.Add("audioControlPointLists", template["audioControlPointLists"]);
+ else
+ merged.Add("audioControlPointLists",
+ Merge(template["audioControlPointLists"], system["audioControlPointLists"], "audioControlPointLists"));
+
+
+ // Template tie lines take precedence. Config tool doesn't do them at system
+ // level anyway...
+ if (template["tieLines"] != null)
merged.Add("tieLines", template["tieLines"]);
else if (system["tieLines"] != null)
merged.Add("tieLines", system["tieLines"]);
diff --git a/src/CoreInterfaces.cs b/src/CoreInterfaces.cs
index c1432c2..6e0b639 100644
--- a/src/CoreInterfaces.cs
+++ b/src/CoreInterfaces.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
+using Newtonsoft.Json;
using Serilog;
namespace PepperDash.Core
@@ -15,6 +16,7 @@ namespace PepperDash.Core
///
/// Unique Key
///
+ [JsonProperty("key")]
string Key { get; }
}
@@ -26,6 +28,7 @@ namespace PepperDash.Core
///
/// Isn't it obvious :)
///
+ [JsonProperty("name")]
string Name { get; }
}
diff --git a/src/Device.cs b/src/Device.cs
index 749713e..fda30c4 100644
--- a/src/Device.cs
+++ b/src/Device.cs
@@ -99,7 +99,15 @@ namespace PepperDash.Core
public void PreActivate()
{
if (_PreActivationActions != null)
- _PreActivationActions.ForEach(a => a.Invoke());
+ _PreActivationActions.ForEach(a => {
+ try
+ {
+ a.Invoke();
+ } catch (Exception e)
+ {
+ Debug.LogMessage(e, "Error in PreActivationAction: " + e.Message, this);
+ }
+ });
}
///
@@ -123,7 +131,16 @@ namespace PepperDash.Core
public void PostActivate()
{
if (_PostActivationActions != null)
- _PostActivationActions.ForEach(a => a.Invoke());
+ _PostActivationActions.ForEach(a => {
+ try
+ {
+ a.Invoke();
+ }
+ catch (Exception e)
+ {
+ Debug.LogMessage(e, "Error in PostActivationAction: " + e.Message, this);
+ }
+ });
}
///
diff --git a/src/JsonToSimpl/JsonToSimplMaster.cs b/src/JsonToSimpl/JsonToSimplMaster.cs
index d531d18..2f872e4 100644
--- a/src/JsonToSimpl/JsonToSimplMaster.cs
+++ b/src/JsonToSimpl/JsonToSimplMaster.cs
@@ -1,5 +1,6 @@
-using System;
+using System;
using System.Collections.Generic;
+using System.IO;
using Crestron.SimplSharp;
using Crestron.SimplSharp.CrestronIO;
using Newtonsoft.Json;
@@ -159,7 +160,11 @@ namespace PepperDash.Core.JsonToSimpl
///
public static JObject ParseObject(string json)
{
- using (var reader = new JsonTextReader(new StringReader(json)))
+ #if NET6_0
+ using (var reader = new JsonTextReader(new System.IO.StringReader(json)))
+#else
+ using (var reader = new JsonTextReader(new Crestron.SimplSharp.CrestronIO.StringReader(json)))
+#endif
{
var startDepth = reader.Depth;
var obj = JObject.Load(reader);
@@ -176,7 +181,11 @@ namespace PepperDash.Core.JsonToSimpl
///
public static JArray ParseArray(string json)
{
- using (var reader = new JsonTextReader(new StringReader(json)))
+ #if NET6_0
+ using (var reader = new JsonTextReader(new System.IO.StringReader(json)))
+#else
+ using (var reader = new JsonTextReader(new Crestron.SimplSharp.CrestronIO.StringReader(json)))
+#endif
{
var startDepth = reader.Depth;
var obj = JArray.Load(reader);
diff --git a/src/PasswordManagement/OLD-ARRAY-Config.cs b/src/PasswordManagement/OLD-ARRAY-Config.cs
deleted file mode 100644
index 8167c4f..0000000
--- a/src/PasswordManagement/OLD-ARRAY-Config.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-
-namespace PepperDash.Core.PasswordManagement
-{
- // Example JSON password array configuration object
- //{
- // "global":{
- // "passwords":[
- // {
- // "key": "Password01",
- // "name": "Technician Password",
- // "enabled": true,
- // "password": "1988"
- // }
- // ]
- // }
- //}
-
- ///
- /// JSON password array configuration object
- ///
- //public class PasswordConfig
- //{
- // ///
- // /// Key used to search for object in JSON array
- // ///
- // public string key { get; set; }
- // ///
- // /// Friendly name of password object
- // ///
- // public string name { get; set; }
- // ///
- // /// Password object enabled
- // ///
- // public bool enabled { get; set; }
- // ///
- // ///
- // ///
- // public ushort simplEnabled
- // {
- // get { return (ushort)(enabled ? 1 : 0); }
- // set { enabled = Convert.ToBoolean(value); }
- // }
- // ///
- // /// Password object configured password
- // ///
- // public string password { get; set; }
- // ///
- // /// Password type
- // ///
- // private int type { get; set; }
- // ///
- // /// Password Type for S+
- // ///
- // public ushort simplType
- // {
- // get { return Convert.ToUInt16(type); }
- // set { type = value; }
- // }
- // ///
- // /// Password path
- // /// **FUTURE** implementation of saving passwords recieved from Fusion or other external sources back to config
- // ///
- // public string path { get; set; }
- // ///
- // /// Constructor
- // ///
- // public PasswordConfig()
- // {
- // simplEnabled = 0;
- // simplType = 0;
- // }
- //}
-
- // Example JSON password collections configuration object
- //{
- // "global": {
- // "passwords": {
- // "1": {
- // "name": "Technician Password",
- // "password": "2468"
- // },
- // "2": {
- // "name": "System Password",
- // "password": "123456"
- // },
- // "3": {
- // "name": "Master Password",
- // "password": "abc123"
- // },
- // "5": {
- // "name": "Backdoor Password",
- // "password": "1988"
- // },
- // "10": {
- // "name": "Backdoor Password",
- // "password": "1988"
- // }
- // }
- // }
- //}
-
- ///
- /// JSON password array configuration object
- ///
- public class PasswordConfig
- {
- ///
- /// Password object configured password
- ///
- public string password { get; set; }
- ///
- /// Constructor
- ///
- public PasswordConfig()
- {
-
- }
- }
-
- ///
- /// Global JSON object
- ///
- //public class GlobalConfig
- //{
- // //public List passwords { get; set; }
- // public Dictionary passwords { get; set; }
-
- // ///
- // /// Constructor
- // ///
- // public GlobalConfig()
- // {
-
- // }
- //}
-
- ///
- /// Root JSON object
- ///
- //public class RootObject
- //{
- // public GlobalConfig global { get; set; }
- //}
-}
\ No newline at end of file
diff --git a/src/PasswordManagement/OLD-ARRAY-PasswordClient.cs b/src/PasswordManagement/OLD-ARRAY-PasswordClient.cs
deleted file mode 100644
index 540d935..0000000
--- a/src/PasswordManagement/OLD-ARRAY-PasswordClient.cs
+++ /dev/null
@@ -1,207 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-
-namespace PepperDash.Core.PasswordManagement
-{
- public class PasswordClient
- {
- ///
- /// Password Client
- ///
- public PasswordConfig Client { get; set; }
- ///
- /// Used to build the password entered by the user
- ///
- public string PasswordToValidate { get; set; }
-
- ///
- /// Boolean event
- ///
- public event EventHandler BoolChange;
- ///
- /// Ushort event
- ///
- public event EventHandler UshrtChange;
- ///
- /// String event
- ///
- public event EventHandler StringChange;
-
- ///
- /// Constructor
- ///
- public PasswordClient()
- {
-
- }
-
- ///
- /// Initialize method
- ///
- ///
- public void Initialize(string key)
- {
- OnBoolChange(false, 0, PasswordManagementConstants.BoolEvaluatedChange);
-
- Client = new PasswordConfig();
- PasswordToValidate = "";
-
- // there has to be a better way to get the index of the current index of password
- ushort i = 0;
- foreach (var password in PasswordManager.Passwords)
- {
- i++;
- OnUshrtChange((ushort)password.Key, (ushort)password.Key, PasswordManagementConstants.PasswordKey);
- }
-
- OnBoolChange(true, 0, PasswordManagementConstants.BoolEvaluatedChange);
- }
-
- ///
- /// Retrieves password by key
- ///
- ///
- //public void GetPasswordByKey(string key)
- //{
- // if (string.IsNullOrEmpty(key))
- // {
- // Debug.Console(1, "PassowrdClient.GetPasswordByKey failed:\rKey {0} is null or empty", key);
- // return;
- // }
-
- // PasswordConfig password = PasswordManager.Passwords.FirstOrDefault(p => p.key.Equals(key));
- // if (password == null)
- // {
- // OnUshrtChange(0, 0, PasswordManagementConstants.SelectedPasswordLength);
- // return;
- // }
-
- // Client = password;
- // OnUshrtChange((ushort)Client.password.Length, 0, PasswordManagementConstants.SelectedPasswordLength);
- // OnStringChange(Client.key, 0, PasswordManagementConstants.PasswordKeySelected);
- //}
-
- ///
- /// Retrieve password by index
- ///
- ///
- public void GetPasswordByIndex(ushort key)
- {
- PasswordConfig pw = PasswordManager.Passwords[key];
- if (pw == null)
- {
- OnUshrtChange(0, 0, PasswordManagementConstants.SelectedPasswordLength);
- return;
- }
-
- Client = pw;
- OnUshrtChange((ushort)Client.password.Length, 0, PasswordManagementConstants.SelectedPasswordLength);
- OnUshrtChange(key, 0, PasswordManagementConstants.PasswordKeySelected);
- }
-
- ///
- /// Password validation method
- ///
- ///
- public void ValidatePassword(string password)
- {
- if (string.IsNullOrEmpty(password))
- return;
-
- if (string.Equals(Client.password, password))
- {
- OnBoolChange(true, 0, PasswordManagementConstants.PasswordIsValid);
- }
- else
- {
- OnBoolChange(true, 0, PasswordManagementConstants.PasswordIsInvalid);
- }
-
-
- OnBoolChange(false, 0, PasswordManagementConstants.PasswordIsValid);
- OnBoolChange(false, 0, PasswordManagementConstants.PasswordIsInvalid);
-
- ClearPassword();
- }
-
- ///
- /// Builds the user entered passwrod string, will attempt to validate the user entered
- /// password against the selected password when the length of the 2 are equal
- ///
- ///
- public void BuildPassword(string data)
- {
- PasswordToValidate = String.Concat(PasswordToValidate, data);
- OnBoolChange(true, (ushort)PasswordToValidate.Length, PasswordManagementConstants.PasswordLedChange);
-
- if (PasswordToValidate.Length == Client.password.Length)
- ValidatePassword(PasswordToValidate);
- }
-
- ///
- /// Clears the user entered password and resets the LEDs
- ///
- public void ClearPassword()
- {
- PasswordToValidate = "";
- OnBoolChange(true, (ushort)PasswordToValidate.Length, PasswordManagementConstants.PasswordLedChange);
-
- for(var i = 1; i <= Client.password.Length; i++)
- OnBoolChange(false, (ushort)i, PasswordManagementConstants.PasswordLedChange);
- }
-
- ///
- /// Protected boolean change event handler
- ///
- ///
- ///
- ///
- protected void OnBoolChange(bool state, ushort index, ushort type)
- {
- var handler = BoolChange;
- if (handler != null)
- {
- var args = new BoolChangeEventArgs(state, type);
- args.Index = index;
- BoolChange(this, args);
- }
- }
-
- ///
- /// Protected ushort change event handler
- ///
- ///
- ///
- ///
- protected void OnUshrtChange(ushort value, ushort index, ushort type)
- {
- var handler = UshrtChange;
- if (handler != null)
- {
- var args = new UshrtChangeEventArgs(value, type);
- args.Index = index;
- UshrtChange(this, args);
- }
- }
-
- ///
- /// Protected string change event handler
- ///
- ///
- ///
- ///
- protected void OnStringChange(string value, ushort index, ushort type)
- {
- var handler = StringChange;
- if (handler != null)
- {
- var args = new StringChangeEventArgs(value, type);
- args.Index = index;
- StringChange(this, args);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/PasswordManagement/OLD-ARRAY-PasswordManager.cs b/src/PasswordManagement/OLD-ARRAY-PasswordManager.cs
deleted file mode 100644
index 45b65e9..0000000
--- a/src/PasswordManagement/OLD-ARRAY-PasswordManager.cs
+++ /dev/null
@@ -1,233 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using Crestron.SimplSharp;
-using PepperDash.Core.JsonToSimpl;
-using PepperDash.Core.JsonStandardObjects;
-
-namespace PepperDash.Core.PasswordManagement
-{
- public class PasswordManager
- {
- ///
- /// List of passwords configured
- ///
- public static Dictionary Passwords = new Dictionary();
- private Dictionary TempPasswords = new Dictionary();
-
- CTimer UpdateTimer;
- public long UpdateTimerElapsedMs = 5000;
-
- ///
- /// Boolean event
- ///
- public event EventHandler BoolChange;
- ///
- /// Ushort event
- ///
- public event EventHandler UshrtChange;
- ///
- /// String event
- ///
- public event EventHandler StringChange;
-
-
- ///
- /// Constructor
- ///
- public PasswordManager()
- {
- Passwords.Clear();
- }
-
- ///
- /// Initialize method
- ///
- ///
- ///
- //public void Initialize(string uniqueId, string key)
- //{
- // OnBoolChange(false, 0, PasswordManagementConstants.BoolEvaluatedChange);
-
- // try
- // {
- // if(string.IsNullOrEmpty(uniqueId) || string.IsNullOrEmpty(key))
- // {
- // Debug.Console(1, "PasswordManager.Initialize({0}, {1}) null or empty parameters", uniqueId, key);
- // return;
- // }
-
- // JsonToSimplMaster master = J2SGlobal.GetMasterByFile(uniqueId);
- // if(master == null)
- // {
- // Debug.Console(1, "PassowrdManager.Initialize failed:\rCould not find JSON file with uniqueID {0}", uniqueId);
- // return;
- // }
-
- // var global = master.JsonObject.ToObject().global;
- // var passwords = global.passwords;
- // if(passwords == null)
- // {
- // Debug.Console(1, "PasswordManager.Initialize failed:\rCould not find password object");
- // return;
- // }
-
- // foreach(var password in passwords)
- // {
- // if (password != null)
- // {
- // var index = passwords.IndexOf(password);
-
- // password.path = string.Format("global.passwords[{0}]", index);
- // Debug.Console(1, "PasswordManager.Initialize: {0}, {1}, {2}, {3}, {4}, {5}", password.key, password.name, password.simplEnabled, password.simplType, password.password, password.path);
- // //AddPassword(password);
-
- // OnStringChange(password.path, (ushort)index, PasswordManagementConstants.FullPathToPassword);
- // OnStringChange(password.key, (ushort)index, PasswordManagementConstants.PasswordKey);
- // }
- // }
-
- // OnUshrtChange(Convert.ToUInt16(Passwords.Count), 0, PasswordManagementConstants.PasswordListCount);
- // }
- // catch(Exception e)
- // {
- // var msg = string.Format("PasswordManager.Initialize({0}, {1}) failed:\r{2}", uniqueId, key, e.Message);
- // CrestronConsole.PrintLine(msg);
- // ErrorLog.Error(msg);
- // }
- // finally
- // {
- // OnBoolChange(true, 0, PasswordManagementConstants.BoolEvaluatedChange);
- // }
- //}
-
- ///
- /// Adds password to the list
- ///
- ///
- //private void AddPassword(PasswordConfig password)
- //{
- // if (password == null)
- // return;
-
- // var item = Passwords.FirstOrDefault(i => i.key.Equals(password.key));
- // if (item != null)
- // Passwords.Remove(item);
- // Passwords.Add(password);
-
- // Passwords.Sort((x, y) => string.Compare(x.key, y.key));
- //}
-
- ///
- /// Removes password from the list
- ///
- ///
- //private void RemovePassword(PasswordConfig password)
- //{
- // if (password == null)
- // return;
-
- // var item = Passwords.FirstOrDefault(i => i.key.Equals(password.key));
- // if (item != null)
- // Passwords.Remove(item);
- //}
-
- ///
- /// Updates password stored in the dictonary
- ///
- ///
- ///
- ///
- public void UpdatePassword(ushort key, string password)
- {
- if (string.IsNullOrEmpty(password))
- return;
-
- var pw = TempPasswords[key];
- if (pw == null)
- {
- pw = new PasswordConfig();
- }
- pw.password = password;
-
- if (UpdateTimer == null)
- {
- // (o) => SavePasswords removes the need to create a callback method that takes in an object
- UpdateTimer = new CTimer((o) => StorePassword(), UpdateTimerElapsedMs);
- }
- else
- {
- UpdateTimer.Reset();
- }
- }
-
- ///
- /// Stores the updated passwords in TempPassword in the Passwords dictionary
- ///
- private void StorePassword()
- {
- UpdateTimer.Stop();
-
- foreach (var tempPw in TempPasswords)
- {
- Passwords[tempPw.Key] = tempPw.Value;
- }
-
- TempPasswords.Clear();
- }
-
- ///
- /// Protected boolean change event handler
- ///
- ///
- ///
- ///
- protected void OnBoolChange(bool state, ushort index, ushort type)
- {
- var handler = BoolChange;
- if (handler != null)
- {
- var args = new BoolChangeEventArgs(state, type);
- args.Index = index;
- BoolChange(this, args);
- }
- }
-
- ///
- /// Protected ushort change event handler
- ///
- ///
- ///
- ///
- protected void OnUshrtChange(ushort value, ushort index, ushort type)
- {
- var handler = UshrtChange;
- if (handler != null)
- {
- var args = new UshrtChangeEventArgs(value, type);
- args.Index = index;
- UshrtChange(this, args);
- }
- }
-
- ///
- /// Protected string change event handler
- ///
- ///
- ///
- ///
- protected void OnStringChange(string value, ushort index, ushort type)
- {
- var handler = StringChange;
- if (handler != null)
- {
- var args = new StringChangeEventArgs(value, type);
- args.Index = index;
- StringChange(this, args);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/src/PasswordManagement/PasswordClient.cs b/src/PasswordManagement/PasswordClient.cs
index 933bd10..225a563 100644
--- a/src/PasswordManagement/PasswordClient.cs
+++ b/src/PasswordManagement/PasswordClient.cs
@@ -1,8 +1,4 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
namespace PepperDash.Core.PasswordManagement
{
diff --git a/src/PepperDash.Core.4Series.csproj b/src/PepperDash.Core.4Series.csproj
index cd93167..bbc7f11 100644
--- a/src/PepperDash.Core.4Series.csproj
+++ b/src/PepperDash.Core.4Series.csproj
@@ -12,7 +12,8 @@
PepperDash Technologies
git
https://github.com/PepperDash/PepperDashCore
- crestron;4series;
+ crestron;4series;
+ false
$(Version)
true
@@ -24,6 +25,14 @@
pdbonly
bin\4Series\$(Configuration)\PepperDashCore.xml
+
+
+
+
+
+
+
+
@@ -31,7 +40,7 @@
-
+
@@ -40,6 +49,9 @@
+
+
+