Merge remote-tracking branch 'origin/feature/ecs-407' into feature/cisco-spark

This commit is contained in:
Neil Dorin
2017-09-15 11:30:04 -06:00
12 changed files with 454 additions and 396 deletions

View File

@@ -1,61 +1,61 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Crestron.SimplSharpPro; using Crestron.SimplSharpPro;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Routing; using PepperDash.Essentials.Core.Routing;
using PepperDash.Core; using PepperDash.Core;
namespace PepperDash.Essentials.Devices.Common namespace PepperDash.Essentials.Devices.Common
{ {
/// <summary> /// <summary>
/// This DVD class should cover most IR, one-way DVD and Bluray fuctions /// This DVD class should cover most IR, one-way DVD and Bluray fuctions
/// </summary> /// </summary>
public class InRoomPc : Device, IHasFeedback, IRoutingOutputs, IAttachVideoStatus, IUiDisplayInfo, IUsageTracking public class InRoomPc : Device, IHasFeedback, IRoutingOutputs, IAttachVideoStatus, IUiDisplayInfo, IUsageTracking
{ {
public uint DisplayUiType { get { return DisplayUiConstants.TypeLaptop; } } public uint DisplayUiType { get { return DisplayUiConstants.TypeLaptop; } }
public string IconName { get; set; } public string IconName { get; set; }
public BoolFeedback HasPowerOnFeedback { get; private set; } public BoolFeedback HasPowerOnFeedback { get; private set; }
public RoutingOutputPort AnyVideoOut { get; private set; } public RoutingOutputPort AnyVideoOut { get; private set; }
#region IRoutingOutputs Members #region IRoutingOutputs Members
/// <summary> /// <summary>
/// Options: hdmi /// Options: hdmi
/// </summary> /// </summary>
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; } public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
#endregion #endregion
public InRoomPc(string key, string name) public InRoomPc(string key, string name)
: base(key, name) : base(key, name)
{ {
IconName = "PC"; IconName = "PC";
HasPowerOnFeedback = new BoolFeedback(CommonBoolCue.HasPowerFeedback, HasPowerOnFeedback = new BoolFeedback(CommonBoolCue.HasPowerFeedback,
() => this.GetVideoStatuses() != VideoStatusOutputs.NoStatus); () => this.GetVideoStatuses() != VideoStatusOutputs.NoStatus);
OutputPorts = new RoutingPortCollection<RoutingOutputPort>(); OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
OutputPorts.Add(AnyVideoOut = new RoutingOutputPort(RoutingPortNames.AnyVideoOut, eRoutingSignalType.AudioVideo, OutputPorts.Add(AnyVideoOut = new RoutingOutputPort(RoutingPortNames.AnyVideoOut, eRoutingSignalType.AudioVideo,
eRoutingPortConnectionType.None, 0, this)); eRoutingPortConnectionType.None, 0, this));
} }
#region IHasFeedback Members #region IHasFeedback Members
/// <summary> /// <summary>
/// Passes through the VideoStatuses list /// Passes through the VideoStatuses list
/// </summary> /// </summary>
public List<Feedback> Feedbacks public List<Feedback> Feedbacks
{ {
get { return this.GetVideoStatuses().ToList(); } get { return this.GetVideoStatuses().ToList(); }
} }
#endregion #endregion
#region IUsageTracking Members #region IUsageTracking Members
public UsageTracking UsageTracker { get; set; } public UsageTracking UsageTracker { get; set; }
#endregion #endregion
} }
} }

View File

@@ -63,6 +63,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
} }
} }
protected override Func<bool> MuteFeedbackFunc
{
get { return () => false; }
}
//private HttpsClient Client; //private HttpsClient Client;
//private HttpApiServer Server; //private HttpApiServer Server;
@@ -703,6 +708,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco
{ {
SendText("xCommand SystemUnit Boot Action: Restart"); SendText("xCommand SystemUnit Boot Action: Restart");
} }
public override void MuteOff()
{
}
public override void MuteOn()
{
}
public override void SetVolume(ushort level)
{
}
public override void MuteToggle()
{
}
} }
/// <summary> /// <summary>

View File

@@ -14,7 +14,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
public MockVC(string key, string name) public MockVC(string key, string name)
: base(key, name) : base(key, name)
{ {
MuteFeedback.OutputChange += (o, a) => Debug.Console(1, this, "Mute={0}", _IsMuted);
VolumeLevelFeedback.OutputChange += (o, a) => Debug.Console(1, this, "Volume={0}", _VolumeLevel);
InCallFeedback.OutputChange += (o, a) => Debug.Console(1, this, "InCall={0}", _InCall);
IncomingCallFeedback.OutputChange += (o, a) => Debug.Console(1, this, "IncomingCall={0}", _IncomingCall);
TransmitLevelFeedback.OutputChange += (o,a)=> Debug.Console(1, this, "TransmitLevel={0}", _tra
} }
protected override Func<bool> InCallFeedbackFunc protected override Func<bool> InCallFeedbackFunc
@@ -29,6 +33,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
} }
bool _IncomingCall; bool _IncomingCall;
protected override Func<bool> TransmitMuteFeedbackFunc protected override Func<bool> TransmitMuteFeedbackFunc
{ {
get { return () => _TransmitMute; } get { return () => _TransmitMute; }
@@ -49,8 +55,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
protected override Func<int> VolumeLevelFeedbackFunc protected override Func<int> VolumeLevelFeedbackFunc
{ {
get { throw new NotImplementedException(); } get { return () => _VolumeLevel; }
} }
int _VolumeLevel;
protected override Func<bool> MuteFeedbackFunc
{
get { return () => _IsMuted; }
}
bool _IsMuted;
/// <summary> /// <summary>
/// Dials, yo! /// Dials, yo!
@@ -118,6 +131,31 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
} }
public override void MuteOff()
{
_IsMuted = false;
MuteFeedback.FireUpdate();
}
public override void MuteOn()
{
_IsMuted = true;
MuteFeedback.FireUpdate();
}
public override void MuteToggle()
{
_IsMuted = !_IsMuted;
MuteFeedback.FireUpdate();
}
public override void SetVolume(ushort level)
{
_VolumeLevel = level;
VolumeLevelFeedback.FireUpdate();
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
@@ -241,5 +279,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
Debug.Console(1, this, "TestFarEndHangup"); Debug.Console(1, this, "TestFarEndHangup");
} }
} }
} }

View File

@@ -32,7 +32,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
abstract protected Func<bool> ReceiveMuteFeedbackFunc { get; } abstract protected Func<bool> ReceiveMuteFeedbackFunc { get; }
abstract protected Func<bool> PrivacyModeFeedbackFunc { get; } abstract protected Func<bool> PrivacyModeFeedbackFunc { get; }
#warning WILL ADD TRANSMIT AND REVEICE LEVEL FUNCS AFTER MERGE
abstract protected Func<int> VolumeLevelFeedbackFunc { get; } abstract protected Func<int> VolumeLevelFeedbackFunc { get; }
abstract protected Func<bool> MuteFeedbackFunc { get; }
public VideoCodecBase(string key, string name) public VideoCodecBase(string key, string name)
: base(key, name) : base(key, name)
@@ -42,8 +44,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
ReceiveMuteIsOnFeedback = new BoolFeedback(ReceiveMuteFeedbackFunc); ReceiveMuteIsOnFeedback = new BoolFeedback(ReceiveMuteFeedbackFunc);
TransmitMuteIsOnFeedback = new BoolFeedback(TransmitMuteFeedbackFunc); TransmitMuteIsOnFeedback = new BoolFeedback(TransmitMuteFeedbackFunc);
PrivacyModeIsOnFeedback = new BoolFeedback(PrivacyModeFeedbackFunc); PrivacyModeIsOnFeedback = new BoolFeedback(PrivacyModeFeedbackFunc);
#warning ADDING TX/RX FEEDBACKS HERE
VolumeLevelFeedback = new IntFeedback(VolumeLevelFeedbackFunc); VolumeLevelFeedback = new IntFeedback(VolumeLevelFeedbackFunc);
MuteFeedback = new BoolFeedback(MuteFeedbackFunc);
InputPorts = new RoutingPortCollection<RoutingInputPort>(); InputPorts = new RoutingPortCollection<RoutingInputPort>();

View File

@@ -128,12 +128,12 @@ namespace PepperDash.Essentials
} }
// CODEC TESTING // CODEC TESTING
GenericSshClient TestCodecClient = new GenericSshClient("TestCodec-1--SshClient", "10.11.50.135", 22, "crestron", "2H3Zu&OvgXp6"); //GenericSshClient TestCodecClient = new GenericSshClient("TestCodec-1--SshClient", "10.11.50.135", 22, "crestron", "2H3Zu&OvgXp6");
PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec TestCodec = //PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec TestCodec =
new PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec("TestCodec-1", "Cisco Spark Room Kit", TestCodecClient, 8080); // new PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec("TestCodec-1", "Cisco Spark Room Kit", TestCodecClient, 8080);
TestCodec.CustomActivate(); //TestCodec.CustomActivate();
// CODEC TESTING // CODEC TESTING
} }

View File

@@ -63,7 +63,7 @@ namespace PepperDash.Essentials.Room.Config
var codec = DeviceManager.GetDeviceForKey(props.VideoCodecKey) as var codec = DeviceManager.GetDeviceForKey(props.VideoCodecKey) as
PepperDash.Essentials.Devices.Common.VideoCodec.VideoCodecBase; PepperDash.Essentials.Devices.Common.VideoCodec.VideoCodecBase;
var rm = new EssentialsHuddleVtc1Room(Key, Name, disp, disp, codec, props); var rm = new EssentialsHuddleVtc1Room(Key, Name, disp, codec, codec, props);
rm.LogoUrl = props.Logo.GetUrl(); rm.LogoUrl = props.Logo.GetUrl();
rm.SourceListKey = props.SourceListKey; rm.SourceListKey = props.SourceListKey;
rm.DefaultSourceItem = props.DefaultSourceItem; rm.DefaultSourceItem = props.DefaultSourceItem;

View File

@@ -235,97 +235,64 @@ namespace PepperDash.Essentials
public void RunRouteAction(string routeKey, Action successCallback) public void RunRouteAction(string routeKey, Action successCallback)
{ {
// Run this on a separate thread // Run this on a separate thread
new CTimer(o => new CTimer(o =>
{ {
Debug.Console(1, this, "Run route action '{0}'", routeKey); try
var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey); {
if(dict == null)
{
Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey);
return;
}
// Try to get the list item by it's string key Debug.Console(1, this, "Run route action '{0}'", routeKey);
if (!dict.ContainsKey(routeKey)) var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey);
{ if (dict == null)
Debug.Console(1, this, "WARNING: No item '{0}' found on config list '{1}'", {
routeKey, SourceListKey); Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey);
return; return;
} }
var item = dict[routeKey]; // Try to get the list item by it's string key
if (!dict.ContainsKey(routeKey))
{
Debug.Console(1, this, "WARNING: No item '{0}' found on config list '{1}'",
routeKey, SourceListKey);
return;
}
// End usage timer on last source // End usage timer on last source
if (!string.IsNullOrEmpty(LastSourceKey)) if (!string.IsNullOrEmpty(LastSourceKey))
{ {
var lastSource = dict[LastSourceKey].SourceDevice; var usageLastSource = dict[LastSourceKey].SourceDevice as IUsageTracking;
if (usageLastSource != null && usageLastSource.UsageTracker != null)
try
{ {
if (lastSource != null && lastSource is IUsageTracking) try
(lastSource as IUsageTracking).UsageTracker.EndDeviceUsage(); {
} // There MAY have been failures in here. Protect
catch (Exception e) usageLastSource.UsageTracker.EndDeviceUsage();
{ }
Debug.Console(1, this, "*#* EXCEPTION in end usage tracking (257):\r{0}", e); catch (Exception e)
{
Debug.Console(1, this, "*#* EXCEPTION in end usage tracking:\r{0}", e);
}
} }
} }
// Let's run it // Let's run it
var item = dict[routeKey];
if (routeKey.ToLower() != "roomoff") if (routeKey.ToLower() != "roomoff")
{
LastSourceKey = routeKey; LastSourceKey = routeKey;
}
else else
{
CurrentSourceInfoKey = null; CurrentSourceInfoKey = null;
}
foreach (var route in item.RouteList) // hand off the individual routes to this helper
{ foreach (var route in item.RouteList)
// if there is a $defaultAll on route, run two separate DoRouteItem(route);
if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase))
{
// Going to assume a single-path route for now
var tempVideo = new SourceRouteListItem
{
DestinationKey = "$defaultDisplay",
SourceKey = route.SourceKey,
Type = eRoutingSignalType.Video
};
DoRoute(tempVideo);
}
else
DoRoute(route);
}
// Start usage timer on routed source // Start usage timer on routed source
if (item.SourceDevice is IUsageTracking) var usageNewSource = item.SourceDevice as IUsageTracking;
if (usageNewSource != null && usageNewSource.UsageTracker != null) // Have to make sure there is a usage tracker!
{ {
(item.SourceDevice as IUsageTracking).UsageTracker.StartDeviceUsage(); (item.SourceDevice as IUsageTracking).UsageTracker.StartDeviceUsage();
} }
// store the name and UI info for routes
// Set volume control on room, using default if non provided
IBasicVolumeControls volDev = null;
// Handle special cases for volume control
if (string.IsNullOrEmpty(item.VolumeControlKey)
|| item.VolumeControlKey.Equals("$defaultAudio", StringComparison.OrdinalIgnoreCase))
volDev = DefaultVolumeControls;
else if (item.VolumeControlKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
volDev = DefaultDisplay as IBasicVolumeControls;
// Or a specific device, probably rarely used.
else
{
var dev = DeviceManager.GetDeviceForKey(item.VolumeControlKey);
if (dev is IBasicVolumeControls)
volDev = dev as IBasicVolumeControls;
else if (dev is IHasVolumeDevice)
volDev = (dev as IHasVolumeDevice).VolumeDevice;
}
CurrentVolumeControls = volDev;
// store the name and UI info for routes
if (item.SourceKey == "$off") if (item.SourceKey == "$off")
{ {
CurrentSourceInfoKey = routeKey; CurrentSourceInfoKey = routeKey;
@@ -337,24 +304,41 @@ namespace PepperDash.Essentials
CurrentSourceInfo = item; CurrentSourceInfo = item;
} }
OnFeedback.FireUpdate(); OnFeedback.FireUpdate();
// report back when done // report back when done
if (successCallback != null) if (successCallback != null)
successCallback(); successCallback();
}
catch (Exception e)
{
Debug.Console(1, this, "ERROR in routing: {0}", e);
}
}, 0); // end of CTimer }, 0); // end of CTimer
} }
/// <summary> /// <summary>
/// Will power the room on with the last-used source ///
/// </summary> /// </summary>
public void PowerOnToDefaultOrLastSource() /// <param name="route"></param>
{ void DoRouteItem(SourceRouteListItem route)
if (!EnablePowerOnToLastSource || LastSourceKey == null) {
return; // if there is a $defaultAll on route, run two separate
RunRouteAction(LastSourceKey); if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase))
} {
// Going to assume a single-path route for now
var tempVideo = new SourceRouteListItem
{
DestinationKey = "$defaultDisplay",
SourceKey = route.SourceKey,
Type = eRoutingSignalType.Video
};
DoRoute(tempVideo);
}
else
DoRoute(route);
}
/// <summary> /// <summary>
/// ///
@@ -397,6 +381,16 @@ namespace PepperDash.Essentials
return true; return true;
} }
/// <summary>
/// Will power the room on with the last-used source
/// </summary>
public void PowerOnToDefaultOrLastSource()
{
if (!EnablePowerOnToLastSource || LastSourceKey == null)
return;
RunRouteAction(LastSourceKey);
}
/// <summary> /// <summary>
/// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions /// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions
/// </summary> /// </summary>

View File

@@ -7,7 +7,7 @@
{ {
// Video Codec // Video Codec
/// <summary> /// <summary>
/// 1234 - 0 = Connect, 1 = End /// 1234: values 0 = Connect, 1 = End
/// </summary> /// </summary>
public const uint VCStagingConnectButtonMode = 1234; public const uint VCStagingConnectButtonMode = 1234;

View File

@@ -388,7 +388,7 @@ namespace PepperDash.Essentials
b => { if (!b) ActivityShareButtonPressed(); })); b => { if (!b) ActivityShareButtonPressed(); }));
ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(3, ActivityFooterSrl, ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(3, ActivityFooterSrl,
3, b => { if (!b) PowerButtonPressed(); })); 3, b => { if (!b) PowerButtonPressed(); }));
ActivityFooterSrl.Count = 2; ActivityFooterSrl.Count = 3;
TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 1; TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 1;
EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(3, 1); EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(3, 1);
@@ -757,7 +757,11 @@ namespace PepperDash.Essentials
} }
} }
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void IsCoolingDownFeedback_OutputChange(object sender, EventArgs e) void IsCoolingDownFeedback_OutputChange(object sender, EventArgs e)
{ {
var value = CurrentRoom.IsCoolingDownFeedback.BoolValue; var value = CurrentRoom.IsCoolingDownFeedback.BoolValue;

View File

@@ -1,250 +1,246 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Crestron.SimplSharp; using Crestron.SimplSharp;
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials; using PepperDash.Essentials;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.SmartObjects; using PepperDash.Essentials.Core.SmartObjects;
using PepperDash.Essentials.Devices.Common.VideoCodec; using PepperDash.Essentials.Devices.Common.VideoCodec;
namespace PepperDash.Essentials.UIDrivers.VC namespace PepperDash.Essentials.UIDrivers.VC
{ {
/// <summary> /// <summary>
/// This fella will likely need to interact with the room's source, although that is routed via the spark... /// This fella will likely need to interact with the room's source, although that is routed via the spark...
/// Probably needs event or FB to feed AV driver - to show two-mute volume when appropriate. /// Probably needs event or FB to feed AV driver - to show two-mute volume when appropriate.
/// ///
/// </summary> /// </summary>
public class EssentialsVideoCodecUiDriver : PanelDriverBase public class EssentialsVideoCodecUiDriver : PanelDriverBase
{ {
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
VideoCodecBase Codec; VideoCodecBase Codec;
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
SmartObjectDynamicList DirectorySrl; // ***************** SRL ??? SmartObjectDynamicList DirectorySrl; // ***************** SRL ???
/// <summary> /// <summary>
/// To drive UI elements outside of this driver that may be dependent on this. /// To drive UI elements outside of this driver that may be dependent on this.
/// </summary> /// </summary>
BoolFeedback InCall; BoolFeedback InCall;
BoolFeedback LocalPrivacyIsMuted; BoolFeedback LocalPrivacyIsMuted;
/// <summary> /// <summary>
/// For the subpages above the bar /// For the subpages above the bar
/// </summary> /// </summary>
JoinedSigInterlock VCControlsInterlock; JoinedSigInterlock VCControlsInterlock;
/// <summary> /// <summary>
/// For the different staging bars: Active, inactive /// For the different staging bars: Active, inactive
/// </summary> /// </summary>
JoinedSigInterlock StagingBarInterlock; JoinedSigInterlock StagingBarInterlock;
/// <summary> /// <summary>
/// For the staging button feedbacks /// For the staging button feedbacks
/// </summary> /// </summary>
JoinedSigInterlock StagingButtonFeedbackInterlock; JoinedSigInterlock StagingButtonFeedbackInterlock;
SmartObjectNumeric DialKeypad; SmartObjectNumeric DialKeypad;
// These are likely temp until we get a keyboard built // These are likely temp until we get a keyboard built
StringFeedback DialStringFeedback; StringFeedback DialStringFeedback;
StringBuilder DialStringBuilder = new StringBuilder(); StringBuilder DialStringBuilder = new StringBuilder();
BoolFeedback DialStringBackspaceVisibleFeedback; BoolFeedback DialStringBackspaceVisibleFeedback;
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
/// <param name="triList"></param> /// <param name="triList"></param>
/// <param name="codec"></param> /// <param name="codec"></param>
public EssentialsVideoCodecUiDriver(BasicTriListWithSmartObject triList, VideoCodecBase codec) public EssentialsVideoCodecUiDriver(BasicTriListWithSmartObject triList, VideoCodecBase codec)
: base(triList) : base(triList)
{ {
Codec = codec; Codec = codec;
SetupCallStagingPopover(); SetupCallStagingPopover();
SetupDialKeypad(); SetupDialKeypad();
InCall = new BoolFeedback(() => false); InCall = new BoolFeedback(() => false);
LocalPrivacyIsMuted = new BoolFeedback(() => false); LocalPrivacyIsMuted = new BoolFeedback(() => false);
//DirectorySrl = new SubpageReferenceList(triList, UISmartObjectJoin.VCDirectoryList, 3, 3, 3); //DirectorySrl = new SubpageReferenceList(triList, UISmartObjectJoin.VCDirectoryList, 3, 3, 3);
VCControlsInterlock = new JoinedSigInterlock(triList); VCControlsInterlock = new JoinedSigInterlock(triList);
VCControlsInterlock.SetButDontShow(UIBoolJoin.VCDirectoryVisible); VCControlsInterlock.SetButDontShow(UIBoolJoin.VCDirectoryVisible);
StagingBarInterlock = new JoinedSigInterlock(triList); StagingBarInterlock = new JoinedSigInterlock(triList);
StagingBarInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible); StagingBarInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible);
StagingButtonFeedbackInterlock = new JoinedSigInterlock(triList); StagingButtonFeedbackInterlock = new JoinedSigInterlock(triList);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible); StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible);
DialStringFeedback = new StringFeedback(() => DialStringBuilder.ToString()); DialStringFeedback = new StringFeedback(() => DialStringBuilder.ToString());
DialStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.KeyboardText]); DialStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.KeyboardText]);
DialStringBackspaceVisibleFeedback = new BoolFeedback(() => DialStringBuilder.Length > 0); DialStringBackspaceVisibleFeedback = new BoolFeedback(() => DialStringBuilder.Length > 0);
DialStringBackspaceVisibleFeedback DialStringBackspaceVisibleFeedback
.LinkInputSig(TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible]); .LinkInputSig(TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible]);
Codec.InCallFeedback.OutputChange += new EventHandler<EventArgs>(InCallFeedback_OutputChange); Codec.InCallFeedback.OutputChange += new EventHandler<EventArgs>(InCallFeedback_OutputChange);
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public override void Show() public override void Show()
{ {
VCControlsInterlock.Show(); VCControlsInterlock.Show();
StagingBarInterlock.Show(); StagingBarInterlock.Show();
base.Show(); base.Show();
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public override void Hide() public override void Hide()
{ {
VCControlsInterlock.Hide(); VCControlsInterlock.Hide();
StagingBarInterlock.Hide(); StagingBarInterlock.Hide();
base.Hide(); base.Hide();
} }
/// <summary> /// <summary>
/// Builds the call stage /// Builds the call stage
/// </summary> /// </summary>
void SetupCallStagingPopover() void SetupCallStagingPopover()
{ {
TriList.SetSigFalseAction(UIBoolJoin.VCStagingDirectoryPress, ShowDirectory); TriList.SetSigFalseAction(UIBoolJoin.VCStagingDirectoryPress, ShowDirectory);
TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress); TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress);
TriList.SetSigFalseAction(UIBoolJoin.VCStagingKeypadPress, ShowKeypad); TriList.SetSigFalseAction(UIBoolJoin.VCStagingKeypadPress, ShowKeypad);
TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents); TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents);
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
void SetupDialKeypad() void SetupDialKeypad()
{ {
if(TriList.SmartObjects.Contains(UISmartObjectJoin.VCDialKeypad)) if(TriList.SmartObjects.Contains(UISmartObjectJoin.VCDialKeypad))
{ {
DialKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.VCDialKeypad], true); DialKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.VCDialKeypad], true);
DialKeypad.Digit0.SetSigFalseAction(() => DialKeypadPress("0")); DialKeypad.Digit0.SetSigFalseAction(() => DialKeypadPress("0"));
DialKeypad.Digit1.SetSigFalseAction(() => DialKeypadPress("1")); DialKeypad.Digit1.SetSigFalseAction(() => DialKeypadPress("1"));
DialKeypad.Digit2.SetSigFalseAction(() => DialKeypadPress("2")); DialKeypad.Digit2.SetSigFalseAction(() => DialKeypadPress("2"));
DialKeypad.Digit3.SetSigFalseAction(() => DialKeypadPress("3")); DialKeypad.Digit3.SetSigFalseAction(() => DialKeypadPress("3"));
DialKeypad.Digit4.SetSigFalseAction(() => DialKeypadPress("4")); DialKeypad.Digit4.SetSigFalseAction(() => DialKeypadPress("4"));
DialKeypad.Digit5.SetSigFalseAction(() => DialKeypadPress("5")); DialKeypad.Digit5.SetSigFalseAction(() => DialKeypadPress("5"));
DialKeypad.Digit6.SetSigFalseAction(() => DialKeypadPress("6")); DialKeypad.Digit6.SetSigFalseAction(() => DialKeypadPress("6"));
DialKeypad.Digit7.SetSigFalseAction(() => DialKeypadPress("7")); DialKeypad.Digit7.SetSigFalseAction(() => DialKeypadPress("7"));
DialKeypad.Digit8.SetSigFalseAction(() => DialKeypadPress("8")); DialKeypad.Digit8.SetSigFalseAction(() => DialKeypadPress("8"));
DialKeypad.Digit9.SetSigFalseAction(() => DialKeypadPress("9")); DialKeypad.Digit9.SetSigFalseAction(() => DialKeypadPress("9"));
DialKeypad.Misc1SigName = "*"; DialKeypad.Misc1SigName = "*";
DialKeypad.Misc1.SetSigFalseAction(() => DialKeypadPress("*")); DialKeypad.Misc1.SetSigFalseAction(() => DialKeypadPress("*"));
DialKeypad.Misc2SigName = "#"; DialKeypad.Misc2SigName = "#";
DialKeypad.Misc2.SetSigFalseAction(() => DialKeypadPress("#")); DialKeypad.Misc2.SetSigFalseAction(() => DialKeypadPress("#"));
TriList.SetSigFalseAction(UIBoolJoin.KeyboardClearPress, DialKeypadBackspacePress); TriList.SetSigFalseAction(UIBoolJoin.KeyboardClearPress, DialKeypadBackspacePress);
} }
else else
Debug.Console(0, "Trilist {0:x2}, VC dial keypad object {1} not found. Check SGD file or VTP", Debug.Console(0, "Trilist {0:x2}, VC dial keypad object {1} not found. Check SGD file or VTP",
TriList.ID, UISmartObjectJoin.VCDialKeypad); TriList.ID, UISmartObjectJoin.VCDialKeypad);
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
void ShowCameraControls() void ShowCameraControls()
{ {
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCCameraVisible); VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCCameraVisible);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress); StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress);
} }
void ShowKeypad() void ShowKeypad()
{ {
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible); VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress); StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress);
} }
void ShowDirectory() void ShowDirectory()
{ {
// populate directory // populate directory
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible); VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress); StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress);
} }
void ShowRecents() void ShowRecents()
{ {
//populate recents //populate recents
VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible); VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible);
StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress); StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress);
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
void ConnectPress() void ConnectPress()
{ {
if (Codec.InCallFeedback.BoolValue) if (Codec.InCallFeedback.BoolValue)
Codec.EndCall(); Codec.EndCall();
else else
Codec.Dial(DialStringBuilder.ToString()); Codec.Dial(DialStringBuilder.ToString());
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
void InCallFeedback_OutputChange(object sender, EventArgs e)
void InCallFeedback_OutputChange(object sender, EventArgs e) {
{ var inCall = Codec.InCallFeedback.BoolValue;
#warning mode does not change! Debug.Console(1, "*#* Codec Driver InCallFeedback change={0}", InCall);
var inCall = Codec.InCallFeedback.BoolValue; TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(inCall ? 1 : 0);
Debug.Console(2, "*#* Codec Driver InCallFeedback change={0}", InCall); StagingBarInterlock.ShowInterlocked(
TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(inCall ? 1 : 0); inCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible);
StagingBarInterlock.ShowInterlocked(
inCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible); if (Codec.InCallFeedback.BoolValue) // Call is starting
{
if (Codec.InCallFeedback.BoolValue) // Call is starting // Header icon
{ // Volume bar needs to have mic mute
// Header icon }
// Add end call button to stage else // ending
// Volume bar needs to have mic mute {
} // Header icon
else // ending // Volume bar no mic mute (or hidden if no source?)
{ }
// Header icon }
// Remove end call
// Volume bar no mic mute (or hidden if no source?) /// <summary>
} ///
} /// </summary>
/// <param name="i"></param>
/// <summary> void DialKeypadPress(string i)
/// {
/// </summary> DialStringBuilder.Append(i);
/// <param name="i"></param> DialStringFeedback.FireUpdate();
void DialKeypadPress(string i) TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue =
{ DialStringBuilder.Length > 0;
DialStringBuilder.Append(i); }
DialStringFeedback.FireUpdate();
TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue = /// <summary>
DialStringBuilder.Length > 0; ///
} /// </summary>
void DialKeypadBackspacePress()
/// <summary> {
/// DialStringBuilder.Remove(DialStringBuilder.Length - 1, 1);
/// </summary> DialStringFeedback.FireUpdate();
void DialKeypadBackspacePress() TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue =
{ DialStringBuilder.Length > 0;
DialStringBuilder.Remove(DialStringBuilder.Length - 1, 1); TriList.SetBool(UIBoolJoin.VCStagingConnectEnable, DialStringBuilder.Length > 0);
DialStringFeedback.FireUpdate(); }
TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue = }
DialStringBuilder.Length > 0;
TriList.SetBool(UIBoolJoin.VCStagingConnectEnable, DialStringBuilder.Length > 0);
}
}
} }