diff --git a/.gitignore b/.gitignore
index db1e92a3..d64977d6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -396,3 +396,4 @@ _site/
api/
*.DS_Store
/._PepperDash.Essentials.4Series.sln
+dotnet
diff --git a/src/PepperDash.Essentials.Core/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs b/src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionController.cs
similarity index 96%
rename from src/PepperDash.Essentials.Core/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs
rename to src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionController.cs
index 1497e164..fa7c36a4 100644
--- a/src/PepperDash.Essentials.Core/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs
+++ b/src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionController.cs
@@ -19,12 +19,12 @@ namespace PepperDash.Essentials.Core.Fusion
///
/// Represents a EssentialsHuddleSpaceFusionSystemControllerBase
///
- public class EssentialsHuddleSpaceFusionSystemControllerBase : Device, IOccupancyStatusProvider, IFusionHelpRequest
+ public class IEssentialsRoomFusionController : EssentialsDevice, IOccupancyStatusProvider, IFusionHelpRequest
{
- private readonly EssentialsHuddleSpaceRoomFusionRoomJoinMap JoinMap;
+ private EssentialsHuddleSpaceRoomFusionRoomJoinMap JoinMap;
private const string RemoteOccupancyXml = "Local{0}";
- private readonly bool _guidFileExists;
+ private bool _guidFileExists;
private readonly Dictionary _sourceToFeedbackSigs =
new Dictionary();
@@ -52,7 +52,7 @@ namespace PepperDash.Essentials.Core.Fusion
///
protected Dictionary FusionStaticAssets;
private readonly long PushNotificationTimeout = 5000;
- private readonly IEssentialsRoom Room;
+ private IEssentialsRoom Room;
private readonly long SchedulePollInterval = 300000;
private Event _currentMeeting;
@@ -74,8 +74,12 @@ namespace PepperDash.Essentials.Core.Fusion
private bool _helpRequestSent;
+ ///
public StringFeedback HelpRequestResponseFeedback { get; private set; }
+ ///
+ public BoolFeedback HelpRequestSentFeedback { get; private set; }
+
#region System Info Sigs
//StringSigData SystemName;
@@ -109,14 +113,48 @@ namespace PepperDash.Essentials.Core.Fusion
#endregion
+ ///
+ /// Constructor
+ ///
+ public IEssentialsRoomFusionController(IEssentialsRoomFusionControllerPropertiesConfig config)
+ : base("FusionRoomController")
+ {
+ AddPostActivationAction(() =>
+ {
+ var room = DeviceManager.GetDeviceForKey(config.RoomKey);
+
+ if (room == null)
+ {
+ Debug.LogMessage(LogEventLevel.Error, this,
+ "Error Creating Fusion Room Controller. No room found with key '{0}'", config.RoomKey);
+ return;
+ }
+
+ ConstructorHelper(room, config.IpId, config.JoinMapKey);
+
+ var guidFilePath = GetGuidFilePath(config.IpId);
+
+ PostActivate(guidFilePath);
+ });
+ }
+
///
///
///
///
///
///
- public EssentialsHuddleSpaceFusionSystemControllerBase(IEssentialsRoom room, uint ipId, string joinMapKey)
+ public IEssentialsRoomFusionController(IEssentialsRoom room, uint ipId, string joinMapKey)
: base(room.Key + "-fusion")
+ {
+ ConstructorHelper(room, ipId, joinMapKey);
+
+ var guidFilePath = GetGuidFilePath(ipId);
+
+ AddPostActivationAction(() => PostActivate(guidFilePath));
+ }
+
+ private void ConstructorHelper(IEssentialsRoom room, uint ipId, string joinMapKey)
{
try
{
@@ -132,7 +170,7 @@ namespace PepperDash.Essentials.Core.Fusion
JoinMap.SetCustomJoinData(customJoins);
}
}
-
+
Room = room;
_ipId = ipId;
@@ -141,41 +179,7 @@ namespace PepperDash.Essentials.Core.Fusion
_guiDs = new FusionRoomGuids();
- var mac =
- CrestronEthernetHelper.GetEthernetParameter(
- CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_MAC_ADDRESS, 0);
- var slot = Global.ControlSystem.ProgramNumber;
-
- var guidFilePath = Global.FilePathPrefix +
- string.Format(@"{0}-FusionGuids-{1:X2}.json", InitialParametersClass.ProgramIDTag, _ipId);
-
- var oldGuidFilePath = Global.FilePathPrefix +
- string.Format(@"{0}-FusionGuids.json", InitialParametersClass.ProgramIDTag);
-
- if (File.Exists(oldGuidFilePath))
- {
- Debug.LogMessage(LogEventLevel.Information, this, "Migrating from old Fusion GUID file to new Fusion GUID File");
-
- File.Copy(oldGuidFilePath, guidFilePath);
-
- File.Delete(oldGuidFilePath);
- }
-
- _guidFileExists = File.Exists(guidFilePath);
-
- // Check if file exists
- if (!_guidFileExists)
- {
- // Does not exist. Create GUIDs
- _guiDs = new FusionRoomGuids(Room.Name, ipId, _guiDs.GenerateNewRoomGuid(slot, mac),
- FusionStaticAssets);
- }
- else
- {
- // Exists. Read GUIDs
- ReadGuidFile(guidFilePath);
- }
if (Room is IRoomOccupancy occupancyRoom)
@@ -197,13 +201,53 @@ namespace PepperDash.Essentials.Core.Fusion
HelpRequestResponseFeedback.LinkInputSig(FusionRoom.Help.InputSig);
- AddPostActivationAction(() => PostActivate(guidFilePath));
}
catch (Exception e)
{
Debug.LogMessage(LogEventLevel.Information, this, "Error Building Fusion System Controller: {0}", e);
}
}
+
+ private string GetGuidFilePath(uint ipId)
+ {
+ var mac =
+ CrestronEthernetHelper.GetEthernetParameter(
+ CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_MAC_ADDRESS, 0);
+
+ var slot = Global.ControlSystem.ProgramNumber;
+
+ var guidFilePath = Global.FilePathPrefix +
+ string.Format(@"{0}-FusionGuids-{1:X2}.json", InitialParametersClass.ProgramIDTag, _ipId);
+
+ var oldGuidFilePath = Global.FilePathPrefix +
+ string.Format(@"{0}-FusionGuids.json", InitialParametersClass.ProgramIDTag);
+
+ if (File.Exists(oldGuidFilePath))
+ {
+ Debug.LogMessage(LogEventLevel.Information, this, "Migrating from old Fusion GUID file to new Fusion GUID File");
+
+ File.Copy(oldGuidFilePath, guidFilePath);
+
+ File.Delete(oldGuidFilePath);
+ }
+
+ _guidFileExists = File.Exists(guidFilePath);
+
+ // Check if file exists
+ if (!_guidFileExists)
+ {
+ // Does not exist. Create GUIDs
+ _guiDs = new FusionRoomGuids(Room.Name, ipId, _guiDs.GenerateNewRoomGuid(slot, mac),
+ FusionStaticAssets);
+ }
+ else
+ {
+ // Exists. Read GUIDs
+ ReadGuidFile(guidFilePath);
+ }
+
+ return guidFilePath;
+ }
private void PostActivate(string guidFilePath)
{
@@ -1721,11 +1765,8 @@ namespace PepperDash.Essentials.Core.Fusion
}
}
- ///
- /// Sends a help request to Fusion with room name and timestamp
- ///
- ///
- public void SendHelpRequest(bool isHtml)
+ ///
+ public void SendHelpRequest(bool isHtml = false)
{
var now = DateTime.Now;
@@ -1740,6 +1781,7 @@ namespace PepperDash.Essentials.Core.Fusion
_helpRequestSent = true;
}
+ ///
public void CancelHelpRequest()
{
if (_helpRequestSent)
@@ -1749,6 +1791,19 @@ namespace PepperDash.Essentials.Core.Fusion
Debug.LogMessage(LogEventLevel.Information, this, "Help request cancelled in Fusion for room '{0}'", Room.Name);
}
}
+
+ ///
+ public void ToggleHelpRequest(bool isHtml = false)
+ {
+ if (_helpRequestSent)
+ {
+ CancelHelpRequest();
+ }
+ else
+ {
+ SendHelpRequest(isHtml);
+ }
+ }
}
///
diff --git a/src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionControllerFactory.cs b/src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionControllerFactory.cs
new file mode 100644
index 00000000..4a598cc8
--- /dev/null
+++ b/src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionControllerFactory.cs
@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.Fusion;
+
+///
+/// Factory for creating IEssentialsRoomFusionController devices
+///
+public class IEssentialsRoomFusionControllerFactory : EssentialsDeviceFactory
+{
+ ///
+ /// Constructor
+ ///
+ public IEssentialsRoomFusionControllerFactory()
+ {
+ TypeNames = new List() { "fusionRoom" };
+ }
+
+ ///
+ /// Builds the device
+ ///
+ ///
+ ///
+ public override EssentialsDevice BuildDevice(PepperDash.Essentials.Core.Config.DeviceConfig dc)
+ {
+ Debug.LogDebug("Factory Attempting to create new IEssentialsRoomFusionController Device");
+
+
+ var properties = dc.Properties.ToObject();
+
+ return new IEssentialsRoomFusionController(properties);
+ }
+}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionControllerPropertiesConfig.cs b/src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionControllerPropertiesConfig.cs
new file mode 100644
index 00000000..b7183b17
--- /dev/null
+++ b/src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionControllerPropertiesConfig.cs
@@ -0,0 +1,25 @@
+using Newtonsoft.Json;
+
+///
+/// Config properties for an IEssentialsRoomFusionController device
+///
+public class IEssentialsRoomFusionControllerPropertiesConfig
+{
+ ///
+ /// Gets or sets the IP ID of the Fusion Room Controller
+ ///
+ [JsonProperty("ipId")]
+ public uint IpId { get; set; }
+
+ ///
+ /// Gets or sets the join map key
+ ///
+ [JsonProperty("joinMapKey")]
+ public string JoinMapKey { get; set; }
+
+ ///
+ /// Gets or sets the room key associated with this Fusion Room Controller
+ ///
+ [JsonProperty("roomKey")]
+ public string RoomKey { get; set; }
+}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Fusion/IFusionHelpRequest.cs b/src/PepperDash.Essentials.Core/Fusion/IFusionHelpRequest.cs
index 30033779..f17f4c9a 100644
--- a/src/PepperDash.Essentials.Core/Fusion/IFusionHelpRequest.cs
+++ b/src/PepperDash.Essentials.Core/Fusion/IFusionHelpRequest.cs
@@ -12,14 +12,29 @@ namespace PepperDash.Essentials.Core.Fusion
public interface IFusionHelpRequest
{
///
- /// Gets the HelpRequstResponseFeedback
+ /// Feedback containing the response to a help request
///
StringFeedback HelpRequestResponseFeedback { get; }
+ ///
+ /// Indicates whether a help request has been sent
+ ///
+ BoolFeedback HelpRequestSentFeedback { get; }
+
///
/// Sends a help request
///
///
void SendHelpRequest(bool isHtml);
+
+ ///
+ /// Clears the current help request status
+ ///
+ void CancelHelpRequest();
+
+ ///
+ /// Toggles between sending and cancelling a help request
+ ///
+ void ToggleHelpRequest(bool isHtml);
}
}
diff --git a/src/PepperDash.Essentials.Core/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs b/src/PepperDash.Essentials.Core/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs
index 49b51f67..d6f3c503 100644
--- a/src/PepperDash.Essentials.Core/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs
+++ b/src/PepperDash.Essentials.Core/Room/Behaviours/RoomOnToDefaultSourceWhenOccupied.cs
@@ -49,7 +49,7 @@ namespace PepperDash.Essentials.Core
///
public IRoomOccupancy Room { get; private set; }
- private Fusion.EssentialsHuddleSpaceFusionSystemControllerBase FusionRoom;
+ private Fusion.IEssentialsRoomFusionController FusionRoom;
public RoomOnToDefaultSourceWhenOccupied(DeviceConfig config) :
base (config)
@@ -74,7 +74,7 @@ namespace PepperDash.Essentials.Core
var fusionRoomKey = PropertiesConfig.RoomKey + "-fusion";
- FusionRoom = DeviceManager.GetDeviceForKey(fusionRoomKey) as Core.Fusion.EssentialsHuddleSpaceFusionSystemControllerBase;
+ FusionRoom = DeviceManager.GetDeviceForKey(fusionRoomKey) as Core.Fusion.IEssentialsRoomFusionController;
if (FusionRoom == null)
Debug.LogMessage(LogEventLevel.Debug, this, "Unable to get Fusion Room from Device Manager with key: {0}", fusionRoomKey);
diff --git a/src/PepperDash.Essentials.Core/Room/EssentialsRoomBase.cs b/src/PepperDash.Essentials.Core/Room/EssentialsRoomBase.cs
index dfb8b5a1..38e4456e 100644
--- a/src/PepperDash.Essentials.Core/Room/EssentialsRoomBase.cs
+++ b/src/PepperDash.Essentials.Core/Room/EssentialsRoomBase.cs
@@ -408,7 +408,7 @@ namespace PepperDash.Essentials.Core
Debug.LogMessage(LogEventLevel.Information, this, "Timeout Minutes from Config is: {0}", timeoutMinutes);
// If status provider is fusion, set flag to remote
- if (statusProvider is Core.Fusion.EssentialsHuddleSpaceFusionSystemControllerBase)
+ if (statusProvider is Core.Fusion.IEssentialsRoomFusionController)
OccupancyStatusProviderIsRemote = true;
if(timeoutMinutes > 0)