adds protections for devices doing things they shouldn't...

This commit is contained in:
Andrew Welker
2020-05-06 09:51:25 -06:00
parent 966a6c194f
commit fd7f708a83
2 changed files with 79 additions and 111 deletions

View File

@@ -26,6 +26,8 @@ namespace PepperDash.Essentials
{
HttpLogoServer LogoServer;
private CTimer _startTimer;
private const long StartupTime = 500;
public ControlSystem()
: base()
@@ -39,6 +41,11 @@ namespace PepperDash.Essentials
/// Entry point for the program
/// </summary>
public override void InitializeSystem()
{
_startTimer = new CTimer(StartSystem,StartupTime);
}
private void StartSystem(object obj)
{
DeterminePlatform();

View File

@@ -5,10 +5,6 @@ using System.Text;
using System.Text.RegularExpressions;
using Crestron.SimplSharp;
using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DeviceSupport;
using Crestron.SimplSharpPro.EthernetCommunication;
using Crestron.SimplSharpPro.UI;
using Crestron.SimplSharp.Reflection;
using PepperDash.Core;
@@ -18,18 +14,22 @@ namespace PepperDash.Essentials.Core
public static class DeviceManager
{
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
//public static List<Device> Devices { get { return _Devices; } }
//static List<Device> _Devices = new List<Device>();
static Dictionary<string, IKeyed> Devices = new Dictionary<string, IKeyed>(StringComparer.OrdinalIgnoreCase);
static readonly Dictionary<string, IKeyed> Devices = new Dictionary<string, IKeyed>(StringComparer.OrdinalIgnoreCase);
/// <summary>
/// Returns a copy of all the devices in a list
/// </summary>
public static List<IKeyed> AllDevices { get { return new List<IKeyed>(Devices.Values); } }
public static bool AddDeviceEnabled;
public static void Initialize(CrestronControlSystem cs)
{
AddDeviceEnabled = true;
CrestronConsole.AddNewConsoleCommand(ListDeviceCommStatuses, "devcommstatus", "Lists the communication status of all devices",
ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(ListDeviceFeedbacks, "devfb", "Lists current feedbacks",
@@ -38,18 +38,9 @@ namespace PepperDash.Essentials.Core
ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(DeviceJsonApi.DoDeviceActionWithJson, "devjson", "",
ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(s =>
{
CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetProperties(s));
}, "devprops", "", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(s =>
{
CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetMethods(s));
}, "devmethods", "", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(s =>
{
CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetApiMethods(s));
}, "apimethods", "", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetProperties(s)), "devprops", "", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetMethods(s)), "devmethods", "", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetApiMethods(s)), "apimethods", "", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(SimulateComReceiveOnDevice, "devsimreceive",
"Simulates incoming data on a com device", ConsoleAccessLevelEnum.AccessOperator);
}
@@ -62,6 +53,7 @@ namespace PepperDash.Essentials.Core
try
{
DeviceCriticalSection.Enter();
AddDeviceEnabled = false;
// PreActivate all devices
foreach (var d in Devices.Values)
{
@@ -118,10 +110,9 @@ namespace PepperDash.Essentials.Core
try
{
DeviceCriticalSection.Enter();
foreach (var d in Devices.Values)
foreach (var d in Devices.Values.OfType<Device>())
{
if (d is Device)
(d as Device).Deactivate();
d.Deactivate();
}
}
finally
@@ -151,11 +142,8 @@ namespace PepperDash.Essentials.Core
// }
//}
static void ListDevices(string s)
private static void ListDevices(string s)
{
try
{
DeviceCriticalSection.Enter();
Debug.Console(0, "{0} Devices registered with Device Manager:", Devices.Count);
var sorted = Devices.Values.ToList();
sorted.Sort((a, b) => a.Key.CompareTo(b.Key));
@@ -166,14 +154,9 @@ namespace PepperDash.Essentials.Core
Debug.Console(0, " [{0}] {1}", d.Key, name);
}
}
finally {DeviceCriticalSection.Leave();}
}
static void ListDeviceFeedbacks(string devKey)
private static void ListDeviceFeedbacks(string devKey)
{
try
{
DeviceCriticalSection.Enter();
var dev = GetDeviceForKey(devKey);
if (dev == null)
{
@@ -188,11 +171,6 @@ namespace PepperDash.Essentials.Core
}
statusDev.DumpFeedbacksToConsole(true);
}
finally
{
DeviceCriticalSection.Leave();
}
}
//static void ListDeviceCommands(string devKey)
//{
@@ -205,26 +183,16 @@ namespace PepperDash.Essentials.Core
// Debug.Console(0, "This needs to be reworked. Stay tuned.", devKey);
//}
static void ListDeviceCommStatuses(string input)
private static void ListDeviceCommStatuses(string input)
{
try
{
DeviceCriticalSection.Enter();
var sb = new StringBuilder();
foreach (var dev in Devices.Values)
foreach (var dev in Devices.Values.OfType<ICommunicationMonitor>())
{
if (dev is ICommunicationMonitor)
sb.Append(string.Format("{0}: {1}\r", dev.Key,
(dev as ICommunicationMonitor).CommunicationMonitor.Status));
sb.Append(string.Format("{0}: {1}\r", dev,
dev.CommunicationMonitor.Status));
}
CrestronConsole.ConsoleCommandResponse(sb.ToString());
}
finally
{
DeviceCriticalSection.Leave();
}
}
//static void DoDeviceCommand(string command)
@@ -236,11 +204,22 @@ namespace PepperDash.Essentials.Core
{
try
{
DeviceCriticalSection.Enter();
if (!DeviceCriticalSection.TryEnter())
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "Currently unable to add devices to Device Manager. Please try again");
return;
}
// Check for device with same key
//var existingDevice = _Devices.FirstOrDefault(d => d.Key.Equals(newDev.Key, StringComparison.OrdinalIgnoreCase));
////// If it exists, remove or warn??
//if (existingDevice != null)
if (!AddDeviceEnabled)
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "All devices have been activated. Adding new devices is not allowed.");
return;
}
if (Devices.ContainsKey(newDev.Key))
{
Debug.Console(0, newDev, "WARNING: A device with this key already exists. Not added to manager");
@@ -250,7 +229,10 @@ namespace PepperDash.Essentials.Core
//if (!(_Devices.Contains(newDev)))
// _Devices.Add(newDev);
}
finally {DeviceCriticalSection.Leave();}
finally
{
DeviceCriticalSection.Leave();
}
}
public static void RemoveDevice(IKeyed newDev)
@@ -275,45 +257,24 @@ namespace PepperDash.Essentials.Core
public static IEnumerable<string> GetDeviceKeys()
{
try
{
DeviceCriticalSection.Enter();
//return _Devices.Select(d => d.Key).ToList();
return Devices.Keys;
}
finally
{
DeviceCriticalSection.Leave();
}
}
public static IEnumerable<IKeyed> GetDevices()
{
try
{
DeviceCriticalSection.Enter();
//return _Devices.Select(d => d.Key).ToList();
return Devices.Values;
}
finally {DeviceCriticalSection.Leave();}
}
public static IKeyed GetDeviceForKey(string key)
{
try
{
DeviceCriticalSection.Enter();
//return _Devices.FirstOrDefault(d => d.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
if (key != null && Devices.ContainsKey(key))
return Devices[key];
return null;
}
finally
{
DeviceCriticalSection.Leave();
}
}
/// <summary>
/// Console handler that simulates com port data receive
@@ -330,7 +291,7 @@ namespace PepperDash.Essentials.Core
}
//Debug.Console(2, "**** {0} - {1} ****", match.Groups[1].Value, match.Groups[2].Value);
ComPortController com = GetDeviceForKey(match.Groups[1].Value) as ComPortController;
var com = GetDeviceForKey(match.Groups[1].Value) as ComPortController;
if (com == null)
{
CrestronConsole.ConsoleCommandResponse("'{0}' is not a comm port device", match.Groups[1].Value);