From 96cd5cfe81fd9c8947f1977ca4ee48f9be8c3ca2 Mon Sep 17 00:00:00 2001 From: Neil Dorin Date: Tue, 17 Dec 2019 21:36:47 -0700 Subject: [PATCH] New JoinMap scheme working on CameraControllerJoinMap. Added MobileControlSIMPLRoomJoinMap and began implementing on MobileControlSIMPLRoomBridge --- ...dge.cs => MobileControlSIMPLRoomBridge.cs} | 23 ++-- .../MobileControlSIMPLRoomJoinMap.cs | 124 +++++++++++++++++ PepperDashEssentials/Bridges/BridgeBase.cs | 2 + .../Bridges/CameraControllerBridge.cs | 73 +++++++--- .../JoinMaps/CameraControllerJoinMap.cs | 130 ++++++------------ .../PepperDashEssentials.csproj | 3 +- .../JoinMaps/JoinMapBase.cs | 89 +++++++++++- .../Cameras/CameraVisca.cs | 11 +- .../BiampTesira/BiampTesiraForteDspLevel.cs | 13 ++ .../Essentials Devices Common/DSP/DspBase.cs | 23 ---- .../Power Controllers/Digitallogger.cs | 4 +- essentials-framework/pepperdashcore-builds | 2 +- 12 files changed, 345 insertions(+), 152 deletions(-) rename PepperDashEssentials/AppServer/RoomBridges/{MobileControlDdvc01RoomBridge.cs => MobileControlSIMPLRoomBridge.cs} (98%) create mode 100644 PepperDashEssentials/AppServer/SIMPLJoinMaps/MobileControlSIMPLRoomJoinMap.cs diff --git a/PepperDashEssentials/AppServer/RoomBridges/MobileControlDdvc01RoomBridge.cs b/PepperDashEssentials/AppServer/RoomBridges/MobileControlSIMPLRoomBridge.cs similarity index 98% rename from PepperDashEssentials/AppServer/RoomBridges/MobileControlDdvc01RoomBridge.cs rename to PepperDashEssentials/AppServer/RoomBridges/MobileControlSIMPLRoomBridge.cs index b85431fb..d93da71c 100644 --- a/PepperDashEssentials/AppServer/RoomBridges/MobileControlDdvc01RoomBridge.cs +++ b/PepperDashEssentials/AppServer/RoomBridges/MobileControlSIMPLRoomBridge.cs @@ -10,6 +10,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using PepperDash.Core; +using PepperDash.Essentials.AppServer; using PepperDash.Essentials.AppServer.Messengers; using PepperDash.Essentials.Core; using PepperDash.Essentials.Core.Config; @@ -186,15 +187,7 @@ namespace PepperDash.Essentials.Room.MobileControl /// /// 402 /// - public const uint ServerUrl = 402; - /// - /// 512 - /// - public const uint RoomSpeedDialNamesJoinStart = 512; - /// - /// 516 - /// - public const uint RoomSpeedDialNumberssJoinStart = 516; + public const uint ServerUrl = 402; /// /// 601 /// @@ -228,6 +221,8 @@ namespace PepperDash.Essentials.Room.MobileControl public ThreeSeriesTcpIpEthernetIntersystemCommunications EISC { get; private set; } + public MobileControlSIMPLRoomJoinMap JoinMap { get; private set; } + /// /// /// @@ -263,8 +258,18 @@ namespace PepperDash.Essentials.Room.MobileControl if (reg != Crestron.SimplSharpPro.eDeviceRegistrationUnRegistrationResponse.Success) Debug.Console(0, this, "Cannot connect EISC at IPID {0}: \r{1}", ipId, reg); + JoinMap = new MobileControlSIMPLRoomJoinMap(); + + // TODO: Possibly set up alternate constructor or take in joinMapKey and joinStart properties in constructor + + + JoinMap.OffsetJoinNumbers(1); + SourceBridge = new MobileControlDdvc01DeviceBridge(key + "-sourceBridge", "DDVC01 source bridge", EISC); DeviceManager.AddDevice(SourceBridge); + + + } catch (Exception) { diff --git a/PepperDashEssentials/AppServer/SIMPLJoinMaps/MobileControlSIMPLRoomJoinMap.cs b/PepperDashEssentials/AppServer/SIMPLJoinMaps/MobileControlSIMPLRoomJoinMap.cs new file mode 100644 index 00000000..bcea7845 --- /dev/null +++ b/PepperDashEssentials/AppServer/SIMPLJoinMaps/MobileControlSIMPLRoomJoinMap.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; + +using PepperDash.Essentials.Core; + + +namespace PepperDash.Essentials.AppServer +{ + public class MobileControlSIMPLRoomJoinMap : JoinMapBase + { + public const string ConfigIsLocal = "ConfigIsLocal"; + public const string RoomIsOn = "RoomIsOn"; + public const string PrivacyMute = "PrivacyMute"; + public const string PromptForCode = "PromptForCode"; + public const string ClientJoined = "ClientJoined"; + public const string ActivityShare = "ActivityShare"; + public const string ActivityPhoneCall = "ActivityPhoneCall"; + public const string ActivtyVideoCall = "ActivityVideoCall"; + public const string MasterVolume = "MasterVolumeMute"; + public const string VolumeJoinStart = "VolumeMutesJoinStart"; + public const string ShutdownCancel = "ShutdownCancel"; + public const string ShutdownEnd = "ShutdownEnd"; + public const string ShutdownStart = "ShutdownStart"; + public const string SourceHasChanged = "SourceHasChanged"; + public const string SpeedDialVisibleStartJoin = "SpeedDialVisibleStartJoin"; + public const string ConfigIsReady = "ConfigIsReady"; + public const string HideVideoConfRecents = "HideVideoConfRecents"; + public const string ShowCameraWhenNotInCall = "ShowCameraWhenNotInCall"; + public const string UseSourceEnabled = "UseSourceEnabled"; + public const string SourceShareDisableJoinStart = "SourceShareDisableJoinStart"; + public const string SourceIsEnabledJoinStart = "SourceIsEnabledJoinStart"; + + //public const string MasterVolumeLevel = "MasterVolumeLevel"; + public const string VolumeSlidersJoinStart = "VolumeSlidersJoinStart"; + public const string ShutdownPromptDuration = "ShutdownPromptDuration"; + public const string NumberOfAuxFaders = "NumberOfAuxFaders"; + + public const string VolumeSliderNamesJoinStart = "VolumeSliderNamesJoinStart"; + public const string SelectedSourceKey = "SelectedSourceKey"; + public const string SpeedDialNameStartJoin = "SpeedDialNameStartJoin"; + public const string SpeedDialNumberStartJoin = "SpeedDialNumberStartJoin"; + public const string ConfigRoomName = "ConfigRoomName"; + public const string ConfigHelpMessage = "ConfigHelpMessage"; + public const string ConfigHelpNumber = "ConfigHelpNumber"; + public const string ConfigRoomPhoneNumber = "ConfigRoomPhoneNumber"; + public const string ConfigRoomURI = "ConfigRoomURI"; + public const string UserCodeToSystem = "UserCodeToSystem"; + public const string ServerUrl = "ServerUrl"; + public const string RoomSpeedDialNamesJoinStart = "RoomSpeedDialNamesJoinStart"; + public const string RoomSpeedDialNumberssJoinStart = "RoomSpeedDialNumberssJoinStart"; + public const string SourceNameJoinStart = "SourceNameJoinStart"; + public const string SourceIconJoinStart = "SourceIconJoinStart"; + public const string SourceKeyJoinStart = "SourceKeyJoinStart"; + public const string SourceTypeJoinStart = "SourceTypeJoinStart"; + public const string CameraNearNameStart = "CameraNearNameStart"; + public const string CameraFarName = "CameraFarName"; + + public MobileControlSIMPLRoomJoinMap() + { + Joins.Add(ConfigIsLocal, new JoinMetadata() { JoinNumber = 100, Label = "Config is local to Essentials", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(RoomIsOn, new JoinMetadata() { JoinNumber = 301, Label = "Room Is On", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(PrivacyMute, new JoinMetadata() { JoinNumber = 12, Label = "Privacy Mute Toggle/FB", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(PromptForCode, new JoinMetadata() { JoinNumber = 41, Label = "Prompt User for Code", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(ClientJoined, new JoinMetadata() { JoinNumber = 42, Label = "Client Joined", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(ActivityShare, new JoinMetadata() { JoinNumber = 51, Label = "Activity Share", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(ActivityPhoneCall, new JoinMetadata() { JoinNumber = 52, Label = "Activity Phone Call", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(ActivtyVideoCall, new JoinMetadata() { JoinNumber = 53, Label = "Activity Video Call", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(MasterVolume, new JoinMetadata() { JoinNumber = 1, Label = "Master Volume Mute Toggle/FB/Level/Label", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.DigitalAnalogSerial }); + Joins.Add(VolumeJoinStart, new JoinMetadata() { JoinNumber = 2, Label = "Volume Mute Toggle/FB/Level/Label", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 9, JoinType = eJoinType.DigitalAnalogSerial }); + Joins.Add(ShutdownCancel, new JoinMetadata() { JoinNumber = 61, Label = "Shutdown Cancel", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(ShutdownEnd, new JoinMetadata() { JoinNumber = 62, Label = "Shutdown End", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(ShutdownStart, new JoinMetadata() { JoinNumber = 63, Label = "ShutdownStart", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(SourceHasChanged, new JoinMetadata() { JoinNumber = 71, Label = "Source Changed", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + // Possibly move these to Audio Codec Messenger + Joins.Add(SpeedDialVisibleStartJoin, new JoinMetadata() { JoinNumber = 261, Label = "Speed Dial Visible", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 10, JoinType = eJoinType.Digital }); + Joins.Add(ConfigIsReady, new JoinMetadata() { JoinNumber = 501, Label = "Config info from SIMPL is ready", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(HideVideoConfRecents, new JoinMetadata() { JoinNumber = 502, Label = "Hide Video Conference Recents", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(ShowCameraWhenNotInCall, new JoinMetadata() { JoinNumber = 503, Label = "Show camera when not in call", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(UseSourceEnabled, new JoinMetadata() { JoinNumber = 504, Label = "Use Source Enabled Joins", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(SourceShareDisableJoinStart, new JoinMetadata() { JoinNumber = 601, Label = "Source is not sharable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 20, JoinType = eJoinType.Digital }); + Joins.Add(SourceIsEnabledJoinStart, new JoinMetadata() { JoinNumber = 621, Label = "Source is enabled", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 20, JoinType = eJoinType.Digital }); + + + Joins.Add(ShutdownPromptDuration, new JoinMetadata() { JoinNumber = 61, Label = "Shutdown Prompt Timer Duration", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Analog }); + Joins.Add(NumberOfAuxFaders, new JoinMetadata() { JoinNumber = 101, Label = "Number of Auxilliary Faders", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Analog }); + + + Joins.Add(SelectedSourceKey, new JoinMetadata() { JoinNumber = 71, Label = "Key of selected source", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Serial }); + + // Possibly move these to Audio Codec Messenger + Joins.Add(SpeedDialNameStartJoin, new JoinMetadata() { JoinNumber = 241, Label = "Speed Dial names", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 10, JoinType = eJoinType.Serial }); + Joins.Add(SpeedDialNumberStartJoin, new JoinMetadata() { JoinNumber = 251, Label = "Speed Dial numbers", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 10, JoinType = eJoinType.Serial }); + Joins.Add(UserCodeToSystem, new JoinMetadata() { JoinNumber = 401, Label = "User Ccde", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinSpan = 1, JoinType = eJoinType.Serial }); + Joins.Add(ServerUrl, new JoinMetadata() { JoinNumber = 402, Label = "Server URL", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinSpan = 1, JoinType = eJoinType.Serial }); + Joins.Add(ConfigRoomName, new JoinMetadata() { JoinNumber = 501, Label = "Room Nnme", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Serial }); + Joins.Add(ConfigHelpMessage, new JoinMetadata() { JoinNumber = 502, Label = "Room help message", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Serial }); + Joins.Add(ConfigHelpNumber, new JoinMetadata() { JoinNumber = 503, Label = "Room help number", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Serial }); + Joins.Add(ConfigRoomPhoneNumber, new JoinMetadata() { JoinNumber = 504, Label = "Room phone number", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Serial }); + Joins.Add(ConfigRoomURI, new JoinMetadata() { JoinNumber = 505, Label = "Room URI", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Serial }); + Joins.Add(SourceNameJoinStart, new JoinMetadata() { JoinNumber = 601, Label = "Source Names", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 20, JoinType = eJoinType.Serial }); + Joins.Add(SourceIconJoinStart, new JoinMetadata() { JoinNumber = 621, Label = "Source Icons", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 20, JoinType = eJoinType.Serial }); + Joins.Add(SourceKeyJoinStart, new JoinMetadata() { JoinNumber = 641, Label = "Source Keys", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 20, JoinType = eJoinType.Serial }); + Joins.Add(SourceTypeJoinStart, new JoinMetadata() { JoinNumber = 661, Label = "Source Types", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 20, JoinType = eJoinType.Serial }); + + Joins.Add(CameraNearNameStart, new JoinMetadata() { JoinNumber = 761, Label = "Near End Camera Names", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 10, JoinType = eJoinType.Serial }); + Joins.Add(CameraNearNameStart, new JoinMetadata() { JoinNumber = 770, Label = "Far End Camera Name", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Serial }); + } + + public override void OffsetJoinNumbers(uint joinStart) + { + var joinOffset = joinStart - 1; + + foreach (var join in Joins) + { + join.Value.JoinNumber = join.Value.JoinNumber + joinOffset; + } + + PrintJoinMapInfo(); + } + } +} \ No newline at end of file diff --git a/PepperDashEssentials/Bridges/BridgeBase.cs b/PepperDashEssentials/Bridges/BridgeBase.cs index 784be59f..5a542fa0 100644 --- a/PepperDashEssentials/Bridges/BridgeBase.cs +++ b/PepperDashEssentials/Bridges/BridgeBase.cs @@ -55,6 +55,8 @@ namespace PepperDash.Essentials.Bridges { public EiscApiPropertiesConfig PropertiesConfig { get; private set; } + public Dictionary JoinMaps { get; set; } + public ThreeSeriesTcpIpEthernetIntersystemCommunications Eisc { get; private set; } public EiscApi(DeviceConfig dc) : diff --git a/PepperDashEssentials/Bridges/CameraControllerBridge.cs b/PepperDashEssentials/Bridges/CameraControllerBridge.cs index badf9ea0..21a9d3eb 100644 --- a/PepperDashEssentials/Bridges/CameraControllerBridge.cs +++ b/PepperDashEssentials/Bridges/CameraControllerBridge.cs @@ -15,7 +15,6 @@ namespace PepperDash.Essentials.Bridges { public static class CameraControllerApiExtensions { - public static void LinkToApi(this PepperDash.Essentials.Devices.Common.Cameras.CameraBase cameraDevice, BasicTriList trilist, uint joinStart, string joinMapKey) { CameraControllerJoinMap joinMap = new CameraControllerJoinMap(); @@ -31,13 +30,13 @@ namespace PepperDash.Essentials.Bridges Debug.Console(0, "Linking to Bridge Type {0}", cameraDevice.GetType().Name.ToString()); var commMonitor = cameraDevice as ICommunicationMonitor; - commMonitor.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]); + commMonitor.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.GetJoinForKey(CameraControllerJoinMap.IsOnline)]); var ptzCamera = cameraDevice as IHasCameraPtzControl; if (ptzCamera != null) { - trilist.SetBoolSigAction(joinMap.Left, (b) => + trilist.SetBoolSigAction(joinMap.GetJoinForKey(CameraControllerJoinMap.PanLeft), (b) => { if (b) { @@ -48,7 +47,7 @@ namespace PepperDash.Essentials.Bridges ptzCamera.PanStop(); } }); - trilist.SetBoolSigAction(joinMap.Right, (b) => + trilist.SetBoolSigAction(joinMap.GetJoinForKey(CameraControllerJoinMap.PanRight), (b) => { if (b) { @@ -60,7 +59,7 @@ namespace PepperDash.Essentials.Bridges } }); - trilist.SetBoolSigAction(joinMap.Up, (b) => + trilist.SetBoolSigAction(joinMap.GetJoinForKey(CameraControllerJoinMap.TiltUp), (b) => { if (b) { @@ -71,7 +70,7 @@ namespace PepperDash.Essentials.Bridges ptzCamera.TiltStop(); } }); - trilist.SetBoolSigAction(joinMap.Down, (b) => + trilist.SetBoolSigAction(joinMap.GetJoinForKey(CameraControllerJoinMap.TiltDown), (b) => { if (b) { @@ -83,7 +82,7 @@ namespace PepperDash.Essentials.Bridges } }); - trilist.SetBoolSigAction(joinMap.ZoomIn, (b) => + trilist.SetBoolSigAction(joinMap.GetJoinForKey(CameraControllerJoinMap.ZoomIn), (b) => { if (b) { @@ -95,7 +94,7 @@ namespace PepperDash.Essentials.Bridges } }); - trilist.SetBoolSigAction(joinMap.ZoomOut, (b) => + trilist.SetBoolSigAction(joinMap.GetJoinForKey(CameraControllerJoinMap.ZoomOut), (b) => { if (b) { @@ -108,27 +107,57 @@ namespace PepperDash.Essentials.Bridges }); } - if (cameraDevice.GetType().Name.ToString().ToLower() == "cameravisca") + if (cameraDevice is IPower) { - var viscaCamera = cameraDevice as PepperDash.Essentials.Devices.Common.Cameras.CameraVisca; - trilist.SetSigTrueAction(joinMap.PowerOn, () => viscaCamera.PowerOn()); - trilist.SetSigTrueAction(joinMap.PowerOff, () => viscaCamera.PowerOff()); + var powerCamera = cameraDevice as IPower; + trilist.SetSigTrueAction(joinMap.GetJoinForKey(CameraControllerJoinMap.PowerOn), () => powerCamera.PowerOn()); + trilist.SetSigTrueAction(joinMap.GetJoinForKey(CameraControllerJoinMap.PowerOff), () => powerCamera.PowerOff()); + + powerCamera.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.GetJoinForKey(CameraControllerJoinMap.PowerOn)]); + powerCamera.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.GetJoinForKey(CameraControllerJoinMap.PowerOff)]); + } - viscaCamera.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn]); - viscaCamera.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff]); + if (cameraDevice is ICommunicationMonitor) + { + var monitoredCamera = cameraDevice as ICommunicationMonitor; + monitoredCamera.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.GetJoinForKey(CameraControllerJoinMap.IsOnline)]); + } - viscaCamera.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline]); - for (int i = 0; i < joinMap.NumberOfPresets; i++) + if (cameraDevice is IHasCameraPresets) + { + // Set the preset lables when they change + var presetsCamera = cameraDevice as IHasCameraPresets; + presetsCamera.PresetsListHasChanged += new EventHandler((o, a) => + { + for (int i = 1; i <= joinMap.GetJoinForKey(CameraControllerJoinMap.NumberOfPresets); i++) + { + int tempNum = i - 1; + + string label = "" ; + + var preset = presetsCamera.Presets.FirstOrDefault(p => p.ID.Equals(i)); + + if (preset != null) + label = preset.Description; + + trilist.SetString((ushort)(joinMap.GetJoinForKey(CameraControllerJoinMap.PresetLabelStart) + tempNum), label); + } + }); + + for (int i = 0; i < joinMap.GetJoinForKey(CameraControllerJoinMap.NumberOfPresets); i++) { int tempNum = i; - trilist.SetSigTrueAction((ushort)(joinMap.PresetRecallOffset + tempNum), () => + + trilist.SetSigTrueAction((ushort)(joinMap.GetJoinForKey(CameraControllerJoinMap.PresetRecallStart) + tempNum), () => { - viscaCamera.RecallPreset(tempNum); + presetsCamera.PresetSelect(tempNum); + }); + trilist.SetSigTrueAction((ushort)(joinMap.GetJoinForKey(CameraControllerJoinMap.PresetSaveStart) + tempNum), () => + { + var label = trilist.GetString(joinMap.GetJoinForKey(CameraControllerJoinMap.PresetLabelStart + tempNum)); + + presetsCamera.PresetStore(tempNum, label); }); - trilist.SetSigTrueAction((ushort)(joinMap.PresetSaveOffset + tempNum), () => - { - viscaCamera.SavePreset(tempNum); - }); } } } diff --git a/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs index b78ef472..aa86b96d 100644 --- a/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs +++ b/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs @@ -8,112 +8,70 @@ using PepperDash.Essentials.Core; namespace PepperDash.Essentials.Bridges { + /// + /// Join map for CameraBase devices + /// public class CameraControllerJoinMap : JoinMapBase { - public uint IsOnline { get; set; } - public uint PowerOff { get; set; } - public uint PowerOn { get; set; } - public uint Up { get; set; } - public uint Down { get; set; } - public uint Left { get; set; } - public uint Right { get; set; } - public uint ZoomIn { get; set; } - public uint ZoomOut { get; set; } - public uint PresetRecallOffset { get; set; } - public uint PresetSaveOffset { get; set; } - public uint NumberOfPresets { get; set; } - - public enum eCameraControllerJoinMapKey - { - IsOnline, - PowerOn, - PowerOff, - TiltUp, - TiltDown, - PanLeft, - PanRight, - ZoomIn, - ZoomOut, - PresetRecallStart, - PresetSaveStart, - PresetLabelStart, - NumberOfPresets - } + public const string IsOnline = "IsOnline"; + public const string PowerOff = "PowerOff"; + public const string PowerOn = "PowerOn"; + public const string TiltUp = "TiltUp"; + public const string TiltDown = "TiltDown"; + public const string PanLeft = "PanLeft"; + public const string PanRight = "PanRight"; + public const string ZoomIn = "ZoomIn"; + public const string ZoomOut = "ZoomOut"; + public const string PresetRecallStart = "PresetRecallStart"; + public const string PresetSaveStart = "PresetSaveStart"; + public const string PresetLabelStart = "PresetReacllStgart"; + public const string NumberOfPresets = "NumberOfPresets"; public CameraControllerJoinMap() { - Joins = new Dictionary(); + Joins.Add(TiltUp, new JoinMetadata() + { JoinNumber = 1, Label = "Tilt Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(TiltDown, new JoinMetadata() + { JoinNumber = 2, Label = "TiltDown", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(PanLeft, new JoinMetadata() + { JoinNumber = 3, Label = "Pan Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(PanRight, new JoinMetadata() + { JoinNumber = 4, Label = "Pan Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(ZoomIn, new JoinMetadata() + { JoinNumber = 5, Label = "Zoom In", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(ZoomOut, new JoinMetadata() + { JoinNumber = 6, Label = "Zoom Out", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.IsOnline.ToString(), new JoinMetadata() - { JoinNumber = 9, Label = "Is Online", JoinCapabilities = eJoinCapabilities.Read, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.PowerOn.ToString(), new JoinMetadata() - { JoinNumber = 7, Label = "Power On", JoinCapabilities = eJoinCapabilities.Read | eJoinCapabilities.Write, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.PowerOff.ToString(), new JoinMetadata() - { JoinNumber = 8, Label = "Power Off", JoinCapabilities = eJoinCapabilities.Read | eJoinCapabilities.Write, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.TiltUp.ToString(), new JoinMetadata() - { JoinNumber = 1, Label = "Tilt Up", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.TiltDown.ToString(), new JoinMetadata() - { JoinNumber = 2, Label = "TiltDown", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.PanLeft.ToString(), new JoinMetadata() - { JoinNumber = 3, Label = "Pan Left", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.PanRight.ToString(), new JoinMetadata() - { JoinNumber = 4, Label = "Pan Right", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.ZoomIn.ToString(), new JoinMetadata() - { JoinNumber = 5, Label = "Zoom In", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.ZoomOut.ToString(), new JoinMetadata() - { JoinNumber = 6, Label = "Zoom Out", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(PowerOn, new JoinMetadata() + { JoinNumber = 7, Label = "Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(PowerOff, new JoinMetadata() + { JoinNumber = 8, Label = "Power Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); + Joins.Add(IsOnline, new JoinMetadata() + { JoinNumber = 9, Label = "Is Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinSpan = 1, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.PresetRecallStart.ToString(), new JoinMetadata() - { JoinNumber = 11, Label = "Preset Recall Start", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 20, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.PresetLabelStart.ToString(), new JoinMetadata() - { JoinNumber = 11, Label = "Preset Label Start", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 20, JoinType = eJoinType.Serial }); + Joins.Add(PresetRecallStart, new JoinMetadata() + { JoinNumber = 11, Label = "Preset Recall Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 20, JoinType = eJoinType.Digital }); + Joins.Add(PresetLabelStart, new JoinMetadata() + { JoinNumber = 11, Label = "Preset Label Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 20, JoinType = eJoinType.Serial }); - Joins.Add(eCameraControllerJoinMapKey.PresetSaveStart.ToString(), new JoinMetadata() - { JoinNumber = 31, Label = "Preset Save Start", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 20, JoinType = eJoinType.Digital }); + Joins.Add(PresetSaveStart, new JoinMetadata() + { JoinNumber = 31, Label = "Preset Save Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 20, JoinType = eJoinType.Digital }); - Joins.Add(eCameraControllerJoinMapKey.NumberOfPresets.ToString(), new JoinMetadata() - { JoinNumber = 5, Label = "Number of Presets", JoinCapabilities = eJoinCapabilities.Write, JoinSpan = 1, JoinType = eJoinType.Analog }); + Joins.Add(NumberOfPresets, new JoinMetadata() + { JoinNumber = 11, Label = "Number of Presets", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinSpan = 1, JoinType = eJoinType.Analog }); - // Digital - IsOnline = 9; - PowerOff = 8; - PowerOn = 7; - Up = 1; - Down = 2; - Left = 3; - Right = 4; - ZoomIn = 5; - ZoomOut = 6; - PresetRecallOffset = 10; - PresetSaveOffset = 30; - - // Analog - NumberOfPresets = 5; } public override void OffsetJoinNumbers(uint joinStart) { var joinOffset = joinStart - 1; - - + foreach (var join in Joins) { join.Value.JoinNumber = join.Value.JoinNumber + joinOffset; } - - - IsOnline = IsOnline + joinOffset; - PowerOff = PowerOff + joinOffset; - PowerOn = PowerOn + joinOffset; - Up = Up + joinOffset; - Down = Down + joinOffset; - Left = Left + joinOffset; - Right = Right + joinOffset; - ZoomIn = ZoomIn + joinOffset; - ZoomOut = ZoomOut + joinOffset; - PresetRecallOffset = PresetRecallOffset + joinOffset; - PresetSaveOffset = PresetSaveOffset + joinOffset; + PrintJoinMapInfo(); } } } \ No newline at end of file diff --git a/PepperDashEssentials/PepperDashEssentials.csproj b/PepperDashEssentials/PepperDashEssentials.csproj index 3b1679c0..063c3796 100644 --- a/PepperDashEssentials/PepperDashEssentials.csproj +++ b/PepperDashEssentials/PepperDashEssentials.csproj @@ -120,6 +120,7 @@ + @@ -195,7 +196,7 @@ - + diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs index a739511a..6a8dc7ce 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/JoinMaps/JoinMapBase.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using Crestron.SimplSharp; +using PepperDash.Core; using PepperDash.Essentials.Core.Config; using Newtonsoft.Json; @@ -42,24 +43,101 @@ namespace PepperDash.Essentials.Core /// public abstract void OffsetJoinNumbers(uint joinStart); - public Dictionary Joins { get; set; } + /// + /// The collection of joins and associated metadata + /// + public Dictionary Joins = new Dictionary(); + + /// + /// Prints the join information to console + /// + public void PrintJoinMapInfo() + { + Debug.Console(0, "{0}:\n", this.GetType().Name); + + // Get the joins of each type and print them + Debug.Console(0, "Digitals:"); + var digitals = Joins.Where(j => (j.Value.JoinType & eJoinType.Digital) == eJoinType.Digital).ToDictionary(j => j.Key, j => j.Value); + PrintJoinList(GetSortedJoins(digitals)); + + Debug.Console(0, "Analogs:"); + var analogs = Joins.Where(j => (j.Value.JoinType & eJoinType.Analog) == eJoinType.Analog).ToDictionary(j => j.Key, j => j.Value); + PrintJoinList(GetSortedJoins(analogs)); + + Debug.Console(0, "Serials:"); + var serials = Joins.Where(j => (j.Value.JoinType & eJoinType.Serial) == eJoinType.Serial).ToDictionary(j => j.Key, j => j.Value); + PrintJoinList(GetSortedJoins(serials)); + + } + + /// + /// Returns a sorted list by JoinNumber + /// + /// + /// + List> GetSortedJoins(Dictionary joins) + { + var sortedJoins = joins.ToList(); + + sortedJoins.Sort((pair1, pair2) => pair1.Value.JoinNumber.CompareTo(pair2.Value.JoinNumber)); + + return sortedJoins; + } + + void PrintJoinList(List> joins) + { + foreach (var join in joins) + { + Debug.Console(0, + @"Join Number: {0} | Label: '{1}' | JoinSpan: '{2}' | Type: '{3}' | Capabilities: '{4}'", + join.Value.JoinNumber, + join.Value.Label, + join.Value.JoinSpan, + join.Value.JoinType.ToString(), + join.Value.JoinCapabilities.ToString()); + } + } + + /// + /// Returns the join number for the join with the specified key + /// + /// + /// + public uint GetJoinForKey(string key) + { + if (Joins.ContainsKey(key)) + return Joins[key].JoinNumber; + + else return 0; + } + + } /// /// Read = Provides feedback to SIMPL /// Write = Responds to sig values from SIMPL /// + [Flags] public enum eJoinCapabilities { - Read = 1, - Write = 2 + None = 0, + ToSIMPL = 1, + FromSIMPL = 2, + ToFromSIMPL = ToSIMPL | FromSIMPL } + [Flags] public enum eJoinType { + None = 0, Digital = 1, Analog = 2, - Serial = 4 + Serial = 4, + DigitalAnalog = Digital | Analog, + DigitalSerial = Digital | Serial, + AnalogSerial = Analog | Serial, + DigitalAnalogSerial = Digital | Analog | Serial } /// @@ -95,7 +173,4 @@ namespace PepperDash.Essentials.Core } - - - } \ No newline at end of file diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraVisca.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraVisca.cs index bcf6a4f9..3d50079b 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraVisca.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Cameras/CameraVisca.cs @@ -11,7 +11,7 @@ using Crestron.SimplSharp.Reflection; namespace PepperDash.Essentials.Devices.Common.Cameras { - public class CameraVisca : CameraBase, IHasCameraPtzControl, ICommunicationMonitor, IHasCameraPresets + public class CameraVisca : CameraBase, IHasCameraPtzControl, ICommunicationMonitor, IHasCameraPresets, IPower { public IBasicCommunication Communication { get; private set; } public CommunicationGather PortGather { get; private set; } @@ -135,6 +135,15 @@ namespace PepperDash.Essentials.Devices.Common.Cameras { SendBytes(new Byte[] {0x81, 0x01, 0x04, 0x00, 0x03, 0xFF}); } + + public void PowerToggle() + { + if (PowerIsOnFeedback.BoolValue) + PowerOff(); + else + PowerOn(); + } + public void PanLeft() { SendPanTiltCommand(new byte[] {0x01, 0x03}); diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/BiampTesira/BiampTesiraForteDspLevel.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/BiampTesira/BiampTesiraForteDspLevel.cs index d0f83115..15d424a2 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/BiampTesira/BiampTesiraForteDspLevel.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/BiampTesira/BiampTesiraForteDspLevel.cs @@ -10,6 +10,19 @@ using System.Text.RegularExpressions; namespace PepperDash.Essentials.Devices.Common.DSP { + public interface IBiampTesiraDspLevelControl : IBasicVolumeWithFeedback + { + /// + /// In BiAmp: Instance Tag, QSC: Named Control, Polycom: + /// + string ControlPointTag { get; } + int Index1 { get; } + int Index2 { get; } + bool HasMute { get; } + bool HasLevel { get; } + bool AutomaticUnmuteOnVolumeUp { get; } + } + public class TesiraForteLevelControl : TesiraForteControlPoint, IBiampTesiraDspLevelControl, IKeyed { bool _IsMuted; diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/DspBase.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/DspBase.cs index 36c655d2..cdb832ab 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/DspBase.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/DspBase.cs @@ -49,27 +49,4 @@ namespace PepperDash.Essentials.Devices.Common.DSP { } - - - // Main program - // VTC - // ATC - // Mics, unusual - - public interface IBiampTesiraDspLevelControl : IBasicVolumeWithFeedback - { - /// - /// In BiAmp: Instance Tag, QSC: Named Control, Polycom: - /// - string ControlPointTag { get; } -#warning I dont think index1 and index2 should be a part of the interface. JTA 2018-07-17 - int Index1 { get; } - int Index2 { get; } - bool HasMute { get; } - bool HasLevel { get; } - bool AutomaticUnmuteOnVolumeUp { get; } - } - - - } \ No newline at end of file diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Power Controllers/Digitallogger.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Power Controllers/Digitallogger.cs index e48a5b7b..5003f795 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Power Controllers/Digitallogger.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Power Controllers/Digitallogger.cs @@ -103,7 +103,7 @@ namespace PepperDash.Essentials.Devices.Common }); CircuitIsCritical[circuit] = new BoolFeedback(() => { - if (CircuitStatus[circuit].critical != null) + if (CircuitStatus[circuit] != null) { return CircuitStatus[circuit].critical; } @@ -114,7 +114,7 @@ namespace PepperDash.Essentials.Devices.Common }); CircuitState[circuit] = new BoolFeedback(() => { - if (CircuitStatus[circuit].state != null) + if (CircuitStatus[circuit] != null) { return CircuitStatus[circuit].state; } diff --git a/essentials-framework/pepperdashcore-builds b/essentials-framework/pepperdashcore-builds index 45949f09..2d9c383d 160000 --- a/essentials-framework/pepperdashcore-builds +++ b/essentials-framework/pepperdashcore-builds @@ -1 +1 @@ -Subproject commit 45949f09bdcf6548be7fdf5c860ea4e3a5cf152d +Subproject commit 2d9c383db02ef3ef69dee8d42201c746fdfe79ea