diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
index 30f263e6..f3891dde 100644
--- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
+++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoom.cs
@@ -32,8 +32,20 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private const long MeetingRefreshTimer = 60000;
public uint DefaultMeetingDurationMin { get; private set; }
- private const string Delimiter = "\x0D\x0A";
+ ///
+ /// CR LF
+ ///
+ private const string EchoDelimiter = "\x0D\x0A\x0D\x0A";
+ private const string SendDelimiter = "\x0D";
+
+ ///
+ /// CR LF } CR LF
+ ///
+ private const string JsonDelimiter = "\x0D\x0A\x7D\x0D\x0A";
+
+ private string[] Delimiters = new string[] { EchoDelimiter, JsonDelimiter, "OK\x0D\x0A", "end\x0D\x0A" };
+ //"echo off\x0D\x0A\x0A\x0D\x0A"
private readonly GenericQueue _receiveQueue;
//private readonly CrestronQueue _receiveQueue;
@@ -71,7 +83,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
else
{
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, 30000, 120000, 300000,
- "zStatus SystemUnit\r");
+ "zStatus SystemUnit" + SendDelimiter);
}
DeviceManager.AddDevice(CommunicationMonitor);
@@ -86,9 +98,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
_syncState.InitialSyncCompleted += SyncState_InitialSyncCompleted;
+ _syncState.FirstJsonResponseReceived += (o, a) => SetUpSyncQueries();
+
PhonebookSyncState = new CodecPhonebookSyncState(Key + "--PhonebookSync");
- PortGather = new CommunicationGather(Communication, "\x0A") {IncludeDelimiter = true};
+ PortGather = new CommunicationGather(Communication, Delimiters) {IncludeDelimiter = true};
PortGather.LineReceived += Port_LineReceived;
CodecOsdIn = new RoutingInputPort(RoutingPortNames.CodecOsd,
@@ -904,7 +918,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
Debug.Console(1, this, "Sending: '{0}'", command);
}
- Communication.SendText(command + Delimiter);
+ Communication.SendText(command + SendDelimiter);
}
///
@@ -914,13 +928,28 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
///
private void Port_LineReceived(object dev, GenericCommMethodReceiveTextArgs args)
{
- //if (CommDebuggingIsOn)
- // Debug.Console(1, this, "Gathered: '{0}'", args.Text);
+ //Debug.Console(0, this, "Port_LineReceived");
- _receiveQueue.Enqueue(new ProcessStringMessage(args.Text, ProcessMessage));
+ if (args.Delimiter != JsonDelimiter)
+ {
+// Debug.Console(0, this,
+//@"Non JSON response:
+//Delimiter: {0}
+//{1}", ComTextHelper.GetDebugText(args.Delimiter), args.Text);
+ ProcessNonJsonResponse(args.Text);
+ return;
+ }
+ else
+ {
+// Debug.Console(0, this,
+//@"JSON response:
+//Delimiter: {0}
+//{1}", ComTextHelper.GetDebugText(args.Delimiter), args.Text);
+ _receiveQueue.Enqueue(new ProcessStringMessage(args.Text, DeserializeResponse));
+ //_receiveQueue.Enqueue(new ProcessStringMessage(args.Text, ProcessMessage));
+ }
}
-
///
/// Queues the initial queries to be sent upon connection
///
@@ -979,6 +1008,84 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
_syncState.StartSync();
}
+ private void SetupSession()
+ {
+ // disable echo of commands
+ SendText("echo off");
+ // switch to json format
+ // set feedback exclusions
+ // Currently the feedback exclusions don't work when using the API in JSON response mode
+ // But leave these here in case the API gets updated in the future
+ // These may work as of 5.9.4
+ if (_props.DisablePhonebookAutoDownload)
+ {
+ SendText("zFeedback Register Op: ex Path: /Event/Phonebook/AddedContact");
+ }
+ SendText("zFeedback Register Op: ex Path: /Event/InfoResult/Info/callin_country_list");
+ SendText("zFeedback Register Op: ex Path: /Event/InfoResult/Info/callout_country_list");
+ SendText("zFeedback Register Op: ex Path: /Event/InfoResult/Info/toll_free_callinLlist");
+
+ SendText("zStatus SystemUnit");
+ }
+
+ ///
+ /// Processes non-JSON responses as their are received
+ ///
+ ///
+ private void ProcessNonJsonResponse(string response)
+ {
+ if (response.Contains("client_loop: send disconnect: Broken pipe"))
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error,
+ "Zoom Room Controller or App connected. Essentials will NOT control the Zoom Room until it is disconnected.");
+
+ return;
+ }
+
+ if (!_syncState.InitialSyncComplete)
+ {
+ if(response.ToLower().Contains("*r login successful"))
+ {
+ _syncState.LoginResponseReceived();
+
+ SendText("format json");
+
+ SetupSession();
+ }
+
+ //switch (response.Trim().ToLower()) // remove the whitespace
+ //{
+ // case "*r login successful":
+ // {
+ // _syncState.LoginMessageReceived();
+
+ // //// Fire up a thread to send the intial commands.
+ // //CrestronInvoke.BeginInvoke(o =>
+ // //{
+ // // disable echo of commands
+ // SendText("echo off");
+ // // switch to json format
+ // SendText("format json");
+ // // set feedback exclusions
+ // // Currently the feedback exclusions don't work when using the API in JSON response mode
+ // // But leave these here in case the API gets updated in the future
+ // // These may work as of 5.9.4
+ // if (_props.DisablePhonebookAutoDownload)
+ // {
+ // SendText("zFeedback Register Op: ex Path: /Event/Phonebook/AddedContact");
+ // }
+ // SendText("zFeedback Register Op: ex Path: /Event/InfoResult/Info/callin_country_list");
+ // SendText("zFeedback Register Op: ex Path: /Event/InfoResult/Info/callout_country_list");
+ // SendText("zFeedback Register Op: ex Path: /Event/InfoResult/Info/toll_free_callinLlist");
+
+ // //});
+
+ // break;
+ // }
+ //}
+ }
+ }
+
///
/// Processes messages as they are dequeued
///
@@ -1006,7 +1113,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
//Debug.Console(2, this, "JSON Curly Brace Count: {0}", _jsonCurlyBraceCounter);
- if (!_jsonFeedbackMessageIsIncoming && message.Trim('\x20') == "{" + Delimiter)
+ if (!_jsonFeedbackMessageIsIncoming && message.Trim('\x20') == "{" + EchoDelimiter)
// Check for the beginning of a new JSON message
{
_jsonFeedbackMessageIsIncoming = true;
@@ -1023,7 +1130,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
return;
}
- if (_jsonFeedbackMessageIsIncoming && message.Trim('\x20') == "}" + Delimiter)
+ if (_jsonFeedbackMessageIsIncoming && message.Trim('\x20') == "}" + EchoDelimiter)
// Check for the end of a JSON message
{
_jsonMessage.Append(message);
@@ -1068,7 +1175,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{
case "*r login successful":
{
- _syncState.LoginMessageReceived();
+ _syncState.LoginResponseReceived();
// Fire up a thread to send the intial commands.
@@ -1121,6 +1228,11 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var message = JObject.Parse(trimmedResponse);
+ if (!_syncState.FirstJsonResponseWasReceived)
+ {
+ _syncState.ReceivedFirstJsonResponse();
+ }
+
var eType =
(eZoomRoomResponseType)
Enum.Parse(typeof (eZoomRoomResponseType), message["type"].Value(), true);
@@ -1129,7 +1241,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
var responseObj = message[topKey];
- Debug.Console(1, "{0} Response Received. topKey: '{1}'\n{2}", eType, topKey, responseObj.ToString());
+ Debug.Console(1, this, "{0} Response Received. topKey: '{1}'\n{2}", eType, topKey, responseObj.ToString().Replace("\n", CrestronEnvironment.NewLine));
switch (eType)
{
@@ -1642,19 +1754,17 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
{
case "login":
{
- _syncState.LoginMessageReceived();
+ _syncState.LoginResponseReceived();
- if (!_syncState.InitialQueryMessagesWereSent)
- {
- SetUpSyncQueries();
- }
+ SetupSession();
JsonConvert.PopulateObject(responseObj.ToString(), Status.Login);
break;
}
case "systemunit":
- {
+ {
+
JsonConvert.PopulateObject(responseObj.ToString(), Status.SystemUnit);
break;
@@ -3060,7 +3170,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
handler(this, new LayoutInfoChangedEventArgs()
{
AvailableLayouts = AvailableLayouts,
- CurrentSelectedLayout = (zConfiguration.eLayoutStyle)Enum.Parse(typeof(zConfiguration.eLayoutStyle),LocalLayoutFeedback.StringValue, true),
+ CurrentSelectedLayout = (zConfiguration.eLayoutStyle)Enum.Parse(typeof(zConfiguration.eLayoutStyle),string.IsNullOrEmpty(LocalLayoutFeedback.StringValue) ? "None" : LocalLayoutFeedback.StringValue , true),
LayoutViewIsOnFirstPage = LayoutViewIsOnFirstPageFeedback.BoolValue,
LayoutViewIsOnLastPage = LayoutViewIsOnLastPageFeedback.BoolValue,
CanSwapContentWithThumbnail = CanSwapContentWithThumbnailFeedback.BoolValue,
@@ -3437,7 +3547,9 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
}
}
- public bool LoginMessageWasReceived { get; private set; }
+ public bool LoginResponseWasReceived { get; private set; }
+
+ public bool FirstJsonResponseWasReceived { get; private set; }
public bool InitialQueryMessagesWereSent { get; private set; }
@@ -3453,6 +3565,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public event EventHandler InitialSyncCompleted;
+ public event EventHandler FirstJsonResponseReceived;
+
public void StartSync()
{
DequeueQueries();
@@ -3475,13 +3589,26 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
_syncQueries.Enqueue(query);
}
- public void LoginMessageReceived()
+ public void LoginResponseReceived()
{
- LoginMessageWasReceived = true;
- Debug.Console(1, this, "Login Message Received.");
+ LoginResponseWasReceived = true;
+ Debug.Console(1, this, "Login Rsponse Received.");
CheckSyncStatus();
}
+ public void ReceivedFirstJsonResponse()
+ {
+ FirstJsonResponseWasReceived = true;
+ Debug.Console(1, this, "First JSON Response Received.");
+
+ var handler = FirstJsonResponseReceived;
+ if (handler != null)
+ {
+ handler(this, null);
+ }
+ CheckSyncStatus();
+ }
+
public void InitialQueryMessagesSent()
{
InitialQueryMessagesWereSent = true;
@@ -3506,7 +3633,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
public void CodecDisconnected()
{
_syncQueries.Clear();
- LoginMessageWasReceived = false;
+ LoginResponseWasReceived = false;
+ FirstJsonResponseWasReceived = false;
InitialQueryMessagesWereSent = false;
LastQueryResponseWasReceived = false;
CamerasHaveBeenSetUp = false;
@@ -3515,7 +3643,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
private void CheckSyncStatus()
{
- if (LoginMessageWasReceived && InitialQueryMessagesWereSent && LastQueryResponseWasReceived &&
+ if (LoginResponseWasReceived && FirstJsonResponseWasReceived && InitialQueryMessagesWereSent && LastQueryResponseWasReceived &&
CamerasHaveBeenSetUp)
{
InitialSyncComplete = true;
diff --git a/packages.config b/packages.config
index 10124bbd..41f858a6 100644
--- a/packages.config
+++ b/packages.config
@@ -1,3 +1,3 @@
-
+
\ No newline at end of file