diff --git a/Pepperdash Core/Pepperdash Core/EventArgs.cs b/Pepperdash Core/Pepperdash Core/EventArgs.cs
new file mode 100644
index 0000000..6def673
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/EventArgs.cs
@@ -0,0 +1,172 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core
+{
+ ///
+ /// Bool change event args
+ ///
+ public class BoolChangeEventArgs : EventArgs
+ {
+ ///
+ /// Boolean state property
+ ///
+ public bool State { get; set; }
+
+ ///
+ /// Boolean ushort value property
+ ///
+ public ushort IntValue { get { return (ushort)(State ? 1 : 0); } }
+
+ ///
+ /// Boolean change event args type
+ ///
+ public ushort Type { get; set; }
+
+ ///
+ /// Boolean change event args index
+ ///
+ public ushort Index { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public BoolChangeEventArgs()
+ {
+
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ public BoolChangeEventArgs(bool state, ushort type)
+ {
+ State = state;
+ Type = type;
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ ///
+ public BoolChangeEventArgs(bool state, ushort type, ushort index)
+ {
+ State = state;
+ Type = type;
+ Index = index;
+ }
+ }
+
+ ///
+ /// Ushort change event args
+ ///
+ public class UshrtChangeEventArgs : EventArgs
+ {
+ ///
+ /// Ushort change event args integer value
+ ///
+ public ushort IntValue { get; set; }
+
+ ///
+ /// Ushort change event args type
+ ///
+ public ushort Type { get; set; }
+
+ ///
+ /// Ushort change event args index
+ ///
+ public ushort Index { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public UshrtChangeEventArgs()
+ {
+
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ public UshrtChangeEventArgs(ushort intValue, ushort type)
+ {
+ IntValue = intValue;
+ Type = type;
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ ///
+ public UshrtChangeEventArgs(ushort intValue, ushort type, ushort index)
+ {
+ IntValue = intValue;
+ Type = type;
+ Index = index;
+ }
+ }
+
+ ///
+ /// String change event args
+ ///
+ public class StringChangeEventArgs : EventArgs
+ {
+ ///
+ /// String change event args value
+ ///
+ public string StringValue { get; set; }
+
+ ///
+ /// String change event args type
+ ///
+ public ushort Type { get; set; }
+
+ ///
+ /// string change event args index
+ ///
+ public ushort Index { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public StringChangeEventArgs()
+ {
+
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ public StringChangeEventArgs(string stringValue, ushort type)
+ {
+ StringValue = stringValue;
+ Type = type;
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ ///
+ public StringChangeEventArgs(string stringValue, ushort type, ushort index)
+ {
+ StringValue = stringValue;
+ Type = type;
+ Index = index;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/GenericRESTfulCommunications/Constants.cs b/Pepperdash Core/Pepperdash Core/GenericRESTfulCommunications/Constants.cs
new file mode 100644
index 0000000..9df43f0
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/GenericRESTfulCommunications/Constants.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core.GenericRESTfulCommunications
+{
+ ///
+ /// Constants
+ ///
+ public class GenericRESTfulConstants
+ {
+ ///
+ /// Generic boolean change
+ ///
+ public const ushort BoolValueChange = 1;
+ ///
+ /// Generic Ushort change
+ ///
+ public const ushort UshrtValueChange = 101;
+ ///
+ /// Response Code Ushort change
+ ///
+ public const ushort ResponseCodeChange = 102;
+ ///
+ /// Generic String chagne
+ ///
+ public const ushort StringValueChange = 201;
+ ///
+ /// Response string change
+ ///
+ public const ushort ResponseStringChange = 202;
+ ///
+ /// Error string change
+ ///
+ public const ushort ErrorStringChange = 203;
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/GenericRESTfulCommunications/GenericRESTful.cs b/Pepperdash Core/Pepperdash Core/GenericRESTfulCommunications/GenericRESTful.cs
new file mode 100644
index 0000000..7d8df61
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/GenericRESTfulCommunications/GenericRESTful.cs
@@ -0,0 +1,253 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharp.Net.Http;
+using Crestron.SimplSharp.Net.Https;
+
+namespace PepperDash.Core.GenericRESTfulCommunications
+{
+ ///
+ /// Generic RESTful communication class
+ ///
+ public class GenericRESTfulClient
+ {
+ ///
+ /// Boolean event handler
+ ///
+ public event EventHandler BoolChange;
+ ///
+ /// Ushort event handler
+ ///
+ public event EventHandler UshrtChange;
+ ///
+ /// String event handler
+ ///
+ public event EventHandler StringChange;
+
+ ///
+ /// Constructor
+ ///
+ public GenericRESTfulClient()
+ {
+
+ }
+
+ ///
+ /// Generic RESTful submit request
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void SubmitRequest(string url, ushort port, ushort requestType, string contentType, string username, string password)
+ {
+ if (url.StartsWith("https:", StringComparison.OrdinalIgnoreCase))
+ {
+ SubmitRequestHttps(url, port, requestType, contentType, username, password);
+ }
+ else if (url.StartsWith("http:", StringComparison.OrdinalIgnoreCase))
+ {
+ SubmitRequestHttp(url, port, requestType, contentType, username, password);
+ }
+ else
+ {
+ OnStringChange(string.Format("Invalid URL {0}", url), 0, GenericRESTfulConstants.ErrorStringChange);
+ }
+ }
+
+ ///
+ /// Private HTTP submit request
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private void SubmitRequestHttp(string url, ushort port, ushort requestType, string contentType, string username, string password)
+ {
+ try
+ {
+ HttpClient client = new HttpClient();
+ HttpClientRequest request = new HttpClientRequest();
+ HttpClientResponse response;
+
+ client.KeepAlive = false;
+
+ if(port >= 1 || port <= 65535)
+ client.Port = port;
+ else
+ client.Port = 80;
+
+ var authorization = "";
+ if (!string.IsNullOrEmpty(username))
+ authorization = EncodeBase64(username, password);
+
+ if (!string.IsNullOrEmpty(authorization))
+ request.Header.SetHeaderValue("Authorization", authorization);
+
+ if (!string.IsNullOrEmpty(contentType))
+ request.Header.ContentType = contentType;
+
+ request.Url.Parse(url);
+ request.RequestType = (Crestron.SimplSharp.Net.Http.RequestType)requestType;
+
+ response = client.Dispatch(request);
+
+ CrestronConsole.PrintLine(string.Format("SubmitRequestHttp Response[{0}]: {1}", response.Code, response.ContentString.ToString()));
+
+ if (!string.IsNullOrEmpty(response.ContentString.ToString()))
+ OnStringChange(response.ContentString.ToString(), 0, GenericRESTfulConstants.ResponseStringChange);
+
+ if (response.Code > 0)
+ OnUshrtChange((ushort)response.Code, 0, GenericRESTfulConstants.ResponseCodeChange);
+ }
+ catch (Exception e)
+ {
+ //var msg = string.Format("SubmitRequestHttp({0}, {1}, {2}) failed:{3}", url, port, requestType, e.Message);
+ //CrestronConsole.PrintLine(msg);
+ //ErrorLog.Error(msg);
+
+ CrestronConsole.PrintLine(e.Message);
+ OnStringChange(e.Message, 0, GenericRESTfulConstants.ErrorStringChange);
+ }
+ }
+
+ ///
+ /// Private HTTPS submit request
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ private void SubmitRequestHttps(string url, ushort port, ushort requestType, string contentType, string username, string password)
+ {
+ try
+ {
+ HttpsClient client = new HttpsClient();
+ HttpsClientRequest request = new HttpsClientRequest();
+ HttpsClientResponse response;
+
+ client.KeepAlive = false;
+ client.HostVerification = false;
+ client.PeerVerification = false;
+
+ var authorization = "";
+ if (!string.IsNullOrEmpty(username))
+ authorization = EncodeBase64(username, password);
+
+ if (!string.IsNullOrEmpty(authorization))
+ request.Header.SetHeaderValue("Authorization", authorization);
+
+ if (!string.IsNullOrEmpty(contentType))
+ request.Header.ContentType = contentType;
+
+ request.Url.Parse(url);
+ request.RequestType = (Crestron.SimplSharp.Net.Https.RequestType)requestType;
+
+ response = client.Dispatch(request);
+
+ CrestronConsole.PrintLine(string.Format("SubmitRequestHttp Response[{0}]: {1}", response.Code, response.ContentString.ToString()));
+
+ if(!string.IsNullOrEmpty(response.ContentString.ToString()))
+ OnStringChange(response.ContentString.ToString(), 0, GenericRESTfulConstants.ResponseStringChange);
+
+ if(response.Code > 0)
+ OnUshrtChange((ushort)response.Code, 0, GenericRESTfulConstants.ResponseCodeChange);
+
+ }
+ catch (Exception e)
+ {
+ //var msg = string.Format("SubmitRequestHttps({0}, {1}, {2}, {3}, {4}) failed:{5}", url, port, requestType, username, password, e.Message);
+ //CrestronConsole.PrintLine(msg);
+ //ErrorLog.Error(msg);
+
+ CrestronConsole.PrintLine(e.Message);
+ OnStringChange(e.Message, 0, GenericRESTfulConstants.ErrorStringChange);
+ }
+ }
+
+ ///
+ /// Private method to encode username and password to Base64 string
+ ///
+ ///
+ ///
+ /// authorization
+ private string EncodeBase64(string username, string password)
+ {
+ var authorization = "";
+
+ try
+ {
+ if (!string.IsNullOrEmpty(username))
+ {
+ string base64String = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(string.Format("{0}:{1}", username, password)));
+ authorization = string.Format("Basic {0}", base64String);
+ }
+ }
+ catch (Exception e)
+ {
+ var msg = string.Format("EncodeBase64({0}, {1}) failed:\r{2}", username, password, e);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
+ return "" ;
+ }
+
+ return authorization;
+ }
+
+ ///
+ /// Protected method to handle boolean change events
+ ///
+ ///
+ ///
+ ///
+ 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 mehtod to handle ushort change events
+ ///
+ ///
+ ///
+ ///
+ 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 method to handle string change events
+ ///
+ ///
+ ///
+ ///
+ 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/Pepperdash Core/Pepperdash Core/JsonStandardObjects/EventArgs and Constants.cs b/Pepperdash Core/Pepperdash Core/JsonStandardObjects/EventArgs and Constants.cs
index f4a3118..2bac226 100644
--- a/Pepperdash Core/Pepperdash Core/JsonStandardObjects/EventArgs and Constants.cs
+++ b/Pepperdash Core/Pepperdash Core/JsonStandardObjects/EventArgs and Constants.cs
@@ -6,36 +6,46 @@ using Crestron.SimplSharp;
namespace PepperDash.Core.JsonStandardObjects
{
- #region Constants
-
///
/// Constants for simpl modules
///
public class JsonStandardDeviceConstants
{
+ ///
+ /// Json object evaluated constant
+ ///
public const ushort JsonObjectEvaluated = 2;
+ ///
+ /// Json object changed constant
+ ///
public const ushort JsonObjectChanged = 104;
}
- #endregion Constants
-
-
- #region ObjectChangeEventArgs
-
///
///
///
- public class ObjectChangeEventArgs : EventArgs
+ public class DeviceChangeEventArgs : EventArgs
{
+ ///
+ /// Device change event args object
+ ///
public DeviceConfig Device { get; set; }
+
+ ///
+ /// Device change event args type
+ ///
public ushort Type { get; set; }
+
+ ///
+ /// Device change event args index
+ ///
public ushort Index { get; set; }
///
/// Default constructor
///
- public ObjectChangeEventArgs()
+ public DeviceChangeEventArgs()
{
}
@@ -45,7 +55,7 @@ namespace PepperDash.Core.JsonStandardObjects
///
///
///
- public ObjectChangeEventArgs(DeviceConfig device, ushort type)
+ public DeviceChangeEventArgs(DeviceConfig device, ushort type)
{
Device = device;
Type = type;
@@ -57,13 +67,11 @@ namespace PepperDash.Core.JsonStandardObjects
///
///
///
- public ObjectChangeEventArgs(DeviceConfig device, ushort type, ushort index)
+ public DeviceChangeEventArgs(DeviceConfig device, ushort type, ushort index)
{
Device = device;
Type = type;
Index = index;
}
}
-
- #endregion ObjectChangeEventArgs
}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/JsonStandardObjects/JsonToSimplDevice.cs b/Pepperdash Core/Pepperdash Core/JsonStandardObjects/JsonToSimplDevice.cs
index 7ad1a89..eef68f2 100644
--- a/Pepperdash Core/Pepperdash Core/JsonStandardObjects/JsonToSimplDevice.cs
+++ b/Pepperdash Core/Pepperdash Core/JsonStandardObjects/JsonToSimplDevice.cs
@@ -9,52 +9,10 @@ using PepperDash.Core.JsonToSimpl;
namespace PepperDash.Core.JsonStandardObjects
{
- /*
- Convert JSON snippt to C#: http://json2csharp.com/#
-
- JSON Snippet:
- {
- "devices": [
- {
- "key": "deviceKey",
- "name": "deviceName",
- "type": "deviceType",
- "properties": {
- "deviceId": 1,
- "enabled": true,
- "control": {
- "method": "methodName",
- "controlPortDevKey": "deviceControlPortDevKey",
- "controlPortNumber": 1,
- "comParams": {
- "baudRate": 9600,
- "dataBits": 8,
- "stopBits": 1,
- "parity": "None",
- "protocol": "RS232",
- "hardwareHandshake": "None",
- "softwareHandshake": "None",
- "pacing": 0
- },
- "tcpSshProperties": {
- "address": "172.22.1.101",
- "port": 23,
- "username": "user01",
- "password": "password01",
- "autoReconnect": false,
- "autoReconnectIntervalMs": 10000
- }
- }
- }
- }
- ]
- }
- */
-
///
/// Device class
///
- public class DeviceConfig : JsonToSimplChildObjectBase
+ public class DeviceConfig
{
///
/// JSON config key property
@@ -88,7 +46,7 @@ namespace PepperDash.Core.JsonStandardObjects
///
/// Object change event handler
///
- public event EventHandler ObjectChange;
+ public event EventHandler DeviceChange;
///
/// Constructor
@@ -164,7 +122,8 @@ namespace PepperDash.Core.JsonStandardObjects
///
protected void OnBoolChange(bool state, ushort index, ushort type)
{
- if (BoolChange != null)
+ var handler = BoolChange;
+ if (handler != null)
{
var args = new BoolChangeEventArgs(state, type);
args.Index = index;
@@ -180,7 +139,8 @@ namespace PepperDash.Core.JsonStandardObjects
///
protected void OnUshrtChange(ushort state, ushort index, ushort type)
{
- if (UshrtChange != null)
+ var handler = UshrtChange;
+ if (handler != null)
{
var args = new UshrtChangeEventArgs(state, type);
args.Index = index;
@@ -196,7 +156,8 @@ namespace PepperDash.Core.JsonStandardObjects
///
protected void OnStringChange(string value, ushort index, ushort type)
{
- if (StringChange != null)
+ var handler = StringChange;
+ if (handler != null)
{
var args = new StringChangeEventArgs(value, type);
args.Index = index;
@@ -212,127 +173,14 @@ namespace PepperDash.Core.JsonStandardObjects
///
protected void OnObjectChange(DeviceConfig device, ushort index, ushort type)
{
- if (ObjectChange != null)
+ if (DeviceChange != null)
{
- var args = new ObjectChangeEventArgs(device, type);
+ var args = new DeviceChangeEventArgs(device, type);
args.Index = index;
- ObjectChange(this, args);
+ DeviceChange(this, args);
}
}
#endregion EventHandler Helpers
}
-
- #region JSON Configuration Classes
-
- ///
- /// Device communication parameter class
- ///
- public class ComParamsConfig
- {
- public int baudRate { get; set; }
- public int dataBits { get; set; }
- public int stopBits { get; set; }
- public string parity { get; set; }
- public string protocol { get; set; }
- public string hardwareHandshake { get; set; }
- public string softwareHandshake { get; set; }
- public int pacing { get; set; }
-
- // convert properties for simpl
- public ushort simplBaudRate { get { return Convert.ToUInt16(baudRate); } }
- public ushort simplDataBits { get { return Convert.ToUInt16(dataBits); } }
- public ushort simplStopBits { get { return Convert.ToUInt16(stopBits); } }
- public ushort simplPacing { get { return Convert.ToUInt16(pacing); } }
-
- ///
- /// Constructor
- ///
- public ComParamsConfig()
- {
-
- }
- }
-
- ///
- /// Device TCP/SSH properties class
- ///
- public class TcpSshPropertiesConfig
- {
- public string address { get; set; }
- public int port { get; set; }
- public string username { get; set; }
- public string password { get; set; }
- public bool autoReconnect { get; set; }
- public int autoReconnectIntervalMs { get; set; }
-
- // convert properties for simpl
- public ushort simplPort { get { return Convert.ToUInt16(port); } }
- public ushort simplAutoReconnect { get { return (ushort)(autoReconnect ? 1 : 0); } }
- public ushort simplAutoReconnectIntervalMs { get { return Convert.ToUInt16(autoReconnectIntervalMs); } }
-
- ///
- /// Constructor
- ///
- public TcpSshPropertiesConfig()
- {
-
- }
- }
-
- ///
- /// Device control class
- ///
- public class ControlConfig
- {
- public string method { get; set; }
- public string controlPortDevKey { get; set; }
- public int controlPortNumber { get; set; }
- public ComParamsConfig comParams { get; set; }
- public TcpSshPropertiesConfig tcpSshProperties { get; set; }
-
- // convert properties for simpl
- public ushort simplControlPortNumber { get { return Convert.ToUInt16(controlPortNumber); } }
-
- ///
- /// Constructor
- ///
- public ControlConfig()
- {
- comParams = new ComParamsConfig();
- tcpSshProperties = new TcpSshPropertiesConfig();
- }
- }
-
- ///
- /// Device properties class
- ///
- public class PropertiesConfig
- {
- public int deviceId { get; set; }
- public bool enabled { get; set; }
- public ControlConfig control { get; set; }
-
- // convert properties for simpl
- public ushort simplDeviceId { get { return Convert.ToUInt16(deviceId); } }
- public ushort simplEnabled { get { return (ushort)(enabled ? 1 : 0); } }
-
- ///
- /// Constructor
- ///
- public PropertiesConfig()
- {
- control = new ControlConfig();
- }
- }
-
- ///
- /// Root device class
- ///
- public class RootObject
- {
- public List devices { get; set; }
- }
-
- #endregion JSON Configuration Classes
}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/JsonStandardObjects/JsonToSimplDeviceConfig.cs b/Pepperdash Core/Pepperdash Core/JsonStandardObjects/JsonToSimplDeviceConfig.cs
new file mode 100644
index 0000000..92e9f03
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/JsonStandardObjects/JsonToSimplDeviceConfig.cs
@@ -0,0 +1,158 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core.JsonStandardObjects
+{
+ /*
+ Convert JSON snippt to C#: http://json2csharp.com/#
+
+ JSON Snippet:
+ {
+ "devices": [
+ {
+ "key": "deviceKey",
+ "name": "deviceName",
+ "type": "deviceType",
+ "properties": {
+ "deviceId": 1,
+ "enabled": true,
+ "control": {
+ "method": "methodName",
+ "controlPortDevKey": "deviceControlPortDevKey",
+ "controlPortNumber": 1,
+ "comParams": {
+ "baudRate": 9600,
+ "dataBits": 8,
+ "stopBits": 1,
+ "parity": "None",
+ "protocol": "RS232",
+ "hardwareHandshake": "None",
+ "softwareHandshake": "None",
+ "pacing": 0
+ },
+ "tcpSshProperties": {
+ "address": "172.22.1.101",
+ "port": 23,
+ "username": "user01",
+ "password": "password01",
+ "autoReconnect": false,
+ "autoReconnectIntervalMs": 10000
+ }
+ }
+ }
+ }
+ ]
+ }
+ */
+ ///
+ /// Device communication parameter class
+ ///
+ public class ComParamsConfig
+ {
+ public int baudRate { get; set; }
+ public int dataBits { get; set; }
+ public int stopBits { get; set; }
+ public string parity { get; set; }
+ public string protocol { get; set; }
+ public string hardwareHandshake { get; set; }
+ public string softwareHandshake { get; set; }
+ public int pacing { get; set; }
+
+ // convert properties for simpl
+ public ushort simplBaudRate { get { return Convert.ToUInt16(baudRate); } }
+ public ushort simplDataBits { get { return Convert.ToUInt16(dataBits); } }
+ public ushort simplStopBits { get { return Convert.ToUInt16(stopBits); } }
+ public ushort simplPacing { get { return Convert.ToUInt16(pacing); } }
+
+ ///
+ /// Constructor
+ ///
+ public ComParamsConfig()
+ {
+
+ }
+ }
+
+ ///
+ /// Device TCP/SSH properties class
+ ///
+ public class TcpSshPropertiesConfig
+ {
+ public string address { get; set; }
+ public int port { get; set; }
+ public string username { get; set; }
+ public string password { get; set; }
+ public bool autoReconnect { get; set; }
+ public int autoReconnectIntervalMs { get; set; }
+
+ // convert properties for simpl
+ public ushort simplPort { get { return Convert.ToUInt16(port); } }
+ public ushort simplAutoReconnect { get { return (ushort)(autoReconnect ? 1 : 0); } }
+ public ushort simplAutoReconnectIntervalMs { get { return Convert.ToUInt16(autoReconnectIntervalMs); } }
+
+ ///
+ /// Constructor
+ ///
+ public TcpSshPropertiesConfig()
+ {
+
+ }
+ }
+
+ ///
+ /// Device control class
+ ///
+ public class ControlConfig
+ {
+ public string method { get; set; }
+ public string controlPortDevKey { get; set; }
+ public int controlPortNumber { get; set; }
+ public ComParamsConfig comParams { get; set; }
+ public TcpSshPropertiesConfig tcpSshProperties { get; set; }
+
+ // convert properties for simpl
+ public ushort simplControlPortNumber { get { return Convert.ToUInt16(controlPortNumber); } }
+
+ ///
+ /// Constructor
+ ///
+ public ControlConfig()
+ {
+ comParams = new ComParamsConfig();
+ tcpSshProperties = new TcpSshPropertiesConfig();
+ }
+ }
+
+ ///
+ /// Device properties class
+ ///
+ public class PropertiesConfig
+ {
+ public int deviceId { get; set; }
+ public bool enabled { get; set; }
+ public ControlConfig control { get; set; }
+
+ // convert properties for simpl
+ public ushort simplDeviceId { get { return Convert.ToUInt16(deviceId); } }
+ public ushort simplEnabled { get { return (ushort)(enabled ? 1 : 0); } }
+
+ ///
+ /// Constructor
+ ///
+ public PropertiesConfig()
+ {
+ control = new ControlConfig();
+ }
+ }
+
+ ///
+ /// Root device class
+ ///
+ public class RootObject
+ {
+ public List devices { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/JsonToSimpl/Constants.cs b/Pepperdash Core/Pepperdash Core/JsonToSimpl/Constants.cs
new file mode 100644
index 0000000..0838d56
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/JsonToSimpl/Constants.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core.JsonToSimpl
+{
+ ///
+ /// Constants for Simpl modules
+ ///
+ public class JsonToSimplConstants
+ {
+ public const ushort BoolValueChange = 1;
+ public const ushort JsonIsValidBoolChange = 2;
+
+ public const ushort UshortValueChange = 101;
+
+ public const ushort StringValueChange = 201;
+ public const ushort FullPathToArrayChange = 202;
+ public const ushort ActualFilePathChange = 203;
+
+ // TODO: pdc-20: Added below constants for passing file path and filename back to S+
+ public const ushort FilenameResolvedChange = 204;
+ public const ushort FilePathResolvedChange = 205;
+ }
+
+ ///
+ /// S+ values delegate
+ ///
+ public delegate void SPlusValuesDelegate();
+
+ ///
+ /// S+ values wrapper
+ ///
+ public class SPlusValueWrapper
+ {
+ public SPlusType ValueType { get; private set; }
+ public ushort Index { get; private set; }
+ public ushort BoolUShortValue { get; set; }
+ public string StringValue { get; set; }
+
+ public SPlusValueWrapper() { }
+
+ public SPlusValueWrapper(SPlusType type, ushort index)
+ {
+ ValueType = type;
+ Index = index;
+ }
+ }
+
+ ///
+ /// S+ types enum
+ ///
+ public enum SPlusType
+ {
+ Digital, Analog, String
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/JsonToSimpl/EventArgs and Constants.cs b/Pepperdash Core/Pepperdash Core/JsonToSimpl/EventArgs and Constants.cs
deleted file mode 100644
index 4fa4dee..0000000
--- a/Pepperdash Core/Pepperdash Core/JsonToSimpl/EventArgs and Constants.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-
-namespace PepperDash.Core.JsonToSimpl
-{
- ///
- /// Constants for Simpl modules
- ///
- public class JsonToSimplConstants
- {
- public const ushort JsonIsValidBoolChange = 2;
-
-
- public const ushort BoolValueChange = 1;
- public const ushort UshortValueChange = 101;
- public const ushort StringValueChange = 201;
- public const ushort FullPathToArrayChange = 202;
- public const ushort ActualFilePathChange = 203;
-
- // TODO: pdc-20: Added below constants for passing file path and filename back to S+
- public const ushort FilenameResolvedChange = 204;
- public const ushort FilePathResolvedChange = 205;
- }
-
- //**************************************************************************************************//
- public delegate void SPlusValuesDelegate();
-
- public class SPlusValueWrapper
- {
- public SPlusType ValueType { get; private set; }
- public ushort Index { get; private set; }
- public ushort BoolUShortValue { get; set; }
- public string StringValue { get; set; }
-
- public SPlusValueWrapper() { }
-
- public SPlusValueWrapper(SPlusType type, ushort index)
- {
- ValueType = type;
- Index = index;
- }
- }
-
- public enum SPlusType
- {
- Digital, Analog, String
- }
-
-
- //**************************************************************************************************//
- public class BoolChangeEventArgs : EventArgs
- {
- public bool State { get; set; }
- public ushort IntValue { get { return (ushort)(State ? 1 : 0); } }
- public ushort Type { get; set; }
- public ushort Index { get; set; }
-
- public BoolChangeEventArgs()
- {
- }
-
- public BoolChangeEventArgs(bool state, ushort type)
- {
- State = state;
- Type = type;
- }
-
- public BoolChangeEventArgs(bool state, ushort type, ushort index)
- {
- State = state;
- Type = type;
- Index = index;
- }
- }
-
- //**************************************************************************************************//
- public class UshrtChangeEventArgs : EventArgs
- {
- public ushort IntValue { get; set; }
- public ushort Type { get; set; }
- public ushort Index { get; set; }
-
- public UshrtChangeEventArgs()
- {
- }
-
- public UshrtChangeEventArgs(ushort intValue, ushort type)
- {
- IntValue = intValue;
- Type = type;
- }
-
- public UshrtChangeEventArgs(ushort intValue, ushort type, ushort index)
- {
- IntValue = intValue;
- Type = type;
- Index = index;
- }
- }
-
- //**************************************************************************************************//
- public class StringChangeEventArgs : EventArgs
- {
- public string StringValue { get; set; }
- public ushort Type { get; set; }
- public ushort Index { get; set; }
-
- public StringChangeEventArgs()
- {
- }
-
- public StringChangeEventArgs(string stringValue, ushort type)
- {
- StringValue = stringValue;
- Type = type;
- }
-
- public StringChangeEventArgs(string stringValue, ushort type, ushort index)
- {
- StringValue = stringValue;
- Type = type;
- Index = index;
- }
-
- }
-}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj b/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj
index 8869ca9..ec3427c 100644
--- a/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj
+++ b/Pepperdash Core/Pepperdash Core/PepperDash_Core.csproj
@@ -86,7 +86,11 @@
+
+
+
+
@@ -96,7 +100,7 @@
-
+
@@ -106,6 +110,13 @@
+
+
+
+
+
+
+
diff --git a/Pepperdash Core/Pepperdash Core/SystemInfo/ConsoleHelper.cs b/Pepperdash Core/Pepperdash Core/SystemInfo/ConsoleHelper.cs
new file mode 100644
index 0000000..c38279d
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/SystemInfo/ConsoleHelper.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core.SystemInfo
+{
+ ///
+ /// Console helper class
+ ///
+ public class ConsoleHelper
+ {
+ ///
+ /// Cosntructor
+ ///
+ public ConsoleHelper()
+ {
+
+ }
+
+ ///
+ /// Parse console respopnse method
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// console response
+ public string ParseConsoleResponse(string response, string line, string startString, string endString)
+ {
+ if (string.IsNullOrEmpty(response) || string.IsNullOrEmpty(line) || string.IsNullOrEmpty(startString) || string.IsNullOrEmpty(endString))
+ return "";
+
+ try
+ {
+ var linePos = response.IndexOf(line);
+ var startPos = response.IndexOf(startString, linePos) + startString.Length;
+ var endPos = response.IndexOf(endString, startPos);
+ response = response.Substring(startPos, endPos - startPos).Trim();
+ }
+ catch (Exception e)
+ {
+ var msg = string.Format("ConsoleHelper.ParseConsoleResponse failed:\r{0}", e);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
+ }
+
+ return response;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/SystemInfo/ControlSubnetInfo.cs b/Pepperdash Core/Pepperdash Core/SystemInfo/ControlSubnetInfo.cs
new file mode 100644
index 0000000..6353339
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/SystemInfo/ControlSubnetInfo.cs
@@ -0,0 +1,81 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core.SystemInfo
+{
+ ///
+ /// Control subnet class
+ ///
+ public class ControlSubnetConfig
+ {
+ public ushort Enabled { get; set; }
+ public ushort IsInAutomaticMode { get; set; }
+ public string MacAddress { get; set; }
+ public string IpAddress { get; set; }
+ public string Subnet { get; set; }
+ public string RouterPrefix { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public ControlSubnetConfig()
+ {
+ // add logic here if necessary
+ }
+ }
+
+ ///
+ /// Control subnet info class
+ ///
+ public class ControlSubnetInfo
+ {
+ public ControlSubnetConfig properties { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public ControlSubnetInfo()
+ {
+ properties.Enabled = (ushort)0;
+ properties.IsInAutomaticMode = (ushort)0;
+ properties.MacAddress = "NA";
+ properties.IpAddress = "NA";
+ properties.Subnet = "NA";
+ properties.RouterPrefix = "NA";
+ }
+
+ ///
+ /// Get control subnet info
+ ///
+ ///
+ public bool GetInfo()
+ {
+ try
+ {
+ // get cs adapter id
+ var adapterId = CrestronEthernetHelper.GetAdapterdIdForSpecifiedAdapterType(EthernetAdapterType.EthernetCSAdapter);
+ if (!adapterId.Equals(EthernetAdapterType.EthernetUnknownAdapter))
+ {
+ properties.Enabled = (ushort)EthernetAdapterType.EthernetCSAdapter;
+ properties.IsInAutomaticMode = (ushort)(CrestronEthernetHelper.IsControlSubnetInAutomaticMode ? 1 : 0);
+ properties.MacAddress = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_MAC_ADDRESS, adapterId);
+ properties.IpAddress = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, adapterId);
+ properties.Subnet = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_MASK, adapterId);
+ properties.RouterPrefix = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CONTROL_SUBNET_ROUTER_PREFIX, adapterId);
+ }
+ }
+ catch (Exception e)
+ {
+ var msg = string.Format("ControlSubnetInfo.GetInfo() failed:\r{0}", e);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/SystemInfo/EthernetInfo.cs b/Pepperdash Core/Pepperdash Core/SystemInfo/EthernetInfo.cs
new file mode 100644
index 0000000..d98d186
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/SystemInfo/EthernetInfo.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core.SystemInfo
+{
+ ///
+ /// Ethernet class
+ ///
+ public class EthernetConfig
+ {
+ public ushort DhcpIsOn { get; set; }
+ public string Hostname { get; set; }
+ public string MacAddress { get; set; }
+ public string IpAddress { get; set; }
+ public string Subnet { get; set; }
+ public string Gateway { get; set; }
+ public string Dns1 { get; set; }
+ public string Dns2 { get; set; }
+ public string Dns3 { get; set; }
+ public string Domain { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public EthernetConfig()
+ {
+ // add logic here if necessary
+ }
+ }
+
+ ///
+ ///
+ ///
+ public class EthernetInfo
+ {
+ public EthernetConfig properties { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public EthernetInfo()
+ {
+
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public bool GetInfo()
+ {
+ try
+ {
+ // get lan adapter id
+ var adapterId = CrestronEthernetHelper.GetAdapterdIdForSpecifiedAdapterType(EthernetAdapterType.EthernetLANAdapter);
+
+ // get lan adapter info
+ var dhcpState = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_DHCP_STATE, adapterId);
+ if (!string.IsNullOrEmpty(dhcpState))
+ properties.DhcpIsOn = (ushort)(dhcpState.ToLower().Contains("on") ? 1 : 0);
+
+ properties.Hostname = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_HOSTNAME, adapterId);
+ properties.MacAddress = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_MAC_ADDRESS, adapterId);
+ properties.IpAddress = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, adapterId);
+ properties.Subnet = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_MASK, adapterId);
+ properties.Gateway = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_ROUTER, adapterId);
+ properties.Domain = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_DOMAIN_NAME, adapterId);
+
+ // returns comma seperate list of dns servers with trailing comma
+ // example return: "8.8.8.8 (DHCP),8.8.4.4 (DHCP),"
+ string dns = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_DNS_SERVER, adapterId);
+ if (string.IsNullOrEmpty(dns))
+ {
+ properties.Dns1 = "0.0.0.0";
+ properties.Dns2 = "0.0.0.0";
+ properties.Dns3 = "0.0.0.0";
+ }
+
+ if (dns.Contains(","))
+ {
+ string[] dnsList = dns.Split(',');
+ properties.Dns1 = !string.IsNullOrEmpty(dnsList[0]) ? dnsList[0] : "0.0.0.0";
+ properties.Dns2 = !string.IsNullOrEmpty(dnsList[1]) ? dnsList[1] : "0.0.0.0";
+ properties.Dns3 = !string.IsNullOrEmpty(dnsList[2]) ? dnsList[2] : "0.0.0.0";
+ }
+ else
+ {
+
+ properties.Dns1 = !string.IsNullOrEmpty(dns) ? dns : "0.0.0.0";
+ properties.Dns2 = "0.0.0.0";
+ properties.Dns3 = "0.0.0.0";
+ }
+ }
+ catch(Exception e)
+ {
+ var msg = string.Format("EthernetInfo.GetInfo() failed:\r{0}", e);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/SystemInfo/EventArgs and Constants.cs b/Pepperdash Core/Pepperdash Core/SystemInfo/EventArgs and Constants.cs
new file mode 100644
index 0000000..169bf4b
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/SystemInfo/EventArgs and Constants.cs
@@ -0,0 +1,187 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core.SystemInfo
+{
+ ///
+ /// Constants
+ ///
+ public class SystemInfoConstants
+ {
+ public const ushort BoolValueChange = 1;
+ public const ushort CompleteBoolChange = 2;
+ public const ushort BusyBoolChange = 3;
+
+ public const ushort UshortValueChange = 101;
+
+ public const ushort StringValueChange = 201;
+ public const ushort ConsoleResponseChange = 202;
+ public const ushort ProcessorUptimeChange = 203;
+ public const ushort ProgramUptimeChange = 204;
+
+ public const ushort ObjectChange = 301;
+ public const ushort ProcessorObjectChange = 302;
+ public const ushort EthernetObjectChange = 303;
+ public const ushort ControlSubnetObjectChange = 304;
+ public const ushort ProgramObjectChange = 305;
+ }
+
+ ///
+ /// Processor Change Event Args Class
+ ///
+ public class ProcessorChangeEventArgs : EventArgs
+ {
+ public ProcessorConfig Processor { get; set; }
+ public ushort Type { get; set; }
+ public ushort Index { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public ProcessorChangeEventArgs()
+ {
+
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ public ProcessorChangeEventArgs(ProcessorConfig processor, ushort type)
+ {
+ Processor = processor;
+ Type = type;
+ }
+
+ ///
+ /// Constructor
+ ///
+ public ProcessorChangeEventArgs(ProcessorConfig processor, ushort type, ushort index)
+ {
+ Processor = processor;
+ Type = type;
+ Index = index;
+ }
+ }
+
+ ///
+ /// Ethernet Change Event Args Class
+ ///
+ public class EthernetChangeEventArgs : EventArgs
+ {
+ public EthernetConfig Adapter { get; set; }
+ public ushort Type { get; set; }
+ public ushort Index { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public EthernetChangeEventArgs()
+ {
+
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ public EthernetChangeEventArgs(EthernetConfig ethernet, ushort type)
+ {
+ Adapter = ethernet;
+ Type = type;
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ public EthernetChangeEventArgs(EthernetConfig ethernet, ushort type, ushort index)
+ {
+ Adapter = ethernet;
+ Type = type;
+ Index = index;
+ }
+ }
+
+ ///
+ /// Control Subnet Chage Event Args Class
+ ///
+ public class ControlSubnetChangeEventArgs : EventArgs
+ {
+ public ControlSubnetConfig Adapter { get; set; }
+ public ushort Type { get; set; }
+ public ushort Index { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public ControlSubnetChangeEventArgs()
+ {
+
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ public ControlSubnetChangeEventArgs(ControlSubnetConfig controlSubnet, ushort type)
+ {
+ Adapter = controlSubnet;
+ Type = type;
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ public ControlSubnetChangeEventArgs(ControlSubnetConfig controlSubnet, ushort type, ushort index)
+ {
+ Adapter = controlSubnet;
+ Type = type;
+ Index = index;
+ }
+ }
+
+ ///
+ /// Program Change Event Args Class
+ ///
+ public class ProgramChangeEventArgs : EventArgs
+ {
+ public ProgramConfig Program { get; set; }
+ public ushort Type { get; set; }
+ public ushort Index { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public ProgramChangeEventArgs()
+ {
+
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ public ProgramChangeEventArgs(ProgramConfig program, ushort type)
+ {
+ Program = program;
+ Type = type;
+ }
+
+ ///
+ /// Constructor overload
+ ///
+ ///
+ ///
+ public ProgramChangeEventArgs(ProgramConfig program, ushort type, ushort index)
+ {
+ Program = program;
+ Type = type;
+ Index = index;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/SystemInfo/ProcessorInfo.cs b/Pepperdash Core/Pepperdash Core/SystemInfo/ProcessorInfo.cs
new file mode 100644
index 0000000..701956e
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/SystemInfo/ProcessorInfo.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core.SystemInfo
+{
+ ///
+ /// Processor properties class
+ ///
+ public class ProcessorConfig
+ {
+ public string Model { get; set; }
+ public string SerialNumber { get; set; }
+ public string Firmware { get; set; }
+ public string FirmwareDate { get; set; }
+ public string OsVersion { get; set; }
+ public string RuntimeEnvironment { get; set; }
+ public string DevicePlatform { get; set; }
+ public string ModuleDirectory { get; set; }
+ public string LocalTimeZone { get; set; }
+ public string ProgramIdTag { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public ProcessorConfig()
+ {
+ Model = "";
+ SerialNumber = "";
+ Firmware = "";
+ FirmwareDate = "";
+ OsVersion = "";
+ RuntimeEnvironment = "";
+ DevicePlatform = "";
+ ModuleDirectory = "";
+ LocalTimeZone = "";
+ ProgramIdTag = "";
+ }
+ }
+
+ ///
+ ///
+ ///
+ public class ProcessorInfo
+ {
+ public ProcessorConfig properties { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public ProcessorInfo()
+ {
+ properties.Model = "";
+ properties.SerialNumber = "";
+ properties.Firmware = "";
+ properties.FirmwareDate = "";
+ properties.OsVersion = "";
+ properties.RuntimeEnvironment = "";
+ properties.DevicePlatform = "";
+ properties.ModuleDirectory = "";
+ properties.LocalTimeZone = "";
+ properties.ProgramIdTag = "";
+ }
+
+ ///
+ /// Get processor info method
+ ///
+ /// bool
+ public bool GetInfo()
+ {
+ var console = new ConsoleHelper();
+
+ try
+ {
+ properties.Model = InitialParametersClass.ControllerPromptName;
+ properties.SerialNumber = CrestronEnvironment.SystemInfo.SerialNumber;
+ properties.ModuleDirectory = InitialParametersClass.ProgramDirectory.ToString();
+ properties.ProgramIdTag = InitialParametersClass.ProgramIDTag;
+ properties.DevicePlatform = CrestronEnvironment.DevicePlatform.ToString();
+ properties.OsVersion = CrestronEnvironment.OSVersion.Version.ToString();
+ properties.RuntimeEnvironment = CrestronEnvironment.RuntimeEnvironment.ToString();
+ properties.LocalTimeZone = CrestronEnvironment.GetTimeZone().Offset;
+
+ // Does not return firmware version matching a "ver" command
+ // returns the "ver -v" 'CAB' version
+ // example return ver -v:
+ // RMC3 Cntrl Eng [v1.503.3568.25373 (Oct 09 2018), #4001E302] @E-00107f4420f0
+ // Build: 14:05:46 Oct 09 2018 (3568.25373)
+ // Cab: 1.503.0070
+ // Applications: 1.0.6855.21351
+ // Updater: 1.4.24
+ // Bootloader: 1.22.00
+ // RMC3-SetupProgram: 1.003.0011
+ // IOPVersion: FPGA [v09] slot:7
+ // PUF: Unknown
+ //Firmware = CrestronEnvironment.OSVersion.Firmware;
+ //Firmware = InitialParametersClass.FirmwareVersion;
+
+ // Use below logic to get actual firmware ver, not the 'CAB' returned by the above
+ // matches console return of a "ver" and on SystemInfo page
+ // example return ver:
+ // RMC3 Cntrl Eng [v1.503.3568.25373 (Oct 09 2018), #4001E302] @E-00107f4420f0
+ var response = "";
+ CrestronConsole.SendControlSystemCommand("ver", ref response);
+ properties.Firmware = console.ParseConsoleResponse(response, "Cntrl Eng", "[", "(");
+ properties.FirmwareDate = console.ParseConsoleResponse(response, "Cntrl Eng", "(", ")");
+ }
+ catch (Exception e)
+ {
+ var msg = string.Format("ProcessorInfo.GetInfo() failed:\r{0}", e);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/SystemInfo/ProgramInfo.cs b/Pepperdash Core/Pepperdash Core/SystemInfo/ProgramInfo.cs
new file mode 100644
index 0000000..46cebd1
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/SystemInfo/ProgramInfo.cs
@@ -0,0 +1,88 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+namespace PepperDash.Core.SystemInfo
+{
+ ///
+ /// Program class
+ ///
+ public class ProgramConfig
+ {
+ public string Key { get; set; }
+ public string Name { get; set; }
+ public string Header { get; set; }
+ public string System { get; set; }
+ public string CompileTime { get; set; }
+ public string Database { get; set; }
+ public string Environment { get; set; }
+ public string Programmer { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public ProgramConfig()
+ {
+ // add logic here if necessary
+ }
+ }
+
+ ///
+ /// Program info class
+ ///
+ public class ProgramInfo
+ {
+ public ProgramConfig properties { get; set; }
+
+ ///
+ /// Constructor
+ ///
+ public ProgramInfo()
+ {
+
+ }
+
+ ///
+ /// Get program info by index
+ ///
+ ///
+ ///
+ public bool GetInfoByIndex(int index)
+ {
+ var console = new ConsoleHelper();
+
+ try
+ {
+ string response = "";
+ CrestronConsole.SendControlSystemCommand(string.Format("progcomments:{0}", index), ref response);
+
+ // SIMPL returns
+ properties.Name = console.ParseConsoleResponse(response, "Program File", ":", "\x0D");
+ properties.System = console.ParseConsoleResponse(response, "System Name", ":", "\x0D");
+ properties.Programmer = console.ParseConsoleResponse(response, "Programmer", ":", "\x0D");
+ properties.CompileTime = console.ParseConsoleResponse(response, "Compiled On", ":", "\x0D");
+ properties.Database = console.ParseConsoleResponse(response, "CrestronDB", ":", "\x0D");
+ properties.Environment = console.ParseConsoleResponse(response, "Source Env", ":", "\x0D");
+
+ // S# returns
+ if (properties.System.Length == 0)
+ properties.System = console.ParseConsoleResponse(response, "Application Name", ":", "\x0D");
+ if (properties.Database.Length == 0)
+ properties.Database = console.ParseConsoleResponse(response, "PlugInVersion", ":", "\x0D");
+ if (properties.Environment.Length == 0)
+ properties.Environment = console.ParseConsoleResponse(response, "Program Tool", ":", "\x0D");
+ }
+ catch (Exception e)
+ {
+ var msg = string.Format("ProgramInfo.GetInfoByIndex({0}) failed:\r{1}", index, e);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
+ return false;
+ }
+
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Pepperdash Core/Pepperdash Core/SystemInfo/SystemInfoToSimpl.cs b/Pepperdash Core/Pepperdash Core/SystemInfo/SystemInfoToSimpl.cs
new file mode 100644
index 0000000..c86d469
--- /dev/null
+++ b/Pepperdash Core/Pepperdash Core/SystemInfo/SystemInfoToSimpl.cs
@@ -0,0 +1,254 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharp.CrestronIO;
+
+namespace PepperDash.Core.SystemInfo
+{
+ ///
+ /// Processor Info to Simpl Class
+ /// Ported from Technics_Core
+ ///
+ public class SystemInfoToSimpl
+ {
+ public event EventHandler BoolChange;
+ public event EventHandler StringChange;
+ public event EventHandler ProcessorChange;
+ public event EventHandler EthernetChange;
+ public event EventHandler ControlSubnetChange;
+ public event EventHandler ProgramChange;
+
+ ///
+ /// Constructor
+ ///
+ public SystemInfoToSimpl()
+ {
+
+ }
+
+ ///
+ /// Get processor info method
+ ///
+ public void GetProcessorInfo()
+ {
+ OnBoolChange(true, 0, SystemInfoConstants.BusyBoolChange);
+
+ var processor = new ProcessorInfo();
+ if (processor.GetInfo() == true)
+ OnProcessorChange(processor.properties, 0, SystemInfoConstants.ProcessorObjectChange);
+
+ OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange);
+ }
+
+ ///
+ /// Get processor uptime method
+ ///
+ public void RefreshProcessorUptime()
+ {
+ var console = new ConsoleHelper();
+
+ try
+ {
+ string response = "";
+ CrestronConsole.SendControlSystemCommand("uptime", ref response);
+ var uptime = console.ParseConsoleResponse(response, "running for", "running for", "\x0D");
+ OnStringChange(uptime, 0, SystemInfoConstants.ProcessorUptimeChange);
+ }
+ catch (Exception e)
+ {
+ var msg = string.Format("RefreshProcessorUptime failed:\r{0}", e);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
+ }
+ }
+
+ ///
+ /// get ethernet info method
+ ///
+ public void GetEthernetInfo()
+ {
+ OnBoolChange(true, 0, SystemInfoConstants.BusyBoolChange);
+
+ var ethernet = new EthernetInfo();
+ if(ethernet.GetInfo() == true)
+ OnEthernetInfoChange(ethernet.properties, 0, SystemInfoConstants.ObjectChange);
+
+ OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange);
+ }
+
+ ///
+ /// Get control subnet ethernet info method
+ ///
+ public void GetControlSubnetInfo()
+ {
+ OnBoolChange(true, 0, SystemInfoConstants.BusyBoolChange);
+
+ var ethernet = new ControlSubnetInfo();
+ if(ethernet.GetInfo() == true)
+ OnControlSubnetInfoChange(ethernet.properties, 0, SystemInfoConstants.ObjectChange);
+
+ OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange);
+ }
+
+ ///
+ /// Get program info by index method
+ ///
+ ///
+ public void GetProgramInfoByIndex(ushort index)
+ {
+ OnBoolChange(true, 0, SystemInfoConstants.BusyBoolChange);
+
+ var program = new ProgramInfo();
+ if (program.GetInfoByIndex(index) == true)
+ OnProgramChange(program.properties, index, SystemInfoConstants.ObjectChange);
+
+ OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange);
+ }
+
+ ///
+ /// Refresh program uptime by index
+ ///
+ ///
+ public void RefreshProgramUptimeByIndex(int index)
+ {
+ var console = new ConsoleHelper();
+
+ try
+ {
+ string response = "";
+ CrestronConsole.SendControlSystemCommand(string.Format("proguptime:{0}", index), ref response);
+ string uptime = console.ParseConsoleResponse(response, "running for", "running for", "\x0D");
+ OnStringChange(uptime, (ushort)index, SystemInfoConstants.ProgramUptimeChange);
+ }
+ catch (Exception e)
+ {
+ var msg = string.Format("RefreshProgramUptimebyIndex({0}) failed:\r{1}", index, e);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
+ }
+ }
+
+ ///
+ /// Send console command
+ ///
+ ///
+ public void SendConsoleCommand(string cmd)
+ {
+ if (string.IsNullOrEmpty(cmd))
+ return;
+
+ string consoleResponse = "";
+ CrestronConsole.SendControlSystemCommand(cmd, ref consoleResponse);
+ if (!string.IsNullOrEmpty(consoleResponse))
+ {
+ if (consoleResponse.Contains("\x0D\x0A"))
+ consoleResponse.Trim('\n');
+ OnStringChange(consoleResponse, 0, SystemInfoConstants.ConsoleResponseChange);
+ }
+ }
+
+ ///
+ /// 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);
+ }
+ }
+
+ ///
+ /// 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);
+ }
+ }
+
+ ///
+ /// Processor change event handler
+ ///
+ ///
+ ///
+ ///
+ protected void OnProcessorChange(ProcessorConfig processor, ushort index, ushort type)
+ {
+ var handler = ProcessorChange;
+ if (handler != null)
+ {
+ var args = new ProcessorChangeEventArgs(processor, type);
+ args.Index = index;
+ ProcessorChange(this, args);
+ }
+ }
+
+ ///
+ /// Ethernet change event handler
+ ///
+ ///
+ ///
+ ///
+ protected void OnEthernetInfoChange(EthernetConfig ethernet, ushort index, ushort type)
+ {
+ var handler = EthernetChange;
+ if (handler != null)
+ {
+ var args = new EthernetChangeEventArgs(ethernet, type);
+ args.Index = index;
+ EthernetChange(this, args);
+ }
+ }
+
+ ///
+ /// Control Subnet change event handler
+ ///
+ ///
+ ///
+ ///
+ protected void OnControlSubnetInfoChange(ControlSubnetConfig ethernet, ushort index, ushort type)
+ {
+ var handler = ControlSubnetChange;
+ if (handler != null)
+ {
+ var args = new ControlSubnetChangeEventArgs(ethernet, type);
+ args.Index = index;
+ ControlSubnetChange(this, args);
+ }
+ }
+
+ ///
+ /// Program change event handler
+ ///
+ ///
+ ///
+ ///
+ protected void OnProgramChange(ProgramConfig program, ushort index, ushort type)
+ {
+ var handler = ProgramChange;
+ if (handler != null)
+ {
+ var args = new ProgramChangeEventArgs(program, type);
+ args.Index = index;
+ ProgramChange(this, args);
+ }
+ }
+ }
+}
\ No newline at end of file