diff --git a/.github/ISSUE_TEMPLATE/rfi_request.md b/.github/ISSUE_TEMPLATE/rfi_request.md
new file mode 100644
index 00000000..8ad25ac6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/rfi_request.md
@@ -0,0 +1,27 @@
+---
+name: Request for Information
+about: Request specific information about capabilities of the framework
+title: "[RFI]-"
+labels: RFI
+assignees: ''
+
+---
+
+**What is your request?**
+Please provide as much detail as possible.
+
+
+**What is the intended use case**
+- [ ] Essentials Standalone Application
+- [ ] Essentials + SIMPL Windows Hybrid
+
+**User Interface Requirements**
+- [ ] Not Applicable (logic only)
+- [ ] Crestron Smart Graphics Touchpanel
+- [ ] Cisco Touch10
+- [ ] Mobile Control
+- [ ] Crestron CH5 Touchpanel interface
+
+
+**Additional context**
+Add any other context or screenshots about the request here.
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Essentials/ConfigWriter.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Essentials/ConfigWriter.cs
index cb361d28..c6224859 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Essentials/ConfigWriter.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Essentials/ConfigWriter.cs
@@ -1,162 +1,162 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharp.CrestronIO;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using PepperDash.Core;
-
-namespace PepperDash.Essentials.Core.Config
-{
- ///
- /// Responsible for updating config at runtime, and writing the updates out to a local file
- ///
- public class ConfigWriter
- {
- public const string LocalConfigFolder = "LocalConfig";
-
- public const long WriteTimeout = 30000;
-
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharp.CrestronIO;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using PepperDash.Core;
+
+namespace PepperDash.Essentials.Core.Config
+{
+ ///
+ /// Responsible for updating config at runtime, and writing the updates out to a local file
+ ///
+ public class ConfigWriter
+ {
+ public const string LocalConfigFolder = "LocalConfig";
+
+ public const long WriteTimeout = 30000;
+
public static CTimer WriteTimer;
- static CCriticalSection fileLock = new CCriticalSection();
-
- ///
- /// Updates the config properties of a device
- ///
- ///
- ///
- ///
- public static bool UpdateDeviceProperties(string deviceKey, JToken properties)
- {
- bool success = false;
-
- // Get the current device config
- var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(deviceKey));
-
- if (deviceConfig != null)
- {
- // Replace the current properties JToken with the new one passed into this method
- deviceConfig.Properties = properties;
-
- Debug.Console(1, "Updated properties of device: '{0}'", deviceKey);
-
- success = true;
- }
-
- ResetTimer();
-
- return success;
- }
-
- public static bool UpdateDeviceConfig(DeviceConfig config)
- {
- bool success = false;
-
- var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(config.Key));
-
- if (deviceConfig != null)
- {
- deviceConfig = config;
-
- Debug.Console(1, "Updated config of device: '{0}'", config.Key);
-
- success = true;
- }
-
- ResetTimer();
-
- return success;
- }
-
- public static bool UpdateRoomConfig(DeviceConfig config)
- {
- bool success = false;
-
- var deviceConfig = ConfigReader.ConfigObject.Rooms.FirstOrDefault(d => d.Key.Equals(config.Key));
-
- if (deviceConfig != null)
- {
- deviceConfig = config;
-
- Debug.Console(1, "Updated config of device: '{0}'", config.Key);
-
- success = true;
- }
-
- ResetTimer();
-
- return success;
- }
-
- ///
- /// Resets (or starts) the write timer
- ///
- static void ResetTimer()
- {
- if (WriteTimer == null)
- WriteTimer = new CTimer(WriteConfigFile, WriteTimeout);
-
- WriteTimer.Reset(WriteTimeout);
-
- Debug.Console(1, "Config File write timer has been reset.");
- }
-
- ///
- /// Writes the current config to a file in the LocalConfig subfolder
- ///
- ///
- private static void WriteConfigFile(object o)
- {
- var filePath = Global.FilePathPrefix + LocalConfigFolder + Global.DirectorySeparator + "configurationFile.json";
-
- var configData = JsonConvert.SerializeObject(ConfigReader.ConfigObject);
-
- WriteFile(filePath, configData);
- }
-
- ///
- /// Writes
- ///
- ///
- ///
- public static void WriteFile(string filePath, string configData)
- {
- if (WriteTimer != null)
- WriteTimer.Stop();
-
- Debug.Console(0, Debug.ErrorLogLevel.Notice, "Writing Configuration to file");
-
- Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to write config file: '{0}'", filePath);
-
- try
- {
- if (fileLock.TryEnter())
- {
- using (StreamWriter sw = new StreamWriter(filePath))
- {
- sw.Write(configData);
- sw.Flush();
- }
- }
- else
- {
- Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to enter FileLock");
- }
- }
- catch (Exception e)
- {
- Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: Config write failed: \r{0}", e);
- }
- finally
- {
- if (fileLock != null && !fileLock.Disposed)
- fileLock.Leave();
-
- }
- }
-
-
- }
+ static CCriticalSection fileLock = new CCriticalSection();
+
+ ///
+ /// Updates the config properties of a device
+ ///
+ ///
+ ///
+ ///
+ public static bool UpdateDeviceProperties(string deviceKey, JToken properties)
+ {
+ bool success = false;
+
+ // Get the current device config
+ var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(deviceKey));
+
+ if (deviceConfig != null)
+ {
+ // Replace the current properties JToken with the new one passed into this method
+ deviceConfig.Properties = properties;
+
+ Debug.Console(1, "Updated properties of device: '{0}'", deviceKey);
+
+ success = true;
+ }
+
+ ResetTimer();
+
+ return success;
+ }
+
+ public static bool UpdateDeviceConfig(DeviceConfig config)
+ {
+ bool success = false;
+
+ var deviceConfigIndex = ConfigReader.ConfigObject.Devices.FindIndex(d => d.Key.Equals(config.Key));
+
+ if (deviceConfigIndex >= 0)
+ {
+ ConfigReader.ConfigObject.Devices[deviceConfigIndex] = config;
+
+ Debug.Console(1, "Updated config of device: '{0}'", config.Key);
+
+ success = true;
+ }
+
+ ResetTimer();
+
+ return success;
+ }
+
+ public static bool UpdateRoomConfig(DeviceConfig config)
+ {
+ bool success = false;
+
+ var roomConfigIndex = ConfigReader.ConfigObject.Rooms.FindIndex(d => d.Key.Equals(config.Key));
+
+ if (roomConfigIndex >= 0)
+ {
+ ConfigReader.ConfigObject.Rooms[roomConfigIndex] = config;
+
+ Debug.Console(1, "Updated room of device: '{0}'", config.Key);
+
+ success = true;
+ }
+
+ ResetTimer();
+
+ return success;
+ }
+
+ ///
+ /// Resets (or starts) the write timer
+ ///
+ static void ResetTimer()
+ {
+ if (WriteTimer == null)
+ WriteTimer = new CTimer(WriteConfigFile, WriteTimeout);
+
+ WriteTimer.Reset(WriteTimeout);
+
+ Debug.Console(1, "Config File write timer has been reset.");
+ }
+
+ ///
+ /// Writes the current config to a file in the LocalConfig subfolder
+ ///
+ ///
+ private static void WriteConfigFile(object o)
+ {
+ var filePath = Global.FilePathPrefix + LocalConfigFolder + Global.DirectorySeparator + "configurationFile.json";
+
+ var configData = JsonConvert.SerializeObject(ConfigReader.ConfigObject);
+
+ WriteFile(filePath, configData);
+ }
+
+ ///
+ /// Writes
+ ///
+ ///
+ ///
+ public static void WriteFile(string filePath, string configData)
+ {
+ if (WriteTimer != null)
+ WriteTimer.Stop();
+
+ Debug.Console(0, Debug.ErrorLogLevel.Notice, "Writing Configuration to file");
+
+ Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to write config file: '{0}'", filePath);
+
+ try
+ {
+ if (fileLock.TryEnter())
+ {
+ using (StreamWriter sw = new StreamWriter(filePath))
+ {
+ sw.Write(configData);
+ sw.Flush();
+ }
+ }
+ else
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to enter FileLock");
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: Config write failed: \r{0}", e);
+ }
+ finally
+ {
+ if (fileLock != null && !fileLock.Disposed)
+ fileLock.Leave();
+
+ }
+ }
+
+
+ }
}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/ReconfigurableDevice.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/ReconfigurableDevice.cs
index 7b4f1c99..81988199 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/ReconfigurableDevice.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Devices/ReconfigurableDevice.cs
@@ -7,6 +7,8 @@ using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core;
using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core.Config;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
namespace PepperDash.Essentials.Core.Devices
{
@@ -52,6 +54,8 @@ namespace PepperDash.Essentials.Core.Devices
Name = config.Name;
}
+
+
///
/// Used by the extending class to allow for any custom actions to be taken (tell the ConfigWriter to write config, etc)
///
diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraBase.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraBase.cs
index 8b42cd82..def22069 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraBase.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraBase.cs
@@ -8,6 +8,8 @@ using Crestron.SimplSharp.Reflection;
using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core;
using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.Devices;
+using PepperDash.Essentials.Core.Config;
using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core.Presets;
using PepperDash.Essentials.Devices.Common.Codec;
@@ -25,7 +27,7 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
Focus = 8
}
- public abstract class CameraBase : EssentialsDevice, IRoutingOutputs
+ public abstract class CameraBase : ReconfigurableDevice, IRoutingOutputs
{
public eCameraControlMode ControlMode { get; protected set; }
@@ -70,12 +72,18 @@ namespace PepperDash.Essentials.Devices.Common.Cameras
// A bitmasked value to indicate the movement capabilites of this camera
protected eCameraCapabilities Capabilities { get; set; }
- protected CameraBase(string key, string name) :
- base(key, name)
- {
- OutputPorts = new RoutingPortCollection();
+ protected CameraBase(DeviceConfig config) : base(config)
+ {
+ OutputPorts = new RoutingPortCollection();
- ControlMode = eCameraControlMode.Manual;
+ ControlMode = eCameraControlMode.Manual;
+
+ }
+
+ protected CameraBase(string key, string name) :
+ this (new DeviceConfig{Name = name, Key = key})
+ {
+
}
protected void LinkCameraToApi(CameraBase cameraDevice, BasicTriList trilist, uint joinStart, string joinMapKey,