|
|
|
|
@@ -1,13 +1,8 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using Crestron.SimplSharp;
|
|
|
|
|
using Crestron.SimplSharpPro.Diagnostics;
|
|
|
|
|
|
|
|
|
|
using PepperDash.Core;
|
|
|
|
|
using PepperDash.Essentials.Core;
|
|
|
|
|
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
using Newtonsoft.Json.Converters;
|
|
|
|
|
|
|
|
|
|
@@ -19,18 +14,32 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class SystemMonitorController : Device
|
|
|
|
|
{
|
|
|
|
|
private const long UptimePollTime = 300000;
|
|
|
|
|
private CTimer _uptimePollTimer;
|
|
|
|
|
|
|
|
|
|
private string _uptime;
|
|
|
|
|
private string _lastStart;
|
|
|
|
|
|
|
|
|
|
public event EventHandler<EventArgs> SystemMonitorPropertiesChanged;
|
|
|
|
|
|
|
|
|
|
public Dictionary<uint, ProgramStatusFeedbacks> ProgramStatusFeedbackCollection;
|
|
|
|
|
public Dictionary<short, EthernetStatusFeedbacks> EthernetStatusFeedbackCollection;
|
|
|
|
|
|
|
|
|
|
public IntFeedback TimeZoneFeedback { get; set; }
|
|
|
|
|
public StringFeedback TimeZoneTextFeedback { get; set; }
|
|
|
|
|
public IntFeedback TimeZoneFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback TimeZoneTextFeedback { get; protected set; }
|
|
|
|
|
|
|
|
|
|
public StringFeedback IoControllerVersionFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback SnmpVersionFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback BaCnetAppVersionFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback ControllerVersionFeedback { get; protected set; }
|
|
|
|
|
|
|
|
|
|
//new feedbacks. Issue #50
|
|
|
|
|
public StringFeedback SerialNumberFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback ModelFeedback { get; set; }
|
|
|
|
|
|
|
|
|
|
public StringFeedback UptimeFeedback { get; set; }
|
|
|
|
|
public StringFeedback LastStartFeedback { get; set; }
|
|
|
|
|
|
|
|
|
|
public StringFeedback IOControllerVersionFeedback { get; set; }
|
|
|
|
|
public StringFeedback SnmpVersionFeedback { get; set; }
|
|
|
|
|
public StringFeedback BACnetAppVersionFeedback { get; set; }
|
|
|
|
|
public StringFeedback ControllerVersionFeedback { get; set; }
|
|
|
|
|
|
|
|
|
|
public SystemMonitorController(string key)
|
|
|
|
|
: base(key)
|
|
|
|
|
{
|
|
|
|
|
@@ -38,21 +47,18 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
|
|
|
|
|
SystemMonitor.ProgramInitialization.ProgramInitializationUnderUserControl = true;
|
|
|
|
|
|
|
|
|
|
//CrestronConsole.AddNewConsoleCommand(RefreshSystemMonitorData, "RefreshSystemMonitor", "Refreshes System Monitor Feedbacks", ConsoleAccessLevelEnum.AccessOperator);
|
|
|
|
|
TimeZoneFeedback = new IntFeedback(() => SystemMonitor.TimeZoneInformation.TimeZoneNumber);
|
|
|
|
|
TimeZoneTextFeedback = new StringFeedback(() => SystemMonitor.TimeZoneInformation.TimeZoneName);
|
|
|
|
|
|
|
|
|
|
TimeZoneFeedback = new IntFeedback(new Func<int>( () => SystemMonitor.TimeZoneInformation.TimeZoneNumber));
|
|
|
|
|
TimeZoneTextFeedback = new StringFeedback(new Func<string>( () => SystemMonitor.TimeZoneInformation.TimeZoneName));
|
|
|
|
|
IoControllerVersionFeedback = new StringFeedback(() => SystemMonitor.VersionInformation.IOPVersion);
|
|
|
|
|
SnmpVersionFeedback = new StringFeedback(() => SystemMonitor.VersionInformation.SNMPVersion);
|
|
|
|
|
BaCnetAppVersionFeedback = new StringFeedback(() => SystemMonitor.VersionInformation.BACNetVersion);
|
|
|
|
|
ControllerVersionFeedback = new StringFeedback(() => SystemMonitor.VersionInformation.ControlSystemVersion);
|
|
|
|
|
|
|
|
|
|
IOControllerVersionFeedback = new StringFeedback(new Func<string>( () => SystemMonitor.VersionInformation.IOPVersion));
|
|
|
|
|
SnmpVersionFeedback = new StringFeedback(new Func<string>( () => SystemMonitor.VersionInformation.SNMPVersion));
|
|
|
|
|
BACnetAppVersionFeedback = new StringFeedback(new Func<string>( () => SystemMonitor.VersionInformation.BACNetVersion));
|
|
|
|
|
ControllerVersionFeedback = new StringFeedback(new Func<string>( () => SystemMonitor.VersionInformation.ControlSystemVersion));
|
|
|
|
|
|
|
|
|
|
//var status = string.Format("System Monitor Status: \r TimeZone: {0}\rTimeZoneText: {1}\rIOControllerVersion: {2}\rSnmpAppVersionFeedback: {3}\rBACnetAppVersionFeedback: {4}\rControllerVersionFeedback: {5}",
|
|
|
|
|
// SystemMonitor.TimeZoneInformation.TimeZoneNumber, SystemMonitor.TimeZoneInformation.TimeZoneName, SystemMonitor.VersionInformation.IOPVersion, SystemMonitor.VersionInformation.SNMPVersion,
|
|
|
|
|
// SystemMonitor.VersionInformation.BACNetVersion, SystemMonitor.VersionInformation.ControlSystemVersion);
|
|
|
|
|
|
|
|
|
|
//Debug.Console(1, this, status);
|
|
|
|
|
SerialNumberFeedback = new StringFeedback(() => CrestronEnvironment.SystemInfo.SerialNumber);
|
|
|
|
|
ModelFeedback = new StringFeedback(() => InitialParametersClass.ControllerPromptName);
|
|
|
|
|
UptimeFeedback = new StringFeedback(() => _uptime);
|
|
|
|
|
LastStartFeedback = new StringFeedback(()=> _lastStart);
|
|
|
|
|
|
|
|
|
|
ProgramStatusFeedbackCollection = new Dictionary<uint, ProgramStatusFeedbacks>();
|
|
|
|
|
|
|
|
|
|
@@ -62,43 +68,132 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
ProgramStatusFeedbackCollection.Add(prog.Number, program);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SystemMonitor.ProgramChange += new ProgramStateChangeEventHandler(SystemMonitor_ProgramChange);
|
|
|
|
|
SystemMonitor.TimeZoneInformation.TimeZoneChange += new TimeZoneChangeEventHandler(TimeZoneInformation_TimeZoneChange);
|
|
|
|
|
CreateEthernetStatusFeedbacks();
|
|
|
|
|
UpdateEthernetStatusFeeedbacks();
|
|
|
|
|
|
|
|
|
|
_uptimePollTimer = new CTimer(PollUptime,null,0, UptimePollTime);
|
|
|
|
|
|
|
|
|
|
SystemMonitor.ProgramChange += SystemMonitor_ProgramChange;
|
|
|
|
|
SystemMonitor.TimeZoneInformation.TimeZoneChange += TimeZoneInformation_TimeZoneChange;
|
|
|
|
|
CrestronEnvironment.EthernetEventHandler += CrestronEnvironmentOnEthernetEventHandler;
|
|
|
|
|
CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironmentOnProgramStatusEventHandler;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void CrestronEnvironmentOnProgramStatusEventHandler(eProgramStatusEventType programEventType)
|
|
|
|
|
{
|
|
|
|
|
if (programEventType != eProgramStatusEventType.Stopping) return;
|
|
|
|
|
|
|
|
|
|
_uptimePollTimer.Stop();
|
|
|
|
|
_uptimePollTimer.Dispose();
|
|
|
|
|
_uptimePollTimer = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void PollUptime(object obj)
|
|
|
|
|
{
|
|
|
|
|
var consoleResponse = string.Empty;
|
|
|
|
|
|
|
|
|
|
CrestronConsole.SendControlSystemCommand("uptime", ref consoleResponse);
|
|
|
|
|
|
|
|
|
|
ParseUptime(consoleResponse);
|
|
|
|
|
|
|
|
|
|
UptimeFeedback.FireUpdate();
|
|
|
|
|
LastStartFeedback.FireUpdate();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void ParseUptime(string response)
|
|
|
|
|
{
|
|
|
|
|
var splitString = response.Trim().Split('\r', '\n');
|
|
|
|
|
|
|
|
|
|
var lastStartRaw = splitString[2];
|
|
|
|
|
var lastStartIndex = lastStartRaw.IndexOf(':');
|
|
|
|
|
|
|
|
|
|
_lastStart = lastStartRaw.Substring(lastStartIndex + 1).Trim();
|
|
|
|
|
|
|
|
|
|
var uptimeRaw = splitString[0];
|
|
|
|
|
|
|
|
|
|
var forIndex = uptimeRaw.IndexOf("for", StringComparison.Ordinal);
|
|
|
|
|
|
|
|
|
|
//4 => "for " to get what's on the right
|
|
|
|
|
_uptime = uptimeRaw.Substring(forIndex + 4);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void CrestronEnvironmentOnEthernetEventHandler(EthernetEventArgs ethernetEventArgs)
|
|
|
|
|
{
|
|
|
|
|
if (ethernetEventArgs.EthernetEventType != eEthernetEventType.LinkUp) return;
|
|
|
|
|
|
|
|
|
|
foreach (var fb in EthernetStatusFeedbackCollection)
|
|
|
|
|
{
|
|
|
|
|
fb.Value.UpdateEthernetStatus();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void CreateEthernetStatusFeedbacks()
|
|
|
|
|
{
|
|
|
|
|
EthernetStatusFeedbackCollection = new Dictionary<short, EthernetStatusFeedbacks>();
|
|
|
|
|
|
|
|
|
|
Debug.Console(2, "Creating {0} EthernetStatusFeedbacks", InitialParametersClass.NumberOfEthernetInterfaces);
|
|
|
|
|
|
|
|
|
|
for (short i = 0; i < InitialParametersClass.NumberOfEthernetInterfaces; i++)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2, "Creating EthernetStatusFeedback for Interface {0}", i);
|
|
|
|
|
var ethernetInterface = new EthernetStatusFeedbacks(i);
|
|
|
|
|
EthernetStatusFeedbackCollection.Add(i, ethernetInterface);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateEthernetStatusFeeedbacks()
|
|
|
|
|
{
|
|
|
|
|
foreach (var iface in EthernetStatusFeedbackCollection)
|
|
|
|
|
{
|
|
|
|
|
iface.Value.CurrentIpAddressFeedback.FireUpdate();
|
|
|
|
|
iface.Value.CurrentSubnetMaskFeedback.FireUpdate();
|
|
|
|
|
iface.Value.CurrentDefaultGatewayFeedback.FireUpdate();
|
|
|
|
|
iface.Value.StaticIpAddressFeedback.FireUpdate();
|
|
|
|
|
iface.Value.StaticSubnetMaskFeedback.FireUpdate();
|
|
|
|
|
iface.Value.StaticDefaultGatewayFeedback.FireUpdate();
|
|
|
|
|
iface.Value.HostNameFeedback.FireUpdate();
|
|
|
|
|
iface.Value.DnsServerFeedback.FireUpdate();
|
|
|
|
|
iface.Value.DomainFeedback.FireUpdate();
|
|
|
|
|
iface.Value.DhcpStatusFeedback.FireUpdate();
|
|
|
|
|
iface.Value.MacAddressFeedback.FireUpdate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets data in separate thread
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="command"></param>
|
|
|
|
|
void RefreshSystemMonitorData(string command)
|
|
|
|
|
private void RefreshSystemMonitorData()
|
|
|
|
|
{
|
|
|
|
|
// this takes a while, launch a new thread
|
|
|
|
|
CrestronInvoke.BeginInvoke((o) =>
|
|
|
|
|
{
|
|
|
|
|
TimeZoneFeedback.FireUpdate();
|
|
|
|
|
TimeZoneTextFeedback.FireUpdate();
|
|
|
|
|
IOControllerVersionFeedback.FireUpdate();
|
|
|
|
|
SnmpVersionFeedback.FireUpdate();
|
|
|
|
|
BACnetAppVersionFeedback.FireUpdate();
|
|
|
|
|
ControllerVersionFeedback.FireUpdate();
|
|
|
|
|
|
|
|
|
|
OnSystemMonitorPropertiesChanged();
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
CrestronInvoke.BeginInvoke(UpdateFeedback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OnSystemMonitorPropertiesChanged()
|
|
|
|
|
private void UpdateFeedback(object o)
|
|
|
|
|
{
|
|
|
|
|
TimeZoneFeedback.FireUpdate();
|
|
|
|
|
TimeZoneTextFeedback.FireUpdate();
|
|
|
|
|
IoControllerVersionFeedback.FireUpdate();
|
|
|
|
|
SnmpVersionFeedback.FireUpdate();
|
|
|
|
|
BaCnetAppVersionFeedback.FireUpdate();
|
|
|
|
|
ControllerVersionFeedback.FireUpdate();
|
|
|
|
|
SerialNumberFeedback.FireUpdate();
|
|
|
|
|
ModelFeedback.FireUpdate();
|
|
|
|
|
|
|
|
|
|
OnSystemMonitorPropertiesChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnSystemMonitorPropertiesChanged()
|
|
|
|
|
{
|
|
|
|
|
var handler = SystemMonitorPropertiesChanged;
|
|
|
|
|
if (handler != null)
|
|
|
|
|
{
|
|
|
|
|
handler(this, new EventArgs());
|
|
|
|
|
handler(this, new EventArgs());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool CustomActivate()
|
|
|
|
|
{
|
|
|
|
|
RefreshSystemMonitorData(null);
|
|
|
|
|
RefreshSystemMonitorData();
|
|
|
|
|
|
|
|
|
|
return base.CustomActivate();
|
|
|
|
|
}
|
|
|
|
|
@@ -114,46 +209,41 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="sender"></param>
|
|
|
|
|
/// <param name="args"></param>
|
|
|
|
|
void SystemMonitor_ProgramChange(Program sender, ProgramEventArgs args)
|
|
|
|
|
private void SystemMonitor_ProgramChange(Program sender, ProgramEventArgs args)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2, this, "Program Change Detected for slot: {0}", sender.Number);
|
|
|
|
|
Debug.Console(2, this, "Event Type: {0}", args.EventType);
|
|
|
|
|
|
|
|
|
|
var program = ProgramStatusFeedbackCollection[sender.Number];
|
|
|
|
|
|
|
|
|
|
if (args.EventType == eProgramChangeEventType.OperatingState)
|
|
|
|
|
switch (args.EventType)
|
|
|
|
|
{
|
|
|
|
|
program.ProgramStartedFeedback.FireUpdate();
|
|
|
|
|
program.ProgramStoppedFeedback.FireUpdate();
|
|
|
|
|
|
|
|
|
|
program.ProgramInfo.OperatingState = args.OperatingState;
|
|
|
|
|
|
|
|
|
|
//program.GetProgramInfo();
|
|
|
|
|
|
|
|
|
|
if (args.OperatingState == eProgramOperatingState.Start)
|
|
|
|
|
program.GetProgramInfo();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
program.AggregatedProgramInfoFeedback.FireUpdate();
|
|
|
|
|
program.OnProgramInfoChanged();
|
|
|
|
|
}
|
|
|
|
|
case eProgramChangeEventType.OperatingState:
|
|
|
|
|
program.ProgramStartedFeedback.FireUpdate();
|
|
|
|
|
program.ProgramStoppedFeedback.FireUpdate();
|
|
|
|
|
program.ProgramInfo.OperatingState = args.OperatingState;
|
|
|
|
|
if (args.OperatingState == eProgramOperatingState.Start)
|
|
|
|
|
program.GetProgramInfo();
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
program.AggregatedProgramInfoFeedback.FireUpdate();
|
|
|
|
|
program.OnProgramInfoChanged();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case eProgramChangeEventType.RegistrationState:
|
|
|
|
|
program.ProgramRegisteredFeedback.FireUpdate();
|
|
|
|
|
program.ProgramUnregisteredFeedback.FireUpdate();
|
|
|
|
|
program.ProgramInfo.RegistrationState = args.RegistrationState;
|
|
|
|
|
program.GetProgramInfo();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else if (args.EventType == eProgramChangeEventType.RegistrationState)
|
|
|
|
|
{
|
|
|
|
|
program.ProgramRegisteredFeedback.FireUpdate();
|
|
|
|
|
program.ProgramUnregisteredFeedback.FireUpdate();
|
|
|
|
|
|
|
|
|
|
program.ProgramInfo.RegistrationState = args.RegistrationState;
|
|
|
|
|
|
|
|
|
|
program.GetProgramInfo();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Responds to time zone changes and updates the appropriate feedbacks
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="args"></param>
|
|
|
|
|
void TimeZoneInformation_TimeZoneChange(TimeZoneEventArgs args)
|
|
|
|
|
private void TimeZoneInformation_TimeZoneChange(TimeZoneEventArgs args)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2, this, "Time Zone Change Detected.");
|
|
|
|
|
TimeZoneFeedback.FireUpdate();
|
|
|
|
|
@@ -162,6 +252,121 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
OnSystemMonitorPropertiesChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class EthernetStatusFeedbacks
|
|
|
|
|
{
|
|
|
|
|
public StringFeedback HostNameFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback DnsServerFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback DomainFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback MacAddressFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback DhcpStatusFeedback { get; protected set; }
|
|
|
|
|
|
|
|
|
|
public StringFeedback CurrentIpAddressFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback CurrentSubnetMaskFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback CurrentDefaultGatewayFeedback { get; protected set; }
|
|
|
|
|
|
|
|
|
|
public StringFeedback StaticIpAddressFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback StaticSubnetMaskFeedback { get; protected set; }
|
|
|
|
|
public StringFeedback StaticDefaultGatewayFeedback { get; protected set; }
|
|
|
|
|
|
|
|
|
|
public EthernetStatusFeedbacks(short adapterIndex)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2, "Ethernet Information for interface {0}", adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} Hostname: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_HOSTNAME, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} Current IP Address: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} Current Subnet Mask: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_MASK, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} Current Router: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_ROUTER, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} Static IP Address: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_STATIC_IPADDRESS, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} Static Subnet Mask: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_STATIC_IPMASK, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} Static Router: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_STATIC_ROUTER, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} DNS Servers: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_DNS_SERVER, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} DHCP State: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_DHCP_STATE, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} Domain Name: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_DOMAIN_NAME, adapterIndex), adapterIndex);
|
|
|
|
|
Debug.Console(2, "Adapter Index: {1} MAC Address: {0}", CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_MAC_ADDRESS, adapterIndex), adapterIndex);
|
|
|
|
|
HostNameFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_HOSTNAME, adapterIndex));
|
|
|
|
|
|
|
|
|
|
CurrentIpAddressFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, adapterIndex));
|
|
|
|
|
CurrentDefaultGatewayFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_ROUTER, adapterIndex));
|
|
|
|
|
CurrentSubnetMaskFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_MASK, adapterIndex));
|
|
|
|
|
StaticIpAddressFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, adapterIndex));
|
|
|
|
|
StaticDefaultGatewayFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_ROUTER, adapterIndex));
|
|
|
|
|
StaticSubnetMaskFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_MASK, adapterIndex));
|
|
|
|
|
DomainFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_DOMAIN_NAME, adapterIndex));
|
|
|
|
|
DnsServerFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_DNS_SERVER, adapterIndex));
|
|
|
|
|
MacAddressFeedback =
|
|
|
|
|
new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_MAC_ADDRESS, adapterIndex));
|
|
|
|
|
|
|
|
|
|
DhcpStatusFeedback = new StringFeedback(
|
|
|
|
|
() =>
|
|
|
|
|
CrestronEthernetHelper.GetEthernetParameter(
|
|
|
|
|
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_DHCP_STATE, adapterIndex));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void UpdateEthernetStatus()
|
|
|
|
|
{
|
|
|
|
|
HostNameFeedback.FireUpdate();
|
|
|
|
|
CurrentIpAddressFeedback.FireUpdate();
|
|
|
|
|
CurrentSubnetMaskFeedback.FireUpdate();
|
|
|
|
|
CurrentDefaultGatewayFeedback.FireUpdate();
|
|
|
|
|
StaticIpAddressFeedback.FireUpdate();
|
|
|
|
|
StaticSubnetMaskFeedback.FireUpdate();
|
|
|
|
|
StaticDefaultGatewayFeedback.FireUpdate();
|
|
|
|
|
DomainFeedback.FireUpdate();
|
|
|
|
|
DnsServerFeedback.FireUpdate();
|
|
|
|
|
MacAddressFeedback.FireUpdate();
|
|
|
|
|
DhcpStatusFeedback.FireUpdate();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class ProgramStatusFeedbacks
|
|
|
|
|
{
|
|
|
|
|
@@ -192,17 +397,19 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
ProgramInfo.OperatingState = Program.OperatingState;
|
|
|
|
|
ProgramInfo.RegistrationState = Program.RegistrationState;
|
|
|
|
|
|
|
|
|
|
ProgramStartedFeedback = new BoolFeedback(new Func<bool>( () => Program.OperatingState == eProgramOperatingState.Start));
|
|
|
|
|
ProgramStoppedFeedback = new BoolFeedback(new Func<bool>( () => Program.OperatingState == eProgramOperatingState.Stop));
|
|
|
|
|
ProgramRegisteredFeedback = new BoolFeedback(new Func<bool>( () => Program.RegistrationState == eProgramRegistrationState.Register));
|
|
|
|
|
ProgramUnregisteredFeedback = new BoolFeedback(new Func<bool>( () => Program.RegistrationState == eProgramRegistrationState.Unregister));
|
|
|
|
|
ProgramStartedFeedback = new BoolFeedback(() => Program.OperatingState == eProgramOperatingState.Start);
|
|
|
|
|
ProgramStoppedFeedback = new BoolFeedback(() => Program.OperatingState == eProgramOperatingState.Stop);
|
|
|
|
|
ProgramRegisteredFeedback =
|
|
|
|
|
new BoolFeedback(() => Program.RegistrationState == eProgramRegistrationState.Register);
|
|
|
|
|
ProgramUnregisteredFeedback =
|
|
|
|
|
new BoolFeedback(() => Program.RegistrationState == eProgramRegistrationState.Unregister);
|
|
|
|
|
|
|
|
|
|
ProgramNameFeedback = new StringFeedback(new Func<string>(() => ProgramInfo.ProgramFile));
|
|
|
|
|
ProgramCompileTimeFeedback = new StringFeedback(new Func<string>(() => ProgramInfo.CompileTime));
|
|
|
|
|
CrestronDataBaseVersionFeedback = new StringFeedback(new Func<string>(() => ProgramInfo.CrestronDB));
|
|
|
|
|
EnvironmentVersionFeedback = new StringFeedback(new Func<string>(() => ProgramInfo.Environment));
|
|
|
|
|
ProgramNameFeedback = new StringFeedback(() => ProgramInfo.ProgramFile);
|
|
|
|
|
ProgramCompileTimeFeedback = new StringFeedback(() => ProgramInfo.CompileTime);
|
|
|
|
|
CrestronDataBaseVersionFeedback = new StringFeedback(() => ProgramInfo.CrestronDb);
|
|
|
|
|
EnvironmentVersionFeedback = new StringFeedback(() => ProgramInfo.Environment);
|
|
|
|
|
|
|
|
|
|
AggregatedProgramInfoFeedback = new StringFeedback(new Func<string>(() => JsonConvert.SerializeObject(ProgramInfo)));
|
|
|
|
|
AggregatedProgramInfoFeedback = new StringFeedback(() => JsonConvert.SerializeObject(ProgramInfo));
|
|
|
|
|
|
|
|
|
|
GetProgramInfo();
|
|
|
|
|
}
|
|
|
|
|
@@ -212,74 +419,99 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
/// </summary>
|
|
|
|
|
public void GetProgramInfo()
|
|
|
|
|
{
|
|
|
|
|
CrestronInvoke.BeginInvoke((o) =>
|
|
|
|
|
CrestronInvoke.BeginInvoke(GetProgramInfo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void GetProgramInfo(object o)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2, "Attempting to get program info for slot: {0}", Program.Number);
|
|
|
|
|
|
|
|
|
|
string response = null;
|
|
|
|
|
|
|
|
|
|
if (Program.RegistrationState == eProgramRegistrationState.Unregister || Program.OperatingState == eProgramOperatingState.Stop)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2, "Attempting to get program info for slot: {0}", Program.Number);
|
|
|
|
|
Debug.Console(2, "Program {0} not registered. Setting default values for program information.",
|
|
|
|
|
Program.Number);
|
|
|
|
|
|
|
|
|
|
string response = null;
|
|
|
|
|
|
|
|
|
|
var success = CrestronConsole.SendControlSystemCommand(string.Format("progcomments:{0}", Program.Number), ref response);
|
|
|
|
|
|
|
|
|
|
if (success)
|
|
|
|
|
ProgramInfo = new ProgramInfo(Program.Number)
|
|
|
|
|
{
|
|
|
|
|
//Debug.Console(2, "Progcomments Response: \r{0}", response);
|
|
|
|
|
OperatingState = Program.OperatingState,
|
|
|
|
|
RegistrationState = Program.RegistrationState
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (!response.ToLower().Contains("bad or incomplete"))
|
|
|
|
|
{
|
|
|
|
|
// Shared properteis
|
|
|
|
|
ProgramInfo.ProgramFile = ParseConsoleData(response, "Program File", ": ", "\n");
|
|
|
|
|
ProgramInfo.CompilerRevision = ParseConsoleData(response, "Compiler Rev", ": ", "\n");
|
|
|
|
|
ProgramInfo.CompileTime = ParseConsoleData(response, "Compiled On", ": ", "\n");
|
|
|
|
|
ProgramInfo.Include4Dat = ParseConsoleData(response, "Include4.dat", ": ", "\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var success = CrestronConsole.SendControlSystemCommand(
|
|
|
|
|
string.Format("progcomments:{0}", Program.Number), ref response);
|
|
|
|
|
|
|
|
|
|
if (!success)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2, "Progcomments Attempt Unsuccessful for slot: {0}", Program.Number);
|
|
|
|
|
UpdateFeedbacks();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ProgramInfo.ProgramFile.Contains(".dll"))
|
|
|
|
|
{
|
|
|
|
|
// SSP Program
|
|
|
|
|
ProgramInfo.FriendlyName = ParseConsoleData(response, "Friendly Name", ": ", "\n");
|
|
|
|
|
ProgramInfo.ApplicationName = ParseConsoleData(response, "Application Name", ": ", "\n");
|
|
|
|
|
ProgramInfo.ProgramTool = ParseConsoleData(response, "Program Tool", ": ", "\n");
|
|
|
|
|
ProgramInfo.MinFirmwareVersion = ParseConsoleData(response, "Min Firmware Version", ": ", "\n");
|
|
|
|
|
ProgramInfo.PlugInVersion = ParseConsoleData(response, "PlugInVersion", ": ", "\n");
|
|
|
|
|
}
|
|
|
|
|
else if (ProgramInfo.ProgramFile.Contains(".smw"))
|
|
|
|
|
{
|
|
|
|
|
// SIMPL Windows Program
|
|
|
|
|
ProgramInfo.FriendlyName = ParseConsoleData(response, "Friendly Name", ":", "\n");
|
|
|
|
|
ProgramInfo.SystemName = ParseConsoleData(response, "System Name", ": ", "\n");
|
|
|
|
|
ProgramInfo.CrestronDB = ParseConsoleData(response, "CrestronDB", ": ", "\n");
|
|
|
|
|
ProgramInfo.Environment = ParseConsoleData(response, "Source Env", ": ", "\n");
|
|
|
|
|
ProgramInfo.Programmer = ParseConsoleData(response, "Programmer", ": ", "\n");
|
|
|
|
|
if (response.ToLower().Contains("bad or incomplete"))
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2,
|
|
|
|
|
"Program in slot {0} not running. Setting default ProgramInfo for slot: {0}",
|
|
|
|
|
Program.Number);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
//Debug.Console(2, "ProgramInfo: \r{0}", JsonConvert.SerializeObject(ProgramInfo));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2, "Bad or incomplete console command response. Initializing ProgramInfo for slot: {0}", Program.Number);
|
|
|
|
|
|
|
|
|
|
// Assume no valid program info. Constructing a new object will wipe all properties
|
|
|
|
|
ProgramInfo = new ProgramInfo(Program.Number);
|
|
|
|
|
|
|
|
|
|
ProgramInfo.OperatingState = Program.OperatingState;
|
|
|
|
|
ProgramInfo.RegistrationState = Program.RegistrationState;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
// Assume no valid program info. Constructing a new object will wipe all properties
|
|
|
|
|
ProgramInfo = new ProgramInfo(Program.Number)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(2, "Progcomments Attempt Unsuccessful for slot: {0}", Program.Number);
|
|
|
|
|
}
|
|
|
|
|
OperatingState = Program.OperatingState,
|
|
|
|
|
RegistrationState = Program.RegistrationState
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ProgramNameFeedback.FireUpdate();
|
|
|
|
|
ProgramCompileTimeFeedback.FireUpdate();
|
|
|
|
|
CrestronDataBaseVersionFeedback.FireUpdate();
|
|
|
|
|
EnvironmentVersionFeedback.FireUpdate();
|
|
|
|
|
UpdateFeedbacks();
|
|
|
|
|
|
|
|
|
|
AggregatedProgramInfoFeedback.FireUpdate();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OnProgramInfoChanged();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Shared properteis
|
|
|
|
|
ProgramInfo.ProgramFile = ParseConsoleData(response, "Program File", ": ", "\n");
|
|
|
|
|
ProgramInfo.CompilerRevision = ParseConsoleData(response, "Compiler Rev", ": ", "\n");
|
|
|
|
|
ProgramInfo.CompileTime = ParseConsoleData(response, "Compiled On", ": ", "\n");
|
|
|
|
|
ProgramInfo.Include4Dat = ParseConsoleData(response, "Include4.dat", ": ", "\n");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ProgramInfo.ProgramFile.Contains(".dll"))
|
|
|
|
|
{
|
|
|
|
|
// SSP Program
|
|
|
|
|
ProgramInfo.FriendlyName = ParseConsoleData(response, "Friendly Name", ": ", "\n");
|
|
|
|
|
ProgramInfo.ApplicationName = ParseConsoleData(response, "Application Name", ": ", "\n");
|
|
|
|
|
ProgramInfo.ProgramTool = ParseConsoleData(response, "Program Tool", ": ", "\n");
|
|
|
|
|
ProgramInfo.MinFirmwareVersion = ParseConsoleData(response, "Min Firmware Version", ": ",
|
|
|
|
|
"\n");
|
|
|
|
|
ProgramInfo.PlugInVersion = ParseConsoleData(response, "PlugInVersion", ": ", "\n");
|
|
|
|
|
}
|
|
|
|
|
else if (ProgramInfo.ProgramFile.Contains(".smw"))
|
|
|
|
|
{
|
|
|
|
|
// SIMPL Windows Program
|
|
|
|
|
ProgramInfo.FriendlyName = ParseConsoleData(response, "Friendly Name", ":", "\n");
|
|
|
|
|
ProgramInfo.SystemName = ParseConsoleData(response, "System Name", ": ", "\n");
|
|
|
|
|
ProgramInfo.CrestronDb = ParseConsoleData(response, "CrestronDB", ": ", "\n");
|
|
|
|
|
ProgramInfo.Environment = ParseConsoleData(response, "Source Env", ": ", "\n");
|
|
|
|
|
ProgramInfo.Programmer = ParseConsoleData(response, "Programmer", ": ", "\n");
|
|
|
|
|
}
|
|
|
|
|
Debug.Console(2, "Program info for slot {0} successfully updated", Program.Number);
|
|
|
|
|
|
|
|
|
|
UpdateFeedbacks();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void UpdateFeedbacks()
|
|
|
|
|
{
|
|
|
|
|
ProgramNameFeedback.FireUpdate();
|
|
|
|
|
ProgramCompileTimeFeedback.FireUpdate();
|
|
|
|
|
CrestronDataBaseVersionFeedback.FireUpdate();
|
|
|
|
|
EnvironmentVersionFeedback.FireUpdate();
|
|
|
|
|
|
|
|
|
|
AggregatedProgramInfoFeedback.FireUpdate();
|
|
|
|
|
|
|
|
|
|
OnProgramInfoChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void OnProgramInfoChanged()
|
|
|
|
|
@@ -294,30 +526,28 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
|
|
|
|
|
private string ParseConsoleData(string data, string line, string startString, string endString)
|
|
|
|
|
{
|
|
|
|
|
string outputData = "";
|
|
|
|
|
var outputData = "";
|
|
|
|
|
|
|
|
|
|
if (data.Length > 0)
|
|
|
|
|
if (data.Length <= 0) return outputData;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
//Debug.Console(2, "ParseConsoleData Data: {0}, Line {1}, startStirng {2}, endString {3}", data, line, startString, endString);
|
|
|
|
|
var linePosition = data.IndexOf(line);
|
|
|
|
|
var startPosition = data.IndexOf(startString, linePosition) + startString.Length;
|
|
|
|
|
var endPosition = data.IndexOf(endString, startPosition);
|
|
|
|
|
outputData = data.Substring(startPosition, endPosition - startPosition).Trim();
|
|
|
|
|
//Debug.Console(2, "ParseConsoleData Return: {0}", outputData);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(1, "Error Parsing Console Data:\r{0}", e);
|
|
|
|
|
}
|
|
|
|
|
//Debug.Console(2, "ParseConsoleData Data: {0}, Line {1}, startStirng {2}, endString {3}", data, line, startString, endString);
|
|
|
|
|
var linePosition = data.IndexOf(line, StringComparison.Ordinal);
|
|
|
|
|
var startPosition = data.IndexOf(startString, linePosition, StringComparison.Ordinal) +
|
|
|
|
|
startString.Length;
|
|
|
|
|
var endPosition = data.IndexOf(endString, startPosition, StringComparison.Ordinal);
|
|
|
|
|
outputData = data.Substring(startPosition, endPosition - startPosition).Trim();
|
|
|
|
|
//Debug.Console(2, "ParseConsoleData Return: {0}", outputData);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
Debug.Console(1, "Error Parsing Console Data:\r{0}", e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return outputData;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
@@ -330,32 +560,39 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
[JsonProperty("programNumber")]
|
|
|
|
|
public uint ProgramNumber { get; private set; }
|
|
|
|
|
|
|
|
|
|
[JsonConverter(typeof(StringEnumConverter))]
|
|
|
|
|
[JsonConverter(typeof (StringEnumConverter))]
|
|
|
|
|
[JsonProperty("operatingState")]
|
|
|
|
|
public eProgramOperatingState OperatingState { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonConverter(typeof(StringEnumConverter))]
|
|
|
|
|
[JsonConverter(typeof (StringEnumConverter))]
|
|
|
|
|
[JsonProperty("registrationState")]
|
|
|
|
|
public eProgramRegistrationState RegistrationState { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("programFile")]
|
|
|
|
|
public string ProgramFile { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("friendlyName")]
|
|
|
|
|
public string FriendlyName { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("compilerRevision")]
|
|
|
|
|
public string CompilerRevision { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("compileTime")]
|
|
|
|
|
public string CompileTime { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("include4Dat")]
|
|
|
|
|
public string Include4Dat { get; set; }
|
|
|
|
|
|
|
|
|
|
// SIMPL Windows properties
|
|
|
|
|
[JsonProperty("systemName")]
|
|
|
|
|
public string SystemName { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("crestronDb")]
|
|
|
|
|
public string CrestronDB { get; set; }
|
|
|
|
|
public string CrestronDb { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("environment")]
|
|
|
|
|
public string Environment { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("programmer")]
|
|
|
|
|
public string Programmer { get; set; }
|
|
|
|
|
|
|
|
|
|
@@ -363,10 +600,13 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
// SSP Properties
|
|
|
|
|
[JsonProperty("applicationName")]
|
|
|
|
|
public string ApplicationName { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("programTool")]
|
|
|
|
|
public string ProgramTool { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("minFirmwareVersion")]
|
|
|
|
|
public string MinFirmwareVersion { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonProperty("plugInVersion")]
|
|
|
|
|
public string PlugInVersion { get; set; }
|
|
|
|
|
|
|
|
|
|
@@ -381,7 +621,7 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|
|
|
|
Include4Dat = "";
|
|
|
|
|
|
|
|
|
|
SystemName = "";
|
|
|
|
|
CrestronDB = "";
|
|
|
|
|
CrestronDb = "";
|
|
|
|
|
Environment = "";
|
|
|
|
|
Programmer = "";
|
|
|
|
|
|
|
|
|
|
|