diff --git a/Essentials Devices Common/Essentials Devices Common/PC/InRoomPc.cs b/Essentials Devices Common/Essentials Devices Common/PC/InRoomPc.cs index cc8c5121..70c49366 100644 --- a/Essentials Devices Common/Essentials Devices Common/PC/InRoomPc.cs +++ b/Essentials Devices Common/Essentials Devices Common/PC/InRoomPc.cs @@ -1,61 +1,61 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Crestron.SimplSharpPro; - -using PepperDash.Essentials.Core; -using PepperDash.Essentials.Core.Routing; -using PepperDash.Core; - -namespace PepperDash.Essentials.Devices.Common -{ - /// - /// This DVD class should cover most IR, one-way DVD and Bluray fuctions - /// - public class InRoomPc : Device, IHasFeedback, IRoutingOutputs, IAttachVideoStatus, IUiDisplayInfo, IUsageTracking - { - public uint DisplayUiType { get { return DisplayUiConstants.TypeLaptop; } } - public string IconName { get; set; } - public BoolFeedback HasPowerOnFeedback { get; private set; } - - public RoutingOutputPort AnyVideoOut { get; private set; } - - #region IRoutingOutputs Members - - /// - /// Options: hdmi - /// - public RoutingPortCollection OutputPorts { get; private set; } - - #endregion - - public InRoomPc(string key, string name) - : base(key, name) - { - IconName = "PC"; - HasPowerOnFeedback = new BoolFeedback(CommonBoolCue.HasPowerFeedback, - () => this.GetVideoStatuses() != VideoStatusOutputs.NoStatus); - OutputPorts = new RoutingPortCollection(); - OutputPorts.Add(AnyVideoOut = new RoutingOutputPort(RoutingPortNames.AnyVideoOut, eRoutingSignalType.AudioVideo, - eRoutingPortConnectionType.None, 0, this)); - } - - #region IHasFeedback Members - - /// - /// Passes through the VideoStatuses list - /// - public List Feedbacks - { - get { return this.GetVideoStatuses().ToList(); } - } - +using System; +using System.Collections.Generic; +using System.Linq; +using Crestron.SimplSharpPro; + +using PepperDash.Essentials.Core; +using PepperDash.Essentials.Core.Routing; +using PepperDash.Core; + +namespace PepperDash.Essentials.Devices.Common +{ + /// + /// This DVD class should cover most IR, one-way DVD and Bluray fuctions + /// + public class InRoomPc : Device, IHasFeedback, IRoutingOutputs, IAttachVideoStatus, IUiDisplayInfo, IUsageTracking + { + public uint DisplayUiType { get { return DisplayUiConstants.TypeLaptop; } } + public string IconName { get; set; } + public BoolFeedback HasPowerOnFeedback { get; private set; } + + public RoutingOutputPort AnyVideoOut { get; private set; } + + #region IRoutingOutputs Members + + /// + /// Options: hdmi + /// + public RoutingPortCollection OutputPorts { get; private set; } + + #endregion + + public InRoomPc(string key, string name) + : base(key, name) + { + IconName = "PC"; + HasPowerOnFeedback = new BoolFeedback(CommonBoolCue.HasPowerFeedback, + () => this.GetVideoStatuses() != VideoStatusOutputs.NoStatus); + OutputPorts = new RoutingPortCollection(); + OutputPorts.Add(AnyVideoOut = new RoutingOutputPort(RoutingPortNames.AnyVideoOut, eRoutingSignalType.AudioVideo, + eRoutingPortConnectionType.None, 0, this)); + } + + #region IHasFeedback Members + + /// + /// Passes through the VideoStatuses list + /// + public List Feedbacks + { + get { return this.GetVideoStatuses().ToList(); } + } + #endregion #region IUsageTracking Members public UsageTracking UsageTracker { get; set; } - #endregion - } + #endregion + } } \ No newline at end of file diff --git a/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs b/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs index 93ee8753..f166f89f 100644 --- a/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs +++ b/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs @@ -63,6 +63,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco } } + protected override Func MuteFeedbackFunc + { + get { return () => false; } + } + //private HttpsClient Client; //private HttpApiServer Server; @@ -703,6 +708,22 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco { SendText("xCommand SystemUnit Boot Action: Restart"); } + + public override void MuteOff() + { + } + + public override void MuteOn() + { + } + + public override void SetVolume(ushort level) + { + } + + public override void MuteToggle() + { + } } /// diff --git a/Essentials Devices Common/Essentials Devices Common/VC/MockVC/MockVC.cs b/Essentials Devices Common/Essentials Devices Common/VC/MockVC/MockVC.cs index a6033b0d..1a837900 100644 --- a/Essentials Devices Common/Essentials Devices Common/VC/MockVC/MockVC.cs +++ b/Essentials Devices Common/Essentials Devices Common/VC/MockVC/MockVC.cs @@ -14,7 +14,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec public MockVC(string key, string 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 InCallFeedbackFunc @@ -29,6 +33,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec } bool _IncomingCall; + + protected override Func TransmitMuteFeedbackFunc { get { return () => _TransmitMute; } @@ -49,8 +55,15 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec protected override Func VolumeLevelFeedbackFunc { - get { throw new NotImplementedException(); } + get { return () => _VolumeLevel; } } + int _VolumeLevel; + + protected override Func MuteFeedbackFunc + { + get { return () => _IsMuted; } + } + bool _IsMuted; /// /// 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(); + } + + /// /// /// @@ -241,5 +279,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec Debug.Console(1, this, "TestFarEndHangup"); } + } } \ No newline at end of file diff --git a/Essentials Devices Common/Essentials Devices Common/VC/VideoCodecBase.cs b/Essentials Devices Common/Essentials Devices Common/VC/VideoCodecBase.cs index 8c58105e..59aef5ab 100644 --- a/Essentials Devices Common/Essentials Devices Common/VC/VideoCodecBase.cs +++ b/Essentials Devices Common/Essentials Devices Common/VC/VideoCodecBase.cs @@ -32,7 +32,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec abstract protected Func ReceiveMuteFeedbackFunc { get; } abstract protected Func PrivacyModeFeedbackFunc { get; } +#warning WILL ADD TRANSMIT AND REVEICE LEVEL FUNCS AFTER MERGE abstract protected Func VolumeLevelFeedbackFunc { get; } + abstract protected Func MuteFeedbackFunc { get; } public VideoCodecBase(string key, string name) : base(key, name) @@ -42,8 +44,10 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec ReceiveMuteIsOnFeedback = new BoolFeedback(ReceiveMuteFeedbackFunc); TransmitMuteIsOnFeedback = new BoolFeedback(TransmitMuteFeedbackFunc); PrivacyModeIsOnFeedback = new BoolFeedback(PrivacyModeFeedbackFunc); +#warning ADDING TX/RX FEEDBACKS HERE VolumeLevelFeedback = new IntFeedback(VolumeLevelFeedbackFunc); + MuteFeedback = new BoolFeedback(MuteFeedbackFunc); InputPorts = new RoutingPortCollection(); diff --git a/Essentials/PepperDashEssentials/ControlSystem.cs b/Essentials/PepperDashEssentials/ControlSystem.cs index f33d6198..20288baf 100644 --- a/Essentials/PepperDashEssentials/ControlSystem.cs +++ b/Essentials/PepperDashEssentials/ControlSystem.cs @@ -128,12 +128,12 @@ namespace PepperDash.Essentials } // 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 = - new PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec("TestCodec-1", "Cisco Spark Room Kit", TestCodecClient, 8080); + //PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec TestCodec = + // new PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoCodec("TestCodec-1", "Cisco Spark Room Kit", TestCodecClient, 8080); - TestCodec.CustomActivate(); + //TestCodec.CustomActivate(); // CODEC TESTING } diff --git a/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs b/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs index e2b3f5d0..6ccb0f33 100644 --- a/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs +++ b/Essentials/PepperDashEssentials/Room/Config/EssentialsRoomConfig.cs @@ -63,7 +63,7 @@ namespace PepperDash.Essentials.Room.Config var codec = DeviceManager.GetDeviceForKey(props.VideoCodecKey) as 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.SourceListKey = props.SourceListKey; rm.DefaultSourceItem = props.DefaultSourceItem; diff --git a/Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs b/Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs index d875d674..c1b3d22a 100644 --- a/Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs +++ b/Essentials/PepperDashEssentials/Room/Types/EssentialsHuddleVtc1Room.cs @@ -235,97 +235,64 @@ namespace PepperDash.Essentials public void RunRouteAction(string routeKey, Action successCallback) { // Run this on a separate thread - new CTimer(o => - { - Debug.Console(1, this, "Run route action '{0}'", routeKey); - var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey); - if(dict == null) - { - Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey); - return; - } + new CTimer(o => + { + try + { - // 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; - } + Debug.Console(1, this, "Run route action '{0}'", routeKey); + var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey); + if (dict == null) + { + Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey); + 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 if (!string.IsNullOrEmpty(LastSourceKey)) { - var lastSource = dict[LastSourceKey].SourceDevice; - - try + var usageLastSource = dict[LastSourceKey].SourceDevice as IUsageTracking; + if (usageLastSource != null && usageLastSource.UsageTracker != null) { - if (lastSource != null && lastSource is IUsageTracking) - (lastSource as IUsageTracking).UsageTracker.EndDeviceUsage(); - } - catch (Exception e) - { - Debug.Console(1, this, "*#* EXCEPTION in end usage tracking (257):\r{0}", e); + try + { + // There MAY have been failures in here. Protect + usageLastSource.UsageTracker.EndDeviceUsage(); + } + 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") - { LastSourceKey = routeKey; - } else - { CurrentSourceInfoKey = null; - } - foreach (var route in item.RouteList) - { - // if there is a $defaultAll on route, run two separate - 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); - } + // hand off the individual routes to this helper + foreach (var route in item.RouteList) + DoRouteItem(route); // 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(); } - - // 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 + // store the name and UI info for routes if (item.SourceKey == "$off") { CurrentSourceInfoKey = routeKey; @@ -337,24 +304,41 @@ namespace PepperDash.Essentials CurrentSourceInfo = item; } - OnFeedback.FireUpdate(); + OnFeedback.FireUpdate(); - // report back when done - if (successCallback != null) - successCallback(); + // report back when done + if (successCallback != null) + successCallback(); + } + catch (Exception e) + { + Debug.Console(1, this, "ERROR in routing: {0}", e); + } - }, 0); // end of CTimer + }, 0); // end of CTimer } - /// - /// Will power the room on with the last-used source - /// - public void PowerOnToDefaultOrLastSource() - { - if (!EnablePowerOnToLastSource || LastSourceKey == null) - return; - RunRouteAction(LastSourceKey); - } + /// + /// + /// + /// + void DoRouteItem(SourceRouteListItem route) + { + // if there is a $defaultAll on route, run two separate + 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); + } /// /// @@ -397,6 +381,16 @@ namespace PepperDash.Essentials return true; } + /// + /// Will power the room on with the last-used source + /// + public void PowerOnToDefaultOrLastSource() + { + if (!EnablePowerOnToLastSource || LastSourceKey == null) + return; + RunRouteAction(LastSourceKey); + } + /// /// Runs "roomOff" action on all rooms not set to ExcludeFromGlobalFunctions /// diff --git a/Essentials/PepperDashEssentials/UI/JoinConstants/UIUshortJoin.cs b/Essentials/PepperDashEssentials/UI/JoinConstants/UIUshortJoin.cs index 70f03b0a..4f42b960 100644 --- a/Essentials/PepperDashEssentials/UI/JoinConstants/UIUshortJoin.cs +++ b/Essentials/PepperDashEssentials/UI/JoinConstants/UIUshortJoin.cs @@ -7,7 +7,7 @@ { // Video Codec /// - /// 1234 - 0 = Connect, 1 = End + /// 1234: values 0 = Connect, 1 = End /// public const uint VCStagingConnectButtonMode = 1234; diff --git a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs index 1ce8663d..7bfcf805 100644 --- a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs +++ b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/HuddleVTCPanelAvFunctionsDriver.cs @@ -388,7 +388,7 @@ namespace PepperDash.Essentials b => { if (!b) ActivityShareButtonPressed(); })); ActivityFooterSrl.AddItem(new SubpageReferenceListActivityItem(3, ActivityFooterSrl, 3, b => { if (!b) PowerButtonPressed(); })); - ActivityFooterSrl.Count = 2; + ActivityFooterSrl.Count = 3; TriList.UShortInput[UIUshortJoin.PresentationListCaretMode].UShortValue = 1; EndMeetingButtonSig = ActivityFooterSrl.BoolInputSig(3, 1); @@ -757,7 +757,11 @@ namespace PepperDash.Essentials } } - + /// + /// + /// + /// + /// void IsCoolingDownFeedback_OutputChange(object sender, EventArgs e) { var value = CurrentRoom.IsCoolingDownFeedback.BoolValue; diff --git a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs index ec55168e..163432ad 100644 --- a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs +++ b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs @@ -1,250 +1,246 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; -using Crestron.SimplSharpPro.DeviceSupport; - -using PepperDash.Core; -using PepperDash.Essentials; -using PepperDash.Essentials.Core; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; +using Crestron.SimplSharpPro.DeviceSupport; + +using PepperDash.Core; +using PepperDash.Essentials; +using PepperDash.Essentials.Core; using PepperDash.Essentials.Core.SmartObjects; -using PepperDash.Essentials.Devices.Common.VideoCodec; - -namespace PepperDash.Essentials.UIDrivers.VC -{ - - /// - /// 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. - /// - /// - public class EssentialsVideoCodecUiDriver : PanelDriverBase - { - /// - /// - /// - VideoCodecBase Codec; - - /// - /// - /// - SmartObjectDynamicList DirectorySrl; // ***************** SRL ??? - - - /// - /// To drive UI elements outside of this driver that may be dependent on this. - /// - BoolFeedback InCall; - BoolFeedback LocalPrivacyIsMuted; - - /// - /// For the subpages above the bar - /// - JoinedSigInterlock VCControlsInterlock; - - /// - /// For the different staging bars: Active, inactive - /// - JoinedSigInterlock StagingBarInterlock; - - /// - /// For the staging button feedbacks - /// - JoinedSigInterlock StagingButtonFeedbackInterlock; - - SmartObjectNumeric DialKeypad; - - // These are likely temp until we get a keyboard built - StringFeedback DialStringFeedback; - StringBuilder DialStringBuilder = new StringBuilder(); - BoolFeedback DialStringBackspaceVisibleFeedback; - - /// - /// - /// - /// - /// - public EssentialsVideoCodecUiDriver(BasicTriListWithSmartObject triList, VideoCodecBase codec) - : base(triList) - { - Codec = codec; - SetupCallStagingPopover(); - SetupDialKeypad(); - - InCall = new BoolFeedback(() => false); - LocalPrivacyIsMuted = new BoolFeedback(() => false); - - //DirectorySrl = new SubpageReferenceList(triList, UISmartObjectJoin.VCDirectoryList, 3, 3, 3); - - VCControlsInterlock = new JoinedSigInterlock(triList); - VCControlsInterlock.SetButDontShow(UIBoolJoin.VCDirectoryVisible); - - StagingBarInterlock = new JoinedSigInterlock(triList); - StagingBarInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible); - - StagingButtonFeedbackInterlock = new JoinedSigInterlock(triList); - StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible); - - DialStringFeedback = new StringFeedback(() => DialStringBuilder.ToString()); - DialStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.KeyboardText]); - - DialStringBackspaceVisibleFeedback = new BoolFeedback(() => DialStringBuilder.Length > 0); - DialStringBackspaceVisibleFeedback - .LinkInputSig(TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible]); - - Codec.InCallFeedback.OutputChange += new EventHandler(InCallFeedback_OutputChange); - } - - /// - /// - /// - public override void Show() - { - VCControlsInterlock.Show(); - StagingBarInterlock.Show(); - base.Show(); - } - - /// - /// - /// - public override void Hide() - { - VCControlsInterlock.Hide(); - StagingBarInterlock.Hide(); - base.Hide(); - } - - /// - /// Builds the call stage - /// - void SetupCallStagingPopover() - { - TriList.SetSigFalseAction(UIBoolJoin.VCStagingDirectoryPress, ShowDirectory); - TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress); - TriList.SetSigFalseAction(UIBoolJoin.VCStagingKeypadPress, ShowKeypad); - TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents); - } - - /// - /// - /// - void SetupDialKeypad() - { - if(TriList.SmartObjects.Contains(UISmartObjectJoin.VCDialKeypad)) - { - DialKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.VCDialKeypad], true); - DialKeypad.Digit0.SetSigFalseAction(() => DialKeypadPress("0")); - DialKeypad.Digit1.SetSigFalseAction(() => DialKeypadPress("1")); - DialKeypad.Digit2.SetSigFalseAction(() => DialKeypadPress("2")); - DialKeypad.Digit3.SetSigFalseAction(() => DialKeypadPress("3")); - DialKeypad.Digit4.SetSigFalseAction(() => DialKeypadPress("4")); - DialKeypad.Digit5.SetSigFalseAction(() => DialKeypadPress("5")); - DialKeypad.Digit6.SetSigFalseAction(() => DialKeypadPress("6")); - DialKeypad.Digit7.SetSigFalseAction(() => DialKeypadPress("7")); - DialKeypad.Digit8.SetSigFalseAction(() => DialKeypadPress("8")); - DialKeypad.Digit9.SetSigFalseAction(() => DialKeypadPress("9")); - DialKeypad.Misc1SigName = "*"; - DialKeypad.Misc1.SetSigFalseAction(() => DialKeypadPress("*")); - DialKeypad.Misc2SigName = "#"; - DialKeypad.Misc2.SetSigFalseAction(() => DialKeypadPress("#")); - TriList.SetSigFalseAction(UIBoolJoin.KeyboardClearPress, DialKeypadBackspacePress); - } - else - Debug.Console(0, "Trilist {0:x2}, VC dial keypad object {1} not found. Check SGD file or VTP", - TriList.ID, UISmartObjectJoin.VCDialKeypad); - } - - /// - /// - /// - void ShowCameraControls() - { - VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCCameraVisible); - StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress); - } - - void ShowKeypad() - { - VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible); - StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress); - } - - void ShowDirectory() - { - // populate directory - VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible); - StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress); - } - - void ShowRecents() - { - //populate recents - VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible); - StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress); - } - - /// - /// - /// - void ConnectPress() - { - if (Codec.InCallFeedback.BoolValue) - Codec.EndCall(); - else - Codec.Dial(DialStringBuilder.ToString()); - } - - /// - /// - /// - - void InCallFeedback_OutputChange(object sender, EventArgs e) - { -#warning mode does not change! - var inCall = Codec.InCallFeedback.BoolValue; - Debug.Console(2, "*#* Codec Driver InCallFeedback change={0}", InCall); - TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(inCall ? 1 : 0); - StagingBarInterlock.ShowInterlocked( - inCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible); - - if (Codec.InCallFeedback.BoolValue) // Call is starting - { - // Header icon - // Add end call button to stage - // Volume bar needs to have mic mute - } - else // ending - { - // Header icon - // Remove end call - // Volume bar no mic mute (or hidden if no source?) - } - } - - /// - /// - /// - /// - void DialKeypadPress(string i) - { - DialStringBuilder.Append(i); - DialStringFeedback.FireUpdate(); - TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue = - DialStringBuilder.Length > 0; - } - - /// - /// - /// - void DialKeypadBackspacePress() - { - DialStringBuilder.Remove(DialStringBuilder.Length - 1, 1); - DialStringFeedback.FireUpdate(); - TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue = - DialStringBuilder.Length > 0; - TriList.SetBool(UIBoolJoin.VCStagingConnectEnable, DialStringBuilder.Length > 0); - } - } +using PepperDash.Essentials.Devices.Common.VideoCodec; + +namespace PepperDash.Essentials.UIDrivers.VC +{ + + /// + /// 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. + /// + /// + public class EssentialsVideoCodecUiDriver : PanelDriverBase + { + /// + /// + /// + VideoCodecBase Codec; + + /// + /// + /// + SmartObjectDynamicList DirectorySrl; // ***************** SRL ??? + + + /// + /// To drive UI elements outside of this driver that may be dependent on this. + /// + BoolFeedback InCall; + BoolFeedback LocalPrivacyIsMuted; + + /// + /// For the subpages above the bar + /// + JoinedSigInterlock VCControlsInterlock; + + /// + /// For the different staging bars: Active, inactive + /// + JoinedSigInterlock StagingBarInterlock; + + /// + /// For the staging button feedbacks + /// + JoinedSigInterlock StagingButtonFeedbackInterlock; + + SmartObjectNumeric DialKeypad; + + // These are likely temp until we get a keyboard built + StringFeedback DialStringFeedback; + StringBuilder DialStringBuilder = new StringBuilder(); + BoolFeedback DialStringBackspaceVisibleFeedback; + + /// + /// + /// + /// + /// + public EssentialsVideoCodecUiDriver(BasicTriListWithSmartObject triList, VideoCodecBase codec) + : base(triList) + { + Codec = codec; + SetupCallStagingPopover(); + SetupDialKeypad(); + + InCall = new BoolFeedback(() => false); + LocalPrivacyIsMuted = new BoolFeedback(() => false); + + //DirectorySrl = new SubpageReferenceList(triList, UISmartObjectJoin.VCDirectoryList, 3, 3, 3); + + VCControlsInterlock = new JoinedSigInterlock(triList); + VCControlsInterlock.SetButDontShow(UIBoolJoin.VCDirectoryVisible); + + StagingBarInterlock = new JoinedSigInterlock(triList); + StagingBarInterlock.SetButDontShow(UIBoolJoin.VCStagingInactivePopoverVisible); + + StagingButtonFeedbackInterlock = new JoinedSigInterlock(triList); + StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCRecentsVisible); + + DialStringFeedback = new StringFeedback(() => DialStringBuilder.ToString()); + DialStringFeedback.LinkInputSig(triList.StringInput[UIStringJoin.KeyboardText]); + + DialStringBackspaceVisibleFeedback = new BoolFeedback(() => DialStringBuilder.Length > 0); + DialStringBackspaceVisibleFeedback + .LinkInputSig(TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible]); + + Codec.InCallFeedback.OutputChange += new EventHandler(InCallFeedback_OutputChange); + } + + /// + /// + /// + public override void Show() + { + VCControlsInterlock.Show(); + StagingBarInterlock.Show(); + base.Show(); + } + + /// + /// + /// + public override void Hide() + { + VCControlsInterlock.Hide(); + StagingBarInterlock.Hide(); + base.Hide(); + } + + /// + /// Builds the call stage + /// + void SetupCallStagingPopover() + { + TriList.SetSigFalseAction(UIBoolJoin.VCStagingDirectoryPress, ShowDirectory); + TriList.SetSigFalseAction(UIBoolJoin.VCStagingConnectPress, ConnectPress); + TriList.SetSigFalseAction(UIBoolJoin.VCStagingKeypadPress, ShowKeypad); + TriList.SetSigFalseAction(UIBoolJoin.VCStagingRecentsPress, ShowRecents); + } + + /// + /// + /// + void SetupDialKeypad() + { + if(TriList.SmartObjects.Contains(UISmartObjectJoin.VCDialKeypad)) + { + DialKeypad = new SmartObjectNumeric(TriList.SmartObjects[UISmartObjectJoin.VCDialKeypad], true); + DialKeypad.Digit0.SetSigFalseAction(() => DialKeypadPress("0")); + DialKeypad.Digit1.SetSigFalseAction(() => DialKeypadPress("1")); + DialKeypad.Digit2.SetSigFalseAction(() => DialKeypadPress("2")); + DialKeypad.Digit3.SetSigFalseAction(() => DialKeypadPress("3")); + DialKeypad.Digit4.SetSigFalseAction(() => DialKeypadPress("4")); + DialKeypad.Digit5.SetSigFalseAction(() => DialKeypadPress("5")); + DialKeypad.Digit6.SetSigFalseAction(() => DialKeypadPress("6")); + DialKeypad.Digit7.SetSigFalseAction(() => DialKeypadPress("7")); + DialKeypad.Digit8.SetSigFalseAction(() => DialKeypadPress("8")); + DialKeypad.Digit9.SetSigFalseAction(() => DialKeypadPress("9")); + DialKeypad.Misc1SigName = "*"; + DialKeypad.Misc1.SetSigFalseAction(() => DialKeypadPress("*")); + DialKeypad.Misc2SigName = "#"; + DialKeypad.Misc2.SetSigFalseAction(() => DialKeypadPress("#")); + TriList.SetSigFalseAction(UIBoolJoin.KeyboardClearPress, DialKeypadBackspacePress); + } + else + Debug.Console(0, "Trilist {0:x2}, VC dial keypad object {1} not found. Check SGD file or VTP", + TriList.ID, UISmartObjectJoin.VCDialKeypad); + } + + /// + /// + /// + void ShowCameraControls() + { + VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCCameraVisible); + StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingCameraPress); + } + + void ShowKeypad() + { + VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible); + StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress); + } + + void ShowDirectory() + { + // populate directory + VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible); + StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingDirectoryPress); + } + + void ShowRecents() + { + //populate recents + VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCDirectoryVisible); + StagingButtonFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingRecentsPress); + } + + /// + /// + /// + void ConnectPress() + { + if (Codec.InCallFeedback.BoolValue) + Codec.EndCall(); + else + Codec.Dial(DialStringBuilder.ToString()); + } + + /// + /// + /// + void InCallFeedback_OutputChange(object sender, EventArgs e) + { + var inCall = Codec.InCallFeedback.BoolValue; + Debug.Console(1, "*#* Codec Driver InCallFeedback change={0}", InCall); + TriList.UShortInput[UIUshortJoin.VCStagingConnectButtonMode].UShortValue = (ushort)(inCall ? 1 : 0); + StagingBarInterlock.ShowInterlocked( + inCall ? UIBoolJoin.VCStagingActivePopoverVisible : UIBoolJoin.VCStagingInactivePopoverVisible); + + if (Codec.InCallFeedback.BoolValue) // Call is starting + { + // Header icon + // Volume bar needs to have mic mute + } + else // ending + { + // Header icon + // Volume bar no mic mute (or hidden if no source?) + } + } + + /// + /// + /// + /// + void DialKeypadPress(string i) + { + DialStringBuilder.Append(i); + DialStringFeedback.FireUpdate(); + TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue = + DialStringBuilder.Length > 0; + } + + /// + /// + /// + void DialKeypadBackspacePress() + { + DialStringBuilder.Remove(DialStringBuilder.Length - 1, 1); + DialStringFeedback.FireUpdate(); + TriList.BooleanInput[UIBoolJoin.KeyboardClearVisible].BoolValue = + DialStringBuilder.Length > 0; + TriList.SetBool(UIBoolJoin.VCStagingConnectEnable, DialStringBuilder.Length > 0); + } + } } \ No newline at end of file diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz index 2232a636..64709aa0 100644 Binary files a/Release Package/PepperDashEssentials.cpz and b/Release Package/PepperDashEssentials.cpz differ diff --git a/Release Package/PepperDashEssentials.dll b/Release Package/PepperDashEssentials.dll index 678cd450..ba987342 100644 Binary files a/Release Package/PepperDashEssentials.dll and b/Release Package/PepperDashEssentials.dll differ