Compare commits

...

48 Commits

Author SHA1 Message Date
Neil Dorin
d2d99d4bfa Merge branch 'main' into hotfix/techroom-preset-recall-event 2021-05-24 12:45:27 -06:00
Andrew Welker
e82efdde2d Merge pull request #707 from PepperDash/hotfix/devjson-overload-fix
fix:(EssentialsCore) Add ability for `devjson` command to handle overloads
2021-05-20 11:04:23 -06:00
Andrew Welker
d00c8bed5f fix:(EssentialsCore) Add ability for devjson command to handle overloads
The `devjson` command needs to ability to handle overloads. With this change, if a method is an overloaded method, the command will get all methods on an object that match the entered method name, then get the first entry in the list of methods that matches the length of the provided parameters list.

This won't work in all cases, as there may be situations where the parameters of the methods have the same length, but different types. In that situation, it's likely that the conversion from `Object` to the desired type will fail, in which case, the command will notify the user that something went wrong.
2021-05-20 10:52:12 -06:00
Andrew Welker
44c171c8f4 Merge pull request #692 from PepperDash/hotfix/console-response-crlf-fixes
Changes cr to crlf for some console command responses
2021-04-28 09:54:24 -06:00
Alex Johnson
ae9833ffaa Changes cr to crlf for some console command responses 2021-04-23 08:58:43 -04:00
Neil Dorin
685c344785 #690 fixes incorrect conditional check before firing feedback 2021-04-20 14:38:24 -06:00
Andrew Welker
e12a5e95bf Merge pull request #683 from PepperDash/release/v1.8.3
add flags on both ends to prevent input switching loop
2021-04-09 16:50:44 -06:00
Andrew Welker
3e7144f7ef Merge branch 'main' into release/v1.8.3 2021-04-09 16:40:56 -06:00
Andrew Welker
19e070ed76 add flags on both ends to prevent input switching loop 2021-04-09 16:36:11 -06:00
Neil Dorin
b818c14713 Merge pull request #681 from PepperDash/release/v1.8.3
Release/v1.8.3
2021-04-09 15:31:02 -06:00
Andrew Welker
63e7866890 Merge pull request #680 from PepperDash/feature/imobilecontrolroombridge-upgrades
Feature/imobilecontrolroombridge upgrades
2021-04-08 16:26:47 -06:00
Neil Dorin
922d1d8133 Merge branch 'development' into feature/imobilecontrolroombridge-upgrades 2021-04-08 16:17:02 -06:00
Andrew Welker
d26ea01ed9 Merge pull request #673 from PepperDash/hotfix/genericqueue-dispose-issue
Hotfix/genericqueue dispose issue
2021-04-08 16:15:31 -06:00
Andrew Welker
4ebd1b53b5 Merge branch 'development' into hotfix/genericqueue-dispose-issue 2021-04-08 15:37:15 -06:00
Andrew Welker
0226b58b1e Merge pull request #672 from PepperDash/hotfix/genericqueue-dispose-issue
#671 switches to private Dispose() on program stop
2021-04-08 15:36:53 -06:00
Neil Dorin
be41922c54 Merge pull request #679 from PepperDash/feature/plugin-loading-issues
Clean up messaging
2021-04-08 14:43:43 -06:00
Andrew Welker
56f93c5491 Merge branch 'main' into hotfix/genericqueue-dispose-issue 2021-04-08 14:25:11 -06:00
Neil Dorin
7640b95701 Clears camera mute mode when turning camera auto mode off 2021-04-06 20:08:59 -06:00
Neil Dorin
6c2abc7abd Adds missing space in video mute command 2021-04-06 19:54:01 -06:00
Neil Dorin
1849d118b4 gets rid of console print when queue items are processed. 2021-04-06 18:15:37 -06:00
Neil Dorin
22e7f004a5 adds missing code parameter 2021-04-06 18:06:15 -06:00
Neil Dorin
0dcaacb038 Merge branch 'feature/multi-display-adds' into feature/imobilecontrolroombridge-upgrades 2021-04-06 16:37:17 -06:00
Neil Dorin
cf8e673677 Adds ClientJoined event 2021-04-06 12:25:33 -06:00
Neil Dorin
200080247a closes #671 and changes to aborting thread in Dispose instead of attempting to join 2021-04-06 10:38:39 -06:00
Neil Dorin
ba247ee8d6 removes commented code for clarity 2021-04-06 10:36:03 -06:00
Neil Dorin
b6f47168c0 Merge pull request #676 from PepperDash/hotfix/stream-debug-console-issues
Fix FormatException happening from fall-through
2021-04-06 10:01:07 -06:00
Neil Dorin
1e755df9bb #675 Adds UserPromptedForCode event and method to show code on CiscoSparkCodec 2021-04-05 17:01:34 -06:00
Neil Dorin
037f8ed043 #671 Updates to GenericQueue to resolve issues when stopping program 2021-04-02 17:07:06 -06:00
Neil Dorin
e327d2d359 passes true when disposing of generic queue in deconstructor 2021-04-02 16:09:54 -06:00
Neil Dorin
2feec62052 Removes explicit call to dispose when program stops. Clears queue in dispose 2021-03-31 16:35:33 -06:00
Neil Dorin
33a1b1697a Removes call to dispose on program stop event. Adds debug statement in Dispose() 2021-03-31 15:29:55 -06:00
Neil Dorin
955d68b3f3 #671 switches to private Dispose() on program stop 2021-03-30 15:56:05 -06:00
Neil Dorin
0f28d46f34 #671 Calls the private dispose method on program stop 2021-03-30 15:53:10 -06:00
Andrew Welker
275759143b Merge branch 'development' into feature/multi-display-adds 2021-03-29 13:31:10 -06:00
Andrew Welker
3803263598 Merge branch 'development' into feature/multi-display-adds 2021-03-29 12:54:54 -06:00
Andrew Welker
4f9fa05e3f Merge branch 'development' into feature/multi-display-adds 2021-03-25 16:06:48 -06:00
Neil Dorin
6ab4d4d090 #658 Initializes config properties in constructor(s) 2021-03-17 10:52:17 -06:00
Andrew Welker
fcdee3b9fd Merge branch 'development' into feature/multi-display-adds 2021-03-17 09:01:00 -06:00
Neil Dorin
4e15d7fe5a Adds necessary config properteis 2021-03-16 15:36:14 -06:00
Andrew Welker
74231a428d removed unnecessary stack trace printing 2021-03-05 17:31:21 -07:00
Andrew Welker
8ba0920cc0 add jsonProperty decorator for PreferredName 2021-03-05 15:41:22 -07:00
Andrew Welker
e23fe06fef update name change in csproj 2021-03-05 15:32:21 -07:00
Andrew Welker
79fd1f7424 add destinationListKey property and remove DDVC 2021-03-03 14:43:42 -07:00
Andrew Welker
d2ebc340bd add Sink Type property 2021-03-01 15:15:50 -07:00
Andrew Welker
7c7ae65d40 Update PepperDash_Essentials_Core.csproj 2021-02-25 17:01:24 -07:00
Andrew Welker
0dcbb652df add properties to SourceListItem
add XML Comments
2021-02-25 17:00:57 -07:00
Andrew Welker
0649cea367 Add DestinationLists to config 2021-02-25 16:53:51 -07:00
Andrew Welker
9f840fae41 add DestinationListItem 2021-02-25 16:53:35 -07:00
16 changed files with 254 additions and 58 deletions

View File

@@ -71,7 +71,7 @@ namespace PepperDash.Essentials
CrestronConsole.AddNewConsoleCommand(s =>
{
foreach (var tl in TieLineCollection.Default)
CrestronConsole.ConsoleCommandResponse(" {0}\r", tl);
CrestronConsole.ConsoleCommandResponse(" {0}\r\n", tl);
},
"listtielines", "Prints out all tie lines", ConsoleAccessLevelEnum.AccessOperator);
@@ -85,8 +85,8 @@ namespace PepperDash.Essentials
CrestronConsole.AddNewConsoleCommand(s =>
{
CrestronConsole.ConsoleCommandResponse("This system can be found at the following URLs:\r" +
"System URL: {0}\r" +
CrestronConsole.ConsoleCommandResponse("This system can be found at the following URLs:\r\n" +
"System URL: {0}\r\n" +
"Template URL: {1}", ConfigReader.ConfigObject.SystemUrl, ConfigReader.ConfigObject.TemplateUrl);
}, "portalinfo", "Shows portal URLS from configuration", ConsoleAccessLevelEnum.AccessOperator);

View File

@@ -137,7 +137,7 @@
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Room\Config\EssentialsDualDisplayRoomPropertiesConfig.cs" />
<Compile Include="Room\Config\EssentialsNDisplayRoomPropertiesConfig.cs" />
<Compile Include="Room\Config\DDVC01RoomPropertiesConfig.cs" />
<Compile Include="Room\Config\SimplRoomPropertiesConfig.cs" />
<Compile Include="Room\Config\EssentialsPresentationPropertiesConfig.cs" />
<Compile Include="Room\Config\EssentialsHuddleRoomPropertiesConfig.cs" />
<Compile Include="Room\Config\EssentialsHuddleVtc1PropertiesConfig.cs" />

View File

@@ -196,9 +196,20 @@ namespace PepperDash.Essentials.Room.Config
public string DefaultAudioKey { get; set; }
[JsonProperty("sourceListKey")]
public string SourceListKey { get; set; }
[JsonProperty("destinationListKey")]
public string DestinationListKey { get; set; }
[JsonProperty("defaultSourceItem")]
public string DefaultSourceItem { get; set; }
/// <summary>
/// Indicates if the room supports advanced sharing
/// </summary>
[JsonProperty("supportsAdvancedSharing")]
public bool SupportsAdvancedSharing { get; set; }
/// <summary>
/// Indicates if non-tech users can change the share mode
/// </summary>
[JsonProperty("userCanChangeShareMode")]
public bool UserCanChangeShareMode { get; set; }
}
public class EssentialsConferenceRoomPropertiesConfig : EssentialsAvRoomPropertiesConfig

View File

@@ -8,19 +8,19 @@ using Newtonsoft.Json;
namespace PepperDash.Essentials.Room.Config
{
public class DDVC01RoomPropertiesConfig : EssentialsHuddleVtc1PropertiesConfig
public class SimplRoomPropertiesConfig : EssentialsHuddleVtc1PropertiesConfig
{
[JsonProperty("roomPhoneNumber")]
public string RoomPhoneNumber { get; set; }
[JsonProperty("roomURI")]
public string RoomURI { get; set; }
[JsonProperty("speedDials")]
public List<DDVC01SpeedDial> SpeedDials { get; set; }
public List<SimplSpeedDial> SpeedDials { get; set; }
[JsonProperty("volumeSliderNames")]
public List<string> VolumeSliderNames { get; set; }
}
public class DDVC01SpeedDial
public class SimplSpeedDial
{
[JsonProperty("name")]
public string Name { get; set; }

View File

@@ -19,7 +19,8 @@ namespace PepperDash.Essentials
{
public class EssentialsHuddleVtc1Room : EssentialsRoomBase, IHasCurrentSourceInfoChange,
IPrivacy, IHasCurrentVolumeControls, IRunRouteAction, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasDefaultDisplay, IHasInCallFeedback
{
{
private bool _codecExternalSourceChange;
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
public event SourceInfoChangeHandler CurrentSourceChange;
@@ -178,10 +179,12 @@ namespace PepperDash.Essentials
handler(_CurrentSourceInfo, ChangeType.DidChange);
var vc = VideoCodec as IHasExternalSourceSwitching;
if (vc != null)
if (vc != null && !_codecExternalSourceChange)
{
vc.SetSelectedSource(CurrentSourceInfoKey);
}
_codecExternalSourceChange = false;
}
}
SourceListItem _CurrentSourceInfo;
@@ -421,6 +424,12 @@ namespace PepperDash.Essentials
return true;
}
public void RunRouteActionCodec(string routeKey, string sourceListKey)
{
_codecExternalSourceChange = true;
RunRouteAction(routeKey, sourceListKey);
}
/// <summary>
///
/// </summary>
@@ -750,7 +759,7 @@ namespace PepperDash.Essentials
x => x.DestinationKey == VideoCodec.Key && x.DestinationPort == videoCodecWithExternalSwitching.ExternalSourceInputPort).DestinationPort;
videoCodecWithExternalSwitching.ClearExternalSources();
videoCodecWithExternalSwitching.RunRouteAction = RunRouteAction;
videoCodecWithExternalSwitching.RunRouteAction = RunRouteActionCodec;
var srcList = ConfigReader.ConfigObject.SourceLists.SingleOrDefault(x => x.Key == SourceListKey).Value.OrderBy(kv => kv.Value.Order); ;
foreach (var kvp in srcList)

View File

@@ -107,14 +107,18 @@ namespace PepperDash.Essentials
private void TunerPresetsOnPresetRecalled(ISetTopBoxNumericKeypad device, string channel)
{
//Debug.Console(2, this, "TunerPresetsOnPresetRecalled");
if (!_currentPresets.ContainsKey(device.Key))
{
return;
}
//Debug.Console(2, this, "Tuner Key: {0} Channel: {1}", device.Key, channel);
_currentPresets[device.Key] = channel;
if (!CurrentPresetsFeedbacks.ContainsKey(device.Key))
if (CurrentPresetsFeedbacks.ContainsKey(device.Key))
{
CurrentPresetsFeedbacks[device.Key].FireUpdate();
}

View File

@@ -1,11 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Newtonsoft.Json;
using PepperDash.Core;
using PepperDash.Essentials.Core;
using Newtonsoft.Json.Linq;
@@ -25,12 +20,25 @@ namespace PepperDash.Essentials.Core.Config
[JsonProperty("sourceLists")]
public Dictionary<string, Dictionary<string, SourceListItem>> SourceLists { get; set; }
[JsonProperty("tieLines")]
[JsonProperty("destinationLists")]
public Dictionary<string, Dictionary<string,DestinationListItem>> DestinationLists { get; set; }
[JsonProperty("tieLines")]
public List<TieLineConfig> TieLines { get; set; }
[JsonProperty("joinMaps")]
public Dictionary<string, JObject> JoinMaps { get; set; }
public BasicConfig()
{
Info = new InfoConfig();
Devices = new List<DeviceConfig>();
SourceLists = new Dictionary<string, Dictionary<string, SourceListItem>>();
DestinationLists = new Dictionary<string, Dictionary<string, DestinationListItem>>();
TieLines = new List<TieLineConfig>();
JoinMaps = new Dictionary<string, JObject>();
}
/// <summary>
/// Checks SourceLists for a given list and returns it if found. Otherwise, returns null
/// </summary>
@@ -42,6 +50,21 @@ namespace PepperDash.Essentials.Core.Config
return SourceLists[key];
}
/// <summary>
/// Retrieves a DestinationListItem based on the key
/// </summary>
/// <param name="key">key of the item to retrieve</param>
/// <returns>DestinationListItem if the key exists, null otherwise</returns>
public Dictionary<string, DestinationListItem> GetDestinationListForKey(string key)
{
if (string.IsNullOrEmpty(key) || !DestinationLists.ContainsKey(key))
{
return null;
}
return DestinationLists[key];
}
/// <summary>
/// Checks Devices for an item with a Key that matches and returns it if found. Otherwise, retunes null
/// </summary>

View File

@@ -51,6 +51,13 @@ namespace PepperDash.Essentials.Core.Config
[JsonProperty("rooms")]
public List<DeviceConfig> Rooms { get; set; }
public EssentialsConfig()
: base()
{
Rooms = new List<DeviceConfig>();
}
}
/// <summary>

View File

@@ -20,6 +20,10 @@ namespace PepperDash.Essentials.Core.DeviceTypeInterfaces
{
event EventHandler<EventArgs> UserCodeChanged;
event EventHandler<EventArgs> UserPromptedForCode;
event EventHandler<EventArgs> ClientJoined;
string UserCode { get; }
string QrCodeUrl { get; }

View File

@@ -0,0 +1,54 @@
using Newtonsoft.Json;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Core
{
public class DestinationListItem
{
[JsonProperty("sinkKey")]
public string SinkKey { get; set; }
private EssentialsDevice _sinkDevice;
[JsonIgnore]
public EssentialsDevice SinkDevice
{
get { return _sinkDevice ?? (_sinkDevice = DeviceManager.GetDeviceForKey(SinkKey) as EssentialsDevice); }
}
[JsonProperty("preferredName")]
public string PreferredName
{
get
{
if (!string.IsNullOrEmpty(Name))
{
return Name;
}
return SinkDevice == null ? "---" : SinkDevice.Name;
}
}
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("includeInDestinationList")]
public bool IncludeInDestinationList { get; set; }
[JsonProperty("order")]
public int Order { get; set; }
[JsonProperty("surfaceLocation")]
public int SurfaceLocation { get; set; }
[JsonProperty("verticalLocation")]
public int VerticalLocation { get; set; }
[JsonProperty("horizontalLocation")]
public int HorizontalLocation { get; set; }
[JsonProperty("sinkType")]
public eRoutingSignalType SinkType { get; set; }
}
}

View File

@@ -20,8 +20,23 @@ namespace PepperDash.Essentials.Core
/// <param name="json"></param>
public static void DoDeviceActionWithJson(string json)
{
var action = JsonConvert.DeserializeObject<DeviceActionWrapper>(json);
DoDeviceAction(action);
if (String.IsNullOrEmpty(json))
{
CrestronConsole.ConsoleCommandResponse(
"Please provide a JSON object matching the format {\"deviceKey\":\"myDevice\", \"methodName\":\"someMethod\", \"params\": [\"param1\", true]}.\r\nIf the method has no parameters, the \"params\" object may be omitted.");
return;
}
try
{
var action = JsonConvert.DeserializeObject<DeviceActionWrapper>(json);
DoDeviceAction(action);
}
catch (Exception ex)
{
CrestronConsole.ConsoleCommandResponse("Incorrect format for JSON. Please check that the format matches {\"deviceKey\":\"myDevice\", \"methodName\":\"someMethod\", \"params\": [\"param1\", true]}");
}
}
@@ -33,29 +48,47 @@ namespace PepperDash.Essentials.Core
{
var key = action.DeviceKey;
var obj = FindObjectOnPath(key);
if (obj == null)
return;
if (obj == null)
{
CrestronConsole.ConsoleCommandResponse("Unable to find object at path {0}", key);
return;
}
CType t = obj.GetType();
var method = t.GetMethod(action.MethodName);
if (method == null)
{
Debug.Console(0, "Method '{0}' not found", action.MethodName);
return;
}
var mParams = method.GetParameters();
// Add empty params if not provided
if (action.Params == null) action.Params = new object[0];
if (mParams.Length > action.Params.Length)
{
Debug.Console(0, "Method '{0}' requires {1} params", action.MethodName, mParams.Length);
return;
}
object[] convertedParams = mParams
.Select((p, i) => Convert.ChangeType(action.Params[i], p.ParameterType,
System.Globalization.CultureInfo.InvariantCulture))
.ToArray();
object ret = method.Invoke(obj, convertedParams);
if (action.Params == null)
{
//no params, so setting action.Params to empty array
action.Params = new object[0];
}
CType t = obj.GetType();
try
{
var methods = t.GetMethods().Where(m => m.Name == action.MethodName).ToList();
var method = methods.Count == 1 ? methods[0] : methods.FirstOrDefault(m => m.GetParameters().Length == action.Params.Length);
if (method == null)
{
CrestronConsole.ConsoleCommandResponse(
"Unable to find method with name {0} and that matches parameters {1}", action.MethodName,
action.Params);
return;
}
var mParams = method.GetParameters();
var convertedParams = mParams
.Select((p, i) => Convert.ChangeType(action.Params[i], p.ParameterType,
System.Globalization.CultureInfo.InvariantCulture))
.ToArray();
var ret = method.Invoke(obj, convertedParams);
CrestronConsole.ConsoleCommandResponse("Method {0} successfully called on device {1}", method.Name,
action.DeviceKey);
}
catch (Exception ex)
{
CrestronConsole.ConsoleCommandResponse("Unable to call method with name {0}. {1}", action.MethodName,
ex.Message);}
}
/// <summary>

View File

@@ -130,10 +130,24 @@ namespace PepperDash.Essentials.Core
[JsonProperty("sourceListKey")]
public string SourceListKey { get; set; }
/// <summary>
/// Indicates if the device associated with this source is controllable
/// </summary>
[JsonProperty("isControllable")]
public bool IsControllable { get; set; }
/// <summary>
/// Indicates that the device associated with this source has audio available
/// </summary>
[JsonProperty("isAudioSource")]
public bool IsAudioSource { get; set; }
public SourceListItem()
{
Icon = "Blank";
}
}
public class SourceRouteListItem

View File

@@ -189,6 +189,7 @@
<Compile Include="Device Info\IDeviceInfoProvider.cs" />
<Compile Include="Devices\CodecInterfaces.cs" />
<Compile Include="Devices\CrestronProcessor.cs" />
<Compile Include="Devices\DestinationListItem.cs" />
<Compile Include="Devices\DeviceApiBase.cs" />
<Compile Include="Devices\DeviceFeedbackExtensions.cs" />
<Compile Include="Devices\EssentialsBridgeableDevice.cs" />

View File

@@ -400,6 +400,7 @@ namespace PepperDash.Essentials
{
Debug.Console(2, "Load Plugin not found. {0}.{2} is not a plugin factory. Exception: {1}",
loadedAssembly.Name, e.Message, type.Name);
continue;
}
}

View File

@@ -14,7 +14,7 @@ namespace PepperDash.Essentials.Core.Queues
protected readonly CrestronQueue<IQueueMessage> _queue;
protected readonly Thread _worker;
protected readonly CEvent _waitHandle = new CEvent();
private bool _delayEnabled;
private int _delayTime;
@@ -155,10 +155,10 @@ namespace PepperDash.Essentials.Core.Queues
if (programEvent != eProgramStatusEventType.Stopping)
return;
Dispose();
Dispose(true);
};
}
/// <summary>
/// Thread callback
/// </summary>
@@ -180,7 +180,7 @@ namespace PepperDash.Essentials.Core.Queues
{
try
{
Debug.Console(2, this, "Processing queue item: '{0}'", item.ToString());
//Debug.Console(2, this, "Processing queue item: '{0}'", item.ToString());
item.Dispatch();
if (_delayEnabled)
@@ -231,8 +231,13 @@ namespace PepperDash.Essentials.Core.Queues
if (disposing)
{
Enqueue(null);
_worker.Join();
Debug.Console(2, this, "Disposing...");
if (_queue != null && !_queue.Disposed)
{
_queue.Clear();
Enqueue(null);
}
_worker.Abort();
_waitHandle.Close();
}
@@ -241,7 +246,7 @@ namespace PepperDash.Essentials.Core.Queues
~GenericQueue()
{
Dispose(false);
Dispose(true);
}
/// <summary>
@@ -407,7 +412,7 @@ namespace PepperDash_Essentials_Core.Queues
if (programEvent != eProgramStatusEventType.Stopping)
return;
Dispose();
Dispose(true);
};
}
@@ -477,8 +482,13 @@ namespace PepperDash_Essentials_Core.Queues
if (disposing)
{
Enqueue(null);
_worker.Join();
Debug.Console(2, this, "Disposing...");
if (_queue != null && !_queue.Disposed)
{
_queue.Clear();
Enqueue(null);
}
_worker.Abort();
_waitHandle.Close();
}
@@ -487,7 +497,7 @@ namespace PepperDash_Essentials_Core.Queues
~GenericQueue()
{
Dispose(false);
Dispose(true);
}
/// <summary>

View File

@@ -30,6 +30,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
IHasScheduleAwareness, IOccupancyStatusProvider, IHasCodecLayouts, IHasCodecSelfView,
ICommunicationMonitor, IRouting, IHasCodecCameras, IHasCameraAutoMode, IHasCodecRoomPresets, IHasExternalSourceSwitching, IHasBranding, IHasCameraOff, IHasCameraMute
{
private bool _externalSourceChangeRequested;
public event EventHandler<DirectoryEventArgs> DirectoryResultReturned;
private CTimer _brandingTimer;
@@ -490,11 +492,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
Debug.Console(2, this, "Setting QR code URL: {0}", mcBridge.QrCodeUrl);
mcBridge.UserCodeChanged += (o, a) => SendMcBrandingUrl(mcBridge);
mcBridge.UserPromptedForCode += (o, a) => DisplayUserCode(mcBridge.UserCode);
SendMcBrandingUrl(mcBridge);
}
}
/// <summary>
/// Displays the code for the specified duration
/// </summary>
/// <param name="code">Mobile Control user code</param>
private void DisplayUserCode(string code)
{
SendText(string.Format("xcommand userinterface message alert display title:\"Mobile Control User Code:\" text:\"{0}\" duration: 30", code));
}
private void SendMcBrandingUrl(IMobileControlRoomBridge mcBridge)
{
if (mcBridge == null)
@@ -561,6 +573,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
prefix + "/Status/Standby" + Delimiter +
prefix + "/Status/Video/Selfview" + Delimiter +
prefix + "/Status/Video/Layout" + Delimiter +
prefix + "/Status/Video/Input/MainVideoMute" + Delimiter +
prefix + "/Bookings" + Delimiter +
prefix + "/Event/CallDisconnect" + Delimiter +
prefix + "/Event/Bookings" + Delimiter +
@@ -950,10 +963,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
JsonConvert.PopulateObject(response, eventReceived);
Debug.Console(2, this, "*** Got an External Source Selection {0} {1}", eventReceived, eventReceived.Event.UserInterface, eventReceived.Event.UserInterface.Presentation.ExternalSource.Selected.SourceIdentifier.Value);
if (RunRouteAction != null)
if (RunRouteAction != null && !_externalSourceChangeRequested)
{
RunRouteAction(eventReceived.Event.UserInterface.Presentation.ExternalSource.Selected.SourceIdentifier.Value, null);
}
_externalSourceChangeRequested = false;
}
}
else if (response.IndexOf("\"CommandResponse\":{") > -1 || response.IndexOf("\"CommandResponse\": {") > -1)
@@ -1650,12 +1665,21 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
public void CameraAutoModeOn()
{
if (CameraIsOffFeedback.BoolValue)
{
CameraMuteOff();
}
SendText("xCommand Cameras SpeakerTrack Activate");
CameraMuteOff();
}
public void CameraAutoModeOff()
{
if (CameraIsOffFeedback.BoolValue)
{
CameraMuteOff();
}
SendText("xCommand Cameras SpeakerTrack Deactivate");
}
@@ -1974,6 +1998,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
public void SetSelectedSource(string key)
{
SendText(string.Format("xCommand UserInterface Presentation ExternalSource Select SourceIdentifier: {0}", key));
_externalSourceChangeRequested = true;
}
/// <summary>
@@ -2011,7 +2036,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
/// </summary>
public void CameraMuteOn()
{
SendText("xCommand Video InputMainVideo Mute");
SendText("xCommand Video Input MainVideo Mute");
}
/// <summary>
@@ -2019,7 +2044,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
/// </summary>
public void CameraMuteOff()
{
SendText("xCommand Video InputMainVideo Unmute");
SendText("xCommand Video Input MainVideo Unmute");
}
/// <summary>