From 2028fa308a0f6a2e5cb02c212d246a4c23dfaad0 Mon Sep 17 00:00:00 2001 From: Neil Dorin Date: Fri, 15 Sep 2017 11:13:59 -0600 Subject: [PATCH 1/3] Updates to xStatus an CiscoCodec to remove compile errors (duplicate objects, InputPort actions) --- .../VC/CiscoCodec/CiscoCodec.cs | 37 +++++++++++++++---- .../VC/CiscoCodec/xStatus.cs | 20 ---------- 2 files changed, 29 insertions(+), 28 deletions(-) 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 9e661e88..93ee8753 100644 --- a/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs +++ b/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs @@ -132,8 +132,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco socket.ConnectionChange += new EventHandler(socket_ConnectionChange); } - InputPorts.Add(new RoutingInputPort(RoutingPortNames.HdmiIn1, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, new Action(SelectPresentationSource(1)), this)); - InputPorts.Add(new RoutingInputPort(RoutingPortNames.HdmiIn2, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, new Action(SelectPresentationSource(2)), this)); + InputPorts.Add(new RoutingInputPort(RoutingPortNames.HdmiIn1, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, new Action(SelectPresentationSource1), this)); + InputPorts.Add(new RoutingInputPort(RoutingPortNames.HdmiIn2, eRoutingSignalType.AudioVideo, eRoutingPortConnectionType.Hdmi, new Action(SelectPresentationSource2), this)); //Debug.Console(1, this, "Starting Cisco API Server"); @@ -203,17 +203,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco /// void Port_LineReceived(object dev, GenericCommMethodReceiveTextArgs args) { - if (Debug.Level == 1) + if (Debug.Level == 2) { if(!JsonFeedbackMessageIsIncoming) - Debug.Console(1, this, "RX: '{0}'", args.Text); + Debug.Console(2, this, "RX: '{0}'", args.Text); } if (args.Text == "{" + Delimiter) // Check for the beginning of a new JSON message { JsonFeedbackMessageIsIncoming = true; - Debug.Console(1, this, "Incoming JSON message..."); + Debug.Console(2, this, "Incoming JSON message..."); JsonMessage = new StringBuilder(); } @@ -223,7 +223,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco JsonMessage.Append(args.Text); - Debug.Console(1, this, "Complete JSON Received:\n{0}", JsonMessage.ToString()); + Debug.Console(2, this, "Complete JSON Received:\n{0}", JsonMessage.ToString()); // Forward the complete message to be deserialized DeserializeResponse(JsonMessage.ToString()); @@ -489,8 +489,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco protected override Func ReceiveMuteFeedbackFunc { get { return () => false; } } - protected override Func PrivacyModeFeedbackFunc { get { return () => false; } } - /// /// Gets the first CallId or returns null /// @@ -543,8 +541,31 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco StartSharing(); } + /// + /// Select source 1 as the presetnation source + /// + public void SelectPresentationSource1() + { + SelectPresentationSource(1); + } + + /// + /// Select source 2 as the presetnation source + /// + public void SelectPresentationSource2() + { + SelectPresentationSource(2); + } + public override void StartSharing() { + string sendingMode = string.Empty; + + if (InCallFeedback.BoolValue) + sendingMode = "LocalRemote"; + else + sendingMode = "LocalOnly"; + SendText(string.Format("xCommand Presentation Start PresentationSource: {0}", PresentationSource)); } diff --git a/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/xStatus.cs b/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/xStatus.cs index 44cec29f..35fa2a77 100644 --- a/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/xStatus.cs +++ b/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/xStatus.cs @@ -1524,26 +1524,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco public string Value { get; set; } } - public class DisplayName - { - public string Value { get; set; } - } - public class Duration { public string Value { get; set; } } - public class Type - { - public string Value { get; set; } - } - - public class Encryption - { - public string id { get; set; } - public Type Type { get; set; } - } public class FacilityServiceId { @@ -1575,11 +1560,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco public string Value { get; set; } } - public class Status2 - { - public string Value { get; set; } - } - public class TransmitCallRate { public string Value { get; set; } From 9b85456f2e79c7fd2cb00fde3148afc5ee301863 Mon Sep 17 00:00:00 2001 From: Neil Dorin Date: Fri, 15 Sep 2017 11:47:45 -0600 Subject: [PATCH 2/3] Updated ICodecAudio interface to break out individual functions to their own interfaces and not assume all to be applied to VideoCodecBase. Updated affected classes as a result. --- .../Devices/CodecInterfaces.cs | 46 +++++++++ .../Devices/IVolumeAndAudioInterfaces.cs | 31 ------ .../VC/CiscoCodec/CiscoCodec.cs | 60 ------------ .../VC/MockVC/MockVC.cs | 94 +------------------ .../VC/VideoCodecBase.cs | 64 ++++--------- 5 files changed, 69 insertions(+), 226 deletions(-) diff --git a/Essentials Core/PepperDashEssentialsBase/Devices/CodecInterfaces.cs b/Essentials Core/PepperDashEssentialsBase/Devices/CodecInterfaces.cs index 5135ac07..a5e84b12 100644 --- a/Essentials Core/PepperDashEssentialsBase/Devices/CodecInterfaces.cs +++ b/Essentials Core/PepperDashEssentialsBase/Devices/CodecInterfaces.cs @@ -27,6 +27,52 @@ namespace PepperDash.Essentials.Core } + /// + /// Defines minimum volume controls for a codec device with dialing capabilities + /// + public interface ICodecAudio : IBasicVolumeWithFeedback, ICodecPrivacy + { + + } + + /// + /// Adds control of codec receive volume + /// + public interface ICodecReceiveVolume + { + // Break this out into 3 interfaces + void SetReceiveVolume(ushort level); + void ReceiveMuteOn(); + void ReceiveMuteOff(); + void ReceiveMuteToggle(); + IntFeedback ReceiveLevelFeedback { get; } + BoolFeedback ReceiveMuteIsOnFeedback { get; } + } + + /// + /// Adds control of codec transmit volume + /// + public interface ICodecTransmitVolume + { + void SetTransmitVolume(ushort level); + void TransmitMuteOn(); + void TransmitMuteOff(); + void TransmitMuteToggle(); + IntFeedback TransmitLevelFeedback { get; } + BoolFeedback TransmitMuteIsOnFeedback { get; } + } + + /// + /// Adds control of codec privacy function (microphone mute) + /// + public interface ICodecPrivacy + { + void PrivacyModeOn(); + void PrivacyModeOff(); + void PrivacyModeToggle(); + BoolFeedback PrivacyModeIsOnFeedback { get; } + } + public interface IHasCallHistory { // Add recent calls list diff --git a/Essentials Core/PepperDashEssentialsBase/Devices/IVolumeAndAudioInterfaces.cs b/Essentials Core/PepperDashEssentialsBase/Devices/IVolumeAndAudioInterfaces.cs index 9990b2ed..c2b3ded9 100644 --- a/Essentials Core/PepperDashEssentialsBase/Devices/IVolumeAndAudioInterfaces.cs +++ b/Essentials Core/PepperDashEssentialsBase/Devices/IVolumeAndAudioInterfaces.cs @@ -68,37 +68,6 @@ namespace PepperDash.Essentials.Core IntFeedback DefaultVolumeFeedback { get; } } - /// - /// Defines minimum volume controls for a codec device with dialing capabilities - /// - public interface ICodecAudio - { - // ICodecReceiveVolume - // Break this out into 3 interfaces - void SetReceiveVolume(ushort level); - void ReceiveMuteOn(); - void ReceiveMuteOff(); - void ReceiveMuteToggle(); - IntFeedback ReceiveLevelFeedback { get; } - BoolFeedback ReceiveMuteIsOnFeedback { get; } - - // ICodecTransmitVolume - void SetTransmitVolume(ushort level); - void TransmitMuteOn(); - void TransmitMuteOff(); - void TransmitMuteToggle(); - IntFeedback TransmitLevelFeedback { get; } - BoolFeedback TransmitMuteIsOnFeedback { get; } - - // ICodecPrivacy - void PrivacyModeOn(); - void PrivacyModeOff(); - void PrivacyModeToggle(); - BoolFeedback PrivacyModeIsOnFeedback { get; } - } - - - /// /// A class that implements this, contains a reference to an IBasicVolumeControls device. /// For example, speakers attached to an audio zone. The speakers can provide reference 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 f166f89f..67f47dbe 100644 --- a/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs +++ b/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs @@ -490,10 +490,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco protected override Func IncomingCallFeedbackFunc { get { return () => false; } } - protected override Func TransmitMuteFeedbackFunc { get { return () => false; } } - - protected override Func ReceiveMuteFeedbackFunc { get { return () => false; } } - /// /// Gets the first CallId or returns null /// @@ -579,46 +575,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco SendText(string.Format("xCommand Presentation Stop PresentationSource: {0}", PresentationSource)); } - public override void ReceiveMuteOff() - { - - } - - public override void ReceiveMuteOn() - { - - } - - public override void ReceiveMuteToggle() - { - - } - - public override void SetReceiveVolume(ushort level) - { - - } - - public override void TransmitMuteOff() - { - - } - - public override void TransmitMuteOn() - { - - } - - public override void TransmitMuteToggle() - { - - } - - public override void SetTransmitVolume(ushort level) - { - - } - public override void PrivacyModeOn() { SendText("xCommand Audio Microphones Mute"); @@ -708,22 +664,6 @@ 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 1a837900..7f8cdaaa 100644 --- a/Essentials Devices Common/Essentials Devices Common/VC/MockVC/MockVC.cs +++ b/Essentials Devices Common/Essentials Devices Common/VC/MockVC/MockVC.cs @@ -18,7 +18,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec 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 @@ -33,19 +32,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec } bool _IncomingCall; - - - protected override Func TransmitMuteFeedbackFunc - { - get { return () => _TransmitMute; } - } - bool _TransmitMute; - - protected override Func ReceiveMuteFeedbackFunc - { - get { return () => _ReceiveMute; } - } - bool _ReceiveMute; protected override Func PrivacyModeFeedbackFunc { @@ -155,86 +141,14 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec VolumeLevelFeedback.FireUpdate(); } - - /// - /// - /// - public override void ReceiveMuteOff() + public override void VolumeDown(bool pressRelease) { - Debug.Console(1, this, "ReceiveMuteOff"); - - if (!_ReceiveMute) - return; - _ReceiveMute = false; - ReceiveMuteIsOnFeedback.FireUpdate(); + } - /// - /// - /// - public override void ReceiveMuteOn() + public override void VolumeUp(bool pressRelease) { - Debug.Console(1, this, "ReceiveMuteOn"); - if (_ReceiveMute) - return; - ReceiveMuteIsOnFeedback.FireUpdate(); - } - - /// - /// - /// - public override void ReceiveMuteToggle() - { - Debug.Console(1, this, "ReceiveMuteToggle"); - - _ReceiveMute = !_ReceiveMute; - ReceiveMuteIsOnFeedback.FireUpdate(); - } - - /// - /// - /// - /// - public override void SetReceiveVolume(ushort level) - { - Debug.Console(1, this, "SetReceiveVolume: {0}", level); - - } - - /// - /// - /// - public override void TransmitMuteOff() - { - Debug.Console(1, this, "TransmitMuteOff"); - - if (!_TransmitMute) - return; - _TransmitMute = false; - TransmitMuteIsOnFeedback.FireUpdate(); - } - - /// - /// - /// - public override void TransmitMuteOn() - { - Debug.Console(1, this, "TransmitMuteOn"); - if (_TransmitMute) - return; - TransmitMuteIsOnFeedback.FireUpdate(); - } - - public override void TransmitMuteToggle() - { - _TransmitMute = !_TransmitMute; - Debug.Console(1, this, "TransmitMuteToggle: {0}", _TransmitMute); - TransmitMuteIsOnFeedback.FireUpdate(); - } - - public override void SetTransmitVolume(ushort level) - { - Debug.Console(1, this, "SetTransmitVolume: {0}", level); + } public override void PrivacyModeOn() diff --git a/Essentials Devices Common/Essentials Devices Common/VC/VideoCodecBase.cs b/Essentials Devices Common/Essentials Devices Common/VC/VideoCodecBase.cs index 59aef5ab..a0a80f49 100644 --- a/Essentials Devices Common/Essentials Devices Common/VC/VideoCodecBase.cs +++ b/Essentials Devices Common/Essentials Devices Common/VC/VideoCodecBase.cs @@ -9,7 +9,7 @@ using PepperDash.Essentials.Core; namespace PepperDash.Essentials.Devices.Common.VideoCodec { - public abstract class VideoCodecBase : Device, IRoutingSinkWithSwitching, IUsageTracking, IHasDialer, IHasSharing, IBasicVolumeWithFeedback //, ICodecAudio + public abstract class VideoCodecBase : Device, IRoutingSinkWithSwitching, IUsageTracking, IHasDialer, IHasSharing, ICodecAudio { #region IUsageTracking Members @@ -28,8 +28,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec abstract protected Func InCallFeedbackFunc { get; } abstract protected Func IncomingCallFeedbackFunc { get; } - abstract protected Func TransmitMuteFeedbackFunc { get; } - abstract protected Func ReceiveMuteFeedbackFunc { get; } abstract protected Func PrivacyModeFeedbackFunc { get; } #warning WILL ADD TRANSMIT AND REVEICE LEVEL FUNCS AFTER MERGE @@ -41,8 +39,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec { InCallFeedback = new BoolFeedback(InCallFeedbackFunc); IncomingCallFeedback = new BoolFeedback(IncomingCallFeedbackFunc); - ReceiveMuteIsOnFeedback = new BoolFeedback(ReceiveMuteFeedbackFunc); - TransmitMuteIsOnFeedback = new BoolFeedback(TransmitMuteFeedbackFunc); PrivacyModeIsOnFeedback = new BoolFeedback(PrivacyModeFeedbackFunc); #warning ADDING TX/RX FEEDBACKS HERE @@ -82,8 +78,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec { InCallFeedback, IncomingCallFeedback, - ReceiveMuteIsOnFeedback, - TransmitMuteIsOnFeedback, PrivacyModeIsOnFeedback }; } @@ -93,25 +87,29 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec #region ICodecAudio Members - public IntFeedback ReceiveLevelFeedback { get; private set; } - public BoolFeedback ReceiveMuteIsOnFeedback { get; private set; } - public abstract void ReceiveMuteOff(); - public abstract void ReceiveMuteOn(); - public abstract void ReceiveMuteToggle(); - public abstract void SetReceiveVolume(ushort level); - - public IntFeedback TransmitLevelFeedback { get; private set; } - public BoolFeedback TransmitMuteIsOnFeedback { get; private set; } - public abstract void TransmitMuteOff(); - public abstract void TransmitMuteOn(); - public abstract void TransmitMuteToggle(); - public abstract void SetTransmitVolume(ushort level); - public abstract void PrivacyModeOn(); public abstract void PrivacyModeOff(); public abstract void PrivacyModeToggle(); public BoolFeedback PrivacyModeIsOnFeedback { get; private set; } + + public BoolFeedback MuteFeedback { get; private set; } + + public abstract void MuteOff(); + + public abstract void MuteOn(); + + public abstract void SetVolume(ushort level); + + public IntFeedback VolumeLevelFeedback { get; private set; } + + public abstract void MuteToggle(); + + public abstract void VolumeDown(bool pressRelease); + + + public abstract void VolumeUp(bool pressRelease); + #endregion #region IHasSharing Members @@ -123,30 +121,6 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec #endregion - #region IBasicVolumeWithFeedback Members - public BoolFeedback MuteFeedback { get; private set; } - - public abstract void MuteOff(); - - public abstract void MuteOn(); - - public abstract void SetVolume(ushort level); - - public IntFeedback VolumeLevelFeedback { get; private set; } - - #endregion - - #region IBasicVolumeControls Members - - public abstract void MuteToggle(); - - public abstract void VolumeDown(bool pressRelease); - - - public abstract void VolumeUp(bool pressRelease); - - - #endregion } } \ No newline at end of file From 253095cb93a4896b508343036239847c60b527ab Mon Sep 17 00:00:00 2001 From: Neil Dorin Date: Fri, 15 Sep 2017 17:02:22 -0600 Subject: [PATCH 3/3] EOD commit. Working on integrating Crestron OBTP library --- .../References/Cisco One Button To Push.dll | Bin 66232 -> 66744 bytes .../VC/CiscoCodec/CiscoCodec.cs | 41 +++++++++++++++--- .../PepperDashEssentials/ControlSystem.cs | 10 +++-- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/Essentials Devices Common/Essentials Devices Common/References/Cisco One Button To Push.dll b/Essentials Devices Common/Essentials Devices Common/References/Cisco One Button To Push.dll index 10a391228dcb6a8d0ca0529269c4c7f31e53e2de..a6fcd201d21865dfde9561ed3666206cff0a5a23 100644 GIT binary patch literal 66744 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 literal 66232 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 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 67f47dbe..72af49a5 100644 --- a/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs +++ b/Essentials Devices Common/Essentials Devices Common/VC/CiscoCodec/CiscoCodec.cs @@ -26,6 +26,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco public StatusMonitorBase CommunicationMonitor { get; private set; } + public BoolFeedback StandbyIsOnFeedback { get; private set; } + private CiscoOneButtonToPush CodecObtp; private Corporate_Phone_Book PhoneBook; @@ -92,15 +94,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco int PresentationSource; + public bool CommDebuggingIsOn; + // Constructor for IBasicCommunication public CiscoCodec(string key, string name, IBasicCommunication comm, int serverPort) : base(key, name) { + StandbyIsOnFeedback = new BoolFeedback(StandbyStateFeedbackFunc); + Communication = comm; SyncState = new CodecSyncState(key + "--sync"); PortGather = new CommunicationGather(Communication, Delimiter); + PortGather.IncludeDelimiter = true; PortGather.LineReceived += this.Port_LineReceived; //ServerPort = serverPort; @@ -116,6 +123,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco CodecEvent = new CiscoCodecEvents.RootObject(); CodecStatus.Status.Audio.Volume.ValueChangedAction = VolumeLevelFeedback.FireUpdate; + CodecStatus.Status.Audio.VolumeMute.ValueChangedAction = MuteFeedback.FireUpdate; + CodecStatus.Status.Audio.Microphones.Mute.ValueChangedAction = PrivacyModeIsOnFeedback.FireUpdate; + CodecStatus.Status.Standby.State.ValueChangedAction = StandbyIsOnFeedback.FireUpdate; //Client = new HttpsClient(); @@ -129,6 +139,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco public override bool CustomActivate() { CrestronConsole.AddNewConsoleCommand(SendText, "send" + Key, "", ConsoleAccessLevelEnum.AccessOperator); + CrestronConsole.AddNewConsoleCommand(SetCommDebug, "SetCiscoCommDebug", "0 for Off, 1 for on", ConsoleAccessLevelEnum.AccessOperator); + + Communication.Connect(); var socket = Communication as ISocketStatus; @@ -193,6 +206,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco return base.CustomActivate(); } + public void SetCommDebug(string s) + { + if (s == "1") + { + CommDebuggingIsOn = true; + Debug.Console(0, this, "Comm Debug Enabled."); + } + else + { + CommDebuggingIsOn = false; + Debug.Console(0, this, "Comm Debug Disabled."); + } + } + void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs e) { // Reset sync status on disconnect @@ -208,17 +235,18 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco /// void Port_LineReceived(object dev, GenericCommMethodReceiveTextArgs args) { - if (Debug.Level == 2) + if (CommDebuggingIsOn) { if(!JsonFeedbackMessageIsIncoming) - Debug.Console(2, this, "RX: '{0}'", args.Text); + Debug.Console(1, this, "RX: '{0}'", args.Text); } if (args.Text == "{" + Delimiter) // Check for the beginning of a new JSON message { JsonFeedbackMessageIsIncoming = true; - Debug.Console(2, this, "Incoming JSON message..."); + if (CommDebuggingIsOn) + Debug.Console(1, this, "Incoming JSON message..."); JsonMessage = new StringBuilder(); } @@ -228,7 +256,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco JsonMessage.Append(args.Text); - Debug.Console(2, this, "Complete JSON Received:\n{0}", JsonMessage.ToString()); + if (CommDebuggingIsOn) + Debug.Console(1, this, "Complete JSON Received:\n{0}", JsonMessage.ToString()); // Forward the complete message to be deserialized DeserializeResponse(JsonMessage.ToString()); @@ -269,7 +298,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.Cisco public void SendText(string command) { - Debug.Console(1, this, "Sending: '{0}'", command); + if (CommDebuggingIsOn) + Debug.Console(1, this, "Sending: '{0}'", command); + Communication.SendText(command + Delimiter); } diff --git a/Essentials/PepperDashEssentials/ControlSystem.cs b/Essentials/PepperDashEssentials/ControlSystem.cs index 20288baf..f46e4ff8 100644 --- a/Essentials/PepperDashEssentials/ControlSystem.cs +++ b/Essentials/PepperDashEssentials/ControlSystem.cs @@ -128,12 +128,14 @@ 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.CommDebuggingIsOn = true; + + TestCodec.CustomActivate(); // CODEC TESTING }