mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-15 12:44:58 +00:00
docs: add missing XML comments for Mobile Control Project
This commit is contained in:
@@ -3,10 +3,15 @@ using System;
|
|||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a ClientSpecificUpdateRequest
|
/// Send an update request for a specific client
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete]
|
||||||
public class ClientSpecificUpdateRequest
|
public class ClientSpecificUpdateRequest
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize an instance of the <see cref="ClientSpecificUpdateRequest"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="action"></param>
|
||||||
public ClientSpecificUpdateRequest(Action<string> action)
|
public ClientSpecificUpdateRequest(Action<string> action)
|
||||||
{
|
{
|
||||||
ResponseMethod = action;
|
ResponseMethod = action;
|
||||||
|
|||||||
@@ -7,8 +7,9 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IDelayedConfiguration
|
public interface IDelayedConfiguration
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Event triggered when the configuration is ready. Used when Mobile Control is interacting with a SIMPL program.
|
||||||
|
/// </summary>
|
||||||
event EventHandler<EventArgs> ConfigurationIsReady;
|
event EventHandler<EventArgs> ConfigurationIsReady;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using Newtonsoft.Json.Linq;
|
using System;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
@@ -10,12 +10,20 @@ namespace PepperDash.Essentials
|
|||||||
public class MobileControlAction : IMobileControlAction
|
public class MobileControlAction : IMobileControlAction
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Messenger
|
/// Gets the Messenger
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IMobileControlMessenger Messenger { get; private set; }
|
public IMobileControlMessenger Messenger { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Action to execute when this path is matched
|
||||||
|
/// </summary>
|
||||||
public Action<string, string, JToken> Action { get; private set; }
|
public Action<string, string, JToken> Action { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize an instance of the <see cref="MobileControlAction"/> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="messenger">Messenger associated with this action</param>
|
||||||
|
/// <param name="handler">Action to take when this path is matched</param>
|
||||||
public MobileControlAction(IMobileControlMessenger messenger, Action<string, string, JToken> handler)
|
public MobileControlAction(IMobileControlMessenger messenger, Action<string, string, JToken> handler)
|
||||||
{
|
{
|
||||||
Messenger = messenger;
|
Messenger = messenger;
|
||||||
|
|||||||
@@ -1,28 +1,25 @@
|
|||||||
using PepperDash.Core;
|
using System;
|
||||||
using PepperDash.Core.Logging;
|
using System.Collections.Generic;
|
||||||
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using Serilog.Events;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a MobileControlDeviceFactory
|
/// Factory to create a Mobile Control System Controller
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MobileControlDeviceFactory : EssentialsDeviceFactory<MobileControlSystemController>
|
public class MobileControlDeviceFactory : EssentialsDeviceFactory<MobileControlSystemController>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Create the factory for a Mobile Control System Controller
|
||||||
|
/// </summary>
|
||||||
public MobileControlDeviceFactory()
|
public MobileControlDeviceFactory()
|
||||||
{
|
{
|
||||||
TypeNames = new List<string> { "appserver", "mobilecontrol", "webserver" };
|
TypeNames = new List<string> { "appserver", "mobilecontrol", "webserver" };
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// BuildDevice method
|
|
||||||
/// </summary>
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,29 +6,35 @@ using PepperDash.Essentials.Core.Config;
|
|||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a MobileControlEssentialsConfig
|
/// Configuration class for sending data to Mobile Control Edge or a client using the Direct Server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MobileControlEssentialsConfig : EssentialsConfig
|
public class MobileControlEssentialsConfig : EssentialsConfig
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Current versions for the system
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("runtimeInfo")]
|
[JsonProperty("runtimeInfo")]
|
||||||
public MobileControlRuntimeInfo RuntimeInfo { get; set; }
|
public MobileControlRuntimeInfo RuntimeInfo { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create Configuration for Mobile Control. Used as part of the data sent to a client
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="config">The base configuration</param>
|
||||||
public MobileControlEssentialsConfig(EssentialsConfig config)
|
public MobileControlEssentialsConfig(EssentialsConfig config)
|
||||||
: base()
|
: base()
|
||||||
{
|
{
|
||||||
// TODO: Consider using Reflection to iterate properties
|
Devices = config.Devices;
|
||||||
this.Devices = config.Devices;
|
Info = config.Info;
|
||||||
this.Info = config.Info;
|
JoinMaps = config.JoinMaps;
|
||||||
this.JoinMaps = config.JoinMaps;
|
Rooms = config.Rooms;
|
||||||
this.Rooms = config.Rooms;
|
SourceLists = config.SourceLists;
|
||||||
this.SourceLists = config.SourceLists;
|
DestinationLists = config.DestinationLists;
|
||||||
this.DestinationLists = config.DestinationLists;
|
SystemUrl = config.SystemUrl;
|
||||||
this.SystemUrl = config.SystemUrl;
|
TemplateUrl = config.TemplateUrl;
|
||||||
this.TemplateUrl = config.TemplateUrl;
|
TieLines = config.TieLines;
|
||||||
this.TieLines = config.TieLines;
|
|
||||||
|
|
||||||
if (this.Info == null)
|
if (Info == null)
|
||||||
this.Info = new InfoConfig();
|
Info = new InfoConfig();
|
||||||
|
|
||||||
RuntimeInfo = new MobileControlRuntimeInfo();
|
RuntimeInfo = new MobileControlRuntimeInfo();
|
||||||
}
|
}
|
||||||
@@ -46,15 +52,21 @@ namespace PepperDash.Essentials
|
|||||||
[JsonProperty("pluginVersion")]
|
[JsonProperty("pluginVersion")]
|
||||||
public string PluginVersion { get; set; }
|
public string PluginVersion { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Essentials Version
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("essentialsVersion")]
|
[JsonProperty("essentialsVersion")]
|
||||||
public string EssentialsVersion { get; set; }
|
public string EssentialsVersion { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// PepperDash Core Version
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("pepperDashCoreVersion")]
|
[JsonProperty("pepperDashCoreVersion")]
|
||||||
public string PepperDashCoreVersion { get; set; }
|
public string PepperDashCoreVersion { get; set; }
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the EssentialsPlugins
|
/// List of Plugins loaded on this system
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonProperty("essentialsPlugins")]
|
[JsonProperty("essentialsPlugins")]
|
||||||
public List<LoadedAssembly> EssentialsPlugins { get; set; }
|
public List<LoadedAssembly> EssentialsPlugins { get; set; }
|
||||||
|
|||||||
@@ -7,10 +7,13 @@ using PepperDash.Essentials.Core;
|
|||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a MobileControlFactory
|
/// Factory class for the Mobile Control App Controller
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MobileControlFactory
|
public class MobileControlFactory
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="MobileControlFactory"/> class.
|
||||||
|
/// </summary>
|
||||||
public MobileControlFactory()
|
public MobileControlFactory()
|
||||||
{
|
{
|
||||||
var assembly = Assembly.GetExecutingAssembly();
|
var assembly = Assembly.GetExecutingAssembly();
|
||||||
|
|||||||
@@ -91,10 +91,16 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public MobileControlApiService ApiService { get; private set; }
|
public MobileControlApiService ApiService { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get Room Bridges associated with this controller
|
||||||
|
/// </summary>
|
||||||
public List<MobileControlBridgeBase> RoomBridges => _roomBridges;
|
public List<MobileControlBridgeBase> RoomBridges => _roomBridges;
|
||||||
|
|
||||||
private readonly MobileControlWebsocketServer _directServer;
|
private readonly MobileControlWebsocketServer _directServer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the Direct Server instance associated with this controller
|
||||||
|
/// </summary>
|
||||||
public MobileControlWebsocketServer DirectServer => _directServer;
|
public MobileControlWebsocketServer DirectServer => _directServer;
|
||||||
|
|
||||||
private readonly CCriticalSection _wsCriticalSection = new CCriticalSection();
|
private readonly CCriticalSection _wsCriticalSection = new CCriticalSection();
|
||||||
@@ -104,10 +110,14 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string SystemUrl; //set only from SIMPL Bridge!
|
public string SystemUrl; //set only from SIMPL Bridge!
|
||||||
|
|
||||||
|
///
|
||||||
public bool Connected => _wsClient2 != null && _wsClient2.IsAlive;
|
public bool Connected => _wsClient2 != null && _wsClient2.IsAlive;
|
||||||
|
|
||||||
private IEssentialsRoomCombiner _roomCombiner;
|
private IEssentialsRoomCombiner _roomCombiner;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the SystemUuid from configuration or SIMPL Bridge
|
||||||
|
/// </summary>
|
||||||
public string SystemUuid
|
public string SystemUuid
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -169,6 +179,9 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
private DateTime _lastAckMessage;
|
private DateTime _lastAckMessage;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the LastAckMessage timestamp
|
||||||
|
/// </summary>
|
||||||
public DateTime LastAckMessage => _lastAckMessage;
|
public DateTime LastAckMessage => _lastAckMessage;
|
||||||
|
|
||||||
private CTimer _pingTimer;
|
private CTimer _pingTimer;
|
||||||
@@ -177,11 +190,11 @@ namespace PepperDash.Essentials
|
|||||||
private LogLevel _wsLogLevel = LogLevel.Error;
|
private LogLevel _wsLogLevel = LogLevel.Error;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Initializes a new instance of the <see cref="MobileControlSystemController"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="key"></param>
|
/// <param name="key">The unique key for this controller.</param>
|
||||||
/// <param name="name"></param>
|
/// <param name="name">The name of the controller.</param>
|
||||||
/// <param name="config"></param>
|
/// <param name="config">The configuration settings for the controller.</param>
|
||||||
public MobileControlSystemController(string key, string name, MobileControlConfig config)
|
public MobileControlSystemController(string key, string name, MobileControlConfig config)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
@@ -1192,6 +1205,9 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Host { get; private set; }
|
public string Host { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the configured Client App URL
|
||||||
|
/// </summary>
|
||||||
public string ClientAppUrl => Config.ClientAppUrl;
|
public string ClientAppUrl => Config.ClientAppUrl;
|
||||||
|
|
||||||
private void OnRoomCombinationScenarioChanged(
|
private void OnRoomCombinationScenarioChanged(
|
||||||
@@ -1203,7 +1219,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// CheckForDeviceMessenger method
|
/// Checks if a device messenger exists for the given key.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool CheckForDeviceMessenger(string key)
|
public bool CheckForDeviceMessenger(string key)
|
||||||
{
|
{
|
||||||
@@ -1211,13 +1227,13 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// AddDeviceMessenger method
|
/// Add the provided messenger to the messengers collection
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void AddDeviceMessenger(IMobileControlMessenger messenger)
|
public void AddDeviceMessenger(IMobileControlMessenger messenger)
|
||||||
{
|
{
|
||||||
if (_messengers.ContainsKey(messenger.Key))
|
if (_messengers.ContainsKey(messenger.Key))
|
||||||
{
|
{
|
||||||
this.LogWarning("Messenger with key {messengerKey) already added", messenger.Key);
|
this.LogWarning("Messenger with key {messengerKey} already added", messenger.Key);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1291,9 +1307,6 @@ namespace PepperDash.Essentials
|
|||||||
messenger.RegisterWithAppServer(this);
|
messenger.RegisterWithAppServer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initialize method
|
|
||||||
/// </summary>
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -1338,7 +1351,7 @@ namespace PepperDash.Essentials
|
|||||||
#region IMobileControl Members
|
#region IMobileControl Members
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// GetAppServer method
|
/// Gets the App Server instance
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static IMobileControl GetAppServer()
|
public static IMobileControl GetAppServer()
|
||||||
{
|
{
|
||||||
@@ -1356,16 +1369,10 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generates the url and creates the websocket client
|
|
||||||
/// </summary>
|
|
||||||
private bool CreateWebsocket()
|
private bool CreateWebsocket()
|
||||||
{
|
{
|
||||||
if (_wsClient2 != null)
|
_wsClient2?.Close();
|
||||||
{
|
_wsClient2 = null;
|
||||||
_wsClient2.Close();
|
|
||||||
_wsClient2 = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(SystemUuid))
|
if (string.IsNullOrEmpty(SystemUuid))
|
||||||
{
|
{
|
||||||
@@ -1402,7 +1409,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// LinkSystemMonitorToAppServer method
|
/// Link the System Monitor to this App server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void LinkSystemMonitorToAppServer()
|
public void LinkSystemMonitorToAppServer()
|
||||||
{
|
{
|
||||||
@@ -1429,14 +1436,6 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
private void SetWebsocketDebugLevel(string cmdparameters)
|
private void SetWebsocketDebugLevel(string cmdparameters)
|
||||||
{
|
{
|
||||||
// if (CrestronEnvironment.ProgramCompatibility == eCrestronSeries.Series4)
|
|
||||||
// {
|
|
||||||
// this.LogInformation(
|
|
||||||
// "Setting websocket log level not currently allowed on 4 series."
|
|
||||||
// );
|
|
||||||
// return; // Web socket log level not currently allowed in series4
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(cmdparameters))
|
if (string.IsNullOrEmpty(cmdparameters))
|
||||||
{
|
{
|
||||||
this.LogInformation("Current Websocket debug level: {webSocketDebugLevel}", _wsLogLevel);
|
this.LogInformation("Current Websocket debug level: {webSocketDebugLevel}", _wsLogLevel);
|
||||||
@@ -1474,10 +1473,6 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sends message to server to indicate the system is shutting down
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="programEventType"></param>
|
|
||||||
private void CrestronEnvironment_ProgramStatusEventHandler(
|
private void CrestronEnvironment_ProgramStatusEventHandler(
|
||||||
eProgramStatusEventType programEventType
|
eProgramStatusEventType programEventType
|
||||||
)
|
)
|
||||||
@@ -1510,6 +1505,9 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get action paths for the current actions
|
||||||
|
/// </summary>
|
||||||
public List<(string, string)> GetActionDictionaryPaths()
|
public List<(string, string)> GetActionDictionaryPaths()
|
||||||
{
|
{
|
||||||
var paths = new List<(string, string)>();
|
var paths = new List<(string, string)>();
|
||||||
@@ -1582,24 +1580,24 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the room bridge with the provided key
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key of the room bridge</param>
|
||||||
public MobileControlBridgeBase GetRoomBridge(string key)
|
public MobileControlBridgeBase GetRoomBridge(string key)
|
||||||
{
|
{
|
||||||
return _roomBridges.FirstOrDefault((r) => r.RoomKey.Equals(key));
|
return _roomBridges.FirstOrDefault((r) => r.RoomKey.Equals(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// GetRoomMessenger method
|
/// Get the room messenger with the provided key
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="key">The Key of the rooom messenger</param>
|
||||||
public IMobileControlRoomMessenger GetRoomMessenger(string key)
|
public IMobileControlRoomMessenger GetRoomMessenger(string key)
|
||||||
{
|
{
|
||||||
return _roomBridges.FirstOrDefault((r) => r.RoomKey.Equals(key));
|
return _roomBridges.FirstOrDefault((r) => r.RoomKey.Equals(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void Bridge_ConfigurationIsReady(object sender, EventArgs e)
|
private void Bridge_ConfigurationIsReady(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
this.LogDebug("Bridge ready. Registering");
|
this.LogDebug("Bridge ready. Registering");
|
||||||
@@ -1620,10 +1618,6 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="o"></param>
|
|
||||||
private void ReconnectToServerTimerCallback(object o)
|
private void ReconnectToServerTimerCallback(object o)
|
||||||
{
|
{
|
||||||
this.LogDebug("Attempting to reconnect to server...");
|
this.LogDebug("Attempting to reconnect to server...");
|
||||||
@@ -1631,9 +1625,6 @@ namespace PepperDash.Essentials
|
|||||||
ConnectWebsocketClient();
|
ConnectWebsocketClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Verifies system connection with servers
|
|
||||||
/// </summary>
|
|
||||||
private void AuthorizeSystem(string code)
|
private void AuthorizeSystem(string code)
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
@@ -1678,9 +1669,6 @@ namespace PepperDash.Essentials
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Dumps info in response to console command.
|
|
||||||
/// </summary>
|
|
||||||
private void ShowInfo()
|
private void ShowInfo()
|
||||||
{
|
{
|
||||||
var url = Config != null ? Host : "No config";
|
var url = Config != null ? Host : "No config";
|
||||||
@@ -1753,9 +1741,6 @@ namespace PepperDash.Essentials
|
|||||||
var clientNo = 1;
|
var clientNo = 1;
|
||||||
foreach (var clientContext in _directServer.UiClientContexts)
|
foreach (var clientContext in _directServer.UiClientContexts)
|
||||||
{
|
{
|
||||||
var isAlive = false;
|
|
||||||
var duration = "Not Connected";
|
|
||||||
|
|
||||||
var clients = _directServer.UiClients.Values.Where(c => c.Token == clientContext.Value.Token.Token);
|
var clients = _directServer.UiClients.Values.Where(c => c.Token == clientContext.Value.Token.Token);
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse(
|
CrestronConsole.ConsoleCommandResponse(
|
||||||
@@ -1793,7 +1778,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// RegisterSystemToServer method
|
/// Register this system to the Mobile Control Edge Server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void RegisterSystemToServer()
|
public void RegisterSystemToServer()
|
||||||
{
|
{
|
||||||
@@ -1817,9 +1802,6 @@ namespace PepperDash.Essentials
|
|||||||
ConnectWebsocketClient();
|
ConnectWebsocketClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Connects the Websocket Client
|
|
||||||
/// </summary>
|
|
||||||
private void ConnectWebsocketClient()
|
private void ConnectWebsocketClient()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -1860,9 +1842,6 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Attempts to connect the websocket
|
|
||||||
/// </summary>
|
|
||||||
private void TryConnect()
|
private void TryConnect()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -1892,9 +1871,6 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gracefully handles conect failures by reconstructing the ws client and starting the reconnect timer
|
|
||||||
/// </summary>
|
|
||||||
private void HandleConnectFailure()
|
private void HandleConnectFailure()
|
||||||
{
|
{
|
||||||
_wsClient2 = null;
|
_wsClient2 = null;
|
||||||
@@ -1926,11 +1902,6 @@ namespace PepperDash.Essentials
|
|||||||
StartServerReconnectTimer();
|
StartServerReconnectTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void HandleOpen(object sender, EventArgs e)
|
private void HandleOpen(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
StopServerReconnectTimer();
|
StopServerReconnectTimer();
|
||||||
@@ -1939,11 +1910,6 @@ namespace PepperDash.Essentials
|
|||||||
SendMessageObject(new MobileControlMessage { Type = "hello" });
|
SendMessageObject(new MobileControlMessage { Type = "hello" });
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void HandleMessage(object sender, MessageEventArgs e)
|
private void HandleMessage(object sender, MessageEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.IsPing)
|
if (e.IsPing)
|
||||||
@@ -1960,11 +1926,6 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void HandleError(object sender, ErrorEventArgs e)
|
private void HandleError(object sender, ErrorEventArgs e)
|
||||||
{
|
{
|
||||||
this.LogError("Websocket error {0}", e.Message);
|
this.LogError("Websocket error {0}", e.Message);
|
||||||
@@ -1973,11 +1934,6 @@ namespace PepperDash.Essentials
|
|||||||
StartServerReconnectTimer();
|
StartServerReconnectTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void HandleClose(object sender, CloseEventArgs e)
|
private void HandleClose(object sender, CloseEventArgs e)
|
||||||
{
|
{
|
||||||
this.LogDebug(
|
this.LogDebug(
|
||||||
@@ -1998,9 +1954,6 @@ namespace PepperDash.Essentials
|
|||||||
StartServerReconnectTimer();
|
StartServerReconnectTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// After a "hello" from the server, sends config and stuff
|
|
||||||
/// </summary>
|
|
||||||
private void SendInitialMessage()
|
private void SendInitialMessage()
|
||||||
{
|
{
|
||||||
this.LogInformation("Sending initial join message");
|
this.LogInformation("Sending initial join message");
|
||||||
@@ -2027,7 +1980,7 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// GetConfigWithPluginVersion method
|
/// Get the Essentials configuration with version data
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public MobileControlEssentialsConfig GetConfigWithPluginVersion()
|
public MobileControlEssentialsConfig GetConfigWithPluginVersion()
|
||||||
{
|
{
|
||||||
@@ -2062,8 +2015,13 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// SetClientUrl method
|
/// Set the Client URL for a given room
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="path">new App URL</param>
|
||||||
|
/// <param name="roomKey">room key. Default is null</param>
|
||||||
|
/// <remarks>
|
||||||
|
/// If roomKey is null, the URL will be set for the entire system.
|
||||||
|
/// </remarks>
|
||||||
public void SetClientUrl(string path, string roomKey = null)
|
public void SetClientUrl(string path, string roomKey = null)
|
||||||
{
|
{
|
||||||
var message = new MobileControlMessage
|
var message = new MobileControlMessage
|
||||||
@@ -2079,9 +2037,6 @@ namespace PepperDash.Essentials
|
|||||||
/// Sends any object type to server
|
/// Sends any object type to server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="o"></param>
|
/// <param name="o"></param>
|
||||||
/// <summary>
|
|
||||||
/// SendMessageObject method
|
|
||||||
/// </summary>
|
|
||||||
public void SendMessageObject(IMobileControlMessage o)
|
public void SendMessageObject(IMobileControlMessage o)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -2105,8 +2060,9 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// SendMessageObjectToDirectClient method
|
/// Send a message to a client using the Direct Server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="o">object to send</param>
|
||||||
public void SendMessageObjectToDirectClient(object o)
|
public void SendMessageObjectToDirectClient(object o)
|
||||||
{
|
{
|
||||||
if (
|
if (
|
||||||
@@ -2119,10 +2075,6 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Disconnects the Websocket Client and stops the heartbeat timer
|
|
||||||
/// </summary>
|
|
||||||
private void CleanUpWebsocketClient()
|
private void CleanUpWebsocketClient()
|
||||||
{
|
{
|
||||||
if (_wsClient2 == null)
|
if (_wsClient2 == null)
|
||||||
@@ -2180,9 +2132,6 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
private void StartServerReconnectTimer()
|
private void StartServerReconnectTimer()
|
||||||
{
|
{
|
||||||
StopServerReconnectTimer();
|
StopServerReconnectTimer();
|
||||||
@@ -2193,9 +2142,6 @@ namespace PepperDash.Essentials
|
|||||||
this.LogDebug("Reconnect Timer Started.");
|
this.LogDebug("Reconnect Timer Started.");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Does what it says
|
|
||||||
/// </summary>
|
|
||||||
private void StopServerReconnectTimer()
|
private void StopServerReconnectTimer()
|
||||||
{
|
{
|
||||||
if (_serverReconnectTimer == null)
|
if (_serverReconnectTimer == null)
|
||||||
@@ -2206,10 +2152,6 @@ namespace PepperDash.Essentials
|
|||||||
_serverReconnectTimer = null;
|
_serverReconnectTimer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Resets reconnect timer and updates usercode
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="content"></param>
|
|
||||||
private void HandleHeartBeat(JToken content)
|
private void HandleHeartBeat(JToken content)
|
||||||
{
|
{
|
||||||
SendMessageObject(new MobileControlMessage { Type = "/system/heartbeatAck" });
|
SendMessageObject(new MobileControlMessage { Type = "/system/heartbeatAck" });
|
||||||
@@ -2319,16 +2261,13 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// HandleClientMessage method
|
/// Enqueue an incoming message for processing
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void HandleClientMessage(string message)
|
public void HandleClientMessage(string message)
|
||||||
{
|
{
|
||||||
_receiveQueue.Enqueue(new ProcessStringMessage(message, ParseStreamRx));
|
_receiveQueue.Enqueue(new ProcessStringMessage(message, ParseStreamRx));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
private void ParseStreamRx(string messageText)
|
private void ParseStreamRx(string messageText)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(messageText))
|
if (string.IsNullOrEmpty(messageText))
|
||||||
@@ -2415,10 +2354,6 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="s"></param>
|
|
||||||
private void TestHttpRequest(string s)
|
private void TestHttpRequest(string s)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,23 +1,35 @@
|
|||||||
using PepperDash.Core;
|
using System;
|
||||||
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Logging;
|
using PepperDash.Core.Logging;
|
||||||
using PepperDash.Essentials.AppServer.Messengers;
|
using PepperDash.Essentials.AppServer.Messengers;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
using System;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.RoomBridges
|
namespace PepperDash.Essentials.RoomBridges
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Base class for a Mobile Control Bridge that's used to control a room
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class MobileControlBridgeBase : MessengerBase, IMobileControlRoomMessenger
|
public abstract class MobileControlBridgeBase : MessengerBase, IMobileControlRoomMessenger
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Triggered when the user Code changes
|
||||||
|
/// </summary>
|
||||||
public event EventHandler<EventArgs> UserCodeChanged;
|
public event EventHandler<EventArgs> UserCodeChanged;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Triggered when a user should be prompted for the new code
|
||||||
|
/// </summary>
|
||||||
public event EventHandler<EventArgs> UserPromptedForCode;
|
public event EventHandler<EventArgs> UserPromptedForCode;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Triggered when a client joins to control this room
|
||||||
|
/// </summary>
|
||||||
public event EventHandler<EventArgs> ClientJoined;
|
public event EventHandler<EventArgs> ClientJoined;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Triggered when the App URL for this room changes
|
||||||
|
/// </summary>
|
||||||
public event EventHandler<EventArgs> AppUrlChanged;
|
public event EventHandler<EventArgs> AppUrlChanged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -49,15 +61,32 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string McServerUrl { get; private set; }
|
public string McServerUrl { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Room Name
|
||||||
|
/// </summary>
|
||||||
public abstract string RoomName { get; }
|
public abstract string RoomName { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Room key
|
||||||
|
/// </summary>
|
||||||
public abstract string RoomKey { get; }
|
public abstract string RoomKey { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="MobileControlBridgeBase"/> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The unique key for this bridge</param>
|
||||||
|
/// <param name="messagePath">The message path for this bridge</param>
|
||||||
protected MobileControlBridgeBase(string key, string messagePath)
|
protected MobileControlBridgeBase(string key, string messagePath)
|
||||||
: base(key, messagePath)
|
: base(key, messagePath)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="MobileControlBridgeBase"/> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The unique key for this bridge</param>
|
||||||
|
/// <param name="messagePath">The message path for this bridge</param>
|
||||||
|
/// <param name="device">The device associated with this bridge</param>
|
||||||
protected MobileControlBridgeBase(string key, string messagePath, IKeyName device)
|
protected MobileControlBridgeBase(string key, string messagePath, IKeyName device)
|
||||||
: base(key, messagePath, device)
|
: base(key, messagePath, device)
|
||||||
{
|
{
|
||||||
@@ -110,6 +139,10 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
SetUserCode(code);
|
SetUserCode(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Update the App Url with the provided URL
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="url">The new App URL</param>
|
||||||
public virtual void UpdateAppUrl(string url)
|
public virtual void UpdateAppUrl(string url)
|
||||||
{
|
{
|
||||||
AppUrl = url;
|
AppUrl = url;
|
||||||
@@ -137,16 +170,25 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
OnUserCodeChanged();
|
OnUserCodeChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Trigger the UserCodeChanged event
|
||||||
|
/// </summary>
|
||||||
protected void OnUserCodeChanged()
|
protected void OnUserCodeChanged()
|
||||||
{
|
{
|
||||||
UserCodeChanged?.Invoke(this, new EventArgs());
|
UserCodeChanged?.Invoke(this, new EventArgs());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Trigger the UserPromptedForCode event
|
||||||
|
/// </summary>
|
||||||
protected void OnUserPromptedForCode()
|
protected void OnUserPromptedForCode()
|
||||||
{
|
{
|
||||||
UserPromptedForCode?.Invoke(this, new EventArgs());
|
UserPromptedForCode?.Invoke(this, new EventArgs());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Trigger the ClientJoined event
|
||||||
|
/// </summary>
|
||||||
protected void OnClientJoined()
|
protected void OnClientJoined()
|
||||||
{
|
{
|
||||||
ClientJoined?.Invoke(this, new EventArgs());
|
ClientJoined?.Invoke(this, new EventArgs());
|
||||||
|
|||||||
@@ -41,24 +41,37 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string DefaultRoomKey { get; private set; }
|
public string DefaultRoomKey { get; private set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Gets the name of the room
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override string RoomName
|
public override string RoomName
|
||||||
{
|
{
|
||||||
get { return Room.Name; }
|
get { return Room.Name; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the key of the room
|
||||||
|
/// </summary>
|
||||||
public override string RoomKey
|
public override string RoomKey
|
||||||
{
|
{
|
||||||
get { return Room.Key; }
|
get { return Room.Key; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="MobileControlEssentialsRoomBridge"/> class with the specified room
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="room">The essentials room to bridge</param>
|
||||||
public MobileControlEssentialsRoomBridge(IEssentialsRoom room) :
|
public MobileControlEssentialsRoomBridge(IEssentialsRoom room) :
|
||||||
this($"mobileControlBridge-{room.Key}", room.Key, room)
|
this($"mobileControlBridge-{room.Key}", room.Key, room)
|
||||||
{
|
{
|
||||||
Room = room;
|
Room = room;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="MobileControlEssentialsRoomBridge"/> class with the specified parameters
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The unique key for this bridge</param>
|
||||||
|
/// <param name="roomKey">The key of the room to bridge</param>
|
||||||
|
/// <param name="room">The essentials room to bridge</param>
|
||||||
public MobileControlEssentialsRoomBridge(string key, string roomKey, IEssentialsRoom room) : base(key, $"/room/{room.Key}", room as Device)
|
public MobileControlEssentialsRoomBridge(string key, string roomKey, IEssentialsRoom room) : base(key, $"/room/{room.Key}", room as Device)
|
||||||
{
|
{
|
||||||
DefaultRoomKey = roomKey;
|
DefaultRoomKey = roomKey;
|
||||||
@@ -66,7 +79,9 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
AddPreActivationAction(GetRoom);
|
AddPreActivationAction(GetRoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Registers all message handling actions with the AppServer for this room bridge
|
||||||
|
/// </summary>
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
// we add actions to the messaging system with a path, and a related action. Custom action
|
// we add actions to the messaging system with a path, and a related action. Custom action
|
||||||
@@ -284,6 +299,9 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
Room = tempRoom;
|
Room = tempRoom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles user code changes and generates QR code URL
|
||||||
|
/// </summary>
|
||||||
protected override void UserCodeChange()
|
protected override void UserCodeChange()
|
||||||
{
|
{
|
||||||
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Server user code changed: {userCode}", this, UserCode);
|
Debug.LogMessage(Serilog.Events.LogEventLevel.Debug, "Server user code changed: {userCode}", this, UserCode);
|
||||||
@@ -807,18 +825,33 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
[JsonProperty("configuration", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("configuration", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public RoomConfiguration Configuration { get; set; }
|
public RoomConfiguration Configuration { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the activity mode of the room
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("activityMode", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("activityMode", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public int? ActivityMode { get; set; }
|
public int? ActivityMode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether advanced sharing is active
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("advancedSharingActive", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("advancedSharingActive", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? AdvancedSharingActive { get; set; }
|
public bool? AdvancedSharingActive { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room is powered on
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("isOn", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isOn", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsOn { get; set; }
|
public bool? IsOn { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room is warming up
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("isWarmingUp", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isWarmingUp", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsWarmingUp { get; set; }
|
public bool? IsWarmingUp { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room is cooling down
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("isCoolingDown", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isCoolingDown", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsCoolingDown { get; set; }
|
public bool? IsCoolingDown { get; set; }
|
||||||
|
|
||||||
@@ -834,9 +867,15 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
[JsonProperty("share", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("share", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public ShareState Share { get; set; }
|
public ShareState Share { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the volume controls collection
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("volumes", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("volumes", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<string, Volume> Volumes { get; set; }
|
public Dictionary<string, Volume> Volumes { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room is in a call
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("isInCall", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isInCall", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsInCall { get; set; }
|
public bool? IsInCall { get; set; }
|
||||||
}
|
}
|
||||||
@@ -853,9 +892,15 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
[JsonProperty("currentShareText", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("currentShareText", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string CurrentShareText { get; set; }
|
public string CurrentShareText { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether sharing is enabled
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("enabled", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? Enabled { get; set; }
|
public bool? Enabled { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether content is currently being shared
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("isSharing", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("isSharing", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IsSharing { get; set; }
|
public bool? IsSharing { get; set; }
|
||||||
}
|
}
|
||||||
@@ -865,24 +910,45 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class RoomConfiguration
|
public class RoomConfiguration
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room has video conferencing capabilities
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("hasVideoConferencing", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasVideoConferencing", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasVideoConferencing { get; set; }
|
public bool? HasVideoConferencing { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the video codec is a Zoom Room
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("videoCodecIsZoomRoom", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("videoCodecIsZoomRoom", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? VideoCodecIsZoomRoom { get; set; }
|
public bool? VideoCodecIsZoomRoom { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room has audio conferencing capabilities
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("hasAudioConferencing", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasAudioConferencing", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasAudioConferencing { get; set; }
|
public bool? HasAudioConferencing { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room has environmental controls (lighting, shades, etc.)
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("hasEnvironmentalControls", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasEnvironmentalControls", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasEnvironmentalControls { get; set; }
|
public bool? HasEnvironmentalControls { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room has camera controls
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("hasCameraControls", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasCameraControls", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasCameraControls { get; set; }
|
public bool? HasCameraControls { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room has set-top box controls
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("hasSetTopBoxControls", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasSetTopBoxControls", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasSetTopBoxControls { get; set; }
|
public bool? HasSetTopBoxControls { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room has routing controls
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("hasRoutingControls", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasRoutingControls", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasRoutingControls { get; set; }
|
public bool? HasRoutingControls { get; set; }
|
||||||
|
|
||||||
@@ -949,6 +1015,9 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
[JsonProperty("defaultDisplayKey", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("defaultDisplayKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string DefaultDisplayKey { get; set; }
|
public string DefaultDisplayKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the destinations dictionary keyed by destination type
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("destinations", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("destinations", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<eSourceListItemDestinationTypes, string> Destinations { get; set; }
|
public Dictionary<eSourceListItemDestinationTypes, string> Destinations { get; set; }
|
||||||
|
|
||||||
@@ -959,9 +1028,15 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
[JsonProperty("environmentalDevices", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("environmentalDevices", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public List<EnvironmentalDeviceConfiguration> EnvironmentalDevices { get; set; }
|
public List<EnvironmentalDeviceConfiguration> EnvironmentalDevices { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the source list for the room
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("sourceList", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("sourceList", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<string, SourceListItem> SourceList { get; set; }
|
public Dictionary<string, SourceListItem> SourceList { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the destination list for the room
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("destinationList", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("destinationList", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<string, DestinationListItem> DestinationList { get; set; }
|
public Dictionary<string, DestinationListItem> DestinationList { get; set; }
|
||||||
|
|
||||||
@@ -972,6 +1047,9 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
[JsonProperty("audioControlPointList", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("audioControlPointList", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public AudioControlPointListItem AudioControlPointList { get; set; }
|
public AudioControlPointListItem AudioControlPointList { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the camera list for the room
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("cameraList", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("cameraList", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<string, CameraListItem> CameraList { get; set; }
|
public Dictionary<string, CameraListItem> CameraList { get; set; }
|
||||||
|
|
||||||
@@ -1004,9 +1082,15 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
[JsonProperty("uiBehavior", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("uiBehavior", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public EssentialsRoomUiBehaviorConfig UiBehavior { get; set; }
|
public EssentialsRoomUiBehaviorConfig UiBehavior { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the room supports advanced sharing features
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("supportsAdvancedSharing", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("supportsAdvancedSharing", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? SupportsAdvancedSharing { get; set; }
|
public bool? SupportsAdvancedSharing { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets whether the user can change the share mode
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("userCanChangeShareMode", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("userCanChangeShareMode", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? UserCanChangeShareMode { get; set; }
|
public bool? UserCanChangeShareMode { get; set; }
|
||||||
|
|
||||||
@@ -1017,6 +1101,9 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
[JsonProperty("roomCombinerKey", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("roomCombinerKey", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string RoomCombinerKey { get; set; }
|
public string RoomCombinerKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="RoomConfiguration"/> class
|
||||||
|
/// </summary>
|
||||||
public RoomConfiguration()
|
public RoomConfiguration()
|
||||||
{
|
{
|
||||||
Destinations = new Dictionary<eSourceListItemDestinationTypes, string>();
|
Destinations = new Dictionary<eSourceListItemDestinationTypes, string>();
|
||||||
@@ -1046,6 +1133,11 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
[JsonProperty("deviceType", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("deviceType", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public eEnvironmentalDeviceTypes DeviceType { get; private set; }
|
public eEnvironmentalDeviceTypes DeviceType { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="EnvironmentalDeviceConfiguration"/> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The device key</param>
|
||||||
|
/// <param name="type">The environmental device type</param>
|
||||||
public EnvironmentalDeviceConfiguration(string key, eEnvironmentalDeviceTypes type)
|
public EnvironmentalDeviceConfiguration(string key, eEnvironmentalDeviceTypes type)
|
||||||
{
|
{
|
||||||
DeviceKey = key;
|
DeviceKey = key;
|
||||||
@@ -1054,14 +1146,29 @@ namespace PepperDash.Essentials.RoomBridges
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Enumeration of eEnvironmentalDeviceTypes values
|
/// Enumeration of environmental device types
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public enum eEnvironmentalDeviceTypes
|
public enum eEnvironmentalDeviceTypes
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// No environmental device type specified
|
||||||
|
/// </summary>
|
||||||
None,
|
None,
|
||||||
|
/// <summary>
|
||||||
|
/// Lighting device type
|
||||||
|
/// </summary>
|
||||||
Lighting,
|
Lighting,
|
||||||
|
/// <summary>
|
||||||
|
/// Shade device type
|
||||||
|
/// </summary>
|
||||||
Shade,
|
Shade,
|
||||||
|
/// <summary>
|
||||||
|
/// Shade controller device type
|
||||||
|
/// </summary>
|
||||||
ShadeController,
|
ShadeController,
|
||||||
|
/// <summary>
|
||||||
|
/// Relay device type
|
||||||
|
/// </summary>
|
||||||
Relay,
|
Relay,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,22 @@
|
|||||||
using PepperDash.Core;
|
using System;
|
||||||
using System;
|
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Services
|
namespace PepperDash.Essentials.Services
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a MobileControlApiService
|
/// Service for interacting with a Mobile Control Edge server instance
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MobileControlApiService
|
public class MobileControlApiService
|
||||||
{
|
{
|
||||||
private readonly HttpClient _client;
|
private readonly HttpClient _client;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="MobileControlApiService"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="apiUrl">Mobile Control Edge API URL</param>
|
||||||
public MobileControlApiService(string apiUrl)
|
public MobileControlApiService(string apiUrl)
|
||||||
{
|
{
|
||||||
var handler = new HttpClientHandler
|
var handler = new HttpClientHandler
|
||||||
@@ -24,6 +28,13 @@ namespace PepperDash.Essentials.Services
|
|||||||
_client = new HttpClient(handler);
|
_client = new HttpClient(handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send authorization request to Mobile Control Edge Server
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="apiUrl">Mobile Control Edge API URL</param>
|
||||||
|
/// <param name="grantCode">Grant code for authorization</param>
|
||||||
|
/// <param name="systemUuid">System UUID for authorization</param>
|
||||||
|
/// <returns>Authorization response</returns>
|
||||||
public async Task<AuthorizationResponse> SendAuthorizationRequest(string apiUrl, string grantCode, string systemUuid)
|
public async Task<AuthorizationResponse> SendAuthorizationRequest(string apiUrl, string grantCode, string systemUuid)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -7,8 +7,15 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface ITheme : IKeyed
|
public interface ITheme : IKeyed
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Current theme
|
||||||
|
/// </summary>
|
||||||
string Theme { get; }
|
string Theme { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the theme with the given value
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="theme">The theme to set</param>
|
||||||
void UpdateTheme(string theme);
|
void UpdateTheme(string theme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,12 +8,24 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface ITswAppControl : IKeyed
|
public interface ITswAppControl : IKeyed
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Updates when the Zoom Room Control Application opens or closes
|
||||||
|
/// </summary>
|
||||||
BoolFeedback AppOpenFeedback { get; }
|
BoolFeedback AppOpenFeedback { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Hide the Zoom App and show the User Control Application
|
||||||
|
/// </summary>
|
||||||
void HideOpenApp();
|
void HideOpenApp();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Close the Zoom App and show the User Control Application
|
||||||
|
/// </summary>
|
||||||
void CloseOpenApp();
|
void CloseOpenApp();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Open the Zoom App
|
||||||
|
/// </summary>
|
||||||
void OpenApp();
|
void OpenApp();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,10 +34,19 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface ITswZoomControl : IKeyed
|
public interface ITswZoomControl : IKeyed
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Updates when Zoom has an incoming call
|
||||||
|
/// </summary>
|
||||||
BoolFeedback ZoomIncomingCallFeedback { get; }
|
BoolFeedback ZoomIncomingCallFeedback { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates when Zoom is in a call
|
||||||
|
/// </summary>
|
||||||
BoolFeedback ZoomInCallFeedback { get; }
|
BoolFeedback ZoomInCallFeedback { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// End a Zoom Call
|
||||||
|
/// </summary>
|
||||||
void EndZoomCall();
|
void EndZoomCall();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,17 +7,24 @@ using PepperDash.Essentials.AppServer.Messengers;
|
|||||||
namespace PepperDash.Essentials.Touchpanel
|
namespace PepperDash.Essentials.Touchpanel
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a ITswAppControlMessenger
|
/// Messenger for controlling the Zoom App on a TSW Panel that supports the Zoom Room Control Application
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ITswAppControlMessenger : MessengerBase
|
public class ITswAppControlMessenger : MessengerBase
|
||||||
{
|
{
|
||||||
private readonly ITswAppControl _appControl;
|
private readonly ITswAppControl _appControl;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="ITswAppControlMessenger"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key for this messenger</param>
|
||||||
|
/// <param name="messagePath">The message path for this messenger</param>
|
||||||
|
/// <param name="device">The device for this messenger</param>
|
||||||
public ITswAppControlMessenger(string key, string messagePath, Device device) : base(key, messagePath, device)
|
public ITswAppControlMessenger(string key, string messagePath, Device device) : base(key, messagePath, device)
|
||||||
{
|
{
|
||||||
_appControl = device as ITswAppControl;
|
_appControl = device as ITswAppControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
if (_appControl == null)
|
if (_appControl == null)
|
||||||
@@ -43,14 +50,14 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var message = new TswAppStateMessage
|
var message = new TswAppStateMessage
|
||||||
{
|
{
|
||||||
AppOpen = _appControl.AppOpenFeedback.BoolValue,
|
AppOpen = _appControl.AppOpenFeedback.BoolValue,
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(message);
|
PostStatusMessage(message, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,6 +66,9 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class TswAppStateMessage : DeviceStateMessageBase
|
public class TswAppStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// True if the Zoom app is open on a TSW panel
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("appOpen", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("appOpen", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? AppOpen { get; set; }
|
public bool? AppOpen { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,17 +8,24 @@ using PepperDash.Essentials.AppServer.Messengers;
|
|||||||
namespace PepperDash.Essentials.Touchpanel
|
namespace PepperDash.Essentials.Touchpanel
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a ITswZoomControlMessenger
|
/// Messenger to handle
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ITswZoomControlMessenger : MessengerBase
|
public class ITswZoomControlMessenger : MessengerBase
|
||||||
{
|
{
|
||||||
private readonly ITswZoomControl _zoomControl;
|
private readonly ITswZoomControl _zoomControl;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create in instance of the <see cref="ITswZoomControlMessenger"/> class for the given device
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key for this messenger</param>
|
||||||
|
/// <param name="messagePath">The message path for this messenger</param>
|
||||||
|
/// <param name="device">The device for this messenger</param>
|
||||||
public ITswZoomControlMessenger(string key, string messagePath, Device device) : base(key, messagePath, device)
|
public ITswZoomControlMessenger(string key, string messagePath, Device device) : base(key, messagePath, device)
|
||||||
{
|
{
|
||||||
_zoomControl = device as ITswZoomControl;
|
_zoomControl = device as ITswZoomControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
if (_zoomControl == null)
|
if (_zoomControl == null)
|
||||||
@@ -27,7 +34,9 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddAction($"/fullStatus", (id, context) => SendFullStatus());
|
AddAction($"/fullStatus", (id, context) => SendFullStatus(id));
|
||||||
|
|
||||||
|
AddAction($"/zoomStatus", (id, content) => SendFullStatus(id));
|
||||||
|
|
||||||
|
|
||||||
AddAction($"/endCall", (id, context) => _zoomControl.EndZoomCall());
|
AddAction($"/endCall", (id, context) => _zoomControl.EndZoomCall());
|
||||||
@@ -53,7 +62,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SendFullStatus()
|
private void SendFullStatus(string id = null)
|
||||||
{
|
{
|
||||||
var message = new TswZoomStateMessage
|
var message = new TswZoomStateMessage
|
||||||
{
|
{
|
||||||
@@ -61,7 +70,7 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
IncomingCall = _zoomControl?.ZoomIncomingCallFeedback.BoolValue
|
IncomingCall = _zoomControl?.ZoomIncomingCallFeedback.BoolValue
|
||||||
};
|
};
|
||||||
|
|
||||||
PostStatusMessage(message);
|
PostStatusMessage(message, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,9 +79,16 @@ namespace PepperDash.Essentials.Touchpanel
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class TswZoomStateMessage : DeviceStateMessageBase
|
public class TswZoomStateMessage : DeviceStateMessageBase
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// True if the panel is in a Zoom call
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("inCall", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("inCall", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? InCall { get; set; }
|
public bool? InCall { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True if there is an incoming Zoom call
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
[JsonProperty("incomingCall", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("incomingCall", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? IncomingCall { get; set; }
|
public bool? IncomingCall { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,17 +7,24 @@ using PepperDash.Essentials.AppServer.Messengers;
|
|||||||
namespace PepperDash.Essentials.Touchpanel
|
namespace PepperDash.Essentials.Touchpanel
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a ThemeMessenger
|
/// Messenger to save the current theme (light/dark) and send to a device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class ThemeMessenger : MessengerBase
|
public class ThemeMessenger : MessengerBase
|
||||||
{
|
{
|
||||||
private readonly ITheme _tpDevice;
|
private readonly ITheme _tpDevice;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="ThemeMessenger"/> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key for this messenger</param>
|
||||||
|
/// <param name="path">The path for this messenger</param>
|
||||||
|
/// <param name="device">The device for this messenger</param>
|
||||||
public ThemeMessenger(string key, string path, ITheme device) : base(key, path, device as Device)
|
public ThemeMessenger(string key, string path, ITheme device) : base(key, path, device as Device)
|
||||||
{
|
{
|
||||||
_tpDevice = device;
|
_tpDevice = device;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
protected override void RegisterActions()
|
protected override void RegisterActions()
|
||||||
{
|
{
|
||||||
AddAction("/fullStatus", (id, content) =>
|
AddAction("/fullStatus", (id, content) =>
|
||||||
|
|||||||
@@ -3,12 +3,19 @@ using System;
|
|||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a UserCodeChanged
|
/// Defines the action to take when the User code changes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class UserCodeChanged
|
public class UserCodeChanged
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Action to take when the User Code changes
|
||||||
|
/// </summary>
|
||||||
public Action<string, string> UpdateUserCode { get; private set; }
|
public Action<string, string> UpdateUserCode { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// create an instance of the <see cref="UserCodeChanged"/> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="updateMethod">action to take when the User Code changes</param>
|
||||||
public UserCodeChanged(Action<string, string> updateMethod)
|
public UserCodeChanged(Action<string, string> updateMethod)
|
||||||
{
|
{
|
||||||
UpdateUserCode = updateMethod;
|
UpdateUserCode = updateMethod;
|
||||||
|
|||||||
@@ -15,15 +15,17 @@ namespace PepperDash.Essentials
|
|||||||
[JsonProperty("master", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("master", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Volume Master { get; set; }
|
public Volume Master { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Aux Faders as configured in the room
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("auxFaders", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("auxFaders", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public Dictionary<string, Volume> AuxFaders { get; set; }
|
public Dictionary<string, Volume> AuxFaders { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Count of aux faders for this system
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("numberOfAuxFaders", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("numberOfAuxFaders", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public int? NumberOfAuxFaders { get; set; }
|
public int? NumberOfAuxFaders { get; set; }
|
||||||
|
|
||||||
public Volumes()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -31,16 +33,21 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Volume
|
public class Volume
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Key
|
/// Gets or sets the Key
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonProperty("key", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("key", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Key { get; set; }
|
public string Key { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Level for this volume object
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("level", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("level", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public int? Level { get; set; }
|
public int? Level { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True if this volume control is muted
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("muted", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("muted", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? Muted { get; set; }
|
public bool? Muted { get; set; }
|
||||||
|
|
||||||
@@ -51,12 +58,21 @@ namespace PepperDash.Essentials
|
|||||||
[JsonProperty("label", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("label", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string Label { get; set; }
|
public string Label { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True if this volume object has mute control
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("hasMute", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasMute", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasMute { get; set; }
|
public bool? HasMute { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True if this volume object has Privacy mute control
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("hasPrivacyMute", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("hasPrivacyMute", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? HasPrivacyMute { get; set; }
|
public bool? HasPrivacyMute { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True if the privacy mute is muted
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("privacyMuted", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("privacyMuted", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public bool? PrivacyMuted { get; set; }
|
public bool? PrivacyMuted { get; set; }
|
||||||
|
|
||||||
@@ -68,6 +84,15 @@ namespace PepperDash.Essentials
|
|||||||
[JsonProperty("muteIcon", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("muteIcon", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public string MuteIcon { get; set; }
|
public string MuteIcon { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="Volume" /> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key for this volume object</param>
|
||||||
|
/// <param name="level">The level for this volume object</param>
|
||||||
|
/// <param name="muted">True if this volume control is muted</param>
|
||||||
|
/// <param name="label">The label for this volume object</param>
|
||||||
|
/// <param name="hasMute">True if this volume object has mute control</param>
|
||||||
|
/// <param name="muteIcon">The mute icon for this volume object</param>
|
||||||
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)
|
||||||
: this(key)
|
: this(key)
|
||||||
{
|
{
|
||||||
@@ -78,18 +103,32 @@ namespace PepperDash.Essentials
|
|||||||
MuteIcon = muteIcon;
|
MuteIcon = muteIcon;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="Volume" /> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key for this volume object</param>
|
||||||
|
/// <param name="level">The level for this volume object</param>
|
||||||
public Volume(string key, int level)
|
public Volume(string key, int level)
|
||||||
: this(key)
|
: this(key)
|
||||||
{
|
{
|
||||||
Level = level;
|
Level = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="Volume" /> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key for this volume object</param>
|
||||||
|
/// <param name="muted">True if this volume control is muted</param>
|
||||||
public Volume(string key, bool muted)
|
public Volume(string key, bool muted)
|
||||||
: this(key)
|
: this(key)
|
||||||
{
|
{
|
||||||
Muted = muted;
|
Muted = muted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="Volume" /> class
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key">The key for this volume object</param>
|
||||||
public Volume(string key)
|
public Volume(string key)
|
||||||
{
|
{
|
||||||
Key = key;
|
Key = key;
|
||||||
|
|||||||
@@ -12,11 +12,20 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
public class ActionPathsHandler : WebApiBaseRequestHandler
|
public class ActionPathsHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
private readonly MobileControlSystemController mcController;
|
private readonly MobileControlSystemController mcController;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="ActionPathsHandler"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="controller"></param>
|
||||||
public ActionPathsHandler(MobileControlSystemController controller) : base(true)
|
public ActionPathsHandler(MobileControlSystemController controller) : base(true)
|
||||||
{
|
{
|
||||||
mcController = controller;
|
mcController = controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handle a request to get the action paths
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">Request Context</param>
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
protected override void HandleGet(HttpCwsContext context)
|
||||||
{
|
{
|
||||||
var response = JsonConvert.SerializeObject(new ActionPathsResponse(mcController));
|
var response = JsonConvert.SerializeObject(new ActionPathsResponse(mcController));
|
||||||
@@ -37,9 +46,16 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
private readonly MobileControlSystemController mcController;
|
private readonly MobileControlSystemController mcController;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Registered action paths for this system
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("actionPaths")]
|
[JsonProperty("actionPaths")]
|
||||||
public List<ActionPath> ActionPaths => mcController.GetActionDictionaryPaths().Select((path) => new ActionPath { MessengerKey = path.Item1, Path = path.Item2 }).ToList();
|
public List<ActionPath> ActionPaths => mcController.GetActionDictionaryPaths().Select((path) => new ActionPath { MessengerKey = path.Item1, Path = path.Item2 }).ToList();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="ActionPathsResponse"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="mcController"></param>
|
||||||
public ActionPathsResponse(MobileControlSystemController mcController)
|
public ActionPathsResponse(MobileControlSystemController mcController)
|
||||||
{
|
{
|
||||||
this.mcController = mcController;
|
this.mcController = mcController;
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
using Crestron.SimplSharp.WebScripting;
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Crestron.SimplSharp.WebScripting;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
using PepperDash.Core.Web.RequestHandlers;
|
||||||
using PepperDash.Essentials.Core.Web;
|
using PepperDash.Essentials.Core.Web;
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.WebApiHandlers
|
namespace PepperDash.Essentials.WebApiHandlers
|
||||||
{
|
{
|
||||||
@@ -15,11 +15,20 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
{
|
{
|
||||||
private readonly MobileControlSystemController mcController;
|
private readonly MobileControlSystemController mcController;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="MobileAuthRequestHandler"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="controller"></param>
|
||||||
public MobileAuthRequestHandler(MobileControlSystemController controller) : base(true)
|
public MobileAuthRequestHandler(MobileControlSystemController controller) : base(true)
|
||||||
{
|
{
|
||||||
mcController = controller;
|
mcController = controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handle authorization request for this processor
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">request context</param>
|
||||||
|
/// <returns>Task</returns>
|
||||||
protected override async Task HandlePost(HttpCwsContext context)
|
protected override async Task HandlePost(HttpCwsContext context)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -11,16 +11,25 @@ using PepperDash.Essentials.WebSocketServer;
|
|||||||
namespace PepperDash.Essentials.WebApiHandlers
|
namespace PepperDash.Essentials.WebApiHandlers
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a MobileInfoHandler
|
/// Represents a MobileInfoHandler. Used with the Essentials CWS API
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class MobileInfoHandler : WebApiBaseRequestHandler
|
public class MobileInfoHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
private readonly MobileControlSystemController mcController;
|
private readonly MobileControlSystemController mcController;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="MobileInfoHandler"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="controller"></param>
|
||||||
public MobileInfoHandler(MobileControlSystemController controller) : base(true)
|
public MobileInfoHandler(MobileControlSystemController controller) : base(true)
|
||||||
{
|
{
|
||||||
mcController = controller;
|
mcController = controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get Mobile Control Information
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context"></param>
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
protected override void HandleGet(HttpCwsContext context)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -50,14 +59,22 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
private readonly MobileControlSystemController mcController;
|
private readonly MobileControlSystemController mcController;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Edge Server. Null if edge server is disabled
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("edgeServer", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("edgeServer", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public MobileControlEdgeServer EdgeServer => mcController.Config.EnableApiServer ? new MobileControlEdgeServer(mcController) : null;
|
public MobileControlEdgeServer EdgeServer => mcController.Config.EnableApiServer ? new MobileControlEdgeServer(mcController) : null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Direct server. Null if the direct server is disabled
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("directServer", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("directServer", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public MobileControlDirectServer DirectServer => mcController.Config.DirectServer.EnableDirectServer ? new MobileControlDirectServer(mcController.DirectServer) : null;
|
public MobileControlDirectServer DirectServer => mcController.Config.DirectServer.EnableDirectServer ? new MobileControlDirectServer(mcController.DirectServer) : null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create in instace of the <see cref="InformationResponse"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="controller"></param>
|
||||||
public InformationResponse(MobileControlSystemController controller)
|
public InformationResponse(MobileControlSystemController controller)
|
||||||
{
|
{
|
||||||
mcController = controller;
|
mcController = controller;
|
||||||
@@ -72,24 +89,46 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
private readonly MobileControlSystemController mcController;
|
private readonly MobileControlSystemController mcController;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Mobile Control Edge Server address for this system
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("serverAddress")]
|
[JsonProperty("serverAddress")]
|
||||||
public string ServerAddress => mcController.Config == null ? "No Config" : mcController.Host;
|
public string ServerAddress => mcController.Config == null ? "No Config" : mcController.Host;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// System Name for this system
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("systemName")]
|
[JsonProperty("systemName")]
|
||||||
public string SystemName => mcController.RoomBridges.Count > 0 ? mcController.RoomBridges[0].RoomName : "No Config";
|
public string SystemName => mcController.RoomBridges.Count > 0 ? mcController.RoomBridges[0].RoomName : "No Config";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// System URL for this system
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("systemUrl")]
|
[JsonProperty("systemUrl")]
|
||||||
public string SystemUrl => ConfigReader.ConfigObject.SystemUrl;
|
public string SystemUrl => ConfigReader.ConfigObject.SystemUrl;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// User code to use in MC UI for this system
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("userCode")]
|
[JsonProperty("userCode")]
|
||||||
public string UserCode => mcController.RoomBridges.Count > 0 ? mcController.RoomBridges[0].UserCode : "Not available";
|
public string UserCode => mcController.RoomBridges.Count > 0 ? mcController.RoomBridges[0].UserCode : "Not available";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True if connected to edge server
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("connected")]
|
[JsonProperty("connected")]
|
||||||
public bool Connected => mcController.Connected;
|
public bool Connected => mcController.Connected;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Seconds since last comms with edge server
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("secondsSinceLastAck")]
|
[JsonProperty("secondsSinceLastAck")]
|
||||||
public int SecondsSinceLastAck => (DateTime.Now - mcController.LastAckMessage).Seconds;
|
public int SecondsSinceLastAck => (DateTime.Now - mcController.LastAckMessage).Seconds;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="MobileControlEdgeServer"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="controller">controller to use for this</param>
|
||||||
public MobileControlEdgeServer(MobileControlSystemController controller)
|
public MobileControlEdgeServer(MobileControlSystemController controller)
|
||||||
{
|
{
|
||||||
mcController = controller;
|
mcController = controller;
|
||||||
@@ -104,25 +143,43 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
private readonly MobileControlWebsocketServer directServer;
|
private readonly MobileControlWebsocketServer directServer;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// URL to use to interact with this server
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("userAppUrl")]
|
[JsonProperty("userAppUrl")]
|
||||||
public string UserAppUrl => $"{directServer.UserAppUrlPrefix}/[insert_client_token]";
|
public string UserAppUrl => $"{directServer.UserAppUrlPrefix}/[insert_client_token]";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// TCP/IP Port this server is configured to use
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("serverPort")]
|
[JsonProperty("serverPort")]
|
||||||
public int ServerPort => directServer.Port;
|
public int ServerPort => directServer.Port;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Count of defined tokens for this server
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("tokensDefined")]
|
[JsonProperty("tokensDefined")]
|
||||||
public int TokensDefined => directServer.UiClientContexts.Count;
|
public int TokensDefined => directServer.UiClientContexts.Count;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Count of connected clients
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("clientsConnected")]
|
[JsonProperty("clientsConnected")]
|
||||||
public int ClientsConnected => directServer.ConnectedUiClientsCount;
|
public int ClientsConnected => directServer.ConnectedUiClientsCount;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// List of tokens and connected clients for this server
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("clients")]
|
[JsonProperty("clients")]
|
||||||
public List<MobileControlDirectClient> Clients => directServer.UiClientContexts
|
public List<MobileControlDirectClient> Clients => directServer.UiClientContexts
|
||||||
.Select(context => (context, clients: directServer.UiClients.Where(client => client.Value.Token == context.Value.Token.Token).Select(c => c.Value).ToList()))
|
.Select(context => (context, clients: directServer.UiClients.Where(client => client.Value.Token == context.Value.Token.Token).Select(c => c.Value).ToList()))
|
||||||
.Select((clientTuple, i) => new MobileControlDirectClient(clientTuple.clients, clientTuple.context, i, directServer.UserAppUrlPrefix))
|
.Select((clientTuple, i) => new MobileControlDirectClient(clientTuple.clients, clientTuple.context, i, directServer.UserAppUrlPrefix))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="MobileControlDirectServer"/> class.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="server"></param>
|
||||||
public MobileControlDirectServer(MobileControlWebsocketServer server)
|
public MobileControlDirectServer(MobileControlWebsocketServer server)
|
||||||
{
|
{
|
||||||
directServer = server;
|
directServer = server;
|
||||||
@@ -146,23 +203,41 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
private readonly string urlPrefix;
|
private readonly string urlPrefix;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Client number for this client
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("clientNumber")]
|
[JsonProperty("clientNumber")]
|
||||||
public string ClientNumber => $"{clientNumber}";
|
public string ClientNumber => $"{clientNumber}";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Room Key for this client
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("roomKey")]
|
[JsonProperty("roomKey")]
|
||||||
public string RoomKey => context.Token.RoomKey;
|
public string RoomKey => context.Token.RoomKey;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Touchpanel Key, if defined, for this client
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("touchpanelKey")]
|
[JsonProperty("touchpanelKey")]
|
||||||
public string TouchpanelKey => context.Token.TouchpanelKey;
|
public string TouchpanelKey => context.Token.TouchpanelKey;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// URL for this client
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("url")]
|
[JsonProperty("url")]
|
||||||
public string Url => $"{urlPrefix}{Key}";
|
public string Url => $"{urlPrefix}{Key}";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Token for this client
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("token")]
|
[JsonProperty("token")]
|
||||||
public string Token => Key;
|
public string Token => Key;
|
||||||
|
|
||||||
private readonly List<UiClient> clients;
|
private readonly List<UiClient> clients;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// List of status for all connected UI Clients
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("clientStatus")]
|
[JsonProperty("clientStatus")]
|
||||||
public List<ClientStatus> ClientStatus => clients.Select(c => new ClientStatus(c)).ToList();
|
public List<ClientStatus> ClientStatus => clients.Select(c => new ClientStatus(c)).ToList();
|
||||||
|
|
||||||
@@ -183,14 +258,27 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Report the status of a UiClient
|
||||||
|
/// </summary>
|
||||||
public class ClientStatus
|
public class ClientStatus
|
||||||
{
|
{
|
||||||
private readonly UiClient client;
|
private readonly UiClient client;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True if client is connected
|
||||||
|
/// </summary>
|
||||||
public bool Connected => client != null && client.Context.WebSocket.IsAlive;
|
public bool Connected => client != null && client.Context.WebSocket.IsAlive;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the time this client has been connected
|
||||||
|
/// </summary>
|
||||||
public double Duration => client == null ? 0 : client.ConnectedDuration.TotalSeconds;
|
public double Duration => client == null ? 0 : client.ConnectedDuration.TotalSeconds;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create an instance of the <see cref="ClientStatus"/> class for the specified client
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="client">client to report on</param>
|
||||||
public ClientStatus(UiClient client)
|
public ClientStatus(UiClient client)
|
||||||
{
|
{
|
||||||
this.client = client;
|
this.client = client;
|
||||||
|
|||||||
@@ -14,11 +14,20 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
public class UiClientHandler : WebApiBaseRequestHandler
|
public class UiClientHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
private readonly MobileControlWebsocketServer server;
|
private readonly MobileControlWebsocketServer server;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Essentials CWS API handler for the MC Direct Server
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="directServer">Direct Server instance</param>
|
||||||
public UiClientHandler(MobileControlWebsocketServer directServer) : base(true)
|
public UiClientHandler(MobileControlWebsocketServer directServer) : base(true)
|
||||||
{
|
{
|
||||||
server = directServer;
|
server = directServer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a client for the Direct Server
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">HTTP Context for this request</param>
|
||||||
protected override void HandlePost(HttpCwsContext context)
|
protected override void HandlePost(HttpCwsContext context)
|
||||||
{
|
{
|
||||||
var req = context.Request;
|
var req = context.Request;
|
||||||
@@ -65,6 +74,10 @@ namespace PepperDash.Essentials.WebApiHandlers
|
|||||||
res.End();
|
res.End();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handle DELETE request for a Client
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context"></param>
|
||||||
protected override void HandleDelete(HttpCwsContext context)
|
protected override void HandleDelete(HttpCwsContext context)
|
||||||
{
|
{
|
||||||
var req = context.Request;
|
var req = context.Request;
|
||||||
|
|||||||
@@ -17,9 +17,15 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
[JsonProperty("clientId")]
|
[JsonProperty("clientId")]
|
||||||
public string ClientId { get; set; }
|
public string ClientId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Room Key for this client
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("roomKey")]
|
[JsonProperty("roomKey")]
|
||||||
public string RoomKey { get; set; }
|
public string RoomKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// System UUID for this system
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("systemUUid")]
|
[JsonProperty("systemUUid")]
|
||||||
public string SystemUuid { get; set; }
|
public string SystemUuid { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -14,10 +14,19 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string Code { get; set; }
|
public string Code { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Room Key this token is associated with
|
||||||
|
/// </summary>
|
||||||
public string RoomKey { get; set; }
|
public string RoomKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unique ID for this token
|
||||||
|
/// </summary>
|
||||||
public string Uuid { get; set; }
|
public string Uuid { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Touchpanel Key this token is associated with, if this is a touch panel token
|
||||||
|
/// </summary>
|
||||||
public string TouchpanelKey { get; set; } = "";
|
public string TouchpanelKey { get; set; } = "";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -315,6 +315,9 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the internal logging level for the Websocket Server
|
||||||
|
/// </summary>
|
||||||
public void SetWebsocketLogLevel(LogLevel level)
|
public void SetWebsocketLogLevel(LogLevel level)
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse($"Setting direct server debug level to {level}", level.ToString());
|
CrestronConsole.ConsoleCommandResponse($"Setting direct server debug level to {level}", level.ToString());
|
||||||
|
|||||||
@@ -13,8 +13,15 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string GrantCode { get; set; }
|
public string GrantCode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the Tokens for this server
|
||||||
|
/// </summary>
|
||||||
public Dictionary<string, JoinToken> Tokens { get; set; }
|
public Dictionary<string, JoinToken> Tokens { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize a new instance of the <see cref="ServerTokenSecrets"/> class with the provided grant code
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="grantCode">The grant code for this server</param>
|
||||||
public ServerTokenSecrets(string grantCode)
|
public ServerTokenSecrets(string grantCode)
|
||||||
{
|
{
|
||||||
GrantCode = grantCode;
|
GrantCode = grantCode;
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public JoinToken Token { get; private set; }
|
public JoinToken Token { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize an instance of the <see cref="UiClientContext"/> class with the provided token
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="token">token for this client</param>
|
||||||
public UiClientContext(JoinToken token)
|
public UiClientContext(JoinToken token)
|
||||||
{
|
{
|
||||||
Token = token;
|
Token = token;
|
||||||
|
|||||||
@@ -8,12 +8,25 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Version
|
public class Version
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Server version this Websocket is connected to
|
||||||
|
/// </summary>
|
||||||
[JsonProperty("serverVersion")]
|
[JsonProperty("serverVersion")]
|
||||||
public string ServerVersion { get; set; }
|
public string ServerVersion { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// True if the server is on a processor
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
[JsonProperty("serverIsRunningOnProcessorHardware")]
|
[JsonProperty("serverIsRunningOnProcessorHardware")]
|
||||||
public bool ServerIsRunningOnProcessorHardware { get; private set; }
|
public bool ServerIsRunningOnProcessorHardware { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize an instance of the <see cref="Version"/> class
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// the <see cref="ServerIsRunningOnProcessorHardware"/> property is set to true by default.
|
||||||
|
/// </remarks>
|
||||||
public Version()
|
public Version()
|
||||||
{
|
{
|
||||||
ServerIsRunningOnProcessorHardware = true;
|
ServerIsRunningOnProcessorHardware = true;
|
||||||
|
|||||||
@@ -13,25 +13,28 @@ namespace PepperDash.Essentials.WebSocketServer
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Represents a WebSocketServerSecret
|
/// Stores a secret value using the provided secret store provider
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class WebSocketServerSecret : ISecret
|
public class WebSocketServerSecret : ISecret
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Provider
|
/// Gets the Secret Provider associated with this secret
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public ISecretProvider Provider { get; private set; }
|
public ISecretProvider Provider { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Key
|
/// Gets the Key associated with this secret
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Key { get; private set; }
|
public string Key { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Value
|
/// Gets the Value associated with this secret
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public object Value { get; private set; }
|
public object Value { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize and instance of the <see cref="WebSocketServerSecret"/> class
|
||||||
|
/// </summary>
|
||||||
public WebSocketServerSecret(string key, object value, ISecretProvider provider)
|
public WebSocketServerSecret(string key, object value, ISecretProvider provider)
|
||||||
{
|
{
|
||||||
Key = key;
|
Key = key;
|
||||||
|
|||||||
Reference in New Issue
Block a user