diff --git a/Example Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json b/Example Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json new file mode 100644 index 00000000..3fb02ce8 --- /dev/null +++ b/Example Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json @@ -0,0 +1,439 @@ +{ + "system_url": "", + "template": { + "info": { + "comment": "", + "requiredControlSofwareVersion": "", + "systemType": "huddle", + "lastModifiedDate": "2018-07-09T20:00:47.873Z", + "lastUid": 23, + "processorType": "rmc3" + }, + "devices": [ + { + "key": "processor", + "group": "processor", + "uid": 0, + "supportsCompliance": true, + "type": "rmc3", + "properties": {}, + "name": "RMC3" + }, + { + "key": "comm-1", + "uid": 1, + "name": "Generic comm 1", + "type": "genericComm", + "group": "comm", + "properties": { + "control": { + "comParams": { + "hardwareHandshake": "None", + "parity": "None", + "protocol": "RS232", + "baudRate": 9600, + "dataBits": 8, + "softwareHandshake": "None", + "stopBits": 1 + }, + "controlPortNumber": 1, + "controlPortDevKey": "processor", + "method": "Com" + } + } + }, + { + "key": "tcp-1", + "uid": 2, + "name": "Generic TCP 1", + "type": "genericComm", + "group": "comm", + "properties": { + "control": { + "tcpSshProperties": { + "username": "", + "autoReconnect": true, + "AutoReconnectIntervalMs": 2000, + "port": 23, + "address": "0.0.0.0", + "password": "" + }, + "method": "Tcpip" + } + } + }, + { + "key": "ssh-1", + "uid": 3, + "name": "Generic SSH 1", + "type": "genericComm", + "group": "comm", + "properties": { + "control": { + "tcpSshProperties": { + "username": "crestron", + "autoReconnect": true, + "AutoReconnectIntervalMs": 2000, + "port": 22, + "address": "10.11.50.135", + "password": "2H3Zu&OvgXp6" + }, + "method": "Ssh" + } + } + }, + { + "key": "eisc-1A", + "uid": 4, + "type": "eiscApi", + "group": "api", + "properties": { + "control": { + "tcpSshProperties": { + "address": "127.0.0.2", + "port": 0 + }, + "ipId": "1A" + }, + "devices": [ + { + "deviceKey": "comm-1", + "joinStart": 3001 + }, + { + "deviceKey": "tcp-1", + "joinStart": 3011 + }, + { + "deviceKey": "ssh-1", + "joinStart": 3021 + }, + { + "deviceKey": "dmMd8x8-1", + "joinStart": 1 + }, + { + "deviceKey": "dmTx201C-1", + "joinStart": 3051 + }, + { + "deviceKey": "dmRmc4kScalerC-1", + "joinStart": 3061 + }, + { + "deviceKey": "dmRmc200C-1", + "joinStart": 3071 + }, + { + "deviceKey": "dmRmc100C-1", + "joinStart": 3081 + }, + { + "deviceKey": "comm-2", + "joinStart": 2501 + }, + { + "deviceKey": "comm-3", + "joinStart": 2511 + }, + { + "deviceKey": "comm-4", + "joinStart": 2521 + }, + { + "deviceKey": "cec-1", + "joinStart": 2531 + }, + { + "deviceKey": "cec-2", + "joinStart": 2541 + }, + { + "deviceKey": "cec-3", + "joinStart": 2551 + }, + { + "deviceKey": "cec-4", + "joinStart": 2561 + }, + { + "deviceKey": "cec-5", + "joinStart": 2571 + }, + { + "deviceKey": "cec-6", + "joinStart": 2581 + }, + { + "deviceKey": "cec-7", + "joinStart": 2591 + }, + { + "deviceKey": "gls-oir-1", + "joinStart": 2701 + }, + { + "deviceKey": "gls-odt-1", + "joinStart": 2751 + } + ] + } + }, + { + "key": "dmMd8x8-1", + "uid": 5, + "name": "DM-MD8x8 Chassis 1", + "type": "dmMd8x8", + "group": "dmChassis", + "properties": { + "control": { + "method": "ipid", + "ipid": "40", + "params": { + "endOfLineString": "\n", + "deviceReadyResponsePattern": ".*>" + } + }, + "volumeControls": {}, + "inputSlots": { + "1": "dmcHdDsp", + "2": "dmcHdDsp", + "3": "dmcDvi", + "4": "dmcDvi", + "5": "dmcC", + "6": "dmcCDsp" + }, + "outputSlots": { + "1": "dmcCoHd", + "2": "dmcCoHd" + }, + "inputNames": { + "1": "Input 1", + "2": "Input 2", + "3": "Input 3", + "4": "Input 4", + "5": "Input 5", + "6": "Input 6" + }, + "parentDeviceKey": "processor", + "outputNames": { + "1": "Output 1", + "2": "Output 2", + "3": "Output 3", + "4": "Output 4" + } + } + }, + { + "key": "dmTx201C-1", + "uid": 6, + "name": "DM-TX-201C 1", + "type": "dmTx201C", + "group": "dmEndpoint", + "properties": { + "control": { + "method": "ipid", + "ipid": "45", + "params": { + "endOfLineString": "\n", + "deviceReadyResponsePattern": ".*>" + } + }, + "parentDeviceKey": "dmMd8x8-1", + "parentInputNumber": "5" + } + }, + { + "key": "dmRmc4kScalerC-1", + "uid": 7, + "name": "DM-RMC-4K-SCALER-C Out 1", + "type": "dmRmc4kScalerC", + "group": "dmEndpoint", + "properties": { + "control": { + "method": "ipid", + "ipid": "61", + "params": { + "endOfLineString": "\n", + "deviceReadyResponsePattern": ".*>" + } + }, + "parentDeviceKey": "dmMd8x8-1", + "parentOutputNumber": "1" + } + }, + { + "key": "dmRmc200C-1", + "uid": 8, + "name": "DM-RMC-200-C Out 2", + "type": "dmRmc200C", + "group": "dmEndpoint", + "properties": { + "control": { + "method": "ipid", + "ipid": "62", + "params": { + "endOfLineString": "\n", + "deviceReadyResponsePattern": ".*>" + } + }, + "parentDeviceKey": "dmMd8x8-1", + "parentOutputNumber": "2" + } + }, + { + "key": "dmRmc100C-1", + "uid": 9, + "name": "DM-RMC-100-C Out 3", + "type": "dmRmc100C", + "group": "dmEndpoint", + "properties": { + "control": { + "method": "ipid", + "ipid": "63", + "params": { + "endOfLineString": "\n", + "deviceReadyResponsePattern": ".*>" + } + }, + "parentDeviceKey": "dmMd8x8-1", + "parentOutputNumber": "3" + } + }, + { + "key": "comm-2", + "uid": 10, + "name": "Rmc comm 1", + "type": "genericComm", + "group": "comm", + "properties": { + "control": { + "comParams": { + "hardwareHandshake": "None", + "parity": "None", + "protocol": "RS232", + "baudRate": 9600, + "dataBits": 8, + "softwareHandshake": "None", + "stopBits": 1 + }, + "controlPortNumber": 1, + "controlPortDevKey": "dmRmc4kScalerC-1", + "method": "Com" + } + } + }, + { + "key": "comm-3", + "uid": 11, + "name": "Rmc comm 2", + "type": "genericComm", + "group": "comm", + "properties": { + "control": { + "comParams": { + "hardwareHandshake": "None", + "parity": "None", + "protocol": "RS232", + "baudRate": 9600, + "dataBits": 8, + "softwareHandshake": "None", + "stopBits": 1 + }, + "controlPortNumber": 1, + "controlPortDevKey": "dmRmc200C-1", + "method": "Com" + } + } + }, + { + "key": "cec-1", + "uid": 13, + "name": "Tx 5 cec 1", + "type": "genericComm", + "group": "comm", + "properties": { + "control": { + "controlPortName": "HdmiIn", + "controlPortDevKey": "dmTx201C-1", + "method": "Cec" + } + } + }, + { + "key": "cec-5", + "uid": 17, + "name": "Rmc 1 cec 1", + "type": "genericComm", + "group": "comm", + "properties": { + "control": { + "controlPortName": "HdmiOut", + "controlPortDevKey": "dmRmc4kScalerC-1", + "method": "Cec" + } + } + }, + { + "key": "cec-6", + "uid": 18, + "name": "Dm Chassis In 1 cec 1", + "type": "genericComm", + "group": "comm", + "properties": { + "control": { + "controlPortName": "inputCard1--hdmiIn", + "controlPortDevKey": "dmMd8x8-1", + "method": "Cec" + } + } + }, + { + "key": "cec-7", + "uid": 19, + "name": "Dm Chassis Out 1 cec 1", + "type": "genericComm", + "group": "comm", + "properties": { + "control": { + "controlPortName": "outputCard1--hdmiOut1", + "controlPortDevKey": "dmMd8x8-1", + "method": "Cec" + } + } + }, + { + "key": "gls-oir-1", + "uid": 19, + "name": "GLS-OIR-CN 1", + "type": "glsoirccn", + "group": "occupancy", + "properties": { + "control": { + "cresnetId": "41", + "method": "cresnet" + } + } + }, + { + "key": "gls-odt-1", + "uid": 19, + "name": "GLS-ODT-CN 1", + "type": "glsodtccn", + "group": "occupancy", + "properties": { + "control": { + "cresnetId": "42", + "method": "cresnet" + } + } + } + ], + "rooms": [], + "sourceLists": {}, + "tieLines": [] + }, + "template_url": "", + "system": { + } +} \ No newline at end of file diff --git a/Example Configuration/SIMPLBridging/configurationFile-dmps3300c-avRouting.json b/Example Configuration/SIMPLBridging/configurationFile-dmps3300c-avRouting.json new file mode 100644 index 00000000..de6d6fa4 --- /dev/null +++ b/Example Configuration/SIMPLBridging/configurationFile-dmps3300c-avRouting.json @@ -0,0 +1,70 @@ +{ + "system_url": "", + "template": { + "info": { + "comment": "", + "requiredControlSofwareVersion": "", + "systemType": "huddle", + "lastModifiedDate": "2018-07-09T20:00:47.873Z", + "lastUid": 23, + "processorType": "dmps3300c" + }, + "devices": [ + { + "key": "processor", + "group": "processor", + "uid": 0, + "supportsCompliance": true, + "type": "dmps3300c", + "properties": { + }, + "name": "DMPS3-300-C" + }, + { + "key": "eisc-A", + "uid":4, + "type": "eiscApi", + "group":"api", + "properties": { + "control":{ + "tcpSshProperties":{ + "address":"127.0.0.2", + "port":0 + }, + "ipId":"1A" + }, + "devices": [ + { + "deviceKey":"processor-avRouting", + "joinStart":1 + }, + { + "deviceKey":"processor-programAudioOutput", + "joinStart":3001 + }, + { + "deviceKey":"processor-aux1AudioOutput", + "joinStart":3011 + }, + { + "deviceKey":"processor-aux2AudioOutput", + "joinStart":3021 + } + ] + } + } + ], + "rooms": [ + + ], + "sourceLists": { + + }, + "tieLines": [ + ] + }, + "template_url": "", + "system": { + + } +} \ No newline at end of file diff --git a/PepperDashEssentials/PepperDashEssentials.csproj b/PepperDashEssentials/PepperDashEssentials.csproj index 82ebc282..f808a708 100644 --- a/PepperDashEssentials/PepperDashEssentials.csproj +++ b/PepperDashEssentials/PepperDashEssentials.csproj @@ -189,7 +189,6 @@ - diff --git a/PepperDashEssentials/Room/Types/EssentialsPresentationRoom.cs b/PepperDashEssentials/Room/Types/EssentialsPresentationRoom.cs deleted file mode 100644 index 10a87dca..00000000 --- a/PepperDashEssentials/Room/Types/EssentialsPresentationRoom.cs +++ /dev/null @@ -1,437 +0,0 @@ -//using System; -//using System.Collections.Generic; -//using System.Linq; -//using System.Text; -//using Crestron.SimplSharp; - -//using PepperDash.Core; -//using PepperDash.Essentials.Core; -//using PepperDash.Essentials.Room.Config; - -//namespace PepperDash.Essentials -//{ -// public class EssentialsPresentationRoom : EssentialsRoomBase, IHasCurrentSourceInfoChange -// { -// public event EventHandler CurrentVolumeDeviceChange; -// public event SourceInfoChangeHandler CurrentSingleSourceChange; -// public event SourceInfoChangeHandler CurrentDisplay1SourceChange; -// public event SourceInfoChangeHandler CurrentDisplay2SourceChange; - -// protected override Func OnFeedbackFunc { get { -// return () => (CurrentSingleSourceInfo != null -// && CurrentSingleSourceInfo.Type != eSourceListItemType.Off) -// || (Display1SourceInfo != null -// && Display1SourceInfo.Type != eSourceListItemType.Off) -// || (Display2SourceInfo != null -// && Display2SourceInfo.Type != eSourceListItemType.Off); } } - -// protected override Func IsWarmingFeedbackFunc { get { return () =>false;; } } -// protected override Func IsCoolingFeedbackFunc { get { return () => false; } } - -// public EssentialsPresentationRoomPropertiesConfig Config { get; private set; } - -// public Dictionary Displays { get; private set; } - -// public IRoutingSinkNoSwitching DefaultAudioDevice { get; private set; } -// public IBasicVolumeControls DefaultVolumeControls { get; private set; }C:\Working Directories\PD\essentials\PepperDashEssentials\Room\Types\EssentialsPresentationRoom.cs - -// /// -// /// The config name of the source list -// /// -// public string SourceListKey { get; set; } - -// /// -// /// If room is off, enables power on to last source. Default true -// /// -// public bool EnablePowerOnToLastSource { get; set; } -// string LastSourceKey; - -// public enum eVideoRoutingMode -// { -// SelectSourceSelectDisplay, SourceToAllDisplays -// } - -// public eVideoRoutingMode VideoRoutingMode { get; set; } - -// public enum eAudioRoutingMode -// { -// AudioFollowsLastVideo, SelectAudioFromDisplay -// } - -// /// -// /// -// /// -// public IBasicVolumeControls CurrentVolumeControls -// { -// get { return _CurrentAudioDevice; } -// set -// { -// if (value == _CurrentAudioDevice) return; - -// var oldDev = _CurrentAudioDevice; -// // derigister this room from the device, if it can -// if (oldDev is IInUseTracking) -// (oldDev as IInUseTracking).InUseTracker.RemoveUser(this, "audio"); -// var handler = CurrentVolumeDeviceChange; -// if (handler != null) -// CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.WillChange)); -// _CurrentAudioDevice = value; -// if (handler != null) -// CurrentVolumeDeviceChange(this, new VolumeDeviceChangeEventArgs(oldDev, value, ChangeType.DidChange)); -// // register this room with new device, if it can -// if (_CurrentAudioDevice is IInUseTracking) -// (_CurrentAudioDevice as IInUseTracking).InUseTracker.AddUser(this, "audio"); -// } -// } -// IBasicVolumeControls _CurrentAudioDevice; - -// /// -// /// The SourceListItem last run - containing names and icons. The complex setter is -// /// to add/remove this room to the source's InUseTracking, if it is capable -// /// -// public SourceListItem CurrentSingleSourceInfo -// { -// get { return _CurrentSingleSourceInfo; } -// private set -// { -// if (value == _CurrentSingleSourceInfo) return; - -// var handler = CurrentSingleSourceChange; -// // remove from in-use tracker, if so equipped -// if(_CurrentSingleSourceInfo != null && _CurrentSingleSourceInfo.SourceDevice is IInUseTracking) -// (_CurrentSingleSourceInfo.SourceDevice as IInUseTracking).InUseTracker.RemoveUser(this, "control"); - -// if (handler != null) -// handler(this, _CurrentSingleSourceInfo, ChangeType.WillChange); - -// _CurrentSingleSourceInfo = value; - -// // add to in-use tracking -// if (_CurrentSingleSourceInfo != null && _CurrentSingleSourceInfo.SourceDevice is IInUseTracking) -// (_CurrentSingleSourceInfo.SourceDevice as IInUseTracking).InUseTracker.AddUser(this, "control"); -// if (handler != null) -// handler(this, _CurrentSingleSourceInfo, ChangeType.DidChange); -// } -// } -// SourceListItem _CurrentSingleSourceInfo; - -// public SourceListItem Display1SourceInfo -// { -// get { return _Display1SourceInfo; } -// set -// { -// if (value == _Display1SourceInfo) return; - -// var handler = CurrentDisplay1SourceChange; -// if (handler != null) -// handler(this, _Display1SourceInfo, ChangeType.WillChange); - -// _Display1SourceInfo = value; - -// if (handler != null) -// handler(this, _Display1SourceInfo, ChangeType.DidChange); -// } -// } -// SourceListItem _Display1SourceInfo; - -// public SourceListItem Display2SourceInfo -// { -// get { return _Display2SourceInfo; } -// set -// { -// if (value == _Display2SourceInfo) return; - -// var handler = CurrentDisplay2SourceChange; -// if (handler != null) -// handler(this, _Display2SourceInfo, ChangeType.WillChange); - -// _Display2SourceInfo = value; - -// if (handler != null) -// handler(this, _Display2SourceInfo, ChangeType.DidChange); -// } -// } -// SourceListItem _Display2SourceInfo; - -// /// -// /// If an audio dialer is available for this room -// /// -// public bool HasAudioDialer { get { return false; } } -// /// -// /// -// /// -// /// -// /// -// public EssentialsPresentationRoom(string key, string name, -// Dictionary displays, -// IBasicVolumeWithFeedback defaultVolume, EssentialsPresentationRoomPropertiesConfig config) -// : base(key, name) -// { -// Config = config; -// Displays = displays; - -// DefaultVolumeControls = defaultVolume; -// CurrentVolumeControls = defaultVolume; - -// //DefaultAudioDevice = defaultAudio; -// //if (defaultAudio is IBasicVolumeControls) -// // DefaultVolumeControls = defaultAudio as IBasicVolumeControls; -// //else if (defaultAudio is IHasVolumeDevice) -// // DefaultVolumeControls = (defaultAudio as IHasVolumeDevice).VolumeDevice; - - -// SourceListKey = "default"; -// EnablePowerOnToLastSource = true; -// } - -// /// -// /// Run the same source to all destinations -// /// -// /// -// public void RouteSourceToAllDestinations(SourceListItem sourceItem) -// { -// if (Config.Volumes.Master != null) -// { -// var audioDev = DeviceManager.GetDeviceForKey(Config.Volumes.Master.DeviceKey); -// if (audioDev is IBasicVolumeWithFeedback) -// { - -// } -// } - -// foreach (var display in Displays.Values) -// { -// if (sourceItem != null) -// DoVideoRoute(sourceItem.SourceKey, display.Key); -// else -// DoVideoRoute("$off", display.Key); -// } -// Display1SourceInfo = sourceItem; -// Display2SourceInfo = sourceItem; -// CurrentSingleSourceInfo = sourceItem; -// OnFeedback.FireUpdate(); -// } - -// public void SourceToDisplay1(SourceListItem sourceItem) -// { -// DoVideoRoute(sourceItem.SourceKey, Displays[1].Key); -// Display1SourceInfo = sourceItem; -// OnFeedback.FireUpdate(); -// } - -// public void SourceToDisplay2(SourceListItem sourceItem) -// { -// DoVideoRoute(sourceItem.SourceKey, Displays[2].Key); -// Display2SourceInfo = sourceItem; -// OnFeedback.FireUpdate(); -// } - - -// /// -// /// Basic source -> destination routing -// /// -// void DoVideoRoute(string sourceKey, string destinationKey) -// { -// new CTimer(o => -// { -// var dest = DeviceManager.GetDeviceForKey(destinationKey) as IRoutingSinkNoSwitching; -// if (dest == null) -// { -// Debug.Console(1, this, "Cannot route. Destination '{0}' not found", destinationKey); -// return; -// } -// // off is special case -// if (sourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase)) -// { -// dest.ReleaseRoute(); -// if (dest is IPower) -// (dest as IPower).PowerOff(); -// return; -// } - -// var source = DeviceManager.GetDeviceForKey(sourceKey) as IRoutingOutputs; -// if (source == null) -// { -// Debug.Console(1, this, "Cannot route. Source '{0}' not found", sourceKey); -// return; -// } -// dest.ReleaseAndMakeRoute(source, eRoutingSignalType.Video); -// }, 0); -// } - -// /// -// /// -// /// -// protected override void EndShutdown() -// { -// RunRouteAction("roomoff"); -// } - -// /// -// /// -// /// -// /// -// public void RunRouteAction(string routeKey) -// { -// RunRouteAction(routeKey, null); -// } - -// /// -// /// Gets a source from config list SourceListKey and dynamically build and executes the -// /// route or commands -// /// -// /// -// public void RunRouteAction(string routeKey, Action successCallback) -// { -// // Run this on a separate thread -// new CTimer(o => -// { -// Debug.Console(1, this, "Run room action '{0}'", routeKey); -// var dict = ConfigReader.ConfigObject.GetSourceListForKey(SourceListKey); -// if(dict == null) -// { -// Debug.Console(1, this, "WARNING: Config source list '{0}' not found", SourceListKey); -// return; -// } - -// // Try to get the list item by it's string key -// if (!dict.ContainsKey(routeKey)) -// { -// Debug.Console(1, this, "WARNING: No item '{0}' found on config list '{1}'", -// routeKey, SourceListKey); -// return; -// } - -// var item = dict[routeKey]; -// //Debug.Console(2, this, "Action {0} has {1} steps", -// // item.SourceKey, item.RouteList.Count); - -// // Let's run it -// if (routeKey.ToLower() != "roomoff") -// LastSourceKey = routeKey; - -// foreach (var route in item.RouteList) -// { -// // if there is a $defaultAll on route, run two separate -// if (route.DestinationKey.Equals("$defaultAll", StringComparison.OrdinalIgnoreCase)) -// { -// var tempAudio = new SourceRouteListItem -// { -// DestinationKey = "$defaultDisplay", -// SourceKey = route.SourceKey, -// Type = eRoutingSignalType.Video -// }; -// DoRoute(tempAudio); - -// var tempVideo = new SourceRouteListItem -// { -// DestinationKey = "$defaultAudio", -// SourceKey = route.SourceKey, -// Type = eRoutingSignalType.Audio -// }; -// DoRoute(tempVideo); -// continue; -// } -// else -// DoRoute(route); -// } - -// // Set volume control on room, using default if non provided -// IBasicVolumeControls volDev = null; -// // Handle special cases for volume control -// if (string.IsNullOrEmpty(item.VolumeControlKey) -// || item.VolumeControlKey.Equals("$defaultAudio", StringComparison.OrdinalIgnoreCase)) -// volDev = DefaultVolumeControls; -// //else if (item.VolumeControlKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase)) -// // volDev = DefaultDisplay as IBasicVolumeControls; -// // Or a specific device, probably rarely used. -// else -// { -// var dev = DeviceManager.GetDeviceForKey(item.VolumeControlKey); -// if (dev is IBasicVolumeControls) -// volDev = dev as IBasicVolumeControls; -// else if (dev is IHasVolumeDevice) -// volDev = (dev as IHasVolumeDevice).VolumeDevice; -// } -// CurrentVolumeControls = volDev; - -// // store the name and UI info for routes -// if (item.SourceKey != null) -// CurrentSingleSourceInfo = item; -// // And finally, set the "control". This will trigger event -// //CurrentControlDevice = DeviceManager.GetDeviceForKey(item.SourceKey) as Device; - -// OnFeedback.FireUpdate(); - -// // report back when done -// if (successCallback != null) -// successCallback(); -// }, 0); // end of CTimer -// } - -// /// -// /// Will power the room on with the last-used source -// /// -// public void PowerOnToDefaultOrLastSource() -// { -// if (!EnablePowerOnToLastSource || LastSourceKey == null) -// return; -// RunRouteAction(LastSourceKey); -// } - -// /// -// /// Does what it says -// /// -// public override void SetDefaultLevels() -// { -// Debug.Console(0, this, "SetDefaultLevels not implemented"); -// } - -// /// -// /// -// /// -// /// -// /// -// bool DoRoute(SourceRouteListItem route) -// { -// IRoutingSinkNoSwitching dest = null; - -// if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase)) -// dest = DefaultAudioDevice; -// //else if (route.DestinationKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase)) -// // dest = DefaultDisplay; -// else -// dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSinkNoSwitching; - -// if (dest == null) -// { -// Debug.Console(1, this, "Cannot route, unknown destination '{0}'", route.DestinationKey); -// return false; -// } - -// if (route.SourceKey.Equals("$off", StringComparison.OrdinalIgnoreCase)) -// { -// dest.ReleaseRoute(); -// if (dest is IPower) -// (dest as IPower).PowerOff(); -// } -// else -// { -// var source = DeviceManager.GetDeviceForKey(route.SourceKey) as IRoutingOutputs; -// if (source == null) -// { -// Debug.Console(1, this, "Cannot route unknown source '{0}' to {1}", route.SourceKey, route.DestinationKey); -// return false; -// } -// dest.ReleaseAndMakeRoute(source, route.Type); -// } -// return true; -// } - -// public override void RoomVacatedForTimeoutPeriod(object o) -// { -// //Implement this -// } - -// } -//} \ No newline at end of file diff --git a/docs/Plugin Load Sequence.png b/docs/Plugin Load Sequence.png new file mode 100644 index 00000000..d7c4732c Binary files /dev/null and b/docs/Plugin Load Sequence.png differ diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/GenericHttpClient.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/GenericHttpClient.cs similarity index 98% rename from essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/GenericHttpClient.cs rename to essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/GenericHttpClient.cs index 53b4efd6..830b10e1 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/GenericHttpClient.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Config/Comm and IR/GenericHttpClient.cs @@ -7,7 +7,7 @@ using Crestron.SimplSharp.Net.Http; using PepperDash.Core; using PepperDash.Core.DebugThings; -namespace PepperDash.Essentials.Devices.Common +namespace PepperDash.Essentials.Core { public class GenericHttpClient : Device, IBasicCommunication { diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj index 587159a2..815f6658 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj @@ -113,6 +113,7 @@ + diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/DspBase.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/DspBase.cs index 36c655d2..318268f1 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/DspBase.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/DSP/DspBase.cs @@ -62,7 +62,6 @@ namespace PepperDash.Essentials.Devices.Common.DSP /// In BiAmp: Instance Tag, QSC: Named Control, Polycom: /// string ControlPointTag { get; } -#warning I dont think index1 and index2 should be a part of the interface. JTA 2018-07-17 int Index1 { get; } int Index2 { get; } bool HasMute { get; } diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj index bed83feb..6b57d1ca 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Essentials Devices Common.csproj @@ -112,11 +112,6 @@ - - - - - diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertsEndpointStatusServer.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertsEndpointStatusServer.cs deleted file mode 100644 index 5867b51a..00000000 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertsEndpointStatusServer.cs +++ /dev/null @@ -1,152 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; -using PepperDash.Core; -using PepperDash.Essentials.Core; -using System.Text.RegularExpressions; -using Crestron.SimplSharp.Net.Http; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; - -using Crestron.SimplSharp.CrestronSockets; - - -namespace PepperDash.Essentials.Devices.Common -{ - - /***** - * TODO JTA: Add Polling - * TODO JTA: Move all the registration commnads to the EvertEndpoint class. - * - * - * - * - * - */ - - public class EvertzEndpointStatusServer : Device - { - public IBasicCommunication Communication { get; private set; } - public CommunicationGather PortGather { get; private set; } - public StatusMonitorBase CommunicationMonitor { get; private set; } - public bool isSubscribed; - public string Address; - public GenericUdpServer Server; - - - - /// - /// Shows received lines as hex - /// - public bool ShowHexResponse { get; set; } - public Dictionary Endpoints; - public Dictionary ServerIdByEndpointIp; - - public EvertzEndpointStatusServer(string key, string name, GenericUdpServer server, EvertzEndpointStatusServerPropertiesConfig props) : - base(key, name) - { - Server = server; - Address = props.serverHostname; - Server.DataRecievedExtra += new EventHandler(_Server_DataRecievedExtra); - - Server.Connect(); - Endpoints = new Dictionary(); - - //CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); - } - - - - //TODO JTA: Move this method and process over to the endpoint itself. return a bool. - public bool RegisterEvertzEndpoint (EvertzEndpoint device) - { - - if (Endpoints.ContainsKey(device.Address) == false) - { - Endpoints.Add(device.Address, device); - } - - return true; - } - - - - - void _Server_DataRecievedExtra(object sender, GenericUdpReceiveTextExtraArgs e) - { - Debug.Console(2, this, "_Server_DataRecievedExtra:\nIP:{0}\nPort:{1}\nText{2}\nBytes:{3} ", e.IpAddress, e.Port, e.Text, e.Bytes); - } - - public override bool CustomActivate() - { - /* - Communication.Connect(); - CommunicationMonitor.StatusChange += (o, a) => { Debug.Console(2, this, "Communication monitor state: {0}", CommunicationMonitor.Status); }; - CommunicationMonitor.Start(); - */ - - - - - - return true; - } - - } - - - - - - - - - - - - public class EvertzPortRestResponse - { - public string id; - public string name; - public string type; - public string value; - - } - - public class EvertsStatusRequesstResponse - { - public EvertzStatusDataResponse data; - public string error; - } - - public class EvertzStatusDataResponse - { - public List servers; - } - - public class EvertzServerStatusResponse - { - public string id; - public string name; - public EvertsServerStausNotificationsResponse notify; - - } - public class EvertsServerStausNotificationsResponse - { - public string ip; - public List parameters; - public string port; - public string protocol; - } - public class EvertzEndpointStatusServerPropertiesConfig - { - - public ControlPropertiesConfig control { get; set; } - public string serverHostname { get; set; } - - } - - } diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertzEndpoint.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertzEndpoint.cs deleted file mode 100644 index 7ab504d1..00000000 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertzEndpoint.cs +++ /dev/null @@ -1,337 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; -using PepperDash.Core; -using PepperDash.Essentials.Core; -using System.Text.RegularExpressions; -using Crestron.SimplSharp.Net.Http; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - - -namespace PepperDash.Essentials.Devices.Common -{ - - public class EvertzEndpoint : Device - { - - - - public IBasicCommunication Communication { get; private set; } - public CommunicationGather PortGather { get; private set; } - public GenericCommunicationMonitor CommunicationMonitor { get; private set; } - - private GenericHttpClient Client; - public string userName; - public string password; - public string Address; - private bool OnlineStatus; - public BoolFeedback OnlineFeedback; - public IntFeedback PresetFeedback; - - - public bool isSubscribed; - - - - CrestronQueue CommandQueue; - - public Dictionary Ports; - - private string _ControllerKey; - - - private EvertzEndpointStatusServer StatusServer; - private String StatusServerId; - - /// - /// Shows received lines as hex - /// - public bool ShowHexResponse { get; set; } - - public EvertzEndpoint(string key, string name, EvertzEndpointPropertiesConfig props, string type) : - base(key, name) - { - - - this.Address = props.address; - Client = new GenericHttpClient(string.Format("{0}-GenericWebClient", name), string.Format("{0}-GenericWebClient", name), this.Address); - Client.ResponseRecived += new EventHandler(Client_ResponseRecived); - Ports = new Dictionary(); - if (type.ToLower() == "mma10g-trs4k") - { - //create port hdmi 01 - EvertzEndpointPort hdmi1 = new EvertzEndpointPort("HDMI01", "131.0@s", "136.0@s"); - EvertzEndpointPort hdmi2 = new EvertzEndpointPort("HDMI02", "131.1@s", "136.1@s"); - // add to dictionay with all keys - addPortToDictionary(hdmi1); - addPortToDictionary(hdmi2); - } - _ControllerKey = null; - if (props.controllerKey != null) - { - _ControllerKey = props.controllerKey; - } - AddPostActivationAction( () => {PostActivation();}); - CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); - if (props.CommunicationMonitorProperties != null) - { - CommunicationMonitor = new GenericCommunicationMonitor(this, Client, props.CommunicationMonitorProperties); - } - else - { - CommunicationMonitor = new GenericCommunicationMonitor(this, Client, 40000, 120000, 300000, "v.api/apis/EV/SERVERSTATUS"); - } - - - } - - /// - /// Helper method - /// - /// - private void addPortToDictionary(EvertzEndpointPort port) - { - Ports.Add(port.PortName, port); - Ports.Add(port.ResolutionVarID, port); - Ports.Add(port.SyncVarID, port); - //PollForState(port.SyncVarID); - //PollForState(port.ResolutionVarID); - } - - /// - /// - /// - /// - public override bool CustomActivate() - { - - // Create Device -> Constructor fires - // PreActivations get called - // CustomActivate Gets Called Anything that is involved with this single class Ex: Connection, Setup Feedback, Etc. - // After this point all devices are ready for interaction - // PostActivation gets called. Use this for interClass activation. - CommunicationMonitor.Start(); - OnlineFeedback = new BoolFeedback(() => { return OnlineStatus; }); - - - //CrestronConsole.AddNewConsoleCommand(SendLine, "send" + Key, "", ConsoleAccessLevelEnum.AccessOperator); - return true; - } - - /// - /// - /// - private void PostActivation() - { - Debug.Console(2, this, "EvertzEndpoint Post Activation"); - if (_ControllerKey != null) - { - StatusServer = DeviceManager.GetDeviceForKey(_ControllerKey) as EvertzEndpointStatusServer; - StatusServer.RegisterEvertzEndpoint(this); - - // RegisterStatusServer(); - // SendStatusRequest(); - } - // PollAll(); - } - - void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType) - { - if (programEventType == eProgramStatusEventType.Stopping) - { - Debug.Console(1, this, "Program stopping. Disabling EvertzStatusServer"); - if (StatusServerId != null) - { - //UnregisterServer(); - } - } - } - - private void ProcessServerStatusRequest(EvertsStatusRequesstResponse status) - { - // var status = JsonConvert.DeserializeObject(SendStatusRequest()); - if (status.error != null) - { - - } - else if (status.data != null) - { - foreach (var server in status.data.servers) - { - if (server.name == string.Format("{0}-{1}", this.Name, StatusServer.Address)) - { - StatusServerId = server.id; - Debug.Console(2, this, "EvertzEndpoint {0} StatusServer {1} Registered ID {2}", Name, StatusServer.Name, StatusServerId); - /* - - foreach (var port in Ports) - { - // TODO JTA: This needs a better check - // you get a {"status": "success"} or "error": "error to register notification- Variable exists.." - if (!server.notify.parameters.Contains(port.Value.ResolutionVarID)) - { - RegisterForNotification(StatusServerId, port.Value.ResolutionVarID); - } - if (!server.notify.parameters.Contains(port.Value.ResolutionVarID)) - { - RegisterForNotification(StatusServerId, port.Value.SyncVarID); - } - } - */ - - break; - } - } - StatusServerId = null; - } - } - private void RegisterServerWithEndpoint() - { - /* - var registrationResult = RegisterServer(StatusServer.Address, string.Format("{0}-{1}", this.Name, StatusServer.Address), StatusServer.Server.Port.ToString()); - Debug.Console(2, this, "EvertzEndpointStatusServer Registration Result with device {0}\n{1}", Address, registrationResult); - if (registrationResult.Contains("success")) - { - RegisterStatusServer(); - } - else - { - Debug.Console(0, this, "EvertzEndpointStatusServer RegisterServerWithEndpoint with device {0}\n{1}", Address, registrationResult); - - } - * */ - } - - public void PollAll() - { - string collection = ""; - foreach (var parameter in Ports) - { - if (parameter.Key.Contains("@")) - { - collection = collection + parameter.Key + ","; - } - } - collection = collection.Substring(0, collection.Length - 1); - SendGetRequest(collection); - } - public void PollForState(string varId) - { - try - { - SendGetRequest(varId); - //var returnState = JsonConvert.DeserializeObject(SendGetRequest(varId)); - - } - catch (Exception e) - { - Debug.Console(0, this, "PollForState {0}", e); - - } - } - - - public void ProcessGetParameterResponse(EvertzPortRestResponse response) - { - var PortObject = Ports[response.id]; - if (response.name == "Input Status") - { - if (response.value == "Missing") { PortObject.SyncDetected = false; } - else { PortObject.SyncDetected = true; } - } - } - public void SendGetRequest(string s) - { - Client.SendText("v.api/apis/EV/GET/parameter/{0}", s); - } - - public void SendStatusRequest() - { - Client.SendText("/v.api/apis/EV/SERVERSTATUS"); - } - public void RegisterServer(string hostname, string servername, string port) - { - Client.SendText("v.api/apis/EV/SERVERADD/server/{0}/{1}/{2}/udp", hostname, servername, port); - } - public void UnregisterServer() - { - if (StatusServerId != null) - { - Client.SendTextNoResponse("v.api/apis/EV/SERVERDEL/server/{0}", StatusServerId); - } - } - - // TODO JTA: Craete a UnregisterServerFast using DispatchASync. - public void RegisterForNotification(string varId) - { - Client.SendText("v.api/apis/EV/NOTIFYADD/parameter/{0}/{1}", StatusServerId, varId); - } - - - void Client_ResponseRecived(object sender, GenericHttpClientEventArgs e) - { - if (e.Error == HTTP_CALLBACK_ERROR.COMPLETED) - { - if (e.RequestPath.Contains("GET/parameter/")) - { - // Get Parameter response - if (!e.ResponseText.Contains("[")) - ProcessGetParameterResponse(JsonConvert.DeserializeObject(e.ResponseText)); - else if (e.ResponseText.Contains("[")) - { - List test = JsonConvert.DeserializeObject>(e.ResponseText); - foreach (var thing in test) - { - ProcessGetParameterResponse(thing); - } - - } - } - else if (e.RequestPath.Contains("SERVERSTATUS")) - { - PollAll(); - ProcessServerStatusRequest(JsonConvert.DeserializeObject(e.ResponseText)); - } - } - } - - - - - public class EvertzPortsRestResponse - { - List test; - } - public class EvertzPortRestResponse - { - public string id; - public string name; - public string type; - public string value; - - } - - public class EvertzEndpointPort - { - public string PortName; - public string SyncVarID; - public string ResolutionVarID; - public bool SyncDetected; - public string Resolution; - public BoolFeedback SyncDetectedFeedback; - - public EvertzEndpointPort (string portName, string syncVarId, string resolutionVarId) - { - PortName = portName; - SyncVarID = syncVarId; - ResolutionVarID = resolutionVarId; - SyncDetectedFeedback = new BoolFeedback(() => { return SyncDetected; }); - } - - } - - } -} \ No newline at end of file diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertzEndpointPropertiesConfig.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertzEndpointPropertiesConfig.cs deleted file mode 100644 index 5beff4df..00000000 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertzEndpointPropertiesConfig.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; - -using PepperDash.Core; -using PepperDash.Essentials.Core; - -namespace PepperDash.Essentials.Devices.Common -{ - /// - /// - /// - public class EvertzEndpointPropertiesConfig - { - public CommunicationMonitorConfig CommunicationMonitorProperties { get; set; } - - public ControlPropertiesConfig Control { get; set; } - public string userName { get; set; } - public string password { get; set; } - public string address { get; set; } - public string controllerKey { get; set; } - } - -} \ No newline at end of file diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertzEndpointVarIds.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertzEndpointVarIds.cs deleted file mode 100644 index fc5200f1..00000000 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Evertz/EvertzEndpointVarIds.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Crestron.SimplSharp; - -namespace PepperDash.Essentials.Devices.Common -{ - public class EvertzEndpointVarIds - { - private string HdmiPort01SyncStatus = "136.0"; - } -} \ No newline at end of file diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Factory/DeviceFactory.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Factory/DeviceFactory.cs index 004a2579..48179ff1 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Factory/DeviceFactory.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Factory/DeviceFactory.cs @@ -107,21 +107,6 @@ namespace PepperDash.Essentials.Devices.Common properties.ToString()); return new DigitalLogger(key, name, props); } - else if (groupName == "evertzendpoint") - { - // var comm = CommFactory.CreateCommForDevice(dc); - var props = JsonConvert.DeserializeObject( - properties.ToString()); - return new EvertzEndpoint(key, name, props, typeName); - } - else if (typeName == "evertzendpointstatusserver") - { - var server = CommFactory.CreateCommForDevice(dc) as GenericUdpServer; - - var props = JsonConvert.DeserializeObject( - properties.ToString()); - return new EvertzEndpointStatusServer(key, name, server, props); - } else if (typeName == "genericaudiooutwithvolume") { var zone = dc.Properties.Value("zone"); @@ -395,13 +380,6 @@ namespace PepperDash.Essentials.Devices.Common } } - //else if (typeName == "qscdsp") - //{ - // var comm = CommFactory.CreateCommForDevice(dc); - // var props = JsonConvert.DeserializeObject( - // properties.ToString()); - // return new QscDsp(key, name, comm, props); - //} return null; } diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Power Controllers/Digitallogger.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Power Controllers/Digitallogger.cs index e48a5b7b..358c63cb 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/Power Controllers/Digitallogger.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/Power Controllers/Digitallogger.cs @@ -26,7 +26,7 @@ namespace PepperDash.Essentials.Devices.Common public string address; private bool OnlineStatus; public BoolFeedback OnlineFeedback; - private ushort CurrentPreset; + //private ushort CurrentPreset; public IntFeedback PresetFeedback; public Dictionary CircuitStatus; @@ -103,7 +103,7 @@ namespace PepperDash.Essentials.Devices.Common }); CircuitIsCritical[circuit] = new BoolFeedback(() => { - if (CircuitStatus[circuit].critical != null) + if (CircuitStatus.ContainsKey(circuit)) { return CircuitStatus[circuit].critical; } @@ -114,7 +114,7 @@ namespace PepperDash.Essentials.Devices.Common }); CircuitState[circuit] = new BoolFeedback(() => { - if (CircuitStatus[circuit].state != null) + if (CircuitStatus.ContainsKey(circuit)) { return CircuitStatus[circuit].state; } diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs index 3a78c5e0..c603ca08 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ResponseObjects.cs @@ -979,8 +979,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom meeting.StartTime = b.StartTime; if (b.EndTime != null) meeting.EndTime = b.EndTime; - if (b.IsPrivate != null) - meeting.Privacy = b.IsPrivate ? eMeetingPrivacy.Private : eMeetingPrivacy.Public; + + meeting.Privacy = b.IsPrivate ? eMeetingPrivacy.Private : eMeetingPrivacy.Public; // No meeting.Calls data exists for Zoom Rooms. Leaving out for now. 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 4d4ad472..84881df3 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 @@ -43,8 +43,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom public bool CommDebuggingIsOn; - CTimer LoginMessageReceivedTimer; - CTimer RetryConnectionTimer; + //CTimer LoginMessageReceivedTimer; + //CTimer RetryConnectionTimer; /// /// Gets and returns the scaled volume of the codec diff --git a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs index 32a8296e..209cfdd9 100644 --- a/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs +++ b/essentials-framework/Essentials Devices Common/Essentials Devices Common/VideoCodec/ZoomRoom/ZoomRoomCamera.cs @@ -47,13 +47,13 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom private bool isZooming; - private bool isFocusing; + //private bool isFocusing; private bool isMoving { get { - return isPanning || isTilting || isZooming || isFocusing; + return isPanning || isTilting || isZooming; } }