From 4e4510308087144fef864245ea8dd4cd9da5c7c3 Mon Sep 17 00:00:00 2001 From: Neil Dorin Date: Thu, 19 Jul 2018 11:16:09 -0600 Subject: [PATCH] resolves ecs-797/770/755 Updates Interface extension classes and SourceDeviceMapDictionary to us consistent names --- .../Room/Cotija/CotijaSystemController.cs | 1377 ++++++++--------- .../IChannelExtensions.cs | 12 +- .../INumericExtensions.cs | 10 +- .../DeviceTypeInterfaces/IPowerExtensions.cs | 12 +- .../ISetTopBoxControlsExtensions.cs | 4 +- .../ITransportExtensions.cs | 8 +- .../RoomBridges/CotijaDdvc01RoomBridge.cs | 1222 +++++++-------- .../RoomBridges/SourceDeviceMapDictionary.cs | 52 +- Release Package/PepperDashEssentials.cpz | Bin 4119394 -> 4119536 bytes Release Package/PepperDashEssentials.dll | Bin 1825464 -> 1825464 bytes 10 files changed, 1354 insertions(+), 1343 deletions(-) diff --git a/PepperDashEssentials/Room/Cotija/CotijaSystemController.cs b/PepperDashEssentials/Room/Cotija/CotijaSystemController.cs index ea217f28..54261370 100644 --- a/PepperDashEssentials/Room/Cotija/CotijaSystemController.cs +++ b/PepperDashEssentials/Room/Cotija/CotijaSystemController.cs @@ -1,89 +1,89 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using Crestron.SimplSharp; -using Crestron.SimplSharp.CrestronIO; -using Crestron.SimplSharp.Reflection; -using Crestron.SimplSharpPro.CrestronThread; -using Crestron.SimplSharp.CrestronWebSocketClient; -using Crestron.SimplSharpPro; -using Crestron.SimplSharp.Net.Http; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -using PepperDash.Core; -using PepperDash.Essentials.Core; -using PepperDash.Essentials.Room.Cotija; - -namespace PepperDash.Essentials -{ - public class CotijaSystemController : Device - { - WebSocketClient WSClient; - - /// - /// Prevents post operations from stomping on each other and getting lost - /// - CEvent PostLockEvent = new CEvent(true, true); - - CEvent RegisterLockEvent = new CEvent(true, true); - - public CotijaConfig Config { get; private set; } - - Dictionary ActionDictionary = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - - Dictionary PushedActions = new Dictionary(); - - CTimer ServerHeartbeatCheckTimer; - - long ServerHeartbeatInterval = 20000; - - CTimer ServerReconnectTimer; - - long ServerReconnectInterval = 5000; - - string SystemUuid; - - List RoomBridges = new List(); - - long ButtonHeartbeatInterval = 1000; - - /// - /// Used for tracking HTTP debugging - /// - bool HttpDebugEnabled; - - /// - /// - /// - /// - /// - /// - public CotijaSystemController(string key, string name, CotijaConfig config) : base(key, name) - { - Config = config; - Debug.Console(0, this, "Mobile UI controller initializing for server:{0}", config.ServerUrl); - - CrestronConsole.AddNewConsoleCommand(AuthorizeSystem, - "mobileauth", "Authorizes system to talk to cotija server", ConsoleAccessLevelEnum.AccessOperator); - CrestronConsole.AddNewConsoleCommand(s => ShowInfo(), - "mobileinfo", "Shows information for current mobile control session", ConsoleAccessLevelEnum.AccessOperator); - CrestronConsole.AddNewConsoleCommand(s => { - s = s.Trim(); - if(!string.IsNullOrEmpty(s)) - { - HttpDebugEnabled = (s.Trim() != "0"); - } - CrestronConsole.ConsoleCommandResponse("HTTP Debug {0}", HttpDebugEnabled ? "Enabled" : "Disabled"); - }, - "mobilehttpdebug", "1 enables more verbose HTTP response debugging", ConsoleAccessLevelEnum.AccessOperator); - CrestronConsole.AddNewConsoleCommand(TestHttpRequest, +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using Crestron.SimplSharp; +using Crestron.SimplSharp.CrestronIO; +using Crestron.SimplSharp.Reflection; +using Crestron.SimplSharpPro.CrestronThread; +using Crestron.SimplSharp.CrestronWebSocketClient; +using Crestron.SimplSharpPro; +using Crestron.SimplSharp.Net.Http; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +using PepperDash.Core; +using PepperDash.Essentials.Core; +using PepperDash.Essentials.Room.Cotija; + +namespace PepperDash.Essentials +{ + public class CotijaSystemController : Device + { + WebSocketClient WSClient; + + /// + /// Prevents post operations from stomping on each other and getting lost + /// + CEvent PostLockEvent = new CEvent(true, true); + + CEvent RegisterLockEvent = new CEvent(true, true); + + public CotijaConfig Config { get; private set; } + + Dictionary ActionDictionary = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + + Dictionary PushedActions = new Dictionary(); + + CTimer ServerHeartbeatCheckTimer; + + long ServerHeartbeatInterval = 20000; + + CTimer ServerReconnectTimer; + + long ServerReconnectInterval = 5000; + + string SystemUuid; + + List RoomBridges = new List(); + + long ButtonHeartbeatInterval = 1000; + + /// + /// Used for tracking HTTP debugging + /// + bool HttpDebugEnabled; + + /// + /// + /// + /// + /// + /// + public CotijaSystemController(string key, string name, CotijaConfig config) : base(key, name) + { + Config = config; + Debug.Console(0, this, "Mobile UI controller initializing for server:{0}", config.ServerUrl); + + CrestronConsole.AddNewConsoleCommand(AuthorizeSystem, + "mobileauth", "Authorizes system to talk to cotija server", ConsoleAccessLevelEnum.AccessOperator); + CrestronConsole.AddNewConsoleCommand(s => ShowInfo(), + "mobileinfo", "Shows information for current mobile control session", ConsoleAccessLevelEnum.AccessOperator); + CrestronConsole.AddNewConsoleCommand(s => { + s = s.Trim(); + if(!string.IsNullOrEmpty(s)) + { + HttpDebugEnabled = (s.Trim() != "0"); + } + CrestronConsole.ConsoleCommandResponse("HTTP Debug {0}", HttpDebugEnabled ? "Enabled" : "Disabled"); + }, + "mobilehttpdebug", "1 enables more verbose HTTP response debugging", ConsoleAccessLevelEnum.AccessOperator); + CrestronConsole.AddNewConsoleCommand(TestHttpRequest, "mobilehttprequest", "Tests an HTTP get to URL given", ConsoleAccessLevelEnum.AccessOperator); - CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); + CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); } /// @@ -100,614 +100,613 @@ namespace PepperDash.Essentials })); } - } - - /// - /// Adds an action to the dictionary - /// - /// The path of the API command - /// The action to be triggered by the commmand - public void AddAction(string key, object action) - { - if (!ActionDictionary.ContainsKey(key)) - { - ActionDictionary.Add(key, action); - } - else - { - Debug.Console(1, this, "Cannot add action with key '{0}' because key already exists in ActionDictionary.", key); - } - } - - /// - /// Removes an action from the dictionary - /// - /// - public void RemoveAction(string key) - { - if (ActionDictionary.ContainsKey(key)) - ActionDictionary.Remove(key); - } - - /// - /// - /// - /// - public void AddBridge(CotijaBridgeBase bridge) - { - RoomBridges.Add(bridge); - var b = bridge as IDelayedConfiguration; - if (b != null) - { - Debug.Console(0, this, "Adding room bridge with delayed configuration"); - b.ConfigurationIsReady += new EventHandler(bridge_ConfigurationIsReady); - } - else - { - Debug.Console(0, this, "Adding room bridge and sending configuration"); - RegisterSystemToServer(); - } - } - - /// - /// - /// - /// - /// - void bridge_ConfigurationIsReady(object sender, EventArgs e) - { - Debug.Console(1, this, "Bridge ready. Registering"); - // send the configuration object to the server - RegisterSystemToServer(); - } - - /// - /// - /// - /// - void ReconnectToServerTimerCallback(object o) - { - RegisterSystemToServer(); - } - - /// - /// Verifies system connection with servers - /// - /// - void AuthorizeSystem(string code) - { - if (string.IsNullOrEmpty(code)) - { - CrestronConsole.ConsoleCommandResponse("Please enter a user code to authorize a system"); - return; - } - - var req = new HttpClientRequest(); - string url = string.Format("http://{0}/api/system/grantcode/{1}/{2}", Config.ServerUrl, code, SystemUuid); - Debug.Console(0, this, "Authorizing to: {0}", url); - - if (string.IsNullOrEmpty(Config.ServerUrl)) - { - CrestronConsole.ConsoleCommandResponse("Config URL address is not set. Check portal configuration"); - return; - } - try - { - req.Url.Parse(url); - new HttpClient().DispatchAsync(req, (r, e) => - { - CheckHttpDebug(r, e); - if (e == HTTP_CALLBACK_ERROR.COMPLETED) - { - if (r.Code == 200) - { - Debug.Console(0, "System authorized, sending config."); - RegisterSystemToServer(); - } - else if (r.Code == 404) - { - if (r.ContentString.Contains("codeNotFound")) - { - Debug.Console(0, "Authorization failed, code not found for system UUID {0}", SystemUuid); - } - else if (r.ContentString.Contains("uuidNotFound")) - { - Debug.Console(0, "Authorization failed, uuid {0} not found. Check Essentials configuration is correct", - SystemUuid); - } - } - } - else - Debug.Console(0, this, "Error {0} in authorizing system", e); - }); - } - catch (Exception e) - { - Debug.Console(0, this, "Error in authorizing: {0}", e); - } - } - - /// - /// Dumps info in response to console command. - /// - void ShowInfo() - { - var url = Config != null ? Config.ServerUrl : "No config"; - string name; - string code; - if (RoomBridges != null && RoomBridges.Count > 0) - { - name = RoomBridges[0].RoomName; - code = RoomBridges[0].UserCode; - } - else - { - name = "No config"; - code = "Not available"; - } - var conn = WSClient == null ? "No client" : (WSClient.Connected ? "Yes" : "No"); - - CrestronConsole.ConsoleCommandResponse(@"Mobile Control Information: - Server address: {0} - System Name: {1} - System UUID: {2} - System User code: {3} - Connected?: {4}", url, name, SystemUuid, - code, conn); - } - - /// - /// Registers the room with the server - /// - /// URL of the server, including the port number, if not 80. Format: "serverUrlOrIp:port" - void RegisterSystemToServer() - { - var ready = RegisterLockEvent.Wait(20000); - if (!ready) - { - Debug.Console(1, this, "RegisterSystemToServer failed to enter after 20 seconds. Ignoring"); - return; - } - RegisterLockEvent.Reset(); - - try - { - var confObject = ConfigReader.ConfigObject; - confObject.Info.RuntimeInfo.AppName = Assembly.GetExecutingAssembly().GetName().Name; - var version = Assembly.GetExecutingAssembly().GetName().Version; - confObject.Info.RuntimeInfo.AssemblyVersion = string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build); - confObject.Info.RuntimeInfo.OsVersion = Crestron.SimplSharp.CrestronEnvironment.OSVersion.Firmware; - - string postBody = JsonConvert.SerializeObject(confObject); - SystemUuid = confObject.SystemUuid; - - if (string.IsNullOrEmpty(postBody)) - { - Debug.Console(1, this, "ERROR: Config body is empty. Cannot register with server."); - } - else - { - var regClient = new HttpClient(); - regClient.Verbose = true; - regClient.KeepAlive = true; - - string url = string.Format("http://{0}/api/system/join/{1}", Config.ServerUrl, SystemUuid); - Debug.Console(1, this, "Joining server at {0}", url); - - HttpClientRequest request = new HttpClientRequest(); - request.Url.Parse(url); - request.RequestType = RequestType.Post; - request.Header.SetHeaderValue("Content-Type", "application/json"); - request.ContentString = postBody; - - var err = regClient.DispatchAsync(request, RegistrationConnectionCallback); - } - - } - catch (Exception e) - { - Debug.Console(0, this, "ERROR: Initilizing Room: {0}", e); - RegisterLockEvent.Set(); - StartReconnectTimer(); - } - - } - - /// - /// Sends a message to the server from a room - /// - /// room from which the message originates - /// object to be serialized and sent in post body - public void SendMessageToServer(JObject o) - { - - if (WSClient != null && WSClient.Connected) - { - string message = JsonConvert.SerializeObject(o, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); - Debug.Console(1, this, "Message TX: {0}", message); - var messageBytes = System.Text.Encoding.UTF8.GetBytes(message); - WSClient.Send(messageBytes, (uint)messageBytes.Length, WebSocketClient.WEBSOCKET_PACKET_TYPES.LWS_WS_OPCODE_07__TEXT_FRAME); - //WSClient.SendAsync(messageBytes, (uint)messageBytes.Length, WebSocketClient.WEBSOCKET_PACKET_TYPES.LWS_WS_OPCODE_07__TEXT_FRAME); - } - - } - - /// - /// Disconnects the SSE Client and stops the heartbeat timer - /// - /// - void DisconnectStreamClient(string command) - { - //if(SseClient != null) - // SseClient.Disconnect(); - - if (WSClient != null && WSClient.Connected) - WSClient.Disconnect(); - - if (ServerHeartbeatCheckTimer != null) - { - ServerHeartbeatCheckTimer.Stop(); - - ServerHeartbeatCheckTimer = null; - } - } - - /// - /// The callback that fires when we get a response from our registration attempt - /// - /// - /// - void RegistrationConnectionCallback(HttpClientResponse resp, HTTP_CALLBACK_ERROR err) - { - CheckHttpDebug(resp, err); - Debug.Console(1, this, "RegistrationConnectionCallback: {0}", err); - try - { - if (resp != null && resp.Code == 200) - { - if(ServerReconnectTimer != null) - { - ServerReconnectTimer.Stop(); - ServerReconnectTimer = null; - } - - // Success here! - ConnectStreamClient(); - } - else - { - if (resp != null) - Debug.Console(1, this, "Response from server: {0}\n{1}", resp.Code, err); - else - { - Debug.Console(1, this, "Null response received from server."); - } - StartReconnectTimer(); - } - } - catch (Exception e) - { - Debug.Console(1, this, "Error Initializing Stream Client: {0}", e); - StartReconnectTimer(); - } - RegisterLockEvent.Set(); - } - - /// - /// Executes when we don't get a heartbeat message in time. Triggers reconnect. - /// - /// For CTimer callback. Not used - void HeartbeatExpiredTimerCallback(object o) - { - Debug.Console(1, this, "Heartbeat Timer Expired."); - if (ServerHeartbeatCheckTimer != null) - { - ServerHeartbeatCheckTimer.Stop(); - ServerHeartbeatCheckTimer = null; - } - StartReconnectTimer(); - } - - /// - /// - /// - /// - /// - void StartReconnectTimer() - { - // Start the reconnect timer - if (ServerReconnectTimer == null) - { - ServerReconnectTimer = new CTimer(ReconnectToServerTimerCallback, null, ServerReconnectInterval, ServerReconnectInterval); - Debug.Console(1, this, "Reconnect Timer Started."); - } - ServerReconnectTimer.Reset(ServerReconnectInterval, ServerReconnectInterval); - } - - /// - /// - /// - /// - /// - void ResetOrStartHearbeatTimer() - { - if (ServerHeartbeatCheckTimer == null) - { - ServerHeartbeatCheckTimer = new CTimer(HeartbeatExpiredTimerCallback, null, ServerHeartbeatInterval, ServerHeartbeatInterval); - - Debug.Console(1, this, "Heartbeat Timer Started."); - } - - ServerHeartbeatCheckTimer.Reset(ServerHeartbeatInterval, ServerHeartbeatInterval); - } - - - /// - /// Connects the SSE Client - /// - /// - void ConnectStreamClient() - { - Debug.Console(0, this, "Initializing Stream client to server."); - - if (WSClient == null) - { - WSClient = new WebSocketClient(); - } - WSClient.URL = string.Format("wss://{0}/system/join/{1}", Config.ServerUrl, this.SystemUuid); - WSClient.Connect(); - Debug.Console(0, this, "Websocket connected"); - WSClient.ReceiveCallBack = WebsocketReceiveCallback; - //WSClient.SendCallBack = WebsocketSendCallback; - WSClient.ReceiveAsync(); - } - - /// - /// Resets reconnect timer and updates usercode - /// - /// - void HandleHeartBeat(JToken content) + } + + /// + /// Adds an action to the dictionary + /// + /// The path of the API command + /// The action to be triggered by the commmand + public void AddAction(string key, object action) + { + if (!ActionDictionary.ContainsKey(key)) + { + ActionDictionary.Add(key, action); + } + else + { + Debug.Console(1, this, "Cannot add action with key '{0}' because key already exists in ActionDictionary.", key); + } + } + + /// + /// Removes an action from the dictionary + /// + /// + public void RemoveAction(string key) + { + if (ActionDictionary.ContainsKey(key)) + ActionDictionary.Remove(key); + } + + /// + /// + /// + /// + public void AddBridge(CotijaBridgeBase bridge) + { + RoomBridges.Add(bridge); + var b = bridge as IDelayedConfiguration; + if (b != null) + { + Debug.Console(0, this, "Adding room bridge with delayed configuration"); + b.ConfigurationIsReady += new EventHandler(bridge_ConfigurationIsReady); + } + else + { + Debug.Console(0, this, "Adding room bridge and sending configuration"); + RegisterSystemToServer(); + } + } + + /// + /// + /// + /// + /// + void bridge_ConfigurationIsReady(object sender, EventArgs e) + { + Debug.Console(1, this, "Bridge ready. Registering"); + // send the configuration object to the server + RegisterSystemToServer(); + } + + /// + /// + /// + /// + void ReconnectToServerTimerCallback(object o) + { + RegisterSystemToServer(); + } + + /// + /// Verifies system connection with servers + /// + /// + void AuthorizeSystem(string code) + { + if (string.IsNullOrEmpty(code)) + { + CrestronConsole.ConsoleCommandResponse("Please enter a user code to authorize a system"); + return; + } + + var req = new HttpClientRequest(); + string url = string.Format("http://{0}/api/system/grantcode/{1}/{2}", Config.ServerUrl, code, SystemUuid); + Debug.Console(0, this, "Authorizing to: {0}", url); + + if (string.IsNullOrEmpty(Config.ServerUrl)) + { + CrestronConsole.ConsoleCommandResponse("Config URL address is not set. Check portal configuration"); + return; + } + try + { + req.Url.Parse(url); + new HttpClient().DispatchAsync(req, (r, e) => + { + CheckHttpDebug(r, e); + if (e == HTTP_CALLBACK_ERROR.COMPLETED) + { + if (r.Code == 200) + { + Debug.Console(0, "System authorized, sending config."); + RegisterSystemToServer(); + } + else if (r.Code == 404) + { + if (r.ContentString.Contains("codeNotFound")) + { + Debug.Console(0, "Authorization failed, code not found for system UUID {0}", SystemUuid); + } + else if (r.ContentString.Contains("uuidNotFound")) + { + Debug.Console(0, "Authorization failed, uuid {0} not found. Check Essentials configuration is correct", + SystemUuid); + } + } + } + else + Debug.Console(0, this, "Error {0} in authorizing system", e); + }); + } + catch (Exception e) + { + Debug.Console(0, this, "Error in authorizing: {0}", e); + } + } + + /// + /// Dumps info in response to console command. + /// + void ShowInfo() + { + var url = Config != null ? Config.ServerUrl : "No config"; + string name; + string code; + if (RoomBridges != null && RoomBridges.Count > 0) + { + name = RoomBridges[0].RoomName; + code = RoomBridges[0].UserCode; + } + else + { + name = "No config"; + code = "Not available"; + } + var conn = WSClient == null ? "No client" : (WSClient.Connected ? "Yes" : "No"); + + CrestronConsole.ConsoleCommandResponse(@"Mobile Control Information: + Server address: {0} + System Name: {1} + System UUID: {2} + System User code: {3} + Connected?: {4}", url, name, SystemUuid, + code, conn); + } + + /// + /// Registers the room with the server + /// + /// URL of the server, including the port number, if not 80. Format: "serverUrlOrIp:port" + void RegisterSystemToServer() + { + var ready = RegisterLockEvent.Wait(20000); + if (!ready) + { + Debug.Console(1, this, "RegisterSystemToServer failed to enter after 20 seconds. Ignoring"); + return; + } + RegisterLockEvent.Reset(); + + try + { + var confObject = ConfigReader.ConfigObject; + confObject.Info.RuntimeInfo.AppName = Assembly.GetExecutingAssembly().GetName().Name; + var version = Assembly.GetExecutingAssembly().GetName().Version; + confObject.Info.RuntimeInfo.AssemblyVersion = string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build); + + string postBody = JsonConvert.SerializeObject(confObject); + SystemUuid = confObject.SystemUuid; + + if (string.IsNullOrEmpty(postBody)) + { + Debug.Console(1, this, "ERROR: Config body is empty. Cannot register with server."); + } + else + { + var regClient = new HttpClient(); + regClient.Verbose = true; + regClient.KeepAlive = true; + + string url = string.Format("http://{0}/api/system/join/{1}", Config.ServerUrl, SystemUuid); + Debug.Console(1, this, "Joining server at {0}", url); + + HttpClientRequest request = new HttpClientRequest(); + request.Url.Parse(url); + request.RequestType = RequestType.Post; + request.Header.SetHeaderValue("Content-Type", "application/json"); + request.ContentString = postBody; + + var err = regClient.DispatchAsync(request, RegistrationConnectionCallback); + } + + } + catch (Exception e) + { + Debug.Console(0, this, "ERROR: Initilizing Room: {0}", e); + RegisterLockEvent.Set(); + StartReconnectTimer(); + } + + } + + /// + /// Sends a message to the server from a room + /// + /// room from which the message originates + /// object to be serialized and sent in post body + public void SendMessageToServer(JObject o) + { + + if (WSClient != null && WSClient.Connected) + { + string message = JsonConvert.SerializeObject(o, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); + Debug.Console(1, this, "Message TX: {0}", message); + var messageBytes = System.Text.Encoding.UTF8.GetBytes(message); + WSClient.Send(messageBytes, (uint)messageBytes.Length, WebSocketClient.WEBSOCKET_PACKET_TYPES.LWS_WS_OPCODE_07__TEXT_FRAME); + //WSClient.SendAsync(messageBytes, (uint)messageBytes.Length, WebSocketClient.WEBSOCKET_PACKET_TYPES.LWS_WS_OPCODE_07__TEXT_FRAME); + } + + } + + /// + /// Disconnects the SSE Client and stops the heartbeat timer + /// + /// + void DisconnectStreamClient(string command) + { + //if(SseClient != null) + // SseClient.Disconnect(); + + if (WSClient != null && WSClient.Connected) + WSClient.Disconnect(); + + if (ServerHeartbeatCheckTimer != null) + { + ServerHeartbeatCheckTimer.Stop(); + + ServerHeartbeatCheckTimer = null; + } + } + + /// + /// The callback that fires when we get a response from our registration attempt + /// + /// + /// + void RegistrationConnectionCallback(HttpClientResponse resp, HTTP_CALLBACK_ERROR err) + { + CheckHttpDebug(resp, err); + Debug.Console(1, this, "RegistrationConnectionCallback: {0}", err); + try + { + if (resp != null && resp.Code == 200) + { + if(ServerReconnectTimer != null) + { + ServerReconnectTimer.Stop(); + ServerReconnectTimer = null; + } + + // Success here! + ConnectStreamClient(); + } + else + { + if (resp != null) + Debug.Console(1, this, "Response from server: {0}\n{1}", resp.Code, err); + else + { + Debug.Console(1, this, "Null response received from server."); + } + StartReconnectTimer(); + } + } + catch (Exception e) + { + Debug.Console(1, this, "Error Initializing Stream Client: {0}", e); + StartReconnectTimer(); + } + RegisterLockEvent.Set(); + } + + /// + /// Executes when we don't get a heartbeat message in time. Triggers reconnect. + /// + /// For CTimer callback. Not used + void HeartbeatExpiredTimerCallback(object o) + { + Debug.Console(1, this, "Heartbeat Timer Expired."); + if (ServerHeartbeatCheckTimer != null) + { + ServerHeartbeatCheckTimer.Stop(); + ServerHeartbeatCheckTimer = null; + } + StartReconnectTimer(); + } + + /// + /// + /// + /// + /// + void StartReconnectTimer() + { + // Start the reconnect timer + if (ServerReconnectTimer == null) + { + ServerReconnectTimer = new CTimer(ReconnectToServerTimerCallback, null, ServerReconnectInterval, ServerReconnectInterval); + Debug.Console(1, this, "Reconnect Timer Started."); + } + ServerReconnectTimer.Reset(ServerReconnectInterval, ServerReconnectInterval); + } + + /// + /// + /// + /// + /// + void ResetOrStartHearbeatTimer() + { + if (ServerHeartbeatCheckTimer == null) + { + ServerHeartbeatCheckTimer = new CTimer(HeartbeatExpiredTimerCallback, null, ServerHeartbeatInterval, ServerHeartbeatInterval); + + Debug.Console(1, this, "Heartbeat Timer Started."); + } + + ServerHeartbeatCheckTimer.Reset(ServerHeartbeatInterval, ServerHeartbeatInterval); + } + + + /// + /// Connects the SSE Client + /// + /// + void ConnectStreamClient() + { + Debug.Console(0, this, "Initializing Stream client to server."); + + if (WSClient == null) + { + WSClient = new WebSocketClient(); + } + WSClient.URL = string.Format("wss://{0}/system/join/{1}", Config.ServerUrl, this.SystemUuid); + WSClient.Connect(); + Debug.Console(0, this, "Websocket connected"); + WSClient.ReceiveCallBack = WebsocketReceiveCallback; + //WSClient.SendCallBack = WebsocketSendCallback; + WSClient.ReceiveAsync(); + } + + /// + /// Resets reconnect timer and updates usercode + /// + /// + void HandleHeartBeat(JToken content) { SendMessageToServer(JObject.FromObject(new { type = "/system/heartbeatAck" - })); - - var code = content["userCode"]; - if(code != null) - { - foreach (var b in RoomBridges) - { - b.SetUserCode(code.Value()); - } - } - ResetOrStartHearbeatTimer(); - } - - /// - /// Outputs debug info when enabled - /// - /// - /// - /// - void CheckHttpDebug(HttpClientResponse r, HTTP_CALLBACK_ERROR e) - { - if (HttpDebugEnabled) - { - Debug.Console(0, this, "------ Begin HTTP Debug ---------------------------------------"); - Debug.Console(0, this, "HTTP Response URL: {0}", r.ResponseUrl.ToString()); - Debug.Console(0, this, "HTTP Response 'error' {0}", e); - Debug.Console(0, this, "HTTP Response code: {0}", r.Code); - Debug.Console(0, this, "HTTP Response content: \r{0}", r.ContentString); - Debug.Console(0, this, "------ End HTTP Debug -----------------------------------------"); - } - } - - /// - /// - /// - /// - /// - /// - /// - int WebsocketReceiveCallback(byte[] data, uint length, WebSocketClient.WEBSOCKET_PACKET_TYPES opcode, - WebSocketClient.WEBSOCKET_RESULT_CODES err) - { - var rx = System.Text.Encoding.UTF8.GetString(data, 0, (int)length); - if(rx.Length > 0) - ParseStreamRx(rx); - WSClient.ReceiveAsync(); - return 1; - } - - /// - /// Callback to catch possible errors in sending via the websocket - /// - /// - /// - int WebsocketSendCallback(Crestron.SimplSharp.CrestronWebSocketClient.WebSocketClient.WEBSOCKET_RESULT_CODES result) - { - Debug.Console(1, this, "SendCallback result: {0}", result); - - return 1; - } - - /// - /// - /// - /// - /// - void ParseStreamRx(string message) - { - if(string.IsNullOrEmpty(message)) - return; - - Debug.Console(1, this, "Message RX: '{0}'", message); - try - { - var messageObj = JObject.Parse(message); - - var type = messageObj["type"].Value(); - - if (type == "hello") - { - ResetOrStartHearbeatTimer(); - } - else if (type == "/system/heartbeat") - { - HandleHeartBeat(messageObj["content"]); - } - else if (type == "close") - { - WSClient.Disconnect(); - - ServerHeartbeatCheckTimer.Stop(); - // Start the reconnect timer - StartReconnectTimer(); - } - else - { - // Check path against Action dictionary - if (ActionDictionary.ContainsKey(type)) - { - var action = ActionDictionary[type]; - - if (action is Action) - { - (action as Action)(); - } - else if (action is PressAndHoldAction) - { - var stateString = messageObj["content"]["state"].Value(); - - // Look for a button press event - if (!string.IsNullOrEmpty(stateString)) - { - switch (stateString) - { - case "true": - { - if (!PushedActions.ContainsKey(type)) - { - PushedActions.Add(type, new CTimer(o => - { - (action as PressAndHoldAction)(false); - PushedActions.Remove(type); - }, null, ButtonHeartbeatInterval, ButtonHeartbeatInterval)); - } - // Maybe add an else to reset the timer - break; - } - case "held": - { - if (!PushedActions.ContainsKey(type)) - { - PushedActions[type].Reset(ButtonHeartbeatInterval, ButtonHeartbeatInterval); - } - return; - } - case "false": - { - if (PushedActions.ContainsKey(type)) - { - PushedActions[type].Stop(); - PushedActions.Remove(type); - } - break; - } - } - - (action as PressAndHoldAction)(stateString == "true"); - } - } - else if (action is Action) - { - var stateString = messageObj["content"]["state"].Value(); - - if (!string.IsNullOrEmpty(stateString)) - { - (action as Action)(stateString == "true"); - } - } - else if (action is Action) - { - (action as Action)(messageObj["content"]["value"].Value()); - } - else if (action is Action) - { - (action as Action)(messageObj["content"]["value"].Value()); - } - else if (action is Action) - { - (action as Action)(messageObj["content"] - .ToObject()); - } - } - else - { - Debug.Console(1, this, "-- Warning: Incoming message has no registered handler"); - } - } - } - catch (Exception err) - { - //Debug.Console(1, "SseMessageLengthBeforeFailureCount: {0}", SseMessageLengthBeforeFailureCount); - //SseMessageLengthBeforeFailureCount = 0; - Debug.Console(1, this, "Unable to parse message: {0}", err); - } - } - - void TestHttpRequest(string s) - { - { - s = s.Trim(); - if (string.IsNullOrEmpty(s)) - { - PrintTestHttpRequestUsage(); - return; - } - var tokens = s.Split(' '); - if (tokens.Length < 2) - { - CrestronConsole.ConsoleCommandResponse("Too few paramaters\r"); - PrintTestHttpRequestUsage(); - return; - } - - try - { - var url = tokens[1]; - if (tokens[0].ToLower() == "get") - { - var resp = new HttpClient().Get(url); - CrestronConsole.ConsoleCommandResponse("RESPONSE:\r{0}\r\r", resp); - } - else if (tokens[0].ToLower() == "post") - { - var resp = new HttpClient().Post(url, new byte[] { }); - CrestronConsole.ConsoleCommandResponse("RESPONSE:\r{0}\r\r", resp); - } - - else - { - CrestronConsole.ConsoleCommandResponse("Only get or post supported\r"); - PrintTestHttpRequestUsage(); - } - } - catch (HttpException e) - { - CrestronConsole.ConsoleCommandResponse("Exception in request:\r"); - CrestronConsole.ConsoleCommandResponse("Response URL: {0}\r", e.Response.ResponseUrl); - CrestronConsole.ConsoleCommandResponse("Response Error Code: {0}\r", e.Response.Code); - CrestronConsole.ConsoleCommandResponse("Response body: {0}\r", e.Response.ContentString); - } - - } - } - - void PrintTestHttpRequestUsage() - { - CrestronConsole.ConsoleCommandResponse("Usage: mobilehttprequest:N get/post url\r"); - } - } + })); + + var code = content["userCode"]; + if(code != null) + { + foreach (var b in RoomBridges) + { + b.SetUserCode(code.Value()); + } + } + ResetOrStartHearbeatTimer(); + } + + /// + /// Outputs debug info when enabled + /// + /// + /// + /// + void CheckHttpDebug(HttpClientResponse r, HTTP_CALLBACK_ERROR e) + { + if (HttpDebugEnabled) + { + Debug.Console(0, this, "------ Begin HTTP Debug ---------------------------------------"); + Debug.Console(0, this, "HTTP Response URL: {0}", r.ResponseUrl.ToString()); + Debug.Console(0, this, "HTTP Response 'error' {0}", e); + Debug.Console(0, this, "HTTP Response code: {0}", r.Code); + Debug.Console(0, this, "HTTP Response content: \r{0}", r.ContentString); + Debug.Console(0, this, "------ End HTTP Debug -----------------------------------------"); + } + } + + /// + /// + /// + /// + /// + /// + /// + int WebsocketReceiveCallback(byte[] data, uint length, WebSocketClient.WEBSOCKET_PACKET_TYPES opcode, + WebSocketClient.WEBSOCKET_RESULT_CODES err) + { + var rx = System.Text.Encoding.UTF8.GetString(data, 0, (int)length); + if(rx.Length > 0) + ParseStreamRx(rx); + WSClient.ReceiveAsync(); + return 1; + } + + /// + /// Callback to catch possible errors in sending via the websocket + /// + /// + /// + int WebsocketSendCallback(Crestron.SimplSharp.CrestronWebSocketClient.WebSocketClient.WEBSOCKET_RESULT_CODES result) + { + Debug.Console(1, this, "SendCallback result: {0}", result); + + return 1; + } + + /// + /// + /// + /// + /// + void ParseStreamRx(string message) + { + if(string.IsNullOrEmpty(message)) + return; + + Debug.Console(1, this, "Message RX: '{0}'", message); + try + { + var messageObj = JObject.Parse(message); + + var type = messageObj["type"].Value(); + + if (type == "hello") + { + ResetOrStartHearbeatTimer(); + } + else if (type == "/system/heartbeat") + { + HandleHeartBeat(messageObj["content"]); + } + else if (type == "close") + { + WSClient.Disconnect(); + + ServerHeartbeatCheckTimer.Stop(); + // Start the reconnect timer + StartReconnectTimer(); + } + else + { + // Check path against Action dictionary + if (ActionDictionary.ContainsKey(type)) + { + var action = ActionDictionary[type]; + + if (action is Action) + { + (action as Action)(); + } + else if (action is PressAndHoldAction) + { + var stateString = messageObj["content"]["state"].Value(); + + // Look for a button press event + if (!string.IsNullOrEmpty(stateString)) + { + switch (stateString) + { + case "true": + { + if (!PushedActions.ContainsKey(type)) + { + PushedActions.Add(type, new CTimer(o => + { + (action as PressAndHoldAction)(false); + PushedActions.Remove(type); + }, null, ButtonHeartbeatInterval, ButtonHeartbeatInterval)); + } + // Maybe add an else to reset the timer + break; + } + case "held": + { + if (!PushedActions.ContainsKey(type)) + { + PushedActions[type].Reset(ButtonHeartbeatInterval, ButtonHeartbeatInterval); + } + return; + } + case "false": + { + if (PushedActions.ContainsKey(type)) + { + PushedActions[type].Stop(); + PushedActions.Remove(type); + } + break; + } + } + + (action as PressAndHoldAction)(stateString == "true"); + } + } + else if (action is Action) + { + var stateString = messageObj["content"]["state"].Value(); + + if (!string.IsNullOrEmpty(stateString)) + { + (action as Action)(stateString == "true"); + } + } + else if (action is Action) + { + (action as Action)(messageObj["content"]["value"].Value()); + } + else if (action is Action) + { + (action as Action)(messageObj["content"]["value"].Value()); + } + else if (action is Action) + { + (action as Action)(messageObj["content"] + .ToObject()); + } + } + else + { + Debug.Console(1, this, "-- Warning: Incoming message has no registered handler"); + } + } + } + catch (Exception err) + { + //Debug.Console(1, "SseMessageLengthBeforeFailureCount: {0}", SseMessageLengthBeforeFailureCount); + //SseMessageLengthBeforeFailureCount = 0; + Debug.Console(1, this, "Unable to parse message: {0}", err); + } + } + + void TestHttpRequest(string s) + { + { + s = s.Trim(); + if (string.IsNullOrEmpty(s)) + { + PrintTestHttpRequestUsage(); + return; + } + var tokens = s.Split(' '); + if (tokens.Length < 2) + { + CrestronConsole.ConsoleCommandResponse("Too few paramaters\r"); + PrintTestHttpRequestUsage(); + return; + } + + try + { + var url = tokens[1]; + if (tokens[0].ToLower() == "get") + { + var resp = new HttpClient().Get(url); + CrestronConsole.ConsoleCommandResponse("RESPONSE:\r{0}\r\r", resp); + } + else if (tokens[0].ToLower() == "post") + { + var resp = new HttpClient().Post(url, new byte[] { }); + CrestronConsole.ConsoleCommandResponse("RESPONSE:\r{0}\r\r", resp); + } + + else + { + CrestronConsole.ConsoleCommandResponse("Only get or post supported\r"); + PrintTestHttpRequestUsage(); + } + } + catch (HttpException e) + { + CrestronConsole.ConsoleCommandResponse("Exception in request:\r"); + CrestronConsole.ConsoleCommandResponse("Response URL: {0}\r", e.Response.ResponseUrl); + CrestronConsole.ConsoleCommandResponse("Response Error Code: {0}\r", e.Response.Code); + CrestronConsole.ConsoleCommandResponse("Response body: {0}\r", e.Response.ContentString); + } + + } + } + + void PrintTestHttpRequestUsage() + { + CrestronConsole.ConsoleCommandResponse("Usage: mobilehttprequest:N get/post url\r"); + } + } } \ No newline at end of file diff --git a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/IChannelExtensions.cs b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/IChannelExtensions.cs index b26a7f99..dd23d85a 100644 --- a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/IChannelExtensions.cs +++ b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/IChannelExtensions.cs @@ -14,9 +14,9 @@ namespace PepperDash.Essentials.Room.Cotija { var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key); - controller.AddAction(prefix + "chanup", new PressAndHoldAction(dev.ChannelUp)); - controller.AddAction(prefix + "chandown", new PressAndHoldAction(dev.ChannelDown)); - controller.AddAction(prefix + "lastchan", new PressAndHoldAction(dev.LastChannel)); + controller.AddAction(prefix + "chanUp", new PressAndHoldAction(dev.ChannelUp)); + controller.AddAction(prefix + "chanDown", new PressAndHoldAction(dev.ChannelDown)); + controller.AddAction(prefix + "lastChan", new PressAndHoldAction(dev.LastChannel)); controller.AddAction(prefix + "guide", new PressAndHoldAction(dev.Guide)); controller.AddAction(prefix + "info", new PressAndHoldAction(dev.Info)); controller.AddAction(prefix + "exit", new PressAndHoldAction(dev.Exit)); @@ -26,9 +26,9 @@ namespace PepperDash.Essentials.Room.Cotija { var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key); - controller.RemoveAction(prefix + "chanup"); - controller.RemoveAction(prefix + "chandown"); - controller.RemoveAction(prefix + "lastchan"); + controller.RemoveAction(prefix + "chanUp"); + controller.RemoveAction(prefix + "chanDown"); + controller.RemoveAction(prefix + "lastChan"); controller.RemoveAction(prefix + "guide"); controller.RemoveAction(prefix + "info"); controller.RemoveAction(prefix + "exit"); diff --git a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/INumericExtensions.cs b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/INumericExtensions.cs index 7246cb51..4f35e238 100644 --- a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/INumericExtensions.cs +++ b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/INumericExtensions.cs @@ -24,8 +24,8 @@ namespace PepperDash.Essentials.Room.Cotija controller.AddAction(prefix + "num7", new PressAndHoldAction(dev.Digit0)); controller.AddAction(prefix + "num8", new PressAndHoldAction(dev.Digit0)); controller.AddAction(prefix + "num9", new PressAndHoldAction(dev.Digit0)); - controller.AddAction(prefix + "dash", new PressAndHoldAction(dev.KeypadAccessoryButton1)); - controller.AddAction(prefix + "enter", new PressAndHoldAction(dev.KeypadAccessoryButton2)); + controller.AddAction(prefix + "numDash", new PressAndHoldAction(dev.KeypadAccessoryButton1)); + controller.AddAction(prefix + "numEnter", new PressAndHoldAction(dev.KeypadAccessoryButton2)); // Deal with the Accessory functions on the numpad later } @@ -42,9 +42,9 @@ namespace PepperDash.Essentials.Room.Cotija controller.RemoveAction(prefix + "num6"); controller.RemoveAction(prefix + "num7"); controller.RemoveAction(prefix + "num8"); - controller.RemoveAction(prefix + "num9"); - controller.RemoveAction(prefix + "dash"); - controller.RemoveAction(prefix + "enter"); + controller.RemoveAction(prefix + "num9"); + controller.RemoveAction(prefix + "numDash"); + controller.RemoveAction(prefix + "numEnter"); } } } \ No newline at end of file diff --git a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/IPowerExtensions.cs b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/IPowerExtensions.cs index 68b36675..732d2740 100644 --- a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/IPowerExtensions.cs +++ b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/IPowerExtensions.cs @@ -14,18 +14,18 @@ namespace PepperDash.Essentials.Room.Cotija { var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key); - controller.AddAction(prefix + "poweron", new Action(dev.PowerOn)); - controller.AddAction(prefix + "poweroff", new Action(dev.PowerOff)); - controller.AddAction(prefix + "powertoggle", new Action(dev.PowerToggle)); + controller.AddAction(prefix + "powerOn", new Action(dev.PowerOn)); + controller.AddAction(prefix + "powerOff", new Action(dev.PowerOff)); + controller.AddAction(prefix + "powerToggle", new Action(dev.PowerToggle)); } public static void UnlinkActions(this IPower dev, CotijaSystemController controller) { var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key); - controller.RemoveAction(prefix + "poweron"); - controller.RemoveAction(prefix + "poweroff"); - controller.RemoveAction(prefix + "powertoggle"); + controller.RemoveAction(prefix + "powerOn"); + controller.RemoveAction(prefix + "powerOff"); + controller.RemoveAction(prefix + "powerToggle"); } } diff --git a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/ISetTopBoxControlsExtensions.cs b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/ISetTopBoxControlsExtensions.cs index 7fa7d1b1..99198fa6 100644 --- a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/ISetTopBoxControlsExtensions.cs +++ b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/ISetTopBoxControlsExtensions.cs @@ -14,7 +14,7 @@ namespace PepperDash.Essentials.Room.Cotija { var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key); - controller.AddAction(prefix + "dvrlist", new PressAndHoldAction(dev.DvrList)); + controller.AddAction(prefix + "dvrList", new PressAndHoldAction(dev.DvrList)); controller.AddAction(prefix + "replay", new PressAndHoldAction(dev.Replay)); } @@ -22,7 +22,7 @@ namespace PepperDash.Essentials.Room.Cotija { var prefix = string.Format(@"/device/{0}/", (dev as IKeyed).Key); - controller.RemoveAction(prefix + "dvrlist"); + controller.RemoveAction(prefix + "dvrList"); controller.RemoveAction(prefix + "replay"); } } diff --git a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/ITransportExtensions.cs b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/ITransportExtensions.cs index 34bda457..9463d95f 100644 --- a/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/ITransportExtensions.cs +++ b/PepperDashEssentials/Room/Cotija/DeviceTypeInterfaces/ITransportExtensions.cs @@ -17,8 +17,8 @@ namespace PepperDash.Essentials.Room.Cotija controller.AddAction(prefix + "play", new PressAndHoldAction(dev.Play)); controller.AddAction(prefix + "pause", new PressAndHoldAction(dev.Pause)); controller.AddAction(prefix + "stop", new PressAndHoldAction(dev.Stop)); - controller.AddAction(prefix + "prevtrack", new PressAndHoldAction(dev.ChapPlus)); - controller.AddAction(prefix + "nexttrack", new PressAndHoldAction(dev.ChapMinus)); + controller.AddAction(prefix + "prevTrack", new PressAndHoldAction(dev.ChapPlus)); + controller.AddAction(prefix + "nextTrack", new PressAndHoldAction(dev.ChapMinus)); controller.AddAction(prefix + "rewind", new PressAndHoldAction(dev.Rewind)); controller.AddAction(prefix + "ffwd", new PressAndHoldAction(dev.FFwd)); controller.AddAction(prefix + "record", new PressAndHoldAction(dev.Record)); @@ -31,8 +31,8 @@ namespace PepperDash.Essentials.Room.Cotija controller.RemoveAction(prefix + "play"); controller.RemoveAction(prefix + "pause"); controller.RemoveAction(prefix + "stop"); - controller.RemoveAction(prefix + "prevtrack"); - controller.RemoveAction(prefix + "nexttrack"); + controller.RemoveAction(prefix + "prevTrack"); + controller.RemoveAction(prefix + "nextTrack"); controller.RemoveAction(prefix + "rewind"); controller.RemoveAction(prefix + "ffwd"); controller.RemoveAction(prefix + "record"); diff --git a/PepperDashEssentials/Room/Cotija/RoomBridges/CotijaDdvc01RoomBridge.cs b/PepperDashEssentials/Room/Cotija/RoomBridges/CotijaDdvc01RoomBridge.cs index 78512263..362777c3 100644 --- a/PepperDashEssentials/Room/Cotija/RoomBridges/CotijaDdvc01RoomBridge.cs +++ b/PepperDashEssentials/Room/Cotija/RoomBridges/CotijaDdvc01RoomBridge.cs @@ -1,336 +1,342 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; -using Crestron.SimplSharpPro.EthernetCommunication; - -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -using PepperDash.Core; -using PepperDash.Essentials.Core; -using PepperDash.Essentials.Core.Config; -using PepperDash.Essentials.Room.Config; - - -namespace PepperDash.Essentials.Room.Cotija -{ - public class CotijaDdvc01RoomBridge : CotijaBridgeBase, IDelayedConfiguration - { - public class BoolJoin - { - /// - /// 301 - /// - public const uint RoomIsOn = 301; - - /// - /// 51 - /// - public const uint ActivitySharePress = 51; - /// - /// 52 - /// - public const uint ActivityPhoneCallPress = 52; - /// - /// 53 - /// - public const uint ActivityVideoCallPress = 53; - - /// - /// 1 - /// - public const uint MasterVolumeIsMuted = 1; - /// - /// 1 - /// - public const uint MasterVolumeMuteToggle = 1; - - /// - /// 61 - /// - public const uint ShutdownCancel = 61; - /// - /// 62 - /// - public const uint ShutdownEnd = 62; - /// - /// 63 - /// - public const uint ShutdownStart = 63; - - - - /// - /// 72 - /// - public const uint SourceHasChanged = 72; - /// - /// 501 - /// - public const uint ConfigIsReady = 501; - } - - public class UshortJoin - { - /// - /// 1 - /// - public const uint MasterVolumeLevel = 1; - - /// - /// 61 - /// - public const uint ShutdownPromptDuration = 61; - } - - public class StringJoin - { - /// - /// 71 - /// - public const uint SelectedSourceKey = 71; - - /// - /// 501 - /// - public const uint ConfigRoomName = 501; - /// - /// 502 - /// - public const uint ConfigHelpMessage = 502; - /// - /// 503 - /// - public const uint ConfigHelpNumber = 503; - /// - /// 504 - /// - public const uint ConfigRoomPhoneNumber = 504; - /// - /// 505 - /// - public const uint ConfigRoomURI = 505; - /// - /// 401 - /// - public const uint UserCodeToSystem = 401; - /// - /// 402 - /// - public const uint ServerUrl = 402; - } - - /// - /// Fires when config is ready to go - /// - public event EventHandler ConfigurationIsReady; - - public ThreeSeriesTcpIpEthernetIntersystemCommunications EISC { get; private set; } - - /// - /// - /// - public bool ConfigIsLoaded { get; private set; } - - public override string RoomName - { - get { - var name = EISC.StringOutput[StringJoin.ConfigRoomName].StringValue; - return string.IsNullOrEmpty(name) ? "Not Loaded" : name; - } - } - - CotijaDdvc01DeviceBridge SourceBridge; - - - /// - /// - /// - /// - /// - /// - public CotijaDdvc01RoomBridge(string key, string name, uint ipId) - : base(key, name) - { - try - { - EISC = new ThreeSeriesTcpIpEthernetIntersystemCommunications(ipId, "127.0.0.2", Global.ControlSystem); - var reg = EISC.Register(); - if (reg != Crestron.SimplSharpPro.eDeviceRegistrationUnRegistrationResponse.Success) - Debug.Console(0, this, "Cannot connect EISC at IPID {0}: \r{1}", ipId, reg); - - SourceBridge = new CotijaDdvc01DeviceBridge(key + "-sourceBridge", "DDVC01 source bridge", EISC); - DeviceManager.AddDevice(SourceBridge); - } - catch (Exception) - { - throw; - } - } - - /// - /// Finish wiring up everything after all devices are created. The base class will hunt down the related - /// parent controller and link them up. - /// - /// - public override bool CustomActivate() - { - Debug.Console(0, this, "Final activation. Setting up actions and feedbacks"); - SetupFunctions(); - SetupFeedbacks(); - - EISC.SigChange += EISC_SigChange; - EISC.OnlineStatusChange += (o, a) => - { - Debug.Console(1, this, "DDVC EISC online={0}. Config is ready={1}", a.DeviceOnLine, EISC.BooleanOutput[BoolJoin.ConfigIsReady].BoolValue); - if (a.DeviceOnLine && EISC.BooleanOutput[BoolJoin.ConfigIsReady].BoolValue) - LoadConfigValues(); - }; - // load config if it's already there - if (EISC.IsOnline && EISC.BooleanOutput[BoolJoin.ConfigIsReady].BoolValue) // || EISC.BooleanInput[BoolJoin.ConfigIsReady].BoolValue) - LoadConfigValues(); - - - CrestronConsole.AddNewConsoleCommand(s => - { - for (uint i = 1; i < 1000; i++) - { - if (s.ToLower().Equals("b")) - { - CrestronConsole.ConsoleCommandResponse("D{0,6} {1} - ", i, EISC.BooleanOutput[i].BoolValue); - } - else if (s.ToLower().Equals("u")) - { - CrestronConsole.ConsoleCommandResponse("U{0,6} {1,8} - ", i, EISC.UShortOutput[i].UShortValue); - } - else if (s.ToLower().Equals("s")) - { - var val = EISC.StringOutput[i].StringValue; - if(!string.IsNullOrEmpty(val)) - CrestronConsole.ConsoleCommandResponse("S{0,6} {1}\r", i, EISC.StringOutput[i].StringValue); - } - - } - }, "mobilebridgedump", "Dumps DDVC01 bridge EISC data b,u,s", ConsoleAccessLevelEnum.AccessOperator); - - CrestronConsole.AddNewConsoleCommand(s => LoadConfigValues(), "loadddvc", "", ConsoleAccessLevelEnum.AccessOperator); - - return base.CustomActivate(); - } - - - /// - /// Setup the actions to take place on various incoming API calls - /// - void SetupFunctions() - { - - Parent.AddAction(@"/room/room1/status", new Action(SendFullStatus)); - - Parent.AddAction(@"/room/room1/source", new Action(c => - { - EISC.SetString(StringJoin.SelectedSourceKey, c.SourceListItem); - EISC.PulseBool(BoolJoin.SourceHasChanged); - })); - -#warning CHANGE to activityshare. Perhaps - Parent.AddAction(@"/room/room1/defaultsource", new Action(() => - EISC.PulseBool(BoolJoin.ActivitySharePress))); - - Parent.AddAction(@"/room/room1/masterVolumeLevel", new Action(u => - EISC.SetUshort(UshortJoin.MasterVolumeLevel, u))); - Parent.AddAction(@"/room/room1/masterVolumeMuteToggle", new Action(() => - EISC.PulseBool(BoolJoin.MasterVolumeIsMuted))); - - Parent.AddAction(@"/room/room1/shutdownStart", new Action(() => - EISC.PulseBool(BoolJoin.ShutdownStart))); - Parent.AddAction(@"/room/room1/shutdownEnd", new Action(() => - EISC.PulseBool(BoolJoin.ShutdownEnd))); - Parent.AddAction(@"/room/room1/shutdownCancel", new Action(() => - EISC.PulseBool(BoolJoin.ShutdownCancel))); - - - // Source Device (Current Source)' - - SourceDeviceMapDictionary sourceJoinMap = new SourceDeviceMapDictionary(); - +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Crestron.SimplSharp; +using Crestron.SimplSharp.Reflection; +using Crestron.SimplSharpPro.EthernetCommunication; + +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +using PepperDash.Core; +using PepperDash.Essentials.Core; +using PepperDash.Essentials.Core.Config; +using PepperDash.Essentials.Room.Config; + + +namespace PepperDash.Essentials.Room.Cotija +{ + public class CotijaDdvc01RoomBridge : CotijaBridgeBase, IDelayedConfiguration + { + public class BoolJoin + { + /// + /// 301 + /// + public const uint RoomIsOn = 301; + + /// + /// 51 + /// + public const uint ActivitySharePress = 51; + /// + /// 52 + /// + public const uint ActivityPhoneCallPress = 52; + /// + /// 53 + /// + public const uint ActivityVideoCallPress = 53; + + /// + /// 1 + /// + public const uint MasterVolumeIsMuted = 1; + /// + /// 1 + /// + public const uint MasterVolumeMuteToggle = 1; + + /// + /// 61 + /// + public const uint ShutdownCancel = 61; + /// + /// 62 + /// + public const uint ShutdownEnd = 62; + /// + /// 63 + /// + public const uint ShutdownStart = 63; + + + + /// + /// 72 + /// + public const uint SourceHasChanged = 72; + /// + /// 501 + /// + public const uint ConfigIsReady = 501; + } + + public class UshortJoin + { + /// + /// 1 + /// + public const uint MasterVolumeLevel = 1; + + /// + /// 61 + /// + public const uint ShutdownPromptDuration = 61; + } + + public class StringJoin + { + /// + /// 71 + /// + public const uint SelectedSourceKey = 71; + + /// + /// 501 + /// + public const uint ConfigRoomName = 501; + /// + /// 502 + /// + public const uint ConfigHelpMessage = 502; + /// + /// 503 + /// + public const uint ConfigHelpNumber = 503; + /// + /// 504 + /// + public const uint ConfigRoomPhoneNumber = 504; + /// + /// 505 + /// + public const uint ConfigRoomURI = 505; + /// + /// 401 + /// + public const uint UserCodeToSystem = 401; + /// + /// 402 + /// + public const uint ServerUrl = 402; + } + + /// + /// Fires when config is ready to go + /// + public event EventHandler ConfigurationIsReady; + + public ThreeSeriesTcpIpEthernetIntersystemCommunications EISC { get; private set; } + + /// + /// + /// + public bool ConfigIsLoaded { get; private set; } + + public override string RoomName + { + get { + var name = EISC.StringOutput[StringJoin.ConfigRoomName].StringValue; + return string.IsNullOrEmpty(name) ? "Not Loaded" : name; + } + } + + CotijaDdvc01DeviceBridge SourceBridge; + + + /// + /// + /// + /// + /// + /// + public CotijaDdvc01RoomBridge(string key, string name, uint ipId) + : base(key, name) + { + try + { + EISC = new ThreeSeriesTcpIpEthernetIntersystemCommunications(ipId, "127.0.0.2", Global.ControlSystem); + var reg = EISC.Register(); + if (reg != Crestron.SimplSharpPro.eDeviceRegistrationUnRegistrationResponse.Success) + Debug.Console(0, this, "Cannot connect EISC at IPID {0}: \r{1}", ipId, reg); + + SourceBridge = new CotijaDdvc01DeviceBridge(key + "-sourceBridge", "DDVC01 source bridge", EISC); + DeviceManager.AddDevice(SourceBridge); + } + catch (Exception) + { + throw; + } + } + + /// + /// Finish wiring up everything after all devices are created. The base class will hunt down the related + /// parent controller and link them up. + /// + /// + public override bool CustomActivate() + { + Debug.Console(0, this, "Final activation. Setting up actions and feedbacks"); + SetupFunctions(); + SetupFeedbacks(); + + EISC.SigChange += EISC_SigChange; + EISC.OnlineStatusChange += (o, a) => + { + Debug.Console(1, this, "DDVC EISC online={0}. Config is ready={1}", a.DeviceOnLine, EISC.BooleanOutput[BoolJoin.ConfigIsReady].BoolValue); + if (a.DeviceOnLine && EISC.BooleanOutput[BoolJoin.ConfigIsReady].BoolValue) + LoadConfigValues(); + }; + // load config if it's already there + if (EISC.IsOnline && EISC.BooleanOutput[BoolJoin.ConfigIsReady].BoolValue) // || EISC.BooleanInput[BoolJoin.ConfigIsReady].BoolValue) + LoadConfigValues(); + + + CrestronConsole.AddNewConsoleCommand(s => + { + for (uint i = 1; i < 1000; i++) + { + if (s.ToLower().Equals("b")) + { + CrestronConsole.ConsoleCommandResponse("D{0,6} {1} - ", i, EISC.BooleanOutput[i].BoolValue); + } + else if (s.ToLower().Equals("u")) + { + CrestronConsole.ConsoleCommandResponse("U{0,6} {1,8} - ", i, EISC.UShortOutput[i].UShortValue); + } + else if (s.ToLower().Equals("s")) + { + var val = EISC.StringOutput[i].StringValue; + if(!string.IsNullOrEmpty(val)) + CrestronConsole.ConsoleCommandResponse("S{0,6} {1}\r", i, EISC.StringOutput[i].StringValue); + } + + } + }, "mobilebridgedump", "Dumps DDVC01 bridge EISC data b,u,s", ConsoleAccessLevelEnum.AccessOperator); + + CrestronConsole.AddNewConsoleCommand(s => LoadConfigValues(), "loadddvc", "", ConsoleAccessLevelEnum.AccessOperator); + + return base.CustomActivate(); + } + + + /// + /// Setup the actions to take place on various incoming API calls + /// + void SetupFunctions() + { + + Parent.AddAction(@"/room/room1/status", new Action(SendFullStatus)); + + Parent.AddAction(@"/room/room1/source", new Action(c => + { + EISC.SetString(StringJoin.SelectedSourceKey, c.SourceListItem); + EISC.PulseBool(BoolJoin.SourceHasChanged); + })); + +#warning CHANGE to activityshare. Perhaps + Parent.AddAction(@"/room/room1/defaultsource", new Action(() => + EISC.PulseBool(BoolJoin.ActivitySharePress))); + + Parent.AddAction(@"/room/room1/masterVolumeLevel", new Action(u => + EISC.SetUshort(UshortJoin.MasterVolumeLevel, u))); + Parent.AddAction(@"/room/room1/masterVolumeMuteToggle", new Action(() => + EISC.PulseBool(BoolJoin.MasterVolumeIsMuted))); + + Parent.AddAction(@"/room/room1/shutdownStart", new Action(() => + EISC.PulseBool(BoolJoin.ShutdownStart))); + Parent.AddAction(@"/room/room1/shutdownEnd", new Action(() => + EISC.PulseBool(BoolJoin.ShutdownEnd))); + Parent.AddAction(@"/room/room1/shutdownCancel", new Action(() => + EISC.PulseBool(BoolJoin.ShutdownCancel))); + + + // Source Device (Current Source)' + + SourceDeviceMapDictionary sourceJoinMap = new SourceDeviceMapDictionary(); + var prefix = @"/device/currentSource/"; foreach (var item in sourceJoinMap) { Parent.AddAction(prefix + item.Key, new PressAndHoldAction(b => EISC.SetBool(item.Value, b))); - } - } - - /// - /// Links feedbacks to whatever is gonna happen! - /// - void SetupFeedbacks() - { - // Power - EISC.SetBoolSigAction(BoolJoin.RoomIsOn, b => - PostStatusMessage(new - { - isOn = b - })); - - // Source change things - EISC.SetSigTrueAction(BoolJoin.SourceHasChanged, () => - PostStatusMessage(new - { - selectedSourceKey = EISC.StringOutput[StringJoin.SelectedSourceKey].StringValue - })); - - // Volume things - EISC.SetUShortSigAction(UshortJoin.MasterVolumeLevel, u => - PostStatusMessage(new - { - masterVolumeLevel = u - })); - - EISC.SetBoolSigAction(BoolJoin.MasterVolumeIsMuted, b => - PostStatusMessage(new - { - masterVolumeMuteState = b - })); - - // shutdown things - EISC.SetSigTrueAction(BoolJoin.ShutdownCancel, new Action(() => - PostMessage("/room/shutdown/", new - { - state = "wasCancelled" - }))); - EISC.SetSigTrueAction(BoolJoin.ShutdownEnd, new Action(() => - PostMessage("/room/shutdown/", new - { - state = "hasFinished" - }))); - EISC.SetSigTrueAction(BoolJoin.ShutdownStart, new Action(() => - PostMessage("/room/shutdown/", new - { - state = "hasStarted", - duration = EISC.UShortOutput[UshortJoin.ShutdownPromptDuration].UShortValue - }))); - - // Config things - EISC.SetSigTrueAction(BoolJoin.ConfigIsReady, LoadConfigValues); - } - - /// - /// Reads in config values when the Simpl program is ready - /// - void LoadConfigValues() - { - Debug.Console(1, this, "Loading configuration from DDVC01 EISC bridge"); - ConfigIsLoaded = false; - - var co = ConfigReader.ConfigObject; - - //Room - if (co.Rooms == null) - co.Rooms = new List(); + } + } + + /// + /// Links feedbacks to whatever is gonna happen! + /// + void SetupFeedbacks() + { + // Power + EISC.SetBoolSigAction(BoolJoin.RoomIsOn, b => + PostStatusMessage(new + { + isOn = b + })); + + // Source change things + EISC.SetSigTrueAction(BoolJoin.SourceHasChanged, () => + PostStatusMessage(new + { + selectedSourceKey = EISC.StringOutput[StringJoin.SelectedSourceKey].StringValue + })); + + // Volume things + EISC.SetUShortSigAction(UshortJoin.MasterVolumeLevel, u => + PostStatusMessage(new + { + masterVolumeLevel = u + })); + + EISC.SetBoolSigAction(BoolJoin.MasterVolumeIsMuted, b => + PostStatusMessage(new + { + masterVolumeMuteState = b + })); + + // shutdown things + EISC.SetSigTrueAction(BoolJoin.ShutdownCancel, new Action(() => + PostMessage("/room/shutdown/", new + { + state = "wasCancelled" + }))); + EISC.SetSigTrueAction(BoolJoin.ShutdownEnd, new Action(() => + PostMessage("/room/shutdown/", new + { + state = "hasFinished" + }))); + EISC.SetSigTrueAction(BoolJoin.ShutdownStart, new Action(() => + PostMessage("/room/shutdown/", new + { + state = "hasStarted", + duration = EISC.UShortOutput[UshortJoin.ShutdownPromptDuration].UShortValue + }))); + + // Config things + EISC.SetSigTrueAction(BoolJoin.ConfigIsReady, LoadConfigValues); + } + + /// + /// Reads in config values when the Simpl program is ready + /// + void LoadConfigValues() + { + Debug.Console(1, this, "Loading configuration from DDVC01 EISC bridge"); + ConfigIsLoaded = false; + + var co = ConfigReader.ConfigObject; + + co.Info.RuntimeInfo.AppName = Assembly.GetExecutingAssembly().GetName().Name; + var version = Assembly.GetExecutingAssembly().GetName().Version; + co.Info.RuntimeInfo.AssemblyVersion = string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build); + + + //Room + if (co.Rooms == null) + co.Rooms = new List(); var rm = new EssentialsRoomConfig(); if (co.Rooms.Count == 0) { @@ -341,284 +347,284 @@ namespace PepperDash.Essentials.Room.Cotija { Debug.Console(0, this, "Replacing Room[0] in config"); co.Rooms[0] = rm; - } - rm.Name = EISC.StringOutput[501].StringValue; - rm.Key = "room1"; - rm.Type = "ddvc01"; - - DDVC01RoomPropertiesConfig rmProps; - if (rm.Properties == null) - rmProps = new DDVC01RoomPropertiesConfig(); - else - rmProps = JsonConvert.DeserializeObject(rm.Properties.ToString()); - - rmProps.Help = new EssentialsHelpPropertiesConfig(); - rmProps.Help.CallButtonText = EISC.StringOutput[503].StringValue; - rmProps.Help.Message = EISC.StringOutput[502].StringValue; - - rmProps.Environment = new EssentialsEnvironmentPropertiesConfig(); // enabled defaults to false - - rmProps.RoomPhoneNumber = EISC.StringOutput[504].StringValue; - rmProps.RoomURI = EISC.StringOutput[505].StringValue; - rmProps.SpeedDials = new List(); - // add speed dials as long as there are more - up to 4 - for (uint i = 512; i <= 519; i = i + 2) - { - var num = EISC.StringOutput[i].StringValue; - if (string.IsNullOrEmpty(num)) - break; - var name = EISC.StringOutput[i + 1].StringValue; - rmProps.SpeedDials.Add(new DDVC01SpeedDial { Number = num, Name = name}); - } - // volume control names - var volCount = EISC.UShortOutput[701].UShortValue; - - // use Volumes object or? - rmProps.VolumeSliderNames = new List(); - for(uint i = 701; i <= 700 + volCount; i++) - { - rmProps.VolumeSliderNames.Add(EISC.StringInput[i].StringValue); - } - - // There should be cotija devices in here, I think... - if(co.Devices == null) - co.Devices = new List(); - - // clear out previous DDVC devices - co.Devices.RemoveAll(d => d.Key.StartsWith("source-", StringComparison.OrdinalIgnoreCase)); - - rmProps.SourceListKey = "default"; - rm.Properties = JToken.FromObject(rmProps); - - // Source list! This might be brutal!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - - var groupMap = GetSourceGroupDictionary(); - - co.SourceLists = new Dictionary>(); - var newSl = new Dictionary(); - // add sources... - for (uint i = 0; i<= 19; i++) - { - var name = EISC.StringOutput[601 + i].StringValue; - if(string.IsNullOrEmpty(name)) - break; - var icon = EISC.StringOutput[651 + i].StringValue; - var key = EISC.StringOutput[671 + i].StringValue; - var type = EISC.StringOutput[701 + i].StringValue; - - Debug.Console(0, this, "Adding source {0} '{1}'", key, name); - var newSLI = new SourceListItem{ - Icon = icon, - Name = name, - Order = (int)i + 1, - SourceKey = key, - }; - newSl.Add(key, newSLI); - - string group = "genericsource"; - if (groupMap.ContainsKey(type)) - { - group = groupMap[type]; - } - - // add dev to devices list - var devConf = new DeviceConfig { - Group = group, - Key = key, - Name = name, - Type = type - }; - co.Devices.Add(devConf); - } - - co.SourceLists.Add("default", newSl); - - Debug.Console(0, this, "******* CONFIG FROM DDVC: \r{0}", JsonConvert.SerializeObject(ConfigReader.ConfigObject, Formatting.Indented)); - - var handler = ConfigurationIsReady; - if (handler != null) - { - handler(this, new EventArgs()); - } - - ConfigIsLoaded = true; - } - - void SendFullStatus() - { - if (ConfigIsLoaded) - { - PostStatusMessage(new - { - isOn = EISC.BooleanOutput[BoolJoin.RoomIsOn].BoolValue, - selectedSourceKey = EISC.StringOutput[StringJoin.SelectedSourceKey].StringValue, - masterVolumeLevel = EISC.UShortOutput[UshortJoin.MasterVolumeLevel].UShortValue, - masterVolumeMuteState = EISC.BooleanOutput[BoolJoin.MasterVolumeIsMuted].BoolValue - }); - } - else - { - PostStatusMessage(new - { - error = "systemNotReady" - }); - } - } - - - - /// - /// Helper for posting status message - /// - /// The contents of the content object - void PostStatusMessage(object contentObject) - { - Parent.SendMessageToServer(JObject.FromObject(new - { - type = "/room/status/", - content = contentObject - })); - } - - /// - /// - /// - /// - /// - void PostMessage(string messageType, object contentObject) - { - Parent.SendMessageToServer(JObject.FromObject(new - { - type = messageType, - content = contentObject - })); - } - - - /// - /// - /// - /// - /// - void EISC_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args) - { - if (Debug.Level >= 1) - Debug.Console(1, this, "DDVC EISC change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue); - var uo = args.Sig.UserObject; - if (uo is Action) - (uo as Action)(args.Sig.BoolValue); - else if (uo is Action) - (uo as Action)(args.Sig.UShortValue); - else if (uo is Action) - (uo as Action)(args.Sig.StringValue); - } - - /// - /// Returns the mapping of types to groups, for setting up devices. - /// - /// - Dictionary GetSourceGroupDictionary() - { - //type, group - var d = new Dictionary(StringComparer.OrdinalIgnoreCase) - { - { "laptop", "pc" }, - { "wireless", "genericsource" }, - { "iptv", "settopbox" } - - }; - return d; - } - - /// - /// updates the usercode from server - /// - protected override void UserCodeChange() - { - Debug.Console(1, this, "Server user code changed: {0}", UserCode); - EISC.StringInput[StringJoin.UserCodeToSystem].StringValue = UserCode; - EISC.StringInput[StringJoin.ServerUrl].StringValue = Parent.Config.ClientAppUrl; - } - - /// - /// - /// - /// - /// - void SourceChange(string oldKey, string newKey) - { - /* Example message - * { -   "type":"/room/status", -   "content": { -     "selectedSourceKey": "off", -   } - } - */ - //if (type == ChangeType.WillChange) - //{ - // // Disconnect from previous source - - // if (info != null) - // { - // var previousDev = info.SourceDevice; - - // // device type interfaces - // if (previousDev is ISetTopBoxControls) - // (previousDev as ISetTopBoxControls).UnlinkActions(Parent); - // // common interfaces - // if (previousDev is IChannel) - // (previousDev as IChannel).UnlinkActions(Parent); - // if (previousDev is IColor) - // (previousDev as IColor).UnlinkActions(Parent); - // if (previousDev is IDPad) - // (previousDev as IDPad).UnlinkActions(Parent); - // if (previousDev is IDvr) - // (previousDev as IDvr).UnlinkActions(Parent); - // if (previousDev is INumericKeypad) - // (previousDev as INumericKeypad).UnlinkActions(Parent); - // if (previousDev is IPower) - // (previousDev as IPower).UnlinkActions(Parent); - // if (previousDev is ITransport) - // (previousDev as ITransport).UnlinkActions(Parent); - // } - - - // var huddleRoom = room as EssentialsHuddleSpaceRoom; - // JObject roomStatus = new JObject(); - // roomStatus.Add("selectedSourceKey", huddleRoom.CurrentSourceInfoKey); - - // JObject message = new JObject(); - - // message.Add("type", "/room/status/"); - // message.Add("content", roomStatus); - - // Parent.PostToServer(message); - //} - //else - //{ - // if (info != null) - // { - // var dev = info.SourceDevice; - - // if (dev is ISetTopBoxControls) - // (dev as ISetTopBoxControls).LinkActions(Parent); - // if (dev is IChannel) - // (dev as IChannel).LinkActions(Parent); - // if (dev is IColor) - // (dev as IColor).LinkActions(Parent); - // if (dev is IDPad) - // (dev as IDPad).LinkActions(Parent); - // if (dev is IDvr) - // (dev as IDvr).LinkActions(Parent); - // if (dev is INumericKeypad) - // (dev as INumericKeypad).LinkActions(Parent); - // if (dev is IPower) - // (dev as IPower).LinkActions(Parent); - // if (dev is ITransport) - // (dev as ITransport).LinkActions(Parent); - // } - //} - } - } + } + rm.Name = EISC.StringOutput[501].StringValue; + rm.Key = "room1"; + rm.Type = "ddvc01"; + + DDVC01RoomPropertiesConfig rmProps; + if (rm.Properties == null) + rmProps = new DDVC01RoomPropertiesConfig(); + else + rmProps = JsonConvert.DeserializeObject(rm.Properties.ToString()); + + rmProps.Help = new EssentialsHelpPropertiesConfig(); + rmProps.Help.CallButtonText = EISC.StringOutput[503].StringValue; + rmProps.Help.Message = EISC.StringOutput[502].StringValue; + + rmProps.Environment = new EssentialsEnvironmentPropertiesConfig(); // enabled defaults to false + + rmProps.RoomPhoneNumber = EISC.StringOutput[504].StringValue; + rmProps.RoomURI = EISC.StringOutput[505].StringValue; + rmProps.SpeedDials = new List(); + // add speed dials as long as there are more - up to 4 + for (uint i = 512; i <= 519; i = i + 2) + { + var num = EISC.StringOutput[i].StringValue; + if (string.IsNullOrEmpty(num)) + break; + var name = EISC.StringOutput[i + 1].StringValue; + rmProps.SpeedDials.Add(new DDVC01SpeedDial { Number = num, Name = name}); + } + // volume control names + var volCount = EISC.UShortOutput[701].UShortValue; + + // use Volumes object or? + rmProps.VolumeSliderNames = new List(); + for(uint i = 701; i <= 700 + volCount; i++) + { + rmProps.VolumeSliderNames.Add(EISC.StringInput[i].StringValue); + } + + // There should be cotija devices in here, I think... + if(co.Devices == null) + co.Devices = new List(); + + // clear out previous DDVC devices + co.Devices.RemoveAll(d => d.Key.StartsWith("source-", StringComparison.OrdinalIgnoreCase)); + + rmProps.SourceListKey = "default"; + rm.Properties = JToken.FromObject(rmProps); + + // Source list! This might be brutal!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + var groupMap = GetSourceGroupDictionary(); + + co.SourceLists = new Dictionary>(); + var newSl = new Dictionary(); + // add sources... + for (uint i = 0; i<= 19; i++) + { + var name = EISC.StringOutput[601 + i].StringValue; + if(string.IsNullOrEmpty(name)) + break; + var icon = EISC.StringOutput[651 + i].StringValue; + var key = EISC.StringOutput[671 + i].StringValue; + var type = EISC.StringOutput[701 + i].StringValue; + + Debug.Console(0, this, "Adding source {0} '{1}'", key, name); + var newSLI = new SourceListItem{ + Icon = icon, + Name = name, + Order = (int)i + 1, + SourceKey = key, + }; + newSl.Add(key, newSLI); + + string group = "genericsource"; + if (groupMap.ContainsKey(type)) + { + group = groupMap[type]; + } + + // add dev to devices list + var devConf = new DeviceConfig { + Group = group, + Key = key, + Name = name, + Type = type + }; + co.Devices.Add(devConf); + } + + co.SourceLists.Add("default", newSl); + + Debug.Console(0, this, "******* CONFIG FROM DDVC: \r{0}", JsonConvert.SerializeObject(ConfigReader.ConfigObject, Formatting.Indented)); + + var handler = ConfigurationIsReady; + if (handler != null) + { + handler(this, new EventArgs()); + } + + ConfigIsLoaded = true; + } + + void SendFullStatus() + { + if (ConfigIsLoaded) + { + PostStatusMessage(new + { + isOn = EISC.BooleanOutput[BoolJoin.RoomIsOn].BoolValue, + selectedSourceKey = EISC.StringOutput[StringJoin.SelectedSourceKey].StringValue, + masterVolumeLevel = EISC.UShortOutput[UshortJoin.MasterVolumeLevel].UShortValue, + masterVolumeMuteState = EISC.BooleanOutput[BoolJoin.MasterVolumeIsMuted].BoolValue + }); + } + else + { + PostStatusMessage(new + { + error = "systemNotReady" + }); + } + } + + + + /// + /// Helper for posting status message + /// + /// The contents of the content object + void PostStatusMessage(object contentObject) + { + Parent.SendMessageToServer(JObject.FromObject(new + { + type = "/room/status/", + content = contentObject + })); + } + + /// + /// + /// + /// + /// + void PostMessage(string messageType, object contentObject) + { + Parent.SendMessageToServer(JObject.FromObject(new + { + type = messageType, + content = contentObject + })); + } + + + /// + /// + /// + /// + /// + void EISC_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args) + { + if (Debug.Level >= 1) + Debug.Console(1, this, "DDVC EISC change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue); + var uo = args.Sig.UserObject; + if (uo is Action) + (uo as Action)(args.Sig.BoolValue); + else if (uo is Action) + (uo as Action)(args.Sig.UShortValue); + else if (uo is Action) + (uo as Action)(args.Sig.StringValue); + } + + /// + /// Returns the mapping of types to groups, for setting up devices. + /// + /// + Dictionary GetSourceGroupDictionary() + { + //type, group + var d = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "laptop", "pc" }, + { "wireless", "genericsource" }, + { "iptv", "settopbox" } + + }; + return d; + } + + /// + /// updates the usercode from server + /// + protected override void UserCodeChange() + { + Debug.Console(1, this, "Server user code changed: {0}", UserCode); + EISC.StringInput[StringJoin.UserCodeToSystem].StringValue = UserCode; + EISC.StringInput[StringJoin.ServerUrl].StringValue = Parent.Config.ClientAppUrl; + } + + /// + /// + /// + /// + /// + void SourceChange(string oldKey, string newKey) + { + /* Example message + * { +   "type":"/room/status", +   "content": { +     "selectedSourceKey": "off", +   } + } + */ + //if (type == ChangeType.WillChange) + //{ + // // Disconnect from previous source + + // if (info != null) + // { + // var previousDev = info.SourceDevice; + + // // device type interfaces + // if (previousDev is ISetTopBoxControls) + // (previousDev as ISetTopBoxControls).UnlinkActions(Parent); + // // common interfaces + // if (previousDev is IChannel) + // (previousDev as IChannel).UnlinkActions(Parent); + // if (previousDev is IColor) + // (previousDev as IColor).UnlinkActions(Parent); + // if (previousDev is IDPad) + // (previousDev as IDPad).UnlinkActions(Parent); + // if (previousDev is IDvr) + // (previousDev as IDvr).UnlinkActions(Parent); + // if (previousDev is INumericKeypad) + // (previousDev as INumericKeypad).UnlinkActions(Parent); + // if (previousDev is IPower) + // (previousDev as IPower).UnlinkActions(Parent); + // if (previousDev is ITransport) + // (previousDev as ITransport).UnlinkActions(Parent); + // } + + + // var huddleRoom = room as EssentialsHuddleSpaceRoom; + // JObject roomStatus = new JObject(); + // roomStatus.Add("selectedSourceKey", huddleRoom.CurrentSourceInfoKey); + + // JObject message = new JObject(); + + // message.Add("type", "/room/status/"); + // message.Add("content", roomStatus); + + // Parent.PostToServer(message); + //} + //else + //{ + // if (info != null) + // { + // var dev = info.SourceDevice; + + // if (dev is ISetTopBoxControls) + // (dev as ISetTopBoxControls).LinkActions(Parent); + // if (dev is IChannel) + // (dev as IChannel).LinkActions(Parent); + // if (dev is IColor) + // (dev as IColor).LinkActions(Parent); + // if (dev is IDPad) + // (dev as IDPad).LinkActions(Parent); + // if (dev is IDvr) + // (dev as IDvr).LinkActions(Parent); + // if (dev is INumericKeypad) + // (dev as INumericKeypad).LinkActions(Parent); + // if (dev is IPower) + // (dev as IPower).LinkActions(Parent); + // if (dev is ITransport) + // (dev as ITransport).LinkActions(Parent); + // } + //} + } + } } \ No newline at end of file diff --git a/PepperDashEssentials/Room/Cotija/RoomBridges/SourceDeviceMapDictionary.cs b/PepperDashEssentials/Room/Cotija/RoomBridges/SourceDeviceMapDictionary.cs index ecd29d59..06d64f94 100644 --- a/PepperDashEssentials/Room/Cotija/RoomBridges/SourceDeviceMapDictionary.cs +++ b/PepperDashEssentials/Room/Cotija/RoomBridges/SourceDeviceMapDictionary.cs @@ -42,23 +42,23 @@ namespace PepperDash.Essentials.Room.Cotija {"preset23", 123}, {"preset24", 124}, - {"key0", 130}, - {"key1", 131}, - {"key2", 132}, - {"key3", 133}, - {"key4", 134}, - {"key5", 135}, - {"key6", 136}, - {"key7", 137}, - {"key8", 138}, - {"key9", 139}, - {"keyDash", 140}, - {"keyEnter", 141}, - {"channelUp", 142}, - {"channelDown", 143}, - {"channelLast", 144}, + {"num0", 130}, + {"num1", 131}, + {"num2", 132}, + {"num3", 133}, + {"num4", 134}, + {"num5", 135}, + {"num6", 136}, + {"num7", 137}, + {"num8", 138}, + {"num9", 139}, + {"numDash", 140}, + {"numEnter", 141}, + {"chanUp", 142}, + {"chanDown", 143}, + {"lastChan", 144}, {"exit", 145}, - {"power", 146}, + {"powerToggle", 146}, {"red", 147}, {"green", 148}, {"yellow", 149}, @@ -71,21 +71,27 @@ namespace PepperDash.Essentials.Room.Cotija {"closedCaption", 156}, {"stop", 157}, {"pause", 158}, - {"cursorUp", 159}, - {"cursorDown", 160}, - {"cursorLeft", 161}, - {"cursorRight", 162}, + {"up", 159}, + {"down", 160}, + {"left", 161}, + {"right", 162}, {"settings", 163}, {"info", 164}, {"return", 165}, {"guide", 166}, {"reboot", 167}, - + {"dvrList", 168}, + {"replay", 169}, {"play", 170}, - {"cursorOk", 171}, + {"select", 171}, {"record", 172}, {"menu", 173}, - {"topMenu", 174} + {"topMenu", 174}, + {"prevTrack", 175}, + {"nextTrack", 176}, + {"powerOn", 177}, + {"powerOff", 178} + }; diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz index 102c997c9554f2b2a6d2f24a79df637390c02f8c..f0921bcedee23a36431907e380282467a9cda19b 100644 GIT binary patch delta 551255 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

aS1u3qZj$2lmnwNbMpTUIeh;J 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

j)rb0T%=4+=MT<*1gPx?JqVW~EO3 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