Adds PropertiesConfigBase and adds Summary Help and JsonProperty definitions to config properties classes

This commit is contained in:
Neil Dorin
2020-01-17 14:53:04 -07:00
parent b96ac89195
commit 7c1317f437
6 changed files with 359 additions and 60 deletions

View File

@@ -4,49 +4,201 @@ using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Newtonsoft.Json;
using Newtonsoft.Json.Schema;
namespace PepperDash.Core
{
/// <summary>
///
/// Defines the means of communicating with and controlling a device
/// </summary>
public class ControlPropertiesConfig
public class ControlPropertiesConfig :PropertiesConfigBase
{
/// <summary>
/// The control method for the device
/// </summary>
[JsonProperty("method", Required = Required.Always)]
public eControlMethod Method { get; set; }
/// <summary>
/// The key of the device where the control port can be found
/// </summary>
[JsonProperty("controlPortDevKey")]
public string ControlPortDevKey { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] // In case "null" is present in config on this value
/// <summary>
/// Number of the control port on the parent device specified by ControlPortDevKey
/// </summary>
[JsonProperty("controlPortNumber", NullValueHandling = NullValueHandling.Ignore)] // In case "null" is present in config on this value
public uint ControlPortNumber { get; set; }
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] // In case "null" is present in config on this value
/// <summary>
/// Name of the control port on the parent device specified by ControlPortDevKey
/// </summary>
[JsonProperty("controlPortName", NullValueHandling = NullValueHandling.Ignore)] // In case "null" is present in config on this value
public string ControlPortName { get; set; }
public TcpSshPropertiesConfig TcpSshProperties { get; set; }
/// <summary>
/// Name of the IR file
/// </summary>
[JsonProperty("irFile")]
public string IrFile { get; set; }
//public ComPortConfig ComParams { get; set; }
//[JsonConverter(typeof(ComSpecJsonConverter))]
//public ComPort.ComPortSpec ComParams { get; set; }
/// <summary>
/// IpId of the device
/// </summary>
[JsonProperty("ipid")]
public string IpId { get; set; }
/// <summary>
/// uint representation of the IpId property
/// </summary>
[JsonIgnore]
public uint IpIdInt { get { return Convert.ToUInt32(IpId, 16); } }
/// <summary>
/// Character that delimits the end of a line in multiline repsonses
/// </summary>
[JsonProperty("endofLineChar")]
public char EndOfLineChar { get; set; }
/// <summary>
/// String that delimits the end of a line in multiline responses.
/// Defaults to Environment.NewLine;
/// </summary>
[JsonProperty("endofLineString")]
public string EndOfLineString { get; set; }
/// <summary>
/// Regex pattern that defines the prompt indicating a device is ready for communication
/// </summary>
[JsonProperty("deviceReadyResponsePattern")]
public string DeviceReadyResponsePattern { get; set; }
public ControlPropertiesConfig()
{
SchemaJson = @"
{
'definitions': {},
'$schema': 'http://json-schema.org/draft-07/schema#',
'$id': 'http://example.com/root.json',
'type': 'object',
'title': 'The Root Schema',
'properties': {
'tcpSshProperties': {
'$id': '#/properties/tcpSshProperties',
'type': 'object',
'title': 'The Tcpsshproperties Schema',
'default': null
},
'method': {
'$id': '#/properties/method',
'type': 'string',
'title': 'The Method Schema',
'default': '',
'examples': [
'ssh'
],
'pattern': '^(.*)$'
},
'controlPortDevKey': {
'$id': '#/properties/controlPortDevKey',
'type': 'string',
'title': 'The Controlportdevkey Schema',
'default': '',
'examples': [
'processor'
],
'pattern': '^(.*)$'
},
'controlPortNumber': {
'$id': '#/properties/controlPortNumber',
'type': 'integer',
'title': 'The Controlportnumber Schema',
'default': 0,
'examples': [
1
]
},
'controlPortName': {
'$id': '#/properties/controlPortName',
'type': 'string',
'title': 'The Controlportname Schema',
'default': '',
'examples': [
'hdmi1'
],
'pattern': '^(.*)$'
},
'irFile': {
'$id': '#/properties/irFile',
'type': 'string',
'title': 'The Irfile Schema',
'default': '',
'examples': [
'Comcast Motorola DVR.ir'
],
'pattern': '^(.*)$'
},
'ipid': {
'$id': '#/properties/ipid',
'type': 'string',
'title': 'The Ipid Schema',
'default': '',
'examples': [
'13'
],
'pattern': '^(.*)$'
},
'endOfLineChar': {
'$id': '#/properties/endOfLineChar',
'type': 'string',
'title': 'The Endoflinechar Schema',
'default': '',
'examples': [
'\\x0d'
],
'pattern': '^(.*)$'
},
'endOfLineString': {
'$id': '#/properties/endOfLineString',
'type': 'string',
'title': 'The Endoflinestring Schema',
'default': '',
'examples': [
'\n'
],
'pattern': '^(.*)$'
},
'deviceReadyResponsePattern': {
'$id': '#/properties/deviceReadyResponsePattern',
'type': 'string',
'title': 'The Devicereadyresponsepattern Schema',
'default': '',
'examples': [
'.*>'
],
'pattern': '^(.*)$'
}
},
'required': [
'method',
'controlPortDevKey',
'controlPortNumber',
'controlPortName',
'irFile',
'ipid',
'endOfLineChar',
'endOfLineString',
'deviceReadyResponsePattern'
]
}
";
EndOfLineString = CrestronEnvironment.NewLine;
}
}

View File

@@ -425,56 +425,6 @@ namespace PepperDash.Core
}
}
/// <summary>
/// Configuration properties for TCP/SSH Connections
/// </summary>
public class TcpSshPropertiesConfig
{
/// <summary>
/// Address to connect to
/// </summary>
[JsonProperty(Required = Required.Always)]
public string Address { get; set; }
/// <summary>
/// Port to connect to
/// </summary>
[JsonProperty(Required = Required.Always)]
public int Port { get; set; }
/// <summary>
/// Username credential
/// </summary>
public string Username { get; set; }
/// <summary>
/// Passord credential
/// </summary>
public string Password { get; set; }
/// <summary>
/// Defaults to 32768
/// </summary>
public int BufferSize { get; set; }
/// <summary>
/// Defaults to true
/// </summary>
public bool AutoReconnect { get; set; }
/// <summary>
/// Defaults to 5000ms
/// </summary>
public int AutoReconnectIntervalMs { get; set; }
public TcpSshPropertiesConfig()
{
BufferSize = 32768;
AutoReconnect = true;
AutoReconnectIntervalMs = 5000;
Username = "";
Password = "";
}
}
}

View File

@@ -0,0 +1,147 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Newtonsoft.Json;
namespace PepperDash.Core
{
/// <summary>
/// Configuration properties for TCP/SSH Connections
/// </summary>
[JsonProperty("tcpSshProperties")]
public class TcpSshPropertiesConfig : PropertiesConfigBase
{
/// <summary>
/// Address to connect to
/// </summary>
[JsonProperty("address", Required = Required.Always)]
public string Address { get; set; }
/// <summary>
/// Port to connect to
/// </summary>
[JsonProperty("port", Required = Required.Always)]
public int Port { get; set; }
/// <summary>
/// Username credential. Defaults to ""
/// </summary>
public string Username { get; set; }
/// <summary>
/// Passord credential. Defaults to ""
/// </summary>
public string Password { get; set; }
/// <summary>
/// Buffer size. Defaults to 32768
/// </summary>
public int BufferSize { get; set; }
/// <summary>
/// Indicates if automatic reconnection attemtps should be made.Defaults to true.
/// Uses AutoReconnectIntervalMs to determine frequency of attempts.
/// </summary>
public bool AutoReconnect { get; set; }
/// <summary>
/// Defaults to 5000ms. Requires AutoReconnect to be true.
/// </summary>
public int AutoReconnectIntervalMs { get; set; }
public TcpSshPropertiesConfig()
{
SchemaJson = @"
{
'definitions': {},
'$schema': 'http://json-schema.org/draft-07/schema#',
'$id': 'http://example.com/root.json',
'type': 'object',
'title': 'The Root Schema',
'properties': {
'username': {
'$id': '#/properties/username',
'type': 'string',
'title': 'The Username Schema',
'default': '',
'examples': [
'admin'
],
'pattern': '^(.*)$'
},
'port': {
'$id': '#/properties/port',
'type': 'integer',
'title': 'The Port Schema',
'default': 0,
'examples': [
22
]
},
'address': {
'$id': '#/properties/address',
'type': 'string',
'title': 'The Address Schema',
'default': '',
'examples': [
'10.11.50.135'
],
'pattern': '^(.*)$'
},
'password': {
'$id': '#/properties/password',
'type': 'string',
'title': 'The Password Schema',
'default': '',
'examples': [
'password'
],
'pattern': '^(.*)$'
},
'autoReconnect': {
'$id': '#/properties/autoReconnect',
'type': 'boolean',
'title': 'The Autoreconnect Schema',
'default': false,
'examples': [
true
]
},
'autoReconnectIntervalMs': {
'$id': '#/properties/autoReconnectIntervalMs',
'type': 'integer',
'title': 'The Autoreconnectintervalms Schema',
'default': 0,
'examples': [
2000
]
},
'bufferSize': {
'$id': '#/properties/bufferSize',
'type': 'integer',
'title': 'The Buffersize Schema',
'default': 0,
'examples': [
32768
]
}
},
'required': [
'port',
'address'
]
}
";
BufferSize = 32768;
AutoReconnect = true;
AutoReconnectIntervalMs = 5000;
Username = "";
Password = "";
}
}
}

View File

@@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Newtonsoft.Json;
using Newtonsoft.Json.Schema;
namespace PepperDash.Core
{
/// <summary>
/// Base class for all properties config classes to derive from
/// </summary>
public abstract class PropertiesConfigBase
{
/// <summary>
/// The schema json string for the class
/// </summary>
public string SchemaJson { get; set; }
/// <summary>
/// Constructor
/// </summary>
public PropertiesConfigBase()
{
SchemaJson = null;
}
/// <summary>
/// Parses SchemaJson
/// </summary>
/// <returns>A JsonSchema</returns>
public JsonSchema ParseSchema()
{
if (!string.IsNullOrEmpty(SchemaJson))
{
JsonSchema schema = JsonSchema.Parse(SchemaJson);
return schema;
}
else
return null;
}
}
}

View File

@@ -91,7 +91,8 @@ namespace PepperDash.Core
Level = context.Level;
DoNotLoadOnNextBoot = context.DoNotLoadOnNextBoot;
CrestronConsole.PrintLine(string.Format("Program {0} will not load config after next boot. Use console command go:{0} to load the config manually", InitialParametersClass.ApplicationNumber));
if(DoNotLoadOnNextBoot)
CrestronConsole.PrintLine(string.Format("Program {0} will not load config after next boot. Use console command go:{0} to load the config manually", InitialParametersClass.ApplicationNumber));
try
{

View File

@@ -84,7 +84,9 @@
<Compile Include="Comm\GenericUdpServer.cs" />
<Compile Include="Comm\TcpClientConfigObject.cs" />
<Compile Include="Comm\TcpServerConfigObject.cs" />
<Compile Include="Comm\TcpSshPropertiesConfig.cs" />
<Compile Include="Config\PortalConfigReader.cs" />
<Compile Include="Config\PropertiesConfigBase.cs" />
<Compile Include="CoreInterfaces.cs" />
<Compile Include="EventArgs.cs" />
<Compile Include="GenericRESTfulCommunications\Constants.cs" />