mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-15 04:34:56 +00:00
Merge pull request #1335 from PepperDash/mc-messenger-improvements
feat: unique status requests for messengers
This commit is contained in:
@@ -23,23 +23,32 @@
|
|||||||
<FileName>$(TargetDir)$(TargetName).$(Version).$(TargetFramework).cpz</FileName>
|
<FileName>$(TargetDir)$(TargetName).$(Version).$(TargetFramework).cpz</FileName>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<Target Name="DeleteCLZ" BeforeTargets="PreBuildEvent" Condition="$(ProjectType) == 'Library' And $(TargetDir) != '' And Exists($(FileName))">
|
<Target Name="DeleteCLZ" BeforeTargets="CoreBuild" Condition="$(ProjectType) == 'Library' And $(TargetDir) != ''">
|
||||||
<Delete Files="$(TargetDir)$(TargetName).$(Version).$(TargetFramework).clz">
|
<ItemGroup>
|
||||||
|
<OldCLZFiles Include="$(TargetDir)$(TargetName).*.$(TargetFramework).clz" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Delete Files="@(OldCLZFiles)" Condition="@(OldCLZFiles) != ''">
|
||||||
<Output TaskParameter="DeletedFiles" ItemName="DeletedList"/>
|
<Output TaskParameter="DeletedFiles" ItemName="DeletedList"/>
|
||||||
</Delete>
|
</Delete>
|
||||||
<Message Text="Deleted files: '@(DeletedList)'" />
|
<Message Text="Deleted old CLZ files: '@(DeletedList)'" Condition="@(DeletedList) != ''" />
|
||||||
</Target>
|
</Target>
|
||||||
<Target Name="DeleteCPZ" BeforeTargets="PreBuildEvent" Condition="$(ProjectType) == 'Program' And $(TargetDir) != '' And Exists($(FileName))">
|
<Target Name="DeleteCPZ" BeforeTargets="CoreBuild" Condition="$(ProjectType) == 'Program' And $(TargetDir) != ''">
|
||||||
<Delete Files="$(TargetDir)$(TargetName).$(Version).$(TargetFramework).cpz">
|
<ItemGroup>
|
||||||
|
<OldCPZFiles Include="$(TargetDir)$(TargetName).*.$(TargetFramework).cpz" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Delete Files="@(OldCPZFiles)" Condition="@(OldCPZFiles) != ''">
|
||||||
<Output TaskParameter="DeletedFiles" ItemName="DeletedList"/>
|
<Output TaskParameter="DeletedFiles" ItemName="DeletedList"/>
|
||||||
</Delete>
|
</Delete>
|
||||||
<Message Text="Deleted files: '@(DeletedList)'" />
|
<Message Text="Deleted old CPZ files: '@(DeletedList)'" Condition="@(DeletedList) != ''" />
|
||||||
</Target>
|
</Target>
|
||||||
<Target Name="DeleteCPLZ" BeforeTargets="PreBuildEvent" Condition="$(ProjectType) == 'ProgramLibrary' And $(TargetDir) != '' And Exists($(FileName))">
|
<Target Name="DeleteCPLZ" BeforeTargets="CoreBuild" Condition="$(ProjectType) == 'ProgramLibrary' And $(TargetDir) != ''">
|
||||||
<Delete Files="$(TargetDir)$(TargetName).$(Version).$(TargetFramework).cplz">
|
<ItemGroup>
|
||||||
|
<OldCPLZFiles Include="$(TargetDir)$(TargetName).*.$(TargetFramework).cplz" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Delete Files="@(OldCPLZFiles)" Condition="@(OldCPLZFiles) != ''">
|
||||||
<Output TaskParameter="DeletedFiles" ItemName="DeletedList"/>
|
<Output TaskParameter="DeletedFiles" ItemName="DeletedList"/>
|
||||||
</Delete>
|
</Delete>
|
||||||
<Message Text="Deleted files: '@(DeletedList)'" />
|
<Message Text="Deleted old CPLZ files: '@(DeletedList)'" Condition="@(DeletedList) != ''" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<Target Name="CreateCPLZ" AfterTargets="Build" Condition="$(ProjectType) == 'ProgramLibrary' And $(TargetDir) != ''" DependsOnTargets="DeleteCPLZ">
|
<Target Name="CreateCPLZ" AfterTargets="Build" Condition="$(ProjectType) == 'ProgramLibrary' And $(TargetDir) != ''" DependsOnTargets="DeleteCPLZ">
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Use this interface on a device or room if it uses custom Mobile Control messengers
|
||||||
|
/// </summary>
|
||||||
|
public interface ICustomMobileControl : IKeyed
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,155 +1,72 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.ObjectModel;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Use this interface on a device or room if it uses custom Mobile Control messengers
|
|
||||||
/// </summary>
|
|
||||||
public interface ICustomMobileControl : IKeyed
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*/// <summary>
|
|
||||||
/// Describes a MobileControlSystemController
|
|
||||||
/// </summary>
|
|
||||||
public interface IMobileControl : IKeyed
|
|
||||||
{
|
|
||||||
void CreateMobileControlRoomBridge(IEssentialsRoom room, IMobileControl parent);
|
|
||||||
|
|
||||||
void LinkSystemMonitorToAppServer();
|
|
||||||
}*/
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines the contract for IMobileControl
|
/// Defines the contract for IMobileControl
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IMobileControl : IKeyed
|
public interface IMobileControl : IKeyed
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the Host
|
||||||
|
/// </summary>
|
||||||
string Host { get; }
|
string Host { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the Client App URL
|
||||||
|
/// </summary>
|
||||||
string ClientAppUrl { get; }
|
string ClientAppUrl { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the System UUID
|
||||||
|
/// </summary>
|
||||||
string SystemUuid { get; }
|
string SystemUuid { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the ApiOnlineAndAuthorized feedback
|
||||||
|
/// </summary>
|
||||||
BoolFeedback ApiOnlineAndAuthorized { get; }
|
BoolFeedback ApiOnlineAndAuthorized { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sends the message object to the AppServer
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="o">Message to send</param>
|
||||||
void SendMessageObject(IMobileControlMessage o);
|
void SendMessageObject(IMobileControlMessage o);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds an action for a messenger
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Messenger type. Must implement IMobileControlMessenger</typeparam>
|
||||||
|
/// <param name="messenger">messenger to register</param>
|
||||||
|
/// <param name="action">action to add</param>
|
||||||
void AddAction<T>(T messenger, Action<string, string, JToken> action) where T : IMobileControlMessenger;
|
void AddAction<T>(T messenger, Action<string, string, JToken> action) where T : IMobileControlMessenger;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes an action for a messenger
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">key for action</param>
|
||||||
void RemoveAction(string key);
|
void RemoveAction(string key);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds a device messenger
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="messenger">Messenger to add</param>
|
||||||
void AddDeviceMessenger(IMobileControlMessenger messenger);
|
void AddDeviceMessenger(IMobileControlMessenger messenger);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if a device messenger exists
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">Messenger key to find</param>
|
||||||
bool CheckForDeviceMessenger(string key);
|
bool CheckForDeviceMessenger(string key);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a Room Messenger by key
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">messenger key to find</param>
|
||||||
|
/// <returns>Messenger if found, null otherwise</returns>
|
||||||
IMobileControlRoomMessenger GetRoomMessenger(string key);
|
IMobileControlRoomMessenger GetRoomMessenger(string key);
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Defines the contract for IMobileControlMessenger
|
|
||||||
/// </summary>
|
|
||||||
public interface IMobileControlMessenger : IKeyed
|
|
||||||
{
|
|
||||||
IMobileControl AppServerController { get; }
|
|
||||||
string MessagePath { get; }
|
|
||||||
|
|
||||||
string DeviceKey { get; }
|
|
||||||
void RegisterWithAppServer(IMobileControl appServerController);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IMobileControlMessage
|
|
||||||
{
|
|
||||||
[JsonProperty("type")]
|
|
||||||
string Type { get; }
|
|
||||||
|
|
||||||
[JsonProperty("clientId", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
string ClientId { get; }
|
|
||||||
|
|
||||||
[JsonProperty("content", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
JToken Content { get; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Defines the contract for IMobileControlRoomMessenger
|
|
||||||
/// </summary>
|
|
||||||
public interface IMobileControlRoomMessenger : IKeyed
|
|
||||||
{
|
|
||||||
event EventHandler<EventArgs> UserCodeChanged;
|
|
||||||
|
|
||||||
event EventHandler<EventArgs> UserPromptedForCode;
|
|
||||||
|
|
||||||
event EventHandler<EventArgs> ClientJoined;
|
|
||||||
|
|
||||||
event EventHandler<EventArgs> AppUrlChanged;
|
|
||||||
|
|
||||||
string UserCode { get; }
|
|
||||||
|
|
||||||
string QrCodeUrl { get; }
|
|
||||||
|
|
||||||
string QrCodeChecksum { get; }
|
|
||||||
|
|
||||||
string McServerUrl { get; }
|
|
||||||
|
|
||||||
string RoomName { get; }
|
|
||||||
|
|
||||||
string AppUrl { get; }
|
|
||||||
|
|
||||||
void UpdateAppUrl(string url);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Defines the contract for IMobileControlAction
|
|
||||||
/// </summary>
|
|
||||||
public interface IMobileControlAction
|
|
||||||
{
|
|
||||||
IMobileControlMessenger Messenger { get; }
|
|
||||||
|
|
||||||
Action<string, string, JToken> Action { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Defines the contract for IMobileControlTouchpanelController
|
|
||||||
/// </summary>
|
|
||||||
public interface IMobileControlTouchpanelController : IKeyed
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The default room key for the controller
|
|
||||||
/// </summary>
|
|
||||||
string DefaultRoomKey { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the application URL for the controller
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="url">The application URL</param>
|
|
||||||
void SetAppUrl(string url);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Indicates whether the controller uses a direct server connection
|
|
||||||
/// </summary>
|
|
||||||
bool UseDirectServer { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Indicates whether the controller is a Zoom Room controller
|
|
||||||
/// </summary>
|
|
||||||
bool ZoomRoomController { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Describes a MobileControl Crestron Touchpanel Controller
|
|
||||||
/// This interface extends the IMobileControlTouchpanelController to include connected IP information
|
|
||||||
/// </summary>
|
|
||||||
public interface IMobileControlCrestronTouchpanelController : IMobileControlTouchpanelController
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a collection of connected IP information for the touchpanel controller
|
|
||||||
/// </summary>
|
|
||||||
ReadOnlyCollection<ConnectedIpInformation> ConnectedIps { get; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the contract for IMobileControlAction
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControlAction
|
||||||
|
{
|
||||||
|
IMobileControlMessenger Messenger { get; }
|
||||||
|
|
||||||
|
Action<string, string, JToken> Action { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using Crestron.SimplSharpPro;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Describes a MobileControl Crestron Touchpanel Controller
|
||||||
|
/// This interface extends the IMobileControlTouchpanelController to include connected IP information
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControlCrestronTouchpanelController : IMobileControlTouchpanelController
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a collection of connected IP information for the touchpanel controller
|
||||||
|
/// </summary>
|
||||||
|
ReadOnlyCollection<ConnectedIpInformation> ConnectedIps { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
public interface IMobileControlMessage
|
||||||
|
{
|
||||||
|
[JsonProperty("type")]
|
||||||
|
string Type { get; }
|
||||||
|
|
||||||
|
[JsonProperty("clientId", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
string ClientId { get; }
|
||||||
|
|
||||||
|
[JsonProperty("content", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
JToken Content { get; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the contract for IMobileControlMessenger
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControlMessenger : IKeyed
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Parent controller for this messenger
|
||||||
|
/// </summary>
|
||||||
|
IMobileControl AppServerController { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Path to listen for messages
|
||||||
|
/// </summary>
|
||||||
|
string MessagePath { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Key of the device this messenger is associated with
|
||||||
|
/// </summary>
|
||||||
|
string DeviceKey { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register this messenger with the AppServerController
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="appServerController"></param>
|
||||||
|
void RegisterWithAppServer(IMobileControl appServerController);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the contract for IMobileControlMessenger
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControlMessengerWithSubscriptions : IMobileControlMessenger
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Unsubscribe a client from this messenger
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="clientId"></param>
|
||||||
|
void UnsubscribeClient(string clientId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register this messenger with the AppServerController
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="appServerController">parent for this messenger</param>
|
||||||
|
/// <param name="enableMessengerSubscriptions">Enable messenger subscriptions</param>
|
||||||
|
void RegisterWithAppServer(IMobileControl appServerController, bool enableMessengerSubscriptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the contract for IMobileControlRoomMessenger
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControlRoomMessenger : IKeyed
|
||||||
|
{
|
||||||
|
event EventHandler<EventArgs> UserCodeChanged;
|
||||||
|
|
||||||
|
event EventHandler<EventArgs> UserPromptedForCode;
|
||||||
|
|
||||||
|
event EventHandler<EventArgs> ClientJoined;
|
||||||
|
|
||||||
|
event EventHandler<EventArgs> AppUrlChanged;
|
||||||
|
|
||||||
|
string UserCode { get; }
|
||||||
|
|
||||||
|
string QrCodeUrl { get; }
|
||||||
|
|
||||||
|
string QrCodeChecksum { get; }
|
||||||
|
|
||||||
|
string McServerUrl { get; }
|
||||||
|
|
||||||
|
string RoomName { get; }
|
||||||
|
|
||||||
|
string AppUrl { get; }
|
||||||
|
|
||||||
|
void UpdateAppUrl(string url);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Defines the contract for IMobileControlTouchpanelController
|
||||||
|
/// </summary>
|
||||||
|
public interface IMobileControlTouchpanelController : IKeyed
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The default room key for the controller
|
||||||
|
/// </summary>
|
||||||
|
string DefaultRoomKey { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the application URL for the controller
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="url">The application URL</param>
|
||||||
|
void SetAppUrl(string url);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates whether the controller uses a direct server connection
|
||||||
|
/// </summary>
|
||||||
|
bool UseDirectServer { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates whether the controller is a Zoom Room controller
|
||||||
|
/// </summary>
|
||||||
|
bool ZoomRoomController { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using Newtonsoft.Json.Linq;
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -29,12 +29,16 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
codec.CallStatusChange += Codec_CallStatusChange;
|
codec.CallStatusChange += Codec_CallStatusChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
|
|
||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendAtcFullMessageObject());
|
AddAction("/fullStatus", (id, content) => SendAtcFullMessageObject(id));
|
||||||
|
|
||||||
|
AddAction("/audioDialerStatus", (id, content) => SendAtcFullMessageObject(id));
|
||||||
|
|
||||||
AddAction("/dial", (id, content) =>
|
AddAction("/dial", (id, content) =>
|
||||||
{
|
{
|
||||||
var msg = content.ToObject<MobileControlSimpleContent<string>>();
|
var msg = content.ToObject<MobileControlSimpleContent<string>>();
|
||||||
@@ -97,7 +101,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// Helper method to build call status for vtc
|
/// Helper method to build call status for vtc
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private void SendAtcFullMessageObject()
|
private void SendAtcFullMessageObject(string id = null)
|
||||||
{
|
{
|
||||||
var info = Codec.CodecInfo;
|
var info = Codec.CodecInfo;
|
||||||
|
|
||||||
@@ -109,7 +113,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
phoneNumber = info.PhoneNumber
|
phoneNumber = info.PhoneNumber
|
||||||
}
|
}
|
||||||
})
|
}), id
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendCameraFullMessageObject());
|
AddAction("/fullStatus", (id, content) => SendCameraFullMessageObject(id));
|
||||||
|
|
||||||
|
AddAction("/cameraStatus", (id, content) => SendCameraFullMessageObject(id));
|
||||||
|
|
||||||
|
|
||||||
if (Camera is IHasCameraPtzControl ptzCamera)
|
if (Camera is IHasCameraPtzControl ptzCamera)
|
||||||
@@ -173,7 +175,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper method to update the full status of the camera
|
/// Helper method to update the full status of the camera
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void SendCameraFullMessageObject()
|
private void SendCameraFullMessageObject(string id = null)
|
||||||
{
|
{
|
||||||
var presetList = new List<CameraPreset>();
|
var presetList = new List<CameraPreset>();
|
||||||
|
|
||||||
@@ -188,7 +190,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
cameraMode = GetCameraMode(),
|
cameraMode = GetCameraMode(),
|
||||||
hasPresets = Camera is IHasCameraPresets,
|
hasPresets = Camera is IHasCameraPresets,
|
||||||
presets = presetList
|
presets = presetList
|
||||||
})
|
}), id
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,16 +33,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) =>
|
AddAction("/fullStatus", (id, content) => SendCurrentSourceStatus(id));
|
||||||
{
|
|
||||||
var message = new CurrentSourcesStateMessage
|
|
||||||
{
|
|
||||||
CurrentSourceKeys = sourceDevice.CurrentSourceKeys,
|
|
||||||
CurrentSources = sourceDevice.CurrentSources
|
|
||||||
};
|
|
||||||
|
|
||||||
PostStatusMessage(message);
|
AddAction("/currentSourceStatus", (id, content) => SendCurrentSourceStatus(id));
|
||||||
});
|
|
||||||
|
|
||||||
sourceDevice.CurrentSourcesChanged += (sender, e) =>
|
sourceDevice.CurrentSourcesChanged += (sender, e) =>
|
||||||
{
|
{
|
||||||
@@ -53,6 +46,17 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SendCurrentSourceStatus(string id = null)
|
||||||
|
{
|
||||||
|
var message = new CurrentSourcesStateMessage
|
||||||
|
{
|
||||||
|
CurrentSourceKeys = sourceDevice.CurrentSourceKeys,
|
||||||
|
CurrentSources = sourceDevice.CurrentSources
|
||||||
|
};
|
||||||
|
|
||||||
|
PostStatusMessage(message, id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Base class for event messages that include the type of message and an event type
|
||||||
|
/// </summary>
|
||||||
|
public abstract class DeviceEventMessageBase : DeviceMessageBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The event type
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("eventType")]
|
||||||
|
public string EventType { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using Newtonsoft.Json;
|
using System.Timers;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.DeviceInfo;
|
using PepperDash.Essentials.Core.DeviceInfo;
|
||||||
using System.Timers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -67,13 +67,20 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
debounceTimer.Start();
|
debounceTimer.Start();
|
||||||
};
|
};
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, context) => PostStatusMessage(new DeviceInfoStateMessage
|
AddAction("/fullStatus", (id, context) => SendFullStatus(id));
|
||||||
{
|
|
||||||
DeviceInfo = _deviceInfoProvider.DeviceInfo
|
AddAction("/deviceInfo", (id, content) => SendFullStatus(id));
|
||||||
}));
|
|
||||||
|
|
||||||
AddAction("/update", (id, context) => _deviceInfoProvider.UpdateDeviceInfo());
|
AddAction("/update", (id, context) => _deviceInfoProvider.UpdateDeviceInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SendFullStatus(string id = null)
|
||||||
|
{
|
||||||
|
PostStatusMessage(new DeviceInfoStateMessage
|
||||||
|
{
|
||||||
|
DeviceInfo = _deviceInfoProvider.DeviceInfo
|
||||||
|
}, id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Base class for device messages that include the type of message
|
||||||
|
/// </summary>
|
||||||
|
public abstract class DeviceMessageBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The device key
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("key")]
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Key
|
||||||
|
/// </summary>
|
||||||
|
public string Key { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The device name
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The type of the message class
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("messageType")]
|
||||||
|
public string MessageType => GetType().Name;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the MessageBasePath
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("messageBasePath")]
|
||||||
|
|
||||||
|
public string MessageBasePath { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Logging;
|
using PepperDash.Core.Logging;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using PepperDash.Essentials.Core.Presets;
|
using PepperDash.Essentials.Core.Presets;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -16,18 +16,24 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
private readonly ITvPresetsProvider _presetsDevice;
|
private readonly ITvPresetsProvider _presetsDevice;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for DevicePresetsModelMessenger
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key.</param>
|
||||||
|
/// <param name="messagePath">The message path.</param>
|
||||||
|
/// <param name="presetsDevice">The presets device.</param>
|
||||||
public DevicePresetsModelMessenger(string key, string messagePath, ITvPresetsProvider presetsDevice)
|
public DevicePresetsModelMessenger(string key, string messagePath, ITvPresetsProvider presetsDevice)
|
||||||
: base(key, messagePath, presetsDevice as Device)
|
: base(key, messagePath, presetsDevice as Device)
|
||||||
{
|
{
|
||||||
_presetsDevice = presetsDevice;
|
_presetsDevice = presetsDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendPresets()
|
private void SendPresets(string id = null)
|
||||||
{
|
{
|
||||||
PostStatusMessage(new PresetStateMessage
|
PostStatusMessage(new PresetStateMessage
|
||||||
{
|
{
|
||||||
Favorites = _presetsDevice.TvPresets.PresetsList
|
Favorites = _presetsDevice.TvPresets.PresetsList
|
||||||
});
|
}, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RecallPreset(ISetTopBoxNumericKeypad device, string channel)
|
private void RecallPreset(ISetTopBoxNumericKeypad device, string channel)
|
||||||
@@ -43,6 +49,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
#region Overrides of MessengerBase
|
#region Overrides of MessengerBase
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
|
|
||||||
{
|
{
|
||||||
@@ -51,7 +58,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
this.LogInformation("getting full status for client {id}", id);
|
this.LogInformation("getting full status for client {id}", id);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
SendPresets();
|
SendPresets(id);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -59,6 +66,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
AddAction("/presetsStatus", (id, content) => SendPresets(id));
|
||||||
|
|
||||||
AddAction("/recall", (id, content) =>
|
AddAction("/recall", (id, content) =>
|
||||||
{
|
{
|
||||||
var p = content.ToObject<PresetChannelMessage>();
|
var p = content.ToObject<PresetChannelMessage>();
|
||||||
@@ -91,16 +100,16 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class PresetChannelMessage
|
public class PresetChannelMessage
|
||||||
{
|
{
|
||||||
[JsonProperty("preset")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Preset
|
/// Gets or sets the Preset
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("preset")]
|
||||||
public PresetChannel Preset;
|
public PresetChannel Preset;
|
||||||
|
|
||||||
[JsonProperty("deviceKey")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the DeviceKey
|
/// Gets or sets the DeviceKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("deviceKey")]
|
||||||
public string DeviceKey;
|
public string DeviceKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,10 +118,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class PresetStateMessage : DeviceStateMessageBase
|
public class PresetStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("favorites", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Favorites
|
/// Gets or sets the Favorites
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("favorites", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<PresetChannel> Favorites { get; set; } = new List<PresetChannel>();
|
public List<PresetChannel> Favorites { get; set; } = new List<PresetChannel>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a DeviceStateMessageBase
|
||||||
|
/// </summary>
|
||||||
|
public class DeviceStateMessageBase : DeviceMessageBase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The interfaces implmented by the device sending the messsage
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("interfaces")]
|
||||||
|
public List<string> Interfaces { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the interfaces implemented by the device sending the message
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="interfaces"></param>
|
||||||
|
public void SetInterfaces(List<string> interfaces)
|
||||||
|
{
|
||||||
|
Interfaces = interfaces;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -62,7 +62,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
#region Overrides of MessengerBase
|
#region Overrides of MessengerBase
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
AddAction("/volumeUp", (id, content) => PressAndHoldHandler.HandlePressAndHold(DeviceKey, content, (b) =>
|
AddAction("/volumeUp", (id, content) => PressAndHoldHandler.HandlePressAndHold(DeviceKey, content, (b) =>
|
||||||
|
|||||||
@@ -7,22 +7,29 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class GenericMessenger : MessengerBase
|
public class GenericMessenger : MessengerBase
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="GenericMessenger"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key.</param>
|
||||||
|
/// <param name="device">The device.</param>
|
||||||
|
/// <param name="messagePath">The message path.</param>
|
||||||
public GenericMessenger(string key, EssentialsDevice device, string messagePath) : base(key, messagePath, device)
|
public GenericMessenger(string key, EssentialsDevice device, string messagePath) : base(key, messagePath, device)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var state = new DeviceStateMessageBase();
|
var state = new DeviceStateMessageBase();
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using Newtonsoft.Json;
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -13,6 +13,12 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
private readonly IBasicVideoMuteWithFeedback device;
|
private readonly IBasicVideoMuteWithFeedback device;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="IBasicVideoMuteWithFeedbackMessenger"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="messagePath"></param>
|
||||||
|
/// <param name="device"></param>
|
||||||
public IBasicVideoMuteWithFeedbackMessenger(string key, string messagePath, IBasicVideoMuteWithFeedback device)
|
public IBasicVideoMuteWithFeedbackMessenger(string key, string messagePath, IBasicVideoMuteWithFeedback device)
|
||||||
: base(key, messagePath, device as IKeyName)
|
: base(key, messagePath, device as IKeyName)
|
||||||
{
|
{
|
||||||
@@ -22,21 +28,24 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// SendFullStatus method
|
/// SendFullStatus method
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendFullStatus()
|
public void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var messageObj = new IBasicVideoMuteWithFeedbackMessage
|
var messageObj = new IBasicVideoMuteWithFeedbackMessage
|
||||||
{
|
{
|
||||||
VideoMuteState = device.VideoMuteIsOn.BoolValue
|
VideoMuteState = device.VideoMuteIsOn.BoolValue
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(messageObj);
|
PostStatusMessage(messageObj, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction("/videoMuteStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
AddAction("/videoMuteToggle", (id, content) =>
|
AddAction("/videoMuteToggle", (id, content) =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,14 +24,12 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
AddAction("/fullStatus", (id, content) =>
|
AddAction("/fullStatus", (id, content) =>
|
||||||
{
|
{
|
||||||
PostStatusMessage(new CommunicationMonitorState
|
SendFullStatus(id);
|
||||||
{
|
});
|
||||||
CommunicationMonitor = new CommunicationMonitorProps
|
|
||||||
{
|
AddAction("/commStatus", (id, content) =>
|
||||||
IsOnline = _communicationMonitor.CommunicationMonitor.IsOnline,
|
{
|
||||||
Status = _communicationMonitor.CommunicationMonitor.Status
|
SendFullStatus(id);
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
_communicationMonitor.CommunicationMonitor.StatusChange += (sender, args) =>
|
_communicationMonitor.CommunicationMonitor.StatusChange += (sender, args) =>
|
||||||
@@ -46,6 +44,18 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SendFullStatus(string id = null)
|
||||||
|
{
|
||||||
|
PostStatusMessage(new CommunicationMonitorState
|
||||||
|
{
|
||||||
|
CommunicationMonitor = new CommunicationMonitorProps
|
||||||
|
{
|
||||||
|
IsOnline = _communicationMonitor.CommunicationMonitor.IsOnline,
|
||||||
|
Status = _communicationMonitor.CommunicationMonitor.Status
|
||||||
|
},
|
||||||
|
}, id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Newtonsoft.Json;
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -22,15 +22,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) =>
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
{
|
|
||||||
var message = new IHasDspPresetsStateMessage
|
|
||||||
{
|
|
||||||
Presets = device.Presets
|
|
||||||
};
|
|
||||||
|
|
||||||
PostStatusMessage(message);
|
AddAction("/dspPresetStatus", (id, content) => SendFullStatus(id));
|
||||||
});
|
|
||||||
|
|
||||||
AddAction("/recallPreset", (id, content) =>
|
AddAction("/recallPreset", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -43,6 +37,16 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SendFullStatus(string id = null)
|
||||||
|
{
|
||||||
|
var message = new IHasDspPresetsStateMessage
|
||||||
|
{
|
||||||
|
Presets = device.Presets
|
||||||
|
};
|
||||||
|
|
||||||
|
PostStatusMessage(message, id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Logging;
|
using PepperDash.Core.Logging;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -46,7 +46,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// partition states.</remarks>
|
/// partition states.</remarks>
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction("/combinerStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
AddAction("/setAutoMode", (id, content) =>
|
AddAction("/setAutoMode", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -120,7 +122,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -141,7 +143,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
Partitions = _roomCombiner.Partitions
|
Partitions = _roomCombiner.Partitions
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(message);
|
PostStatusMessage(message, id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using PepperDash.Essentials.Devices.Common.Cameras;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using PepperDash.Essentials.Devices.Common.Cameras;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -26,7 +26,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// <param name="cameraController"></param>
|
/// <param name="cameraController"></param>
|
||||||
/// <param name="messagePath"></param>
|
/// <param name="messagePath"></param>
|
||||||
/// <exception cref="ArgumentNullException"></exception>
|
/// <exception cref="ArgumentNullException"></exception>
|
||||||
public IHasCamerasMessenger(string key, string messagePath , IHasCameras cameraController)
|
public IHasCamerasMessenger(string key, string messagePath, IHasCameras cameraController)
|
||||||
: base(key, messagePath, cameraController)
|
: base(key, messagePath, cameraController)
|
||||||
{
|
{
|
||||||
CameraController = cameraController ?? throw new ArgumentNullException("cameraController");
|
CameraController = cameraController ?? throw new ArgumentNullException("cameraController");
|
||||||
@@ -49,10 +49,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, context) =>
|
AddAction("/fullStatus", (id, context) => SendFullStatus(id));
|
||||||
{
|
|
||||||
SendFullStatus(id);
|
AddAction("/cameraListStatus", (id, content) => SendFullStatus(id));
|
||||||
});
|
|
||||||
|
|
||||||
AddAction("/selectCamera", (id, content) =>
|
AddAction("/selectCamera", (id, content) =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
public class IHasCurrentSourceInfoMessenger : MessengerBase
|
public class IHasCurrentSourceInfoMessenger : MessengerBase
|
||||||
{
|
{
|
||||||
private readonly IHasCurrentSourceInfoChange sourceDevice;
|
private readonly IHasCurrentSourceInfoChange sourceDevice;
|
||||||
|
|
||||||
public IHasCurrentSourceInfoMessenger(string key, string messagePath, IHasCurrentSourceInfoChange device) : base(key, messagePath, device as IKeyName)
|
public IHasCurrentSourceInfoMessenger(string key, string messagePath, IHasCurrentSourceInfoChange device) : base(key, messagePath, device as IKeyName)
|
||||||
{
|
{
|
||||||
sourceDevice = device;
|
sourceDevice = device;
|
||||||
@@ -20,16 +21,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) =>
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
{
|
|
||||||
var message = new CurrentSourceStateMessage
|
|
||||||
{
|
|
||||||
CurrentSourceKey = sourceDevice.CurrentSourceInfoKey,
|
|
||||||
CurrentSource = sourceDevice.CurrentSourceInfo
|
|
||||||
};
|
|
||||||
|
|
||||||
PostStatusMessage(message);
|
AddAction("/currentSourceInfoStatus", (id, content) => SendFullStatus(id));
|
||||||
});
|
|
||||||
|
|
||||||
sourceDevice.CurrentSourceChange += (sender, e) =>
|
sourceDevice.CurrentSourceChange += (sender, e) =>
|
||||||
{
|
{
|
||||||
@@ -47,6 +41,17 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SendFullStatus(string id = null)
|
||||||
|
{
|
||||||
|
var message = new CurrentSourceStateMessage
|
||||||
|
{
|
||||||
|
CurrentSourceKey = sourceDevice.CurrentSourceInfoKey,
|
||||||
|
CurrentSource = sourceDevice.CurrentSourceInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
PostStatusMessage(message, id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Logging;
|
using PepperDash.Core.Logging;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -11,8 +11,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// Represents a IHasInputsMessenger
|
/// Represents a IHasInputsMessenger
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class IHasInputsMessenger<TKey> : MessengerBase
|
public class IHasInputsMessenger<TKey> : MessengerBase
|
||||||
{
|
{
|
||||||
private readonly IHasInputs<TKey> itemDevice;
|
private readonly IHasInputs<TKey> itemDevice;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -23,17 +23,16 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// <param name="device"></param>
|
/// <param name="device"></param>
|
||||||
public IHasInputsMessenger(string key, string messagePath, IHasInputs<TKey> device) : base(key, messagePath, device)
|
public IHasInputsMessenger(string key, string messagePath, IHasInputs<TKey> device) : base(key, messagePath, device)
|
||||||
{
|
{
|
||||||
itemDevice = device;
|
itemDevice = device;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, context) =>
|
AddAction("/fullStatus", (id, context) => SendFullStatus(id));
|
||||||
{
|
|
||||||
SendFullStatus();
|
AddAction("/inputStatus", (id, content) => SendFullStatus(id));
|
||||||
});
|
|
||||||
|
|
||||||
itemDevice.Inputs.ItemsUpdated += (sender, args) =>
|
itemDevice.Inputs.ItemsUpdated += (sender, args) =>
|
||||||
{
|
{
|
||||||
@@ -62,7 +61,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -77,7 +76,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(stateObject);
|
PostStatusMessage(stateObject, id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,6 +12,12 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
private readonly IHasPowerControlWithFeedback _powerControl;
|
private readonly IHasPowerControlWithFeedback _powerControl;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="IHasPowerControlWithFeedbackMessenger"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key.</param>
|
||||||
|
/// <param name="messagePath">The message path.</param>
|
||||||
|
/// <param name="powerControl">The power control device</param>
|
||||||
public IHasPowerControlWithFeedbackMessenger(string key, string messagePath, IHasPowerControlWithFeedback powerControl)
|
public IHasPowerControlWithFeedbackMessenger(string key, string messagePath, IHasPowerControlWithFeedback powerControl)
|
||||||
: base(key, messagePath, powerControl as IKeyName)
|
: base(key, messagePath, powerControl as IKeyName)
|
||||||
{
|
{
|
||||||
@@ -21,21 +27,24 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// SendFullStatus method
|
/// SendFullStatus method
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendFullStatus()
|
public void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var messageObj = new PowerControlWithFeedbackStateMessage
|
var messageObj = new PowerControlWithFeedbackStateMessage
|
||||||
{
|
{
|
||||||
PowerState = _powerControl.PowerIsOnFeedback.BoolValue
|
PowerState = _powerControl.PowerIsOnFeedback.BoolValue
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(messageObj);
|
PostStatusMessage(messageObj, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction("/powerStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
_powerControl.PowerIsOnFeedback.OutputChange += PowerIsOnFeedback_OutputChange; ;
|
_powerControl.PowerIsOnFeedback.OutputChange += PowerIsOnFeedback_OutputChange; ;
|
||||||
}
|
}
|
||||||
@@ -55,6 +64,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class PowerControlWithFeedbackStateMessage : DeviceStateMessageBase
|
public class PowerControlWithFeedbackStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Power State
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("powerState", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("powerState", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? PowerState { get; set; }
|
public bool? PowerState { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -27,7 +27,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
AddAction("/schedule/fullStatus", (id, content) => SendFullScheduleObject());
|
AddAction("/schedule/fullStatus", (id, content) => SendFullScheduleObject(id));
|
||||||
|
|
||||||
|
AddAction("/schedule/status", (id, content) => SendFullScheduleObject(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CodecSchedule_MeetingEventChange(object sender, MeetingEventArgs e)
|
private void CodecSchedule_MeetingEventChange(object sender, MeetingEventArgs e)
|
||||||
@@ -51,13 +53,13 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper method to send the full schedule data
|
/// Helper method to send the full schedule data
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void SendFullScheduleObject()
|
private void SendFullScheduleObject(string id = null)
|
||||||
{
|
{
|
||||||
PostStatusMessage(new FullScheduleMessage
|
PostStatusMessage(new FullScheduleMessage
|
||||||
{
|
{
|
||||||
Meetings = ScheduleSource.CodecSchedule.Meetings,
|
Meetings = ScheduleSource.CodecSchedule.Meetings,
|
||||||
MeetingWarningMinutes = ScheduleSource.CodecSchedule.MeetingWarningMinutes
|
MeetingWarningMinutes = ScheduleSource.CodecSchedule.MeetingWarningMinutes
|
||||||
});
|
}, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,16 +68,18 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class FullScheduleMessage : DeviceStateMessageBase
|
public class FullScheduleMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("meetings", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Meetings
|
/// Gets or sets the Meetings
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("meetings", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<Meeting> Meetings { get; set; }
|
public List<Meeting> Meetings { get; set; }
|
||||||
|
|
||||||
[JsonProperty("meetingWarningMinutes", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the MeetingWarningMinutes
|
/// Gets or sets the MeetingWarningMinutes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("meetingWarningMinutes", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public int MeetingWarningMinutes { get; set; }
|
public int MeetingWarningMinutes { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,10 +88,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class MeetingChangeMessage
|
public class MeetingChangeMessage
|
||||||
{
|
{
|
||||||
[JsonProperty("meetingChange", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the MeetingChange
|
/// Gets or sets the MeetingChange
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("meetingChange", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public MeetingChange MeetingChange { get; set; }
|
public MeetingChange MeetingChange { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,16 +101,18 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class MeetingChange
|
public class MeetingChange
|
||||||
{
|
{
|
||||||
[JsonProperty("changeType", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the ChangeType
|
/// Gets or sets the ChangeType
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("changeType", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string ChangeType { get; set; }
|
public string ChangeType { get; set; }
|
||||||
|
|
||||||
[JsonProperty("meeting", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Meeting
|
/// Gets or sets the Meeting
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("meeting", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Meeting Meeting { get; set; }
|
public Meeting Meeting { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -22,19 +22,21 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction("/humidityStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
device.HumidityFeedback.OutputChange += new EventHandler<Core.FeedbackEventArgs>((o, a) => SendFullStatus());
|
device.HumidityFeedback.OutputChange += new EventHandler<Core.FeedbackEventArgs>((o, a) => SendFullStatus());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var state = new IHumiditySensorStateMessage
|
var state = new IHumiditySensorStateMessage
|
||||||
{
|
{
|
||||||
Humidity = string.Format("{0}%", device.HumidityFeedback.UShortValue)
|
Humidity = string.Format("{0}%", device.HumidityFeedback.UShortValue)
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -43,10 +45,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class IHumiditySensorStateMessage : DeviceStateMessageBase
|
public class IHumiditySensorStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("humidity")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Humidity
|
/// Gets or sets the Humidity
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("humidity")]
|
||||||
public string Humidity { get; set; }
|
public string Humidity { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
using Newtonsoft.Json;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -13,6 +13,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
public class ILevelControlsMessenger : MessengerBase
|
public class ILevelControlsMessenger : MessengerBase
|
||||||
{
|
{
|
||||||
private ILevelControls levelControlsDevice;
|
private ILevelControls levelControlsDevice;
|
||||||
|
|
||||||
public ILevelControlsMessenger(string key, string messagePath, ILevelControls device) : base(key, messagePath, device as IKeyName)
|
public ILevelControlsMessenger(string key, string messagePath, ILevelControls device) : base(key, messagePath, device as IKeyName)
|
||||||
{
|
{
|
||||||
levelControlsDevice = device;
|
levelControlsDevice = device;
|
||||||
@@ -22,15 +23,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, context) =>
|
AddAction("/fullStatus", (id, context) => SendFullStatus(id));
|
||||||
{
|
|
||||||
var message = new LevelControlStateMessage
|
|
||||||
{
|
|
||||||
Levels = levelControlsDevice.LevelControlPoints.ToDictionary(kv => kv.Key, kv => new Volume { Level = kv.Value.VolumeLevelFeedback.IntValue, Muted = kv.Value.MuteFeedback.BoolValue })
|
|
||||||
};
|
|
||||||
|
|
||||||
PostStatusMessage(message);
|
AddAction("/levelStats", (id, content) => SendFullStatus(id));
|
||||||
});
|
|
||||||
|
|
||||||
foreach (var levelControl in levelControlsDevice.LevelControlPoints)
|
foreach (var levelControl in levelControlsDevice.LevelControlPoints)
|
||||||
{
|
{
|
||||||
@@ -75,6 +70,16 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SendFullStatus(string id = null)
|
||||||
|
{
|
||||||
|
var message = new LevelControlStateMessage
|
||||||
|
{
|
||||||
|
Levels = levelControlsDevice.LevelControlPoints.ToDictionary(kv => kv.Key, kv => new Volume { Level = kv.Value.VolumeLevelFeedback.IntValue, Muted = kv.Value.MuteFeedback.BoolValue })
|
||||||
|
};
|
||||||
|
|
||||||
|
PostStatusMessage(message, id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Routing;
|
using PepperDash.Essentials.Core.Routing;
|
||||||
using Serilog.Events;
|
using Serilog.Events;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -25,25 +25,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) =>
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Debug.LogMessage(LogEventLevel.Verbose, "InputCount: {inputCount}, OutputCount: {outputCount}", this, matrixDevice.InputSlots.Count, matrixDevice.OutputSlots.Count);
|
|
||||||
var message = new MatrixStateMessage
|
|
||||||
{
|
|
||||||
Outputs = matrixDevice.OutputSlots.ToDictionary(kvp => kvp.Key, kvp => new RoutingOutput(kvp.Value)),
|
|
||||||
Inputs = matrixDevice.InputSlots.ToDictionary(kvp => kvp.Key, kvp => new RoutingInput(kvp.Value)),
|
|
||||||
};
|
|
||||||
|
|
||||||
|
AddAction("/matrixStatus", (id, content) => SendFullStatus(id));
|
||||||
PostStatusMessage(message);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.LogMessage(e, "Exception Getting full status: {@exception}", this, e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
AddAction("/route", (id, content) =>
|
AddAction("/route", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -80,6 +64,26 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SendFullStatus(string id = null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Debug.LogMessage(LogEventLevel.Verbose, "InputCount: {inputCount}, OutputCount: {outputCount}", this, matrixDevice.InputSlots.Count, matrixDevice.OutputSlots.Count);
|
||||||
|
var message = new MatrixStateMessage
|
||||||
|
{
|
||||||
|
Outputs = matrixDevice.OutputSlots.ToDictionary(kvp => kvp.Key, kvp => new RoutingOutput(kvp.Value)),
|
||||||
|
Inputs = matrixDevice.InputSlots.ToDictionary(kvp => kvp.Key, kvp => new RoutingInput(kvp.Value)),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
PostStatusMessage(message, id);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.LogMessage(e, "Exception Getting full status: {@exception}", this, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Converters;
|
using Newtonsoft.Json.Converters;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -14,17 +14,28 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
private readonly IProjectorScreenLiftControl device;
|
private readonly IProjectorScreenLiftControl device;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="IProjectorScreenLiftControlMessenger"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">message key</param>
|
||||||
|
/// <param name="messagePath">message path</param>
|
||||||
|
/// <param name="screenLiftDevice">screen lift device</param>
|
||||||
public IProjectorScreenLiftControlMessenger(string key, string messagePath, IProjectorScreenLiftControl screenLiftDevice)
|
public IProjectorScreenLiftControlMessenger(string key, string messagePath, IProjectorScreenLiftControl screenLiftDevice)
|
||||||
: base(key, messagePath, screenLiftDevice as IKeyName)
|
: base(key, messagePath, screenLiftDevice as IKeyName)
|
||||||
{
|
{
|
||||||
device = screenLiftDevice;
|
device = screenLiftDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Registers the actions for the messenger.
|
||||||
|
/// </summary>
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction("/screenliftStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
AddAction("/raise", (id, content) =>
|
AddAction("/raise", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -53,7 +64,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
PostStatusMessage(JToken.FromObject(state));
|
PostStatusMessage(JToken.FromObject(state));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var state = new ScreenLiftStateMessage
|
var state = new ScreenLiftStateMessage
|
||||||
{
|
{
|
||||||
@@ -62,7 +73,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
DisplayDeviceKey = device.DisplayDeviceKey
|
DisplayDeviceKey = device.DisplayDeviceKey
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,20 +82,23 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ScreenLiftStateMessage : DeviceStateMessageBase
|
public class ScreenLiftStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the InUpPosition
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("inUpPosition", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("inUpPosition", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? InUpPosition { get; set; }
|
public bool? InUpPosition { get; set; }
|
||||||
|
|
||||||
[JsonProperty("displayDeviceKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the DisplayDeviceKey
|
/// Gets or sets the DisplayDeviceKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("displayDeviceKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string DisplayDeviceKey { get; set; }
|
public string DisplayDeviceKey { get; set; }
|
||||||
|
|
||||||
[JsonConverter(typeof(StringEnumConverter))]
|
|
||||||
[JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Type
|
/// Gets or sets the Type
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonConverter(typeof(StringEnumConverter))]
|
||||||
|
[JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public eScreenLiftControlType Type { get; set; }
|
public eScreenLiftControlType Type { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Logging;
|
using PepperDash.Core.Logging;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using System;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
@@ -36,7 +36,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
AddAction("/fullStatus", (id, content) => SendRoutingFullMessageObject());
|
AddAction("/fullStatus", (id, content) => SendRoutingFullMessageObject(id));
|
||||||
|
|
||||||
|
AddAction("/routingStatus", (id, content) => SendRoutingFullMessageObject(id));
|
||||||
|
|
||||||
AddAction("/source", (id, content) =>
|
AddAction("/source", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -62,7 +64,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper method to update full status of the routing device
|
/// Helper method to update full status of the routing device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void SendRoutingFullMessageObject()
|
private void SendRoutingFullMessageObject(string id = null)
|
||||||
{
|
{
|
||||||
if (RoutingDevice is IRoutingSink sinkDevice)
|
if (RoutingDevice is IRoutingSink sinkDevice)
|
||||||
{
|
{
|
||||||
@@ -84,10 +86,10 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class RoutingStateMessage : DeviceStateMessageBase
|
public class RoutingStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("selectedSourceKey")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the SelectedSourceKey
|
/// Gets or sets the SelectedSourceKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("selectedSourceKey")]
|
||||||
public string SelectedSourceKey { get; set; }
|
public string SelectedSourceKey { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Logging;
|
using PepperDash.Core.Logging;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -11,7 +11,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// Represents a ISelectableItemsMessenger
|
/// Represents a ISelectableItemsMessenger
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ISelectableItemsMessenger<TKey> : MessengerBase
|
public class ISelectableItemsMessenger<TKey> : MessengerBase
|
||||||
{
|
{
|
||||||
private readonly ISelectableItems<TKey> itemDevice;
|
private readonly ISelectableItems<TKey> itemDevice;
|
||||||
|
|
||||||
private readonly string _propName;
|
private readonly string _propName;
|
||||||
@@ -34,9 +34,10 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, context) =>
|
AddAction("/fullStatus", (id, context) =>
|
||||||
{
|
SendFullStatus(id)
|
||||||
SendFullStatus();
|
);
|
||||||
});
|
|
||||||
|
AddAction("/itemsStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
itemDevice.ItemsUpdated += (sender, args) =>
|
itemDevice.ItemsUpdated += (sender, args) =>
|
||||||
{
|
{
|
||||||
@@ -65,7 +66,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -77,7 +78,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
CurrentItem = itemDevice.CurrentItem
|
CurrentItem = itemDevice.CurrentItem
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(stateObject);
|
PostStatusMessage(stateObject, id);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -91,13 +92,17 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ISelectableItemsStateMessage<TKey> : DeviceStateMessageBase
|
public class ISelectableItemsStateMessage<TKey> : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Items
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("items")]
|
[JsonProperty("items")]
|
||||||
public Dictionary<TKey, ISelectableItem> Items { get; set; }
|
public Dictionary<TKey, ISelectableItem> Items { get; set; }
|
||||||
|
|
||||||
[JsonProperty("currentItem")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the CurrentItem
|
/// Gets or sets the CurrentItem
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("currentItem")]
|
||||||
public TKey CurrentItem { get; set; }
|
public TKey CurrentItem { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,10 +20,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
AddAction("/status", (id, content) =>
|
AddAction("/status", (id, content) => SendFullStatus(id));
|
||||||
{
|
|
||||||
SendFullStatus();
|
AddAction("/shutdownPromptStatus", (id, content) => SendFullStatus(id));
|
||||||
});
|
|
||||||
|
|
||||||
AddAction("/setShutdownPromptSeconds", (id, content) =>
|
AddAction("/setShutdownPromptSeconds", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -68,7 +67,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var status = new IShutdownPromptTimerStateMessage
|
var status = new IShutdownPromptTimerStateMessage
|
||||||
{
|
{
|
||||||
@@ -77,7 +76,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
PercentageRemaining = _room.ShutdownPromptTimer.PercentFeedback.UShortValue
|
PercentageRemaining = _room.ShutdownPromptTimer.PercentFeedback.UShortValue
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(status);
|
PostStatusMessage(status, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,22 +86,22 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class IShutdownPromptTimerStateMessage : DeviceStateMessageBase
|
public class IShutdownPromptTimerStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("secondsRemaining")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the SecondsRemaining
|
/// Gets or sets the SecondsRemaining
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("secondsRemaining")]
|
||||||
public int SecondsRemaining { get; set; }
|
public int SecondsRemaining { get; set; }
|
||||||
|
|
||||||
[JsonProperty("percentageRemaining")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the PercentageRemaining
|
/// Gets or sets the PercentageRemaining
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("percentageRemaining")]
|
||||||
public int PercentageRemaining { get; set; }
|
public int PercentageRemaining { get; set; }
|
||||||
|
|
||||||
[JsonProperty("shutdownPromptSeconds")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the ShutdownPromptSeconds
|
/// Gets or sets the ShutdownPromptSeconds
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("shutdownPromptSeconds")]
|
||||||
public int ShutdownPromptSeconds { get; set; }
|
public int ShutdownPromptSeconds { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.CrestronIO;
|
using PepperDash.Essentials.Core.CrestronIO;
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -23,7 +23,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction("/switchedOutputStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
AddAction("/on", (id, content) =>
|
AddAction("/on", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -42,14 +44,14 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
device.OutputIsOnFeedback.OutputChange += new EventHandler<Core.FeedbackEventArgs>((o, a) => SendFullStatus());
|
device.OutputIsOnFeedback.OutputChange += new EventHandler<Core.FeedbackEventArgs>((o, a) => SendFullStatus());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var state = new ISwitchedOutputStateMessage
|
var state = new ISwitchedOutputStateMessage
|
||||||
{
|
{
|
||||||
IsOn = device.OutputIsOnFeedback.BoolValue
|
IsOn = device.OutputIsOnFeedback.BoolValue
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,10 +60,10 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ISwitchedOutputStateMessage : DeviceStateMessageBase
|
public class ISwitchedOutputStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("isOn")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the IsOn
|
/// Gets or sets the IsOn
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("isOn")]
|
||||||
public bool IsOn { get; set; }
|
public bool IsOn { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,10 +20,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
|
|
||||||
AddAction("/status", (id, content) =>
|
AddAction("/status", (id, content) => SendFullStatus(id));
|
||||||
{
|
|
||||||
SendFullStatus();
|
AddAction("/techPasswordStatus", (id, content) => SendFullStatus(id));
|
||||||
});
|
|
||||||
|
|
||||||
AddAction("/validateTechPassword", (id, content) =>
|
AddAction("/validateTechPassword", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -55,14 +54,14 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var status = new ITechPasswordStateMessage
|
var status = new ITechPasswordStateMessage
|
||||||
{
|
{
|
||||||
TechPasswordLength = _room.TechPasswordLength
|
TechPasswordLength = _room.TechPasswordLength
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(status);
|
PostStatusMessage(status, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -22,7 +22,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction("/temperatureStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
AddAction("/setTemperatureUnitsToCelcius", (id, content) =>
|
AddAction("/setTemperatureUnitsToCelcius", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -38,7 +40,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
device.TemperatureInCFeedback.OutputChange += new EventHandler<Core.FeedbackEventArgs>((o, a) => SendFullStatus());
|
device.TemperatureInCFeedback.OutputChange += new EventHandler<Core.FeedbackEventArgs>((o, a) => SendFullStatus());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
// format the temperature to a string with one decimal place
|
// format the temperature to a string with one decimal place
|
||||||
var tempString = string.Format("{0}.{1}", device.TemperatureFeedback.UShortValue / 10, device.TemperatureFeedback.UShortValue % 10);
|
var tempString = string.Format("{0}.{1}", device.TemperatureFeedback.UShortValue / 10, device.TemperatureFeedback.UShortValue % 10);
|
||||||
@@ -49,7 +51,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
TemperatureInCelsius = device.TemperatureInCFeedback.BoolValue
|
TemperatureInCelsius = device.TemperatureInCFeedback.BoolValue
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,16 +60,16 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ITemperatureSensorStateMessage : DeviceStateMessageBase
|
public class ITemperatureSensorStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("temperature")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Temperature
|
/// Gets or sets the Temperature
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("temperature")]
|
||||||
public string Temperature { get; set; }
|
public string Temperature { get; set; }
|
||||||
|
|
||||||
[JsonProperty("temperatureInCelsius")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the TemperatureInCelsius
|
/// Gets or sets the TemperatureInCelsius
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("temperatureInCelsius")]
|
||||||
public bool TemperatureInCelsius { get; set; }
|
public bool TemperatureInCelsius { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Lighting;
|
using PepperDash.Essentials.Core.Lighting;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -35,7 +35,9 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction("/lightingStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
AddAction("/selectScene", (id, content) =>
|
AddAction("/selectScene", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -43,14 +45,14 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
lightingScenesDevice.SelectScene(s);
|
lightingScenesDevice.SelectScene(s);
|
||||||
});
|
});
|
||||||
|
|
||||||
if(!(lightingScenesDevice is ILightingScenesDynamic lightingScenesDynamic))
|
if (!(lightingScenesDevice is ILightingScenesDynamic lightingScenesDynamic))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
lightingScenesDynamic.LightingScenesUpdated += (s, e) => SendFullStatus();
|
lightingScenesDynamic.LightingScenesUpdated += (s, e) => SendFullStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var state = new LightingBaseStateMessage
|
var state = new LightingBaseStateMessage
|
||||||
{
|
{
|
||||||
@@ -58,7 +60,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
CurrentLightingScene = lightingScenesDevice.CurrentLightingScene
|
CurrentLightingScene = lightingScenesDevice.CurrentLightingScene
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,16 +69,17 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class LightingBaseStateMessage : DeviceStateMessageBase
|
public class LightingBaseStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("scenes", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Scenes
|
/// Gets or sets the Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("scenes", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<LightingScene> Scenes { get; set; }
|
public List<LightingScene> Scenes { get; set; }
|
||||||
|
|
||||||
[JsonProperty("currentLightingScene", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the CurrentLightingScene
|
/// Gets or sets the CurrentLightingScene
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("currentLightingScene", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public LightingScene CurrentLightingScene { get; set; }
|
public LightingScene CurrentLightingScene { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,26 +1,45 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Crestron.SimplSharp.Net;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Logging;
|
using PepperDash.Core.Logging;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Provides a messaging bridge
|
/// Provides a messaging bridge
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class MessengerBase : EssentialsDevice, IMobileControlMessenger
|
public abstract class MessengerBase : EssentialsDevice, IMobileControlMessengerWithSubscriptions
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The device this messenger is associated with
|
||||||
|
/// </summary>
|
||||||
protected IKeyName _device;
|
protected IKeyName _device;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Enable subscriptions
|
||||||
|
/// </summary>
|
||||||
|
protected bool enableMessengerSubscriptions;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// List of clients subscribed to this messenger
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Unsoliciited feedback from a device in a messenger will ONLY be sent to devices in this subscription list. When a client disconnects, it's ID will be removed from the collection.
|
||||||
|
/// </remarks>
|
||||||
|
protected HashSet<string> SubscriberIds = new HashSet<string>();
|
||||||
|
|
||||||
private readonly List<string> _deviceInterfaces;
|
private readonly List<string> _deviceInterfaces;
|
||||||
|
|
||||||
private readonly Dictionary<string, Action<string, JToken>> _actions = new Dictionary<string, Action<string, JToken>>();
|
private readonly Dictionary<string, Action<string, JToken>> _actions = new Dictionary<string, Action<string, JToken>>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the DeviceKey
|
||||||
|
/// </summary>
|
||||||
public string DeviceKey => _device?.Key ?? "";
|
public string DeviceKey => _device?.Key ?? "";
|
||||||
|
|
||||||
|
|
||||||
@@ -50,6 +69,12 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
MessagePath = messagePath;
|
MessagePath = messagePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for a messenger associated with a device
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="messagePath"></param>
|
||||||
|
/// <param name="device"></param>
|
||||||
protected MessengerBase(string key, string messagePath, IKeyName device)
|
protected MessengerBase(string key, string messagePath, IKeyName device)
|
||||||
: this(key, messagePath)
|
: this(key, messagePath)
|
||||||
{
|
{
|
||||||
@@ -81,6 +106,21 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
RegisterActions();
|
RegisterActions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register this messenger with appserver controller
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="appServerController">Parent controller for this messenger</param>
|
||||||
|
/// <param name="enableMessengerSubscriptions">Enable subscriptions</param>
|
||||||
|
public void RegisterWithAppServer(IMobileControl appServerController, bool enableMessengerSubscriptions)
|
||||||
|
{
|
||||||
|
this.enableMessengerSubscriptions = enableMessengerSubscriptions;
|
||||||
|
AppServerController = appServerController ?? throw new ArgumentNullException("appServerController");
|
||||||
|
|
||||||
|
AppServerController.AddAction(this, HandleMessage);
|
||||||
|
|
||||||
|
RegisterActions();
|
||||||
|
}
|
||||||
|
|
||||||
private void HandleMessage(string path, string id, JToken content)
|
private void HandleMessage(string path, string id, JToken content)
|
||||||
{
|
{
|
||||||
// replace base path with empty string. Should leave something like /fullStatus
|
// replace base path with empty string. Should leave something like /fullStatus
|
||||||
@@ -91,16 +131,20 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Executing action for path {path}", this, path);
|
this.LogDebug("Executing action for path {path}", path);
|
||||||
|
|
||||||
action(id, content);
|
action(id, content);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds an action for a given path
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
|
/// <param name="action"></param>
|
||||||
protected void AddAction(string path, Action<string, JToken> action)
|
protected void AddAction(string path, Action<string, JToken> action)
|
||||||
{
|
{
|
||||||
if (_actions.ContainsKey(path))
|
if (_actions.ContainsKey(path))
|
||||||
{
|
{
|
||||||
//Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, $"Messenger {Key} already has action registered at {path}", this);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,6 +159,10 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
return _actions.Keys.ToList();
|
return _actions.Keys.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes an action for a given path
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
protected void RemoveAction(string path)
|
protected void RemoveAction(string path)
|
||||||
{
|
{
|
||||||
if (!_actions.ContainsKey(path))
|
if (!_actions.ContainsKey(path))
|
||||||
@@ -128,17 +176,62 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Implemented in extending classes. Wire up API calls and feedback here
|
/// Implemented in extending classes. Wire up API calls and feedback here
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="appServerController"></param>
|
|
||||||
protected virtual void RegisterActions()
|
protected virtual void RegisterActions()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add client to the susbscription list for unsolicited feedback
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="clientId">Client ID to add</param>
|
||||||
|
protected void SubscribeClient(string clientId)
|
||||||
|
{
|
||||||
|
if (!enableMessengerSubscriptions)
|
||||||
|
{
|
||||||
|
this.LogWarning("Messenger subscriptions not enabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SubscriberIds.Any(id => id == clientId))
|
||||||
|
{
|
||||||
|
this.LogVerbose("Client {clientId} already subscribed", clientId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SubscriberIds.Add(clientId);
|
||||||
|
|
||||||
|
this.LogDebug("Client {clientId} subscribed", clientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Remove a client from the subscription list
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="clientId">Client ID to remove</param>
|
||||||
|
public void UnsubscribeClient(string clientId)
|
||||||
|
{
|
||||||
|
if (!enableMessengerSubscriptions)
|
||||||
|
{
|
||||||
|
this.LogWarning("Messenger subscriptions not enabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SubscriberIds.Any(i => i == clientId))
|
||||||
|
{
|
||||||
|
this.LogVerbose("Client with ID {clientId} is not subscribed", clientId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SubscriberIds.RemoveWhere((i) => i == clientId);
|
||||||
|
|
||||||
|
this.LogInformation("Client with ID {clientId} unsubscribed", clientId);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Helper for posting status message
|
/// Helper for posting status message
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="type"></param>
|
|
||||||
/// <param name="message"></param>
|
/// <param name="message"></param>
|
||||||
|
/// <param name="clientId">Optional client id that will direct the message back to only that client</param>
|
||||||
protected void PostStatusMessage(DeviceStateMessageBase message, string clientId = null)
|
protected void PostStatusMessage(DeviceStateMessageBase message, string clientId = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -159,16 +252,22 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
message.Name = _device.Name;
|
message.Name = _device.Name;
|
||||||
|
|
||||||
var token = JToken.FromObject(message);
|
var token = JToken.FromObject(message);
|
||||||
|
|
||||||
PostStatusMessage(token, MessagePath, clientId);
|
PostStatusMessage(token, MessagePath, clientId);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
this.LogError(ex, "Exception posting status message for {messagePath} to {clientId}", MessagePath, clientId ?? "all clients");
|
this.LogError(ex, "Exception posting status message for {messagePath} to {clientId}", MessagePath, clientId ?? "all clients");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper for posting status message
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type"></param>
|
||||||
|
/// <param name="deviceState"></param>
|
||||||
|
/// <param name="clientId">Optional client id that will direct the message back to only that client</param>
|
||||||
protected void PostStatusMessage(string type, DeviceStateMessageBase deviceState, string clientId = null)
|
protected void PostStatusMessage(string type, DeviceStateMessageBase deviceState, string clientId = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -188,22 +287,54 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
this.LogError(ex, "Exception posting status message for {type} to {clientId}", type, clientId ?? "all clients");
|
this.LogError(ex, "Exception posting status message for {type} to {clientId}", type, clientId ?? "all clients");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper for posting status message
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="content"></param>
|
||||||
|
/// <param name="type"></param>
|
||||||
|
/// <param name="clientId">Optional client id that will direct the message back to only that client</param>
|
||||||
protected void PostStatusMessage(JToken content, string type = "", string clientId = null)
|
protected void PostStatusMessage(JToken content, string type = "", string clientId = null)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// Allow for legacy method to continue without subscriptions
|
||||||
|
if (!enableMessengerSubscriptions)
|
||||||
|
{
|
||||||
|
AppServerController?.SendMessageObject(new MobileControlMessage { Type = !string.IsNullOrEmpty(type) ? type : MessagePath, ClientId = clientId, Content = content });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle subscription feedback
|
||||||
|
// If client is null or empty, this message is unsolicited feedback. Iterate through the subscriber list and send to all interested parties
|
||||||
|
if (string.IsNullOrEmpty(clientId))
|
||||||
|
{
|
||||||
|
foreach (var client in SubscriberIds)
|
||||||
|
{
|
||||||
|
AppServerController?.SendMessageObject(new MobileControlMessage { Type = !string.IsNullOrEmpty(type) ? type : MessagePath, ClientId = client, Content = content });
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SubscribeClient(clientId);
|
||||||
|
|
||||||
AppServerController?.SendMessageObject(new MobileControlMessage { Type = !string.IsNullOrEmpty(type) ? type : MessagePath, ClientId = clientId, Content = content });
|
AppServerController?.SendMessageObject(new MobileControlMessage { Type = !string.IsNullOrEmpty(type) ? type : MessagePath, ClientId = clientId, Content = content });
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(ex, "Exception posting status message", this);
|
this.LogError("Exception posting status message: {message}", ex.Message);
|
||||||
|
this.LogDebug(ex, "Stack Trace: ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper for posting event message
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message"></param>
|
||||||
protected void PostEventMessage(DeviceEventMessageBase message)
|
protected void PostEventMessage(DeviceEventMessageBase message)
|
||||||
{
|
{
|
||||||
message.Key = _device.Key;
|
message.Key = _device.Key;
|
||||||
@@ -217,6 +348,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper for posting event message
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message"></param>
|
||||||
|
/// <param name="eventType"></param>
|
||||||
protected void PostEventMessage(DeviceEventMessageBase message, string eventType)
|
protected void PostEventMessage(DeviceEventMessageBase message, string eventType)
|
||||||
{
|
{
|
||||||
message.Key = _device.Key;
|
message.Key = _device.Key;
|
||||||
@@ -232,6 +368,10 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Helper for posting event message with no content
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="eventType"></param>
|
||||||
protected void PostEventMessage(string eventType)
|
protected void PostEventMessage(string eventType)
|
||||||
{
|
{
|
||||||
AppServerController?.SendMessageObject(new MobileControlMessage
|
AppServerController?.SendMessageObject(new MobileControlMessage
|
||||||
@@ -242,64 +382,4 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
public abstract class DeviceMessageBase
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The device key
|
|
||||||
/// </summary>
|
|
||||||
[JsonProperty("key")]
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the Key
|
|
||||||
/// </summary>
|
|
||||||
public string Key { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The device name
|
|
||||||
/// </summary>
|
|
||||||
[JsonProperty("name")]
|
|
||||||
public string Name { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The type of the message class
|
|
||||||
/// </summary>
|
|
||||||
[JsonProperty("messageType")]
|
|
||||||
public string MessageType => GetType().Name;
|
|
||||||
|
|
||||||
[JsonProperty("messageBasePath")]
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the MessageBasePath
|
|
||||||
/// </summary>
|
|
||||||
public string MessageBasePath { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a DeviceStateMessageBase
|
|
||||||
/// </summary>
|
|
||||||
public class DeviceStateMessageBase : DeviceMessageBase
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The interfaces implmented by the device sending the messsage
|
|
||||||
/// </summary>
|
|
||||||
[JsonProperty("interfaces")]
|
|
||||||
public List<string> Interfaces { get; private set; }
|
|
||||||
|
|
||||||
public void SetInterfaces(List<string> interfaces)
|
|
||||||
{
|
|
||||||
Interfaces = interfaces;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Base class for event messages that include the type of message and an event type
|
|
||||||
/// </summary>
|
|
||||||
public abstract class DeviceEventMessageBase : DeviceMessageBase
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The event type
|
|
||||||
/// </summary>
|
|
||||||
[JsonProperty("eventType")]
|
|
||||||
public string EventType { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
using Crestron.SimplSharp;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Handler for press/hold/release messages
|
||||||
|
/// </summary>
|
||||||
public static class PressAndHoldHandler
|
public static class PressAndHoldHandler
|
||||||
{
|
{
|
||||||
private const long ButtonHeartbeatInterval = 1000;
|
private const long ButtonHeartbeatInterval = 1000;
|
||||||
@@ -26,21 +29,21 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
private static void AddTimer(string deviceKey, Action<bool> action)
|
private static void AddTimer(string deviceKey, Action<bool> action)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Attempting to add timer for {deviceKey}", deviceKey);
|
Debug.LogDebug("Attempting to add timer for {deviceKey}", deviceKey);
|
||||||
|
|
||||||
if (_pushedActions.TryGetValue(deviceKey, out CTimer cancelTimer))
|
if (_pushedActions.TryGetValue(deviceKey, out CTimer cancelTimer))
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Timer for {deviceKey} already exists", deviceKey);
|
Debug.LogDebug("Timer for {deviceKey} already exists", deviceKey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Adding timer for {deviceKey} with due time {dueTime}", deviceKey, ButtonHeartbeatInterval);
|
Debug.LogDebug("Adding timer for {deviceKey} with due time {dueTime}", deviceKey, ButtonHeartbeatInterval);
|
||||||
|
|
||||||
action(true);
|
action(true);
|
||||||
|
|
||||||
cancelTimer = new CTimer(o =>
|
cancelTimer = new CTimer(o =>
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Timer expired for {deviceKey}", deviceKey);
|
Debug.LogDebug("Timer expired for {deviceKey}", deviceKey);
|
||||||
|
|
||||||
action(false);
|
action(false);
|
||||||
|
|
||||||
@@ -52,30 +55,30 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
private static void ResetTimer(string deviceKey, Action<bool> action)
|
private static void ResetTimer(string deviceKey, Action<bool> action)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Attempting to reset timer for {deviceKey}", deviceKey);
|
Debug.LogDebug("Attempting to reset timer for {deviceKey}", deviceKey);
|
||||||
|
|
||||||
if (!_pushedActions.TryGetValue(deviceKey, out CTimer cancelTimer))
|
if (!_pushedActions.TryGetValue(deviceKey, out CTimer cancelTimer))
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Timer for {deviceKey} not found", deviceKey);
|
Debug.LogDebug("Timer for {deviceKey} not found", deviceKey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Resetting timer for {deviceKey} with due time {dueTime}", deviceKey, ButtonHeartbeatInterval);
|
Debug.LogDebug("Resetting timer for {deviceKey} with due time {dueTime}", deviceKey, ButtonHeartbeatInterval);
|
||||||
|
|
||||||
cancelTimer.Reset(ButtonHeartbeatInterval);
|
cancelTimer.Reset(ButtonHeartbeatInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void StopTimer(string deviceKey, Action<bool> action)
|
private static void StopTimer(string deviceKey, Action<bool> action)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Attempting to stop timer for {deviceKey}", deviceKey);
|
Debug.LogDebug("Attempting to stop timer for {deviceKey}", deviceKey);
|
||||||
|
|
||||||
if (!_pushedActions.TryGetValue(deviceKey, out CTimer cancelTimer))
|
if (!_pushedActions.TryGetValue(deviceKey, out CTimer cancelTimer))
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Timer for {deviceKey} not found", deviceKey);
|
Debug.LogDebug("Timer for {deviceKey} not found", deviceKey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Stopping timer for {deviceKey} with due time {dueTime}", deviceKey, ButtonHeartbeatInterval);
|
Debug.LogDebug("Stopping timer for {deviceKey} with due time {dueTime}", deviceKey, ButtonHeartbeatInterval);
|
||||||
|
|
||||||
action(false);
|
action(false);
|
||||||
cancelTimer.Stop();
|
cancelTimer.Stop();
|
||||||
@@ -84,15 +87,15 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
public static Action<string, Action<bool>> GetPressAndHoldHandler(string value)
|
public static Action<string, Action<bool>> GetPressAndHoldHandler(string value)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Getting press and hold handler for {value}", value);
|
Debug.LogDebug("Getting press and hold handler for {value}", value);
|
||||||
|
|
||||||
if (!_pushedActionHandlers.TryGetValue(value, out Action<string, Action<bool>> handler))
|
if (!_pushedActionHandlers.TryGetValue(value, out Action<string, Action<bool>> handler))
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Press and hold handler for {value} not found", value);
|
Debug.LogDebug("Press and hold handler for {value} not found", value);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Got handler for {value}", value);
|
Debug.LogDebug("Got handler for {value}", value);
|
||||||
|
|
||||||
return handler;
|
return handler;
|
||||||
}
|
}
|
||||||
@@ -104,7 +107,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
var msg = content.ToObject<MobileControlSimpleContent<string>>();
|
var msg = content.ToObject<MobileControlSimpleContent<string>>();
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Handling press and hold message of {type} for {deviceKey}", msg.Value, deviceKey);
|
Debug.LogDebug("Handling press and hold message of {type} for {deviceKey}", msg.Value, deviceKey);
|
||||||
|
|
||||||
var timerHandler = GetPressAndHoldHandler(msg.Value);
|
var timerHandler = GetPressAndHoldHandler(msg.Value);
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Logging;
|
using PepperDash.Core.Logging;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Room.Config;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -31,7 +31,14 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
var events = _room.GetScheduledEvents();
|
var events = _room.GetScheduledEvents();
|
||||||
|
|
||||||
SendFullStatus(events);
|
SendFullStatus(events, id);
|
||||||
|
});
|
||||||
|
|
||||||
|
AddAction("/scheduledEventsStatus", (id, content) =>
|
||||||
|
{
|
||||||
|
var events = _room.GetScheduledEvents();
|
||||||
|
|
||||||
|
SendFullStatus(events, id);
|
||||||
});
|
});
|
||||||
|
|
||||||
_room.ScheduledEventsChanged += (sender, args) => SendFullStatus(args.ScheduledEvents);
|
_room.ScheduledEventsChanged += (sender, args) => SendFullStatus(args.ScheduledEvents);
|
||||||
@@ -55,11 +62,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
this.LogException(ex,"Exception saving event");
|
this.LogException(ex, "Exception saving event");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus(List<ScheduledEventConfig> events)
|
private void SendFullStatus(List<ScheduledEventConfig> events, string id = null)
|
||||||
{
|
{
|
||||||
|
|
||||||
var message = new RoomEventScheduleStateMessage
|
var message = new RoomEventScheduleStateMessage
|
||||||
@@ -67,7 +74,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
ScheduleEvents = events,
|
ScheduleEvents = events,
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(message);
|
PostStatusMessage(message, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Shades;
|
using PepperDash.Essentials.Core.Shades;
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -22,7 +22,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
AddAction("/shadesStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
AddAction("/shadeUp", (id, content) =>
|
AddAction("/shadeUp", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -75,7 +76,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var state = new ShadeBaseStateMessage();
|
var state = new ShadeBaseStateMessage();
|
||||||
|
|
||||||
@@ -85,7 +86,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
state.IsClosed = feedbackDevice.ShadeIsClosedFeedback.BoolValue;
|
state.IsClosed = feedbackDevice.ShadeIsClosedFeedback.BoolValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,10 +95,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ShadeBaseStateMessage : DeviceStateMessageBase
|
public class ShadeBaseStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("middleButtonLabel", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the MiddleButtonLabel
|
/// Gets or sets the MiddleButtonLabel
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("middleButtonLabel", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string MiddleButtonLabel { get; set; }
|
public string MiddleButtonLabel { get; set; }
|
||||||
|
|
||||||
[JsonProperty("isOpen", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isOpen", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
using Crestron.SimplSharp;
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Monitoring;
|
using PepperDash.Essentials.Core.Monitoring;
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -56,36 +56,37 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
SendSystemMonitorStatusMessage();
|
SendSystemMonitorStatusMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatusMessage()
|
private void SendFullStatusMessage(string id = null)
|
||||||
{
|
{
|
||||||
SendSystemMonitorStatusMessage();
|
SendSystemMonitorStatusMessage(id);
|
||||||
|
|
||||||
foreach (var p in systemMonitor.ProgramStatusFeedbackCollection)
|
foreach (var p in systemMonitor.ProgramStatusFeedbackCollection)
|
||||||
{
|
{
|
||||||
PostStatusMessage(JToken.FromObject(p.Value.ProgramInfo));
|
PostStatusMessage(JToken.FromObject(p.Value.ProgramInfo), id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendSystemMonitorStatusMessage()
|
private void SendSystemMonitorStatusMessage(string id = null)
|
||||||
{
|
{
|
||||||
// This takes a while, launch a new thread
|
// This takes a while, launch a new thread
|
||||||
|
|
||||||
Task.Run(() => PostStatusMessage(JToken.FromObject(new SystemMonitorStateMessage
|
Task.Run(() => PostStatusMessage(JToken.FromObject(new SystemMonitorStateMessage
|
||||||
{
|
{
|
||||||
|
|
||||||
TimeZone = systemMonitor.TimeZoneFeedback.IntValue,
|
TimeZone = systemMonitor.TimeZoneFeedback.IntValue,
|
||||||
TimeZoneName = systemMonitor.TimeZoneTextFeedback.StringValue,
|
TimeZoneName = systemMonitor.TimeZoneTextFeedback.StringValue,
|
||||||
IoControllerVersion = systemMonitor.IoControllerVersionFeedback.StringValue,
|
IoControllerVersion = systemMonitor.IoControllerVersionFeedback.StringValue,
|
||||||
SnmpVersion = systemMonitor.SnmpVersionFeedback.StringValue,
|
SnmpVersion = systemMonitor.SnmpVersionFeedback.StringValue,
|
||||||
BacnetVersion = systemMonitor.BaCnetAppVersionFeedback.StringValue,
|
BacnetVersion = systemMonitor.BaCnetAppVersionFeedback.StringValue,
|
||||||
ControllerVersion = systemMonitor.ControllerVersionFeedback.StringValue
|
ControllerVersion = systemMonitor.ControllerVersionFeedback.StringValue
|
||||||
})
|
}), id
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatusMessage());
|
AddAction("/fullStatus", (id, content) => SendFullStatusMessage(id));
|
||||||
|
|
||||||
|
AddAction("/systemStatus", (id, content) => SendFullStatusMessage(id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,40 +95,45 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class SystemMonitorStateMessage
|
public class SystemMonitorStateMessage
|
||||||
{
|
{
|
||||||
[JsonProperty("timeZone", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the TimeZone
|
/// Gets or sets the TimeZone
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("timeZone", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public int TimeZone { get; set; }
|
public int TimeZone { get; set; }
|
||||||
|
|
||||||
[JsonProperty("timeZone", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the TimeZoneName
|
/// Gets or sets the TimeZoneName
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("timeZoneName", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string TimeZoneName { get; set; }
|
public string TimeZoneName { get; set; }
|
||||||
|
|
||||||
[JsonProperty("timeZone", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the IoControllerVersion
|
/// Gets or sets the IoControllerVersion
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("ioControllerVersion", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string IoControllerVersion { get; set; }
|
public string IoControllerVersion { get; set; }
|
||||||
|
|
||||||
[JsonProperty("timeZone", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the SnmpVersion
|
/// Gets or sets the SnmpVersion
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("snmpVersion", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string SnmpVersion { get; set; }
|
public string SnmpVersion { get; set; }
|
||||||
|
|
||||||
[JsonProperty("timeZone", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the BacnetVersion
|
/// Gets or sets the BacnetVersion
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("bacnetVersion", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string BacnetVersion { get; set; }
|
public string BacnetVersion { get; set; }
|
||||||
|
|
||||||
[JsonProperty("timeZone", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the ControllerVersion
|
/// Gets or sets the ControllerVersion
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("controllerVersion", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string ControllerVersion { get; set; }
|
public string ControllerVersion { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// SendFullStatus method
|
/// SendFullStatus method
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendFullStatus()
|
public void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var messageObj = new TwoWayDisplayBaseStateMessage
|
var messageObj = new TwoWayDisplayBaseStateMessage
|
||||||
{
|
{
|
||||||
@@ -31,16 +31,17 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
CurrentInput = _display.CurrentInputFeedback.StringValue
|
CurrentInput = _display.CurrentInputFeedback.StringValue
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(messageObj);
|
PostStatusMessage(messageObj, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
base.RegisterActions();
|
base.RegisterActions();
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction("/displayStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
//_display.PowerIsOnFeedback.OutputChange += PowerIsOnFeedbackOnOutputChange;
|
|
||||||
_display.CurrentInputFeedback.OutputChange += CurrentInputFeedbackOnOutputChange;
|
_display.CurrentInputFeedback.OutputChange += CurrentInputFeedbackOnOutputChange;
|
||||||
_display.IsCoolingDownFeedback.OutputChange += IsCoolingFeedbackOnOutputChange;
|
_display.IsCoolingDownFeedback.OutputChange += IsCoolingFeedbackOnOutputChange;
|
||||||
_display.IsWarmingUpFeedback.OutputChange += IsWarmingFeedbackOnOutputChange;
|
_display.IsWarmingUpFeedback.OutputChange += IsWarmingFeedbackOnOutputChange;
|
||||||
@@ -55,16 +56,6 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//private void PowerIsOnFeedbackOnOutputChange(object sender, FeedbackEventArgs feedbackEventArgs)
|
|
||||||
//{
|
|
||||||
// PostStatusMessage(JToken.FromObject(new
|
|
||||||
// {
|
|
||||||
// powerState = feedbackEventArgs.BoolValue
|
|
||||||
// })
|
|
||||||
// );
|
|
||||||
//}
|
|
||||||
|
|
||||||
private void IsWarmingFeedbackOnOutputChange(object sender, FeedbackEventArgs feedbackEventArgs)
|
private void IsWarmingFeedbackOnOutputChange(object sender, FeedbackEventArgs feedbackEventArgs)
|
||||||
{
|
{
|
||||||
PostStatusMessage(JToken.FromObject(new
|
PostStatusMessage(JToken.FromObject(new
|
||||||
@@ -96,10 +87,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
//[JsonProperty("powerState", NullValueHandling = NullValueHandling.Ignore)]
|
//[JsonProperty("powerState", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
//public bool? PowerState { get; set; }
|
//public bool? PowerState { get; set; }
|
||||||
|
|
||||||
[JsonProperty("currentInput", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the CurrentInput
|
/// Gets or sets the CurrentInput
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("currentInput", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string CurrentInput { get; set; }
|
public string CurrentInput { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,8 @@
|
|||||||
using Crestron.SimplSharp;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
@@ -9,9 +13,6 @@ using PepperDash.Essentials.Devices.Common.Cameras;
|
|||||||
using PepperDash.Essentials.Devices.Common.Codec;
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces;
|
using PepperDash.Essentials.Devices.Common.VideoCodec.Interfaces;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.AppServer.Messengers
|
namespace PepperDash.Essentials.AppServer.Messengers
|
||||||
{
|
{
|
||||||
@@ -151,7 +152,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
PostStatusMessage(state);
|
PostStatusMessage(state);
|
||||||
|
|
||||||
SendFullStatus();
|
SendFullStatus();
|
||||||
} catch (Exception ex)
|
}
|
||||||
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
this.LogError(ex, "Error sending codec ready status");
|
this.LogError(ex, "Error sending codec ready status");
|
||||||
}
|
}
|
||||||
@@ -169,7 +171,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
|
|
||||||
AddAction("/isReady", (id, content) => SendIsReady());
|
AddAction("/isReady", (id, content) => SendIsReady());
|
||||||
|
|
||||||
AddAction("/fullStatus", (id, content) => SendFullStatus());
|
AddAction("/fullStatus", (id, content) => SendFullStatus(id));
|
||||||
|
AddAction("/codecStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
AddAction("/dial", (id, content) =>
|
AddAction("/dial", (id, content) =>
|
||||||
{
|
{
|
||||||
@@ -369,7 +372,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state);
|
||||||
} catch (Exception ex)
|
}
|
||||||
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
this.LogError(ex, "Error posting sharing source");
|
this.LogError(ex, "Error posting sharing source");
|
||||||
}
|
}
|
||||||
@@ -385,7 +389,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state);
|
||||||
} catch (Exception ex)
|
}
|
||||||
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
this.LogError(ex, "Error posting sharing content");
|
this.LogError(ex, "Error posting sharing content");
|
||||||
}
|
}
|
||||||
@@ -435,7 +440,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
{
|
{
|
||||||
MapCameraActions();
|
MapCameraActions();
|
||||||
PostSelectedCamera();
|
PostSelectedCamera();
|
||||||
} catch(Exception ex)
|
}
|
||||||
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
this.LogError(ex, "Exception handling camera selected event");
|
this.LogError(ex, "Exception handling camera selected event");
|
||||||
}
|
}
|
||||||
@@ -780,14 +786,14 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void SendFullStatus()
|
protected virtual void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
if (!Codec.IsReady)
|
if (!Codec.IsReady)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CrestronInvoke.BeginInvoke((o) => PostStatusMessage(GetStatus()));
|
Task.Run(() => PostStatusMessage(GetStatus(), id));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void PostReceivingContent(bool receivingContent)
|
private void PostReceivingContent(bool receivingContent)
|
||||||
@@ -800,7 +806,8 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(state);
|
PostStatusMessage(state);
|
||||||
} catch(Exception ex)
|
}
|
||||||
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
this.LogError(ex, "Error posting receiving content");
|
this.LogError(ex, "Error posting receiving content");
|
||||||
}
|
}
|
||||||
@@ -949,22 +956,25 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
[JsonProperty("cameraSupportsOffMode", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("cameraSupportsOffMode", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? CameraSupportsOffMode { get; set; }
|
public bool? CameraSupportsOffMode { get; set; }
|
||||||
|
|
||||||
[JsonProperty("currentDialString", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the CurrentDialString
|
/// Gets or sets the CurrentDialString
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("currentDialString", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string CurrentDialString { get; set; }
|
public string CurrentDialString { get; set; }
|
||||||
|
|
||||||
[JsonProperty("currentDirectory", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the CurrentDirectory
|
/// Gets or sets the CurrentDirectory
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("currentDirectory", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public CodecDirectory CurrentDirectory { get; set; }
|
public CodecDirectory CurrentDirectory { get; set; }
|
||||||
|
|
||||||
[JsonProperty("directorySelectedFolderName", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the DirectorySelectedFolderName
|
/// Gets or sets the DirectorySelectedFolderName
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("directorySelectedFolderName", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string DirectorySelectedFolderName { get; set; }
|
public string DirectorySelectedFolderName { get; set; }
|
||||||
|
|
||||||
[JsonProperty("hasCameras", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasCameras", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
@@ -985,10 +995,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
[JsonProperty("initialPhonebookSyncComplete", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("initialPhonebookSyncComplete", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? InitialPhonebookSyncComplete { get; set; }
|
public bool? InitialPhonebookSyncComplete { get; set; }
|
||||||
|
|
||||||
[JsonProperty("info", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Info
|
/// Gets or sets the Info
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("info", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public VideoCodecInfo Info { get; set; }
|
public VideoCodecInfo Info { get; set; }
|
||||||
|
|
||||||
[JsonProperty("isInCall", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isInCall", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
@@ -1000,16 +1011,18 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
[JsonProperty("isZoomRoom", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isZoomRoom", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsZoomRoom { get; set; }
|
public bool? IsZoomRoom { get; set; }
|
||||||
|
|
||||||
[JsonProperty("meetingInfo", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the MeetingInfo
|
/// Gets or sets the MeetingInfo
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("meetingInfo", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public MeetingInfo MeetingInfo { get; set; }
|
public MeetingInfo MeetingInfo { get; set; }
|
||||||
|
|
||||||
[JsonProperty("presets", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Presets
|
/// Gets or sets the Presets
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("presets", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<CodecRoomPreset> Presets { get; set; }
|
public List<CodecRoomPreset> Presets { get; set; }
|
||||||
|
|
||||||
[JsonProperty("privacyModeIsOn", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("privacyModeIsOn", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
@@ -1024,10 +1037,11 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
[JsonProperty("sharingContentIsOn", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("sharingContentIsOn", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? SharingContentIsOn { get; set; }
|
public bool? SharingContentIsOn { get; set; }
|
||||||
|
|
||||||
[JsonProperty("sharingSource", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the SharingSource
|
/// Gets or sets the SharingSource
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("sharingSource", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string SharingSource { get; set; }
|
public string SharingSource { get; set; }
|
||||||
|
|
||||||
[JsonProperty("showCamerasWhenNotInCall", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("showCamerasWhenNotInCall", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
@@ -1057,23 +1071,26 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
[JsonProperty("cameraOffSupported", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("cameraOffSupported", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? CameraOffIsSupported { get; set; }
|
public bool? CameraOffIsSupported { get; set; }
|
||||||
|
|
||||||
[JsonProperty("cameraMode", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the CameraMode
|
/// Gets or sets the CameraMode
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("cameraMode", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string CameraMode { get; set; }
|
public string CameraMode { get; set; }
|
||||||
|
|
||||||
[JsonProperty("cameraList", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Cameras
|
/// Gets or sets the Cameras
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("cameraList", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<CameraBase> Cameras { get; set; }
|
public List<CameraBase> Cameras { get; set; }
|
||||||
|
|
||||||
[JsonProperty("selectedCamera", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the SelectedCamera
|
/// Gets or sets the SelectedCamera
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Camera SelectedCamera { get; set; }
|
[JsonProperty("selectedCamera", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
|
public Camera SelectedCamera { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1081,25 +1098,28 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Camera
|
public class Camera
|
||||||
{
|
{
|
||||||
[JsonProperty("key", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Key
|
/// Gets or sets the Key
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("key", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Key { get; set; }
|
public string Key { get; set; }
|
||||||
|
|
||||||
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Name
|
/// Gets or sets the Name
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
[JsonProperty("isFarEnd", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isFarEnd", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsFarEnd { get; set; }
|
public bool? IsFarEnd { get; set; }
|
||||||
|
|
||||||
[JsonProperty("capabilities", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Capabilities
|
/// Gets or sets the Capabilities
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("capabilities", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public CameraCapabilities Capabilities { get; set; }
|
public CameraCapabilities Capabilities { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1135,27 +1155,31 @@ namespace PepperDash.Essentials.AppServer.Messengers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class PasswordPromptEventMessage : VideoCodecBaseEventMessage
|
public class PasswordPromptEventMessage : VideoCodecBaseEventMessage
|
||||||
{
|
{
|
||||||
[JsonProperty("message", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Message
|
/// Gets or sets the Message
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("message", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Message { get; set; }
|
public string Message { get; set; }
|
||||||
[JsonProperty("lastAttemptWasIncorrect", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the LastAttemptWasIncorrect
|
/// Gets or sets the LastAttemptWasIncorrect
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("lastAttemptWasIncorrect", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool LastAttemptWasIncorrect { get; set; }
|
public bool LastAttemptWasIncorrect { get; set; }
|
||||||
|
|
||||||
[JsonProperty("loginAttemptFailed", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the LoginAttemptFailed
|
/// Gets or sets the LoginAttemptFailed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("loginAttemptFailed", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool LoginAttemptFailed { get; set; }
|
public bool LoginAttemptFailed { get; set; }
|
||||||
|
|
||||||
[JsonProperty("loginAttemptCancelled", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the LoginAttemptCancelled
|
/// Gets or sets the LoginAttemptCancelled
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("loginAttemptCancelled", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool LoginAttemptCancelled { get; set; }
|
public bool LoginAttemptCancelled { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,16 +7,18 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class AuthorizationResponse
|
public class AuthorizationResponse
|
||||||
{
|
{
|
||||||
[JsonProperty("authorized")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Authorized
|
/// Gets or sets the Authorized
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("authorized")]
|
||||||
public bool Authorized { get; set; }
|
public bool Authorized { get; set; }
|
||||||
|
|
||||||
[JsonProperty("reason", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Reason
|
/// Gets or sets the Reason
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("reason", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Reason { get; set; } = null;
|
public string Reason { get; set; } = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,10 +27,11 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class AuthorizationRequest
|
public class AuthorizationRequest
|
||||||
{
|
{
|
||||||
[JsonProperty("grantCode")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the GrantCode
|
/// Gets or sets the GrantCode
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("grantCode")]
|
||||||
public string GrantCode { get; set; }
|
public string GrantCode { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a ClientSpecificUpdateRequest
|
||||||
|
/// </summary>
|
||||||
|
public class ClientSpecificUpdateRequest
|
||||||
|
{
|
||||||
|
public ClientSpecificUpdateRequest(Action<string> action)
|
||||||
|
{
|
||||||
|
ResponseMethod = action;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the ResponseMethod
|
||||||
|
/// </summary>
|
||||||
|
public Action<string> ResponseMethod { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -38,6 +38,12 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonProperty("enableApiServer")]
|
[JsonProperty("enableApiServer")]
|
||||||
public bool EnableApiServer { get; set; } = true;
|
public bool EnableApiServer { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Enable subscriptions for Messengers
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("enableMessengerSubscriptions")]
|
||||||
|
public bool EnableMessengerSubscriptions { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -78,6 +84,15 @@ namespace PepperDash.Essentials
|
|||||||
[JsonProperty("csLanUiDeviceKeys")]
|
[JsonProperty("csLanUiDeviceKeys")]
|
||||||
public List<string> CSLanUiDeviceKeys { get; set; }
|
public List<string> CSLanUiDeviceKeys { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get or set the Secure property
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Indicates whether the connection is secure (HTTPS).
|
||||||
|
/// </remarks>
|
||||||
|
[JsonProperty("Secure")]
|
||||||
|
public bool Secure { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the MobileControlDirectServerPropertiesConfig class.
|
/// Initializes a new instance of the MobileControlDirectServerPropertiesConfig class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using Newtonsoft.Json;
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
@@ -39,10 +39,11 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class MobileControlRuntimeInfo
|
public class MobileControlRuntimeInfo
|
||||||
{
|
{
|
||||||
[JsonProperty("pluginVersion")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the PluginVersion
|
/// Gets or sets the PluginVersion
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("pluginVersion")]
|
||||||
public string PluginVersion { get; set; }
|
public string PluginVersion { get; set; }
|
||||||
|
|
||||||
[JsonProperty("essentialsVersion")]
|
[JsonProperty("essentialsVersion")]
|
||||||
@@ -51,10 +52,11 @@ namespace PepperDash.Essentials
|
|||||||
[JsonProperty("pepperDashCoreVersion")]
|
[JsonProperty("pepperDashCoreVersion")]
|
||||||
public string PepperDashCoreVersion { get; set; }
|
public string PepperDashCoreVersion { get; set; }
|
||||||
|
|
||||||
[JsonProperty("essentialsPlugins")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the EssentialsPlugins
|
/// Gets or sets the EssentialsPlugins
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("essentialsPlugins")]
|
||||||
public List<LoadedAssembly> EssentialsPlugins { get; set; }
|
public List<LoadedAssembly> EssentialsPlugins { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -54,7 +54,10 @@ namespace PepperDash.Essentials
|
|||||||
StringComparer.InvariantCultureIgnoreCase
|
StringComparer.InvariantCultureIgnoreCase
|
||||||
);
|
);
|
||||||
|
|
||||||
public Dictionary<string, List<IMobileControlAction>> ActionDictionary => _actionDictionary;
|
/// <summary>
|
||||||
|
/// Actions
|
||||||
|
/// </summary>
|
||||||
|
public ReadOnlyDictionary<string, List<IMobileControlAction>> ActionDictionary => new ReadOnlyDictionary<string, List<IMobileControlAction>>(_actionDictionary);
|
||||||
|
|
||||||
private readonly GenericQueue _receiveQueue;
|
private readonly GenericQueue _receiveQueue;
|
||||||
private readonly List<MobileControlBridgeBase> _roomBridges =
|
private readonly List<MobileControlBridgeBase> _roomBridges =
|
||||||
@@ -66,6 +69,16 @@ namespace PepperDash.Essentials
|
|||||||
private readonly Dictionary<string, IMobileControlMessenger> _defaultMessengers =
|
private readonly Dictionary<string, IMobileControlMessenger> _defaultMessengers =
|
||||||
new Dictionary<string, IMobileControlMessenger>();
|
new Dictionary<string, IMobileControlMessenger>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the custom messengers with subscriptions
|
||||||
|
/// </summary>
|
||||||
|
public ReadOnlyDictionary<string, IMobileControlMessengerWithSubscriptions> Messengers => new ReadOnlyDictionary<string, IMobileControlMessengerWithSubscriptions>(_messengers.Values.OfType<IMobileControlMessengerWithSubscriptions>().ToDictionary(k => k.Key, v => v));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the default messengers
|
||||||
|
/// </summary>
|
||||||
|
public ReadOnlyDictionary<string, IMobileControlMessengerWithSubscriptions> DefaultMessengers => new ReadOnlyDictionary<string, IMobileControlMessengerWithSubscriptions>(_defaultMessengers.Values.OfType<IMobileControlMessengerWithSubscriptions>().ToDictionary(k => k.Key, v => v));
|
||||||
|
|
||||||
private readonly GenericQueue _transmitToServerQueue;
|
private readonly GenericQueue _transmitToServerQueue;
|
||||||
|
|
||||||
private readonly GenericQueue _transmitToClientsQueue;
|
private readonly GenericQueue _transmitToClientsQueue;
|
||||||
@@ -244,7 +257,7 @@ namespace PepperDash.Essentials
|
|||||||
CrestronEnvironment.ProgramStatusEventHandler +=
|
CrestronEnvironment.ProgramStatusEventHandler +=
|
||||||
CrestronEnvironment_ProgramStatusEventHandler;
|
CrestronEnvironment_ProgramStatusEventHandler;
|
||||||
|
|
||||||
ApiOnlineAndAuthorized = new BoolFeedback(() =>
|
ApiOnlineAndAuthorized = new BoolFeedback("apiOnlineAndAuthorized", () =>
|
||||||
{
|
{
|
||||||
if (_wsClient2 == null)
|
if (_wsClient2 == null)
|
||||||
return false;
|
return false;
|
||||||
@@ -1199,8 +1212,7 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
if (_initialized)
|
if (_initialized)
|
||||||
{
|
{
|
||||||
this.LogDebug("Registering messenger {messengerKey} AFTER initialization", messenger.Key);
|
RegisterMessengerWithServer(messenger);
|
||||||
messenger.RegisterWithAppServer(this);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1241,6 +1253,12 @@ namespace PepperDash.Essentials
|
|||||||
messenger.MessagePath
|
messenger.MessagePath
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (messenger is IMobileControlMessengerWithSubscriptions subMessenger)
|
||||||
|
{
|
||||||
|
subMessenger.RegisterWithAppServer(this, Config.EnableMessengerSubscriptions);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
messenger.RegisterWithAppServer(this);
|
messenger.RegisterWithAppServer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1335,11 +1353,30 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
Log =
|
Log =
|
||||||
{
|
{
|
||||||
Output = (data, s) =>
|
Output = (data, message) =>
|
||||||
this.LogDebug(
|
{
|
||||||
"Message from websocket: {message}",
|
switch (data.Level)
|
||||||
data
|
{
|
||||||
)
|
case LogLevel.Trace:
|
||||||
|
this.LogVerbose(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Debug:
|
||||||
|
this.LogDebug(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Info:
|
||||||
|
this.LogInformation(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Warn:
|
||||||
|
this.LogWarning(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Error:
|
||||||
|
this.LogError(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Fatal:
|
||||||
|
this.LogFatal(data.Message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1383,13 +1420,13 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
private void SetWebsocketDebugLevel(string cmdparameters)
|
private void SetWebsocketDebugLevel(string cmdparameters)
|
||||||
{
|
{
|
||||||
if (CrestronEnvironment.ProgramCompatibility == eCrestronSeries.Series4)
|
// if (CrestronEnvironment.ProgramCompatibility == eCrestronSeries.Series4)
|
||||||
{
|
// {
|
||||||
this.LogInformation(
|
// this.LogInformation(
|
||||||
"Setting websocket log level not currently allowed on 4 series."
|
// "Setting websocket log level not currently allowed on 4 series."
|
||||||
);
|
// );
|
||||||
return; // Web socket log level not currently allowed in series4
|
// return; // Web socket log level not currently allowed in series4
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(cmdparameters))
|
if (string.IsNullOrEmpty(cmdparameters))
|
||||||
{
|
{
|
||||||
@@ -1415,6 +1452,8 @@ namespace PepperDash.Essentials
|
|||||||
_wsClient2.Log.Level = _wsLogLevel;
|
_wsClient2.Log.Level = _wsLogLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_directServer?.SetWebsocketLogLevel(_wsLogLevel);
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse($"Websocket log level set to {debugLevel}");
|
CrestronConsole.ConsoleCommandResponse($"Websocket log level set to {debugLevel}");
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
@@ -1484,7 +1523,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds an action to the dictionary
|
/// Adds an action to the dictionary
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="key">The path of the API command</param>
|
/// <param name="messenger">The messenger for the API command</param>
|
||||||
/// <param name="action">The action to be triggered by the commmand</param>
|
/// <param name="action">The action to be triggered by the commmand</param>
|
||||||
public void AddAction<T>(T messenger, Action<string, string, JToken> action)
|
public void AddAction<T>(T messenger, Action<string, string, JToken> action)
|
||||||
where T : IMobileControlMessenger
|
where T : IMobileControlMessenger
|
||||||
@@ -2194,8 +2233,21 @@ namespace PepperDash.Essentials
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_roomCombiner.CurrentScenario == null)
|
||||||
|
{
|
||||||
|
var message = new MobileControlMessage
|
||||||
|
{
|
||||||
|
Type = "/system/roomKey",
|
||||||
|
ClientId = clientId,
|
||||||
|
Content = roomKey
|
||||||
|
};
|
||||||
|
SendMessageObject(message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!_roomCombiner.CurrentScenario.UiMap.ContainsKey(roomKey))
|
if (!_roomCombiner.CurrentScenario.UiMap.ContainsKey(roomKey))
|
||||||
{
|
{
|
||||||
|
|
||||||
this.LogWarning(
|
this.LogWarning(
|
||||||
"Unable to find correct roomKey for {roomKey} in current scenario. Returning {roomKey} as roomKey", roomKey);
|
"Unable to find correct roomKey for {roomKey} in current scenario. Returning {roomKey} as roomKey", roomKey);
|
||||||
|
|
||||||
@@ -2420,33 +2472,4 @@ namespace PepperDash.Essentials
|
|||||||
CrestronConsole.ConsoleCommandResponse("Usage: mobilehttprequest:N get/post url\r");
|
CrestronConsole.ConsoleCommandResponse("Usage: mobilehttprequest:N get/post url\r");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a ClientSpecificUpdateRequest
|
|
||||||
/// </summary>
|
|
||||||
public class ClientSpecificUpdateRequest
|
|
||||||
{
|
|
||||||
public ClientSpecificUpdateRequest(Action<string> action)
|
|
||||||
{
|
|
||||||
ResponseMethod = action;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the ResponseMethod
|
|
||||||
/// </summary>
|
|
||||||
public Action<string> ResponseMethod { get; private set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a UserCodeChanged
|
|
||||||
/// </summary>
|
|
||||||
public class UserCodeChanged
|
|
||||||
{
|
|
||||||
public Action<string, string> UpdateUserCode { get; private set; }
|
|
||||||
|
|
||||||
public UserCodeChanged(Action<string, string> updateMethod)
|
|
||||||
{
|
|
||||||
UpdateUserCode = updateMethod;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Converters;
|
using Newtonsoft.Json.Converters;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
@@ -17,9 +20,6 @@ using PepperDash.Essentials.Devices.Common.Room;
|
|||||||
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
using PepperDash.Essentials.Room.Config;
|
using PepperDash.Essentials.Room.Config;
|
||||||
using PepperDash.Essentials.WebSocketServer;
|
using PepperDash.Essentials.WebSocketServer;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using IShades = PepperDash.Essentials.Core.Shades.IShades;
|
using IShades = PepperDash.Essentials.Core.Shades.IShades;
|
||||||
using ShadeBase = PepperDash.Essentials.Devices.Common.Shades.ShadeBase;
|
using ShadeBase = PepperDash.Essentials.Devices.Common.Shades.ShadeBase;
|
||||||
|
|
||||||
@@ -485,6 +485,7 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
/// Sends the full status of the room to the server
|
/// Sends the full status of the room to the server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="room"></param>
|
/// <param name="room"></param>
|
||||||
|
/// <param name="id"></param>
|
||||||
private void SendFullStatusForClientId(string id, IEssentialsRoom room)
|
private void SendFullStatusForClientId(string id, IEssentialsRoom room)
|
||||||
{
|
{
|
||||||
//Parent.SendMessageObject(GetFullStatus(room));
|
//Parent.SendMessageObject(GetFullStatus(room));
|
||||||
@@ -554,6 +555,7 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Determines the configuration of the room and the details about the devices associated with the room
|
/// Determines the configuration of the room and the details about the devices associated with the room
|
||||||
|
/// </summary>
|
||||||
/// <param name="room"></param>
|
/// <param name="room"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private RoomConfiguration GetRoomConfiguration(IEssentialsRoom room)
|
private RoomConfiguration GetRoomConfiguration(IEssentialsRoom room)
|
||||||
@@ -798,31 +800,38 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class RoomStateMessage : DeviceStateMessageBase
|
public class RoomStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("configuration", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Configuration
|
/// Gets or sets the Configuration
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("configuration", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public RoomConfiguration Configuration { get; set; }
|
public RoomConfiguration Configuration { get; set; }
|
||||||
|
|
||||||
[JsonProperty("activityMode", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("activityMode", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public int? ActivityMode { get; set; }
|
public int? ActivityMode { get; set; }
|
||||||
|
|
||||||
[JsonProperty("advancedSharingActive", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("advancedSharingActive", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? AdvancedSharingActive { get; set; }
|
public bool? AdvancedSharingActive { get; set; }
|
||||||
|
|
||||||
[JsonProperty("isOn", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isOn", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsOn { get; set; }
|
public bool? IsOn { get; set; }
|
||||||
|
|
||||||
[JsonProperty("isWarmingUp", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isWarmingUp", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsWarmingUp { get; set; }
|
public bool? IsWarmingUp { get; set; }
|
||||||
|
|
||||||
[JsonProperty("isCoolingDown", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isCoolingDown", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsCoolingDown { get; set; }
|
public bool? IsCoolingDown { get; set; }
|
||||||
[JsonProperty("selectedSourceKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the SelectedSourceKey
|
/// Gets or sets the SelectedSourceKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("selectedSourceKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string SelectedSourceKey { get; set; }
|
public string SelectedSourceKey { get; set; }
|
||||||
[JsonProperty("share", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Share
|
/// Gets or sets the Share
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("share", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public ShareState Share { get; set; }
|
public ShareState Share { get; set; }
|
||||||
|
|
||||||
[JsonProperty("volumes", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("volumes", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
@@ -837,13 +846,16 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ShareState
|
public class ShareState
|
||||||
{
|
{
|
||||||
[JsonProperty("currentShareText", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the CurrentShareText
|
/// Gets or sets the CurrentShareText
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("currentShareText", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string CurrentShareText { get; set; }
|
public string CurrentShareText { get; set; }
|
||||||
|
|
||||||
[JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? Enabled { get; set; }
|
public bool? Enabled { get; set; }
|
||||||
|
|
||||||
[JsonProperty("isSharing", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isSharing", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsSharing { get; set; }
|
public bool? IsSharing { get; set; }
|
||||||
}
|
}
|
||||||
@@ -853,131 +865,156 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class RoomConfiguration
|
public class RoomConfiguration
|
||||||
{
|
{
|
||||||
//[JsonProperty("shutdownPromptSeconds", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
//public int? ShutdownPromptSeconds { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("hasVideoConferencing", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasVideoConferencing", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasVideoConferencing { get; set; }
|
public bool? HasVideoConferencing { get; set; }
|
||||||
|
|
||||||
[JsonProperty("videoCodecIsZoomRoom", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("videoCodecIsZoomRoom", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? VideoCodecIsZoomRoom { get; set; }
|
public bool? VideoCodecIsZoomRoom { get; set; }
|
||||||
|
|
||||||
[JsonProperty("hasAudioConferencing", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasAudioConferencing", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasAudioConferencing { get; set; }
|
public bool? HasAudioConferencing { get; set; }
|
||||||
|
|
||||||
[JsonProperty("hasEnvironmentalControls", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasEnvironmentalControls", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasEnvironmentalControls { get; set; }
|
public bool? HasEnvironmentalControls { get; set; }
|
||||||
|
|
||||||
[JsonProperty("hasCameraControls", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasCameraControls", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasCameraControls { get; set; }
|
public bool? HasCameraControls { get; set; }
|
||||||
|
|
||||||
[JsonProperty("hasSetTopBoxControls", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasSetTopBoxControls", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasSetTopBoxControls { get; set; }
|
public bool? HasSetTopBoxControls { get; set; }
|
||||||
|
|
||||||
[JsonProperty("hasRoutingControls", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasRoutingControls", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasRoutingControls { get; set; }
|
public bool? HasRoutingControls { get; set; }
|
||||||
|
|
||||||
[JsonProperty("touchpanelKeys", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the TouchpanelKeys
|
/// Gets or sets the TouchpanelKeys
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("touchpanelKeys", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<string> TouchpanelKeys { get; set; }
|
public List<string> TouchpanelKeys { get; set; }
|
||||||
|
|
||||||
[JsonProperty("zoomRoomControllerKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the ZoomRoomControllerKey
|
/// Gets or sets the ZoomRoomControllerKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("zoomRoomControllerKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string ZoomRoomControllerKey { get; set; }
|
public string ZoomRoomControllerKey { get; set; }
|
||||||
|
|
||||||
[JsonProperty("ciscoNavigatorKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the CiscoNavigatorKey
|
/// Gets or sets the CiscoNavigatorKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("ciscoNavigatorKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string CiscoNavigatorKey { get; set; }
|
public string CiscoNavigatorKey { get; set; }
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty("videoCodecKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the VideoCodecKey
|
/// Gets or sets the VideoCodecKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("videoCodecKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string VideoCodecKey { get; set; }
|
public string VideoCodecKey { get; set; }
|
||||||
[JsonProperty("audioCodecKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the AudioCodecKey
|
/// Gets or sets the AudioCodecKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("audioCodecKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string AudioCodecKey { get; set; }
|
public string AudioCodecKey { get; set; }
|
||||||
[JsonProperty("matrixRoutingKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the MatrixRoutingKey
|
/// Gets or sets the MatrixRoutingKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("matrixRoutingKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string MatrixRoutingKey { get; set; }
|
public string MatrixRoutingKey { get; set; }
|
||||||
[JsonProperty("endpointKeys", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the EndpointKeys
|
/// Gets or sets the EndpointKeys
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("endpointKeys", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<string> EndpointKeys { get; set; }
|
public List<string> EndpointKeys { get; set; }
|
||||||
|
|
||||||
[JsonProperty("accessoryDeviceKeys", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the AccessoryDeviceKeys
|
/// Gets or sets the AccessoryDeviceKeys
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("accessoryDeviceKeys", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<string> AccessoryDeviceKeys { get; set; }
|
public List<string> AccessoryDeviceKeys { get; set; }
|
||||||
|
|
||||||
[JsonProperty("defaultDisplayKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the DefaultDisplayKey
|
/// Gets or sets the DefaultDisplayKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("defaultDisplayKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string DefaultDisplayKey { get; set; }
|
public string DefaultDisplayKey { get; set; }
|
||||||
|
|
||||||
[JsonProperty("destinations", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("destinations", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<eSourceListItemDestinationTypes, string> Destinations { get; set; }
|
public Dictionary<eSourceListItemDestinationTypes, string> Destinations { get; set; }
|
||||||
[JsonProperty("environmentalDevices", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the EnvironmentalDevices
|
/// Gets or sets the EnvironmentalDevices
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("environmentalDevices", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<EnvironmentalDeviceConfiguration> EnvironmentalDevices { get; set; }
|
public List<EnvironmentalDeviceConfiguration> EnvironmentalDevices { get; set; }
|
||||||
|
|
||||||
[JsonProperty("sourceList", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("sourceList", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<string, SourceListItem> SourceList { get; set; }
|
public Dictionary<string, SourceListItem> SourceList { get; set; }
|
||||||
|
|
||||||
[JsonProperty("destinationList", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("destinationList", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<string, DestinationListItem> DestinationList { get; set; }
|
public Dictionary<string, DestinationListItem> DestinationList { get; set; }
|
||||||
|
|
||||||
[JsonProperty("audioControlPointList", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the AudioControlPointList
|
/// Gets or sets the AudioControlPointList
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("audioControlPointList", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public AudioControlPointListItem AudioControlPointList { get; set; }
|
public AudioControlPointListItem AudioControlPointList { get; set; }
|
||||||
|
|
||||||
[JsonProperty("cameraList", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("cameraList", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<string, CameraListItem> CameraList { get; set; }
|
public Dictionary<string, CameraListItem> CameraList { get; set; }
|
||||||
|
|
||||||
[JsonProperty("defaultPresentationSourceKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the DefaultPresentationSourceKey
|
/// Gets or sets the DefaultPresentationSourceKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("defaultPresentationSourceKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string DefaultPresentationSourceKey { get; set; }
|
public string DefaultPresentationSourceKey { get; set; }
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty("helpMessage", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the HelpMessage
|
/// Gets or sets the HelpMessage
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("helpMessage", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string HelpMessage { get; set; }
|
public string HelpMessage { get; set; }
|
||||||
|
|
||||||
[JsonProperty("techPassword", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the TechPassword
|
/// Gets or sets the TechPassword
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("techPassword", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string TechPassword { get; set; }
|
public string TechPassword { get; set; }
|
||||||
|
|
||||||
[JsonProperty("uiBehavior", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the UiBehavior
|
/// Gets or sets the UiBehavior
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("uiBehavior", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public EssentialsRoomUiBehaviorConfig UiBehavior { get; set; }
|
public EssentialsRoomUiBehaviorConfig UiBehavior { get; set; }
|
||||||
|
|
||||||
[JsonProperty("supportsAdvancedSharing", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("supportsAdvancedSharing", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? SupportsAdvancedSharing { get; set; }
|
public bool? SupportsAdvancedSharing { get; set; }
|
||||||
|
|
||||||
[JsonProperty("userCanChangeShareMode", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("userCanChangeShareMode", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? UserCanChangeShareMode { get; set; }
|
public bool? UserCanChangeShareMode { get; set; }
|
||||||
|
|
||||||
[JsonProperty("roomCombinerKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the RoomCombinerKey
|
/// Gets or sets the RoomCombinerKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("roomCombinerKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string RoomCombinerKey { get; set; }
|
public string RoomCombinerKey { get; set; }
|
||||||
|
|
||||||
public RoomConfiguration()
|
public RoomConfiguration()
|
||||||
@@ -994,17 +1031,19 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class EnvironmentalDeviceConfiguration
|
public class EnvironmentalDeviceConfiguration
|
||||||
{
|
{
|
||||||
[JsonProperty("deviceKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the DeviceKey
|
/// Gets or sets the DeviceKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("deviceKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string DeviceKey { get; private set; }
|
public string DeviceKey { get; private set; }
|
||||||
|
|
||||||
[JsonConverter(typeof(StringEnumConverter))]
|
|
||||||
[JsonProperty("deviceType", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the DeviceType
|
/// Gets or sets the DeviceType
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonConverter(typeof(StringEnumConverter))]
|
||||||
|
[JsonProperty("deviceType", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public eEnvironmentalDeviceTypes DeviceType { get; private set; }
|
public eEnvironmentalDeviceTypes DeviceType { get; private set; }
|
||||||
|
|
||||||
public EnvironmentalDeviceConfiguration(string key, eEnvironmentalDeviceTypes type)
|
public EnvironmentalDeviceConfiguration(string key, eEnvironmentalDeviceTypes type)
|
||||||
@@ -1031,57 +1070,18 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ApiTouchPanelToken
|
public class ApiTouchPanelToken
|
||||||
{
|
{
|
||||||
[JsonProperty("touchPanels", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the TouchPanels
|
/// Gets or sets the TouchPanels
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("touchPanels", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<JoinToken> TouchPanels { get; set; } = new List<JoinToken>();
|
public List<JoinToken> TouchPanels { get; set; } = new List<JoinToken>();
|
||||||
|
|
||||||
[JsonProperty("userAppUrl", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the UserAppUrl
|
/// Gets or sets the UserAppUrl
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("userAppUrl", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string UserAppUrl { get; set; } = "";
|
public string UserAppUrl { get; set; } = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SERIES3
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a SourceSelectMessageContent
|
|
||||||
/// </summary>
|
|
||||||
public class SourceSelectMessageContent
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the SourceListItem
|
|
||||||
/// </summary>
|
|
||||||
public string SourceListItem { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the SourceListKey
|
|
||||||
/// </summary>
|
|
||||||
public string SourceListKey { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a DirectRoute
|
|
||||||
/// </summary>
|
|
||||||
public class DirectRoute
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the SourceKey
|
|
||||||
/// </summary>
|
|
||||||
public string SourceKey { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the DestinationKey
|
|
||||||
/// </summary>
|
|
||||||
public string DestinationKey { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="b"></param>
|
|
||||||
/// <summary>
|
|
||||||
/// Delegate for PressAndHoldAction
|
|
||||||
/// </summary>
|
|
||||||
public delegate void PressAndHoldAction(bool b);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
@@ -16,8 +16,8 @@ using PepperDash.Essentials.Core.Config;
|
|||||||
using PepperDash.Essentials.Core.DeviceInfo;
|
using PepperDash.Essentials.Core.DeviceInfo;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using PepperDash.Essentials.Core.UI;
|
using PepperDash.Essentials.Core.UI;
|
||||||
using Serilog.Events;
|
|
||||||
using Feedback = PepperDash.Essentials.Core.Feedback;
|
using Feedback = PepperDash.Essentials.Core.Feedback;
|
||||||
|
using IPAddress = System.Net.IPAddress;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Touchpanel
|
namespace PepperDash.Essentials.Touchpanel
|
||||||
{
|
{
|
||||||
@@ -107,11 +107,14 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public DeviceInfo DeviceInfo => new DeviceInfo();
|
public DeviceInfo DeviceInfo => new DeviceInfo();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the list of connected IPs for this IpId
|
||||||
|
/// </summary>
|
||||||
public ReadOnlyCollection<ConnectedIpInformation> ConnectedIps => Panel.ConnectedIpList;
|
public ReadOnlyCollection<ConnectedIpInformation> ConnectedIps => Panel.ConnectedIpList;
|
||||||
|
|
||||||
private System.Net.IPAddress csIpAddress;
|
private readonly IPAddress csIpAddress;
|
||||||
|
|
||||||
private System.Net.IPAddress csSubnetMask;
|
private readonly IPAddress csSubnetMask;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -197,8 +200,8 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
var csSubnetMask = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_MASK, csAdapterId);
|
var csSubnetMask = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_MASK, csAdapterId);
|
||||||
var csIpAddress = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, csAdapterId);
|
var csIpAddress = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, csAdapterId);
|
||||||
|
|
||||||
this.csSubnetMask = System.Net.IPAddress.Parse(csSubnetMask);
|
this.csSubnetMask = IPAddress.Parse(csSubnetMask);
|
||||||
this.csIpAddress = System.Net.IPAddress.Parse(csIpAddress);
|
this.csIpAddress = IPAddress.Parse(csIpAddress);
|
||||||
}
|
}
|
||||||
catch (ArgumentException)
|
catch (ArgumentException)
|
||||||
{
|
{
|
||||||
@@ -242,7 +245,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
{
|
{
|
||||||
x70Panel.ExtenderApplicationControlReservedSigs.DeviceExtenderSigChange += (e, a) =>
|
x70Panel.ExtenderApplicationControlReservedSigs.DeviceExtenderSigChange += (e, a) =>
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, this, $"X70 App Control Device Extender args: {a.Event}:{a.Sig}:{a.Sig.Type}:{a.Sig.BoolValue}:{a.Sig.UShortValue}:{a.Sig.StringValue}");
|
this.LogVerbose("X70 App Control Device Extender args: {event}:{sig}:{type}:{boolValue}:{ushortValue}:{stringValue}", a.Event, a.Sig, a.Sig.Type, a.Sig.BoolValue, a.Sig.UShortValue, a.Sig.StringValue);
|
||||||
|
|
||||||
UpdateZoomFeedbacks();
|
UpdateZoomFeedbacks();
|
||||||
|
|
||||||
@@ -261,7 +264,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
|
|
||||||
x70Panel.ExtenderZoomRoomAppReservedSigs.DeviceExtenderSigChange += (e, a) =>
|
x70Panel.ExtenderZoomRoomAppReservedSigs.DeviceExtenderSigChange += (e, a) =>
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, this, $"X70 Zoom Room Ap Device Extender args: {a.Event}:{a.Sig}:{a.Sig.Type}:{a.Sig.BoolValue}:{a.Sig.UShortValue}:{a.Sig.StringValue}");
|
this.LogVerbose("X70 Zoom Room App Device Extender args: {event}:{sig}:{type}:{boolValue}:{ushortValue}:{stringValue}", a.Event, a.Sig, a.Sig.Type, a.Sig.BoolValue, a.Sig.UShortValue, a.Sig.StringValue);
|
||||||
|
|
||||||
if (a.Sig.Number == x70Panel.ExtenderZoomRoomAppReservedSigs.ZoomRoomIncomingCallFeedback.Number)
|
if (a.Sig.Number == x70Panel.ExtenderZoomRoomAppReservedSigs.ZoomRoomIncomingCallFeedback.Number)
|
||||||
{
|
{
|
||||||
@@ -279,7 +282,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
DeviceInfo.MacAddress = x70Panel.ExtenderEthernetReservedSigs.MacAddressFeedback.StringValue;
|
DeviceInfo.MacAddress = x70Panel.ExtenderEthernetReservedSigs.MacAddressFeedback.StringValue;
|
||||||
DeviceInfo.IpAddress = x70Panel.ExtenderEthernetReservedSigs.IpAddressFeedback.StringValue;
|
DeviceInfo.IpAddress = x70Panel.ExtenderEthernetReservedSigs.IpAddressFeedback.StringValue;
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, this, $"MAC: {DeviceInfo.MacAddress} IP: {DeviceInfo.IpAddress}");
|
this.LogDebug("MAC: {macAddress} IP: {ipAddress}", DeviceInfo.MacAddress, DeviceInfo.IpAddress);
|
||||||
|
|
||||||
var handler = DeviceInfoChanged;
|
var handler = DeviceInfoChanged;
|
||||||
|
|
||||||
@@ -309,7 +312,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
{
|
{
|
||||||
x60withZoomApp.ExtenderApplicationControlReservedSigs.DeviceExtenderSigChange += (e, a) =>
|
x60withZoomApp.ExtenderApplicationControlReservedSigs.DeviceExtenderSigChange += (e, a) =>
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, this, $"X60 App Control Device Extender args: {a.Event}:{a.Sig}:{a.Sig.Type}:{a.Sig.BoolValue}:{a.Sig.UShortValue}:{a.Sig.StringValue}");
|
this.LogVerbose("X60 App Control Device Extender args: {event}:{sig}:{type}:{boolValue}:{ushortValue}:{stringValue}", a.Event, a.Sig, a.Sig.Type, a.Sig.BoolValue, a.Sig.UShortValue, a.Sig.StringValue);
|
||||||
|
|
||||||
if (a.Sig.Number == x60withZoomApp.ExtenderApplicationControlReservedSigs.HideOpenApplicationFeedback.Number)
|
if (a.Sig.Number == x60withZoomApp.ExtenderApplicationControlReservedSigs.HideOpenApplicationFeedback.Number)
|
||||||
{
|
{
|
||||||
@@ -318,7 +321,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
};
|
};
|
||||||
x60withZoomApp.ExtenderZoomRoomAppReservedSigs.DeviceExtenderSigChange += (e, a) =>
|
x60withZoomApp.ExtenderZoomRoomAppReservedSigs.DeviceExtenderSigChange += (e, a) =>
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, this, $"X60 Zoom Room App Device Extender args: {a.Event}:{a.Sig}:{a.Sig.Type}:{a.Sig.BoolValue}:{a.Sig.UShortValue}:{a.Sig.StringValue}");
|
this.LogVerbose("X60 Zoom Room App Device Extender args: {event}:{sig}:{type}:{boolValue}:{ushortValue}:{stringValue}", a.Event, a.Sig, a.Sig.Type, a.Sig.BoolValue, a.Sig.UShortValue, a.Sig.StringValue);
|
||||||
|
|
||||||
if (a.Sig.Number == x60withZoomApp.ExtenderZoomRoomAppReservedSigs.ZoomRoomIncomingCallFeedback.Number)
|
if (a.Sig.Number == x60withZoomApp.ExtenderZoomRoomAppReservedSigs.ZoomRoomIncomingCallFeedback.Number)
|
||||||
{
|
{
|
||||||
@@ -335,7 +338,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
DeviceInfo.MacAddress = x60withZoomApp.ExtenderEthernetReservedSigs.MacAddressFeedback.StringValue;
|
DeviceInfo.MacAddress = x60withZoomApp.ExtenderEthernetReservedSigs.MacAddressFeedback.StringValue;
|
||||||
DeviceInfo.IpAddress = x60withZoomApp.ExtenderEthernetReservedSigs.IpAddressFeedback.StringValue;
|
DeviceInfo.IpAddress = x60withZoomApp.ExtenderEthernetReservedSigs.IpAddressFeedback.StringValue;
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, this, $"MAC: {DeviceInfo.MacAddress} IP: {DeviceInfo.IpAddress}");
|
this.LogDebug("MAC: {macAddress} IP: {ipAddress}", DeviceInfo.MacAddress, DeviceInfo.IpAddress);
|
||||||
|
|
||||||
var handler = DeviceInfoChanged;
|
var handler = DeviceInfoChanged;
|
||||||
|
|
||||||
@@ -397,7 +400,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// <param name="args">The signal event arguments containing the changed signal information.</param>
|
/// <param name="args">The signal event arguments containing the changed signal information.</param>
|
||||||
protected override void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args)
|
protected override void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Verbose, this, $"System Device Extender args: ${args.Event}:${args.Sig}");
|
this.LogVerbose("System Device Extender args: {event}:{sig}", args.Event, args.Sig);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -452,7 +455,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
|
|
||||||
var processorIp = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, lanAdapterId);
|
var processorIp = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, lanAdapterId);
|
||||||
|
|
||||||
if(csIpAddress == null || csSubnetMask == null || url == null)
|
if (csIpAddress == null || csSubnetMask == null || url == null)
|
||||||
{
|
{
|
||||||
this.LogWarning("CS IP Address Subnet Mask or url is null, cannot determine correct IP for URL");
|
this.LogWarning("CS IP Address Subnet Mask or url is null, cannot determine correct IP for URL");
|
||||||
return url;
|
return url;
|
||||||
@@ -463,7 +466,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
|
|
||||||
var ip = ConnectedIps.Any(ipInfo =>
|
var ip = ConnectedIps.Any(ipInfo =>
|
||||||
{
|
{
|
||||||
if (System.Net.IPAddress.TryParse(ipInfo.DeviceIpAddress, out var parsedIp))
|
if (IPAddress.TryParse(ipInfo.DeviceIpAddress, out var parsedIp))
|
||||||
{
|
{
|
||||||
return csIpAddress.IsInSameSubnet(parsedIp, csSubnetMask);
|
return csIpAddress.IsInSameSubnet(parsedIp, csSubnetMask);
|
||||||
}
|
}
|
||||||
@@ -497,7 +500,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
|
|
||||||
if (mcList.Count == 0)
|
if (mcList.Count == 0)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Information, this, $"No Mobile Control controller found");
|
this.LogError("No Mobile Control controller found");
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -509,7 +512,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
|
|
||||||
if (bridge == null)
|
if (bridge == null)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Information, this, $"No Mobile Control bridge for {_config.DefaultRoomKey} found ");
|
this.LogInformation("No Mobile Control bridge for {roomKey} found", _config.DefaultRoomKey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -554,7 +557,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
{
|
{
|
||||||
foreach (var feedback in ZoomFeedbacks)
|
foreach (var feedback in ZoomFeedbacks)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, this, $"Updating {feedback.Key}");
|
this.LogDebug("Updating {feedbackKey}", feedback.Key);
|
||||||
feedback.FireUpdate();
|
feedback.FireUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -590,7 +593,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
|
|
||||||
if (Panel is TswX60WithZoomRoomAppReservedSigs)
|
if (Panel is TswX60WithZoomRoomAppReservedSigs)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Information, this, $"X60 panel does not support zoom app");
|
this.LogInformation("X60 panel does not support zoom app");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -666,7 +669,16 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
handler(this, new DeviceInfoEventArgs(DeviceInfo));
|
handler(this, new DeviceInfoEventArgs(DeviceInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, this, $"MAC: {DeviceInfo.MacAddress} IP: {DeviceInfo.IpAddress}");
|
this.LogDebug("MAC: {macAddress} IP: {ipAddress}", DeviceInfo.MacAddress, DeviceInfo.IpAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Force a reload of the iframe on the panel connected to this IP ID
|
||||||
|
/// </summary>
|
||||||
|
public void ReloadIframe()
|
||||||
|
{
|
||||||
|
this.LogInformation("Pulsing join 1");
|
||||||
|
Panel.PulseBool(1, 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -675,6 +687,8 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class MobileControlTouchpanelControllerFactory : EssentialsPluginDeviceFactory<MobileControlTouchpanelController>
|
public class MobileControlTouchpanelControllerFactory : EssentialsPluginDeviceFactory<MobileControlTouchpanelController>
|
||||||
{
|
{
|
||||||
|
private Dictionary<string, Func<uint, CrestronControlSystem, string, BasicTriListWithSmartObject>> factories;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the MobileControlTouchpanelControllerFactory class.
|
/// Initializes a new instance of the MobileControlTouchpanelControllerFactory class.
|
||||||
/// Sets up supported device type names and minimum framework version requirements.
|
/// Sets up supported device type names and minimum framework version requirements.
|
||||||
@@ -683,6 +697,31 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
{
|
{
|
||||||
TypeNames = new List<string>() { "mccrestronapp", "mctsw550", "mctsw750", "mctsw1050", "mctsw560", "mctsw760", "mctsw1060", "mctsw570", "mctsw770", "mcts770", "mctsw1070", "mcts1070", "mcxpanel", "mcdge1000" };
|
TypeNames = new List<string>() { "mccrestronapp", "mctsw550", "mctsw750", "mctsw1050", "mctsw560", "mctsw760", "mctsw1060", "mctsw570", "mctsw770", "mcts770", "mctsw1070", "mcts1070", "mcxpanel", "mcdge1000" };
|
||||||
MinimumEssentialsFrameworkVersion = "2.0.0";
|
MinimumEssentialsFrameworkVersion = "2.0.0";
|
||||||
|
|
||||||
|
factories = new Dictionary<string, Func<uint, CrestronControlSystem, string, BasicTriListWithSmartObject>>
|
||||||
|
{
|
||||||
|
{"crestronapp", (id, controlSystem, projectName) => {
|
||||||
|
var app = new CrestronApp(id, Global.ControlSystem);
|
||||||
|
app.ParameterProjectName.Value = projectName;
|
||||||
|
return app;
|
||||||
|
}},
|
||||||
|
{"xpanel", (id, controlSystem, projectName) => new XpanelForHtml5(id, controlSystem)},
|
||||||
|
{"tsw550", (id, controlSystem, projectName) => new Tsw550(id, controlSystem)},
|
||||||
|
{"tsw552", (id, controlSystem, projectName) => new Tsw552(id, controlSystem)},
|
||||||
|
{"tsw560", (id, controlSystem, projectName) => new Tsw560(id, controlSystem)},
|
||||||
|
{"tsw750", (id, controlSystem, projectName) => new Tsw750(id, controlSystem)},
|
||||||
|
{"tsw752", (id, controlSystem, projectName) => new Tsw752(id, controlSystem)},
|
||||||
|
{"tsw760", (id, controlSystem, projectName) => new Tsw760(id, controlSystem)},
|
||||||
|
{"tsw1050", (id, controlSystem, projectName) => new Tsw1050(id, controlSystem)},
|
||||||
|
{"tsw1052", (id, controlSystem, projectName) => new Tsw1052(id, controlSystem)},
|
||||||
|
{"tsw1060", (id, controlSystem, projectName) => new Tsw1060(id, controlSystem)},
|
||||||
|
{"tsw570", (id, controlSystem, projectName) => new Tsw570(id, controlSystem)},
|
||||||
|
{"tsw770", (id, controlSystem, projectName) => new Tsw770(id, controlSystem)},
|
||||||
|
{"ts770", (id, controlSystem, projectName) => new Ts770(id, controlSystem)},
|
||||||
|
{"tsw1070", (id, controlSystem, projectName) => new Tsw1070(id, controlSystem)},
|
||||||
|
{"ts1070", (id, controlSystem, projectName) => new Ts1070(id, controlSystem)},
|
||||||
|
{"dge1000", (id, controlSystem, projectName) => new Dge1000(id, controlSystem)}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -702,10 +741,10 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
|
|
||||||
if (panel == null)
|
if (panel == null)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Information, "Unable to create Touchpanel for type {0}. Touchpanel Controller WILL NOT function correctly", dc.Type);
|
Debug.LogError("Unable to create Touchpanel for type {type}. Touchpanel Controller WILL NOT function correctly", dc.Type);
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Factory Attempting to create new MobileControlTouchpanelController");
|
Debug.LogDebug("Factory Attempting to create new MobileControlTouchpanelController");
|
||||||
|
|
||||||
var panelController = new MobileControlTouchpanelController(dc.Key, dc.Name, panel, props);
|
var panelController = new MobileControlTouchpanelController(dc.Key, dc.Name, panel, props);
|
||||||
|
|
||||||
@@ -715,56 +754,21 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
private BasicTriListWithSmartObject GetPanelForType(string type, uint id, string projectName)
|
private BasicTriListWithSmartObject GetPanelForType(string type, uint id, string projectName)
|
||||||
{
|
{
|
||||||
type = type.ToLower().Replace("mc", "");
|
type = type.ToLower().Replace("mc", "");
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (type == "crestronapp")
|
if (!factories.TryGetValue(type, out var buildCrestronHardwareDevice))
|
||||||
{
|
{
|
||||||
var app = new CrestronApp(id, Global.ControlSystem);
|
Debug.LogError("Cannot create TSW controller with type {type}", type);
|
||||||
app.ParameterProjectName.Value = projectName;
|
|
||||||
return app;
|
|
||||||
}
|
|
||||||
else if (type == "xpanel")
|
|
||||||
return new XpanelForHtml5(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw550")
|
|
||||||
return new Tsw550(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw552")
|
|
||||||
return new Tsw552(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw560")
|
|
||||||
return new Tsw560(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw750")
|
|
||||||
return new Tsw750(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw752")
|
|
||||||
return new Tsw752(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw760")
|
|
||||||
return new Tsw760(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw1050")
|
|
||||||
return new Tsw1050(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw1052")
|
|
||||||
return new Tsw1052(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw1060")
|
|
||||||
return new Tsw1060(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw570")
|
|
||||||
return new Tsw570(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw770")
|
|
||||||
return new Tsw770(id, Global.ControlSystem);
|
|
||||||
else if (type == "ts770")
|
|
||||||
return new Ts770(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw1070")
|
|
||||||
return new Tsw1070(id, Global.ControlSystem);
|
|
||||||
else if (type == "ts1070")
|
|
||||||
return new Ts1070(id, Global.ControlSystem);
|
|
||||||
else if (type == "dge1000")
|
|
||||||
return new Dge1000(id, Global.ControlSystem);
|
|
||||||
else
|
|
||||||
|
|
||||||
{
|
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Warning, "WARNING: Cannot create TSW controller with type '{0}'", type);
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return buildCrestronHardwareDevice(id, Global.ControlSystem, projectName);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Warning, "WARNING: Cannot create TSW base class. Panel will not function: {0}", e.Message);
|
Debug.LogError("Cannot create TSW base class. Panel will not function: {message}", e.Message);
|
||||||
|
Debug.LogDebug(e, "Stack Trace: ");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,28 +8,32 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class MobileControlTouchpanelProperties : CrestronTouchpanelPropertiesConfig
|
public class MobileControlTouchpanelProperties : CrestronTouchpanelPropertiesConfig
|
||||||
{
|
{
|
||||||
[JsonProperty("useDirectServer")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the UseDirectServer
|
/// Gets or sets the UseDirectServer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("useDirectServer")]
|
||||||
public bool UseDirectServer { get; set; } = false;
|
public bool UseDirectServer { get; set; } = false;
|
||||||
|
|
||||||
[JsonProperty("zoomRoomController")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the ZoomRoomController
|
/// Gets or sets the ZoomRoomController
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("zoomRoomController")]
|
||||||
public bool ZoomRoomController { get; set; } = false;
|
public bool ZoomRoomController { get; set; } = false;
|
||||||
|
|
||||||
[JsonProperty("buttonToolbarTimeoutInS")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the ButtonToolbarTimoutInS
|
/// Gets or sets the ButtonToolbarTimoutInS
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("buttonToolbarTimeoutInS")]
|
||||||
public ushort ButtonToolbarTimoutInS { get; set; } = 0;
|
public ushort ButtonToolbarTimoutInS { get; set; } = 0;
|
||||||
|
|
||||||
[JsonProperty("theme")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Theme
|
/// Gets or sets the Theme
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("theme")]
|
||||||
public string Theme { get; set; } = "light";
|
public string Theme { get; set; } = "light";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,10 +42,11 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ThemeUpdateMessage : DeviceStateMessageBase
|
public class ThemeUpdateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
[JsonProperty("theme")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Theme
|
/// Gets or sets the Theme
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("theme")]
|
||||||
public string Theme { get; set; }
|
public string Theme { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
17
src/PepperDash.Essentials.MobileControl/UserCodeChanged.cs
Normal file
17
src/PepperDash.Essentials.MobileControl/UserCodeChanged.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a UserCodeChanged
|
||||||
|
/// </summary>
|
||||||
|
public class UserCodeChanged
|
||||||
|
{
|
||||||
|
public Action<string, string> UpdateUserCode { get; private set; }
|
||||||
|
|
||||||
|
public UserCodeChanged(Action<string, string> updateMethod)
|
||||||
|
{
|
||||||
|
UpdateUserCode = updateMethod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,16 +7,18 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class UserCodeChangedContent
|
public class UserCodeChangedContent
|
||||||
{
|
{
|
||||||
[JsonProperty("userCode")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the UserCode
|
/// Gets or sets the UserCode
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("userCode")]
|
||||||
public string UserCode { get; set; }
|
public string UserCode { get; set; }
|
||||||
|
|
||||||
[JsonProperty("qrChecksum", NullValueHandling = NullValueHandling.Include)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the QrChecksum
|
/// Gets or sets the QrChecksum
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("qrChecksum", NullValueHandling = NullValueHandling.Include)]
|
||||||
public string QrChecksum { get; set; }
|
public string QrChecksum { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using Newtonsoft.Json;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
@@ -8,10 +8,11 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Volumes
|
public class Volumes
|
||||||
{
|
{
|
||||||
[JsonProperty("master", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Master
|
/// Gets or sets the Master
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("master", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Volume Master { get; set; }
|
public Volume Master { get; set; }
|
||||||
|
|
||||||
[JsonProperty("auxFaders", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("auxFaders", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
@@ -30,10 +31,11 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Volume
|
public class Volume
|
||||||
{
|
{
|
||||||
[JsonProperty("key", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Key
|
/// Gets or sets the Key
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("key", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Key { get; set; }
|
public string Key { get; set; }
|
||||||
|
|
||||||
[JsonProperty("level", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("level", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
@@ -42,10 +44,11 @@ namespace PepperDash.Essentials
|
|||||||
[JsonProperty("muted", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("muted", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? Muted { get; set; }
|
public bool? Muted { get; set; }
|
||||||
|
|
||||||
[JsonProperty("label", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Label
|
/// Gets or sets the Label
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("label", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Label { get; set; }
|
public string Label { get; set; }
|
||||||
|
|
||||||
[JsonProperty("hasMute", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasMute", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
@@ -58,10 +61,11 @@ namespace PepperDash.Essentials
|
|||||||
public bool? PrivacyMuted { get; set; }
|
public bool? PrivacyMuted { get; set; }
|
||||||
|
|
||||||
|
|
||||||
[JsonProperty("muteIcon", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the MuteIcon
|
/// Gets or sets the MuteIcon
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("muteIcon", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string MuteIcon { get; set; }
|
public string MuteIcon { get; set; }
|
||||||
|
|
||||||
public Volume(string key, int level, bool muted, string label, bool hasMute, string muteIcon)
|
public Volume(string key, int level, bool muted, string label, bool hasMute, string muteIcon)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
using Crestron.SimplSharp.WebScripting;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Crestron.SimplSharp.WebScripting;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
using PepperDash.Core.Web.RequestHandlers;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.WebApiHandlers
|
namespace PepperDash.Essentials.WebApiHandlers
|
||||||
{
|
{
|
||||||
@@ -51,16 +51,18 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ActionPath
|
public class ActionPath
|
||||||
{
|
{
|
||||||
[JsonProperty("messengerKey")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the MessengerKey
|
/// Gets or sets the MessengerKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("messengerKey")]
|
||||||
public string MessengerKey { get; set; }
|
public string MessengerKey { get; set; }
|
||||||
|
|
||||||
[JsonProperty("path")]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Path
|
/// Gets or sets the Path
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("path")]
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,22 +148,25 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ClientRequest
|
public class ClientRequest
|
||||||
{
|
{
|
||||||
[JsonProperty("roomKey", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the RoomKey
|
/// Gets or sets the RoomKey
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("roomKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string RoomKey { get; set; }
|
public string RoomKey { get; set; }
|
||||||
|
|
||||||
[JsonProperty("grantCode", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the GrantCode
|
/// Gets or sets the GrantCode
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("grantCode", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string GrantCode { get; set; }
|
public string GrantCode { get; set; }
|
||||||
|
|
||||||
[JsonProperty("token", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Token
|
/// Gets or sets the Token
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("token", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Token { get; set; }
|
public string Token { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -172,22 +175,25 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ClientResponse
|
public class ClientResponse
|
||||||
{
|
{
|
||||||
[JsonProperty("error", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Error
|
/// Gets or sets the Error
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("error", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Error { get; set; }
|
public string Error { get; set; }
|
||||||
|
|
||||||
[JsonProperty("token", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Token
|
/// Gets or sets the Token
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("token", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Token { get; set; }
|
public string Token { get; set; }
|
||||||
|
|
||||||
[JsonProperty("path", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Path
|
/// Gets or sets the Path
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[JsonProperty("path", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Path { get; set; }
|
public string Path { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents info about a device including supproted interfaces
|
||||||
|
/// </summary>
|
||||||
|
public class DeviceInterfaceInfo : IKeyName
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Key
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("key")]
|
||||||
|
public string Key { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Name
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("name")]
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Interfaces
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("interfaces")]
|
||||||
|
public List<string> Interfaces { get; set; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.WebSocketServer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a JoinResponse
|
||||||
|
/// </summary>
|
||||||
|
public class JoinResponse
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the ClientId
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("clientId")]
|
||||||
|
public string ClientId { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("roomKey")]
|
||||||
|
public string RoomKey { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("systemUUid")]
|
||||||
|
public string SystemUuid { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the RoomUuid
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("roomUUid")]
|
||||||
|
public string RoomUuid { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Config
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("config")]
|
||||||
|
public object Config { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the CodeExpires
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("codeExpires")]
|
||||||
|
public DateTime CodeExpires { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the UserCode
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("userCode")]
|
||||||
|
public string UserCode { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the UserAppUrl
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("userAppUrl")]
|
||||||
|
public string UserAppUrl { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the EnableDebug
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("enableDebug")]
|
||||||
|
public bool EnableDebug { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the DeviceInterfaceSupport
|
||||||
|
/// </summary>
|
||||||
|
[JsonProperty("deviceInterfaceSupport")]
|
||||||
|
public Dictionary<string, DeviceInterfaceInfo> DeviceInterfaceSupport { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
namespace PepperDash.Essentials.WebSocketServer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a JoinToken
|
||||||
|
/// </summary>
|
||||||
|
public class JoinToken
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Code
|
||||||
|
/// </summary>
|
||||||
|
public string Code { get; set; }
|
||||||
|
|
||||||
|
public string RoomKey { get; set; }
|
||||||
|
|
||||||
|
public string Uuid { get; set; }
|
||||||
|
|
||||||
|
public string TouchpanelKey { get; set; } = "";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Token
|
||||||
|
/// </summary>
|
||||||
|
public string Token { get; set; } = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,6 +4,8 @@ using System.ComponentModel;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
using System.Security.Authentication;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.WebScripting;
|
using Crestron.SimplSharp.WebScripting;
|
||||||
@@ -35,6 +37,10 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
private readonly string appConfigFileName = "_config.local.json";
|
private readonly string appConfigFileName = "_config.local.json";
|
||||||
private readonly string appConfigCsFileName = "_config.cs.json";
|
private readonly string appConfigCsFileName = "_config.cs.json";
|
||||||
|
|
||||||
|
private const string certificateName = "selfCres";
|
||||||
|
|
||||||
|
private const string certificatePassword = "cres12345";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Where the key is the join token and the value is the room key
|
/// Where the key is the join token and the value is the room key
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -155,7 +161,7 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Information, "Automatically forwarding port {0} to CS LAN", Port);
|
this.LogInformation("Automatically forwarding port {port} to CS LAN", Port);
|
||||||
|
|
||||||
var csAdapterId = CrestronEthernetHelper.GetAdapterdIdForSpecifiedAdapterType(EthernetAdapterType.EthernetCSAdapter);
|
var csAdapterId = CrestronEthernetHelper.GetAdapterdIdForSpecifiedAdapterType(EthernetAdapterType.EthernetCSAdapter);
|
||||||
var csIp = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, csAdapterId);
|
var csIp = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, csAdapterId);
|
||||||
@@ -164,16 +170,17 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
|
|
||||||
if (result != CrestronEthernetHelper.PortForwardingUserPatRetCodes.NoErr)
|
if (result != CrestronEthernetHelper.PortForwardingUserPatRetCodes.NoErr)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Error, "Error adding port forwarding: {0}", result);
|
this.LogError("Error adding port forwarding: {error}", result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (ArgumentException)
|
catch (ArgumentException)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Information, "This processor does not have a CS LAN", this);
|
this.LogInformation("This processor does not have a CS LAN", this);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(ex, "Error automatically forwarding port to CS LAN");
|
this.LogError("Error automatically forwarding port to CS LAN: {message}", ex.Message);
|
||||||
|
this.LogDebug(ex, "Stack Trace");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,7 +197,7 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
{
|
{
|
||||||
if (parent.Config.DirectServer.AutomaticallyForwardPortToCSLAN == false)
|
if (parent.Config.DirectServer.AutomaticallyForwardPortToCSLAN == false)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Information, "This processor does not have a CS LAN", this);
|
this.LogInformation("This processor does not have a CS LAN");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,13 +266,49 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
_server.OnPost += Server_OnPost;
|
_server.OnPost += Server_OnPost;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_parent.Config.DirectServer.Secure)
|
||||||
|
{
|
||||||
|
this.LogInformation("Adding SSL Configuration to server");
|
||||||
|
_server.SslConfiguration = new ServerSslConfiguration(new X509Certificate2($"\\user\\{certificateName}.pfx", certificatePassword))
|
||||||
|
{
|
||||||
|
ClientCertificateRequired = false,
|
||||||
|
CheckCertificateRevocation = false,
|
||||||
|
EnabledSslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
_server.Log.Output = (data, message) =>
|
||||||
|
{
|
||||||
|
switch (data.Level)
|
||||||
|
{
|
||||||
|
case LogLevel.Trace:
|
||||||
|
this.LogVerbose(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Debug:
|
||||||
|
this.LogDebug(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Info:
|
||||||
|
this.LogInformation(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Warn:
|
||||||
|
this.LogWarning(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Error:
|
||||||
|
this.LogError(data.Message);
|
||||||
|
break;
|
||||||
|
case LogLevel.Fatal:
|
||||||
|
this.LogFatal(data.Message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler;
|
CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler;
|
||||||
|
|
||||||
_server.Start();
|
_server.Start();
|
||||||
|
|
||||||
if (_server.IsListening)
|
if (_server.IsListening)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Information, "Mobile Control WebSocket Server listening on port {port}", this, _server.Port);
|
this.LogInformation("Mobile Control WebSocket Server listening on port {port}", _server.Port);
|
||||||
}
|
}
|
||||||
|
|
||||||
CrestronEnvironment.ProgramStatusEventHandler += OnProgramStop;
|
CrestronEnvironment.ProgramStatusEventHandler += OnProgramStop;
|
||||||
@@ -278,10 +321,17 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(ex, "Exception intializing websocket server", this);
|
this.LogError("Exception initializing direct server: {message}", ex.Message);
|
||||||
|
this.LogDebug(ex, "Stack Trace");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetWebsocketLogLevel(LogLevel level)
|
||||||
|
{
|
||||||
|
CrestronConsole.ConsoleCommandResponse($"Setting direct server debug level to {level}", level.ToString());
|
||||||
|
_server.Log.Level = level;
|
||||||
|
}
|
||||||
|
|
||||||
private void AddClientsForTouchpanels()
|
private void AddClientsForTouchpanels()
|
||||||
{
|
{
|
||||||
var touchpanels = DeviceManager.AllDevices
|
var touchpanels = DeviceManager.AllDevices
|
||||||
@@ -347,22 +397,6 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
|
|
||||||
string ip = processorIp;
|
string ip = processorIp;
|
||||||
|
|
||||||
// Moved to the MobileControlTouchpanelController class in the GetUrlWithCorrectIp method
|
|
||||||
// triggered by the Panel.IpInformationChange event so that we know we have the necessary info
|
|
||||||
// to make the determination of which IP to use.
|
|
||||||
//if (touchpanel.Touchpanel is IMobileControlCrestronTouchpanelController crestronTouchpanel && csIpAddress != null)
|
|
||||||
//{
|
|
||||||
// ip = crestronTouchpanel.ConnectedIps.Any(ipInfo =>
|
|
||||||
// {
|
|
||||||
// if (System.Net.IPAddress.TryParse(ipInfo.DeviceIpAddress, out var parsedIp))
|
|
||||||
// {
|
|
||||||
// return csIpAddress.IsInSameSubnet(parsedIp, csSubnetMask);
|
|
||||||
// }
|
|
||||||
// this.LogWarning("Invalid IP address: {deviceIpAddress}", ipInfo.DeviceIpAddress);
|
|
||||||
// return false;
|
|
||||||
// }) ? csIpAddress.ToString() : processorIp;
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (_parent.Config.DirectServer.CSLanUiDeviceKeys != null && _parent.Config.DirectServer.CSLanUiDeviceKeys.Any(k => k.Equals(touchpanel.Touchpanel.Key, StringComparison.InvariantCultureIgnoreCase)) && csIpAddress != null)
|
if (_parent.Config.DirectServer.CSLanUiDeviceKeys != null && _parent.Config.DirectServer.CSLanUiDeviceKeys.Any(k => k.Equals(touchpanel.Touchpanel.Key, StringComparison.InvariantCultureIgnoreCase)) && csIpAddress != null)
|
||||||
{
|
{
|
||||||
ip = csIpAddress.ToString();
|
ip = csIpAddress.ToString();
|
||||||
@@ -477,7 +511,8 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
this.LogError(ex, "Error getting application configuration");
|
this.LogError("Error getting application configuration: {message}", ex.Message);
|
||||||
|
this.LogDebug(ex, "Stack Trace");
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -513,15 +548,14 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
{
|
{
|
||||||
if (token.Value == null)
|
if (token.Value == null)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Warning, "Token value is null", this);
|
this.LogWarning("Token value is null");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.LogMessage(LogEventLevel.Information, "Adding token: {0} for room: {1}", this, token.Key, token.Value.RoomKey);
|
this.LogInformation("Adding token: {key} for room: {roomKey}", token.Key, token.Value.RoomKey);
|
||||||
|
|
||||||
if (UiClients == null)
|
if (UiClients == null)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Warning, "UiClients is null", this);
|
|
||||||
UiClients = new Dictionary<string, UiClientContext>();
|
UiClients = new Dictionary<string, UiClientContext>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -531,7 +565,7 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
|
|
||||||
if (UiClients.Count > 0)
|
if (UiClients.Count > 0)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Information, "Restored {uiClientCount} UiClients from secrets data", this, UiClients.Count);
|
this.LogInformation("Restored {uiClientCount} UiClients from secrets data", UiClients.Count);
|
||||||
|
|
||||||
foreach (var client in UiClients)
|
foreach (var client in UiClients)
|
||||||
{
|
{
|
||||||
@@ -541,36 +575,28 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
|
|
||||||
_server.AddWebSocketService(path, () =>
|
_server.AddWebSocketService(path, () =>
|
||||||
{
|
{
|
||||||
var c = new UiClient();
|
var c = new UiClient($"uiclient-{key}-{roomKey}");
|
||||||
Debug.LogMessage(LogEventLevel.Debug, "Constructing UiClient with id: {key}", this, key);
|
this.LogDebug("Constructing UiClient with id: {key}", key);
|
||||||
|
|
||||||
c.Controller = _parent;
|
c.Controller = _parent;
|
||||||
c.RoomKey = roomKey;
|
c.RoomKey = roomKey;
|
||||||
UiClients[key].SetClient(c);
|
UiClients[key].SetClient(c);
|
||||||
return c;
|
return c;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
//_server.WebSocketServices.AddService<UiClient>(path, (c) =>
|
|
||||||
//{
|
|
||||||
// Debug.Console(2, this, "Constructing UiClient with id: {0}", key);
|
|
||||||
// c.Controller = _parent;
|
|
||||||
// c.RoomKey = roomKey;
|
|
||||||
// UiClients[key].SetClient(c);
|
|
||||||
//});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Warning, "No secret found");
|
this.LogWarning("No secret found");
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.LogMessage(LogEventLevel.Debug, "{uiClientCount} UiClients restored from secrets data", this, UiClients.Count);
|
this.LogDebug("{uiClientCount} UiClients restored from secrets data", UiClients.Count);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(ex, "Exception retrieving secret", this);
|
this.LogError("Exception retrieving secret: {message}", ex.Message);
|
||||||
|
this.LogDebug(ex, "Stack Trace");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -583,7 +609,7 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
{
|
{
|
||||||
if (_secret == null)
|
if (_secret == null)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(LogEventLevel.Error, "Secret is null", this);
|
this.LogError("Secret is null");
|
||||||
|
|
||||||
_secret = new ServerTokenSecrets(string.Empty);
|
_secret = new ServerTokenSecrets(string.Empty);
|
||||||
}
|
}
|
||||||
@@ -601,7 +627,8 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(ex, "Exception updating secret", this);
|
this.LogError("Exception updating secret: {message}", ex.Message);
|
||||||
|
this.LogDebug(ex, "Stack Trace");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -704,18 +731,18 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
|
|
||||||
_server.AddWebSocketService(path, () =>
|
_server.AddWebSocketService(path, () =>
|
||||||
{
|
{
|
||||||
var c = new UiClient();
|
var c = new UiClient($"uiclient-{key}-{bridge.RoomKey}");
|
||||||
Debug.LogMessage(LogEventLevel.Verbose, "Constructing UiClient with id: {0}", this, key);
|
this.LogVerbose("Constructing UiClient with id: {key}", key);
|
||||||
c.Controller = _parent;
|
c.Controller = _parent;
|
||||||
c.RoomKey = bridge.RoomKey;
|
c.RoomKey = bridge.RoomKey;
|
||||||
UiClients[key].SetClient(c);
|
UiClients[key].SetClient(c);
|
||||||
return c;
|
return c;
|
||||||
});
|
});
|
||||||
|
|
||||||
Debug.LogMessage(LogEventLevel.Information, "Added new WebSocket UiClient service at path: {path}", this, path);
|
this.LogInformation("Added new WebSocket UiClient service at path: {path}", path);
|
||||||
Debug.LogMessage(LogEventLevel.Information, "Token: {@token}", this, token);
|
this.LogInformation("Token: {@token}", token);
|
||||||
|
|
||||||
Debug.LogMessage(LogEventLevel.Verbose, "{serviceCount} websocket services present", this, _server.WebSocketServices.Count);
|
this.LogVerbose("{serviceCount} websocket services present", _server.WebSocketServices.Count);
|
||||||
|
|
||||||
UpdateSecret();
|
UpdateSecret();
|
||||||
|
|
||||||
@@ -729,7 +756,7 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
{
|
{
|
||||||
if (s == "?" || string.IsNullOrEmpty(s))
|
if (s == "?" || string.IsNullOrEmpty(s))
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse(@"Removes all clients from the server. To execute add 'confirm' to command");
|
CrestronConsole.ConsoleCommandResponse(@"Remove all clients from the server. To execute add 'confirm' to command");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -883,7 +910,8 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Debug.LogMessage(ex, "Caught an exception in the OnGet handler", this);
|
this.LogError("Exception in OnGet handler: {message}", ex.Message);
|
||||||
|
this.LogDebug(ex, "Stack Trace");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -972,6 +1000,20 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
res.StatusCode = 200;
|
res.StatusCode = 200;
|
||||||
res.ContentType = "application/json";
|
res.ContentType = "application/json";
|
||||||
|
|
||||||
|
var devices = DeviceManager.GetDevices();
|
||||||
|
Dictionary<string, DeviceInterfaceInfo> deviceInterfaces = new Dictionary<string, DeviceInterfaceInfo>();
|
||||||
|
|
||||||
|
foreach (var device in devices)
|
||||||
|
{
|
||||||
|
var interfaces = device?.GetType().GetInterfaces().Select((i) => i.Name).ToList() ?? new List<string>();
|
||||||
|
deviceInterfaces.Add(device.Key, new DeviceInterfaceInfo
|
||||||
|
{
|
||||||
|
Key = device.Key,
|
||||||
|
Name = device is IKeyName ? (device as IKeyName).Name : "",
|
||||||
|
Interfaces = interfaces
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Construct the response object
|
// Construct the response object
|
||||||
JoinResponse jRes = new JoinResponse
|
JoinResponse jRes = new JoinResponse
|
||||||
{
|
{
|
||||||
@@ -985,7 +1027,8 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
UserAppUrl = string.Format("http://{0}:{1}/mc/app",
|
UserAppUrl = string.Format("http://{0}:{1}/mc/app",
|
||||||
CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0),
|
CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0),
|
||||||
Port),
|
Port),
|
||||||
EnableDebug = false
|
EnableDebug = false,
|
||||||
|
DeviceInterfaceSupport = deviceInterfaces
|
||||||
};
|
};
|
||||||
|
|
||||||
// Serialize to JSON and convert to Byte[]
|
// Serialize to JSON and convert to Byte[]
|
||||||
@@ -1171,7 +1214,7 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.LogVerbose("File not found: {filePath}", filePath);
|
this.LogWarning("File not found: {filePath}", filePath);
|
||||||
res.StatusCode = (int)HttpStatusCode.NotFound;
|
res.StatusCode = (int)HttpStatusCode.NotFound;
|
||||||
res.Close();
|
res.Close();
|
||||||
return;
|
return;
|
||||||
@@ -1241,145 +1284,4 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a Version
|
|
||||||
/// </summary>
|
|
||||||
public class Version
|
|
||||||
{
|
|
||||||
[JsonProperty("serverVersion")]
|
|
||||||
public string ServerVersion { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("serverIsRunningOnProcessorHardware")]
|
|
||||||
public bool ServerIsRunningOnProcessorHardware { get; private set; }
|
|
||||||
|
|
||||||
public Version()
|
|
||||||
{
|
|
||||||
ServerIsRunningOnProcessorHardware = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a UiClientContext
|
|
||||||
/// </summary>
|
|
||||||
public class UiClientContext
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the Client
|
|
||||||
/// </summary>
|
|
||||||
public UiClient Client { get; private set; }
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the Token
|
|
||||||
/// </summary>
|
|
||||||
public JoinToken Token { get; private set; }
|
|
||||||
|
|
||||||
public UiClientContext(JoinToken token)
|
|
||||||
{
|
|
||||||
Token = token;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// SetClient method
|
|
||||||
/// </summary>
|
|
||||||
public void SetClient(UiClient client)
|
|
||||||
{
|
|
||||||
Client = client;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a ServerTokenSecrets
|
|
||||||
/// </summary>
|
|
||||||
public class ServerTokenSecrets
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the GrantCode
|
|
||||||
/// </summary>
|
|
||||||
public string GrantCode { get; set; }
|
|
||||||
|
|
||||||
public Dictionary<string, JoinToken> Tokens { get; set; }
|
|
||||||
|
|
||||||
public ServerTokenSecrets(string grantCode)
|
|
||||||
{
|
|
||||||
GrantCode = grantCode;
|
|
||||||
Tokens = new Dictionary<string, JoinToken>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a JoinToken
|
|
||||||
/// </summary>
|
|
||||||
public class JoinToken
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the Code
|
|
||||||
/// </summary>
|
|
||||||
public string Code { get; set; }
|
|
||||||
|
|
||||||
public string RoomKey { get; set; }
|
|
||||||
|
|
||||||
public string Uuid { get; set; }
|
|
||||||
|
|
||||||
public string TouchpanelKey { get; set; } = "";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the Token
|
|
||||||
/// </summary>
|
|
||||||
public string Token { get; set; } = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a JoinResponse
|
|
||||||
/// </summary>
|
|
||||||
public class JoinResponse
|
|
||||||
{
|
|
||||||
[JsonProperty("clientId")]
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the ClientId
|
|
||||||
/// </summary>
|
|
||||||
public string ClientId { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("roomKey")]
|
|
||||||
public string RoomKey { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("systemUUid")]
|
|
||||||
public string SystemUuid { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("roomUUid")]
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the RoomUuid
|
|
||||||
/// </summary>
|
|
||||||
public string RoomUuid { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("config")]
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the Config
|
|
||||||
/// </summary>
|
|
||||||
public object Config { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("codeExpires")]
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the CodeExpires
|
|
||||||
/// </summary>
|
|
||||||
public DateTime CodeExpires { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("userCode")]
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the UserCode
|
|
||||||
/// </summary>
|
|
||||||
public string UserCode { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("userAppUrl")]
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the UserAppUrl
|
|
||||||
/// </summary>
|
|
||||||
public string UserAppUrl { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("enableDebug")]
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the EnableDebug
|
|
||||||
/// </summary>
|
|
||||||
public bool EnableDebug { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.WebSocketServer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a ServerTokenSecrets
|
||||||
|
/// </summary>
|
||||||
|
public class ServerTokenSecrets
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the GrantCode
|
||||||
|
/// </summary>
|
||||||
|
public string GrantCode { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<string, JoinToken> Tokens { get; set; }
|
||||||
|
|
||||||
|
public ServerTokenSecrets(string grantCode)
|
||||||
|
{
|
||||||
|
GrantCode = grantCode;
|
||||||
|
Tokens = new Dictionary<string, JoinToken>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,31 +1,50 @@
|
|||||||
using Newtonsoft.Json;
|
using System;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Core.Logging;
|
||||||
using PepperDash.Essentials.AppServer.Messengers;
|
using PepperDash.Essentials.AppServer.Messengers;
|
||||||
using PepperDash.Essentials.RoomBridges;
|
using PepperDash.Essentials.RoomBridges;
|
||||||
using Serilog.Events;
|
using Serilog.Events;
|
||||||
using System;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using WebSocketSharp;
|
using WebSocketSharp;
|
||||||
using WebSocketSharp.Server;
|
using WebSocketSharp.Server;
|
||||||
using ErrorEventArgs = WebSocketSharp.ErrorEventArgs;
|
using ErrorEventArgs = WebSocketSharp.ErrorEventArgs;
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.WebSocketServer
|
namespace PepperDash.Essentials.WebSocketServer
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents the behaviour to associate with a UiClient for WebSocket communication
|
/// Represents the behaviour to associate with a UiClient for WebSocket communication
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class UiClient : WebSocketBehavior
|
public class UiClient : WebSocketBehavior, IKeyed
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public string Key { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the mobile control system controller that handles this client's messages
|
||||||
|
/// </summary>
|
||||||
public MobileControlSystemController Controller { get; set; }
|
public MobileControlSystemController Controller { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the room key that this client is associated with
|
||||||
|
/// </summary>
|
||||||
public string RoomKey { get; set; }
|
public string RoomKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The unique identifier for this client instance
|
||||||
|
/// </summary>
|
||||||
private string _clientId;
|
private string _clientId;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The timestamp when this client connection was established
|
||||||
|
/// </summary>
|
||||||
private DateTime _connectionTime;
|
private DateTime _connectionTime;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the duration that this client has been connected. Returns zero if not currently connected.
|
||||||
|
/// </summary>
|
||||||
public TimeSpan ConnectedDuration
|
public TimeSpan ConnectedDuration
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -41,17 +60,22 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public UiClient()
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the UiClient class with the specified key
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The unique key to identify this client</param>
|
||||||
|
public UiClient(string key)
|
||||||
{
|
{
|
||||||
|
Key = key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void OnOpen()
|
protected override void OnOpen()
|
||||||
{
|
{
|
||||||
base.OnOpen();
|
base.OnOpen();
|
||||||
|
|
||||||
var url = Context.WebSocket.Url;
|
var url = Context.WebSocket.Url;
|
||||||
Debug.LogMessage(LogEventLevel.Verbose, "New WebSocket Connection from: {0}", null, url);
|
this.LogInformation("New WebSocket Connection from: {url}", url);
|
||||||
|
|
||||||
var match = Regex.Match(url.AbsoluteUri, "(?:ws|wss):\\/\\/.*(?:\\/mc\\/api\\/ui\\/join\\/)(.*)");
|
var match = Regex.Match(url.AbsoluteUri, "(?:ws|wss):\\/\\/.*(?:\\/mc\\/api\\/ui\\/join\\/)(.*)");
|
||||||
|
|
||||||
@@ -94,11 +118,21 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
// TODO: Future: Check token to see if there's already an open session using that token and reject/close the session
|
// TODO: Future: Check token to see if there's already an open session using that token and reject/close the session
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles the UserCodeChanged event from a room bridge and sends the updated user code to the client
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sender">The room bridge that raised the event</param>
|
||||||
|
/// <param name="e">Event arguments</param>
|
||||||
private void Bridge_UserCodeChanged(object sender, EventArgs e)
|
private void Bridge_UserCodeChanged(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
SendUserCodeToClient((MobileControlEssentialsRoomBridge)sender, _clientId);
|
SendUserCodeToClient((MobileControlEssentialsRoomBridge)sender, _clientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sends the current user code and QR code URL to the specified client
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="bridge">The room bridge containing the user code information</param>
|
||||||
|
/// <param name="clientId">The ID of the client to send the information to</param>
|
||||||
private void SendUserCodeToClient(MobileControlBridgeBase bridge, string clientId)
|
private void SendUserCodeToClient(MobileControlBridgeBase bridge, string clientId)
|
||||||
{
|
{
|
||||||
var content = new
|
var content = new
|
||||||
@@ -117,6 +151,7 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
Controller.SendMessageObjectToDirectClient(message);
|
Controller.SendMessageObjectToDirectClient(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void OnMessage(MessageEventArgs e)
|
protected override void OnMessage(MessageEventArgs e)
|
||||||
{
|
{
|
||||||
base.OnMessage(e);
|
base.OnMessage(e);
|
||||||
@@ -128,18 +163,31 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void OnClose(CloseEventArgs e)
|
protected override void OnClose(CloseEventArgs e)
|
||||||
{
|
{
|
||||||
base.OnClose(e);
|
base.OnClose(e);
|
||||||
|
|
||||||
Debug.LogMessage(LogEventLevel.Verbose, "WebSocket UiClient Closing: {0} reason: {1}", null, e.Code, e.Reason);
|
this.LogInformation("WebSocket UiClient Closing: {code} reason: {reason}", e.Code, e.Reason);
|
||||||
|
|
||||||
|
foreach (var messenger in Controller.Messengers)
|
||||||
|
{
|
||||||
|
messenger.Value.UnsubscribeClient(_clientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var messenger in Controller.DefaultMessengers)
|
||||||
|
{
|
||||||
|
messenger.Value.UnsubscribeClient(_clientId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void OnError(ErrorEventArgs e)
|
protected override void OnError(ErrorEventArgs e)
|
||||||
{
|
{
|
||||||
base.OnError(e);
|
base.OnError(e);
|
||||||
|
|
||||||
Debug.LogMessage(LogEventLevel.Verbose, "WebSocket UiClient Error: {exception} message: {message}", e.Exception, e.Message);
|
this.LogError("WebSocket UiClient Error: {message}", e.Message);
|
||||||
|
this.LogDebug(e.Exception, "Stack Trace");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
namespace PepperDash.Essentials.WebSocketServer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a UiClientContext
|
||||||
|
/// </summary>
|
||||||
|
public class UiClientContext
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Client
|
||||||
|
/// </summary>
|
||||||
|
public UiClient Client { get; private set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Token
|
||||||
|
/// </summary>
|
||||||
|
public JoinToken Token { get; private set; }
|
||||||
|
|
||||||
|
public UiClientContext(JoinToken token)
|
||||||
|
{
|
||||||
|
Token = token;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SetClient method
|
||||||
|
/// </summary>
|
||||||
|
public void SetClient(UiClient client)
|
||||||
|
{
|
||||||
|
Client = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.WebSocketServer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a Version
|
||||||
|
/// </summary>
|
||||||
|
public class Version
|
||||||
|
{
|
||||||
|
[JsonProperty("serverVersion")]
|
||||||
|
public string ServerVersion { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("serverIsRunningOnProcessorHardware")]
|
||||||
|
public bool ServerIsRunningOnProcessorHardware { get; private set; }
|
||||||
|
|
||||||
|
public Version()
|
||||||
|
{
|
||||||
|
ServerIsRunningOnProcessorHardware = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user