mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-15 20:54:55 +00:00
adds protections for devices doing things they shouldn't...
This commit is contained in:
@@ -26,6 +26,8 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
HttpLogoServer LogoServer;
|
HttpLogoServer LogoServer;
|
||||||
|
|
||||||
|
private CTimer _startTimer;
|
||||||
|
private const long StartupTime = 500;
|
||||||
|
|
||||||
public ControlSystem()
|
public ControlSystem()
|
||||||
: base()
|
: base()
|
||||||
@@ -39,6 +41,11 @@ namespace PepperDash.Essentials
|
|||||||
/// Entry point for the program
|
/// Entry point for the program
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override void InitializeSystem()
|
public override void InitializeSystem()
|
||||||
|
{
|
||||||
|
_startTimer = new CTimer(StartSystem,StartupTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void StartSystem(object obj)
|
||||||
{
|
{
|
||||||
DeterminePlatform();
|
DeterminePlatform();
|
||||||
|
|
||||||
@@ -75,11 +82,11 @@ namespace PepperDash.Essentials
|
|||||||
}, "showconfig", "Shows the current running merged config", ConsoleAccessLevelEnum.AccessOperator);
|
}, "showconfig", "Shows the current running merged config", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s =>
|
CrestronConsole.AddNewConsoleCommand(s =>
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("This system can be found at the following URLs:\r" +
|
CrestronConsole.ConsoleCommandResponse("This system can be found at the following URLs:\r" +
|
||||||
"System URL: {0}\r" +
|
"System URL: {0}\r" +
|
||||||
"Template URL: {1}", ConfigReader.ConfigObject.SystemUrl, ConfigReader.ConfigObject.TemplateUrl);
|
"Template URL: {1}", ConfigReader.ConfigObject.SystemUrl, ConfigReader.ConfigObject.TemplateUrl);
|
||||||
}, "portalinfo", "Shows portal URLS from configuration", ConsoleAccessLevelEnum.AccessOperator);
|
}, "portalinfo", "Shows portal URLS from configuration", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
|
|
||||||
if (!Debug.DoNotLoadOnNextBoot)
|
if (!Debug.DoNotLoadOnNextBoot)
|
||||||
|
|||||||
@@ -5,10 +5,6 @@ using System.Text;
|
|||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
|
||||||
using Crestron.SimplSharpPro.UI;
|
|
||||||
using Crestron.SimplSharp.Reflection;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
@@ -18,18 +14,22 @@ namespace PepperDash.Essentials.Core
|
|||||||
public static class DeviceManager
|
public static class DeviceManager
|
||||||
{
|
{
|
||||||
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
|
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
|
||||||
|
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
|
||||||
//public static List<Device> Devices { get { return _Devices; } }
|
//public static List<Device> Devices { get { return _Devices; } }
|
||||||
//static List<Device> _Devices = new List<Device>();
|
//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>
|
/// <summary>
|
||||||
/// Returns a copy of all the devices in a list
|
/// Returns a copy of all the devices in a list
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static List<IKeyed> AllDevices { get { return new List<IKeyed>(Devices.Values); } }
|
public static List<IKeyed> AllDevices { get { return new List<IKeyed>(Devices.Values); } }
|
||||||
|
|
||||||
|
public static bool AddDeviceEnabled;
|
||||||
|
|
||||||
public static void Initialize(CrestronControlSystem cs)
|
public static void Initialize(CrestronControlSystem cs)
|
||||||
{
|
{
|
||||||
|
AddDeviceEnabled = true;
|
||||||
CrestronConsole.AddNewConsoleCommand(ListDeviceCommStatuses, "devcommstatus", "Lists the communication status of all devices",
|
CrestronConsole.AddNewConsoleCommand(ListDeviceCommStatuses, "devcommstatus", "Lists the communication status of all devices",
|
||||||
ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(ListDeviceFeedbacks, "devfb", "Lists current feedbacks",
|
CrestronConsole.AddNewConsoleCommand(ListDeviceFeedbacks, "devfb", "Lists current feedbacks",
|
||||||
@@ -38,18 +38,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(DeviceJsonApi.DoDeviceActionWithJson, "devjson", "",
|
CrestronConsole.AddNewConsoleCommand(DeviceJsonApi.DoDeviceActionWithJson, "devjson", "",
|
||||||
ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.AddNewConsoleCommand(s =>
|
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetProperties(s)), "devprops", "", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
{
|
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetMethods(s)), "devmethods", "", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetProperties(s));
|
CrestronConsole.AddNewConsoleCommand(s => CrestronConsole.ConsoleCommandResponse(DeviceJsonApi.GetApiMethods(s)), "apimethods", "", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
}, "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",
|
CrestronConsole.AddNewConsoleCommand(SimulateComReceiveOnDevice, "devsimreceive",
|
||||||
"Simulates incoming data on a com device", ConsoleAccessLevelEnum.AccessOperator);
|
"Simulates incoming data on a com device", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
}
|
}
|
||||||
@@ -62,6 +53,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
DeviceCriticalSection.Enter();
|
DeviceCriticalSection.Enter();
|
||||||
|
AddDeviceEnabled = false;
|
||||||
// PreActivate all devices
|
// PreActivate all devices
|
||||||
foreach (var d in Devices.Values)
|
foreach (var d in Devices.Values)
|
||||||
{
|
{
|
||||||
@@ -118,10 +110,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
DeviceCriticalSection.Enter();
|
DeviceCriticalSection.Enter();
|
||||||
foreach (var d in Devices.Values)
|
foreach (var d in Devices.Values.OfType<Device>())
|
||||||
{
|
{
|
||||||
if (d is Device)
|
d.Deactivate();
|
||||||
(d as Device).Deactivate();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
@@ -151,50 +142,37 @@ namespace PepperDash.Essentials.Core
|
|||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
static void ListDevices(string s)
|
private static void ListDevices(string s)
|
||||||
{
|
{
|
||||||
try
|
Debug.Console(0, "{0} Devices registered with Device Manager:", Devices.Count);
|
||||||
{
|
var sorted = Devices.Values.ToList();
|
||||||
DeviceCriticalSection.Enter();
|
sorted.Sort((a, b) => a.Key.CompareTo(b.Key));
|
||||||
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));
|
|
||||||
|
|
||||||
foreach (var d in sorted)
|
foreach (var d in sorted)
|
||||||
{
|
{
|
||||||
var name = d is IKeyName ? (d as IKeyName).Name : "---";
|
var name = d is IKeyName ? (d as IKeyName).Name : "---";
|
||||||
Debug.Console(0, " [{0}] {1}", d.Key, name);
|
Debug.Console(0, " [{0}] {1}", d.Key, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally {DeviceCriticalSection.Leave();}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ListDeviceFeedbacks(string devKey)
|
private static void ListDeviceFeedbacks(string devKey)
|
||||||
{
|
{
|
||||||
try
|
var dev = GetDeviceForKey(devKey);
|
||||||
{
|
if (dev == null)
|
||||||
DeviceCriticalSection.Enter();
|
{
|
||||||
var dev = GetDeviceForKey(devKey);
|
Debug.Console(0, "Device '{0}' not found", devKey);
|
||||||
if (dev == null)
|
return;
|
||||||
{
|
}
|
||||||
Debug.Console(0, "Device '{0}' not found", devKey);
|
var statusDev = dev as IHasFeedback;
|
||||||
return;
|
if (statusDev == null)
|
||||||
}
|
{
|
||||||
var statusDev = dev as IHasFeedback;
|
Debug.Console(0, "Device '{0}' does not have visible feedbacks", devKey);
|
||||||
if (statusDev == null)
|
return;
|
||||||
{
|
}
|
||||||
Debug.Console(0, "Device '{0}' does not have visible feedbacks", devKey);
|
statusDev.DumpFeedbacksToConsole(true);
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
statusDev.DumpFeedbacksToConsole(true);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
DeviceCriticalSection.Leave();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//static void ListDeviceCommands(string devKey)
|
//static void ListDeviceCommands(string devKey)
|
||||||
//{
|
//{
|
||||||
// var dev = GetDeviceForKey(devKey);
|
// var dev = GetDeviceForKey(devKey);
|
||||||
// if (dev == null)
|
// if (dev == null)
|
||||||
@@ -205,29 +183,19 @@ namespace PepperDash.Essentials.Core
|
|||||||
// Debug.Console(0, "This needs to be reworked. Stay tuned.", devKey);
|
// Debug.Console(0, "This needs to be reworked. Stay tuned.", devKey);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
static void ListDeviceCommStatuses(string input)
|
private static void ListDeviceCommStatuses(string input)
|
||||||
{
|
{
|
||||||
try
|
var sb = new StringBuilder();
|
||||||
{
|
foreach (var dev in Devices.Values.OfType<ICommunicationMonitor>())
|
||||||
DeviceCriticalSection.Enter();
|
{
|
||||||
|
sb.Append(string.Format("{0}: {1}\r", dev,
|
||||||
var sb = new StringBuilder();
|
dev.CommunicationMonitor.Status));
|
||||||
foreach (var dev in Devices.Values)
|
}
|
||||||
{
|
CrestronConsole.ConsoleCommandResponse(sb.ToString());
|
||||||
if (dev is ICommunicationMonitor)
|
}
|
||||||
sb.Append(string.Format("{0}: {1}\r", dev.Key,
|
|
||||||
(dev as ICommunicationMonitor).CommunicationMonitor.Status));
|
|
||||||
}
|
|
||||||
CrestronConsole.ConsoleCommandResponse(sb.ToString());
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
DeviceCriticalSection.Leave();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//static void DoDeviceCommand(string command)
|
//static void DoDeviceCommand(string command)
|
||||||
//{
|
//{
|
||||||
// Debug.Console(0, "Not yet implemented. Stay tuned");
|
// Debug.Console(0, "Not yet implemented. Stay tuned");
|
||||||
//}
|
//}
|
||||||
@@ -236,11 +204,22 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
try
|
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
|
// Check for device with same key
|
||||||
//var existingDevice = _Devices.FirstOrDefault(d => d.Key.Equals(newDev.Key, StringComparison.OrdinalIgnoreCase));
|
//var existingDevice = _Devices.FirstOrDefault(d => d.Key.Equals(newDev.Key, StringComparison.OrdinalIgnoreCase));
|
||||||
////// If it exists, remove or warn??
|
////// If it exists, remove or warn??
|
||||||
//if (existingDevice != null)
|
//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))
|
if (Devices.ContainsKey(newDev.Key))
|
||||||
{
|
{
|
||||||
Debug.Console(0, newDev, "WARNING: A device with this key already exists. Not added to manager");
|
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)))
|
//if (!(_Devices.Contains(newDev)))
|
||||||
// _Devices.Add(newDev);
|
// _Devices.Add(newDev);
|
||||||
}
|
}
|
||||||
finally {DeviceCriticalSection.Leave();}
|
finally
|
||||||
|
{
|
||||||
|
DeviceCriticalSection.Leave();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RemoveDevice(IKeyed newDev)
|
public static void RemoveDevice(IKeyed newDev)
|
||||||
@@ -275,44 +257,23 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
public static IEnumerable<string> GetDeviceKeys()
|
public static IEnumerable<string> GetDeviceKeys()
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
DeviceCriticalSection.Enter();
|
|
||||||
//return _Devices.Select(d => d.Key).ToList();
|
//return _Devices.Select(d => d.Key).ToList();
|
||||||
return Devices.Keys;
|
return Devices.Keys;
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
DeviceCriticalSection.Leave();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IEnumerable<IKeyed> GetDevices()
|
public static IEnumerable<IKeyed> GetDevices()
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
DeviceCriticalSection.Enter();
|
|
||||||
//return _Devices.Select(d => d.Key).ToList();
|
//return _Devices.Select(d => d.Key).ToList();
|
||||||
return Devices.Values;
|
return Devices.Values;
|
||||||
}
|
|
||||||
finally {DeviceCriticalSection.Leave();}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IKeyed GetDeviceForKey(string key)
|
public static IKeyed GetDeviceForKey(string key)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
DeviceCriticalSection.Enter();
|
|
||||||
//return _Devices.FirstOrDefault(d => d.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
|
//return _Devices.FirstOrDefault(d => d.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
|
||||||
if (key != null && Devices.ContainsKey(key))
|
if (key != null && Devices.ContainsKey(key))
|
||||||
return Devices[key];
|
return Devices[key];
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
DeviceCriticalSection.Leave();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -330,7 +291,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
}
|
}
|
||||||
//Debug.Console(2, "**** {0} - {1} ****", match.Groups[1].Value, match.Groups[2].Value);
|
//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)
|
if (com == null)
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("'{0}' is not a comm port device", match.Groups[1].Value);
|
CrestronConsole.ConsoleCommandResponse("'{0}' is not a comm port device", match.Groups[1].Value);
|
||||||
|
|||||||
Reference in New Issue
Block a user