diff --git a/src/PepperDash.Essentials.Core/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs b/src/PepperDash.Essentials.Core/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs
index e2638493..1497e164 100644
--- a/src/PepperDash.Essentials.Core/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs
+++ b/src/PepperDash.Essentials.Core/Fusion/EssentialsHuddleSpaceFusionSystemControllerBase.cs
@@ -1,6 +1,4 @@
-
-
-using Crestron.SimplSharp;
+using Crestron.SimplSharp;
using Crestron.SimplSharp.CrestronIO;
using Crestron.SimplSharp.CrestronXml;
using Crestron.SimplSharp.CrestronXml.Serialization;
@@ -21,7 +19,7 @@ namespace PepperDash.Essentials.Core.Fusion
///
/// Represents a EssentialsHuddleSpaceFusionSystemControllerBase
///
- public class EssentialsHuddleSpaceFusionSystemControllerBase : Device, IOccupancyStatusProvider
+ public class EssentialsHuddleSpaceFusionSystemControllerBase : Device, IOccupancyStatusProvider, IFusionHelpRequest
{
private readonly EssentialsHuddleSpaceRoomFusionRoomJoinMap JoinMap;
@@ -31,13 +29,27 @@ namespace PepperDash.Essentials.Core.Fusion
private readonly Dictionary _sourceToFeedbackSigs =
new Dictionary();
+ ///
+ /// Gets or sets the CurrentRoomSourceNameSig
+ ///
protected StringSigData CurrentRoomSourceNameSig;
private readonly FusionCustomPropertiesBridge CustomPropertiesBridge = new FusionCustomPropertiesBridge();
+
+ ///
+ /// Gets or sets the FusionOccSensor
+ ///
protected FusionOccupancySensorAsset FusionOccSensor;
private readonly FusionRemoteOccupancySensor FusionRemoteOccSensor;
+ ///
+ /// Gets or sets the FusionRoom
+ ///
protected FusionRoom FusionRoom;
+
+ ///
+ /// Gets or sets the FusionStaticAssets
+ ///
protected Dictionary FusionStaticAssets;
private readonly long PushNotificationTimeout = 5000;
private readonly IEssentialsRoom Room;
@@ -60,6 +72,10 @@ namespace PepperDash.Essentials.Core.Fusion
private string _roomOccupancyRemoteString;
+ private bool _helpRequestSent;
+
+ public StringFeedback HelpRequestResponseFeedback { get; private set; }
+
#region System Info Sigs
//StringSigData SystemName;
@@ -93,6 +109,12 @@ namespace PepperDash.Essentials.Core.Fusion
#endregion
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
public EssentialsHuddleSpaceFusionSystemControllerBase(IEssentialsRoom room, uint ipId, string joinMapKey)
: base(room.Key + "-fusion")
{
@@ -171,6 +193,9 @@ namespace PepperDash.Essentials.Core.Fusion
}
}
+ HelpRequestResponseFeedback = new StringFeedback("HelpRequestResponse", () => FusionRoom.Help.InputSig.StringValue);
+ HelpRequestResponseFeedback.LinkInputSig(FusionRoom.Help.InputSig);
+
AddPostActivationAction(() => PostActivate(guidFilePath));
}
@@ -194,6 +219,9 @@ namespace PepperDash.Essentials.Core.Fusion
GenerateGuidFile(guidFilePath);
}
+ ///
+ /// Gets the RoomGuid
+ ///
protected string RoomGuid
{
get { return _guiDs.RoomGuid; }
@@ -204,6 +232,9 @@ namespace PepperDash.Essentials.Core.Fusion
///
public StringFeedback RoomOccupancyRemoteStringFeedback { get; private set; }
+ ///
+ /// Gets the RoomIsOccupiedFeedbackFunc
+ ///
protected Func RoomIsOccupiedFeedbackFunc
{
get { return () => FusionRemoteOccSensor.RoomOccupied.OutputSig.BoolValue; }
@@ -218,10 +249,16 @@ namespace PepperDash.Essentials.Core.Fusion
#endregion
+ ///
+ /// ScheduleChange event
+ ///
public event EventHandler ScheduleChange;
//public event EventHandler MeetingEndWarning;
//public event EventHandler NextMeetingBeginWarning;
+ ///
+ /// RoomInfoChange event
+ ///
public event EventHandler RoomInfoChange;
//ScheduleResponseEvent NextMeeting;
@@ -343,6 +380,10 @@ namespace PepperDash.Essentials.Core.Fusion
}
}
+ ///
+ /// CreateSymbolAndBasicSigs method
+ ///
+ ///
protected virtual void CreateSymbolAndBasicSigs(uint ipId)
{
Debug.LogMessage(LogEventLevel.Information, this, "Creating Fusion Room symbol with GUID: {0} and IP-ID {1:X2}", RoomGuid, ipId);
@@ -405,6 +446,10 @@ namespace PepperDash.Essentials.Core.Fusion
CrestronEnvironment.EthernetEventHandler += CrestronEnvironment_EthernetEventHandler;
}
+ ///
+ /// CrestronEnvironment_EthernetEventHandler method
+ ///
+ ///
protected void CrestronEnvironment_EthernetEventHandler(EthernetEventArgs ethernetEventArgs)
{
if (ethernetEventArgs.EthernetEventType == eEthernetEventType.LinkUp)
@@ -413,6 +458,9 @@ namespace PepperDash.Essentials.Core.Fusion
}
}
+ ///
+ /// GetSystemInfo method
+ ///
protected void GetSystemInfo()
{
//SystemName.InputSig.StringValue = Room.Name;
@@ -426,6 +474,9 @@ namespace PepperDash.Essentials.Core.Fusion
() => CrestronConsole.SendControlSystemCommand("reboot", ref response));
}
+ ///
+ /// SetUpEthernetValues method
+ ///
protected void SetUpEthernetValues()
{
_ip1 = FusionRoom.CreateOffsetStringSig(JoinMap.ProcessorIp1.JoinNumber, JoinMap.ProcessorIp1.AttributeName, eSigIoMask.InputSigOnly);
@@ -441,6 +492,9 @@ namespace PepperDash.Essentials.Core.Fusion
_netMask2 = FusionRoom.CreateOffsetStringSig(JoinMap.ProcessorNetMask2.JoinNumber, JoinMap.ProcessorNetMask2.AttributeName, eSigIoMask.InputSigOnly);
}
+ ///
+ /// GetProcessorEthernetValues method
+ ///
protected void GetProcessorEthernetValues()
{
_ip1.InputSig.StringValue =
@@ -489,6 +543,9 @@ namespace PepperDash.Essentials.Core.Fusion
}
}
+ ///
+ /// GetProcessorInfo method
+ ///
protected void GetProcessorInfo()
{
_firmware = FusionRoom.CreateOffsetStringSig(JoinMap.ProcessorFirmware.JoinNumber, JoinMap.ProcessorFirmware.AttributeName, eSigIoMask.InputSigOnly);
@@ -507,6 +564,9 @@ namespace PepperDash.Essentials.Core.Fusion
_firmware.InputSig.StringValue = InitialParametersClass.FirmwareVersion;
}
+ ///
+ /// GetCustomProperties method
+ ///
protected void GetCustomProperties()
{
if (FusionRoom.IsOnline)
@@ -524,6 +584,11 @@ namespace PepperDash.Essentials.Core.Fusion
// TODO: Get IP and Project Name from TP
}
+ ///
+ /// FusionRoom_OnlineStatusChange method
+ ///
+ ///
+ ///
protected void FusionRoom_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args)
{
if (args.DeviceOnLine)
@@ -1065,6 +1130,9 @@ namespace PepperDash.Essentials.Core.Fusion
}
}
+ ///
+ /// SetUpSources method
+ ///
protected virtual void SetUpSources()
{
// Sources
@@ -1157,7 +1225,13 @@ namespace PepperDash.Essentials.Core.Fusion
Debug.LogMessage(LogEventLevel.Debug, this, "Device usage string: {0}", deviceUsage);
}
-
+ ///
+ /// Tries to add route action sigs for a source
+ ///
+ ///
+ ///
+ ///
+ ///
protected void TryAddRouteActionSigs(string attrName, uint attrNum, string routeKey, Device pSrc)
{
Debug.LogMessage(LogEventLevel.Verbose, this, "Creating attribute '{0}' with join {1} for source {2}",
@@ -1185,9 +1259,7 @@ namespace PepperDash.Essentials.Core.Fusion
}
}
- ///
- ///
- ///
+
private void SetUpCommunitcationMonitors()
{
uint displayNum = 0;
@@ -1285,6 +1357,9 @@ namespace PepperDash.Essentials.Core.Fusion
}
}
+ ///
+ /// SetUpDisplay method
+ ///
protected virtual void SetUpDisplay()
{
try
@@ -1588,12 +1663,25 @@ namespace PepperDash.Essentials.Core.Fusion
}
}
+ ///
+ /// Event handler for Fusion state changes
+ ///
+ ///
+ ///
protected void FusionRoom_FusionStateChange(FusionBase device, FusionStateEventArgs args)
{
+ if (args.EventId == FusionEventIds.HelpMessageReceivedEventId)
+ {
+ Debug.LogMessage(LogEventLevel.Information, this, "Help message received from Fusion for room '{0}'",
+ Room.Name);
+ // Fire help request event
+ HelpRequestResponseFeedback.FireUpdate();
+ }
+
+
// The sig/UO method: Need separate handlers for fixed and user sigs, all flavors,
// even though they all contain sigs.
-
BoolOutputSig outSig;
if (args.UserConfiguredSigDetail is BooleanSigDataFixedName sigData)
{
@@ -1632,9 +1720,40 @@ namespace PepperDash.Essentials.Core.Fusion
(outSig.UserObject as Action).Invoke(outSig.StringValue);
}
}
+
+ ///
+ /// Sends a help request to Fusion with room name and timestamp
+ ///
+ ///
+ public void SendHelpRequest(bool isHtml)
+ {
+ var now = DateTime.Now;
+
+ var breakString = !isHtml ? "\r\n" : "
";
+
+ var requestString = $"HR00: {breakString} Assistance has been requested from room {Room.Name}{breakString}on {now.ToLongDateString()} at {now.ToLongTimeString()}";
+
+ FusionRoom.Help.InputSig.StringValue = requestString;
+
+ Debug.LogMessage(LogEventLevel.Information, this, "Help request sent to Fusion from room '{0}'", Room.Name);
+
+ _helpRequestSent = true;
+ }
+
+ public void CancelHelpRequest()
+ {
+ if (_helpRequestSent)
+ {
+ FusionRoom.Help.InputSig.StringValue = "";
+ _helpRequestSent = false;
+ Debug.LogMessage(LogEventLevel.Information, this, "Help request cancelled in Fusion for room '{0}'", Room.Name);
+ }
+ }
}
-
+ ///
+ /// Extensions to enhance Fusion room, asset and signal creation.
+ ///
public static class FusionRoomExtensions
{
///
@@ -1803,6 +1922,9 @@ namespace PepperDash.Essentials.Core.Fusion
///
public class RoomInformation
{
+ ///
+ /// Constructor
+ ///
public RoomInformation()
{
FusionCustomProperties = new List();
@@ -1855,10 +1977,17 @@ namespace PepperDash.Essentials.Core.Fusion
///
public class FusionCustomProperty
{
+ ///
+ /// Constructor
+ ///
public FusionCustomProperty()
{
}
+ ///
+ /// Constructor with id
+ ///
+ ///
public FusionCustomProperty(string id)
{
ID = id;
diff --git a/src/PepperDash.Essentials.Core/Fusion/IFusionHelpRequest.cs b/src/PepperDash.Essentials.Core/Fusion/IFusionHelpRequest.cs
new file mode 100644
index 00000000..30033779
--- /dev/null
+++ b/src/PepperDash.Essentials.Core/Fusion/IFusionHelpRequest.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PepperDash.Essentials.Core.Fusion
+{
+ ///
+ /// Represents Fusion Help Request functionality
+ ///
+ public interface IFusionHelpRequest
+ {
+ ///
+ /// Gets the HelpRequstResponseFeedback
+ ///
+ StringFeedback HelpRequestResponseFeedback { get; }
+
+ ///
+ /// Sends a help request
+ ///
+ ///
+ void SendHelpRequest(bool isHtml);
+ }
+}