mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-01-28 11:54:57 +00:00
Compare commits
5 Commits
feature/Ge
...
1.10.2-alp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1c252521f0 | ||
|
|
641fa2101d | ||
|
|
0500a359b8 | ||
|
|
50e94eb373 | ||
|
|
96dbd44a04 |
@@ -55,7 +55,7 @@ namespace PepperDash.Essentials
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// DSP/DMPS format: deviceKey--levelName, biampTesira-1--master
|
// DSP format: deviceKey--levelName, biampTesira-1--master
|
||||||
match = Regex.Match(DeviceKey, @"([-_\w]+)--(.+)");
|
match = Regex.Match(DeviceKey, @"([-_\w]+)--(.+)");
|
||||||
if (match.Success)
|
if (match.Success)
|
||||||
{
|
{
|
||||||
@@ -67,27 +67,6 @@ namespace PepperDash.Essentials
|
|||||||
if (dsp.LevelControlPoints.ContainsKey(levelTag)) // should always...
|
if (dsp.LevelControlPoints.ContainsKey(levelTag)) // should always...
|
||||||
return dsp.LevelControlPoints[levelTag];
|
return dsp.LevelControlPoints[levelTag];
|
||||||
}
|
}
|
||||||
|
|
||||||
var dmps = DeviceManager.GetDeviceForKey(devKey) as DmpsAudioOutputController;
|
|
||||||
if (dmps != null)
|
|
||||||
{
|
|
||||||
var levelTag = match.Groups[2].Value;
|
|
||||||
switch (levelTag)
|
|
||||||
{
|
|
||||||
case "master":
|
|
||||||
return dmps.MasterVolumeLevel;
|
|
||||||
case "source":
|
|
||||||
return dmps.SourceVolumeLevel;
|
|
||||||
case "micsmaster":
|
|
||||||
return dmps.MicsMasterVolumeLevel;
|
|
||||||
case "codec1":
|
|
||||||
return dmps.Codec1VolumeLevel;
|
|
||||||
case "codec2":
|
|
||||||
return dmps.Codec2VolumeLevel;
|
|
||||||
default:
|
|
||||||
return dmps.MasterVolumeLevel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// No volume for some reason. We have failed as developers
|
// No volume for some reason. We have failed as developers
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ using PepperDash.Essentials.Core;
|
|||||||
using PepperDash.Essentials.Core.Bridges;
|
using PepperDash.Essentials.Core.Bridges;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Essentials.Core.Fusion;
|
using PepperDash.Essentials.Core.Fusion;
|
||||||
using PepperDash.Essentials.Core.Web;
|
|
||||||
using PepperDash.Essentials.Devices.Common;
|
using PepperDash.Essentials.Devices.Common;
|
||||||
using PepperDash.Essentials.DM;
|
using PepperDash.Essentials.DM;
|
||||||
using PepperDash.Essentials.Fusion;
|
using PepperDash.Essentials.Fusion;
|
||||||
@@ -47,29 +46,28 @@ namespace PepperDash.Essentials
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public override void InitializeSystem()
|
public override void InitializeSystem()
|
||||||
{
|
{
|
||||||
|
_startTimer = new CTimer(StartSystem,StartupTime);
|
||||||
|
|
||||||
|
|
||||||
// If the control system is a DMPS type, we need to wait to exit this method until all devices have had time to activate
|
// If the control system is a DMPS type, we need to wait to exit this method until all devices have had time to activate
|
||||||
// to allow any HD-BaseT DM endpoints to register first.
|
// to allow any HD-BaseT DM endpoints to register first.
|
||||||
bool preventInitializationComplete = Global.ControlSystemIsDmpsType;
|
if (Global.ControlSystemIsDmpsType)
|
||||||
if (preventInitializationComplete)
|
|
||||||
{
|
{
|
||||||
Debug.Console(1, "******************* InitializeSystem() Entering **********************");
|
Debug.Console(2, "******************* InitializeSystem() Entering **********************");
|
||||||
_startTimer = new CTimer(StartSystem, preventInitializationComplete, StartupTime);
|
|
||||||
_initializeEvent = new CEvent(true, false);
|
_initializeEvent = new CEvent();
|
||||||
DeviceManager.AllDevicesRegistered += (o, a) =>
|
|
||||||
|
DeviceManager.AllDevicesActivated += (o, a) =>
|
||||||
{
|
{
|
||||||
_initializeEvent.Set();
|
_initializeEvent.Set();
|
||||||
|
Debug.Console(2, "******************* InitializeSystem() Exiting **********************");
|
||||||
};
|
};
|
||||||
|
|
||||||
_initializeEvent.Wait(30000);
|
_initializeEvent.Wait(30000);
|
||||||
Debug.Console(1, "******************* InitializeSystem() Exiting **********************");
|
|
||||||
SystemMonitor.ProgramInitialization.ProgramInitializationComplete = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_startTimer = new CTimer(StartSystem, preventInitializationComplete, StartupTime);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StartSystem(object preventInitialization)
|
private void StartSystem(object obj)
|
||||||
{
|
{
|
||||||
DeterminePlatform();
|
DeterminePlatform();
|
||||||
|
|
||||||
@@ -81,41 +79,36 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(PluginLoader.ReportAssemblyVersions, "reportversions", "Reports the versions of the loaded assemblies", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(PluginLoader.ReportAssemblyVersions, "reportversions", "Reports the versions of the loaded assemblies", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(Core.DeviceFactory.GetDeviceFactoryTypes, "gettypes", "Gets the device types that can be built. Accepts a filter string.", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(PepperDash.Essentials.Core.DeviceFactory.GetDeviceFactoryTypes, "gettypes", "Gets the device types that can be built. Accepts a filter string.", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(BridgeHelper.PrintJoinMap, "getjoinmap", "map(s) for bridge or device on bridge [brKey [devKey]]", ConsoleAccessLevelEnum.AccessOperator);
|
CrestronConsole.AddNewConsoleCommand(BridgeHelper.PrintJoinMap, "getjoinmap", "map(s) for bridge or device on bridge [brKey [devKey]]", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(BridgeHelper.JoinmapMarkdown, "getjoinmapmarkdown"
|
CrestronConsole.AddNewConsoleCommand(s =>
|
||||||
, "generate markdown of map(s) for bridge or device on bridge [brKey [devKey]]", ConsoleAccessLevelEnum.AccessOperator);
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "CONSOLE MESSAGE: {0}", s);
|
||||||
CrestronConsole.AddNewConsoleCommand(s => Debug.Console(0, Debug.ErrorLogLevel.Notice, "CONSOLE MESSAGE: {0}", s), "appdebugmessage", "Writes message to log", ConsoleAccessLevelEnum.AccessOperator);
|
}, "appdebugmessage", "Writes message to log", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s =>
|
CrestronConsole.AddNewConsoleCommand(s =>
|
||||||
{
|
{
|
||||||
foreach (var tl in TieLineCollection.Default)
|
foreach (var tl in TieLineCollection.Default)
|
||||||
CrestronConsole.ConsoleCommandResponse(" {0}{1}", tl, CrestronEnvironment.NewLine);
|
CrestronConsole.ConsoleCommandResponse(" {0}\r\n", tl);
|
||||||
},
|
},
|
||||||
"listtielines", "Prints out all tie lines", ConsoleAccessLevelEnum.AccessOperator);
|
"listtielines", "Prints out all tie lines", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s =>
|
CrestronConsole.AddNewConsoleCommand(s =>
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse
|
CrestronConsole.ConsoleCommandResponse
|
||||||
("Current running configuration. This is the merged system and template configuration" + CrestronEnvironment.NewLine);
|
("Current running configuration. This is the merged system and template configuration");
|
||||||
CrestronConsole.ConsoleCommandResponse(Newtonsoft.Json.JsonConvert.SerializeObject
|
CrestronConsole.ConsoleCommandResponse(Newtonsoft.Json.JsonConvert.SerializeObject
|
||||||
(ConfigReader.ConfigObject, Newtonsoft.Json.Formatting.Indented));
|
(ConfigReader.ConfigObject, Newtonsoft.Json.Formatting.Indented));
|
||||||
}, "showconfig", "Shows the current running merged config", ConsoleAccessLevelEnum.AccessOperator);
|
}, "showconfig", "Shows the current running merged config", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(s =>
|
CrestronConsole.AddNewConsoleCommand(s =>
|
||||||
CrestronConsole.ConsoleCommandResponse(
|
{
|
||||||
"This system can be found at the following URLs:{2}" +
|
CrestronConsole.ConsoleCommandResponse("This system can be found at the following URLs:\r\n" +
|
||||||
"System URL: {0}{2}" +
|
"System URL: {0}\r\n" +
|
||||||
"Template URL: {1}{2}",
|
"Template URL: {1}", ConfigReader.ConfigObject.SystemUrl, ConfigReader.ConfigObject.TemplateUrl);
|
||||||
ConfigReader.ConfigObject.SystemUrl,
|
}, "portalinfo", "Shows portal URLS from configuration", ConsoleAccessLevelEnum.AccessOperator);
|
||||||
ConfigReader.ConfigObject.TemplateUrl,
|
|
||||||
CrestronEnvironment.NewLine),
|
|
||||||
"portalinfo",
|
|
||||||
"Shows portal URLS from configuration",
|
|
||||||
ConsoleAccessLevelEnum.AccessOperator);
|
|
||||||
|
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(DeviceManager.GetRoutingPorts,
|
CrestronConsole.AddNewConsoleCommand(DeviceManager.GetRoutingPorts,
|
||||||
@@ -127,10 +120,7 @@ namespace PepperDash.Essentials
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(bool)preventInitialization)
|
SystemMonitor.ProgramInitialization.ProgramInitializationComplete = true;
|
||||||
{
|
|
||||||
SystemMonitor.ProgramInitialization.ProgramInitializationComplete = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -205,8 +195,6 @@ namespace PepperDash.Essentials
|
|||||||
}
|
}
|
||||||
else // Handles Linux OS (Virtual Control)
|
else // Handles Linux OS (Virtual Control)
|
||||||
{
|
{
|
||||||
Debug.SetDebugLevel(2);
|
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on Virtual Control Server", Global.AssemblyVersion);
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on Virtual Control Server", Global.AssemblyVersion);
|
||||||
|
|
||||||
// Set path to User/
|
// Set path to User/
|
||||||
@@ -308,10 +296,6 @@ namespace PepperDash.Essentials
|
|||||||
if (!Directory.Exists(pluginDir))
|
if (!Directory.Exists(pluginDir))
|
||||||
Directory.Create(pluginDir);
|
Directory.Create(pluginDir);
|
||||||
|
|
||||||
var joinmapDir = Global.FilePathPrefix + "joinmaps";
|
|
||||||
if(!Directory.Exists(joinmapDir))
|
|
||||||
Directory.Create(joinmapDir);
|
|
||||||
|
|
||||||
return configExists;
|
return configExists;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -359,7 +343,6 @@ namespace PepperDash.Essentials
|
|||||||
|
|
||||||
// Build the processor wrapper class
|
// Build the processor wrapper class
|
||||||
DeviceManager.AddDevice(new PepperDash.Essentials.Core.Devices.CrestronProcessor("processor"));
|
DeviceManager.AddDevice(new PepperDash.Essentials.Core.Devices.CrestronProcessor("processor"));
|
||||||
DeviceManager.AddDevice(new EssemtialsWebApi("essentialsWebApi","Essentials Web API"));
|
|
||||||
|
|
||||||
// Add global System Monitor device
|
// Add global System Monitor device
|
||||||
if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
|
if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
|
||||||
|
|||||||
@@ -211,9 +211,6 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
[JsonProperty("fusion")]
|
[JsonProperty("fusion")]
|
||||||
public EssentialsRoomFusionConfig Fusion { get; set; }
|
public EssentialsRoomFusionConfig Fusion { get; set; }
|
||||||
|
|
||||||
[JsonProperty("essentialsRoomUiBehaviorConfig", NullValueHandling=NullValueHandling.Ignore)]
|
|
||||||
public EssentialsRoomUiBehaviorConfig UiBehavior { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("zeroVolumeWhenSwtichingVolumeDevices")]
|
[JsonProperty("zeroVolumeWhenSwtichingVolumeDevices")]
|
||||||
public bool ZeroVolumeWhenSwtichingVolumeDevices { get; set; }
|
public bool ZeroVolumeWhenSwtichingVolumeDevices { get; set; }
|
||||||
|
|
||||||
@@ -230,12 +227,6 @@ namespace PepperDash.Essentials.Room.Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EssentialsRoomUiBehaviorConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("disableActivityButtonsWhileWarmingCooling")]
|
|
||||||
public bool DisableActivityButtonsWhileWarmingCooling { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class EssentialsAvRoomPropertiesConfig : EssentialsRoomPropertiesConfig
|
public class EssentialsAvRoomPropertiesConfig : EssentialsRoomPropertiesConfig
|
||||||
{
|
{
|
||||||
[JsonProperty("defaultAudioKey")]
|
[JsonProperty("defaultAudioKey")]
|
||||||
|
|||||||
@@ -708,12 +708,11 @@ namespace PepperDash.Essentials
|
|||||||
IRoutingSink dest = null;
|
IRoutingSink dest = null;
|
||||||
|
|
||||||
if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
|
if (route.DestinationKey.Equals("$defaultaudio", StringComparison.OrdinalIgnoreCase))
|
||||||
dest = DefaultAudioDevice as IRoutingSink;
|
dest = DefaultAudioDevice as IRoutingSinkNoSwitching;
|
||||||
else if (route.DestinationKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
|
else if (route.DestinationKey.Equals("$defaultDisplay", StringComparison.OrdinalIgnoreCase))
|
||||||
dest = DefaultDisplay;
|
dest = DefaultDisplay;
|
||||||
else
|
else
|
||||||
dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSink;
|
dest = DeviceManager.GetDeviceForKey(route.DestinationKey) as IRoutingSinkNoSwitching;
|
||||||
|
|
||||||
|
|
||||||
if (dest == null)
|
if (dest == null)
|
||||||
{
|
{
|
||||||
@@ -745,28 +744,6 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
//Implement this
|
//Implement this
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override bool AllowVacancyTimerToStart()
|
|
||||||
{
|
|
||||||
bool allowVideo = true;
|
|
||||||
bool allowAudio = true;
|
|
||||||
|
|
||||||
if (VideoCodec != null)
|
|
||||||
{
|
|
||||||
Debug.Console(2,this, Debug.ErrorLogLevel.Notice, "Room {0} {1} in a video call", Key, VideoCodec.IsInCall ? "is" : "is not");
|
|
||||||
allowVideo = !VideoCodec.IsInCall;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (AudioCodec != null)
|
|
||||||
{
|
|
||||||
Debug.Console(2,this, Debug.ErrorLogLevel.Notice, "Room {0} {1} in an audio call", Key, AudioCodec.IsInCall ? "is" : "is not");
|
|
||||||
allowAudio = !AudioCodec.IsInCall;
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(2, this, "Room {0} allowing vacancy timer to start: {1}", Key, allowVideo && allowAudio);
|
|
||||||
|
|
||||||
return allowVideo && allowAudio;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Does what it says
|
/// Does what it says
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
Debug.Console(2, this,
|
Debug.Console(2, this,
|
||||||
@"Attempting to run action:
|
@"Attempting to run action:
|
||||||
Key: {0}
|
DeviceKey: {0}
|
||||||
MethodName: {1}
|
MethodName: {1}
|
||||||
Params: {2}"
|
Params: {2}"
|
||||||
, a.DeviceKey, a.MethodName, a.Params);
|
, a.DeviceKey, a.MethodName, a.Params);
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
|
using PepperDash.Essentials.Room.Config;
|
||||||
|
using PepperDash.Essentials.Core.Devices;
|
||||||
|
using PepperDash.Essentials.Devices.Common.Codec;
|
||||||
|
using PepperDash.Essentials.Devices.Common.VideoCodec;
|
||||||
|
using PepperDash.Essentials.Devices.Common.AudioCodec;
|
||||||
|
|
||||||
|
|
||||||
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials
|
||||||
|
{
|
||||||
|
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IHasDefaultDisplay
|
||||||
|
{
|
||||||
|
bool ExcludeFromGlobalFunctions { get; }
|
||||||
|
|
||||||
|
void RunRouteAction(string routeKey);
|
||||||
|
|
||||||
|
EssentialsHuddleRoomPropertiesConfig PropertiesConfig { get; }
|
||||||
|
|
||||||
|
IBasicVolumeControls CurrentVolumeControls { get; }
|
||||||
|
|
||||||
|
event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEssentialsHuddleVtc1Room : IEssentialsRoom, IHasCurrentSourceInfoChange,
|
||||||
|
IHasCurrentVolumeControls, IRunRouteAction, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasDefaultDisplay
|
||||||
|
{
|
||||||
|
EssentialsHuddleVtc1PropertiesConfig PropertiesConfig { get; }
|
||||||
|
|
||||||
|
void RunRouteAction(string routeKey);
|
||||||
|
|
||||||
|
IHasScheduleAwareness ScheduleSource { get; }
|
||||||
|
|
||||||
|
string DefaultCodecRouteString { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ using PepperDash.Essentials.Room.Config;
|
|||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IRunDefaultPresentRoute, IHasDefaultDisplay, IHasCurrentVolumeControls
|
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IRunDefaultPresentRoute, IHasDefaultDisplay
|
||||||
{
|
{
|
||||||
bool ExcludeFromGlobalFunctions { get; }
|
bool ExcludeFromGlobalFunctions { get; }
|
||||||
|
|
||||||
|
|||||||
@@ -11,38 +11,211 @@ using PepperDash.Core;
|
|||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using PepperDash.Essentials.Core.PageManagers;
|
using PepperDash.Essentials.Core.PageManagers;
|
||||||
using PepperDash.Essentials.Core.UI;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials
|
namespace PepperDash.Essentials
|
||||||
{
|
{
|
||||||
public class EssentialsTouchpanelController : TouchpanelBase
|
public class EssentialsTouchpanelController : EssentialsDevice, IHasBasicTriListWithSmartObject
|
||||||
{
|
{
|
||||||
|
private CrestronTouchpanelPropertiesConfig _propertiesConfig;
|
||||||
|
|
||||||
|
public BasicTriListWithSmartObject Panel { get; private set; }
|
||||||
|
|
||||||
public PanelDriverBase PanelDriver { get; private set; }
|
public PanelDriverBase PanelDriver { get; private set; }
|
||||||
|
|
||||||
CTimer BacklightTransitionedOnTimer;
|
CTimer BacklightTransitionedOnTimer;
|
||||||
|
|
||||||
|
public EssentialsTouchpanelController(string key, string name, Tswx52ButtonVoiceControl tsw,
|
||||||
|
string projectName, string sgdPath)
|
||||||
|
: base(key, name)
|
||||||
|
{
|
||||||
|
Panel = tsw;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(sgdPath))
|
||||||
|
Panel.LoadSmartObjects(sgdPath);
|
||||||
|
else
|
||||||
|
Debug.Console(1, this, "No SGD file path defined");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
tsw.SigChange += Panel_SigChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EssentialsTouchpanelController(string key, string name, Dge100 dge, string projectName, string sgdPath)
|
||||||
|
: base(key, name)
|
||||||
|
{
|
||||||
|
Panel = dge;
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(sgdPath))
|
||||||
|
Panel.LoadSmartObjects(sgdPath);
|
||||||
|
else
|
||||||
|
Debug.Console(1, this, "No SGD file path defined");
|
||||||
|
|
||||||
|
dge.SigChange += Panel_SigChange;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Config constructor
|
/// Config constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EssentialsTouchpanelController(string key, string name, BasicTriListWithSmartObject panel, CrestronTouchpanelPropertiesConfig config)
|
public EssentialsTouchpanelController(string key, string name, string type, CrestronTouchpanelPropertiesConfig props, uint id)
|
||||||
: base(key, name, panel, config)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
|
_propertiesConfig = props;
|
||||||
|
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Creating touchpanel hardware...");
|
||||||
|
type = type.ToLower();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (type == "crestronapp")
|
||||||
|
{
|
||||||
|
var app = new CrestronApp(id, Global.ControlSystem);
|
||||||
|
app.ParameterProjectName.Value = props.ProjectName;
|
||||||
|
Panel = app;
|
||||||
|
}
|
||||||
|
else if (type == "xpanel")
|
||||||
|
Panel = new XpanelForSmartGraphics(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw550")
|
||||||
|
Panel = new Tsw550(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw552")
|
||||||
|
Panel = new Tsw552(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw560")
|
||||||
|
Panel = new Tsw560(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw750")
|
||||||
|
Panel = new Tsw750(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw752")
|
||||||
|
Panel = new Tsw752(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw760")
|
||||||
|
Panel = new Tsw760(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw1050")
|
||||||
|
Panel = new Tsw1050(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw1052")
|
||||||
|
Panel = new Tsw1052(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw1060")
|
||||||
|
Panel = new Tsw1060(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw570")
|
||||||
|
Panel = new Tsw570(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw770")
|
||||||
|
Panel = new Tsw770(id, Global.ControlSystem);
|
||||||
|
else if (type == "ts770")
|
||||||
|
Panel = new Ts770(id, Global.ControlSystem);
|
||||||
|
else if (type == "tsw1070")
|
||||||
|
Panel = new Tsw1070(id, Global.ControlSystem);
|
||||||
|
else if (type == "ts1070")
|
||||||
|
Panel = new Ts1070(id, Global.ControlSystem);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW base class. Panel will not function: {0}", e.Message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reserved sigs
|
||||||
|
if (Panel is TswFt5ButtonSystem)
|
||||||
|
{
|
||||||
|
var tsw = Panel as TswFt5ButtonSystem;
|
||||||
|
tsw.ExtenderSystemReservedSigs.Use();
|
||||||
|
tsw.ExtenderSystemReservedSigs.DeviceExtenderSigChange
|
||||||
|
+= ExtenderSystemReservedSigs_DeviceExtenderSigChange;
|
||||||
|
|
||||||
|
tsw.ButtonStateChange += new ButtonEventHandler(Tsw_ButtonStateChange);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Panel.Register() != eDeviceRegistrationUnRegistrationResponse.Success)
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Registration failed. Continuing, but panel may not function: {0}", Panel.RegistrationFailureReason);
|
||||||
|
|
||||||
|
// Give up cleanly if SGD is not present.
|
||||||
|
var sgdName = Global.FilePathPrefix + "sgd" + Global.DirectorySeparator + props.SgdFile;
|
||||||
|
if (!File.Exists(sgdName))
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, "Smart object file '{0}' not present in User folder. Looking for embedded file", sgdName);
|
||||||
|
|
||||||
|
sgdName = Global.ApplicationDirectoryPathPrefix + Global.DirectorySeparator + "SGD" + Global.DirectorySeparator + props.SgdFile;
|
||||||
|
|
||||||
|
if (!File.Exists(sgdName))
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, "Unable to find SGD file '{0}' in User sgd or application SGD folder. Exiting touchpanel load.", sgdName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Panel.LoadSmartObjects(sgdName);
|
||||||
|
Panel.SigChange += Panel_SigChange;
|
||||||
|
|
||||||
|
AddPostActivationAction(() =>
|
||||||
|
{
|
||||||
|
// Check for IEssentialsRoomCombiner in DeviceManager and if found, subscribe to its event
|
||||||
|
var roomCombiner = DeviceManager.AllDevices.FirstOrDefault((d) => d is IEssentialsRoomCombiner) as IEssentialsRoomCombiner;
|
||||||
|
|
||||||
|
if (roomCombiner != null)
|
||||||
|
{
|
||||||
|
// Subscribe to the even
|
||||||
|
roomCombiner.RoomCombinationScenarioChanged += new EventHandler<EventArgs>(roomCombiner_RoomCombinationScenarioChanged);
|
||||||
|
|
||||||
|
// Connect to the initial roomKey
|
||||||
|
if (roomCombiner.CurrentScenario != null)
|
||||||
|
{
|
||||||
|
// Use the current scenario
|
||||||
|
DetermineRoomKeyFromScenario(roomCombiner.CurrentScenario);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Current Scenario not yet set. Use default
|
||||||
|
SetupPanelDrivers(_propertiesConfig.DefaultRoomKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// No room combiner, use the default key
|
||||||
|
SetupPanelDrivers(_propertiesConfig.DefaultRoomKey);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void roomCombiner_RoomCombinationScenarioChanged(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var roomCombiner = sender as IEssentialsRoomCombiner;
|
||||||
|
|
||||||
|
DetermineRoomKeyFromScenario(roomCombiner.CurrentScenario);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines the room key to use based on the scenario
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scenario"></param>
|
||||||
|
void DetermineRoomKeyFromScenario(IRoomCombinationScenario scenario)
|
||||||
|
{
|
||||||
|
string newRoomKey = null;
|
||||||
|
|
||||||
|
if (scenario.UiMap.ContainsKey(Key))
|
||||||
|
{
|
||||||
|
newRoomKey = scenario.UiMap[Key];
|
||||||
|
}
|
||||||
|
else if (scenario.UiMap.ContainsKey(_propertiesConfig.DefaultRoomKey))
|
||||||
|
{
|
||||||
|
newRoomKey = scenario.UiMap[_propertiesConfig.DefaultRoomKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
SetupPanelDrivers(newRoomKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets up drivers and links them to the room specified
|
/// Sets up drivers and links them to the room specified
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="roomKey">key of room to link the drivers to</param>
|
/// <param name="roomKey">key of room to link the drivers to</param>
|
||||||
protected override void SetupPanelDrivers(string roomKey)
|
void SetupPanelDrivers(string roomKey)
|
||||||
{
|
{
|
||||||
// Clear out any existing actions
|
// Clear out any existing actions
|
||||||
Panel.ClearAllSigActions();
|
Panel.ClearAllSigActions();
|
||||||
|
|
||||||
Debug.Console(0, this, "Linking TP '{0}' to Room '{1}'", Key, roomKey);
|
Debug.Console(0, this, "Linking TP '{0}' to Room '{1}'", Key, roomKey);
|
||||||
|
|
||||||
var mainDriver = new EssentialsPanelMainInterfaceDriver(Panel, _config);
|
var mainDriver = new EssentialsPanelMainInterfaceDriver(Panel, _propertiesConfig);
|
||||||
// Then the sub drivers
|
// Then the sub drivers
|
||||||
|
|
||||||
// spin up different room drivers depending on room type
|
// spin up different room drivers depending on room type
|
||||||
@@ -51,15 +224,15 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
// Screen Saver Driver
|
// Screen Saver Driver
|
||||||
|
|
||||||
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _config);
|
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _propertiesConfig);
|
||||||
|
|
||||||
// Header Driver
|
// Header Driver
|
||||||
Debug.Console(0, this, "Adding header driver");
|
Debug.Console(0, this, "Adding header driver");
|
||||||
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _config);
|
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _propertiesConfig);
|
||||||
|
|
||||||
// AV Driver
|
// AV Driver
|
||||||
Debug.Console(0, this, "Adding huddle space AV driver");
|
Debug.Console(0, this, "Adding huddle space AV driver");
|
||||||
var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, _config);
|
var avDriver = new EssentialsHuddlePanelAvFunctionsDriver(mainDriver, _propertiesConfig);
|
||||||
avDriver.DefaultRoomKey = roomKey;
|
avDriver.DefaultRoomKey = roomKey;
|
||||||
mainDriver.AvDriver = avDriver;
|
mainDriver.AvDriver = avDriver;
|
||||||
avDriver.CurrentRoom = room as IEssentialsHuddleSpaceRoom;
|
avDriver.CurrentRoom = room as IEssentialsHuddleSpaceRoom;
|
||||||
@@ -68,7 +241,7 @@ namespace PepperDash.Essentials
|
|||||||
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, "Adding environment driver");
|
Debug.Console(0, this, "Adding environment driver");
|
||||||
mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, _config);
|
mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, _propertiesConfig);
|
||||||
|
|
||||||
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
|
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
|
||||||
}
|
}
|
||||||
@@ -97,13 +270,13 @@ namespace PepperDash.Essentials
|
|||||||
Debug.Console(0, this, "Adding huddle space VTC AV driver");
|
Debug.Console(0, this, "Adding huddle space VTC AV driver");
|
||||||
|
|
||||||
// Screen Saver Driver
|
// Screen Saver Driver
|
||||||
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _config);
|
mainDriver.ScreenSaverController = new ScreenSaverController(mainDriver, _propertiesConfig);
|
||||||
|
|
||||||
// Header Driver
|
// Header Driver
|
||||||
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _config);
|
mainDriver.HeaderDriver = new EssentialsHeaderDriver(mainDriver, _propertiesConfig);
|
||||||
|
|
||||||
// AV Driver
|
// AV Driver
|
||||||
var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, _config);
|
var avDriver = new EssentialsHuddleVtc1PanelAvFunctionsDriver(mainDriver, _propertiesConfig);
|
||||||
|
|
||||||
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(Panel, avDriver,
|
var codecDriver = new PepperDash.Essentials.UIDrivers.VC.EssentialsVideoCodecUiDriver(Panel, avDriver,
|
||||||
(room as IEssentialsHuddleVtc1Room).VideoCodec, mainDriver.HeaderDriver);
|
(room as IEssentialsHuddleVtc1Room).VideoCodec, mainDriver.HeaderDriver);
|
||||||
@@ -116,7 +289,7 @@ namespace PepperDash.Essentials
|
|||||||
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
if (avDriver.CurrentRoom.PropertiesConfig.Environment != null && avDriver.CurrentRoom.PropertiesConfig.Environment.DeviceKeys.Count > 0)
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, "Adding environment driver");
|
Debug.Console(0, this, "Adding environment driver");
|
||||||
mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, _config);
|
mainDriver.EnvironmentDriver = new EssentialsEnvironmentDriver(mainDriver, _propertiesConfig);
|
||||||
|
|
||||||
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
|
mainDriver.EnvironmentDriver.GetDevicesFromConfig(avDriver.CurrentRoom.PropertiesConfig.Environment);
|
||||||
}
|
}
|
||||||
@@ -165,7 +338,13 @@ namespace PepperDash.Essentials
|
|||||||
driver.Show();
|
driver.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args)
|
void HomePressed()
|
||||||
|
{
|
||||||
|
if (BacklightTransitionedOnTimer == null)
|
||||||
|
PanelDriver.BackButtonPressed();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args)
|
||||||
{
|
{
|
||||||
// If the sig is transitioning on, mark it in case it was home button that transitioned it
|
// If the sig is transitioning on, mark it in case it was home button that transitioned it
|
||||||
var blOnSig = (Panel as TswFt5ButtonSystem).ExtenderSystemReservedSigs.BacklightOnFeedback;
|
var blOnSig = (Panel as TswFt5ButtonSystem).ExtenderSystemReservedSigs.BacklightOnFeedback;
|
||||||
@@ -203,6 +382,26 @@ namespace PepperDash.Essentials
|
|||||||
act(value);
|
act(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Panel_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args)
|
||||||
|
{
|
||||||
|
if (Debug.Level == 2)
|
||||||
|
Debug.Console(2, this, "Sig change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue);
|
||||||
|
var uo = args.Sig.UserObject;
|
||||||
|
if (uo is Action<bool>)
|
||||||
|
(uo as Action<bool>)(args.Sig.BoolValue);
|
||||||
|
else if (uo is Action<ushort>)
|
||||||
|
(uo as Action<ushort>)(args.Sig.UShortValue);
|
||||||
|
else if (uo is Action<string>)
|
||||||
|
(uo as Action<string>)(args.Sig.StringValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Tsw_ButtonStateChange(GenericBase device, ButtonEventArgs args)
|
||||||
|
{
|
||||||
|
var uo = args.Button.UserObject;
|
||||||
|
if(uo is Action<bool>)
|
||||||
|
(uo as Action<bool>)(args.Button.State == eButtonState.Pressed);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EssentialsTouchpanelControllerFactory : EssentialsDeviceFactory<EssentialsTouchpanelController>
|
public class EssentialsTouchpanelControllerFactory : EssentialsDeviceFactory<EssentialsTouchpanelController>
|
||||||
@@ -215,74 +414,13 @@ namespace PepperDash.Essentials
|
|||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
{
|
{
|
||||||
var comm = CommFactory.GetControlPropertiesConfig(dc);
|
var comm = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
var props = JsonConvert.DeserializeObject<CrestronTouchpanelPropertiesConfig>(dc.Properties.ToString());
|
var props = Newtonsoft.Json.JsonConvert.DeserializeObject<CrestronTouchpanelPropertiesConfig>(dc.Properties.ToString());
|
||||||
|
|
||||||
var panel = GetPanelForType(dc.Type, comm.IpIdInt, props.ProjectName);
|
|
||||||
|
|
||||||
if (panel == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Unable to create Touchpanel for type {0}. Touchpanel Controller WILL NOT function correctly", dc.Type);
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(1, "Factory Attempting to create new EssentialsTouchpanelController");
|
Debug.Console(1, "Factory Attempting to create new EssentialsTouchpanelController");
|
||||||
|
|
||||||
var panelController = new EssentialsTouchpanelController(dc.Key, dc.Name, panel, props);
|
var panelController = new EssentialsTouchpanelController(dc.Key, dc.Name, dc.Type, props, comm.IpIdInt);
|
||||||
|
|
||||||
return panelController;
|
return panelController;
|
||||||
}
|
}
|
||||||
|
|
||||||
private BasicTriListWithSmartObject GetPanelForType(string type, uint id, string projectName)
|
|
||||||
{
|
|
||||||
type = type.ToLower();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (type == "crestronapp")
|
|
||||||
{
|
|
||||||
var app = new CrestronApp(id, Global.ControlSystem);
|
|
||||||
app.ParameterProjectName.Value = projectName;
|
|
||||||
return app;
|
|
||||||
}
|
|
||||||
else if (type == "xpanel")
|
|
||||||
return new XpanelForSmartGraphics(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw550")
|
|
||||||
return new Tsw550(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw552")
|
|
||||||
return new Tsw552(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw560")
|
|
||||||
return new Tsw560(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw750")
|
|
||||||
return new Tsw750(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw752")
|
|
||||||
return new Tsw752(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw760")
|
|
||||||
return new Tsw760(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw1050")
|
|
||||||
return new Tsw1050(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw1052")
|
|
||||||
return new Tsw1052(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw1060")
|
|
||||||
return new Tsw1060(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw570")
|
|
||||||
return new Tsw570(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw770")
|
|
||||||
return new Tsw770(id, Global.ControlSystem);
|
|
||||||
else if (type == "ts770")
|
|
||||||
return new Ts770(id, Global.ControlSystem);
|
|
||||||
else if (type == "tsw1070")
|
|
||||||
return new Tsw1070(id, Global.ControlSystem);
|
|
||||||
else if (type == "ts1070")
|
|
||||||
return new Ts1070(id, Global.ControlSystem);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW base class. Panel will not function: {0}", e.Message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,10 +97,10 @@ namespace PepperDash.Essentials
|
|||||||
{
|
{
|
||||||
TriList.SetSigFalseAction(ButtonPressJoinBase + 1, ShadeDevice.Open);
|
TriList.SetSigFalseAction(ButtonPressJoinBase + 1, ShadeDevice.Open);
|
||||||
|
|
||||||
TriList.SetSigFalseAction(ButtonPressJoinBase + 2, (ShadeDevice as IShadesOpenCloseStop).Stop);
|
TriList.SetSigFalseAction(ButtonPressJoinBase + 2, (ShadeDevice as IShadesOpenCloseStop).StopOrPreset);
|
||||||
|
|
||||||
if (ShadeDevice is IShadesOpenCloseStop)
|
if(ShadeDevice is RelayControlledShade)
|
||||||
TriList.SetString(StringJoinBase + 2, "Stop");
|
TriList.SetString(StringJoinBase + 2, (ShadeDevice as RelayControlledShade).StopOrPresetButtonLabel);
|
||||||
|
|
||||||
TriList.SetSigFalseAction(ButtonPressJoinBase + 3, ShadeDevice.Close);
|
TriList.SetSigFalseAction(ButtonPressJoinBase + 3, ShadeDevice.Close);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,33 +46,6 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
bridge.PrintJoinMaps();
|
bridge.PrintJoinMaps();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public static void JoinmapMarkdown(string command)
|
|
||||||
{
|
|
||||||
var targets = command.Split(' ');
|
|
||||||
|
|
||||||
var bridgeKey = targets[0].Trim();
|
|
||||||
|
|
||||||
var bridge = DeviceManager.GetDeviceForKey(bridgeKey) as EiscApiAdvanced;
|
|
||||||
|
|
||||||
if (bridge == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Unable to find advanced bridge with key: '{0}'", bridgeKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (targets.Length > 1)
|
|
||||||
{
|
|
||||||
var deviceKey = targets[1].Trim();
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(deviceKey)) return;
|
|
||||||
bridge.MarkdownJoinMapForDevice(deviceKey, bridgeKey);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bridge.MarkdownForBridge(bridgeKey);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -109,7 +82,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
{
|
{
|
||||||
public EiscApiPropertiesConfig PropertiesConfig { get; private set; }
|
public EiscApiPropertiesConfig PropertiesConfig { get; private set; }
|
||||||
|
|
||||||
public Dictionary<string, JoinMapBaseAdvanced> JoinMaps { get; private set; }
|
protected Dictionary<string, JoinMapBaseAdvanced> JoinMaps { get; private set; }
|
||||||
|
|
||||||
public BasicTriList Eisc { get; private set; }
|
public BasicTriList Eisc { get; private set; }
|
||||||
|
|
||||||
@@ -165,7 +138,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
|
|
||||||
Debug.Console(1, this, "Linking Device: '{0}'", device.Key);
|
Debug.Console(1, this, "Linking Device: '{0}'", device.Key);
|
||||||
|
|
||||||
if (!typeof(IBridgeAdvanced).IsAssignableFrom(device.GetType().GetCType()))
|
if (!typeof (IBridgeAdvanced).IsAssignableFrom(device.GetType().GetCType()))
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice,
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice,
|
||||||
"{0} is not compatible with this bridge type. Please use 'eiscapi' instead, or updae the device.",
|
"{0} is not compatible with this bridge type. Please use 'eiscapi' instead, or updae the device.",
|
||||||
@@ -254,19 +227,6 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
joinMap.Value.PrintJoinMapInfo();
|
joinMap.Value.PrintJoinMapInfo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
|
||||||
/// Generates markdown for all join maps on this bridge
|
|
||||||
/// </summary>
|
|
||||||
public virtual void MarkdownForBridge(string bridgeKey)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Writing Joinmaps to files for EISC IPID: {0}", Eisc.ID.ToString("X"));
|
|
||||||
|
|
||||||
foreach (var joinMap in JoinMaps)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Generating markdown for device '{0}':", joinMap.Key);
|
|
||||||
joinMap.Value.MarkdownJoinMapInfo(joinMap.Key, bridgeKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Prints the join map for a device by key
|
/// Prints the join map for a device by key
|
||||||
@@ -282,26 +242,9 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.Console(0, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
|
Debug.Console(0, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
|
||||||
joinMap.PrintJoinMapInfo();
|
joinMap.PrintJoinMapInfo();
|
||||||
}
|
}
|
||||||
/// <summary>
|
|
||||||
/// Prints the join map for a device by key
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="deviceKey"></param>
|
|
||||||
public void MarkdownJoinMapForDevice(string deviceKey, string bridgeKey)
|
|
||||||
{
|
|
||||||
var joinMap = JoinMaps[deviceKey];
|
|
||||||
|
|
||||||
if (joinMap == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Unable to find joinMap for device with key: '{0}'", deviceKey);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(0, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
|
|
||||||
joinMap.MarkdownJoinMapInfo(deviceKey, bridgeKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Used for debugging to trigger an action based on a join number and type
|
/// Used for debugging to trigger an action based on a join number and type
|
||||||
@@ -409,7 +352,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
public List<ApiDevicePropertiesConfig> Devices { get; set; }
|
public List<ApiDevicePropertiesConfig> Devices { get; set; }
|
||||||
|
|
||||||
[JsonProperty("rooms")]
|
[JsonProperty("rooms")]
|
||||||
public List<ApiRoomPropertiesConfig> Rooms { get; set; }
|
public List<ApiRoomPropertiesConfig> Rooms { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public class ApiDevicePropertiesConfig
|
public class ApiDevicePropertiesConfig
|
||||||
@@ -442,7 +385,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
{
|
{
|
||||||
public EiscApiAdvancedFactory()
|
public EiscApiAdvancedFactory()
|
||||||
{
|
{
|
||||||
TypeNames = new List<string> { "eiscapiadv", "eiscapiadvanced", "eiscapiadvancedserver", "eiscapiadvancedclient", "vceiscapiadv", "vceiscapiadvanced" };
|
TypeNames = new List<string> { "eiscapiadv", "eiscapiadvanced", "eiscapiadvancedserver", "eiscapiadvancedclient", "vceiscapiadv", "vceiscapiadvanced" };
|
||||||
}
|
}
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
@@ -451,51 +394,35 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
|
|
||||||
var controlProperties = CommFactory.GetControlPropertiesConfig(dc);
|
var controlProperties = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
|
|
||||||
BasicTriList eisc;
|
|
||||||
|
|
||||||
switch (dc.Type.ToLower())
|
switch (dc.Type.ToLower())
|
||||||
{
|
{
|
||||||
case "eiscapiadv":
|
case "eiscapiadv":
|
||||||
case "eiscapiadvanced":
|
case "eiscapiadvanced":
|
||||||
{
|
{
|
||||||
eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(controlProperties.IpIdInt,
|
var eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(controlProperties.IpIdInt,
|
||||||
controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
||||||
break;
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
}
|
}
|
||||||
case "eiscapiadvancedserver":
|
case "eiscapiadvancedserver":
|
||||||
{
|
{
|
||||||
eisc = new EISCServer(controlProperties.IpIdInt, Global.ControlSystem);
|
var eisc = new EISCServer(controlProperties.IpIdInt, Global.ControlSystem);
|
||||||
break;
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
}
|
}
|
||||||
case "eiscapiadvancedclient":
|
case "eiscapiadvancedclient":
|
||||||
{
|
{
|
||||||
eisc = new EISCClient(controlProperties.IpIdInt, controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
var eisc = new EISCClient(controlProperties.IpIdInt, controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
||||||
break;
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
}
|
}
|
||||||
case "vceiscapiadv":
|
case "vceiscapiadv":
|
||||||
case "vceiscapiadvanced":
|
case "vceiscapiadvanced":
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(controlProperties.RoomId))
|
var eisc = new VirtualControlEISCClient(controlProperties.IpIdInt, InitialParametersClass.RoomId,
|
||||||
{
|
Global.ControlSystem);
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to build VC-4 EISC Client for device {0}. Room ID is missing or empty", dc.Key);
|
return new EiscApiAdvanced(dc, eisc);
|
||||||
eisc = null;
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
eisc = new VirtualControlEISCClient(controlProperties.IpIdInt, controlProperties.RoomId,
|
|
||||||
Global.ControlSystem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
eisc = null;
|
return null;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eisc == null)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new EiscApiAdvanced(dc, eisc);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,10 +24,6 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
JoinType = eJoinType.Digital
|
JoinType = eJoinType.Digital
|
||||||
});
|
});
|
||||||
|
|
||||||
[JoinName("Name")]
|
|
||||||
public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DM Chassis Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
|
||||||
|
|
||||||
[JoinName("SystemId")]
|
[JoinName("SystemId")]
|
||||||
public JoinDataComplete SystemId = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
|
public JoinDataComplete SystemId = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "DM Chassis SystemId Get/Set/Trigger/", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalAnalog });
|
new JoinMetadata { Description = "DM Chassis SystemId Get/Set/Trigger/", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalAnalog });
|
||||||
|
|||||||
@@ -36,28 +36,6 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
public JoinDataComplete AudioVideoSource = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
public JoinDataComplete AudioVideoSource = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "DM RMC Audio Video Source Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
|
new JoinMetadata { Description = "DM RMC Audio Video Source Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
|
||||||
|
|
||||||
[JoinName("HdcpSupportCapability")]
|
|
||||||
public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DM RMC HDCP Support Capability", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
|
|
||||||
[JoinName("Port1HdcpState")]
|
|
||||||
public JoinDataComplete Port1HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DM RMC Port 1 (DM) HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
|
|
||||||
[JoinName("Port2HdcpState")]
|
|
||||||
public JoinDataComplete Port2HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DM TX Port 2 (HDMI) HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
|
|
||||||
[JoinName("HdmiInputSync")]
|
|
||||||
public JoinDataComplete HdmiInputSync = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DM RMC HDMI Input Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("HdcpInputPortCount")]
|
|
||||||
public JoinDataComplete HdcpInputPortCount = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Number of Input Ports that support HDCP", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -72,8 +50,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
/// <param name="joinStart">Join this join map will start at</param>
|
||||||
/// <param name="type">Type of the child join map</param>
|
/// <param name="type">Type of the child join map</param>
|
||||||
protected DmRmcControllerJoinMap(uint joinStart, Type type)
|
protected DmRmcControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
|
||||||
: base(joinStart, type)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,16 +64,6 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
public JoinDataComplete VgaContrast = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
|
public JoinDataComplete VgaContrast = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "DM TX Online", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
|
new JoinMetadata { Description = "DM TX Online", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
|
||||||
|
|
||||||
[JoinName("Port3HdcpState")]
|
|
||||||
public JoinDataComplete Port3HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DM TX Port 3 HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
|
|
||||||
[JoinName("HdcpInputPortCount")]
|
|
||||||
public JoinDataComplete HdcpInputPortCount = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Number of Input Ports that support HDCP", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -88,8 +78,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
/// <param name="joinStart">Join this join map will start at</param>
|
||||||
/// <param name="type">Type of the child join map</param>
|
/// <param name="type">Type of the child join map</param>
|
||||||
protected DmTxControllerJoinMap(uint joinStart, Type type)
|
protected DmTxControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
|
||||||
: base(joinStart, type)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,10 +17,6 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
public JoinDataComplete MixerPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
|
public JoinDataComplete MixerPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "Mixer Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
|
new JoinMetadata { Description = "Mixer Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
|
||||||
|
|
||||||
[JoinName("MixerEqPresetRecall")]
|
|
||||||
public JoinDataComplete MixerEqPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Mixer Eq Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
|
|
||||||
[JoinName("MasterVolumeMuteOn")]
|
[JoinName("MasterVolumeMuteOn")]
|
||||||
public JoinDataComplete MasterVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
public JoinDataComplete MasterVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "Master Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
new JoinMetadata { Description = "Master Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Bridges
|
|
||||||
{
|
|
||||||
public class IAnalogInputJoinMap : JoinMapBaseAdvanced
|
|
||||||
{
|
|
||||||
|
|
||||||
[JoinName("InputValue")]
|
|
||||||
public JoinDataComplete InputValue = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Input Value", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
[JoinName("MinimumChange")]
|
|
||||||
public JoinDataComplete MinimumChange = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Minimum voltage change required to reflect a change", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
|
||||||
public IAnalogInputJoinMap(uint joinStart)
|
|
||||||
: this(joinStart, typeof(IAnalogInputJoinMap))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor to use when extending this Join map
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
|
||||||
/// <param name="type">Type of the child join map</param>
|
|
||||||
protected IAnalogInputJoinMap(uint joinStart, Type type)
|
|
||||||
: base(joinStart, type)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Bridges
|
namespace PepperDash.Essentials.Core.Bridges
|
||||||
{
|
{
|
||||||
public class IDigitalInputJoinMap : JoinMapBaseAdvanced
|
public class IDigitalInputJoinMap : JoinMapBaseAdvanced
|
||||||
{
|
{
|
||||||
|
|
||||||
[JoinName("InputState")]
|
[JoinName("InputState")]
|
||||||
public JoinDataComplete InputState = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
public JoinDataComplete InputState = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "Input State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
new JoinMetadata { Description = "Room Email Url", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||||
@@ -26,6 +26,6 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
protected IDigitalInputJoinMap(uint joinStart, Type type)
|
protected IDigitalInputJoinMap(uint joinStart, Type type)
|
||||||
: base(joinStart, type)
|
: base(joinStart, type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Bridges
|
|
||||||
{
|
|
||||||
public class IDigitalOutputJoinMap : JoinMapBaseAdvanced
|
|
||||||
{
|
|
||||||
|
|
||||||
[JoinName("OutputState")]
|
|
||||||
public JoinDataComplete OutputState = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Get / Set state of Digital Input", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
|
||||||
public IDigitalOutputJoinMap(uint joinStart)
|
|
||||||
: this(joinStart, typeof(IDigitalOutputJoinMap))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor to use when extending this Join map
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
|
||||||
/// <param name="type">Type of the child join map</param>
|
|
||||||
protected IDigitalOutputJoinMap(uint joinStart, Type type)
|
|
||||||
: base(joinStart, type)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Bridges
|
|
||||||
{
|
|
||||||
public class PduJoinMapBase : JoinMapBaseAdvanced
|
|
||||||
{
|
|
||||||
[JoinName("Name")]
|
|
||||||
public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "PDU Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
|
||||||
|
|
||||||
[JoinName("Online")]
|
|
||||||
public JoinDataComplete Online = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "PDU Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("OutletCount")]
|
|
||||||
public JoinDataComplete OutletCount = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Number of COntrolled Outlets", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
|
|
||||||
|
|
||||||
[JoinName("OutletName")]
|
|
||||||
public JoinDataComplete OutletName = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Outlet Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
|
||||||
|
|
||||||
[JoinName("OutletEnabled")]
|
|
||||||
public JoinDataComplete OutletEnabled = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Outlet Enabled", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("OutletPowerCycle")]
|
|
||||||
public JoinDataComplete OutletPowerCycle = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Outlet Power Cycle", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("OutletPowerOn")]
|
|
||||||
public JoinDataComplete OutletPowerOn = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Outlet Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("OutletPowerOff")]
|
|
||||||
public JoinDataComplete OutletPowerOff = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Outlet Power Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
|
||||||
public PduJoinMapBase(uint joinStart)
|
|
||||||
:base(joinStart, typeof(PduJoinMapBase))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor to use when extending this Join map
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
|
||||||
/// <param name="type">Type of the child join map</param>
|
|
||||||
public PduJoinMapBase(uint joinStart, Type type)
|
|
||||||
: base(joinStart, type)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -47,7 +47,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
[JoinName("ProgramOffsetJoin")]
|
[JoinName("ProgramOffsetJoin")]
|
||||||
public JoinDataComplete ProgramOffsetJoin = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 5 },
|
public JoinDataComplete ProgramOffsetJoin = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 5 },
|
||||||
new JoinMetadata { Description = "All Program Data is offset between slots by 5 - First Joins Start at 11", JoinCapabilities = eJoinCapabilities.None, JoinType = eJoinType.None });
|
new JoinMetadata { Description = "All Program Data is offset between slots by 5 - First Joins Start at 11", JoinCapabilities = eJoinCapabilities.None, JoinType = eJoinType.None });
|
||||||
|
|
||||||
[JoinName("ProgramStart")]
|
[JoinName("ProgramStart")]
|
||||||
public JoinDataComplete ProgramStart = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
|
public JoinDataComplete ProgramStart = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "Processor Program Start / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
new JoinMetadata { Description = "Processor Program Start / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
@@ -132,23 +132,6 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
public JoinDataComplete DhcpStatus = new JoinDataComplete(new JoinData { JoinNumber = 86, JoinSpan = 1 },
|
public JoinDataComplete DhcpStatus = new JoinDataComplete(new JoinData { JoinNumber = 86, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "Processor Ethernet Dhcp Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
new JoinMetadata { Description = "Processor Ethernet Dhcp Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
||||||
|
|
||||||
[JoinName("ProcessorRebot")]
|
|
||||||
public JoinDataComplete ProcessorReboot = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Reboot processor", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("IsAppliance")]
|
|
||||||
public JoinDataComplete IsAppliance = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Is appliance Fb", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("IsServer")]
|
|
||||||
public JoinDataComplete IsServer = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Is server Fb", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("ProgramReset")]
|
|
||||||
public JoinDataComplete ProgramReset = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "Resets the program", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -183,8 +183,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
[JsonConverter(typeof(ComSpecJsonConverter))]
|
[JsonConverter(typeof(ComSpecJsonConverter))]
|
||||||
public ComPort.ComPortSpec ComParams { get; set; }
|
public ComPort.ComPortSpec ComParams { get; set; }
|
||||||
|
|
||||||
public string RoomId { get; set; }
|
|
||||||
|
|
||||||
public string CresnetId { get; set; }
|
public string CresnetId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.Net.Http;
|
using Crestron.SimplSharp.Net.Http;
|
||||||
using Crestron.SimplSharp.Ssh;
|
|
||||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Core.DebugThings;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
@@ -16,130 +17,52 @@ namespace PepperDash.Essentials.Core
|
|||||||
public GenericHttpClient(string key, string name, string hostname)
|
public GenericHttpClient(string key, string name, string hostname)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
Client = new HttpClient {HostName = hostname};
|
Client = new HttpClient();
|
||||||
|
Client.HostName = hostname;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public GenericHttpClient(string key, string name, string hostname, GenericHttpClientConnectionOptions options)
|
/// <summary>
|
||||||
: base(key, name)
|
///
|
||||||
{
|
|
||||||
Client = new HttpClient
|
|
||||||
{
|
|
||||||
HostName = hostname,
|
|
||||||
Accept = options.Accept,
|
|
||||||
KeepAlive = options.KeepAlive,
|
|
||||||
Password = options.Password,
|
|
||||||
Timeout = options.Timeout,
|
|
||||||
TimeoutEnabled = options.TimeoutEnabled,
|
|
||||||
UserAgent = options.UserAgent,
|
|
||||||
UserName = options.UserName,
|
|
||||||
Version = options.Version
|
|
||||||
};
|
|
||||||
if (options.Port > 0) Client.Port = options.Port;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Send a HTTP Get Request to a client
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="path">Path to request node</param>
|
/// <param name="path"></param>
|
||||||
public void SendText(string path)
|
public void SendText(string path)
|
||||||
{
|
{
|
||||||
var url = string.Format("http://{0}/{1}", Client.HostName, path);
|
HttpClientRequest request = new HttpClientRequest();
|
||||||
var request = new HttpClientRequest()
|
string url = string.Format("http://{0}/{1}", Client.HostName, path);
|
||||||
{
|
request.Url = new UrlParser(url);
|
||||||
Url = new UrlParser(url)
|
HttpClient.DISPATCHASYNC_ERROR error = Client.DispatchAsyncEx(request, Response, request);
|
||||||
};
|
}
|
||||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
public void SendText(string format, params object[] items)
|
||||||
}
|
{
|
||||||
|
HttpClientRequest request = new HttpClientRequest();
|
||||||
|
string url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||||
|
request.Url = new UrlParser(url);
|
||||||
|
HttpClient.DISPATCHASYNC_ERROR error = Client.DispatchAsyncEx(request, Response, request);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
public void SendTextNoResponse(string format, params object[] items)
|
||||||
/// Send a HTTP Get Request to a client using a formatted string
|
{
|
||||||
/// </summary>
|
HttpClientRequest request = new HttpClientRequest();
|
||||||
/// <param name="format">Path</param>
|
string url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||||
/// <param name="items">Parameters for Path String Formatting</param>
|
request.Url = new UrlParser(url);
|
||||||
public void SendText(string format, params object[] items)
|
Client.Dispatch(request);
|
||||||
{
|
}
|
||||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
|
||||||
var request = new HttpClientRequest()
|
|
||||||
{
|
|
||||||
Url = new UrlParser(url)
|
|
||||||
};
|
|
||||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Send a unidirectional HTTP Get Request to a client using a formatted string
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="format">Path</param>
|
|
||||||
/// <param name="items">Parameters for Path String Formatting</param>
|
|
||||||
public void SendTextNoResponse(string format, params object[] items)
|
|
||||||
{
|
|
||||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
|
||||||
var request = new HttpClientRequest()
|
|
||||||
{
|
|
||||||
Url = new UrlParser(url)
|
|
||||||
};
|
|
||||||
Client.Dispatch(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Send an HTTP Request of a specific request type
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="requestType">HTTP Request Type</param>
|
|
||||||
/// <param name="path">Path to request node</param>
|
|
||||||
public void SendText(RequestType requestType, string path)
|
|
||||||
{
|
|
||||||
var url = string.Format("http://{0}/{1}", Client.HostName, path);
|
|
||||||
var request = new HttpClientRequest()
|
|
||||||
{
|
|
||||||
Url = new UrlParser(url),
|
|
||||||
RequestType = requestType
|
|
||||||
};
|
|
||||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Send an HTTP Request of a specific request type using a formatted string
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="requestType">HTTP Request Type</param>
|
|
||||||
/// <param name="format">Path</param>
|
|
||||||
/// <param name="items">Parameters for Path String Formatting</param>
|
|
||||||
public void SendText(RequestType requestType, string format, params object[] items)
|
|
||||||
{
|
|
||||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
|
||||||
var request = new HttpClientRequest()
|
|
||||||
{
|
|
||||||
Url = new UrlParser(url),
|
|
||||||
RequestType = requestType
|
|
||||||
};
|
|
||||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Send a unidirectional HTTP Request of a specific request type using a formatted string
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="requestType">HTTP Request Type</param>
|
|
||||||
/// <param name="format">Path</param>
|
|
||||||
/// <param name="items">Parameters for Path String Formatting</param>
|
|
||||||
public void SendTextNoResponse(RequestType requestType, string format, params object[] items)
|
|
||||||
{
|
|
||||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
|
||||||
var request = new HttpClientRequest()
|
|
||||||
{
|
|
||||||
Url = new UrlParser(url)
|
|
||||||
};
|
|
||||||
Client.Dispatch(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Response(HttpClientResponse response, HTTP_CALLBACK_ERROR error, object request)
|
private void Response(HttpClientResponse response, HTTP_CALLBACK_ERROR error, object request)
|
||||||
{
|
{
|
||||||
if (error != HTTP_CALLBACK_ERROR.COMPLETED) return;
|
if (error == HTTP_CALLBACK_ERROR.COMPLETED)
|
||||||
var responseReceived = response;
|
{
|
||||||
|
var responseReceived = response;
|
||||||
|
|
||||||
|
if (responseReceived.ContentString.Length > 0)
|
||||||
|
{
|
||||||
|
if (ResponseRecived != null)
|
||||||
|
ResponseRecived(this, new GenericHttpClientEventArgs(responseReceived.ContentString, (request as HttpClientRequest).Url.ToString(), error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (responseReceived.ContentString.Length <= 0) return;
|
|
||||||
if (ResponseRecived == null) return;
|
|
||||||
var httpClientRequest = request as HttpClientRequest;
|
|
||||||
if (httpClientRequest != null)
|
|
||||||
ResponseRecived(this, new GenericHttpClientEventArgs(responseReceived.ContentString, httpClientRequest.Url.ToString(), error));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -177,8 +100,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class GenericHttpClientEventArgs : EventArgs
|
public class GenericHttpClientEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public string ResponseText { get; private set; }
|
public string ResponseText { get; private set; }
|
||||||
@@ -191,84 +112,4 @@ namespace PepperDash.Essentials.Core
|
|||||||
Error = error;
|
Error = error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Objedct to set parameters for HTTP Requests
|
|
||||||
/// </summary>
|
|
||||||
public class GenericHttpClientConnectionOptions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets content types that are acceptable for the response. The default
|
|
||||||
/// value is "text/html, image/gif, image/jpeg, image/png, */*".
|
|
||||||
/// </summary>
|
|
||||||
[DefaultValue("text/html, image/gif, image/jpeg, image/png")]
|
|
||||||
public string Accept { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Controls whether to use HTTP Keep-Alive to keep the connection alive between
|
|
||||||
/// requests. If enabled (true) , once a request is made and a connection is
|
|
||||||
/// established, this connection is kept open and used for future requests. If
|
|
||||||
/// disabled, the connection is closed, and a new connection is created for future
|
|
||||||
/// requests.
|
|
||||||
/// </summary>
|
|
||||||
[DefaultValue(true)]
|
|
||||||
public bool KeepAlive { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// This property controls whether the request operation will do an automatic
|
|
||||||
/// timeout checking. If timeout handling is turned on (i.e. this property is
|
|
||||||
/// set to true) and a request takes longer than Timeout, it will be terminated.
|
|
||||||
/// </summary>
|
|
||||||
[DefaultValue(true)]
|
|
||||||
public bool TimeoutEnabled { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the maximum amount of time (in seconds) that a client will wait
|
|
||||||
/// for a server response within a single request. The default value is 60 seconds
|
|
||||||
/// (1 minute). The timeout handling can be activated via the TimeoutEnabled
|
|
||||||
/// property.
|
|
||||||
/// </summary>
|
|
||||||
[DefaultValue(60)]
|
|
||||||
public int Timeout { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the version identifier of the UserAgent. Can be used to mimic
|
|
||||||
/// particular browsers like Internet Explorer 6.0
|
|
||||||
/// </summary>
|
|
||||||
[DefaultValue("1.1")]
|
|
||||||
public string Version { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets or sets the identifier of the software being used to retrieve data via
|
|
||||||
/// the URL. Some custom HTTP servers check this HTTP header to provide content
|
|
||||||
/// optimized for particular HTTP browsers.
|
|
||||||
/// </summary>
|
|
||||||
[DefaultValue("Crestron SimplSharp HTTP Client")]
|
|
||||||
public string UserAgent { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Name that will be inserted into the Authorization HTTP header in the request
|
|
||||||
/// to the server.
|
|
||||||
/// </summary>
|
|
||||||
public string UserName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Password that will be inserted into the Authorization HTTP header in the
|
|
||||||
/// request to the server.
|
|
||||||
/// </summary>
|
|
||||||
public string Password { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The server Port that you intend the client to connect to. If you do not
|
|
||||||
/// assign a port number on this property, the port number in the parsed URL
|
|
||||||
/// will be used. If a port number is assigned in the parsed URL, it will take
|
|
||||||
/// precedence over this property.
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// If you do not assign a port number on this property, the port number in the
|
|
||||||
/// parsed URL will be used.
|
|
||||||
/// </remarks>
|
|
||||||
///
|
|
||||||
public int Port { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,35 +1,35 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Config
|
namespace PepperDash.Essentials.Core.Config
|
||||||
{
|
{
|
||||||
public class DeviceConfig
|
public class DeviceConfig
|
||||||
{
|
{
|
||||||
[JsonProperty("key")]
|
[JsonProperty("key")]
|
||||||
public string Key { get; set; }
|
public string Key { get; set; }
|
||||||
|
|
||||||
[JsonProperty("uid")]
|
[JsonProperty("uid")]
|
||||||
public int Uid { get; set; }
|
public int Uid { get; set; }
|
||||||
|
|
||||||
[JsonProperty("name")]
|
[JsonProperty("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
[JsonProperty("group")]
|
[JsonProperty("group")]
|
||||||
public string Group { get; set; }
|
public string Group { get; set; }
|
||||||
|
|
||||||
[JsonProperty("type")]
|
[JsonProperty("type")]
|
||||||
public string Type { get; set; }
|
public string Type { get; set; }
|
||||||
|
|
||||||
[JsonProperty("properties")]
|
[JsonProperty("properties")]
|
||||||
[JsonConverter(typeof(DevicePropertiesConverter))]
|
[JsonConverter(typeof(DevicePropertiesConverter))]
|
||||||
public JToken Properties { get; set; }
|
public JToken Properties { get; set; }
|
||||||
|
|
||||||
public DeviceConfig(DeviceConfig dc)
|
public DeviceConfig(DeviceConfig dc)
|
||||||
@@ -39,42 +39,39 @@ namespace PepperDash.Essentials.Core.Config
|
|||||||
Name = dc.Name;
|
Name = dc.Name;
|
||||||
Group = dc.Group;
|
Group = dc.Group;
|
||||||
Type = dc.Type;
|
Type = dc.Type;
|
||||||
|
Properties = JToken.FromObject(dc.Properties);
|
||||||
Properties = JToken.Parse(dc.Properties.ToString());
|
|
||||||
|
|
||||||
//Properties = JToken.FromObject(dc.Properties);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public DeviceConfig() {}
|
public DeviceConfig() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DevicePropertiesConverter : JsonConverter
|
public class DevicePropertiesConverter : JsonConverter
|
||||||
{
|
{
|
||||||
|
|
||||||
public override bool CanConvert(Type objectType)
|
public override bool CanConvert(Type objectType)
|
||||||
{
|
{
|
||||||
return objectType == typeof(JToken);
|
return objectType == typeof(JToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
|
||||||
{
|
{
|
||||||
return JToken.ReadFrom(reader);
|
return JToken.ReadFrom(reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool CanWrite
|
public override bool CanWrite
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException("SOD OFF HOSER");
|
throw new NotImplementedException("SOD OFF HOSER");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,7 +66,7 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public class C2NIoControllerFactory : EssentialsDeviceFactory<C2NIoController>
|
public class C2NIoControllerFactory : EssentialsDeviceFactory<C2nRthsController>
|
||||||
{
|
{
|
||||||
public C2NIoControllerFactory()
|
public C2NIoControllerFactory()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "Factory Attempting to create new DIN-CEN-CN2 Device");
|
Debug.Console(1, "Factory Attempting to create new C2N-RTHS Device");
|
||||||
|
|
||||||
var control = CommFactory.GetControlPropertiesConfig(dc);
|
var control = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
var ipid = control.IpIdInt;
|
var ipid = control.IpIdInt;
|
||||||
|
|||||||
@@ -1,80 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.GeneralIO;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.CrestronIO
|
|
||||||
{
|
|
||||||
public class DinIo8Controller:CrestronGenericBaseDevice, IIOPorts
|
|
||||||
{
|
|
||||||
private DinIo8 _device;
|
|
||||||
|
|
||||||
public DinIo8Controller(string key, Func<DeviceConfig, DinIo8> preActivationFunc, DeviceConfig config):base(key, config.Name)
|
|
||||||
{
|
|
||||||
AddPreActivationAction(() =>
|
|
||||||
{
|
|
||||||
_device = preActivationFunc(config);
|
|
||||||
|
|
||||||
RegisterCrestronGenericBase(_device);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Implementation of IIOPorts
|
|
||||||
|
|
||||||
public CrestronCollection<Versiport> VersiPorts
|
|
||||||
{
|
|
||||||
get { return _device.VersiPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int NumberOfVersiPorts
|
|
||||||
{
|
|
||||||
get { return _device.NumberOfVersiPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DinIo8ControllerFactory : EssentialsDeviceFactory<DinIo8Controller>
|
|
||||||
{
|
|
||||||
public DinIo8ControllerFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "DinIo8" };
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory Attempting to create new DinIo8 Device");
|
|
||||||
|
|
||||||
return new DinIo8Controller(dc.Key, GetDinIo8Device, dc);
|
|
||||||
}
|
|
||||||
|
|
||||||
static DinIo8 GetDinIo8Device(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
var control = CommFactory.GetControlPropertiesConfig(dc);
|
|
||||||
var cresnetId = control.CresnetIdInt;
|
|
||||||
var branchId = control.ControlPortNumber;
|
|
||||||
var parentKey = string.IsNullOrEmpty(control.ControlPortDevKey) ? "processor" : control.ControlPortDevKey;
|
|
||||||
|
|
||||||
if (parentKey.Equals("processor", StringComparison.CurrentCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Device {0} is a valid cresnet master - creating new DinIo8", parentKey);
|
|
||||||
return new DinIo8(cresnetId, Global.ControlSystem);
|
|
||||||
}
|
|
||||||
var cresnetBridge = DeviceManager.GetDeviceForKey(parentKey) as IHasCresnetBranches;
|
|
||||||
|
|
||||||
if (cresnetBridge != null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Device {0} is a valid cresnet master - creating new DinIo8", parentKey);
|
|
||||||
return new DinIo8(cresnetId, cresnetBridge.CresnetBranches[branchId]);
|
|
||||||
}
|
|
||||||
Debug.Console(0, "Device {0} is not a valid cresnet master", parentKey);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,7 +15,5 @@ namespace PepperDash.Essentials.Core.CrestronIO
|
|||||||
public uint PortNumber { get; set; }
|
public uint PortNumber { get; set; }
|
||||||
[JsonProperty("disablePullUpResistor")]
|
[JsonProperty("disablePullUpResistor")]
|
||||||
public bool DisablePullUpResistor { get; set; }
|
public bool DisablePullUpResistor { get; set; }
|
||||||
[JsonProperty("minimumChange")]
|
|
||||||
public int MinimumChange { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// Wrapper class for CEN-IO-DIGIN-104 digital input module
|
/// Wrapper class for CEN-IO-DIGIN-104 digital input module
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("Wrapper class for the CEN-IO-DIGIN-104 diginal input module")]
|
[Description("Wrapper class for the CEN-IO-DIGIN-104 diginal input module")]
|
||||||
public class CenIoDigIn104Controller : CrestronGenericBaseDevice, IDigitalInputPorts
|
public class CenIoDigIn104Controller : EssentialsDevice, IDigitalInputPorts
|
||||||
{
|
{
|
||||||
public CenIoDi104 Di104 { get; private set; }
|
public CenIoDi104 Di104 { get; private set; }
|
||||||
|
|
||||||
@@ -52,17 +52,10 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
Debug.Console(1, "Factory Attempting to create new CEN-DIGIN-104 Device");
|
Debug.Console(1, "Factory Attempting to create new CEN-DIGIN-104 Device");
|
||||||
|
|
||||||
var control = CommFactory.GetControlPropertiesConfig(dc);
|
var control = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
if (control == null)
|
var ipid = control.IpIdInt;
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory failed to create a new CEN-DIGIN-104 Device, control properties not found");
|
return new CenIoDigIn104Controller(dc.Key, dc.Name, new Crestron.SimplSharpPro.GeneralIO.CenIoDi104(ipid, Global.ControlSystem));
|
||||||
return null;
|
|
||||||
}
|
|
||||||
var ipid = control.IpIdInt;
|
|
||||||
if (ipid != 0) return new CenIoDigIn104Controller(dc.Key, dc.Name, new CenIoDi104(ipid, Global.ControlSystem));
|
|
||||||
|
|
||||||
Debug.Console(1, "Factory failed to create a new CEN-IO-IR-104 Device using IP-ID-{0}", ipid);
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,208 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.CrestronIO
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a generic digital input deviced tied to a versiport
|
|
||||||
/// </summary>
|
|
||||||
public class GenericVersiportAnalogInputDevice : EssentialsBridgeableDevice, IAnalogInput
|
|
||||||
{
|
|
||||||
public Versiport InputPort { get; private set; }
|
|
||||||
|
|
||||||
public IntFeedback InputValueFeedback { get; private set; }
|
|
||||||
public IntFeedback InputMinimumChangeFeedback { get; private set; }
|
|
||||||
|
|
||||||
Func<int> InputValueFeedbackFunc
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return () => InputPort.AnalogIn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Func<int> InputMinimumChangeFeedbackFunc
|
|
||||||
{
|
|
||||||
get { return () => InputPort.AnalogMinChange; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public GenericVersiportAnalogInputDevice(string key, string name, Func<IOPortConfig, Versiport> postActivationFunc, IOPortConfig config) :
|
|
||||||
base(key, name)
|
|
||||||
{
|
|
||||||
InputValueFeedback = new IntFeedback(InputValueFeedbackFunc);
|
|
||||||
InputMinimumChangeFeedback = new IntFeedback(InputMinimumChangeFeedbackFunc);
|
|
||||||
|
|
||||||
AddPostActivationAction(() =>
|
|
||||||
{
|
|
||||||
InputPort = postActivationFunc(config);
|
|
||||||
|
|
||||||
InputPort.Register();
|
|
||||||
|
|
||||||
InputPort.SetVersiportConfiguration(eVersiportConfiguration.AnalogInput);
|
|
||||||
InputPort.AnalogMinChange = (ushort)(config.MinimumChange > 0 ? config.MinimumChange : 655);
|
|
||||||
if (config.DisablePullUpResistor)
|
|
||||||
InputPort.DisablePullUpResistor = true;
|
|
||||||
|
|
||||||
InputPort.VersiportChange += InputPort_VersiportChange;
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Created GenericVersiportAnalogInputDevice on port '{0}'. DisablePullUpResistor: '{1}'", config.PortNumber, InputPort.DisablePullUpResistor);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set minimum voltage change for device to update voltage changed method
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="value">valid values range from 0 - 65535, representing the full 100% range of the processor voltage source. Check processor documentation for details</param>
|
|
||||||
public void SetMinimumChange(ushort value)
|
|
||||||
{
|
|
||||||
InputPort.AnalogMinChange = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputPort_VersiportChange(Versiport port, VersiportEventArgs args)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Versiport change: {0}", args.Event);
|
|
||||||
|
|
||||||
if(args.Event == eVersiportEvent.AnalogInChange)
|
|
||||||
InputValueFeedback.FireUpdate();
|
|
||||||
if (args.Event == eVersiportEvent.AnalogMinChangeChange)
|
|
||||||
InputMinimumChangeFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#region Bridge Linking
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = new IAnalogInputJoinMap(joinStart);
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<IAnalogInputJoinMap>(joinMapSerialized);
|
|
||||||
|
|
||||||
if (bridge != null)
|
|
||||||
{
|
|
||||||
bridge.AddJoinMap(Key, joinMap);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
|
|
||||||
// Link feedback for input state
|
|
||||||
InputValueFeedback.LinkInputSig(trilist.UShortInput[joinMap.InputValue.JoinNumber]);
|
|
||||||
InputMinimumChangeFeedback.LinkInputSig(trilist.UShortInput[joinMap.MinimumChange.JoinNumber]);
|
|
||||||
trilist.SetUShortSigAction(joinMap.MinimumChange.JoinNumber, SetMinimumChange);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Unable to link device '{0}'. Input is null", Key);
|
|
||||||
Debug.Console(1, this, "Error: {0}", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
trilist.OnlineStatusChange += (d, args) =>
|
|
||||||
{
|
|
||||||
if (!args.DeviceOnLine) return;
|
|
||||||
InputValueFeedback.FireUpdate();
|
|
||||||
InputMinimumChangeFeedback.FireUpdate();
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void trilist_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
public static Versiport GetVersiportDigitalInput(IOPortConfig dc)
|
|
||||||
{
|
|
||||||
|
|
||||||
IIOPorts ioPortDevice;
|
|
||||||
|
|
||||||
if (dc.PortDeviceKey.Equals("processor"))
|
|
||||||
{
|
|
||||||
if (!Global.ControlSystem.SupportsVersiport)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetVersiportAnalogInput: Processor does not support Versiports");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
ioPortDevice = Global.ControlSystem;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IIOPorts;
|
|
||||||
if (ioPortDev == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetVersiportAnalogInput: Device {0} is not a valid device", dc.PortDeviceKey);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
ioPortDevice = ioPortDev;
|
|
||||||
}
|
|
||||||
if (ioPortDevice == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetVersiportAnalogInput: Device '0' is not a valid IIOPorts Device", dc.PortDeviceKey);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dc.PortNumber > ioPortDevice.NumberOfVersiPorts)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetVersiportAnalogInput: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if(!ioPortDevice.VersiPorts[dc.PortNumber].SupportsAnalogInput)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetVersiportAnalogInput: Device {0} does not support AnalogInput on port {1}", dc.PortDeviceKey, dc.PortNumber);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return ioPortDevice.VersiPorts[dc.PortNumber];
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public class GenericVersiportAbalogInputDeviceFactory : EssentialsDeviceFactory<GenericVersiportAnalogInputDevice>
|
|
||||||
{
|
|
||||||
public GenericVersiportAbalogInputDeviceFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "versiportanaloginput" };
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory Attempting to create new Generic Versiport Device");
|
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject<IOPortConfig>(dc.Properties.ToString());
|
|
||||||
|
|
||||||
if (props == null) return null;
|
|
||||||
|
|
||||||
var portDevice = new GenericVersiportAnalogInputDevice(dc.Key, dc.Name, GenericVersiportAnalogInputDevice.GetVersiportDigitalInput, props);
|
|
||||||
|
|
||||||
return portDevice;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.CrestronIO
|
|
||||||
{
|
|
||||||
public interface IAnalogInput
|
|
||||||
{
|
|
||||||
IntFeedback InputValueFeedback { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.GeneralIO;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Wrapper class for CEN-IO-IR-104 module
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper class for the CEN-IO-IR-104 module")]
|
|
||||||
public class CenIoIr104Controller : CrestronGenericBaseDevice, IIROutputPorts
|
|
||||||
{
|
|
||||||
private readonly CenIoIr104 _ir104;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="ir104"></param>
|
|
||||||
public CenIoIr104Controller(string key, string name, CenIoIr104 ir104)
|
|
||||||
: base(key, name, ir104)
|
|
||||||
{
|
|
||||||
_ir104 = ir104;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IDigitalInputPorts Members
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// IR port collection
|
|
||||||
/// </summary>
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts
|
|
||||||
{
|
|
||||||
get { return _ir104.IROutputPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Number of relay ports property
|
|
||||||
/// </summary>
|
|
||||||
public int NumberOfIROutputPorts
|
|
||||||
{
|
|
||||||
get { return _ir104.NumberOfIROutputPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// CEN-IO-IR-104 controller fatory
|
|
||||||
/// </summary>
|
|
||||||
public class CenIoIr104ControllerFactory : EssentialsDeviceFactory<CenIoIr104Controller>
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
public CenIoIr104ControllerFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "cenioir104" };
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Build device CEN-IO-IR-104
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dc"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory Attempting to create new CEN-IO-IR-104 Device");
|
|
||||||
|
|
||||||
var control = CommFactory.GetControlPropertiesConfig(dc);
|
|
||||||
if (control == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory failed to create a new CEN-IO-IR-104 Device, control properties not found");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ipid = control.IpIdInt;
|
|
||||||
if(ipid != 0) return new CenIoIr104Controller(dc.Key, dc.Name, new CenIoIr104(ipid, Global.ControlSystem));
|
|
||||||
|
|
||||||
Debug.Console(1, "Factory failed to create a new CEN-IO-IR-104 Device using IP-ID-{0}", ipid);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,189 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.CrestronIO
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a generic digital input deviced tied to a versiport
|
|
||||||
/// </summary>
|
|
||||||
public class GenericVersiportDigitalOutputDevice : EssentialsBridgeableDevice, IDigitalOutput
|
|
||||||
{
|
|
||||||
public Versiport OutputPort { get; private set; }
|
|
||||||
|
|
||||||
public BoolFeedback OutputStateFeedback { get; private set; }
|
|
||||||
|
|
||||||
Func<bool> OutputStateFeedbackFunc
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return () => OutputPort.DigitalOut;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public GenericVersiportDigitalOutputDevice(string key, string name, Func<IOPortConfig, Versiport> postActivationFunc, IOPortConfig config) :
|
|
||||||
base(key, name)
|
|
||||||
{
|
|
||||||
OutputStateFeedback = new BoolFeedback(OutputStateFeedbackFunc);
|
|
||||||
|
|
||||||
AddPostActivationAction(() =>
|
|
||||||
{
|
|
||||||
OutputPort = postActivationFunc(config);
|
|
||||||
|
|
||||||
OutputPort.Register();
|
|
||||||
|
|
||||||
|
|
||||||
if (!OutputPort.SupportsDigitalOutput)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Device does not support configuration as a Digital Output");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
OutputPort.SetVersiportConfiguration(eVersiportConfiguration.DigitalOutput);
|
|
||||||
|
|
||||||
|
|
||||||
OutputPort.VersiportChange += OutputPort_VersiportChange;
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPort_VersiportChange(Versiport port, VersiportEventArgs args)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Versiport change: {0}", args.Event);
|
|
||||||
|
|
||||||
if(args.Event == eVersiportEvent.DigitalOutChange)
|
|
||||||
OutputStateFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set value of the versiport digital output
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="state">value to set the output to</param>
|
|
||||||
public void SetOutput(bool state)
|
|
||||||
{
|
|
||||||
if (OutputPort.SupportsDigitalOutput)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Passed the Check");
|
|
||||||
|
|
||||||
OutputPort.DigitalOut = state;
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Versiport does not support Digital Output Mode");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Bridge Linking
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = new IDigitalOutputJoinMap(joinStart);
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<IDigitalOutputJoinMap>(joinMapSerialized);
|
|
||||||
|
|
||||||
if (bridge != null)
|
|
||||||
{
|
|
||||||
bridge.AddJoinMap(Key, joinMap);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
|
|
||||||
// Link feedback for input state
|
|
||||||
OutputStateFeedback.LinkInputSig(trilist.BooleanInput[joinMap.OutputState.JoinNumber]);
|
|
||||||
trilist.SetBoolSigAction(joinMap.OutputState.JoinNumber, SetOutput);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Unable to link device '{0}'. Input is null", Key);
|
|
||||||
Debug.Console(1, this, "Error: {0}", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
public static Versiport GetVersiportDigitalOutput(IOPortConfig dc)
|
|
||||||
{
|
|
||||||
|
|
||||||
IIOPorts ioPortDevice;
|
|
||||||
|
|
||||||
if (dc.PortDeviceKey.Equals("processor"))
|
|
||||||
{
|
|
||||||
if (!Global.ControlSystem.SupportsVersiport)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetVersiportDigitalOuptut: Processor does not support Versiports");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
ioPortDevice = Global.ControlSystem;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IIOPorts;
|
|
||||||
if (ioPortDev == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetVersiportDigitalOuptut: Device {0} is not a valid device", dc.PortDeviceKey);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
ioPortDevice = ioPortDev;
|
|
||||||
}
|
|
||||||
if (ioPortDevice == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetVersiportDigitalOuptut: Device '0' is not a valid IOPorts Device", dc.PortDeviceKey);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dc.PortNumber > ioPortDevice.NumberOfVersiPorts)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetVersiportDigitalOuptut: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber);
|
|
||||||
}
|
|
||||||
var port = ioPortDevice.VersiPorts[dc.PortNumber];
|
|
||||||
return port;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public class GenericVersiportDigitalOutputDeviceFactory : EssentialsDeviceFactory<GenericVersiportDigitalInputDevice>
|
|
||||||
{
|
|
||||||
public GenericVersiportDigitalOutputDeviceFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "versiportoutput" };
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory Attempting to create new Generic Versiport Device");
|
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject<IOPortConfig>(dc.Properties.ToString());
|
|
||||||
|
|
||||||
if (props == null) return null;
|
|
||||||
|
|
||||||
var portDevice = new GenericVersiportDigitalOutputDevice(dc.Key, dc.Name, GenericVersiportDigitalOutputDevice.GetVersiportDigitalOutput, props);
|
|
||||||
|
|
||||||
return portDevice;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.CrestronIO
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents a device that provides digital input
|
|
||||||
/// </summary>
|
|
||||||
public interface IDigitalOutput
|
|
||||||
{
|
|
||||||
BoolFeedback OutputStateFeedback { get; }
|
|
||||||
void SetOutput(bool state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,7 +10,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// Wrapper class for CEN-IO-RY-104 relay module
|
/// Wrapper class for CEN-IO-RY-104 relay module
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("Wrapper class for the CEN-IO-RY-104 relay module")]
|
[Description("Wrapper class for the CEN-IO-RY-104 relay module")]
|
||||||
public class CenIoRy104Controller : CrestronGenericBaseDevice, IRelayPorts
|
public class CenIoRy104Controller : EssentialsDevice, IRelayPorts
|
||||||
{
|
{
|
||||||
private readonly CenIoRy104 _ry104;
|
private readonly CenIoRy104 _ry104;
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <param name="name"></param>
|
/// <param name="name"></param>
|
||||||
/// <param name="ry104"></param>
|
/// <param name="ry104"></param>
|
||||||
public CenIoRy104Controller(string key, string name, CenIoRy104 ry104)
|
public CenIoRy104Controller(string key, string name, CenIoRy104 ry104)
|
||||||
: base(key, name, ry104)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
_ry104 = ry104;
|
_ry104 = ry104;
|
||||||
}
|
}
|
||||||
@@ -62,8 +62,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
var controlPropertiesConfig = CommFactory.GetControlPropertiesConfig(dc);
|
var controlPropertiesConfig = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
if (controlPropertiesConfig == null)
|
if (controlPropertiesConfig == null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, "Factory failed to create a new CEN-IO-RY-104 Device, control properties not found");
|
Debug.Console(1, "Factory failed to create a new CEN-IO-RY-104 Device");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,14 +73,11 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
//Debug.Console(1, this, " Does not require registration. Skipping");
|
//Debug.Console(1, this, " Does not require registration. Skipping");
|
||||||
|
|
||||||
if (Hardware.Registerable && !Hardware.Registered)
|
var response = Hardware.RegisterWithLogging(Key);
|
||||||
|
if (response != eDeviceRegistrationUnRegistrationResponse.Success)
|
||||||
{
|
{
|
||||||
var response = Hardware.RegisterWithLogging(Key);
|
//Debug.Console(0, this, "ERROR: Cannot register Crestron device: {0}", response);
|
||||||
if (response != eDeviceRegistrationUnRegistrationResponse.Success)
|
return false;
|
||||||
{
|
|
||||||
//Debug.Console(0, this, "ERROR: Cannot register Crestron device: {0}", response);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IsRegistered.FireUpdate();
|
IsRegistered.FireUpdate();
|
||||||
@@ -89,10 +86,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
AddPostActivationAction(() =>
|
AddPostActivationAction(() =>
|
||||||
{
|
{
|
||||||
if (Hardware.Registerable && !Hardware.Registered)
|
var response = Hardware.RegisterWithLogging(Key);
|
||||||
{
|
|
||||||
var response = Hardware.RegisterWithLogging(Key);
|
|
||||||
}
|
|
||||||
|
|
||||||
IsRegistered.FireUpdate();
|
IsRegistered.FireUpdate();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,56 +1,56 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Describes the functionality required to prompt a user to enter a password
|
/// Describes the functionality required to prompt a user to enter a password
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IPasswordPrompt
|
public interface IPasswordPrompt
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Notifies when a password is required or is entered incorrectly
|
/// Notifies when a password is required or is entered incorrectly
|
||||||
/// </summary>
|
/// </summary>
|
||||||
event EventHandler<PasswordPromptEventArgs> PasswordRequired;
|
event EventHandler<PasswordPromptEventArgs> PasswordRequired;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Submits the password
|
/// Submits the password
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="password"></param>
|
/// <param name="password"></param>
|
||||||
void SubmitPassword(string password);
|
void SubmitPassword(string password);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PasswordPromptEventArgs : EventArgs
|
public class PasswordPromptEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates if the last submitted password was incorrect
|
/// Indicates if the last submitted password was incorrect
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool LastAttemptWasIncorrect { get; private set; }
|
public bool LastAttemptWasIncorrect { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates that the login attempt has failed
|
/// Indicates that the login attempt has failed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool LoginAttemptFailed { get; private set; }
|
public bool LoginAttemptFailed { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Indicates that the process was cancelled and the prompt should be dismissed
|
/// Indicates that the process was cancelled and the prompt should be dismissed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool LoginAttemptCancelled { get; private set; }
|
public bool LoginAttemptCancelled { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A message to be displayed to the user
|
/// A message to be displayed to the user
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string Message { get; private set; }
|
public string Message { get; private set; }
|
||||||
|
|
||||||
public PasswordPromptEventArgs(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
|
public PasswordPromptEventArgs(bool lastAttemptIncorrect, bool loginFailed, bool loginCancelled, string message)
|
||||||
{
|
{
|
||||||
LastAttemptWasIncorrect = lastAttemptIncorrect;
|
LastAttemptWasIncorrect = lastAttemptIncorrect;
|
||||||
LoginAttemptFailed = loginFailed;
|
LoginAttemptFailed = loginFailed;
|
||||||
LoginAttemptCancelled = loginCancelled;
|
LoginAttemptCancelled = loginCancelled;
|
||||||
Message = message;
|
Message = message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,7 +14,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
public static class DeviceManager
|
public static class DeviceManager
|
||||||
{
|
{
|
||||||
public static event EventHandler<EventArgs> AllDevicesActivated;
|
public static event EventHandler<EventArgs> AllDevicesActivated;
|
||||||
public static event EventHandler<EventArgs> AllDevicesRegistered;
|
|
||||||
|
|
||||||
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
|
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
|
||||||
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
|
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
|
||||||
@@ -58,8 +57,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
OnAllDevicesRegistered();
|
|
||||||
|
|
||||||
DeviceCriticalSection.Enter();
|
DeviceCriticalSection.Enter();
|
||||||
AddDeviceEnabled = false;
|
AddDeviceEnabled = false;
|
||||||
// PreActivate all devices
|
// PreActivate all devices
|
||||||
@@ -132,15 +129,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnAllDevicesRegistered()
|
|
||||||
{
|
|
||||||
var handler = AllDevicesRegistered;
|
|
||||||
if (handler != null)
|
|
||||||
{
|
|
||||||
handler(null, new EventArgs());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Calls activate on all Device class items
|
/// Calls activate on all Device class items
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -379,28 +367,30 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// Prints a list of routing inputs and outputs by device key.
|
/// Prints a list of routing inputs and outputs by device key.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="s">Device key from which to report data</param>
|
/// <param name="s">Device key from which to report data</param>
|
||||||
public static void GetRoutingPorts(string s)
|
public static void GetRoutingPorts(string s)
|
||||||
{
|
{
|
||||||
var device = GetDeviceForKey(s);
|
var device = GetDeviceForKey(s);
|
||||||
|
|
||||||
if (device == null) return;
|
if (device == null) return;
|
||||||
var inputPorts = ((device as IRoutingInputs) != null) ? (device as IRoutingInputs).InputPorts : null;
|
var inputPorts = ((device as IRoutingInputs) != null) ? (device as IRoutingInputs).InputPorts : null;
|
||||||
var outputPorts = ((device as IRoutingOutputs) != null) ? (device as IRoutingOutputs).OutputPorts : null;
|
var outputPorts = ((device as IRoutingOutputs) != null) ? (device as IRoutingOutputs).OutputPorts : null;
|
||||||
if (inputPorts != null)
|
if (inputPorts != null)
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("Device {0} has {1} Input Ports:{2}", s, inputPorts.Count, CrestronEnvironment.NewLine);
|
Debug.Console(0, "Device {0} has {1} Input Ports:", s, inputPorts.Count);
|
||||||
foreach (var routingInputPort in inputPorts)
|
foreach (var routingInputPort in inputPorts)
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("{0}{1}", routingInputPort.Key, CrestronEnvironment.NewLine);
|
Debug.Console(0, "{0}", routingInputPort.Key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (outputPorts == null) return;
|
if (outputPorts != null)
|
||||||
CrestronConsole.ConsoleCommandResponse("Device {0} has {1} Output Ports:{2}", s, outputPorts.Count, CrestronEnvironment.NewLine);
|
{
|
||||||
foreach (var routingOutputPort in outputPorts)
|
Debug.Console(0, "Device {0} has {1} Output Ports:", s, outputPorts.Count);
|
||||||
{
|
foreach (var routingOutputPort in outputPorts)
|
||||||
CrestronConsole.ConsoleCommandResponse("{0}{1}", routingOutputPort.Key, CrestronEnvironment.NewLine);
|
{
|
||||||
}
|
Debug.Console(0, "{0}", routingOutputPort.Key);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attempts to set the debug level of a device
|
/// Attempts to set the debug level of a device
|
||||||
@@ -433,7 +423,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
if (device == null)
|
if (device == null)
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("Unable to get device with key: {0}", deviceKey);
|
Debug.Console(0, "Unable to get device with key: {0}", deviceKey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -445,7 +435,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("Unable to convert setting value. Please use off/rx/tx/both");
|
Debug.Console(0, "Unable to convert setting value. Please use off/rx/tx/both");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -456,18 +446,18 @@ namespace PepperDash.Essentials.Core
|
|||||||
var min = Convert.ToUInt32(timeout);
|
var min = Convert.ToUInt32(timeout);
|
||||||
|
|
||||||
device.StreamDebugging.SetDebuggingWithSpecificTimeout(debugSetting, min);
|
device.StreamDebugging.SetDebuggingWithSpecificTimeout(debugSetting, min);
|
||||||
CrestronConsole.ConsoleCommandResponse("Device: '{0}' debug level set to {1} for {2} minutes", deviceKey, debugSetting, min);
|
Debug.Console(0, "Device: '{0}' debug level set to {1} for {2} minutes", deviceKey, debugSetting, min);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("Unable to convert minutes or settings value. Please use an integer value for minutes. Error: {0}", e);
|
Debug.Console(0, "Unable to convert minutes or settings value. Please use an integer value for minutes. Errro: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
device.StreamDebugging.SetDebuggingWithDefaultTimeout(debugSetting);
|
device.StreamDebugging.SetDebuggingWithDefaultTimeout(debugSetting);
|
||||||
CrestronConsole.ConsoleCommandResponse("Device: '{0}' debug level set to {1} for default time (30 minutes)", deviceKey, debugSetting);
|
Debug.Console(0, "Device: '{0}' debug level set to {1} for default time (30 minutes)", deviceKey, debugSetting);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -131,15 +131,4 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract class EssentialsPluginDevelopmentDeviceFactory<T> : EssentialsDeviceFactory<T>, IPluginDevelopmentDeviceFactory where T : EssentialsDevice
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Specifies the minimum version of Essentials required for a plugin to run. Must use the format Major.Minor.Build (ex. "1.4.33")
|
|
||||||
/// </summary>
|
|
||||||
public string MinimumEssentialsFrameworkVersion { get; protected set; }
|
|
||||||
|
|
||||||
public List<string> DevelopmentEssentialsFrameworkVersions { get; protected set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -9,11 +9,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines minimal volume and mute control methods
|
/// Defines minimal volume and mute control methods
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IBasicVolumeControls
|
public interface IBasicVolumeControls : IHasVolumeControl, IHasMuteControl
|
||||||
{
|
{
|
||||||
void VolumeUp(bool pressRelease);
|
|
||||||
void VolumeDown(bool pressRelease);
|
|
||||||
void MuteToggle();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash_Essentials_Core.Devices
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for any device that is able to control it'spower and has a configurable reboot time
|
|
||||||
/// </summary>
|
|
||||||
[Obsolete("PepperDash_Essentials_Core.Devices is Deprecated - use PepperDash.Essentials.Core")]
|
|
||||||
public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Delay between power off and power on for reboot
|
|
||||||
/// </summary>
|
|
||||||
int PowerCycleTimeMs { get;}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Reboot outlet
|
|
||||||
/// </summary>
|
|
||||||
void PowerCycle();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for any device that contains a collection of IHasPowerReboot Devices
|
|
||||||
/// </summary>
|
|
||||||
[Obsolete("PepperDash_Essentials_Core.Devices is Deprecated - use PepperDash.Essentials.Core")]
|
|
||||||
public interface IHasControlledPowerOutlets : IKeyName
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Collection of IPduOutlets
|
|
||||||
/// </summary>
|
|
||||||
ReadOnlyDictionary<int, IHasPowerCycle> PduOutlets { get; }
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for any device that has a battery that can be monitored
|
|
||||||
/// </summary>
|
|
||||||
public interface IHasBatteryStats : IKeyName
|
|
||||||
{
|
|
||||||
int BatteryPercentage { get; }
|
|
||||||
int BatteryCautionThresholdPercentage { get; }
|
|
||||||
int BatteryWarningThresholdPercentage { get; }
|
|
||||||
BoolFeedback BatteryIsWarningFeedback { get; }
|
|
||||||
BoolFeedback BatteryIsCautionFeedback { get; }
|
|
||||||
BoolFeedback BatteryIsOkFeedback { get; }
|
|
||||||
IntFeedback BatteryPercentageFeedback { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for any device that has a battery that can be monitored and the ability to charge and discharge
|
|
||||||
/// </summary>
|
|
||||||
public interface IHasBatteryCharging : IHasBatteryStats
|
|
||||||
{
|
|
||||||
BoolFeedback BatteryIsCharging { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for any device that has multiple batteries that can be monitored
|
|
||||||
/// </summary>
|
|
||||||
public interface IHasBatteries : IKeyName
|
|
||||||
{
|
|
||||||
ReadOnlyDictionary<string, IHasBatteryStats> Batteries { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasBatteryStatsExtended : IHasBatteryStats
|
|
||||||
{
|
|
||||||
int InputVoltage { get; }
|
|
||||||
int OutputVoltage { get; }
|
|
||||||
int InptuCurrent { get; }
|
|
||||||
int OutputCurrent { get; }
|
|
||||||
|
|
||||||
IntFeedback InputVoltageFeedback { get; }
|
|
||||||
IntFeedback OutputVoltageFeedback { get; }
|
|
||||||
IntFeedback InputCurrentFeedback { get; }
|
|
||||||
IntFeedback OutputCurrentFeedback { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for any device that is able to control its power, has a configurable reboot time, and has batteries that can be monitored
|
|
||||||
/// </summary>
|
|
||||||
public interface IHasPowerCycleWithBattery : IHasPowerCycle, IHasBatteryStats
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for any device that is able to control it's power and has a configurable reboot time
|
|
||||||
/// </summary>
|
|
||||||
public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Delay between power off and power on for reboot
|
|
||||||
/// </summary>
|
|
||||||
int PowerCycleTimeMs { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Reboot outlet
|
|
||||||
/// </summary>
|
|
||||||
void PowerCycle();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for any device that contains a collection of IHasPowerReboot Devices
|
|
||||||
/// </summary>
|
|
||||||
public interface IHasControlledPowerOutlets : IKeyName
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Collection of IPduOutlets
|
|
||||||
/// </summary>
|
|
||||||
ReadOnlyDictionary<int, IHasPowerCycle> PduOutlets { get; }
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -59,7 +59,7 @@ namespace PepperDash.Essentials.Core.Devices
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Used by the extending class to allow for any custom actions to be taken (tell the ConfigWriter to write config, etc)
|
/// Used by the extending class to allow for any custom actions to be taken (tell the ConfigWriter to write config, etc)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="config"></param>
|
/// <param name="Config"></param>
|
||||||
protected virtual void CustomSetConfig(DeviceConfig config)
|
protected virtual void CustomSetConfig(DeviceConfig config)
|
||||||
{
|
{
|
||||||
ConfigWriter.UpdateDeviceConfig(config);
|
ConfigWriter.UpdateDeviceConfig(config);
|
||||||
|
|||||||
@@ -105,6 +105,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
protected void LinkDisplayToApi(DisplayBase displayDevice, BasicTriList trilist, uint joinStart, string joinMapKey,
|
protected void LinkDisplayToApi(DisplayBase displayDevice, BasicTriList trilist, uint joinStart, string joinMapKey,
|
||||||
EiscApiAdvanced bridge)
|
EiscApiAdvanced bridge)
|
||||||
{
|
{
|
||||||
|
var inputNumber = 0;
|
||||||
|
var inputKeys = new List<string>();
|
||||||
|
|
||||||
var joinMap = new DisplayControllerJoinMap(joinStart);
|
var joinMap = new DisplayControllerJoinMap(joinStart);
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
@@ -121,141 +124,133 @@ namespace PepperDash.Essentials.Core
|
|||||||
Debug.Console(0,this,"Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
Debug.Console(0,this,"Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
||||||
}
|
}
|
||||||
|
|
||||||
LinkDisplayToApi(displayDevice, trilist, joinMap);
|
Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||||
|
Debug.Console(0, "Linking to Display: {0}", displayDevice.Name);
|
||||||
|
|
||||||
|
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = displayDevice.Name;
|
||||||
|
|
||||||
|
var commMonitor = displayDevice as ICommunicationMonitor;
|
||||||
|
if (commMonitor != null)
|
||||||
|
{
|
||||||
|
commMonitor.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var inputNumberFeedback = new IntFeedback(() => inputNumber);
|
||||||
|
|
||||||
|
// Two way feedbacks
|
||||||
|
var twoWayDisplay = displayDevice as TwoWayDisplayBase;
|
||||||
|
|
||||||
|
if (twoWayDisplay != null)
|
||||||
|
{
|
||||||
|
trilist.SetBool(joinMap.IsTwoWayDisplay.JoinNumber, true);
|
||||||
|
|
||||||
|
twoWayDisplay.CurrentInputFeedback.OutputChange += (o, a) => Debug.Console(0, "CurrentInputFeedback_OutputChange {0}", a.StringValue);
|
||||||
|
|
||||||
|
|
||||||
|
inputNumberFeedback.LinkInputSig(trilist.UShortInput[joinMap.InputSelect.JoinNumber]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Power Off
|
||||||
|
trilist.SetSigTrueAction(joinMap.PowerOff.JoinNumber, () =>
|
||||||
|
{
|
||||||
|
inputNumber = 102;
|
||||||
|
inputNumberFeedback.FireUpdate();
|
||||||
|
displayDevice.PowerOff();
|
||||||
|
});
|
||||||
|
|
||||||
|
var twoWayDisplayDevice = displayDevice as TwoWayDisplayBase;
|
||||||
|
if (twoWayDisplayDevice != null)
|
||||||
|
{
|
||||||
|
twoWayDisplayDevice.PowerIsOnFeedback.OutputChange += (o, a) =>
|
||||||
|
{
|
||||||
|
if (!a.BoolValue)
|
||||||
|
{
|
||||||
|
inputNumber = 102;
|
||||||
|
inputNumberFeedback.FireUpdate();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
inputNumber = 0;
|
||||||
|
inputNumberFeedback.FireUpdate();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
twoWayDisplayDevice.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff.JoinNumber]);
|
||||||
|
twoWayDisplayDevice.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn.JoinNumber]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// PowerOn
|
||||||
|
trilist.SetSigTrueAction(joinMap.PowerOn.JoinNumber, () =>
|
||||||
|
{
|
||||||
|
inputNumber = 0;
|
||||||
|
inputNumberFeedback.FireUpdate();
|
||||||
|
displayDevice.PowerOn();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < displayDevice.InputPorts.Count; i++)
|
||||||
|
{
|
||||||
|
if (i < joinMap.InputNamesOffset.JoinSpan)
|
||||||
|
{
|
||||||
|
inputKeys.Add(displayDevice.InputPorts[i].Key);
|
||||||
|
var tempKey = inputKeys.ElementAt(i);
|
||||||
|
trilist.SetSigTrueAction((ushort)(joinMap.InputSelectOffset.JoinNumber + i),
|
||||||
|
() => displayDevice.ExecuteSwitch(displayDevice.InputPorts[tempKey].Selector));
|
||||||
|
Debug.Console(2, displayDevice, "Setting Input Select Action on Digital Join {0} to Input: {1}",
|
||||||
|
joinMap.InputSelectOffset.JoinNumber + i, displayDevice.InputPorts[tempKey].Key.ToString());
|
||||||
|
trilist.StringInput[(ushort)(joinMap.InputNamesOffset.JoinNumber + i)].StringValue = displayDevice.InputPorts[i].Key.ToString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Debug.Console(0, displayDevice, Debug.ErrorLogLevel.Warning, "Device has {0} inputs. The Join Map allows up to {1} inputs. Discarding inputs {2} - {3} from bridge.",
|
||||||
|
displayDevice.InputPorts.Count, joinMap.InputNamesOffset.JoinSpan, i + 1, displayDevice.InputPorts.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(2, displayDevice, "Setting Input Select Action on Analog Join {0}", joinMap.InputSelect);
|
||||||
|
trilist.SetUShortSigAction(joinMap.InputSelect.JoinNumber, (a) =>
|
||||||
|
{
|
||||||
|
if (a == 0)
|
||||||
|
{
|
||||||
|
displayDevice.PowerOff();
|
||||||
|
inputNumber = 0;
|
||||||
|
}
|
||||||
|
else if (a > 0 && a < displayDevice.InputPorts.Count && a != inputNumber)
|
||||||
|
{
|
||||||
|
displayDevice.ExecuteSwitch(displayDevice.InputPorts.ElementAt(a - 1).Selector);
|
||||||
|
inputNumber = a;
|
||||||
|
}
|
||||||
|
else if (a == 102)
|
||||||
|
{
|
||||||
|
displayDevice.PowerToggle();
|
||||||
|
|
||||||
|
}
|
||||||
|
if (twoWayDisplay != null)
|
||||||
|
inputNumberFeedback.FireUpdate();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
var volumeDisplay = displayDevice as IBasicVolumeControls;
|
||||||
|
if (volumeDisplay == null) return;
|
||||||
|
|
||||||
|
trilist.SetBoolSigAction(joinMap.VolumeUp.JoinNumber, volumeDisplay.VolumeUp);
|
||||||
|
trilist.SetBoolSigAction(joinMap.VolumeDown.JoinNumber, volumeDisplay.VolumeDown);
|
||||||
|
trilist.SetSigTrueAction(joinMap.VolumeMute.JoinNumber, volumeDisplay.MuteToggle);
|
||||||
|
|
||||||
|
var volumeDisplayWithFeedback = volumeDisplay as IBasicVolumeWithFeedback;
|
||||||
|
|
||||||
|
if (volumeDisplayWithFeedback == null) return;
|
||||||
|
trilist.SetSigTrueAction(joinMap.VolumeMuteOn.JoinNumber, volumeDisplayWithFeedback.MuteOn);
|
||||||
|
trilist.SetSigTrueAction(joinMap.VolumeMuteOff.JoinNumber, volumeDisplayWithFeedback.MuteOff);
|
||||||
|
|
||||||
|
|
||||||
|
trilist.SetUShortSigAction(joinMap.VolumeLevel.JoinNumber, volumeDisplayWithFeedback.SetVolume);
|
||||||
|
volumeDisplayWithFeedback.VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[joinMap.VolumeLevel.JoinNumber]);
|
||||||
|
volumeDisplayWithFeedback.MuteFeedback.LinkInputSig(trilist.BooleanInput[joinMap.VolumeMute.JoinNumber]);
|
||||||
|
volumeDisplayWithFeedback.MuteFeedback.LinkInputSig(trilist.BooleanInput[joinMap.VolumeMuteOn.JoinNumber]);
|
||||||
|
volumeDisplayWithFeedback.MuteFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.VolumeMuteOff.JoinNumber]);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void LinkDisplayToApi(DisplayBase displayDevice, BasicTriList trilist, DisplayControllerJoinMap joinMap)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
Debug.Console(0, "Linking to Display: {0}", displayDevice.Name);
|
|
||||||
|
|
||||||
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = displayDevice.Name;
|
|
||||||
|
|
||||||
var commMonitor = displayDevice as ICommunicationMonitor;
|
|
||||||
if (commMonitor != null)
|
|
||||||
{
|
|
||||||
commMonitor.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
|
||||||
}
|
|
||||||
|
|
||||||
var inputNumber = 0;
|
|
||||||
var inputKeys = new List<string>();
|
|
||||||
|
|
||||||
var inputNumberFeedback = new IntFeedback(() => inputNumber);
|
|
||||||
|
|
||||||
// Two way feedbacks
|
|
||||||
var twoWayDisplay = displayDevice as TwoWayDisplayBase;
|
|
||||||
|
|
||||||
if (twoWayDisplay != null)
|
|
||||||
{
|
|
||||||
trilist.SetBool(joinMap.IsTwoWayDisplay.JoinNumber, true);
|
|
||||||
|
|
||||||
twoWayDisplay.CurrentInputFeedback.OutputChange += (o, a) => Debug.Console(0, "CurrentInputFeedback_OutputChange {0}", a.StringValue);
|
|
||||||
|
|
||||||
|
|
||||||
inputNumberFeedback.LinkInputSig(trilist.UShortInput[joinMap.InputSelect.JoinNumber]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Power Off
|
|
||||||
trilist.SetSigTrueAction(joinMap.PowerOff.JoinNumber, () =>
|
|
||||||
{
|
|
||||||
inputNumber = 102;
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
displayDevice.PowerOff();
|
|
||||||
});
|
|
||||||
|
|
||||||
var twoWayDisplayDevice = displayDevice as TwoWayDisplayBase;
|
|
||||||
if (twoWayDisplayDevice != null)
|
|
||||||
{
|
|
||||||
twoWayDisplayDevice.PowerIsOnFeedback.OutputChange += (o, a) =>
|
|
||||||
{
|
|
||||||
if (!a.BoolValue)
|
|
||||||
{
|
|
||||||
inputNumber = 102;
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
inputNumber = 0;
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
twoWayDisplayDevice.PowerIsOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PowerOff.JoinNumber]);
|
|
||||||
twoWayDisplayDevice.PowerIsOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PowerOn.JoinNumber]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// PowerOn
|
|
||||||
trilist.SetSigTrueAction(joinMap.PowerOn.JoinNumber, () =>
|
|
||||||
{
|
|
||||||
inputNumber = 0;
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
displayDevice.PowerOn();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < displayDevice.InputPorts.Count; i++)
|
|
||||||
{
|
|
||||||
if (i < joinMap.InputNamesOffset.JoinSpan)
|
|
||||||
{
|
|
||||||
inputKeys.Add(displayDevice.InputPorts[i].Key);
|
|
||||||
var tempKey = inputKeys.ElementAt(i);
|
|
||||||
trilist.SetSigTrueAction((ushort)(joinMap.InputSelectOffset.JoinNumber + i),
|
|
||||||
() => displayDevice.ExecuteSwitch(displayDevice.InputPorts[tempKey].Selector));
|
|
||||||
Debug.Console(2, displayDevice, "Setting Input Select Action on Digital Join {0} to Input: {1}",
|
|
||||||
joinMap.InputSelectOffset.JoinNumber + i, displayDevice.InputPorts[tempKey].Key.ToString());
|
|
||||||
trilist.StringInput[(ushort)(joinMap.InputNamesOffset.JoinNumber + i)].StringValue = displayDevice.InputPorts[i].Key.ToString();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Debug.Console(0, displayDevice, Debug.ErrorLogLevel.Warning, "Device has {0} inputs. The Join Map allows up to {1} inputs. Discarding inputs {2} - {3} from bridge.",
|
|
||||||
displayDevice.InputPorts.Count, joinMap.InputNamesOffset.JoinSpan, i + 1, displayDevice.InputPorts.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(2, displayDevice, "Setting Input Select Action on Analog Join {0}", joinMap.InputSelect);
|
|
||||||
trilist.SetUShortSigAction(joinMap.InputSelect.JoinNumber, (a) =>
|
|
||||||
{
|
|
||||||
if (a == 0)
|
|
||||||
{
|
|
||||||
displayDevice.PowerOff();
|
|
||||||
inputNumber = 0;
|
|
||||||
}
|
|
||||||
else if (a > 0 && a < displayDevice.InputPorts.Count && a != inputNumber)
|
|
||||||
{
|
|
||||||
displayDevice.ExecuteSwitch(displayDevice.InputPorts.ElementAt(a - 1).Selector);
|
|
||||||
inputNumber = a;
|
|
||||||
}
|
|
||||||
else if (a == 102)
|
|
||||||
{
|
|
||||||
displayDevice.PowerToggle();
|
|
||||||
|
|
||||||
}
|
|
||||||
if (twoWayDisplay != null)
|
|
||||||
inputNumberFeedback.FireUpdate();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
var volumeDisplay = displayDevice as IBasicVolumeControls;
|
|
||||||
if (volumeDisplay == null) return;
|
|
||||||
|
|
||||||
trilist.SetBoolSigAction(joinMap.VolumeUp.JoinNumber, volumeDisplay.VolumeUp);
|
|
||||||
trilist.SetBoolSigAction(joinMap.VolumeDown.JoinNumber, volumeDisplay.VolumeDown);
|
|
||||||
trilist.SetSigTrueAction(joinMap.VolumeMute.JoinNumber, volumeDisplay.MuteToggle);
|
|
||||||
|
|
||||||
var volumeDisplayWithFeedback = volumeDisplay as IBasicVolumeWithFeedback;
|
|
||||||
|
|
||||||
if (volumeDisplayWithFeedback == null) return;
|
|
||||||
trilist.SetSigTrueAction(joinMap.VolumeMuteOn.JoinNumber, volumeDisplayWithFeedback.MuteOn);
|
|
||||||
trilist.SetSigTrueAction(joinMap.VolumeMuteOff.JoinNumber, volumeDisplayWithFeedback.MuteOff);
|
|
||||||
|
|
||||||
|
|
||||||
trilist.SetUShortSigAction(joinMap.VolumeLevel.JoinNumber, volumeDisplayWithFeedback.SetVolume);
|
|
||||||
volumeDisplayWithFeedback.VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[joinMap.VolumeLevel.JoinNumber]);
|
|
||||||
volumeDisplayWithFeedback.MuteFeedback.LinkInputSig(trilist.BooleanInput[joinMap.VolumeMute.JoinNumber]);
|
|
||||||
volumeDisplayWithFeedback.MuteFeedback.LinkInputSig(trilist.BooleanInput[joinMap.VolumeMuteOn.JoinNumber]);
|
|
||||||
volumeDisplayWithFeedback.MuteFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.VolumeMuteOff.JoinNumber]);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -30,40 +30,11 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
bool _PowerIsOn;
|
bool _PowerIsOn;
|
||||||
bool _IsWarmingUp;
|
bool _IsWarmingUp;
|
||||||
bool _IsCoolingDown;
|
bool _IsCoolingDown;
|
||||||
|
|
||||||
protected override Func<bool> PowerIsOnFeedbackFunc
|
protected override Func<bool> PowerIsOnFeedbackFunc { get { return () => _PowerIsOn; } }
|
||||||
{
|
protected override Func<bool> IsCoolingDownFeedbackFunc { get { return () => _IsCoolingDown; } }
|
||||||
get
|
protected override Func<bool> IsWarmingUpFeedbackFunc { get { return () => _IsWarmingUp; } }
|
||||||
{
|
|
||||||
return () =>
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "*************************************************** Display Power is {0}", _PowerIsOn ? "on" : "off");
|
|
||||||
return _PowerIsOn;
|
|
||||||
};
|
|
||||||
} }
|
|
||||||
protected override Func<bool> IsCoolingDownFeedbackFunc
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return () =>
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "*************************************************** {0}", _IsCoolingDown ? "Display is cooling down" : "Display has finished cooling down");
|
|
||||||
return _IsCoolingDown;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected override Func<bool> IsWarmingUpFeedbackFunc
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return () =>
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "*************************************************** {0}", _IsWarmingUp ? "Display is warming up" : "Display has finished warming up");
|
|
||||||
return _IsWarmingUp;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected override Func<string> CurrentInputFeedbackFunc { get { return () => "Not Implemented"; } }
|
protected override Func<string> CurrentInputFeedbackFunc { get { return () => "Not Implemented"; } }
|
||||||
|
|
||||||
int VolumeHeldRepeatInterval = 200;
|
int VolumeHeldRepeatInterval = 200;
|
||||||
@@ -90,7 +61,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
MuteFeedback = new BoolFeedback("MuteOn", () => _IsMuted);
|
MuteFeedback = new BoolFeedback("MuteOn", () => _IsMuted);
|
||||||
|
|
||||||
WarmupTime = 10000;
|
WarmupTime = 10000;
|
||||||
CooldownTime = 10000;
|
CooldownTime = 5000;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void PowerOn()
|
public override void PowerOn()
|
||||||
@@ -117,15 +88,15 @@ namespace PepperDash.Essentials.Core
|
|||||||
if (PowerIsOnFeedback.BoolValue && !_IsWarmingUp && !_IsCoolingDown)
|
if (PowerIsOnFeedback.BoolValue && !_IsWarmingUp && !_IsCoolingDown)
|
||||||
{
|
{
|
||||||
_IsCoolingDown = true;
|
_IsCoolingDown = true;
|
||||||
|
_PowerIsOn = false;
|
||||||
|
PowerIsOnFeedback.InvokeFireUpdate();
|
||||||
IsCoolingDownFeedback.InvokeFireUpdate();
|
IsCoolingDownFeedback.InvokeFireUpdate();
|
||||||
// Fake cool-down cycle
|
// Fake cool-down cycle
|
||||||
CooldownTimer = new CTimer(o =>
|
CooldownTimer = new CTimer(o =>
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "Cooldown timer ending");
|
Debug.Console(2, this, "Cooldown timer ending");
|
||||||
_IsCoolingDown = false;
|
_IsCoolingDown = false;
|
||||||
IsCoolingDownFeedback.InvokeFireUpdate();
|
IsCoolingDownFeedback.InvokeFireUpdate();
|
||||||
_PowerIsOn = false;
|
|
||||||
PowerIsOnFeedback.InvokeFireUpdate();
|
|
||||||
}, CooldownTime);
|
}, CooldownTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
|
||||||
{
|
|
||||||
public static class StringExtensions
|
|
||||||
{
|
|
||||||
public static string NullIfEmpty(this string s)
|
|
||||||
{
|
|
||||||
return string.IsNullOrEmpty(s) ? null : s;
|
|
||||||
}
|
|
||||||
public static string NullIfWhiteSpace(this string s)
|
|
||||||
{
|
|
||||||
return string.IsNullOrEmpty(s.Trim()) ? null : s;
|
|
||||||
}
|
|
||||||
public static string ReplaceIfNullOrEmpty(this string s, string newString)
|
|
||||||
{
|
|
||||||
return string.IsNullOrEmpty(s) ? newString : s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -172,42 +172,37 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Prints the type names and associated metadata from the FactoryMethods collection.
|
/// Prints the type names and associated metadata from the FactoryMethods collection.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="filter"></param>
|
/// <param name="command"></param>
|
||||||
public static void GetDeviceFactoryTypes(string filter)
|
public static void GetDeviceFactoryTypes(string filter)
|
||||||
{
|
{
|
||||||
var types = !string.IsNullOrEmpty(filter)
|
Dictionary<string, DeviceFactoryWrapper> types = new Dictionary<string, DeviceFactoryWrapper>();
|
||||||
? FactoryMethods.Where(k => k.Key.Contains(filter)).ToDictionary(k => k.Key, k => k.Value)
|
|
||||||
: FactoryMethods;
|
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Device Types:");
|
if (!string.IsNullOrEmpty(filter))
|
||||||
|
{
|
||||||
|
types = FactoryMethods.Where(k => k.Key.Contains(filter)).ToDictionary(k => k.Key, k => k.Value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
types = FactoryMethods;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, "Device Types:");
|
||||||
|
|
||||||
foreach (var type in types.OrderBy(t => t.Key))
|
foreach (var type in types.OrderBy(t => t.Key))
|
||||||
{
|
{
|
||||||
var description = type.Value.Description;
|
var description = type.Value.Description;
|
||||||
var cType = "Not Specified by Plugin";
|
var cType = "Not Specified by Plugin";
|
||||||
|
|
||||||
if (type.Value.CType != null)
|
if(type.Value.CType != null)
|
||||||
{
|
{
|
||||||
cType = type.Value.CType.FullName;
|
cType = type.Value.CType.FullName;
|
||||||
}
|
}
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse(
|
Debug.Console(0,
|
||||||
@"Type: '{0}'
|
@"Type: '{0}'
|
||||||
CType: '{1}'
|
CType: '{1}'
|
||||||
Description: {2}", type.Key, cType, description);
|
Description: {2}", type.Key, cType, description);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns the device factory dictionary
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="filter"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static Dictionary<string, DeviceFactoryWrapper> GetDeviceFactoryDictionary(string filter)
|
|
||||||
{
|
|
||||||
return string.IsNullOrEmpty(filter)
|
|
||||||
? FactoryMethods
|
|
||||||
: FactoryMethods.Where(k => k.Key.Contains(filter)).ToDictionary(k => k.Key, k => k.Value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,43 +15,48 @@ namespace PepperDash.Essentials.Core
|
|||||||
static CCriticalSection fileLock = new CCriticalSection();
|
static CCriticalSection fileLock = new CCriticalSection();
|
||||||
public delegate void GotFileEventHandler(object sender, FileEventArgs e);
|
public delegate void GotFileEventHandler(object sender, FileEventArgs e);
|
||||||
public static event GotFileEventHandler GotFileEvent;
|
public static event GotFileEventHandler GotFileEvent;
|
||||||
|
private static Dictionary<string, CTimer> WriteTimers;
|
||||||
|
public const long WriteTimeout = 5000;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get the full file info from a path/filename, can include wildcards.
|
/// Get the full file info from a path/filename, can include wildcards.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="fileName"></param>
|
/// <param name="fileName"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static FileInfo[] GetFiles(string fileName)
|
///
|
||||||
{
|
static FileIO()
|
||||||
string fullFilePath = Global.FilePathPrefix + fileName;
|
{
|
||||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fullFilePath));
|
WriteTimers = new Dictionary<string, CTimer>();
|
||||||
var files = dirInfo.GetFiles(Path.GetFileName(fullFilePath));
|
}
|
||||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fullFilePath);
|
|
||||||
if (files.Count() > 0)
|
|
||||||
{
|
|
||||||
return files;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static FileInfo GetFile(string fileName)
|
public static FileInfo[] GetFiles(string fileName)
|
||||||
{
|
{
|
||||||
string fullFilePath = Global.FilePathPrefix + fileName;
|
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
|
||||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fullFilePath));
|
var files = dirInfo.GetFiles(Path.GetFileName(fileName));
|
||||||
var files = dirInfo.GetFiles(Path.GetFileName(fullFilePath));
|
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
|
||||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fullFilePath);
|
if (files.Count() > 0)
|
||||||
if (files.Count() > 0)
|
{
|
||||||
{
|
return files;
|
||||||
return files.FirstOrDefault();
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
return null;
|
||||||
return null;
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public static FileInfo GetFile(string fileName)
|
||||||
|
{
|
||||||
|
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
|
||||||
|
var files = dirInfo.GetFiles(Path.GetFileName(fileName));
|
||||||
|
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
|
||||||
|
if (files.Count() > 0)
|
||||||
|
{
|
||||||
|
return files.FirstOrDefault();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -83,7 +88,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
if (fileLock.TryEnter())
|
if (fileLock.TryEnter())
|
||||||
{
|
{
|
||||||
DirectoryInfo dirInfo = new DirectoryInfo(file.DirectoryName);
|
|
||||||
Debug.Console(2, "FileIO Getting Data {0}", file.FullName);
|
Debug.Console(2, "FileIO Getting Data {0}", file.FullName);
|
||||||
|
|
||||||
if (File.Exists(file.FullName))
|
if (File.Exists(file.FullName))
|
||||||
@@ -171,7 +175,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock");
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock retrying");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -191,6 +196,41 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resets (or starts) the write timer
|
||||||
|
/// </summary>
|
||||||
|
static void ResetTimer(string data, string filePath)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (WriteTimers.ContainsKey(filePath))
|
||||||
|
{
|
||||||
|
WriteTimers[filePath].Stop();
|
||||||
|
WriteTimers[filePath] = null;
|
||||||
|
WriteTimers.Remove(filePath);
|
||||||
|
}
|
||||||
|
WriteTimers.Add(filePath, new CTimer((o) =>
|
||||||
|
{
|
||||||
|
Thread _WriteFileThread;
|
||||||
|
_WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended);
|
||||||
|
_WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority;
|
||||||
|
_WriteFileThread.Start();
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
|
||||||
|
WriteTimers.Remove(filePath);
|
||||||
|
}, WriteTimeout));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Debug.Console(0, "FileIO write timer has been reset.");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO ResetTimer failed: \r{0}", e);
|
||||||
|
data = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -203,11 +243,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <param name="filePath"></param>
|
/// <param name="filePath"></param>
|
||||||
public static void WriteDataToFile(string data, string filePath)
|
public static void WriteDataToFile(string data, string filePath)
|
||||||
{
|
{
|
||||||
Thread _WriteFileThread;
|
ResetTimer(data, filePath);
|
||||||
_WriteFileThread = new Thread((O) => _WriteFileMethod(data, Global.FilePathPrefix + "/" + filePath), null, Thread.eThreadStartOptions.CreateSuspended);
|
|
||||||
_WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority;
|
|
||||||
_WriteFileThread.Start();
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,8 +255,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
if (fileLock.TryEnter())
|
if (fileLock.TryEnter())
|
||||||
{
|
{
|
||||||
|
using (StreamWriter sw = new StreamWriter(filePath))
|
||||||
using (StreamWriter sw = new StreamWriter(filePath))
|
|
||||||
{
|
{
|
||||||
sw.Write(data);
|
sw.Write(data);
|
||||||
sw.Flush();
|
sw.Flush();
|
||||||
@@ -243,6 +278,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
fileLock.Leave();
|
fileLock.Leave();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "File Written to : '{0}'", filePath);
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
@@ -7,7 +6,6 @@ using System.Collections.Generic;
|
|||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
using Crestron.SimplSharp.CrestronDataStore;
|
using Crestron.SimplSharp.CrestronDataStore;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.License;
|
using PepperDash.Essentials.License;
|
||||||
@@ -41,14 +39,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if(ControlSystem.SystemControl != null)
|
return ControlSystem.ControllerPrompt.ToLower().IndexOf("dmps") > -1;
|
||||||
{
|
|
||||||
if(ControlSystem.SystemControl.SystemControlType > 0)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,39 +50,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if(ControlSystem.SystemControl != null)
|
return ControlSystemIsDmpsType && ControlSystem.ControllerPrompt.ToLower().IndexOf("4k") > -1;
|
||||||
{
|
|
||||||
if(ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K150CSystemControl ||
|
|
||||||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K200CSystemControl ||
|
|
||||||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl ||
|
|
||||||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K300CSystemControl ||
|
|
||||||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// True when the processor type is a DMPS 4K 200/300/250/350 variant
|
|
||||||
/// </summary>
|
|
||||||
public static bool ControlSystemIsDmps4k3xxType
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if(ControlSystem.SystemControl != null)
|
|
||||||
{
|
|
||||||
if(ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K200CSystemControl ||
|
|
||||||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl ||
|
|
||||||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K300CSystemControl ||
|
|
||||||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,38 +122,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
AssemblyVersion = assemblyVersion;
|
AssemblyVersion = assemblyVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsRunningDevelopmentVersion(List<string> developmentVersions, string minimumVersion)
|
|
||||||
{
|
|
||||||
if (Regex.Match(AssemblyVersion, @"^(\d*).(\d*).(\d*).*").Groups[1].Value == "0")
|
|
||||||
{
|
|
||||||
Debug.Console(2, "Running Local Build. Bypassing Dependency Check.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (developmentVersions == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0,
|
|
||||||
"Development Plugin does not specify a list of versions. Loading plugin may not work as expected. Checking Minumum version");
|
|
||||||
return IsRunningMinimumVersionOrHigher(minimumVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(2, "Comparing running version '{0}' to minimum versions '{1}'", AssemblyVersion, developmentVersions);
|
|
||||||
|
|
||||||
var versionMatch = developmentVersions.FirstOrDefault(x => x == AssemblyVersion);
|
|
||||||
|
|
||||||
if (String.IsNullOrEmpty(versionMatch))
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Essentials Build does not match any builds required for plugin load. Bypassing Plugin Load.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(2, "Essentials Build {0} matches list of development builds", AssemblyVersion);
|
|
||||||
return IsRunningMinimumVersionOrHigher(minimumVersion);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks to see if the running version meets or exceed the minimum specified version. For beta versions (0.xx.yy), will always return true.
|
/// Checks to see if the running version meets or exceed the minimum specified version. For beta versions (0.xx.yy), will always return true.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Runtime.InteropServices;
|
||||||
using Crestron.SimplSharp.Reflection;
|
using Crestron.SimplSharp.Reflection;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
@@ -101,22 +98,22 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void PrintJoinMapInfo()
|
public void PrintJoinMapInfo()
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("{0}:\n", GetType().Name);
|
Debug.Console(0, "{0}:\n", GetType().Name);
|
||||||
|
|
||||||
// Get the joins of each type and print them
|
// Get the joins of each type and print them
|
||||||
CrestronConsole.ConsoleCommandResponse("Digitals:");
|
Debug.Console(0, "Digitals:");
|
||||||
var digitals = Joins.Where(j => (j.Value.JoinType & eJoinType.Digital) == eJoinType.Digital).ToDictionary(j => j.Key, j => j.Value);
|
var digitals = Joins.Where(j => (j.Value.JoinType & eJoinType.Digital) == eJoinType.Digital).ToDictionary(j => j.Key, j => j.Value);
|
||||||
CrestronConsole.ConsoleCommandResponse("Found {0} Digital Joins", digitals.Count);
|
Debug.Console(2, "Found {0} Digital Joins", digitals.Count);
|
||||||
PrintJoinList(GetSortedJoins(digitals));
|
PrintJoinList(GetSortedJoins(digitals));
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Analogs:");
|
Debug.Console(0, "Analogs:");
|
||||||
var analogs = Joins.Where(j => (j.Value.JoinType & eJoinType.Analog) == eJoinType.Analog).ToDictionary(j => j.Key, j => j.Value);
|
var analogs = Joins.Where(j => (j.Value.JoinType & eJoinType.Analog) == eJoinType.Analog).ToDictionary(j => j.Key, j => j.Value);
|
||||||
CrestronConsole.ConsoleCommandResponse("Found {0} Analog Joins", analogs.Count);
|
Debug.Console(2, "Found {0} Analog Joins", analogs.Count);
|
||||||
PrintJoinList(GetSortedJoins(analogs));
|
PrintJoinList(GetSortedJoins(analogs));
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Serials:");
|
Debug.Console(0, "Serials:");
|
||||||
var serials = Joins.Where(j => (j.Value.JoinType & eJoinType.Serial) == eJoinType.Serial).ToDictionary(j => j.Key, j => j.Value);
|
var serials = Joins.Where(j => (j.Value.JoinType & eJoinType.Serial) == eJoinType.Serial).ToDictionary(j => j.Key, j => j.Value);
|
||||||
CrestronConsole.ConsoleCommandResponse("Found {0} Serial Joins", serials.Count);
|
Debug.Console(2, "Found {0} Serial Joins", serials.Count);
|
||||||
PrintJoinList(GetSortedJoins(serials));
|
PrintJoinList(GetSortedJoins(serials));
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -139,7 +136,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
foreach (var join in joins)
|
foreach (var join in joins)
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse(
|
Debug.Console(0,
|
||||||
@"Join Number: {0} | Label: '{1}' | JoinSpan: '{2}' | Type: '{3}' | Capabilities: '{4}'",
|
@"Join Number: {0} | Label: '{1}' | JoinSpan: '{2}' | Type: '{3}' | Capabilities: '{4}'",
|
||||||
join.Value.JoinNumber,
|
join.Value.JoinNumber,
|
||||||
join.Value.Label,
|
join.Value.Label,
|
||||||
@@ -196,6 +193,19 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
protected void AddJoins(Type type)
|
protected void AddJoins(Type type)
|
||||||
{
|
{
|
||||||
|
// Add all the JoinDataComplete properties to the Joins Dictionary and pass in the offset
|
||||||
|
//Joins = this.GetType()
|
||||||
|
// .GetCType()
|
||||||
|
// .GetFields(BindingFlags.Public | BindingFlags.Instance)
|
||||||
|
// .Where(field => field.IsDefined(typeof(JoinNameAttribute), true))
|
||||||
|
// .Select(field => (JoinDataComplete)field.GetValue(this))
|
||||||
|
// .ToDictionary(join => join.GetNameAttribute(), join =>
|
||||||
|
// {
|
||||||
|
// join.SetJoinOffset(_joinOffset);
|
||||||
|
// return join;
|
||||||
|
// });
|
||||||
|
|
||||||
|
//type = this.GetType(); <- this wasn't working because 'this' was always the base class, never the derived class
|
||||||
var fields =
|
var fields =
|
||||||
type.GetCType()
|
type.GetCType()
|
||||||
.GetFields(BindingFlags.Public | BindingFlags.Instance)
|
.GetFields(BindingFlags.Public | BindingFlags.Instance)
|
||||||
@@ -209,7 +219,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
if (value == null)
|
if (value == null)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Unable to cast base class to {0}", type.Name);
|
Debug.Console(0, "Unable to caset base class to {0}", type.Name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,69 +244,23 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void PrintJoinMapInfo()
|
public void PrintJoinMapInfo()
|
||||||
{
|
{
|
||||||
var sb = JoinmapStringBuilder();
|
Debug.Console(0, "{0}:\n", GetType().Name);
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse(sb.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
private StringBuilder JoinmapStringBuilder()
|
|
||||||
{
|
|
||||||
var sb = new StringBuilder();
|
|
||||||
|
|
||||||
// Get the joins of each type and print them
|
// Get the joins of each type and print them
|
||||||
sb.AppendLine(String.Format("# {0}", GetType().Name));
|
Debug.Console(0, "Digitals:");
|
||||||
sb.AppendLine();
|
var digitals = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Digital) == eJoinType.Digital).ToDictionary(j => j.Key, j => j.Value);
|
||||||
sb.AppendLine("## Digitals");
|
Debug.Console(2, "Found {0} Digital Joins", digitals.Count);
|
||||||
sb.AppendLine();
|
PrintJoinList(GetSortedJoins(digitals));
|
||||||
// Get the joins of each type and print them
|
|
||||||
var digitals =
|
|
||||||
Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Digital) == eJoinType.Digital)
|
|
||||||
.ToDictionary(j => j.Key, j => j.Value);
|
|
||||||
var digitalSb = AppendJoinList(GetSortedJoins(digitals));
|
|
||||||
digitalSb.AppendLine("## Analogs");
|
|
||||||
digitalSb.AppendLine();
|
|
||||||
|
|
||||||
var analogs =
|
Debug.Console(0, "Analogs:");
|
||||||
Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Analog) == eJoinType.Analog)
|
var analogs = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Analog) == eJoinType.Analog).ToDictionary(j => j.Key, j => j.Value);
|
||||||
.ToDictionary(j => j.Key, j => j.Value);
|
Debug.Console(2, "Found {0} Analog Joins", analogs.Count);
|
||||||
var analogSb = AppendJoinList(GetSortedJoins(analogs));
|
PrintJoinList(GetSortedJoins(analogs));
|
||||||
analogSb.AppendLine("## Serials");
|
|
||||||
analogSb.AppendLine();
|
Debug.Console(0, "Serials:");
|
||||||
|
var serials = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Serial) == eJoinType.Serial).ToDictionary(j => j.Key, j => j.Value);
|
||||||
var serials =
|
Debug.Console(2, "Found {0} Serial Joins", serials.Count);
|
||||||
Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Serial) == eJoinType.Serial)
|
PrintJoinList(GetSortedJoins(serials));
|
||||||
.ToDictionary(j => j.Key, j => j.Value);
|
|
||||||
var serialSb = AppendJoinList(GetSortedJoins(serials));
|
|
||||||
|
|
||||||
sb.EnsureCapacity(sb.Length + digitalSb.Length + analogSb.Length + serialSb.Length);
|
|
||||||
sb.Append(digitalSb).Append(analogSb).Append(serialSb);
|
|
||||||
return sb;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Prints the join information to console
|
|
||||||
/// </summary>
|
|
||||||
public void MarkdownJoinMapInfo(string deviceKey, string bridgeKey)
|
|
||||||
{
|
|
||||||
var pluginType = GetType().Name;
|
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse("{0}:\n", pluginType);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WriteJoinmapMarkdown(JoinmapStringBuilder(), pluginType, bridgeKey, deviceKey);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void WriteJoinmapMarkdown(StringBuilder stringBuilder, string pluginType, string bridgeKey, string deviceKey)
|
|
||||||
{
|
|
||||||
var fileName = String.Format("{0}{1}{2}__{3}__{4}.md", Global.FilePathPrefix, "joinMaps/", pluginType, bridgeKey, deviceKey);
|
|
||||||
|
|
||||||
using (var sw = new StreamWriter(fileName))
|
|
||||||
{
|
|
||||||
sw.WriteLine(stringBuilder.ToString());
|
|
||||||
CrestronConsole.ConsoleCommandResponse("Joinmap Readme generated and written to {0}", fileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,7 +269,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="joins"></param>
|
/// <param name="joins"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
static List<KeyValuePair<string, JoinDataComplete>> GetSortedJoins(Dictionary<string, JoinDataComplete> joins)
|
List<KeyValuePair<string, JoinDataComplete>> GetSortedJoins(Dictionary<string, JoinDataComplete> joins)
|
||||||
{
|
{
|
||||||
var sortedJoins = joins.ToList();
|
var sortedJoins = joins.ToList();
|
||||||
|
|
||||||
@@ -314,38 +278,18 @@ namespace PepperDash.Essentials.Core
|
|||||||
return sortedJoins;
|
return sortedJoins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PrintJoinList(List<KeyValuePair<string, JoinDataComplete>> joins)
|
||||||
static StringBuilder AppendJoinList(List<KeyValuePair<string, JoinDataComplete>> joins)
|
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder();
|
|
||||||
const string stringFormatter = "| {0} | {1} | {2} | {3} | {4} |";
|
|
||||||
const int joinNumberLen = 11;
|
|
||||||
const int joinSpanLen = 9;
|
|
||||||
const int typeLen = 19;
|
|
||||||
const int capabilitiesLen = 12;
|
|
||||||
var descriptionLen = (from @join in joins select @join.Value into j select j.Metadata.Description.Length).Concat(new[] {11}).Max();
|
|
||||||
|
|
||||||
//build header
|
|
||||||
sb.AppendLine(String.Format(stringFormatter,
|
|
||||||
String.Format("Join Number").PadRight(joinNumberLen, ' '),
|
|
||||||
String.Format("Join Span").PadRight(joinSpanLen, ' '),
|
|
||||||
String.Format("Description").PadRight(descriptionLen, ' '),
|
|
||||||
String.Format("Type").PadRight(typeLen, ' '),
|
|
||||||
String.Format("Capabilities").PadRight(capabilitiesLen, ' ')));
|
|
||||||
//build table seperator
|
|
||||||
sb.AppendLine(String.Format(stringFormatter,
|
|
||||||
new String('-', joinNumberLen),
|
|
||||||
new String('-', joinSpanLen),
|
|
||||||
new String('-', descriptionLen),
|
|
||||||
new String('-', typeLen),
|
|
||||||
new String('-', capabilitiesLen)));
|
|
||||||
|
|
||||||
foreach (var join in joins)
|
foreach (var join in joins)
|
||||||
{
|
{
|
||||||
sb.AppendLine(join.Value.GetMarkdownFormattedData(stringFormatter, descriptionLen));
|
Debug.Console(0,
|
||||||
|
@"Join Number: {0} | JoinSpan: '{1}' | Description: '{2}' | Type: '{3}' | Capabilities: '{4}'",
|
||||||
|
join.Value.JoinNumber,
|
||||||
|
join.Value.JoinSpan,
|
||||||
|
String.IsNullOrEmpty(join.Value.AttributeName) ? join.Value.Metadata.Label : join.Value.AttributeName,
|
||||||
|
join.Value.Metadata.JoinType.ToString(),
|
||||||
|
join.Value.Metadata.JoinCapabilities.ToString());
|
||||||
}
|
}
|
||||||
sb.AppendLine();
|
|
||||||
return sb;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -514,64 +458,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
Metadata = metadata;
|
Metadata = metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetMarkdownFormattedData(string stringFormatter, int descriptionLen)
|
|
||||||
{
|
|
||||||
|
|
||||||
//Fixed Width Headers
|
|
||||||
var joinNumberLen = String.Format("Join Number").Length;
|
|
||||||
var joinSpanLen = String.Format("Join Span").Length;
|
|
||||||
var typeLen = String.Format("AnalogDigitalSerial").Length;
|
|
||||||
var capabilitiesLen = String.Format("ToFromFusion").Length;
|
|
||||||
|
|
||||||
//Track which one failed, if it did
|
|
||||||
const string placeholder = "unknown";
|
|
||||||
var dataArray = new Dictionary<string, string>
|
|
||||||
{
|
|
||||||
{"joinNumber", placeholder.PadRight(joinNumberLen, ' ')},
|
|
||||||
{"joinSpan", placeholder.PadRight(joinSpanLen, ' ')},
|
|
||||||
{"description", placeholder.PadRight(descriptionLen, ' ')},
|
|
||||||
{"joinType", placeholder.PadRight(typeLen, ' ')},
|
|
||||||
{"capabilities", placeholder.PadRight(capabilitiesLen, ' ')}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
dataArray["joinNumber"] = String.Format("{0}", JoinNumber.ToString(CultureInfo.InvariantCulture).ReplaceIfNullOrEmpty(placeholder)).PadRight(joinNumberLen, ' ');
|
|
||||||
dataArray["joinSpan"] = String.Format("{0}", JoinSpan.ToString(CultureInfo.InvariantCulture).ReplaceIfNullOrEmpty(placeholder)).PadRight(joinSpanLen, ' ');
|
|
||||||
dataArray["description"] = String.Format("{0}", Metadata.Description.ReplaceIfNullOrEmpty(placeholder)).PadRight(descriptionLen, ' ');
|
|
||||||
dataArray["joinType"] = String.Format("{0}", Metadata.JoinType.ToString().ReplaceIfNullOrEmpty(placeholder)).PadRight(typeLen, ' ');
|
|
||||||
dataArray["capabilities"] = String.Format("{0}", Metadata.JoinCapabilities.ToString().ReplaceIfNullOrEmpty(placeholder)).PadRight(capabilitiesLen, ' ');
|
|
||||||
|
|
||||||
return String.Format(stringFormatter,
|
|
||||||
dataArray["joinNumber"],
|
|
||||||
dataArray["joinSpan"],
|
|
||||||
dataArray["description"],
|
|
||||||
dataArray["joinType"],
|
|
||||||
dataArray["capabilities"]);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
//Don't Throw - we don't want to kill the system if this falls over - it's not mission critical. Print the error, use placeholder data
|
|
||||||
var errorKey = string.Empty;
|
|
||||||
foreach (var item in dataArray)
|
|
||||||
{
|
|
||||||
if (item.Value.TrimEnd() == placeholder) continue;
|
|
||||||
errorKey = item.Key;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Debug.Console(0, "Unable to decode join metadata {1}- {0}", e.Message, !String.IsNullOrEmpty(errorKey) ? (' ' + errorKey) : String.Empty);
|
|
||||||
return String.Format(stringFormatter,
|
|
||||||
dataArray["joinNumber"],
|
|
||||||
dataArray["joinSpan"],
|
|
||||||
dataArray["description"],
|
|
||||||
dataArray["joinType"],
|
|
||||||
dataArray["capabilities"]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the join offset value
|
/// Sets the join offset value
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -70,69 +70,50 @@ namespace PepperDash.Essentials.Core.Lighting
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected GenericLightingJoinMap LinkLightingToApi(LightingBase lightingDevice, BasicTriList trilist, uint joinStart,
|
protected GenericLightingJoinMap LinkLightingToApi(LightingBase lightingDevice, BasicTriList trilist, uint joinStart,
|
||||||
string joinMapKey, EiscApiAdvanced bridge)
|
string joinMapKey, EiscApiAdvanced bridge)
|
||||||
{
|
|
||||||
var joinMap = new GenericLightingJoinMap(joinStart);
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<GenericLightingJoinMap>(joinMapSerialized);
|
|
||||||
|
|
||||||
if (bridge != null)
|
|
||||||
{
|
|
||||||
bridge.AddJoinMap(Key, joinMap);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
|
||||||
}
|
|
||||||
|
|
||||||
return LinkLightingToApi(lightingDevice, trilist, joinMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected GenericLightingJoinMap LinkLightingToApi(LightingBase lightingDevice, BasicTriList trilist, GenericLightingJoinMap joinMap)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
|
|
||||||
Debug.Console(0, "Linking to Lighting Type {0}", lightingDevice.GetType().Name.ToString());
|
|
||||||
|
|
||||||
// GenericLighitng Actions & FeedBack
|
|
||||||
trilist.SetUShortSigAction(joinMap.SelectScene.JoinNumber, u => lightingDevice.SelectScene(lightingDevice.LightingScenes[u]));
|
|
||||||
|
|
||||||
var sceneIndex = 0;
|
|
||||||
foreach (var scene in lightingDevice.LightingScenes)
|
|
||||||
{
|
{
|
||||||
var index = sceneIndex;
|
var joinMap = new GenericLightingJoinMap(joinStart);
|
||||||
|
|
||||||
trilist.SetSigTrueAction((uint)(joinMap.SelectSceneDirect.JoinNumber + index), () => lightingDevice.SelectScene(lightingDevice.LightingScenes[index]));
|
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
||||||
scene.IsActiveFeedback.LinkInputSig(trilist.BooleanInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + index)]);
|
|
||||||
trilist.StringInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + index)].StringValue = scene.Name;
|
|
||||||
trilist.BooleanInput[(uint)(joinMap.ButtonVisibility.JoinNumber + index)].BoolValue = true;
|
|
||||||
|
|
||||||
sceneIndex++;
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
|
joinMap = JsonConvert.DeserializeObject<GenericLightingJoinMap>(joinMapSerialized);
|
||||||
|
|
||||||
|
if (bridge != null)
|
||||||
|
{
|
||||||
|
bridge.AddJoinMap(Key, joinMap);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
||||||
|
|
||||||
|
Debug.Console(0, "Linking to Lighting Type {0}", lightingDevice.GetType().Name.ToString());
|
||||||
|
|
||||||
|
// GenericLighitng Actions & FeedBack
|
||||||
|
trilist.SetUShortSigAction(joinMap.SelectScene.JoinNumber, u => lightingDevice.SelectScene(lightingDevice.LightingScenes[u]));
|
||||||
|
|
||||||
|
var sceneIndex = 0;
|
||||||
|
foreach (var scene in lightingDevice.LightingScenes)
|
||||||
|
{
|
||||||
|
var index1 = sceneIndex;
|
||||||
|
trilist.SetSigTrueAction((uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex), () =>
|
||||||
|
{
|
||||||
|
var index = index1;
|
||||||
|
Debug.Console(2, this, "LightingDevice: sceneIndex: {0} index: {1} > inside action", index1, index);
|
||||||
|
lightingDevice.SelectScene(lightingDevice.LightingScenes[index]);
|
||||||
|
});
|
||||||
|
scene.IsActiveFeedback.LinkInputSig(trilist.BooleanInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)]);
|
||||||
|
trilist.StringInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)].StringValue = scene.Name;
|
||||||
|
trilist.BooleanInput[(uint)(joinMap.ButtonVisibility.JoinNumber + sceneIndex)].BoolValue = true;
|
||||||
|
sceneIndex++;
|
||||||
|
}
|
||||||
|
return joinMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
trilist.OnlineStatusChange += (sender, args) =>
|
|
||||||
{
|
|
||||||
if (!args.DeviceOnLine) return;
|
|
||||||
|
|
||||||
sceneIndex = 0;
|
|
||||||
foreach (var scene in lightingDevice.LightingScenes)
|
|
||||||
{
|
|
||||||
var index = sceneIndex;
|
|
||||||
|
|
||||||
trilist.StringInput[(uint) (joinMap.SelectSceneDirect.JoinNumber + index)].StringValue = scene.Name;
|
|
||||||
trilist.BooleanInput[(uint) (joinMap.ButtonVisibility.JoinNumber + index)].BoolValue = true;
|
|
||||||
scene.IsActiveFeedback.FireUpdate();
|
|
||||||
|
|
||||||
sceneIndex++;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return joinMap;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LightingScene
|
public class LightingScene
|
||||||
|
|||||||
@@ -43,20 +43,7 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
public StringFeedback UptimeFeedback { get; set; }
|
public StringFeedback UptimeFeedback { get; set; }
|
||||||
public StringFeedback LastStartFeedback { get; set; }
|
public StringFeedback LastStartFeedback { get; set; }
|
||||||
|
|
||||||
public BoolFeedback IsApplianceFeedback { get; protected set; }
|
public SystemMonitorController(string key)
|
||||||
private bool _isApplianceFb
|
|
||||||
{
|
|
||||||
get { return CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public BoolFeedback IsServerFeedback { get; protected set; }
|
|
||||||
private bool _isServerFb
|
|
||||||
{
|
|
||||||
get { return CrestronEnvironment.DevicePlatform == eDevicePlatform.Server; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public SystemMonitorController(string key)
|
|
||||||
: base(key)
|
: base(key)
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "Adding SystemMonitorController.");
|
Debug.Console(2, this, "Adding SystemMonitorController.");
|
||||||
@@ -76,9 +63,6 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
UptimeFeedback = new StringFeedback(() => _uptime);
|
UptimeFeedback = new StringFeedback(() => _uptime);
|
||||||
LastStartFeedback = new StringFeedback(()=> _lastStart);
|
LastStartFeedback = new StringFeedback(()=> _lastStart);
|
||||||
|
|
||||||
IsApplianceFeedback = new BoolFeedback(() => _isApplianceFb);
|
|
||||||
IsServerFeedback = new BoolFeedback(() => _isServerFb);
|
|
||||||
|
|
||||||
ProgramStatusFeedbackCollection = new Dictionary<uint, ProgramStatusFeedbacks>();
|
ProgramStatusFeedbackCollection = new Dictionary<uint, ProgramStatusFeedbacks>();
|
||||||
|
|
||||||
foreach (var prog in SystemMonitor.ProgramCollection)
|
foreach (var prog in SystemMonitor.ProgramCollection)
|
||||||
@@ -139,26 +123,6 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
_uptime = uptimeRaw.Substring(forIndex + 4);
|
_uptime = uptimeRaw.Substring(forIndex + 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ProcessorReboot()
|
|
||||||
{
|
|
||||||
if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Server) return;
|
|
||||||
|
|
||||||
var response = string.Empty;
|
|
||||||
CrestronConsole.SendControlSystemCommand("reboot", ref response);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void ProgramReset(uint index)
|
|
||||||
{
|
|
||||||
if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Server) return;
|
|
||||||
|
|
||||||
if (index <= 0 || index > 10) return;
|
|
||||||
|
|
||||||
var cmd = string.Format("progreset -p:{0}", index);
|
|
||||||
|
|
||||||
var response = string.Empty;
|
|
||||||
CrestronConsole.SendControlSystemCommand(cmd, ref response);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void CrestronEnvironmentOnEthernetEventHandler(EthernetEventArgs ethernetEventArgs)
|
private void CrestronEnvironmentOnEthernetEventHandler(EthernetEventArgs ethernetEventArgs)
|
||||||
{
|
{
|
||||||
if (ethernetEventArgs.EthernetEventType != eEthernetEventType.LinkUp) return;
|
if (ethernetEventArgs.EthernetEventType != eEthernetEventType.LinkUp) return;
|
||||||
@@ -221,9 +185,6 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
SerialNumberFeedback.FireUpdate();
|
SerialNumberFeedback.FireUpdate();
|
||||||
ModelFeedback.FireUpdate();
|
ModelFeedback.FireUpdate();
|
||||||
|
|
||||||
IsApplianceFeedback.FireUpdate();
|
|
||||||
IsServerFeedback.FireUpdate();
|
|
||||||
|
|
||||||
OnSystemMonitorPropertiesChanged();
|
OnSystemMonitorPropertiesChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,11 +237,6 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
UptimeFeedback.LinkInputSig(trilist.StringInput[joinMap.Uptime.JoinNumber]);
|
UptimeFeedback.LinkInputSig(trilist.StringInput[joinMap.Uptime.JoinNumber]);
|
||||||
LastStartFeedback.LinkInputSig(trilist.StringInput[joinMap.LastBoot.JoinNumber]);
|
LastStartFeedback.LinkInputSig(trilist.StringInput[joinMap.LastBoot.JoinNumber]);
|
||||||
|
|
||||||
trilist.SetSigHeldAction(joinMap.ProcessorReboot.JoinNumber, 10000, ProcessorReboot);
|
|
||||||
|
|
||||||
IsApplianceFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsAppliance.JoinNumber]);
|
|
||||||
IsServerFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsServer.JoinNumber]);
|
|
||||||
|
|
||||||
// iterate the program status feedback collection and map all the joins
|
// iterate the program status feedback collection and map all the joins
|
||||||
LinkProgramInfoJoins(this, trilist, joinMap);
|
LinkProgramInfoJoins(this, trilist, joinMap);
|
||||||
|
|
||||||
@@ -345,13 +301,11 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
p.Value.AggregatedProgramInfoFeedback.LinkInputSig(
|
p.Value.AggregatedProgramInfoFeedback.LinkInputSig(
|
||||||
trilist.StringInput[programSlotJoinStart + joinMap.AggregatedProgramInfo.JoinNumber]);
|
trilist.StringInput[programSlotJoinStart + joinMap.AggregatedProgramInfo.JoinNumber]);
|
||||||
|
|
||||||
trilist.SetSigHeldAction(programSlotJoinStart + joinMap.ProgramReset.JoinNumber, 10000, () => ProgramReset(programNumber));
|
|
||||||
|
|
||||||
programSlotJoinStart = programSlotJoinStart + joinMap.ProgramOffsetJoin.JoinSpan;
|
programSlotJoinStart = programSlotJoinStart + joinMap.ProgramOffsetJoin.JoinSpan;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//// Sets the time zone
|
//// Sets the time zone
|
||||||
//public void SetTimeZone(int timeZone)
|
//public void SetTimeZone(int timeZone)
|
||||||
//{
|
//{
|
||||||
// SystemMonitor.TimeZoneInformation.TimeZoneNumber = timeZone;
|
// SystemMonitor.TimeZoneInformation.TimeZoneNumber = timeZone;
|
||||||
|
|||||||
@@ -92,10 +92,6 @@
|
|||||||
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCustomAttributesInterface.dll</HintPath>
|
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCustomAttributesInterface.dll</HintPath>
|
||||||
<Private>False</Private>
|
<Private>False</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="SimplSharpCWSHelperInterface, Version=2.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
|
||||||
<SpecificVersion>False</SpecificVersion>
|
|
||||||
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCWSHelperInterface.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="SimplSharpHelperInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
<Reference Include="SimplSharpHelperInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpHelperInterface.dll</HintPath>
|
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpHelperInterface.dll</HintPath>
|
||||||
@@ -127,9 +123,6 @@
|
|||||||
<Compile Include="Bridges\IBridge.cs" />
|
<Compile Include="Bridges\IBridge.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\AirMediaControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\AirMediaControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\AppleTvJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\AppleTvJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\IAnalogInputJoinMap.cs" />
|
|
||||||
<Compile Include="Bridges\JoinMaps\IDigitalOutputJoinMap.cs" />
|
|
||||||
<Compile Include="Bridges\JoinMaps\PduJoinMapBase.cs" />
|
|
||||||
<Compile Include="Bridges\JoinMaps\C2nRthsControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\C2nRthsControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\CameraControllerJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\CameraControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\CenOdtOccupancySensorBaseJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\CenOdtOccupancySensorBaseJoinMap.cs" />
|
||||||
@@ -185,40 +178,15 @@
|
|||||||
<Compile Include="Crestron IO\Cards\InternalCardCageController.cs" />
|
<Compile Include="Crestron IO\Cards\InternalCardCageController.cs" />
|
||||||
<Compile Include="Crestron IO\DinCenCn\DinCenCnController.cs" />
|
<Compile Include="Crestron IO\DinCenCn\DinCenCnController.cs" />
|
||||||
<Compile Include="Crestron IO\DinCenCn\IHasCresnetBranches.cs" />
|
<Compile Include="Crestron IO\DinCenCn\IHasCresnetBranches.cs" />
|
||||||
<Compile Include="Crestron IO\DinIo8\DinIo8Controller.cs" />
|
|
||||||
<Compile Include="Crestron IO\Inputs\CenIoDigIn104Controller.cs" />
|
<Compile Include="Crestron IO\Inputs\CenIoDigIn104Controller.cs" />
|
||||||
<Compile Include="Crestron IO\Inputs\GenericVersiportAnalogInputDevice.cs" />
|
|
||||||
<Compile Include="Crestron IO\Inputs\GenericDigitalInputDevice.cs" />
|
<Compile Include="Crestron IO\Inputs\GenericDigitalInputDevice.cs" />
|
||||||
<Compile Include="Crestron IO\Inputs\GenericVersiportInputDevice.cs" />
|
<Compile Include="Crestron IO\Inputs\GenericVersiportInputDevice.cs" />
|
||||||
<Compile Include="Crestron IO\Inputs\IAnalogInput.cs" />
|
|
||||||
<Compile Include="Crestron IO\Inputs\IDigitalInput.cs" />
|
<Compile Include="Crestron IO\Inputs\IDigitalInput.cs" />
|
||||||
<Compile Include="Crestron IO\IOPortConfig.cs" />
|
<Compile Include="Crestron IO\IOPortConfig.cs" />
|
||||||
<Compile Include="Crestron IO\Ir\CenIoIr104Controller.cs" />
|
|
||||||
<Compile Include="Crestron IO\Outputs\GenericVersiportOutputDevice.cs" />
|
|
||||||
<Compile Include="Crestron IO\Outputs\IDigitalOutput.cs" />
|
|
||||||
<Compile Include="Crestron IO\Relay\CenIoRy104Controller.cs" />
|
<Compile Include="Crestron IO\Relay\CenIoRy104Controller.cs" />
|
||||||
<Compile Include="Crestron IO\Relay\GenericRelayDevice.cs" />
|
<Compile Include="Crestron IO\Relay\GenericRelayDevice.cs" />
|
||||||
<Compile Include="Crestron IO\Relay\ISwitchedOutput.cs" />
|
<Compile Include="Crestron IO\Relay\ISwitchedOutput.cs" />
|
||||||
<Compile Include="Crestron IO\StatusSign\StatusSignController.cs" />
|
<Compile Include="Crestron IO\StatusSign\StatusSignController.cs" />
|
||||||
<Compile Include="Devices\PowerInterfaces.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\AppDebugRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\GetFeedbacksForDeviceRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\EssentialsWebApiHelpers.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\GetTypesByFilterRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\GetJoinMapForDeviceKeyRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\DefaultRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\DevListRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\DevPropsRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\DevJsonRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\SetDeviceStreamDebugRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\DisableAllStreamDebugRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\ShowConfigRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\GetTypesRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\GetJoinMapForBridgeKeyRequestHandler.cs" />
|
|
||||||
<Compile Include="Web\EssemtialsWebApi.cs" />
|
|
||||||
<Compile Include="Web\EssentialsWebApiFactory.cs" />
|
|
||||||
<Compile Include="Web\EssentialsWebApiPropertiesConfig.cs" />
|
|
||||||
<Compile Include="Web\RequestHandlers\ReportVersionsRequestHandler.cs" />
|
|
||||||
<Compile Include="Device Info\DeviceInfo.cs" />
|
<Compile Include="Device Info\DeviceInfo.cs" />
|
||||||
<Compile Include="Device Info\DeviceInfoEventArgs.cs" />
|
<Compile Include="Device Info\DeviceInfoEventArgs.cs" />
|
||||||
<Compile Include="Device Info\IDeviceInfoProvider.cs" />
|
<Compile Include="Device Info\IDeviceInfoProvider.cs" />
|
||||||
@@ -235,7 +203,6 @@
|
|||||||
<Compile Include="Devices\IReconfigurableDevice.cs" />
|
<Compile Include="Devices\IReconfigurableDevice.cs" />
|
||||||
<Compile Include="Devices\PC\InRoomPc.cs" />
|
<Compile Include="Devices\PC\InRoomPc.cs" />
|
||||||
<Compile Include="Devices\PC\Laptop.cs" />
|
<Compile Include="Devices\PC\Laptop.cs" />
|
||||||
<Compile Include="Devices\PduInterfaces.cs" />
|
|
||||||
<Compile Include="Devices\ReconfigurableDevice.cs" />
|
<Compile Include="Devices\ReconfigurableDevice.cs" />
|
||||||
<Compile Include="Devices\VolumeDeviceChangeEventArgs.cs" />
|
<Compile Include="Devices\VolumeDeviceChangeEventArgs.cs" />
|
||||||
<Compile Include="DeviceTypeInterfaces\IPasswordPrompt.cs" />
|
<Compile Include="DeviceTypeInterfaces\IPasswordPrompt.cs" />
|
||||||
@@ -248,7 +215,6 @@
|
|||||||
<Compile Include="DeviceTypeInterfaces\IHasPhoneDialing.cs" />
|
<Compile Include="DeviceTypeInterfaces\IHasPhoneDialing.cs" />
|
||||||
<Compile Include="DeviceTypeInterfaces\IMobileControl.cs" />
|
<Compile Include="DeviceTypeInterfaces\IMobileControl.cs" />
|
||||||
<Compile Include="Extensions\JsonExtensions.cs" />
|
<Compile Include="Extensions\JsonExtensions.cs" />
|
||||||
<Compile Include="Extensions\StringExtensions.cs" />
|
|
||||||
<Compile Include="Factory\DeviceFactory.cs" />
|
<Compile Include="Factory\DeviceFactory.cs" />
|
||||||
<Compile Include="Factory\IDeviceFactory.cs" />
|
<Compile Include="Factory\IDeviceFactory.cs" />
|
||||||
<Compile Include="Factory\ReadyEventArgs.cs" />
|
<Compile Include="Factory\ReadyEventArgs.cs" />
|
||||||
@@ -370,9 +336,7 @@
|
|||||||
<Compile Include="Feedbacks\BoolFeedbackPulseExtender.cs" />
|
<Compile Include="Feedbacks\BoolFeedbackPulseExtender.cs" />
|
||||||
<Compile Include="Routing\RoutingPortNames.cs" />
|
<Compile Include="Routing\RoutingPortNames.cs" />
|
||||||
<Compile Include="Routing\TieLineConfig.cs" />
|
<Compile Include="Routing\TieLineConfig.cs" />
|
||||||
<Compile Include="Secrets\CrestronGlobalSecretsProvider.cs" />
|
<Compile Include="Secrets\CrestronSecretsProvider.cs" />
|
||||||
<Compile Include="Secrets\CrestronLocalSecretsProvider.cs" />
|
|
||||||
<Compile Include="Secrets\CrestronSecret.cs" />
|
|
||||||
<Compile Include="Secrets\Interfaces.cs" />
|
<Compile Include="Secrets\Interfaces.cs" />
|
||||||
<Compile Include="Secrets\SecretsManager.cs" />
|
<Compile Include="Secrets\SecretsManager.cs" />
|
||||||
<Compile Include="Secrets\SecretsPropertiesConfig.cs" />
|
<Compile Include="Secrets\SecretsPropertiesConfig.cs" />
|
||||||
@@ -397,7 +361,6 @@
|
|||||||
<Compile Include="UI PageManagers\SinglePageManager.cs" />
|
<Compile Include="UI PageManagers\SinglePageManager.cs" />
|
||||||
<Compile Include="UI PageManagers\PageManager.cs" />
|
<Compile Include="UI PageManagers\PageManager.cs" />
|
||||||
<Compile Include="UI PageManagers\SetTopBoxTwoPanelPageManager.cs" />
|
<Compile Include="UI PageManagers\SetTopBoxTwoPanelPageManager.cs" />
|
||||||
<Compile Include="UI\TouchpanelBase.cs" />
|
|
||||||
<Compile Include="Utilities\ActionSequence.cs" />
|
<Compile Include="Utilities\ActionSequence.cs" />
|
||||||
<Compile Include="VideoStatus\VideoStatusOutputs.cs" />
|
<Compile Include="VideoStatus\VideoStatusOutputs.cs" />
|
||||||
<Compile Include="Crestron\CrestronGenericBaseDevice.cs" />
|
<Compile Include="Crestron\CrestronGenericBaseDevice.cs" />
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
|
||||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=Crestron_0020Web_0020Server/@EntryIndexedValue">True</s:Boolean>
|
|
||||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=Web/@EntryIndexedValue">False</s:Boolean></wpf:ResourceDictionary>
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
|
||||||
@@ -16,10 +15,5 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IPluginDevelopmentDeviceFactory : IPluginDeviceFactory
|
|
||||||
{
|
|
||||||
List<string> DevelopmentEssentialsFrameworkVersions { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -194,13 +194,13 @@ namespace PepperDash.Essentials
|
|||||||
/// <param name="command"></param>
|
/// <param name="command"></param>
|
||||||
public static void ReportAssemblyVersions(string command)
|
public static void ReportAssemblyVersions(string command)
|
||||||
{
|
{
|
||||||
|
Debug.Console(0, "Loaded Assemblies:");
|
||||||
CrestronConsole.ConsoleCommandResponse("Loaded Assemblies:" + CrestronEnvironment.NewLine);
|
|
||||||
foreach (var assembly in LoadedAssemblies)
|
foreach (var assembly in LoadedAssemblies)
|
||||||
{
|
{
|
||||||
CrestronConsole.ConsoleCommandResponse("{0} Version: {1}" + CrestronEnvironment.NewLine, assembly.Name, assembly.Version);
|
Debug.Console(0, "{0} Version: {1}", assembly.Name, assembly.Version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Moves any .dll assemblies not already loaded from the plugins folder to loadedPlugins folder
|
/// Moves any .dll assemblies not already loaded from the plugins folder to loadedPlugins folder
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -425,11 +425,7 @@ namespace PepperDash.Essentials
|
|||||||
/// <param name="loadedAssembly"></param>
|
/// <param name="loadedAssembly"></param>
|
||||||
static void LoadCustomPlugin(IPluginDeviceFactory plugin, LoadedAssembly loadedAssembly)
|
static void LoadCustomPlugin(IPluginDeviceFactory plugin, LoadedAssembly loadedAssembly)
|
||||||
{
|
{
|
||||||
var developmentPlugin = plugin as IPluginDevelopmentDeviceFactory;
|
var passed = Global.IsRunningMinimumVersionOrHigher(plugin.MinimumEssentialsFrameworkVersion);
|
||||||
|
|
||||||
var passed = developmentPlugin != null ? Global.IsRunningDevelopmentVersion
|
|
||||||
(developmentPlugin.DevelopmentEssentialsFrameworkVersions, developmentPlugin.MinimumEssentialsFrameworkVersion)
|
|
||||||
: Global.IsRunningMinimumVersionOrHigher(plugin.MinimumEssentialsFrameworkVersion);
|
|
||||||
|
|
||||||
if (!passed)
|
if (!passed)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.Reflection;
|
|
||||||
using Crestron.SimplSharpPro.CrestronThread;
|
using Crestron.SimplSharpPro.CrestronThread;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
@@ -188,20 +187,9 @@ namespace PepperDash.Essentials.Core.Queues
|
|||||||
if (_delayEnabled)
|
if (_delayEnabled)
|
||||||
Thread.Sleep(_delayTime);
|
Thread.Sleep(_delayTime);
|
||||||
}
|
}
|
||||||
catch (System.Threading.ThreadAbortException)
|
|
||||||
{
|
|
||||||
//swallowing this exception, as it should only happen on shut down
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Caught an exception in the Queue: {1}:{0}", ex.Message, ex);
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Caught an exception in the Queue {0}\r{1}\r{2}", ex.Message, ex.InnerException, ex.StackTrace);
|
||||||
Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Stack Trace: {0}", ex.StackTrace);
|
|
||||||
|
|
||||||
if (ex.InnerException != null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "---\r\n{0}", ex.InnerException.Message);
|
|
||||||
Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Stack Trace: {0}", ex.InnerException.StackTrace);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else _waitHandle.Wait();
|
else _waitHandle.Wait();
|
||||||
@@ -214,7 +202,7 @@ namespace PepperDash.Essentials.Core.Queues
|
|||||||
{
|
{
|
||||||
if (Disposed)
|
if (Disposed)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Queue has been disposed. Enqueuing messages not allowed while program is stopping.");
|
Debug.Console(1, this, "I've been disposed so you can't enqueue any messages. Are you trying to dispatch a message while the program is stopping?");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,14 +446,7 @@ namespace PepperDash_Essentials_Core.Queues
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Caught an exception in the Queue {0}", ex.Message);
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Caught an exception in the Queue {0}\r{1}\r{2}", ex.Message, ex.InnerException, ex.StackTrace);
|
||||||
Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Stack Trace: {0}", ex.StackTrace);
|
|
||||||
|
|
||||||
if (ex.InnerException != null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Caught an exception in the Queue {0}", ex.InnerException.Message);
|
|
||||||
Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Stack Trace: {0}", ex.InnerException.StackTrace);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else _waitHandle.Wait();
|
else _waitHandle.Wait();
|
||||||
|
|||||||
@@ -343,7 +343,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
void RoomIsOccupiedFeedback_OutputChange(object sender, EventArgs e)
|
void RoomIsOccupiedFeedback_OutputChange(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (RoomOccupancy.RoomIsOccupiedFeedback.BoolValue == false && AllowVacancyTimerToStart())
|
if (RoomOccupancy.RoomIsOccupiedFeedback.BoolValue == false)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Notice: Vacancy Detected");
|
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Notice: Vacancy Detected");
|
||||||
// Trigger the timer when the room is vacant
|
// Trigger the timer when the room is vacant
|
||||||
@@ -362,15 +362,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="o"></param>
|
/// <param name="o"></param>
|
||||||
public abstract void RoomVacatedForTimeoutPeriod(object o);
|
public abstract void RoomVacatedForTimeoutPeriod(object o);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Allow the vacancy event from an occupancy sensor to turn the room off.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>If the timer should be allowed. Defaults to true</returns>
|
|
||||||
protected virtual bool AllowVacancyTimerToStart()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,425 +1,344 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DM;
|
using Crestron.SimplSharpPro.DM;
|
||||||
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
public class RouteRequest
|
/// <summary>
|
||||||
{
|
/// Extensions added to any IRoutingInputs classes to provide discovery-based routing
|
||||||
public IRoutingSink Destination {get; set;}
|
/// on those destinations.
|
||||||
public IRoutingOutputs Source {get; set;}
|
/// </summary>
|
||||||
public eRoutingSignalType SignalType {get; set;}
|
public static class IRoutingInputsExtensions
|
||||||
|
{
|
||||||
public void HandleCooldown(object sender, FeedbackEventArgs args)
|
/// <summary>
|
||||||
{
|
/// Gets any existing RouteDescriptor for a destination, clears it using ReleaseRoute
|
||||||
var coolingDevice = sender as IWarmingCooling;
|
/// and then attempts a new Route and if sucessful, stores that RouteDescriptor
|
||||||
|
/// in RouteDescriptorCollection.DefaultCollection
|
||||||
if(args.BoolValue == false)
|
/// </summary>
|
||||||
{
|
public static void ReleaseAndMakeRoute(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
|
||||||
Destination.ReleaseAndMakeRoute(Source, SignalType);
|
{
|
||||||
|
destination.ReleaseRoute();
|
||||||
if(sender == null) return;
|
|
||||||
|
if (source == null) return;
|
||||||
coolingDevice.IsCoolingDownFeedback.OutputChange -= HandleCooldown;
|
var newRoute = destination.GetRouteToSource(source, signalType);
|
||||||
}
|
if (newRoute == null) return;
|
||||||
}
|
RouteDescriptorCollection.DefaultCollection.AddRouteDescriptor(newRoute);
|
||||||
}
|
Debug.Console(2, destination, "Executing full route");
|
||||||
|
newRoute.ExecuteRoutes();
|
||||||
/// <summary>
|
}
|
||||||
/// Extensions added to any IRoutingInputs classes to provide discovery-based routing
|
|
||||||
/// on those destinations.
|
/// <summary>
|
||||||
/// </summary>
|
/// Will release the existing route on the destination, if it is found in
|
||||||
public static class IRoutingInputsExtensions
|
/// RouteDescriptorCollection.DefaultCollection
|
||||||
{
|
/// </summary>
|
||||||
private static Dictionary<string, RouteRequest> RouteRequests = new Dictionary<string, RouteRequest>();
|
/// <param name="destination"></param>
|
||||||
/// <summary>
|
public static void ReleaseRoute(this IRoutingSink destination)
|
||||||
/// Gets any existing RouteDescriptor for a destination, clears it using ReleaseRoute
|
{
|
||||||
/// and then attempts a new Route and if sucessful, stores that RouteDescriptor
|
var current = RouteDescriptorCollection.DefaultCollection.RemoveRouteDescriptor(destination);
|
||||||
/// in RouteDescriptorCollection.DefaultCollection
|
if (current != null)
|
||||||
/// </summary>
|
{
|
||||||
public static void ReleaseAndMakeRoute(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
|
Debug.Console(1, destination, "Releasing current route: {0}", current.Source.Key);
|
||||||
{
|
current.ReleaseRoutes();
|
||||||
var routeRequest = new RouteRequest {
|
}
|
||||||
Destination = destination,
|
}
|
||||||
Source = source,
|
|
||||||
SignalType = signalType
|
/// <summary>
|
||||||
};
|
/// Builds a RouteDescriptor that contains the steps necessary to make a route between devices.
|
||||||
|
/// Routes of type AudioVideo will be built as two separate routes, audio and video. If
|
||||||
var coolingDevice = destination as IWarmingCooling;
|
/// a route is discovered, a new RouteDescriptor is returned. If one or both parts
|
||||||
|
/// of an audio/video route are discovered a route descriptor is returned. If no route is
|
||||||
RouteRequest existingRouteRequest;
|
/// discovered, then null is returned
|
||||||
|
/// </summary>
|
||||||
//We already have a route request for this device, and it's a cooling device and is cooling
|
public static RouteDescriptor GetRouteToSource(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
|
||||||
if (RouteRequests.TryGetValue(destination.Key, out existingRouteRequest) && coolingDevice != null && coolingDevice.IsCoolingDownFeedback.BoolValue == true)
|
{
|
||||||
{
|
var routeDescr = new RouteDescriptor(source, destination, signalType);
|
||||||
coolingDevice.IsCoolingDownFeedback.OutputChange -= existingRouteRequest.HandleCooldown;
|
// if it's a single signal type, find the route
|
||||||
|
if ((signalType & (eRoutingSignalType.Audio & eRoutingSignalType.Video)) == (eRoutingSignalType.Audio & eRoutingSignalType.Video))
|
||||||
coolingDevice.IsCoolingDownFeedback.OutputChange += routeRequest.HandleCooldown;
|
{
|
||||||
|
Debug.Console(1, destination, "Attempting to build source route from {0}", source.Key);
|
||||||
RouteRequests[destination.Key] = routeRequest;
|
if (!destination.GetRouteToSource(source, null, null, signalType, 0, routeDescr))
|
||||||
|
routeDescr = null;
|
||||||
Debug.Console(2, "******************************************************** Device: {0} is cooling down and already has a routing request stored. Storing new route request to route to source key: {1}", destination.Key, routeRequest.Source.Key);
|
}
|
||||||
|
// otherwise, audioVideo needs to be handled as two steps.
|
||||||
return;
|
else
|
||||||
}
|
{
|
||||||
|
Debug.Console(1, destination, "Attempting to build audio and video routes from {0}", source.Key);
|
||||||
//New Request
|
var audioSuccess = destination.GetRouteToSource(source, null, null, eRoutingSignalType.Audio, 0, routeDescr);
|
||||||
if (coolingDevice != null && coolingDevice.IsCoolingDownFeedback.BoolValue == true)
|
if (!audioSuccess)
|
||||||
{
|
Debug.Console(1, destination, "Cannot find audio route to {0}", source.Key);
|
||||||
coolingDevice.IsCoolingDownFeedback.OutputChange -= routeRequest.HandleCooldown;
|
var videoSuccess = destination.GetRouteToSource(source, null, null, eRoutingSignalType.Video, 0, routeDescr);
|
||||||
|
if (!videoSuccess)
|
||||||
coolingDevice.IsCoolingDownFeedback.OutputChange += routeRequest.HandleCooldown;
|
Debug.Console(1, destination, "Cannot find video route to {0}", source.Key);
|
||||||
|
if (!audioSuccess && !videoSuccess)
|
||||||
RouteRequests.Add(destination.Key, routeRequest);
|
routeDescr = null;
|
||||||
|
}
|
||||||
Debug.Console(2, "******************************************************** Device: {0} is cooling down. Storing route request to route to source key: {1}", destination.Key, routeRequest.Source.Key);
|
|
||||||
return;
|
//Debug.Console(1, destination, "Route{0} discovered", routeDescr == null ? " NOT" : "");
|
||||||
}
|
return routeDescr;
|
||||||
|
}
|
||||||
if (RouteRequests.ContainsKey(destination.Key) && coolingDevice != null && coolingDevice.IsCoolingDownFeedback.BoolValue == false)
|
|
||||||
{
|
/// <summary>
|
||||||
RouteRequests.Remove(destination.Key);
|
/// The recursive part of this. Will stop on each device, search its inputs for the
|
||||||
Debug.Console(2, "******************************************************** Device: {0} is NOT cooling down. Removing stored route request and routing to source key: {1}", destination.Key, routeRequest.Source.Key);
|
/// desired source and if not found, invoke this function for the each input port
|
||||||
}
|
/// hoping to find the source.
|
||||||
|
/// </summary>
|
||||||
destination.ReleaseRoute();
|
/// <param name="destination"></param>
|
||||||
|
/// <param name="source"></param>
|
||||||
RunRouteRequest(routeRequest);
|
/// <param name="outputPortToUse">The RoutingOutputPort whose link is being checked for a route</param>
|
||||||
}
|
/// <param name="alreadyCheckedDevices">Prevents Devices from being twice-checked</param>
|
||||||
|
/// <param name="signalType">This recursive function should not be called with AudioVideo</param>
|
||||||
public static void RunRouteRequest(RouteRequest request)
|
/// <param name="cycle">Just an informational counter</param>
|
||||||
{
|
/// <param name="routeTable">The RouteDescriptor being populated as the route is discovered</param>
|
||||||
if (request.Source == null) return;
|
/// <returns>true if source is hit</returns>
|
||||||
var newRoute = request.Destination.GetRouteToSource(request.Source, request.SignalType);
|
static bool GetRouteToSource(this IRoutingInputs destination, IRoutingOutputs source,
|
||||||
if (newRoute == null) return;
|
RoutingOutputPort outputPortToUse, List<IRoutingInputsOutputs> alreadyCheckedDevices,
|
||||||
RouteDescriptorCollection.DefaultCollection.AddRouteDescriptor(newRoute);
|
eRoutingSignalType signalType, int cycle, RouteDescriptor routeTable)
|
||||||
Debug.Console(2, request.Destination, "Executing full route");
|
{
|
||||||
newRoute.ExecuteRoutes();
|
cycle++;
|
||||||
}
|
Debug.Console(2, "GetRouteToSource: {0} {1}--> {2}", cycle, source.Key, destination.Key);
|
||||||
|
|
||||||
/// <summary>
|
RoutingInputPort goodInputPort = null;
|
||||||
/// Will release the existing route on the destination, if it is found in
|
var destDevInputTies = TieLineCollection.Default.Where(t =>
|
||||||
/// RouteDescriptorCollection.DefaultCollection
|
t.DestinationPort.ParentDevice == destination && (t.Type == signalType || (t.Type & (eRoutingSignalType.Audio | eRoutingSignalType.Video)) == (eRoutingSignalType.Audio | eRoutingSignalType.Video)));
|
||||||
/// </summary>
|
|
||||||
/// <param name="destination"></param>
|
// find a direct tie
|
||||||
public static void ReleaseRoute(this IRoutingSink destination)
|
var directTie = destDevInputTies.FirstOrDefault(
|
||||||
{
|
t => t.DestinationPort.ParentDevice == destination
|
||||||
RouteRequest existingRequest;
|
&& t.SourcePort.ParentDevice == source);
|
||||||
|
if (directTie != null) // Found a tie directly to the source
|
||||||
if (RouteRequests.TryGetValue(destination.Key, out existingRequest) && destination is IWarmingCooling)
|
{
|
||||||
{
|
goodInputPort = directTie.DestinationPort;
|
||||||
var coolingDevice = destination as IWarmingCooling;
|
}
|
||||||
|
else // no direct-connect. Walk back devices.
|
||||||
coolingDevice.IsCoolingDownFeedback.OutputChange -= existingRequest.HandleCooldown;
|
{
|
||||||
}
|
Debug.Console(2, destination, "is not directly connected to {0}. Walking down tie lines", source.Key);
|
||||||
|
|
||||||
RouteRequests.Remove(destination.Key);
|
// No direct tie? Run back out on the inputs' attached devices...
|
||||||
|
// Only the ones that are routing devices
|
||||||
var current = RouteDescriptorCollection.DefaultCollection.RemoveRouteDescriptor(destination);
|
var attachedMidpoints = destDevInputTies.Where(t => t.SourcePort.ParentDevice is IRoutingInputsOutputs);
|
||||||
if (current != null)
|
|
||||||
{
|
//Create a list for tracking already checked devices to avoid loops, if it doesn't already exist from previous iteration
|
||||||
Debug.Console(1, destination, "Releasing current route: {0}", current.Source.Key);
|
if (alreadyCheckedDevices == null)
|
||||||
current.ReleaseRoutes();
|
alreadyCheckedDevices = new List<IRoutingInputsOutputs>();
|
||||||
}
|
alreadyCheckedDevices.Add(destination as IRoutingInputsOutputs);
|
||||||
}
|
|
||||||
|
foreach (var inputTieToTry in attachedMidpoints)
|
||||||
/// <summary>
|
{
|
||||||
/// Builds a RouteDescriptor that contains the steps necessary to make a route between devices.
|
var upstreamDeviceOutputPort = inputTieToTry.SourcePort;
|
||||||
/// Routes of type AudioVideo will be built as two separate routes, audio and video. If
|
var upstreamRoutingDevice = upstreamDeviceOutputPort.ParentDevice as IRoutingInputsOutputs;
|
||||||
/// a route is discovered, a new RouteDescriptor is returned. If one or both parts
|
Debug.Console(2, destination, "Trying to find route on {0}", upstreamRoutingDevice.Key);
|
||||||
/// of an audio/video route are discovered a route descriptor is returned. If no route is
|
|
||||||
/// discovered, then null is returned
|
// Check if this previous device has already been walked
|
||||||
/// </summary>
|
if (alreadyCheckedDevices.Contains(upstreamRoutingDevice))
|
||||||
public static RouteDescriptor GetRouteToSource(this IRoutingSink destination, IRoutingOutputs source, eRoutingSignalType signalType)
|
{
|
||||||
{
|
Debug.Console(2, destination, "Skipping input {0} on {1}, this was already checked", upstreamRoutingDevice.Key, destination.Key);
|
||||||
var routeDescr = new RouteDescriptor(source, destination, signalType);
|
continue;
|
||||||
// if it's a single signal type, find the route
|
}
|
||||||
if ((signalType & (eRoutingSignalType.Audio & eRoutingSignalType.Video)) == (eRoutingSignalType.Audio & eRoutingSignalType.Video))
|
// haven't seen this device yet. Do it. Pass the output port to the next
|
||||||
{
|
// level to enable switching on success
|
||||||
Debug.Console(1, destination, "Attempting to build source route from {0}", source.Key);
|
var upstreamRoutingSuccess = upstreamRoutingDevice.GetRouteToSource(source, upstreamDeviceOutputPort,
|
||||||
if (!destination.GetRouteToSource(source, null, null, signalType, 0, routeDescr))
|
alreadyCheckedDevices, signalType, cycle, routeTable);
|
||||||
routeDescr = null;
|
if (upstreamRoutingSuccess)
|
||||||
}
|
{
|
||||||
// otherwise, audioVideo needs to be handled as two steps.
|
Debug.Console(2, destination, "Upstream device route found");
|
||||||
else
|
goodInputPort = inputTieToTry.DestinationPort;
|
||||||
{
|
break; // Stop looping the inputs in this cycle
|
||||||
Debug.Console(1, destination, "Attempting to build audio and video routes from {0}", source.Key);
|
}
|
||||||
var audioSuccess = destination.GetRouteToSource(source, null, null, eRoutingSignalType.Audio, 0, routeDescr);
|
}
|
||||||
if (!audioSuccess)
|
}
|
||||||
Debug.Console(1, destination, "Cannot find audio route to {0}", source.Key);
|
|
||||||
var videoSuccess = destination.GetRouteToSource(source, null, null, eRoutingSignalType.Video, 0, routeDescr);
|
// we have a route on corresponding inputPort. *** Do the route ***
|
||||||
if (!videoSuccess)
|
if (goodInputPort != null)
|
||||||
Debug.Console(1, destination, "Cannot find video route to {0}", source.Key);
|
{
|
||||||
if (!audioSuccess && !videoSuccess)
|
//Debug.Console(2, destination, "adding RouteDescriptor");
|
||||||
routeDescr = null;
|
if (outputPortToUse == null)
|
||||||
}
|
{
|
||||||
|
// it's a sink device
|
||||||
//Debug.Console(1, destination, "Route{0} discovered", routeDescr == null ? " NOT" : "");
|
routeTable.Routes.Add(new RouteSwitchDescriptor(goodInputPort));
|
||||||
return routeDescr;
|
}
|
||||||
}
|
else if (destination is IRouting)
|
||||||
|
{
|
||||||
/// <summary>
|
routeTable.Routes.Add(new RouteSwitchDescriptor (outputPortToUse, goodInputPort));
|
||||||
/// The recursive part of this. Will stop on each device, search its inputs for the
|
}
|
||||||
/// desired source and if not found, invoke this function for the each input port
|
else // device is merely IRoutingInputOutputs
|
||||||
/// hoping to find the source.
|
Debug.Console(2, destination, " No routing. Passthrough device");
|
||||||
/// </summary>
|
//Debug.Console(2, destination, "Exiting cycle {0}", cycle);
|
||||||
/// <param name="destination"></param>
|
return true;
|
||||||
/// <param name="source"></param>
|
}
|
||||||
/// <param name="outputPortToUse">The RoutingOutputPort whose link is being checked for a route</param>
|
|
||||||
/// <param name="alreadyCheckedDevices">Prevents Devices from being twice-checked</param>
|
Debug.Console(2, destination, "No route found to {0}", source.Key);
|
||||||
/// <param name="signalType">This recursive function should not be called with AudioVideo</param>
|
return false;
|
||||||
/// <param name="cycle">Just an informational counter</param>
|
}
|
||||||
/// <param name="routeTable">The RouteDescriptor being populated as the route is discovered</param>
|
}
|
||||||
/// <returns>true if source is hit</returns>
|
|
||||||
static bool GetRouteToSource(this IRoutingInputs destination, IRoutingOutputs source,
|
|
||||||
RoutingOutputPort outputPortToUse, List<IRoutingInputsOutputs> alreadyCheckedDevices,
|
|
||||||
eRoutingSignalType signalType, int cycle, RouteDescriptor routeTable)
|
|
||||||
{
|
|
||||||
cycle++;
|
// MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE
|
||||||
Debug.Console(2, "GetRouteToSource: {0} {1}--> {2}", cycle, source.Key, destination.Key);
|
|
||||||
|
|
||||||
RoutingInputPort goodInputPort = null;
|
/// <summary>
|
||||||
var destDevInputTies = TieLineCollection.Default.Where(t =>
|
/// A collection of RouteDescriptors - typically the static DefaultCollection is used
|
||||||
t.DestinationPort.ParentDevice == destination && (t.Type == signalType || (t.Type & (eRoutingSignalType.Audio | eRoutingSignalType.Video)) == (eRoutingSignalType.Audio | eRoutingSignalType.Video)));
|
/// </summary>
|
||||||
|
public class RouteDescriptorCollection
|
||||||
// find a direct tie
|
{
|
||||||
var directTie = destDevInputTies.FirstOrDefault(
|
public static RouteDescriptorCollection DefaultCollection
|
||||||
t => t.DestinationPort.ParentDevice == destination
|
{
|
||||||
&& t.SourcePort.ParentDevice == source);
|
get
|
||||||
if (directTie != null) // Found a tie directly to the source
|
{
|
||||||
{
|
if (_DefaultCollection == null)
|
||||||
goodInputPort = directTie.DestinationPort;
|
_DefaultCollection = new RouteDescriptorCollection();
|
||||||
}
|
return _DefaultCollection;
|
||||||
else // no direct-connect. Walk back devices.
|
}
|
||||||
{
|
}
|
||||||
Debug.Console(2, destination, "is not directly connected to {0}. Walking down tie lines", source.Key);
|
static RouteDescriptorCollection _DefaultCollection;
|
||||||
|
|
||||||
// No direct tie? Run back out on the inputs' attached devices...
|
List<RouteDescriptor> RouteDescriptors = new List<RouteDescriptor>();
|
||||||
// Only the ones that are routing devices
|
|
||||||
var attachedMidpoints = destDevInputTies.Where(t => t.SourcePort.ParentDevice is IRoutingInputsOutputs);
|
/// <summary>
|
||||||
|
/// Adds a RouteDescriptor to the list. If an existing RouteDescriptor for the
|
||||||
//Create a list for tracking already checked devices to avoid loops, if it doesn't already exist from previous iteration
|
/// destination exists already, it will not be added - in order to preserve
|
||||||
if (alreadyCheckedDevices == null)
|
/// proper route releasing.
|
||||||
alreadyCheckedDevices = new List<IRoutingInputsOutputs>();
|
/// </summary>
|
||||||
alreadyCheckedDevices.Add(destination as IRoutingInputsOutputs);
|
/// <param name="descriptor"></param>
|
||||||
|
public void AddRouteDescriptor(RouteDescriptor descriptor)
|
||||||
foreach (var inputTieToTry in attachedMidpoints)
|
{
|
||||||
{
|
if (RouteDescriptors.Any(t => t.Destination == descriptor.Destination))
|
||||||
var upstreamDeviceOutputPort = inputTieToTry.SourcePort;
|
{
|
||||||
var upstreamRoutingDevice = upstreamDeviceOutputPort.ParentDevice as IRoutingInputsOutputs;
|
Debug.Console(1, descriptor.Destination,
|
||||||
Debug.Console(2, destination, "Trying to find route on {0}", upstreamRoutingDevice.Key);
|
"Route to [{0}] already exists in global routes table", descriptor.Source.Key);
|
||||||
|
return;
|
||||||
// Check if this previous device has already been walked
|
}
|
||||||
if (alreadyCheckedDevices.Contains(upstreamRoutingDevice))
|
RouteDescriptors.Add(descriptor);
|
||||||
{
|
}
|
||||||
Debug.Console(2, destination, "Skipping input {0} on {1}, this was already checked", upstreamRoutingDevice.Key, destination.Key);
|
|
||||||
continue;
|
/// <summary>
|
||||||
}
|
/// Gets the RouteDescriptor for a destination
|
||||||
// haven't seen this device yet. Do it. Pass the output port to the next
|
/// </summary>
|
||||||
// level to enable switching on success
|
/// <returns>null if no RouteDescriptor for a destination exists</returns>
|
||||||
var upstreamRoutingSuccess = upstreamRoutingDevice.GetRouteToSource(source, upstreamDeviceOutputPort,
|
public RouteDescriptor GetRouteDescriptorForDestination(IRoutingInputs destination)
|
||||||
alreadyCheckedDevices, signalType, cycle, routeTable);
|
{
|
||||||
if (upstreamRoutingSuccess)
|
return RouteDescriptors.FirstOrDefault(rd => rd.Destination == destination);
|
||||||
{
|
}
|
||||||
Debug.Console(2, destination, "Upstream device route found");
|
|
||||||
goodInputPort = inputTieToTry.DestinationPort;
|
/// <summary>
|
||||||
break; // Stop looping the inputs in this cycle
|
/// Returns the RouteDescriptor for a given destination AND removes it from collection.
|
||||||
}
|
/// Returns null if no route with the provided destination exists.
|
||||||
}
|
/// </summary>
|
||||||
}
|
public RouteDescriptor RemoveRouteDescriptor(IRoutingInputs destination)
|
||||||
|
{
|
||||||
// we have a route on corresponding inputPort. *** Do the route ***
|
var descr = GetRouteDescriptorForDestination(destination);
|
||||||
if (goodInputPort != null)
|
if (descr != null)
|
||||||
{
|
RouteDescriptors.Remove(descr);
|
||||||
//Debug.Console(2, destination, "adding RouteDescriptor");
|
return descr;
|
||||||
if (outputPortToUse == null)
|
}
|
||||||
{
|
}
|
||||||
// it's a sink device
|
|
||||||
routeTable.Routes.Add(new RouteSwitchDescriptor(goodInputPort));
|
/// <summary>
|
||||||
}
|
/// Represents an collection of individual route steps between Source and Destination
|
||||||
else if (destination is IRouting)
|
/// </summary>
|
||||||
{
|
public class RouteDescriptor
|
||||||
routeTable.Routes.Add(new RouteSwitchDescriptor (outputPortToUse, goodInputPort));
|
{
|
||||||
}
|
public IRoutingInputs Destination { get; private set; }
|
||||||
else // device is merely IRoutingInputOutputs
|
public IRoutingOutputs Source { get; private set; }
|
||||||
Debug.Console(2, destination, " No routing. Passthrough device");
|
public eRoutingSignalType SignalType { get; private set; }
|
||||||
//Debug.Console(2, destination, "Exiting cycle {0}", cycle);
|
public List<RouteSwitchDescriptor> Routes { get; private set; }
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
public RouteDescriptor(IRoutingOutputs source, IRoutingInputs destination, eRoutingSignalType signalType)
|
||||||
Debug.Console(2, destination, "No route found to {0}", source.Key);
|
{
|
||||||
return false;
|
Destination = destination;
|
||||||
}
|
Source = source;
|
||||||
}
|
SignalType = signalType;
|
||||||
|
Routes = new List<RouteSwitchDescriptor>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Executes all routes described in this collection. Typically called via
|
||||||
// MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE MOVE
|
/// extension method IRoutingInputs.ReleaseAndMakeRoute()
|
||||||
|
/// </summary>
|
||||||
|
public void ExecuteRoutes()
|
||||||
/// <summary>
|
{
|
||||||
/// A collection of RouteDescriptors - typically the static DefaultCollection is used
|
foreach (var route in Routes)
|
||||||
/// </summary>
|
{
|
||||||
public class RouteDescriptorCollection
|
Debug.Console(2, "ExecuteRoutes: {0}", route.ToString());
|
||||||
{
|
if (route.SwitchingDevice is IRoutingSink)
|
||||||
public static RouteDescriptorCollection DefaultCollection
|
{
|
||||||
{
|
var device = route.SwitchingDevice as IRoutingSinkWithSwitching;
|
||||||
get
|
if (device == null)
|
||||||
{
|
continue;
|
||||||
if (_DefaultCollection == null)
|
|
||||||
_DefaultCollection = new RouteDescriptorCollection();
|
device.ExecuteSwitch(route.InputPort.Selector);
|
||||||
return _DefaultCollection;
|
}
|
||||||
}
|
else if (route.SwitchingDevice is IRouting)
|
||||||
}
|
{
|
||||||
static RouteDescriptorCollection _DefaultCollection;
|
(route.SwitchingDevice as IRouting).ExecuteSwitch(route.InputPort.Selector, route.OutputPort.Selector, SignalType);
|
||||||
|
route.OutputPort.InUseTracker.AddUser(Destination, "destination-" + SignalType);
|
||||||
List<RouteDescriptor> RouteDescriptors = new List<RouteDescriptor>();
|
Debug.Console(2, "Output port {0} routing. Count={1}", route.OutputPort.Key, route.OutputPort.InUseTracker.InUseCountFeedback.UShortValue);
|
||||||
|
}
|
||||||
/// <summary>
|
}
|
||||||
/// Adds a RouteDescriptor to the list. If an existing RouteDescriptor for the
|
}
|
||||||
/// destination exists already, it will not be added - in order to preserve
|
|
||||||
/// proper route releasing.
|
/// <summary>
|
||||||
/// </summary>
|
/// Releases all routes in this collection. Typically called via
|
||||||
/// <param name="descriptor"></param>
|
/// extension method IRoutingInputs.ReleaseAndMakeRoute()
|
||||||
public void AddRouteDescriptor(RouteDescriptor descriptor)
|
/// </summary>
|
||||||
{
|
public void ReleaseRoutes()
|
||||||
if (RouteDescriptors.Any(t => t.Destination == descriptor.Destination))
|
{
|
||||||
{
|
foreach (var route in Routes)
|
||||||
Debug.Console(1, descriptor.Destination,
|
{
|
||||||
"Route to [{0}] already exists in global routes table", descriptor.Source.Key);
|
if (route.SwitchingDevice is IRouting)
|
||||||
return;
|
{
|
||||||
}
|
// Pull the route from the port. Whatever is watching the output's in use tracker is
|
||||||
RouteDescriptors.Add(descriptor);
|
// responsible for responding appropriately.
|
||||||
}
|
route.OutputPort.InUseTracker.RemoveUser(Destination, "destination-" + SignalType);
|
||||||
|
Debug.Console(2, "Port {0} releasing. Count={1}", route.OutputPort.Key, route.OutputPort.InUseTracker.InUseCountFeedback.UShortValue);
|
||||||
/// <summary>
|
}
|
||||||
/// Gets the RouteDescriptor for a destination
|
}
|
||||||
/// </summary>
|
}
|
||||||
/// <returns>null if no RouteDescriptor for a destination exists</returns>
|
|
||||||
public RouteDescriptor GetRouteDescriptorForDestination(IRoutingInputs destination)
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return RouteDescriptors.FirstOrDefault(rd => rd.Destination == destination);
|
var routesText = Routes.Select(r => r.ToString()).ToArray();
|
||||||
}
|
return string.Format("Route table from {0} to {1}:\r{2}", Source.Key, Destination.Key, string.Join("\r", routesText));
|
||||||
|
}
|
||||||
/// <summary>
|
}
|
||||||
/// Returns the RouteDescriptor for a given destination AND removes it from collection.
|
|
||||||
/// Returns null if no route with the provided destination exists.
|
/// <summary>
|
||||||
/// </summary>
|
/// Represents an individual link for a route
|
||||||
public RouteDescriptor RemoveRouteDescriptor(IRoutingInputs destination)
|
/// </summary>
|
||||||
{
|
public class RouteSwitchDescriptor
|
||||||
var descr = GetRouteDescriptorForDestination(destination);
|
{
|
||||||
if (descr != null)
|
public IRoutingInputs SwitchingDevice { get { return InputPort.ParentDevice; } }
|
||||||
RouteDescriptors.Remove(descr);
|
public RoutingOutputPort OutputPort { get; set; }
|
||||||
return descr;
|
public RoutingInputPort InputPort { get; set; }
|
||||||
}
|
|
||||||
}
|
public RouteSwitchDescriptor(RoutingInputPort inputPort)
|
||||||
|
{
|
||||||
/// <summary>
|
InputPort = inputPort;
|
||||||
/// Represents an collection of individual route steps between Source and Destination
|
}
|
||||||
/// </summary>
|
|
||||||
public class RouteDescriptor
|
public RouteSwitchDescriptor(RoutingOutputPort outputPort, RoutingInputPort inputPort)
|
||||||
{
|
{
|
||||||
public IRoutingInputs Destination { get; private set; }
|
InputPort = inputPort;
|
||||||
public IRoutingOutputs Source { get; private set; }
|
OutputPort = outputPort;
|
||||||
public eRoutingSignalType SignalType { get; private set; }
|
}
|
||||||
public List<RouteSwitchDescriptor> Routes { get; private set; }
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
public RouteDescriptor(IRoutingOutputs source, IRoutingInputs destination, eRoutingSignalType signalType)
|
if(SwitchingDevice is IRouting)
|
||||||
{
|
return string.Format("{0} switches output '{1}' to input '{2}'", SwitchingDevice.Key, OutputPort.Selector, InputPort.Selector);
|
||||||
Destination = destination;
|
else
|
||||||
Source = source;
|
return string.Format("{0} switches to input '{1}'", SwitchingDevice.Key, InputPort.Selector);
|
||||||
SignalType = signalType;
|
|
||||||
Routes = new List<RouteSwitchDescriptor>();
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Executes all routes described in this collection. Typically called via
|
|
||||||
/// extension method IRoutingInputs.ReleaseAndMakeRoute()
|
|
||||||
/// </summary>
|
|
||||||
public void ExecuteRoutes()
|
|
||||||
{
|
|
||||||
foreach (var route in Routes)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "ExecuteRoutes: {0}", route.ToString());
|
|
||||||
if (route.SwitchingDevice is IRoutingSink)
|
|
||||||
{
|
|
||||||
var device = route.SwitchingDevice as IRoutingSinkWithSwitching;
|
|
||||||
if (device == null)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
device.ExecuteSwitch(route.InputPort.Selector);
|
|
||||||
}
|
|
||||||
else if (route.SwitchingDevice is IRouting)
|
|
||||||
{
|
|
||||||
(route.SwitchingDevice as IRouting).ExecuteSwitch(route.InputPort.Selector, route.OutputPort.Selector, SignalType);
|
|
||||||
route.OutputPort.InUseTracker.AddUser(Destination, "destination-" + SignalType);
|
|
||||||
Debug.Console(2, "Output port {0} routing. Count={1}", route.OutputPort.Key, route.OutputPort.InUseTracker.InUseCountFeedback.UShortValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Releases all routes in this collection. Typically called via
|
|
||||||
/// extension method IRoutingInputs.ReleaseAndMakeRoute()
|
|
||||||
/// </summary>
|
|
||||||
public void ReleaseRoutes()
|
|
||||||
{
|
|
||||||
foreach (var route in Routes)
|
|
||||||
{
|
|
||||||
if (route.SwitchingDevice is IRouting)
|
|
||||||
{
|
|
||||||
// Pull the route from the port. Whatever is watching the output's in use tracker is
|
|
||||||
// responsible for responding appropriately.
|
|
||||||
route.OutputPort.InUseTracker.RemoveUser(Destination, "destination-" + SignalType);
|
|
||||||
Debug.Console(2, "Port {0} releasing. Count={1}", route.OutputPort.Key, route.OutputPort.InUseTracker.InUseCountFeedback.UShortValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
var routesText = Routes.Select(r => r.ToString()).ToArray();
|
|
||||||
return string.Format("Route table from {0} to {1}:\r{2}", Source.Key, Destination.Key, string.Join("\r", routesText));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Represents an individual link for a route
|
|
||||||
/// </summary>
|
|
||||||
public class RouteSwitchDescriptor
|
|
||||||
{
|
|
||||||
public IRoutingInputs SwitchingDevice { get { return InputPort.ParentDevice; } }
|
|
||||||
public RoutingOutputPort OutputPort { get; set; }
|
|
||||||
public RoutingInputPort InputPort { get; set; }
|
|
||||||
|
|
||||||
public RouteSwitchDescriptor(RoutingInputPort inputPort)
|
|
||||||
{
|
|
||||||
InputPort = inputPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RouteSwitchDescriptor(RoutingOutputPort outputPort, RoutingInputPort inputPort)
|
|
||||||
{
|
|
||||||
InputPort = inputPort;
|
|
||||||
OutputPort = outputPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
if(SwitchingDevice is IRouting)
|
|
||||||
return string.Format("{0} switches output '{1}' to input '{2}'", SwitchingDevice.Key, OutputPort.Selector, InputPort.Selector);
|
|
||||||
else
|
|
||||||
return string.Format("{0} switches to input '{1}'", SwitchingDevice.Key, InputPort.Selector);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
Type = type;
|
Type = type;
|
||||||
ConnectionType = connType;
|
ConnectionType = connType;
|
||||||
Selector = selector;
|
Selector = selector;
|
||||||
IsInternal = isInternal;
|
IsInternal = IsInternal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,102 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharp.CrestronDataStore;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
|
||||||
{
|
|
||||||
public class CrestronGlobalSecretsProvider : ISecretProvider
|
|
||||||
{
|
|
||||||
public string Key { get; set; }
|
|
||||||
//Added for reference
|
|
||||||
public string Description { get; private set; }
|
|
||||||
|
|
||||||
public CrestronGlobalSecretsProvider(string key)
|
|
||||||
{
|
|
||||||
Key = key;
|
|
||||||
Description = String.Format("Default secret provider serving all local applications");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static CrestronGlobalSecretsProvider()
|
|
||||||
{
|
|
||||||
//Added for future encrypted reference
|
|
||||||
var secureSupported = CrestronSecureStorage.Supported;
|
|
||||||
|
|
||||||
CrestronDataStoreStatic.InitCrestronDataStore();
|
|
||||||
if (secureSupported)
|
|
||||||
{
|
|
||||||
//doThingsFuture
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Set secret for item in the CrestronSecretsProvider
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">Secret Key</param>
|
|
||||||
/// <param name="value">Secret Value</param>
|
|
||||||
public bool SetSecret(string key, object value)
|
|
||||||
{
|
|
||||||
var secret = value as string;
|
|
||||||
CrestronDataStore.CDS_ERROR returnCode;
|
|
||||||
|
|
||||||
if (String.IsNullOrEmpty(secret))
|
|
||||||
{
|
|
||||||
returnCode = CrestronDataStoreStatic.clearGlobal(key);
|
|
||||||
if (returnCode == CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Successfully removed secret \"{0}\"", secret);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
returnCode = CrestronDataStoreStatic.SetGlobalStringValue(key, secret);
|
|
||||||
if (returnCode == CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Successfully set secret \"{0}\"", secret);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to set secret for {0}:{1} - {2}", Key, key, returnCode.ToString());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Retrieve secret for item in the CrestronSecretsProvider
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">Secret Key</param>
|
|
||||||
/// <returns>ISecret Object containing key, provider, and value</returns>
|
|
||||||
public ISecret GetSecret(string key)
|
|
||||||
{
|
|
||||||
string mySecret;
|
|
||||||
var getErrorCode = CrestronDataStoreStatic.GetGlobalStringValue(key, out mySecret);
|
|
||||||
|
|
||||||
switch (getErrorCode)
|
|
||||||
{
|
|
||||||
case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
|
|
||||||
Debug.Console(2, this, "Secret Successfully retrieved for {0}:{1}", Key, key);
|
|
||||||
return new CrestronSecret(key, mySecret, this);
|
|
||||||
default:
|
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to retrieve secret for {0}:{1} - {2}",
|
|
||||||
Key, key, getErrorCode.ToString());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Determine if a secret is present within the provider without retrieving it
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">Secret Key</param>
|
|
||||||
/// <returns>bool if present</returns>
|
|
||||||
public bool TestSecret(string key)
|
|
||||||
{
|
|
||||||
string mySecret;
|
|
||||||
return CrestronDataStoreStatic.GetGlobalStringValue(key, out mySecret) == CrestronDataStore.CDS_ERROR.CDS_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Special container class for CrestronSecret provider
|
|
||||||
/// </summary>
|
|
||||||
public class CrestronSecret : ISecret
|
|
||||||
{
|
|
||||||
public ISecretProvider Provider { get; private set; }
|
|
||||||
public string Key { get; private set; }
|
|
||||||
|
|
||||||
public object Value { get; private set; }
|
|
||||||
|
|
||||||
public CrestronSecret(string key, string value, ISecretProvider provider)
|
|
||||||
{
|
|
||||||
Key = key;
|
|
||||||
Value = value;
|
|
||||||
Provider = provider;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,103 +1,97 @@
|
|||||||
using System;
|
using System;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.CrestronDataStore;
|
using Crestron.SimplSharp.CrestronDataStore;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
namespace PepperDash.Essentials.Core
|
{
|
||||||
{
|
public class CrestronSecretsProvider : ISecretProvider
|
||||||
public class CrestronLocalSecretsProvider : ISecretProvider
|
{
|
||||||
{
|
public string Key { get; set; }
|
||||||
public string Key { get; set; }
|
//Added for reference
|
||||||
//Added for reference
|
private static readonly bool SecureSupported;
|
||||||
public string Description { get; private set; }
|
public CrestronSecretsProvider(string key)
|
||||||
|
{
|
||||||
|
Key = key;
|
||||||
public CrestronLocalSecretsProvider(string key)
|
}
|
||||||
{
|
|
||||||
Key = key;
|
static CrestronSecretsProvider()
|
||||||
Description = String.Format("Default secret provider serving Essentials Application {0}", InitialParametersClass.ApplicationNumber);
|
{
|
||||||
}
|
//Added for future encrypted reference
|
||||||
|
SecureSupported = CrestronSecureStorage.Supported;
|
||||||
static CrestronLocalSecretsProvider()
|
|
||||||
{
|
CrestronDataStoreStatic.InitCrestronDataStore();
|
||||||
//Added for future encrypted reference
|
if (SecureSupported)
|
||||||
var secureSupported = CrestronSecureStorage.Supported;
|
{
|
||||||
|
//doThingsFuture
|
||||||
CrestronDataStoreStatic.InitCrestronDataStore();
|
}
|
||||||
if (secureSupported)
|
}
|
||||||
{
|
|
||||||
//doThingsFuture
|
/// <summary>
|
||||||
}
|
/// Set secret for item in the CrestronSecretsProvider
|
||||||
}
|
/// </summary>
|
||||||
|
/// <param name="key">Secret Key</param>
|
||||||
/// <summary>
|
/// <param name="value">Secret Value</param>
|
||||||
/// Set secret for item in the CrestronSecretsProvider
|
public bool SetSecret(string key, object value)
|
||||||
/// </summary>
|
{
|
||||||
/// <param name="key">Secret Key</param>
|
var secret = value as string;
|
||||||
/// <param name="value">Secret Value</param>
|
if (String.IsNullOrEmpty(secret))
|
||||||
public bool SetSecret(string key, object value)
|
{
|
||||||
{
|
Debug.Console(2, this, "Unable to set secret for {0}:{1} - value is empty.", Key, key);
|
||||||
var secret = value as string;
|
return false;
|
||||||
CrestronDataStore.CDS_ERROR returnCode;
|
}
|
||||||
|
var setErrorCode = CrestronDataStoreStatic.SetLocalStringValue(key, secret);
|
||||||
if (String.IsNullOrEmpty(secret))
|
switch (setErrorCode)
|
||||||
{
|
{
|
||||||
returnCode = CrestronDataStoreStatic.clearLocal(key);
|
case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
|
||||||
if (returnCode == CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
|
Debug.Console(1, this,"Secret Successfully Set for {0}:{1}", Key, key);
|
||||||
{
|
return true;
|
||||||
Debug.Console(0, this, "Successfully removed secret \"{0}\"", secret);
|
default:
|
||||||
return true;
|
Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Unable to set secret for {0}:{1} - {2}", Key, key, setErrorCode.ToString());
|
||||||
}
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
|
||||||
{
|
/// <summary>
|
||||||
returnCode = CrestronDataStoreStatic.SetLocalStringValue(key, secret);
|
/// Retrieve secret for item in the CrestronSecretsProvider
|
||||||
if (returnCode == CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
|
/// </summary>
|
||||||
{
|
/// <param name="key">Secret Key</param>
|
||||||
Debug.Console(0, this, "Successfully set secret \"{0}\"", secret);
|
/// <returns>ISecret Object containing key, provider, and value</returns>
|
||||||
return true;
|
public ISecret GetSecret(string key)
|
||||||
}
|
{
|
||||||
}
|
string mySecret;
|
||||||
|
var getErrorCode = CrestronDataStoreStatic.GetLocalStringValue(key, out mySecret);
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to set secret for {0}:{1} - {2}", Key, key, returnCode.ToString());
|
|
||||||
return false;
|
switch (getErrorCode)
|
||||||
}
|
{
|
||||||
|
case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
|
||||||
/// <summary>
|
Debug.Console(2, this, "Secret Successfully retrieved for {0}:{1}", Key, key);
|
||||||
/// Retrieve secret for item in the CrestronSecretsProvider
|
return new CrestronSecret(key, mySecret, this);
|
||||||
/// </summary>
|
default:
|
||||||
/// <param name="key">Secret Key</param>
|
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to retrieve secret for {0}:{1} - {2}",
|
||||||
/// <returns>ISecret Object containing key, provider, and value</returns>
|
Key, key, getErrorCode.ToString());
|
||||||
public ISecret GetSecret(string key)
|
return null;
|
||||||
{
|
}
|
||||||
string mySecret;
|
}
|
||||||
var getErrorCode = CrestronDataStoreStatic.GetLocalStringValue(key, out mySecret);
|
}
|
||||||
|
|
||||||
switch (getErrorCode)
|
/// <summary>
|
||||||
{
|
/// Special container class for CrestronSecret provider
|
||||||
case CrestronDataStore.CDS_ERROR.CDS_SUCCESS:
|
/// </summary>
|
||||||
Debug.Console(2, this, "Secret Successfully retrieved for {0}:{1}", Key, key);
|
public class CrestronSecret : ISecret
|
||||||
return new CrestronSecret(key, mySecret, this);
|
{
|
||||||
default:
|
public ISecretProvider Provider { get; private set; }
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Unable to retrieve secret for {0}:{1} - {2}",
|
public string Key { get; private set; }
|
||||||
Key, key, getErrorCode.ToString());
|
|
||||||
return null;
|
public object Value { get; private set; }
|
||||||
}
|
|
||||||
}
|
public CrestronSecret(string key, string value, ISecretProvider provider)
|
||||||
|
{
|
||||||
/// <summary>
|
Key = key;
|
||||||
/// Determine if a secret is present within the provider without retrieving it
|
Value = value;
|
||||||
/// </summary>
|
Provider = provider;
|
||||||
/// <param name="key">Secret Key</param>
|
}
|
||||||
/// <returns>bool if present</returns>
|
|
||||||
public bool TestSecret(string key)
|
}
|
||||||
{
|
|
||||||
string mySecret;
|
|
||||||
return CrestronDataStoreStatic.GetLocalStringValue(key, out mySecret) == CrestronDataStore.CDS_ERROR.CDS_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -7,32 +7,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface ISecretProvider : IKeyed
|
public interface ISecretProvider : IKeyed
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Set secret value for provider by key
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">key of secret to set</param>
|
|
||||||
/// <param name="value">value to set secret to</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
bool SetSecret(string key, object value);
|
bool SetSecret(string key, object value);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Return object containing secret from provider
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">key of secret to retrieve</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
ISecret GetSecret(string key);
|
ISecret GetSecret(string key);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Verifies presence of secret
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">key of secret to chek</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
bool TestSecret(string key);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Description of the secrets provider
|
|
||||||
/// </summary>
|
|
||||||
string Description { get; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -40,19 +17,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface ISecret
|
public interface ISecret
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Instance of ISecretProvider that the secret belongs to
|
|
||||||
/// </summary>
|
|
||||||
ISecretProvider Provider { get; }
|
ISecretProvider Provider { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Key of the secret in the provider
|
|
||||||
/// </summary>
|
|
||||||
string Key { get; }
|
string Key { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Value of the secret
|
|
||||||
/// </summary>
|
|
||||||
object Value { get; }
|
object Value { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
public static class SecretsManager
|
public static class SecretsManager
|
||||||
@@ -16,28 +16,18 @@ namespace PepperDash.Essentials.Core
|
|||||||
public static void Initialize()
|
public static void Initialize()
|
||||||
{
|
{
|
||||||
|
|
||||||
AddSecretProvider("default", new CrestronLocalSecretsProvider("default"));
|
AddSecretProvider("default", new CrestronSecretsProvider("default"));
|
||||||
|
|
||||||
AddSecretProvider("CrestronGlobalSecrets", new CrestronGlobalSecretsProvider("CrestronGlobalSecrets"));
|
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(SetSecretProcess, "setsecret",
|
CrestronConsole.AddNewConsoleCommand(SetSecretProcess, "setsecret",
|
||||||
"Adds secret to secrets provider",
|
"Adds secrets to secret provider",
|
||||||
ConsoleAccessLevelEnum.AccessOperator);
|
ConsoleAccessLevelEnum.AccessOperator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(UpdateSecretProcess, "updatesecret",
|
CrestronConsole.AddNewConsoleCommand(UpdateSecretProcess, "updatesecret",
|
||||||
"Updates secret in secrets provider",
|
"Updates secrets in secret provider",
|
||||||
ConsoleAccessLevelEnum.AccessAdministrator);
|
ConsoleAccessLevelEnum.AccessAdministrator);
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(DeleteSecretProcess, "deletesecret",
|
CrestronConsole.AddNewConsoleCommand(DeleteSecretProcess, "deletesecret",
|
||||||
"Deletes secret from secrest provider",
|
"Deletes secrets in secret provider",
|
||||||
ConsoleAccessLevelEnum.AccessAdministrator);
|
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(ListProviders, "secretproviderlist",
|
|
||||||
"Return list of all valid secrets providers",
|
|
||||||
ConsoleAccessLevelEnum.AccessAdministrator);
|
|
||||||
|
|
||||||
CrestronConsole.AddNewConsoleCommand(GetProviderInfo, "secretproviderinfo",
|
|
||||||
"Return data about secrets provider",
|
|
||||||
ConsoleAccessLevelEnum.AccessAdministrator);
|
ConsoleAccessLevelEnum.AccessAdministrator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -64,79 +54,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
return secret;
|
return secret;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void GetProviderInfo(string cmd)
|
|
||||||
{
|
|
||||||
string response;
|
|
||||||
var args = cmd.Split(' ');
|
|
||||||
|
|
||||||
if (cmd.Length == 0 || (args.Length == 1 && args[0] == "?"))
|
|
||||||
{
|
|
||||||
response = "Returns data about secrets provider. Format 'secretproviderinfo <provider>'";
|
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.Length == 1)
|
|
||||||
{
|
|
||||||
var provider = GetSecretProviderByKey(args[0]);
|
|
||||||
|
|
||||||
if (provider == null)
|
|
||||||
{
|
|
||||||
response = "Invalid secrets provider key";
|
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
response = String.Format("{0} : {1}", provider.Key, provider.Description);
|
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
response = "Improper number of arguments";
|
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Console Command that returns all valid secrets in the essentials program.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="cmd"></param>
|
|
||||||
public static void ListProviders(string cmd)
|
|
||||||
{
|
|
||||||
var response = String.Empty;
|
|
||||||
var args = cmd.Split(' ');
|
|
||||||
|
|
||||||
if (cmd.Length == 0)
|
|
||||||
{
|
|
||||||
if (Secrets != null && Secrets.Count > 0)
|
|
||||||
{
|
|
||||||
response = Secrets.Aggregate(response,
|
|
||||||
(current, secretProvider) => current + (secretProvider.Key + "\n\r"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
response = "No Secrets Providers Available";
|
|
||||||
}
|
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
|
||||||
return;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.Length == 1 && args[0] == "?")
|
|
||||||
{
|
|
||||||
response = "Reports all valid and preset Secret providers";
|
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
response = "Improper number of arguments";
|
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add secret provider to secrets dictionary
|
/// Add secret provider to secrets dictionary
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -148,7 +65,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
Secrets.Add(key, provider);
|
Secrets.Add(key, provider);
|
||||||
Debug.Console(1, "Secrets provider '{0}' added to SecretsManager", key);
|
Debug.Console(1, "Secrets provider '{0}' added to SecretsManager", key);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Unable to add Provider '{0}' to Secrets. Provider with that key already exists", key );
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Unable to add Provider '{0}' to Secrets. Provider with that key already exists", key );
|
||||||
}
|
}
|
||||||
@@ -165,13 +81,13 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
Secrets.Add(key, provider);
|
Secrets.Add(key, provider);
|
||||||
Debug.Console(1, "Secrets provider '{0}' added to SecretsManager", key);
|
Debug.Console(1, "Secrets provider '{0}' added to SecretsManager", key);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if (overwrite)
|
if (overwrite)
|
||||||
{
|
{
|
||||||
Secrets.Add(key, provider);
|
Secrets.Add(key, provider);
|
||||||
Debug.Console(1, Debug.ErrorLogLevel.Notice, "Provider with the key '{0}' already exists in secrets. Overwriting with new secrets provider.", key);
|
Debug.Console(1, Debug.ErrorLogLevel.Notice, "Provider with the key '{0}' already exists in secrets. Overwriting with new secrets provider.", key);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Unable to add Provider '{0}' to Secrets. Provider with that key already exists", key);
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Unable to add Provider '{0}' to Secrets. Provider with that key already exists", key);
|
||||||
}
|
}
|
||||||
@@ -184,14 +100,14 @@ namespace PepperDash.Essentials.Core
|
|||||||
if (args.Length == 0)
|
if (args.Length == 0)
|
||||||
{
|
{
|
||||||
//some Instructional Text
|
//some Instructional Text
|
||||||
response = "Adds secrets to secret provider. Format 'setsecret <provider> <secretKey> <secret>'";
|
response = "Adds secrets to secret provider. Format 'setsecret <provider> <secretKey> <secret>";
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.Length == 1 && args[0] == "?")
|
if (args.Length == 1 && args[0] == "?")
|
||||||
{
|
{
|
||||||
response = "Adds secrets to secret provider. Format 'setsecret <provider> <secretKey> <secret>'";
|
response = "Adds secrets to secret provider. Format 'setsecret <provider> <secretKey> <secret>";
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -218,7 +134,23 @@ namespace PepperDash.Essentials.Core
|
|||||||
var key = args[1];
|
var key = args[1];
|
||||||
var secret = args[2];
|
var secret = args[2];
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse(SetSecret(provider, key, secret));
|
if (provider.GetSecret(key) == null)
|
||||||
|
{
|
||||||
|
|
||||||
|
response = provider.SetSecret(key, secret)
|
||||||
|
? String.Format(
|
||||||
|
"Secret successfully set for {0}:{1}",
|
||||||
|
provider.Key, key)
|
||||||
|
: String.Format(
|
||||||
|
"Unable to set secret for {0}:{1}",
|
||||||
|
provider.Key, key);
|
||||||
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
response =
|
||||||
|
String.Format(
|
||||||
|
"Unable to set secret for {0}:{1} - Please use the 'UpdateSecret' command to modify it");
|
||||||
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void UpdateSecretProcess(string cmd)
|
private static void UpdateSecretProcess(string cmd)
|
||||||
@@ -229,7 +161,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
if (args.Length == 0)
|
if (args.Length == 0)
|
||||||
{
|
{
|
||||||
//some Instructional Text
|
//some Instructional Text
|
||||||
response = "Updates secrets in secret provider. Format 'updatesecret <provider> <secretKey> <secret>'";
|
response = "Updates secrets in secret provider. Format 'updatesecret <provider> <secretKey> <secret>";
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -237,7 +169,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
if (args.Length == 1 && args[0] == "?")
|
if (args.Length == 1 && args[0] == "?")
|
||||||
{
|
{
|
||||||
response = "Updates secrets in secret provider. Format 'updatesecret <provider> <secretKey> <secret>'";
|
response = "Updates secrets in secret provider. Format 'updatesecret <provider> <secretKey> <secret>";
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -266,49 +198,23 @@ namespace PepperDash.Essentials.Core
|
|||||||
var key = args[1];
|
var key = args[1];
|
||||||
var secret = args[2];
|
var secret = args[2];
|
||||||
|
|
||||||
CrestronConsole.ConsoleCommandResponse(UpdateSecret(provider, key, secret));
|
if (provider.GetSecret(key) != null)
|
||||||
|
{
|
||||||
}
|
response = provider.SetSecret(key, secret)
|
||||||
|
? String.Format(
|
||||||
private static string UpdateSecret(ISecretProvider provider, string key, string secret)
|
"Secret successfully set for {0}:{1}",
|
||||||
{
|
provider.Key, key)
|
||||||
var secretPresent = provider.TestSecret(key);
|
: String.Format(
|
||||||
|
"Unable to set secret for {0}:{1}",
|
||||||
Debug.Console(2, provider, "SecretsProvider {0} {1} contain a secret entry for {2}", provider.Key, secretPresent ? "does" : "does not", key);
|
provider.Key, key);
|
||||||
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
if (!secretPresent)
|
return;
|
||||||
return
|
}
|
||||||
String.Format(
|
|
||||||
"Unable to update secret for {0}:{1} - Please use the 'SetSecret' command to modify it");
|
|
||||||
var response = provider.SetSecret(key, secret)
|
|
||||||
? String.Format(
|
|
||||||
"Secret successfully set for {0}:{1}",
|
|
||||||
provider.Key, key)
|
|
||||||
: String.Format(
|
|
||||||
"Unable to set secret for {0}:{1}",
|
|
||||||
provider.Key, key);
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string SetSecret(ISecretProvider provider, string key, string secret)
|
|
||||||
{
|
|
||||||
var secretPresent = provider.TestSecret(key);
|
|
||||||
|
|
||||||
Debug.Console(2, provider, "SecretsProvider {0} {1} contain a secret entry for {2}", provider.Key, secretPresent ? "does" : "does not", key);
|
|
||||||
|
|
||||||
if (secretPresent)
|
|
||||||
return
|
|
||||||
String.Format(
|
|
||||||
"Unable to set secret for {0}:{1} - Please use the 'UpdateSecret' command to modify it");
|
|
||||||
var response = provider.SetSecret(key, secret)
|
|
||||||
? String.Format(
|
|
||||||
"Secret successfully set for {0}:{1}",
|
|
||||||
provider.Key, key)
|
|
||||||
: String.Format(
|
|
||||||
"Unable to set secret for {0}:{1}",
|
|
||||||
provider.Key, key);
|
|
||||||
return response;
|
|
||||||
|
|
||||||
|
response =
|
||||||
|
String.Format(
|
||||||
|
"Unable to update secret for {0}:{1} - Please use the 'SetSecret' command to create a new secret");
|
||||||
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void DeleteSecretProcess(string cmd)
|
private static void DeleteSecretProcess(string cmd)
|
||||||
@@ -319,14 +225,14 @@ namespace PepperDash.Essentials.Core
|
|||||||
if (args.Length == 0)
|
if (args.Length == 0)
|
||||||
{
|
{
|
||||||
//some Instructional Text
|
//some Instructional Text
|
||||||
response = "Deletes secrets in secret provider. Format 'deletesecret <provider> <secretKey>'";
|
response = "Deletes secrets in secret provider. Format 'deletesecret <provider> <secretKey>";
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
if (args.Length == 1 && args[0] == "?")
|
if (args.Length == 1 && args[0] == "?")
|
||||||
{
|
{
|
||||||
response = "Deletes secrets in secret provider. Format 'deletesecret <provider> <secretKey>'";
|
response = "Deletes secrets in secret provider. Format 'deletesecret <provider> <secretKey>";
|
||||||
CrestronConsole.ConsoleCommandResponse(response);
|
CrestronConsole.ConsoleCommandResponse(response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requirements for a device that implements basic Open/Close shade control
|
/// Requirements for a device that implements basic Open/Close shade control
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Obsolete("Please use IShadesOpenCloseStop instead")]
|
|
||||||
public interface IShadesOpenClose
|
public interface IShadesOpenClose
|
||||||
{
|
{
|
||||||
void Open();
|
void Open();
|
||||||
@@ -29,26 +28,15 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requirements for a device that implements basic Open/Close/Stop shade control (Uses 3 relays)
|
/// Requirements for a device that implements basic Open/Close/Stop shade control (Uses 3 relays)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShadesOpenCloseStop
|
public interface IShadesOpenCloseStop : IShadesOpenClose
|
||||||
{
|
{
|
||||||
void Open();
|
void StopOrPreset();
|
||||||
void Close();
|
string StopOrPresetButtonLabel { get; }
|
||||||
void Stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IShadesOpenClosePreset : IShadesOpenCloseStop
|
|
||||||
{
|
|
||||||
void RecallPreset(uint presetNumber);
|
|
||||||
void SavePreset(uint presetNumber);
|
|
||||||
string StopOrPresetButtonLabel { get; }
|
|
||||||
|
|
||||||
event EventHandler PresetSaved;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requirements for a shade that implements press/hold raise/lower functions
|
/// Requirements for a shade that implements press/hold raise/lower functions
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Obsolete("Please use IShadesOpenCloseStop instead")]
|
|
||||||
public interface IShadesRaiseLower
|
public interface IShadesRaiseLower
|
||||||
{
|
{
|
||||||
void Raise(bool state);
|
void Raise(bool state);
|
||||||
@@ -67,7 +55,7 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Requirements for a shade/scene that is open or closed
|
/// Requirements for a shade/scene that is open or closed
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShadesOpenClosedFeedback: IShadesOpenCloseStop
|
public interface IShadesOpenClosedFeedback: IShadesOpenClose
|
||||||
{
|
{
|
||||||
BoolFeedback ShadeIsOpenFeedback { get; }
|
BoolFeedback ShadeIsOpenFeedback { get; }
|
||||||
BoolFeedback ShadeIsClosedFeedback { get; }
|
BoolFeedback ShadeIsClosedFeedback { get; }
|
||||||
@@ -75,16 +63,15 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Obsolete("Please use IShadesOpenCloseStop instead")]
|
public interface IShadesStop
|
||||||
public interface IShadesStop
|
|
||||||
{
|
{
|
||||||
void Stop();
|
void Stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Used to implement raise/stop/lower/stop from single button
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShadesStopOrMove
|
public interface IShadesStopOrMove
|
||||||
{
|
{
|
||||||
void OpenOrStop();
|
void OpenOrStop();
|
||||||
@@ -95,7 +82,7 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Basic feedback for shades/scene stopped
|
/// Basic feedback for shades/scene stopped
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShadesStopFeedback : IShadesOpenCloseStop
|
public interface IShadesStopFeedback
|
||||||
{
|
{
|
||||||
BoolFeedback IsStoppedFeedback { get; }
|
BoolFeedback IsStoppedFeedback { get; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Base class for a shade device
|
/// Base class for a shade device
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class ShadeBase : EssentialsDevice, IShadesOpenCloseStop
|
public abstract class ShadeBase : EssentialsDevice, IShadesOpenClose
|
||||||
{
|
{
|
||||||
public ShadeBase(string key, string name)
|
public ShadeBase(string key, string name)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
@@ -23,7 +23,7 @@ namespace PepperDash.Essentials.Core.Shades
|
|||||||
#region iShadesOpenClose Members
|
#region iShadesOpenClose Members
|
||||||
|
|
||||||
public abstract void Open();
|
public abstract void Open();
|
||||||
public abstract void Stop();
|
public abstract void StopOrPreset();
|
||||||
public abstract void Close();
|
public abstract void Close();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
public UShortOutputSig GetUShortOutputSig(uint index, uint sigNum)
|
public UShortOutputSig GetUShortOutputSig(uint index, uint sigNum)
|
||||||
{
|
{
|
||||||
if (sigNum > UShortIncrement) return null;
|
if (sigNum > UShortIncrement) return null;
|
||||||
return SRL.UShortOutput.FirstOrDefault(s => s.Name.Equals(GetUShortOutputSigName(index, sigNum)));
|
return SRL.UShortOutput.FirstOrDefault(s => s.Name.Equals(GetBoolFeedbackSigName(index, sigNum)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -159,7 +159,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
public StringOutputSig GetStringOutputSig(uint index, uint sigNum)
|
public StringOutputSig GetStringOutputSig(uint index, uint sigNum)
|
||||||
{
|
{
|
||||||
if (sigNum > StringIncrement) return null;
|
if (sigNum > StringIncrement) return null;
|
||||||
return SRL.StringOutput.FirstOrDefault(s => s.Name.Equals(GetStringOutputSigName(index, sigNum)));
|
return SRL.StringOutput.FirstOrDefault(s => s.Name.Equals(GetBoolFeedbackSigName(index, sigNum)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -1,175 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using Crestron.SimplSharpPro.UI;
|
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.UI
|
|
||||||
{
|
|
||||||
public abstract class TouchpanelBase: EssentialsDevice, IHasBasicTriListWithSmartObject
|
|
||||||
{
|
|
||||||
protected CrestronTouchpanelPropertiesConfig _config;
|
|
||||||
public BasicTriListWithSmartObject Panel { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor for use with device Factory. A touch panel device will be created based on the provided IP-ID and the
|
|
||||||
/// type of the panel. The SGD File path can be specified using the config property, or a default one located in the program directory if none
|
|
||||||
/// is provided.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">Essentials Device Key</param>
|
|
||||||
/// <param name="name">Essentials Device Name</param>
|
|
||||||
/// <param name="type">Touchpanel Type to build</param>
|
|
||||||
/// <param name="config">Touchpanel Configuration</param>
|
|
||||||
/// <param name="id">IP-ID to use for touch panel</param>
|
|
||||||
protected TouchpanelBase(string key, string name, BasicTriListWithSmartObject panel, CrestronTouchpanelPropertiesConfig config)
|
|
||||||
:base(key, name)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (panel == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Panel is not valid. Touchpanel class WILL NOT work correctly");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Panel = panel;
|
|
||||||
|
|
||||||
Panel.SigChange += Panel_SigChange;
|
|
||||||
|
|
||||||
if (Panel is TswFt5ButtonSystem)
|
|
||||||
{
|
|
||||||
var tsw = Panel as TswFt5ButtonSystem;
|
|
||||||
tsw.ExtenderSystemReservedSigs.Use();
|
|
||||||
tsw.ExtenderSystemReservedSigs.DeviceExtenderSigChange
|
|
||||||
+= ExtenderSystemReservedSigs_DeviceExtenderSigChange;
|
|
||||||
|
|
||||||
tsw.ButtonStateChange += Tsw_ButtonStateChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
_config = config;
|
|
||||||
|
|
||||||
AddPreActivationAction(() => {
|
|
||||||
if (Panel.Register() != eDeviceRegistrationUnRegistrationResponse.Success)
|
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Registration failed. Continuing, but panel may not function: {0}", Panel.RegistrationFailureReason);
|
|
||||||
|
|
||||||
// Give up cleanly if SGD is not present.
|
|
||||||
var sgdName = Global.FilePathPrefix + "sgd" + Global.DirectorySeparator + _config.SgdFile;
|
|
||||||
if (!File.Exists(sgdName))
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Smart object file '{0}' not present in User folder. Looking for embedded file", sgdName);
|
|
||||||
|
|
||||||
sgdName = Global.ApplicationDirectoryPathPrefix + Global.DirectorySeparator + "SGD" + Global.DirectorySeparator + _config.SgdFile;
|
|
||||||
|
|
||||||
if (!File.Exists(sgdName))
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Unable to find SGD file '{0}' in User sgd or application SGD folder. Exiting touchpanel load.", sgdName);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Panel.LoadSmartObjects(sgdName);
|
|
||||||
});
|
|
||||||
|
|
||||||
AddPostActivationAction(() =>
|
|
||||||
{
|
|
||||||
// Check for IEssentialsRoomCombiner in DeviceManager and if found, subscribe to its event
|
|
||||||
var roomCombiner = DeviceManager.AllDevices.FirstOrDefault((d) => d is IEssentialsRoomCombiner) as IEssentialsRoomCombiner;
|
|
||||||
|
|
||||||
if (roomCombiner != null)
|
|
||||||
{
|
|
||||||
// Subscribe to the even
|
|
||||||
roomCombiner.RoomCombinationScenarioChanged += new EventHandler<EventArgs>(roomCombiner_RoomCombinationScenarioChanged);
|
|
||||||
|
|
||||||
// Connect to the initial roomKey
|
|
||||||
if (roomCombiner.CurrentScenario != null)
|
|
||||||
{
|
|
||||||
// Use the current scenario
|
|
||||||
DetermineRoomKeyFromScenario(roomCombiner.CurrentScenario);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Current Scenario not yet set. Use default
|
|
||||||
SetupPanelDrivers(_config.DefaultRoomKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// No room combiner, use the default key
|
|
||||||
SetupPanelDrivers(_config.DefaultRoomKey);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Setup Panel operation
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="roomKey">Room Key for this panel</param>
|
|
||||||
protected abstract void SetupPanelDrivers(string roomKey);
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Event handler for System Extender Events
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="currentDeviceExtender"></param>
|
|
||||||
/// <param name="args"></param>
|
|
||||||
protected abstract void ExtenderSystemReservedSigs_DeviceExtenderSigChange(DeviceExtender currentDeviceExtender, SigEventArgs args);
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
protected virtual void roomCombiner_RoomCombinationScenarioChanged(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
var roomCombiner = sender as IEssentialsRoomCombiner;
|
|
||||||
|
|
||||||
DetermineRoomKeyFromScenario(roomCombiner.CurrentScenario);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Determines the room key to use based on the scenario
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="scenario"></param>
|
|
||||||
protected virtual void DetermineRoomKeyFromScenario(IRoomCombinationScenario scenario)
|
|
||||||
{
|
|
||||||
string newRoomKey = null;
|
|
||||||
|
|
||||||
if (scenario.UiMap.ContainsKey(Key))
|
|
||||||
{
|
|
||||||
newRoomKey = scenario.UiMap[Key];
|
|
||||||
}
|
|
||||||
else if (scenario.UiMap.ContainsKey(_config.DefaultRoomKey))
|
|
||||||
{
|
|
||||||
newRoomKey = scenario.UiMap[_config.DefaultRoomKey];
|
|
||||||
}
|
|
||||||
|
|
||||||
SetupPanelDrivers(newRoomKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Panel_SigChange(object currentDevice, Crestron.SimplSharpPro.SigEventArgs args)
|
|
||||||
{
|
|
||||||
if (Debug.Level == 2)
|
|
||||||
Debug.Console(2, this, "Sig change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue);
|
|
||||||
var uo = args.Sig.UserObject;
|
|
||||||
if (uo is Action<bool>)
|
|
||||||
(uo as Action<bool>)(args.Sig.BoolValue);
|
|
||||||
else if (uo is Action<ushort>)
|
|
||||||
(uo as Action<ushort>)(args.Sig.UShortValue);
|
|
||||||
else if (uo is Action<string>)
|
|
||||||
(uo as Action<string>)(args.Sig.StringValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Tsw_ButtonStateChange(GenericBase device, ButtonEventArgs args)
|
|
||||||
{
|
|
||||||
var uo = args.Button.UserObject;
|
|
||||||
if(uo is Action<bool>)
|
|
||||||
(uo as Action<bool>)(args.Button.State == eButtonState.Pressed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,224 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Core.Web;
|
|
||||||
using PepperDash.Essentials.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web
|
|
||||||
{
|
|
||||||
public class EssemtialsWebApi : EssentialsDevice
|
|
||||||
{
|
|
||||||
private readonly WebApiServer _server;
|
|
||||||
|
|
||||||
///<example>
|
|
||||||
/// http(s)://{ipaddress}/cws/{basePath}
|
|
||||||
/// http(s)://{ipaddress}/VirtualControl/Rooms/{roomId}/cws/{basePath}
|
|
||||||
/// </example>
|
|
||||||
private readonly string _defaultBasePath = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance
|
|
||||||
? string.Format("/app{0:00}/api", InitialParametersClass.ApplicationNumber)
|
|
||||||
: "/api";
|
|
||||||
|
|
||||||
private const int DebugTrace = 0;
|
|
||||||
private const int DebugInfo = 1;
|
|
||||||
private const int DebugVerbose = 2;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// CWS base path
|
|
||||||
/// </summary>
|
|
||||||
public string BasePath { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Tracks if CWS is registered
|
|
||||||
/// </summary>
|
|
||||||
public bool IsRegistered
|
|
||||||
{
|
|
||||||
get { return _server.IsRegistered; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
public EssemtialsWebApi(string key, string name)
|
|
||||||
: this(key, name, null)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="config"></param>
|
|
||||||
public EssemtialsWebApi(string key, string name, EssentialsWebApiPropertiesConfig config)
|
|
||||||
: base(key, name)
|
|
||||||
{
|
|
||||||
Key = key;
|
|
||||||
|
|
||||||
if (config == null)
|
|
||||||
BasePath = _defaultBasePath;
|
|
||||||
else
|
|
||||||
BasePath = string.IsNullOrEmpty(config.BasePath) ? _defaultBasePath : config.BasePath;
|
|
||||||
|
|
||||||
_server = new WebApiServer(Key, Name, BasePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Custom activate, add routes
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public override bool CustomActivate()
|
|
||||||
{
|
|
||||||
var routes = new List<HttpCwsRoute>
|
|
||||||
{
|
|
||||||
new HttpCwsRoute("reportversions")
|
|
||||||
{
|
|
||||||
Name = "ReportVersions",
|
|
||||||
RouteHandler = new ReportVersionsRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("appdebug")
|
|
||||||
{
|
|
||||||
Name = "AppDebug",
|
|
||||||
RouteHandler = new AppDebugRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("devlist")
|
|
||||||
{
|
|
||||||
Name = "DevList",
|
|
||||||
RouteHandler = new DevListRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("devprops")
|
|
||||||
{
|
|
||||||
Name = "DevProps",
|
|
||||||
RouteHandler = new DevPropsRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("devjson")
|
|
||||||
{
|
|
||||||
Name = "DevJson",
|
|
||||||
RouteHandler = new DevJsonRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("setdevicestreamdebug")
|
|
||||||
{
|
|
||||||
Name = "SetDeviceStreamDebug",
|
|
||||||
RouteHandler = new SetDeviceStreamDebugRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("disableallstreamdebug")
|
|
||||||
{
|
|
||||||
Name = "DisableAllStreamDebug",
|
|
||||||
RouteHandler = new DisableAllStreamDebugRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("showconfig")
|
|
||||||
{
|
|
||||||
Name = "ShowConfig",
|
|
||||||
RouteHandler = new ShowConfigRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("gettypes")
|
|
||||||
{
|
|
||||||
Name = "GetTypes",
|
|
||||||
RouteHandler = new GetTypesRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("gettypes/{filter}")
|
|
||||||
{
|
|
||||||
Name = "GetTypesByFilter",
|
|
||||||
RouteHandler = new GetTypesByFilterRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("getjoinmap/{bridgeKey}")
|
|
||||||
{
|
|
||||||
Name = "GetJoinMapsForBridgeKey",
|
|
||||||
RouteHandler = new GetJoinMapForBridgeKeyRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("getjoinmap/{bridgeKey}/{deviceKey}")
|
|
||||||
{
|
|
||||||
Name = "GetJoinMapsForDeviceKey",
|
|
||||||
RouteHandler = new GetJoinMapForDeviceKeyRequestHandler()
|
|
||||||
},
|
|
||||||
new HttpCwsRoute("feedbacks/{deviceKey}")
|
|
||||||
{
|
|
||||||
Name = "GetFeedbacksForDeviceKey",
|
|
||||||
RouteHandler = new GetFeedbacksForDeviceRequestHandler()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
foreach (var route in routes.Where(route => route != null))
|
|
||||||
{
|
|
||||||
var r = route;
|
|
||||||
_server.AddRoute(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.CustomActivate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes the CWS class
|
|
||||||
/// </summary>
|
|
||||||
public override void Initialize()
|
|
||||||
{
|
|
||||||
// If running on an appliance
|
|
||||||
if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
WEBSERVER [ON | OFF | TIMEOUT <VALUE IN SECONDS> | MAXSESSIONSPERUSER <Number of sessions>]
|
|
||||||
*/
|
|
||||||
var response = string.Empty;
|
|
||||||
CrestronConsole.SendControlSystemCommand("webserver", ref response);
|
|
||||||
if (response.Contains("OFF")) return;
|
|
||||||
|
|
||||||
var is4Series = eCrestronSeries.Series4 == (Global.ProcessorSeries & eCrestronSeries.Series4);
|
|
||||||
Debug.Console(DebugTrace, Debug.ErrorLogLevel.Notice, "Starting Essentials Web API on {0} Appliance", is4Series ? "4-series" : "3-series");
|
|
||||||
|
|
||||||
_server.Start();
|
|
||||||
|
|
||||||
GetPaths();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Automatically start CWS when running on a server (Linux OS, Virtual Control)
|
|
||||||
Debug.Console(DebugTrace, Debug.ErrorLogLevel.Notice, "Starting Essentials Web API on Virtual Control Server");
|
|
||||||
|
|
||||||
_server.Start();
|
|
||||||
|
|
||||||
GetPaths();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Print the available pahts
|
|
||||||
/// </summary>
|
|
||||||
/// <example>
|
|
||||||
/// http(s)://{ipaddress}/cws/{basePath}
|
|
||||||
/// http(s)://{ipaddress}/VirtualControl/Rooms/{roomId}/cws/{basePath}
|
|
||||||
/// </example>
|
|
||||||
public void GetPaths()
|
|
||||||
{
|
|
||||||
Debug.Console(DebugTrace, this, "{0}", new String('-', 50));
|
|
||||||
|
|
||||||
var currentIp = CrestronEthernetHelper.GetEthernetParameter(
|
|
||||||
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0);
|
|
||||||
|
|
||||||
var hostname = CrestronEthernetHelper.GetEthernetParameter(
|
|
||||||
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_HOSTNAME, 0);
|
|
||||||
|
|
||||||
var path = CrestronEnvironment.DevicePlatform == eDevicePlatform.Server
|
|
||||||
? string.Format("http(s)://{0}/VirtualControl/Rooms/{1}/cws{2}", hostname, InitialParametersClass.RoomId, BasePath)
|
|
||||||
: string.Format("http(s)://{0}/cws{1}", currentIp, BasePath);
|
|
||||||
|
|
||||||
Debug.Console(DebugTrace, this, "Server:{0}", path);
|
|
||||||
|
|
||||||
var routeCollection = _server.GetRouteCollection();
|
|
||||||
if (routeCollection == null)
|
|
||||||
{
|
|
||||||
Debug.Console(DebugTrace, this, "Server route collection is null");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Debug.Console(DebugTrace, this, "Configured Routes:");
|
|
||||||
foreach (var route in routeCollection)
|
|
||||||
{
|
|
||||||
Debug.Console(DebugTrace, this, "{0}: {1}/{2}", route.Name, path, route.Url);
|
|
||||||
}
|
|
||||||
Debug.Console(DebugTrace, this, "{0}", new String('-', 50));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web
|
|
||||||
{
|
|
||||||
public class EssentialsWebApiFactory : EssentialsDeviceFactory<EssemtialsWebApi>
|
|
||||||
{
|
|
||||||
public EssentialsWebApiFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string> { "EssentialsWebApi" };
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory Attempting to create new Essentials Web API Server");
|
|
||||||
|
|
||||||
var props = dc.Properties.ToObject<EssentialsWebApiPropertiesConfig>();
|
|
||||||
if (props != null) return new EssemtialsWebApi(dc.Key, dc.Name, props);
|
|
||||||
|
|
||||||
Debug.Console(1, "Factory failed to create new Essentials Web API Server");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web
|
|
||||||
{
|
|
||||||
public class EssentialsWebApiHelpers
|
|
||||||
{
|
|
||||||
public static string GetRequestBody(HttpCwsRequest request)
|
|
||||||
{
|
|
||||||
var bytes = new Byte[request.ContentLength];
|
|
||||||
|
|
||||||
request.InputStream.Read(bytes, 0, request.ContentLength);
|
|
||||||
|
|
||||||
return Encoding.UTF8.GetString(bytes, 0, bytes.Length);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object MapToAssemblyObject(LoadedAssembly assembly)
|
|
||||||
{
|
|
||||||
return new
|
|
||||||
{
|
|
||||||
Name = assembly.Name,
|
|
||||||
Version = assembly.Version
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object MapToDeviceListObject(IKeyed device)
|
|
||||||
{
|
|
||||||
return new
|
|
||||||
{
|
|
||||||
Key = device.Key,
|
|
||||||
Name = (device is IKeyName)
|
|
||||||
? (device as IKeyName).Name
|
|
||||||
: "---"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object MapJoinToObject(string key, JoinMapBaseAdvanced join)
|
|
||||||
{
|
|
||||||
var kp = new KeyValuePair<string, JoinMapBaseAdvanced>(key, join);
|
|
||||||
|
|
||||||
return MapJoinToObject(kp);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object MapJoinToObject(KeyValuePair<string, JoinMapBaseAdvanced> join)
|
|
||||||
{
|
|
||||||
return new
|
|
||||||
{
|
|
||||||
DeviceKey = join.Key,
|
|
||||||
Joins = join.Value.Joins.Select(j => MapJoinDataCompleteToObject(j))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object MapJoinDataCompleteToObject(KeyValuePair<string, JoinDataComplete> joinData)
|
|
||||||
{
|
|
||||||
return new
|
|
||||||
{
|
|
||||||
Signal = joinData.Key,
|
|
||||||
Description = joinData.Value.Metadata.Description,
|
|
||||||
JoinNumber = joinData.Value.JoinNumber,
|
|
||||||
JoinSpan = joinData.Value.JoinSpan,
|
|
||||||
JoinType = joinData.Value.Metadata.JoinType.ToString(),
|
|
||||||
JoinCapabilities = joinData.Value.Metadata.JoinCapabilities.ToString()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object MapDeviceTypeToObject(string key, DeviceFactoryWrapper device)
|
|
||||||
{
|
|
||||||
var kp = new KeyValuePair<string, DeviceFactoryWrapper>(key, device);
|
|
||||||
|
|
||||||
return MapDeviceTypeToObject(kp);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static object MapDeviceTypeToObject(KeyValuePair<string, DeviceFactoryWrapper> device)
|
|
||||||
{
|
|
||||||
return new
|
|
||||||
{
|
|
||||||
Type = device.Key,
|
|
||||||
Description = device.Value.Description,
|
|
||||||
CType = device.Value.CType == null ? "---": device.Value.CType.ToString()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web
|
|
||||||
{
|
|
||||||
public class EssentialsWebApiPropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("basePath")]
|
|
||||||
public string BasePath { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class AppDebugRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public AppDebugRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
var appDebug = new AppDebug { Level = Debug.Level };
|
|
||||||
|
|
||||||
var body = JsonConvert.SerializeObject(appDebug, Formatting.Indented);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.Write(body, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles POST method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePost(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
if (context.Request.ContentLength < 0)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = EssentialsWebApiHelpers.GetRequestBody(context.Request);
|
|
||||||
if (string.IsNullOrEmpty(data))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var appDebug = new AppDebug();
|
|
||||||
var requestBody = JsonConvert.DeserializeAnonymousType(data, appDebug);
|
|
||||||
|
|
||||||
Debug.SetDebugLevel(requestBody.Level);
|
|
||||||
|
|
||||||
appDebug.Level = Debug.Level;
|
|
||||||
var responseBody = JsonConvert.SerializeObject(appDebug, Formatting.Indented);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.Write(responseBody, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class AppDebug
|
|
||||||
{
|
|
||||||
[JsonProperty("level", NullValueHandling = NullValueHandling.Ignore)]
|
|
||||||
public int Level { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class DefaultRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public DefaultRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles CONNECT method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 418;
|
|
||||||
context.Response.StatusDescription = "I'm a teapot";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles DELETE method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleDelete(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 418;
|
|
||||||
context.Response.StatusDescription = "I'm a teapot";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 418;
|
|
||||||
context.Response.StatusDescription = "I'm a teapot";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles HEAD method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleHead(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 418;
|
|
||||||
context.Response.StatusDescription = "I'm a teapot";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles OPTIONS method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleOptions(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 418;
|
|
||||||
context.Response.StatusDescription = "I'm a teapot";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles PATCH method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePatch(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 418;
|
|
||||||
context.Response.StatusDescription = "I'm a teapot";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles POST method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePost(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 418;
|
|
||||||
context.Response.StatusDescription = "I'm a teapot";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles PUT method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePut(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 418;
|
|
||||||
context.Response.StatusDescription = "I'm a teapot";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles TRACE method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleTrace(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 418;
|
|
||||||
context.Response.StatusDescription = "I'm a teapot";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class DevJsonRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public DevJsonRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles POST method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePost(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
if (context.Request.ContentLength < 0)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = EssentialsWebApiHelpers.GetRequestBody(context.Request);
|
|
||||||
if (string.IsNullOrEmpty(data))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
DeviceJsonApi.DoDeviceActionWithJson(data);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Exception Message: {0}", ex.Message);
|
|
||||||
Debug.Console(2, "Exception Stack Trace: {0}", ex.StackTrace);
|
|
||||||
if(ex.InnerException != null) Debug.Console(2, "Exception Inner: {0}", ex.InnerException);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class DevListRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public DevListRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
var allDevices = DeviceManager.AllDevices;
|
|
||||||
if (allDevices == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 404;
|
|
||||||
context.Response.StatusDescription = "Not Found";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
allDevices.Sort((a, b) => System.String.Compare(a.Key, b.Key, System.StringComparison.Ordinal));
|
|
||||||
|
|
||||||
var deviceList = allDevices.Select(d => EssentialsWebApiHelpers.MapToDeviceListObject(d)).ToList();
|
|
||||||
|
|
||||||
var js = JsonConvert.SerializeObject(deviceList, Formatting.Indented);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
|
||||||
context.Response.Write(js, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class DevPropsRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public DevPropsRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles POST method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePost(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
if (context.Request.ContentLength < 0)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = EssentialsWebApiHelpers.GetRequestBody(context.Request);
|
|
||||||
if (string.IsNullOrEmpty(data))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var o = new DeviceActionWrapper();
|
|
||||||
var body = JsonConvert.DeserializeAnonymousType(data, o);
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(body.DeviceKey))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var deviceProps = DeviceJsonApi.GetProperties(body.DeviceKey);
|
|
||||||
if (deviceProps == null || deviceProps.ToLower().Contains("no device"))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 404;
|
|
||||||
context.Response.StatusDescription = "Not Found";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.ContentEncoding = Encoding.UTF8;
|
|
||||||
context.Response.Write(deviceProps, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class DisableAllStreamDebugRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public DisableAllStreamDebugRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles POST method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePost(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
DeviceManager.DisableAllDeviceStreamDebugging();
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class GetFeedbacksForDeviceRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public GetFeedbacksForDeviceRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
var routeData = context.Request.RouteData;
|
|
||||||
if (routeData == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
object deviceObj;
|
|
||||||
if (!routeData.Values.TryGetValue("deviceKey", out deviceObj))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
var device = DeviceManager.GetDeviceForKey(deviceObj.ToString()) as IHasFeedback;
|
|
||||||
if (device == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 404;
|
|
||||||
context.Response.StatusDescription = "Not Found";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var boolFeedback =
|
|
||||||
from feedback in device.Feedbacks.OfType<BoolFeedback>()
|
|
||||||
where !string.IsNullOrEmpty(feedback.Key)
|
|
||||||
select new
|
|
||||||
{
|
|
||||||
FeedbackKey = feedback.Key,
|
|
||||||
Value = feedback.BoolValue
|
|
||||||
};
|
|
||||||
|
|
||||||
var intFeedback =
|
|
||||||
from feedback in device.Feedbacks.OfType<IntFeedback>()
|
|
||||||
where !string.IsNullOrEmpty(feedback.Key)
|
|
||||||
select new
|
|
||||||
{
|
|
||||||
FeedbackKey = feedback.Key,
|
|
||||||
Value = feedback.IntValue
|
|
||||||
};
|
|
||||||
|
|
||||||
var stringFeedback =
|
|
||||||
from feedback in device.Feedbacks.OfType<StringFeedback>()
|
|
||||||
where !string.IsNullOrEmpty(feedback.Key)
|
|
||||||
select new
|
|
||||||
{
|
|
||||||
FeedbackKey = feedback.Key,
|
|
||||||
Value = feedback.StringValue ?? string.Empty
|
|
||||||
};
|
|
||||||
|
|
||||||
var responseObj = new
|
|
||||||
{
|
|
||||||
BoolValues = boolFeedback,
|
|
||||||
IntValues = intFeedback,
|
|
||||||
SerialValues = stringFeedback
|
|
||||||
};
|
|
||||||
|
|
||||||
var js = JsonConvert.SerializeObject(responseObj, Formatting.Indented);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
|
||||||
context.Response.Write(js, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class GetJoinMapForBridgeKeyRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public GetJoinMapForBridgeKeyRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
var routeData = context.Request.RouteData;
|
|
||||||
if (routeData == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
object bridgeObj;
|
|
||||||
if (!routeData.Values.TryGetValue("bridgeKey", out bridgeObj))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var bridge = DeviceManager.GetDeviceForKey(bridgeObj.ToString()) as EiscApiAdvanced;
|
|
||||||
if (bridge == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var joinMap = bridge.JoinMaps.Select(j => EssentialsWebApiHelpers.MapJoinToObject(j)).ToList();
|
|
||||||
if (joinMap == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 404;
|
|
||||||
context.Response.StatusDescription = "Not Found";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var js = JsonConvert.SerializeObject(joinMap, Formatting.Indented);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
|
||||||
context.Response.Write(js, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class GetJoinMapForDeviceKeyRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public GetJoinMapForDeviceKeyRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
var routeData = context.Request.RouteData;
|
|
||||||
if (routeData == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
object bridgeObj;
|
|
||||||
if (!routeData.Values.TryGetValue("bridgeKey", out bridgeObj))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
object deviceObj;
|
|
||||||
if (!routeData.Values.TryGetValue("deviceKey", out deviceObj))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var bridge = DeviceManager.GetDeviceForKey(bridgeObj.ToString()) as EiscApiAdvanced;
|
|
||||||
if (bridge == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 404;
|
|
||||||
context.Response.StatusDescription = "Not Found";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
JoinMapBaseAdvanced deviceJoinMap;
|
|
||||||
if (!bridge.JoinMaps.TryGetValue(deviceObj.ToString(), out deviceJoinMap))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 500;
|
|
||||||
context.Response.StatusDescription = "Internal Server Error";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var joinMap = EssentialsWebApiHelpers.MapJoinToObject(deviceObj.ToString(), deviceJoinMap);
|
|
||||||
var js = JsonConvert.SerializeObject(joinMap, Formatting.Indented, new JsonSerializerSettings
|
|
||||||
{
|
|
||||||
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
|
|
||||||
NullValueHandling = NullValueHandling.Ignore,
|
|
||||||
MissingMemberHandling = MissingMemberHandling.Ignore,
|
|
||||||
DefaultValueHandling = DefaultValueHandling.Ignore,
|
|
||||||
TypeNameHandling = TypeNameHandling.None
|
|
||||||
});
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
|
||||||
context.Response.Write(js, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class GetTypesByFilterRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public GetTypesByFilterRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
var routeData = context.Request.RouteData;
|
|
||||||
if (routeData == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
object filterObj;
|
|
||||||
if (!routeData.Values.TryGetValue("filter", out filterObj))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var deviceFactory = DeviceFactory.GetDeviceFactoryDictionary(filterObj.ToString());
|
|
||||||
if (deviceFactory == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 404;
|
|
||||||
context.Response.StatusDescription = "Not Found";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var deviceTypes = deviceFactory.Select(t => EssentialsWebApiHelpers.MapDeviceTypeToObject(t)).ToList();
|
|
||||||
var js = JsonConvert.SerializeObject(deviceTypes, Formatting.Indented);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
|
||||||
context.Response.Write(js, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class GetTypesRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public GetTypesRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
var routeData = context.Request.RouteData;
|
|
||||||
if (routeData == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var deviceFactory = DeviceFactory.GetDeviceFactoryDictionary(null);
|
|
||||||
if (deviceFactory == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 404;
|
|
||||||
context.Response.StatusDescription = "Not Found";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var deviceTypes = deviceFactory.Select(t => EssentialsWebApiHelpers.MapDeviceTypeToObject(t)).ToList();
|
|
||||||
var js = JsonConvert.SerializeObject(deviceTypes, Formatting.Indented);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
|
||||||
context.Response.Write(js, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class ReportVersionsRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public ReportVersionsRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
var loadAssemblies = PluginLoader.LoadedAssemblies;
|
|
||||||
if (loadAssemblies == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 500;
|
|
||||||
context.Response.StatusDescription = "Internal Server Error";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var assemblies = loadAssemblies.Select(a => EssentialsWebApiHelpers.MapToAssemblyObject(a)).ToList();
|
|
||||||
|
|
||||||
var js = JsonConvert.SerializeObject(assemblies, Formatting.Indented);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
|
||||||
context.Response.Write(js, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,212 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class SetDeviceStreamDebugRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Handles CONNECT method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles DELETE method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleDelete(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles HEAD method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleHead(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles OPTIONS method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleOptions(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles PATCH method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePatch(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles POST method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePost(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
if (context.Request.ContentLength < 0)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = EssentialsWebApiHelpers.GetRequestBody(context.Request);
|
|
||||||
if (data == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 500;
|
|
||||||
context.Response.StatusDescription = "Internal Server Error";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var config = new SetDeviceStreamDebugConfig();
|
|
||||||
var body = JsonConvert.DeserializeAnonymousType(data, config);
|
|
||||||
if (body == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 500;
|
|
||||||
context.Response.StatusDescription = "Internal Server Error";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(body.DeviceKey) || string.IsNullOrEmpty(body.Setting))
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 400;
|
|
||||||
context.Response.StatusDescription = "Bad Request";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var device = DeviceManager.GetDeviceForKey(body.DeviceKey) as IStreamDebugging;
|
|
||||||
if (device == null)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 404;
|
|
||||||
context.Response.StatusDescription = "Not Found";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
eStreamDebuggingSetting debugSetting;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
debugSetting = (eStreamDebuggingSetting) Enum.Parse(typeof (eStreamDebuggingSetting), body.Setting, true);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 500;
|
|
||||||
context.Response.StatusDescription = "Internal Server Error";
|
|
||||||
context.Response.End();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var mins = Convert.ToUInt32(body.Timeout);
|
|
||||||
if (mins > 0)
|
|
||||||
{
|
|
||||||
device.StreamDebugging.SetDebuggingWithSpecificTimeout(debugSetting, mins);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
device.StreamDebugging.SetDebuggingWithDefaultTimeout(debugSetting);
|
|
||||||
}
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 500;
|
|
||||||
context.Response.StatusDescription = "Internal Server Error";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles PUT method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandlePut(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles TRACE method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleTrace(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public class SetDeviceStreamDebugConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("deviceKey", NullValueHandling = NullValueHandling.Include)]
|
|
||||||
public string DeviceKey { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("setting", NullValueHandling = NullValueHandling.Include)]
|
|
||||||
public string Setting { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("timeout")]
|
|
||||||
public int Timeout { get; set; }
|
|
||||||
|
|
||||||
public SetDeviceStreamDebugConfig()
|
|
||||||
{
|
|
||||||
DeviceKey = null;
|
|
||||||
Setting = null;
|
|
||||||
Timeout = 15;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|
||||||
{
|
|
||||||
public class ShowConfigRequestHandler : WebApiBaseRequestHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// base(true) enables CORS support by default
|
|
||||||
/// </remarks>
|
|
||||||
public ShowConfigRequestHandler()
|
|
||||||
: base(true)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handles GET method requests
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="context"></param>
|
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
|
||||||
{
|
|
||||||
var config = JsonConvert.SerializeObject(ConfigReader.ConfigObject, Formatting.Indented);
|
|
||||||
|
|
||||||
context.Response.StatusCode = 200;
|
|
||||||
context.Response.StatusDescription = "OK";
|
|
||||||
context.Response.ContentType = "application/json";
|
|
||||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
|
||||||
context.Response.Write(config, false);
|
|
||||||
context.Response.End();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -19,7 +19,7 @@ namespace PepperDash.Essentials.DM.AirMedia
|
|||||||
[Description("Wrapper class for an AM-200 or AM-300")]
|
[Description("Wrapper class for an AM-200 or AM-300")]
|
||||||
public class AirMediaController : CrestronGenericBridgeableBaseDevice, IRoutingNumericWithFeedback, IIROutputPorts, IComPorts
|
public class AirMediaController : CrestronGenericBridgeableBaseDevice, IRoutingNumericWithFeedback, IIROutputPorts, IComPorts
|
||||||
{
|
{
|
||||||
public Am3x00 AirMedia { get; private set; }
|
public AmX00 AirMedia { get; private set; }
|
||||||
|
|
||||||
public DeviceConfig DeviceConfig { get; private set; }
|
public DeviceConfig DeviceConfig { get; private set; }
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ namespace PepperDash.Essentials.DM.AirMedia
|
|||||||
public StringFeedback SerialNumberFeedback { get; private set; }
|
public StringFeedback SerialNumberFeedback { get; private set; }
|
||||||
public BoolFeedback AutomaticInputRoutingEnabledFeedback { get; private set; }
|
public BoolFeedback AutomaticInputRoutingEnabledFeedback { get; private set; }
|
||||||
|
|
||||||
public AirMediaController(string key, string name, Am3x00 device, DeviceConfig dc, AirMediaPropertiesConfig props)
|
public AirMediaController(string key, string name, AmX00 device, DeviceConfig dc, AirMediaPropertiesConfig props)
|
||||||
: base(key, name, device)
|
: base(key, name, device)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -95,31 +95,24 @@ namespace PepperDash.Essentials.DM.AirMedia
|
|||||||
|
|
||||||
AirMedia.AirMedia.AirMediaChange += new Crestron.SimplSharpPro.DeviceSupport.GenericEventHandler(AirMedia_AirMediaChange);
|
AirMedia.AirMedia.AirMediaChange += new Crestron.SimplSharpPro.DeviceSupport.GenericEventHandler(AirMedia_AirMediaChange);
|
||||||
|
|
||||||
IsInSessionFeedback = new BoolFeedback(() => AirMedia.AirMedia.StatusFeedback.UShortValue == 0);
|
IsInSessionFeedback = new BoolFeedback(new Func<bool>(() => AirMedia.AirMedia.StatusFeedback.UShortValue == 0));
|
||||||
ErrorFeedback = new IntFeedback(() => AirMedia.AirMedia.ErrorFeedback.UShortValue);
|
ErrorFeedback = new IntFeedback(new Func<int>(() => AirMedia.AirMedia.ErrorFeedback.UShortValue));
|
||||||
NumberOfUsersConnectedFeedback = new IntFeedback(() => AirMedia.AirMedia.NumberOfUsersConnectedFeedback.UShortValue);
|
NumberOfUsersConnectedFeedback = new IntFeedback(new Func<int>(() => AirMedia.AirMedia.NumberOfUsersConnectedFeedback.UShortValue));
|
||||||
LoginCodeFeedback = new IntFeedback(() => AirMedia.AirMedia.LoginCodeFeedback.UShortValue);
|
LoginCodeFeedback = new IntFeedback(new Func<int>(() => AirMedia.AirMedia.LoginCodeFeedback.UShortValue));
|
||||||
ConnectionAddressFeedback = new StringFeedback(() => AirMedia.AirMedia.ConnectionAddressFeedback.StringValue);
|
ConnectionAddressFeedback = new StringFeedback(new Func<string>(() => AirMedia.AirMedia.ConnectionAddressFeedback.StringValue));
|
||||||
HostnameFeedback = new StringFeedback(() => AirMedia.AirMedia.HostNameFeedback.StringValue);
|
HostnameFeedback = new StringFeedback(new Func<string>(() => AirMedia.AirMedia.HostNameFeedback.StringValue));
|
||||||
|
|
||||||
// TODO: Figure out if we can actually get the TSID/Serial
|
// TODO: Figure out if we can actually get the TSID/Serial
|
||||||
SerialNumberFeedback = new StringFeedback(() => "unknown");
|
SerialNumberFeedback = new StringFeedback(new Func<string>(() => "unknown"));
|
||||||
|
|
||||||
AirMedia.DisplayControl.DisplayControlChange += DisplayControl_DisplayControlChange;
|
AirMedia.DisplayControl.DisplayControlChange += new Crestron.SimplSharpPro.DeviceSupport.GenericEventHandler(DisplayControl_DisplayControlChange);
|
||||||
|
|
||||||
VideoOutFeedback = new IntFeedback(() => Convert.ToInt16(AirMedia.DisplayControl.VideoOutFeedback));
|
VideoOutFeedback = new IntFeedback(new Func<int>(() => Convert.ToInt16(AirMedia.DisplayControl.VideoOutFeedback)));
|
||||||
AutomaticInputRoutingEnabledFeedback = new BoolFeedback(() => AirMedia.DisplayControl.EnableAutomaticRoutingFeedback.BoolValue);
|
AutomaticInputRoutingEnabledFeedback = new BoolFeedback(new Func<bool>(() => AirMedia.DisplayControl.EnableAutomaticRoutingFeedback.BoolValue));
|
||||||
|
|
||||||
// Not all AirMedia versions support HDMI In like the 3200
|
AirMedia.HdmiIn.StreamChange += new Crestron.SimplSharpPro.DeviceSupport.StreamEventHandler(HdmiIn_StreamChange);
|
||||||
if (AirMedia.HdmiIn != null)
|
|
||||||
{
|
|
||||||
AirMedia.HdmiIn.StreamChange += HdmiIn_StreamChange;
|
|
||||||
HdmiVideoSyncDetectedFeedback = new BoolFeedback(() => AirMedia.HdmiIn.SyncDetectedFeedback.BoolValue);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return false if the AirMedia device doesn't support HDMI Input
|
HdmiVideoSyncDetectedFeedback = new BoolFeedback(new Func<bool>(() => AirMedia.HdmiIn.SyncDetectedFeedback.BoolValue));
|
||||||
HdmiVideoSyncDetectedFeedback = new BoolFeedback(() => false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool CustomActivate()
|
public override bool CustomActivate()
|
||||||
@@ -129,7 +122,7 @@ namespace PepperDash.Essentials.DM.AirMedia
|
|||||||
else
|
else
|
||||||
AirMedia.DisplayControl.DisableAutomaticRouting();
|
AirMedia.DisplayControl.DisableAutomaticRouting();
|
||||||
|
|
||||||
return true;
|
return base.CustomActivate();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
||||||
@@ -186,53 +179,31 @@ namespace PepperDash.Essentials.DM.AirMedia
|
|||||||
/// <param name="e">Arguments defined as IKeyName sender, output, input, and eRoutingSignalType</param>
|
/// <param name="e">Arguments defined as IKeyName sender, output, input, and eRoutingSignalType</param>
|
||||||
private void OnSwitchChange(RoutingNumericEventArgs e)
|
private void OnSwitchChange(RoutingNumericEventArgs e)
|
||||||
{
|
{
|
||||||
var handler = NumericSwitchChange;
|
var newEvent = NumericSwitchChange;
|
||||||
|
if (newEvent != null) newEvent(this, e);
|
||||||
if (handler == null) return;
|
}
|
||||||
|
|
||||||
handler(this, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AirMedia_AirMediaChange(object sender, Crestron.SimplSharpPro.DeviceSupport.GenericEventArgs args)
|
void AirMedia_AirMediaChange(object sender, Crestron.SimplSharpPro.DeviceSupport.GenericEventArgs args)
|
||||||
{
|
{
|
||||||
switch (args.EventId)
|
if (args.EventId == AirMediaInputSlot.AirMediaStatusFeedbackEventId)
|
||||||
{
|
IsInSessionFeedback.FireUpdate();
|
||||||
case AirMediaInputSlot.AirMediaStatusFeedbackEventId:
|
else if (args.EventId == AirMediaInputSlot.AirMediaErrorFeedbackEventId)
|
||||||
{
|
ErrorFeedback.FireUpdate();
|
||||||
IsInSessionFeedback.FireUpdate();
|
else if (args.EventId == AirMediaInputSlot.AirMediaNumberOfUserConnectedEventId)
|
||||||
break;
|
NumberOfUsersConnectedFeedback.FireUpdate();
|
||||||
}
|
else if (args.EventId == AirMediaInputSlot.AirMediaLoginCodeEventId)
|
||||||
case AirMediaInputSlot.AirMediaErrorFeedbackEventId:
|
LoginCodeFeedback.FireUpdate();
|
||||||
{
|
else if (args.EventId == AirMediaInputSlot.AirMediaConnectionAddressFeedbackEventId)
|
||||||
ErrorFeedback.FireUpdate();
|
ConnectionAddressFeedback.FireUpdate();
|
||||||
break;
|
else if (args.EventId == AirMediaInputSlot.AirMediaHostNameFeedbackEventId)
|
||||||
}
|
HostnameFeedback.FireUpdate();
|
||||||
case AirMediaInputSlot.AirMediaNumberOfUserConnectedEventId:
|
|
||||||
{
|
|
||||||
NumberOfUsersConnectedFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case AirMediaInputSlot.AirMediaLoginCodeEventId:
|
|
||||||
{
|
|
||||||
LoginCodeFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case AirMediaInputSlot.AirMediaConnectionAddressFeedbackEventId:
|
|
||||||
{
|
|
||||||
ConnectionAddressFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case AirMediaInputSlot.AirMediaHostNameFeedbackEventId:
|
|
||||||
{
|
|
||||||
HostnameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayControl_DisplayControlChange(object sender, Crestron.SimplSharpPro.DeviceSupport.GenericEventArgs args)
|
void DisplayControl_DisplayControlChange(object sender, Crestron.SimplSharpPro.DeviceSupport.GenericEventArgs args)
|
||||||
{
|
{
|
||||||
|
if (args.EventId == AmX00.VideoOutFeedbackEventId)
|
||||||
|
{
|
||||||
VideoOutFeedback.FireUpdate();
|
VideoOutFeedback.FireUpdate();
|
||||||
|
|
||||||
var localInputPort =
|
var localInputPort =
|
||||||
@@ -240,7 +211,8 @@ namespace PepperDash.Essentials.DM.AirMedia
|
|||||||
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoOutFeedback.UShortValue, OutputPorts.First(),
|
OnSwitchChange(new RoutingNumericEventArgs(1, VideoOutFeedback.UShortValue, OutputPorts.First(),
|
||||||
localInputPort, eRoutingSignalType.AudioVideo));
|
localInputPort, eRoutingSignalType.AudioVideo));
|
||||||
|
}
|
||||||
|
else if (args.EventId == AmX00.EnableAutomaticRoutingFeedbackEventId)
|
||||||
AutomaticInputRoutingEnabledFeedback.FireUpdate();
|
AutomaticInputRoutingEnabledFeedback.FireUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,7 +342,7 @@ namespace PepperDash.Essentials.DM.AirMedia
|
|||||||
{
|
{
|
||||||
public AirMediaControllerFactory()
|
public AirMediaControllerFactory()
|
||||||
{
|
{
|
||||||
TypeNames = new List<string>() { "am200", "am300", "am3200" };
|
TypeNames = new List<string>() { "am200", "am300" };
|
||||||
}
|
}
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
@@ -379,26 +351,12 @@ namespace PepperDash.Essentials.DM.AirMedia
|
|||||||
|
|
||||||
Debug.Console(1, "Factory Attempting to create new AirMedia Device");
|
Debug.Console(1, "Factory Attempting to create new AirMedia Device");
|
||||||
|
|
||||||
var props = dc.Properties.ToObject<AirMediaPropertiesConfig>();
|
var props = JsonConvert.DeserializeObject<AirMediaPropertiesConfig>(dc.Properties.ToString());
|
||||||
Am3x00 amDevice = null;
|
AmX00 amDevice = null;
|
||||||
switch (type)
|
if (type == "am200")
|
||||||
{
|
amDevice = new Crestron.SimplSharpPro.DM.AirMedia.Am200(props.Control.IpIdInt, Global.ControlSystem);
|
||||||
case "am200" :
|
else if (type == "am300")
|
||||||
{
|
amDevice = new Crestron.SimplSharpPro.DM.AirMedia.Am300(props.Control.IpIdInt, Global.ControlSystem);
|
||||||
amDevice = new Am200(props.Control.IpIdInt, Global.ControlSystem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "am300" :
|
|
||||||
{
|
|
||||||
amDevice = new Am300(props.Control.IpIdInt, Global.ControlSystem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "am3200" :
|
|
||||||
{
|
|
||||||
amDevice = new Am3200(props.Control.IpIdInt, Global.ControlSystem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new AirMediaController(dc.Key, dc.Name, amDevice, dc, props);
|
return new AirMediaController(dc.Key, dc.Name, amDevice, dc, props);
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DmBladeChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitchWithEndpointOnlineFeedback, IRoutingNumericWithFeedback
|
public class DmBladeChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingNumericWithFeedback
|
||||||
{
|
{
|
||||||
private const string NonePortKey = "inputCard0--None";
|
private const string NonePortKey = "inputCard0--None";
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Description("Wrapper class for all DM-MD chassis variants from 8x8 to 32x32")]
|
[Description("Wrapper class for all DM-MD chassis variants from 8x8 to 32x32")]
|
||||||
public class DmChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitchWithEndpointOnlineFeedback, IRoutingNumericWithFeedback
|
public class DmChassisController : CrestronGenericBridgeableBaseDevice, IDmSwitch, IRoutingNumericWithFeedback
|
||||||
{
|
{
|
||||||
private const string NonePortKey = "inputCard0--None";
|
private const string NonePortKey = "inputCard0--None";
|
||||||
public DMChassisPropertiesConfig PropertiesConfig { get; set; }
|
public DMChassisPropertiesConfig PropertiesConfig { get; set; }
|
||||||
@@ -1482,8 +1482,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
LinkChassisToApi(trilist, joinMap);
|
LinkChassisToApi(trilist, joinMap);
|
||||||
|
|
||||||
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
|
|
||||||
|
|
||||||
// Link up inputs & outputs
|
// Link up inputs & outputs
|
||||||
for (uint i = 1; i <= Chassis.NumberOfOutputs; i++)
|
for (uint i = 1; i <= Chassis.NumberOfOutputs; i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -17,89 +17,52 @@ using PepperDash.Essentials.DM.Config;
|
|||||||
namespace PepperDash.Essentials.DM
|
namespace PepperDash.Essentials.DM
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Exposes the volume levels for Program, Aux1, Aux2, Codec1, Codec2, and Digital outputs on a DMPS3 chassis
|
/// Exposes the volume levels for Program, Aux1 or Aux2 outputs on a DMPS3 chassis
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class DmpsAudioOutputController : EssentialsBridgeableDevice
|
public class DmpsAudioOutputController : EssentialsBridgeableDevice
|
||||||
{
|
{
|
||||||
|
Card.Dmps3OutputBase OutputCard;
|
||||||
|
|
||||||
public DmpsAudioOutput MasterVolumeLevel { get; private set; }
|
public DmpsAudioOutput MasterVolumeLevel { get; private set; }
|
||||||
public DmpsAudioOutput SourceVolumeLevel { get; private set; }
|
public DmpsAudioOutput SourceVolumeLevel { get; private set; }
|
||||||
public DmpsAudioOutput MicsMasterVolumeLevel { get; private set; }
|
public DmpsAudioOutput MicsMasterVolumeLevel { get; private set; }
|
||||||
public DmpsAudioOutput Codec1VolumeLevel { get; private set; }
|
public DmpsAudioOutput Codec1VolumeLevel { get; private set; }
|
||||||
public DmpsAudioOutput Codec2VolumeLevel { get; private set; }
|
public DmpsAudioOutput Codec2VolumeLevel { get; private set; }
|
||||||
|
|
||||||
public DmpsAudioOutputController(string key, string name, DMOutput card, Card.Dmps3DmHdmiAudioOutput.Dmps3AudioOutputStream stream)
|
|
||||||
: base(key, name)
|
|
||||||
{
|
|
||||||
card.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
|
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(stream);
|
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
|
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
|
||||||
}
|
|
||||||
public DmpsAudioOutputController(string key, string name, DMOutput card, Card.Dmps3DmHdmiAudioOutput.Dmps3DmHdmiOutputStream stream)
|
|
||||||
: base(key, name)
|
|
||||||
{
|
|
||||||
card.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
|
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(stream);
|
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
|
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
|
||||||
}
|
|
||||||
|
|
||||||
public DmpsAudioOutputController(string key, string name, Card.Dmps3OutputBase card)
|
public DmpsAudioOutputController(string key, string name, Card.Dmps3OutputBase card)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
card.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
|
OutputCard = card;
|
||||||
|
|
||||||
|
OutputCard.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
|
||||||
|
|
||||||
if (card is Card.Dmps3ProgramOutput)
|
if (card is Card.Dmps3ProgramOutput)
|
||||||
{
|
{
|
||||||
var programOutput = card as Card.Dmps3ProgramOutput;
|
MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3ProgramOutput).OutputMixer);
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, programOutput.OutputMixer);
|
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, programOutput.OutputEqualizer);
|
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
Codec1VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec1);
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
Codec2VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec2);
|
||||||
Codec1VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec1);
|
|
||||||
Codec2VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec2);
|
|
||||||
}
|
}
|
||||||
else if (card is Card.Dmps3Aux1Output)
|
else if (card is Card.Dmps3Aux1Output)
|
||||||
{
|
{
|
||||||
var auxOutput = card as Card.Dmps3Aux1Output;
|
MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3Aux1Output).OutputMixer);
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, auxOutput.OutputMixer);
|
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, auxOutput.OutputEqualizer);
|
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
Codec2VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec2);
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
|
||||||
Codec2VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec2);
|
|
||||||
}
|
}
|
||||||
else if (card is Card.Dmps3Aux2Output)
|
else if (card is Card.Dmps3Aux2Output)
|
||||||
{
|
{
|
||||||
var auxOutput = card as Card.Dmps3Aux2Output;
|
MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3Aux2Output).OutputMixer);
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, auxOutput.OutputMixer);
|
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, auxOutput.OutputEqualizer);
|
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
Codec1VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec1);
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
|
||||||
Codec1VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec1);
|
|
||||||
}
|
}
|
||||||
else if (card is Card.Dmps3DigitalMixOutput)
|
else //Digital Outputs
|
||||||
{
|
{
|
||||||
var mixOutput = card as Card.Dmps3DigitalMixOutput;
|
MasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Master);
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, mixOutput.OutputMixer);
|
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
|
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
|
||||||
}
|
|
||||||
else if (card is Card.Dmps3HdmiOutput)
|
|
||||||
{
|
|
||||||
var hdmiOutput = card as Card.Dmps3HdmiOutput;
|
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, hdmiOutput.OutputMixer);
|
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
|
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
|
||||||
}
|
|
||||||
else if (card is Card.Dmps3DmOutput)
|
|
||||||
{
|
|
||||||
var dmOutput = card as Card.Dmps3DmOutput;
|
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, dmOutput.OutputMixer);
|
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
|
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,11 +185,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
trilist.SetUShortSigAction(joinMap.MixerPresetRecall.JoinNumber, mixer.RecallPreset);
|
trilist.SetUShortSigAction(joinMap.MixerPresetRecall.JoinNumber, mixer.RecallPreset);
|
||||||
}
|
}
|
||||||
var eq = MasterVolumeLevel as DmpsAudioOutputWithMixerAndEq;
|
|
||||||
if (eq != null)
|
|
||||||
{
|
|
||||||
trilist.SetUShortSigAction(joinMap.MixerEqPresetRecall.JoinNumber, eq.RecallEqPreset);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SourceVolumeLevel != null)
|
if (SourceVolumeLevel != null)
|
||||||
@@ -276,37 +234,21 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DmpsAudioOutputWithMixerAndEq : DmpsAudioOutputWithMixer
|
|
||||||
{
|
|
||||||
private CrestronControlSystem.Dmps3OutputEqualizer Eq;
|
|
||||||
public DmpsAudioOutputWithMixerAndEq(Dmps3AudioOutputWithMixerBase output, eDmpsLevelType type, CrestronControlSystem.Dmps3OutputEqualizer eq)
|
|
||||||
: base(output, type)
|
|
||||||
{
|
|
||||||
Eq = eq;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RecallEqPreset(ushort preset)
|
|
||||||
{
|
|
||||||
Eq.PresetNumber.UShortValue = preset;
|
|
||||||
Eq.RecallPreset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DmpsAudioOutputWithMixer : DmpsAudioOutput
|
public class DmpsAudioOutputWithMixer : DmpsAudioOutput
|
||||||
{
|
{
|
||||||
Dmps3AudioOutputWithMixerBase Output;
|
CrestronControlSystem.Dmps3OutputMixerWithMonoAndStereo Mixer;
|
||||||
|
|
||||||
public DmpsAudioOutputWithMixer(Dmps3AudioOutputWithMixerBase output, eDmpsLevelType type)
|
public DmpsAudioOutputWithMixer(Card.Dmps3OutputBase output, eDmpsLevelType type, CrestronControlSystem.Dmps3OutputMixerWithMonoAndStereo mixer)
|
||||||
: base(output, type)
|
: base(output, type)
|
||||||
{
|
{
|
||||||
Output = output;
|
Mixer = mixer;
|
||||||
GetVolumeMax();
|
GetVolumeMax();
|
||||||
GetVolumeMin();
|
GetVolumeMin();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GetVolumeMin()
|
public void GetVolumeMin()
|
||||||
{
|
{
|
||||||
MinLevel = (short)Output.MinVolumeFeedback.UShortValue;
|
MinLevel = (short)Mixer.MinVolumeFeedback.UShortValue;
|
||||||
if (VolumeLevelScaledFeedback != null)
|
if (VolumeLevelScaledFeedback != null)
|
||||||
{
|
{
|
||||||
VolumeLevelScaledFeedback.FireUpdate();
|
VolumeLevelScaledFeedback.FireUpdate();
|
||||||
@@ -315,7 +257,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
public void GetVolumeMax()
|
public void GetVolumeMax()
|
||||||
{
|
{
|
||||||
MaxLevel = (short)Output.MaxVolumeFeedback.UShortValue;
|
MaxLevel = (short)Mixer.MaxVolumeFeedback.UShortValue;
|
||||||
if (VolumeLevelScaledFeedback != null)
|
if (VolumeLevelScaledFeedback != null)
|
||||||
{
|
{
|
||||||
VolumeLevelScaledFeedback.FireUpdate();
|
VolumeLevelScaledFeedback.FireUpdate();
|
||||||
@@ -324,36 +266,23 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
public void RecallPreset(ushort preset)
|
public void RecallPreset(ushort preset)
|
||||||
{
|
{
|
||||||
Output.PresetNumber.UShortValue = preset;
|
Debug.Console(1, "DMPS Recalling Preset {0}", preset);
|
||||||
Output.RecallPreset();
|
Mixer.PresetNumber.UShortValue = preset;
|
||||||
|
Mixer.RecallPreset();
|
||||||
if (!Global.ControlSystemIsDmps4k3xxType)
|
|
||||||
{
|
|
||||||
//Recall startup volume for main volume level as DMPS3(non-4K) presets don't affect the main volume
|
|
||||||
RecallStartupVolume();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RecallStartupVolume()
|
|
||||||
{
|
|
||||||
ushort startupVol = Output.StartupVolumeFeedback.UShortValue;
|
|
||||||
//Reset startup vol due to bug on DMPS3 where getting the value from above method clears the startup volume
|
|
||||||
Output.StartupVolume.UShortValue = startupVol;
|
|
||||||
Debug.Console(1, "DMPS Recalling Startup Volume {0}", startupVol);
|
|
||||||
SetVolume(startupVol);
|
|
||||||
MuteOff();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DmpsAudioOutput : IBasicVolumeWithFeedback
|
public class DmpsAudioOutput : IBasicVolumeWithFeedback
|
||||||
{
|
{
|
||||||
private UShortInputSig Level;
|
Card.Dmps3OutputBase Output;
|
||||||
|
eDmpsLevelType Type;
|
||||||
|
UShortInputSig Level;
|
||||||
|
|
||||||
private bool EnableVolumeSend;
|
private bool EnableVolumeSend;
|
||||||
private ushort VolumeLevelInput;
|
private ushort VolumeLevelInput;
|
||||||
protected short MinLevel { get; set; }
|
protected short MinLevel { get; set; }
|
||||||
protected short MaxLevel { get; set; }
|
protected short MaxLevel { get; set; }
|
||||||
|
|
||||||
public eDmpsLevelType Type { get; private set; }
|
|
||||||
public BoolFeedback MuteFeedback { get; private set; }
|
public BoolFeedback MuteFeedback { get; private set; }
|
||||||
public IntFeedback VolumeLevelFeedback { get; private set; }
|
public IntFeedback VolumeLevelFeedback { get; private set; }
|
||||||
public IntFeedback VolumeLevelScaledFeedback { get; private set; }
|
public IntFeedback VolumeLevelScaledFeedback { get; private set; }
|
||||||
@@ -363,8 +292,9 @@ namespace PepperDash.Essentials.DM
|
|||||||
Action<bool> VolumeUpAction;
|
Action<bool> VolumeUpAction;
|
||||||
Action<bool> VolumeDownAction;
|
Action<bool> VolumeDownAction;
|
||||||
|
|
||||||
public DmpsAudioOutput(Dmps3AudioOutputBase output, eDmpsLevelType type)
|
public DmpsAudioOutput(Card.Dmps3OutputBase output, eDmpsLevelType type)
|
||||||
{
|
{
|
||||||
|
Output = output;
|
||||||
VolumeLevelInput = 0;
|
VolumeLevelInput = 0;
|
||||||
EnableVolumeSend = false;
|
EnableVolumeSend = false;
|
||||||
Type = type;
|
Type = type;
|
||||||
@@ -376,46 +306,47 @@ namespace PepperDash.Essentials.DM
|
|||||||
case eDmpsLevelType.Master:
|
case eDmpsLevelType.Master:
|
||||||
{
|
{
|
||||||
Level = output.MasterVolume;
|
Level = output.MasterVolume;
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => output.MasterMuteOnFeedBack.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => output.MasterVolumeFeedBack.UShortValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => Output.MasterMuteOnFeedBack.BoolValue));
|
||||||
MuteOnAction = new Action(output.MasterMuteOn);
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => Output.MasterVolumeFeedBack.UShortValue));
|
||||||
MuteOffAction = new Action(output.MasterMuteOff);
|
MuteOnAction = new Action(Output.MasterMuteOn);
|
||||||
VolumeUpAction = new Action<bool>((b) => output.MasterVolumeUp.BoolValue = b);
|
MuteOffAction = new Action(Output.MasterMuteOff);
|
||||||
VolumeDownAction = new Action<bool>((b) => output.MasterVolumeDown.BoolValue = b);
|
VolumeUpAction = new Action<bool>((b) => Output.MasterVolumeUp.BoolValue = b);
|
||||||
|
VolumeDownAction = new Action<bool>((b) => Output.MasterVolumeDown.BoolValue = b);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eDmpsLevelType.MicsMaster:
|
case eDmpsLevelType.MicsMaster:
|
||||||
{
|
{
|
||||||
if (output.Card is Card.Dmps3OutputBase)
|
Level = output.MicMasterLevel;
|
||||||
{
|
|
||||||
var micOutput = output.Card as Card.Dmps3OutputBase;
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => Output.MicMasterMuteOnFeedBack.BoolValue));
|
||||||
Level = micOutput.MicMasterLevel;
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => Output.MicMasterLevelFeedBack.UShortValue));
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => micOutput.MicMasterMuteOnFeedBack.BoolValue));
|
MuteOnAction = new Action(Output.MicMasterMuteOn);
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => micOutput.MicMasterLevelFeedBack.UShortValue));
|
MuteOffAction = new Action(Output.MicMasterMuteOff);
|
||||||
MuteOnAction = new Action(micOutput.MicMasterMuteOn);
|
VolumeUpAction = new Action<bool>((b) => Output.MicMasterLevelUp.BoolValue = b);
|
||||||
MuteOffAction = new Action(micOutput.MicMasterMuteOff);
|
VolumeDownAction = new Action<bool>((b) => Output.MicMasterLevelDown.BoolValue = b);
|
||||||
VolumeUpAction = new Action<bool>((b) => micOutput.MicMasterLevelUp.BoolValue = b);
|
|
||||||
VolumeDownAction = new Action<bool>((b) => micOutput.MicMasterLevelDown.BoolValue = b);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eDmpsLevelType.Source:
|
case eDmpsLevelType.Source:
|
||||||
{
|
{
|
||||||
Level = output.SourceLevel;
|
Level = output.SourceLevel;
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => output.SourceMuteOnFeedBack.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => output.SourceLevelFeedBack.UShortValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => Output.SourceMuteOnFeedBack.BoolValue));
|
||||||
MuteOnAction = new Action(output.SourceMuteOn);
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => Output.SourceLevelFeedBack.UShortValue));
|
||||||
MuteOffAction = new Action(output.SourceMuteOff);
|
MuteOnAction = new Action(Output.SourceMuteOn);
|
||||||
VolumeUpAction = new Action<bool>((b) => output.SourceLevelUp.BoolValue = b);
|
MuteOffAction = new Action(Output.SourceMuteOff);
|
||||||
VolumeDownAction = new Action<bool>((b) => output.SourceLevelDown.BoolValue = b);
|
VolumeUpAction = new Action<bool>((b) => Output.SourceLevelUp.BoolValue = b);
|
||||||
|
VolumeDownAction = new Action<bool>((b) => Output.SourceLevelDown.BoolValue = b);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eDmpsLevelType.Codec1:
|
case eDmpsLevelType.Codec1:
|
||||||
{
|
{
|
||||||
if (output.Card is Card.Dmps3ProgramOutput)
|
var programOutput = output as Card.Dmps3ProgramOutput;
|
||||||
|
|
||||||
|
if (programOutput != null)
|
||||||
{
|
{
|
||||||
var programOutput = output.Card as Card.Dmps3ProgramOutput;
|
|
||||||
Level = programOutput.Codec1Level;
|
Level = programOutput.Codec1Level;
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec1LevelFeedback.UShortValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec1LevelFeedback.UShortValue));
|
||||||
MuteOnAction = new Action(programOutput.Codec1MuteOn);
|
MuteOnAction = new Action(programOutput.Codec1MuteOn);
|
||||||
@@ -423,10 +354,12 @@ namespace PepperDash.Essentials.DM
|
|||||||
VolumeUpAction = new Action<bool>((b) => programOutput.Codec1LevelUp.BoolValue = b);
|
VolumeUpAction = new Action<bool>((b) => programOutput.Codec1LevelUp.BoolValue = b);
|
||||||
VolumeDownAction = new Action<bool>((b) => programOutput.Codec1LevelDown.BoolValue = b);
|
VolumeDownAction = new Action<bool>((b) => programOutput.Codec1LevelDown.BoolValue = b);
|
||||||
}
|
}
|
||||||
else if (output.Card is Card.Dmps3Aux2Output)
|
else
|
||||||
{
|
{
|
||||||
var auxOutput = output.Card as Card.Dmps3Aux2Output;
|
var auxOutput = output as Card.Dmps3Aux2Output;
|
||||||
|
|
||||||
Level = auxOutput.Codec1Level;
|
Level = auxOutput.Codec1Level;
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute1OnFeedback.BoolValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute1OnFeedback.BoolValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec1LevelFeedback.UShortValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec1LevelFeedback.UShortValue));
|
||||||
MuteOnAction = new Action(auxOutput.Codec1MuteOn);
|
MuteOnAction = new Action(auxOutput.Codec1MuteOn);
|
||||||
@@ -438,10 +371,12 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
case eDmpsLevelType.Codec2:
|
case eDmpsLevelType.Codec2:
|
||||||
{
|
{
|
||||||
if (output.Card is Card.Dmps3ProgramOutput)
|
var programOutput = output as Card.Dmps3ProgramOutput;
|
||||||
|
|
||||||
|
if (programOutput != null)
|
||||||
{
|
{
|
||||||
var programOutput = output.Card as Card.Dmps3ProgramOutput;
|
|
||||||
Level = programOutput.Codec2Level;
|
Level = programOutput.Codec2Level;
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec2LevelFeedback.UShortValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec2LevelFeedback.UShortValue));
|
||||||
MuteOnAction = new Action(programOutput.Codec2MuteOn);
|
MuteOnAction = new Action(programOutput.Codec2MuteOn);
|
||||||
@@ -449,11 +384,12 @@ namespace PepperDash.Essentials.DM
|
|||||||
VolumeUpAction = new Action<bool>((b) => programOutput.Codec2LevelUp.BoolValue = b);
|
VolumeUpAction = new Action<bool>((b) => programOutput.Codec2LevelUp.BoolValue = b);
|
||||||
VolumeDownAction = new Action<bool>((b) => programOutput.Codec2LevelDown.BoolValue = b);
|
VolumeDownAction = new Action<bool>((b) => programOutput.Codec2LevelDown.BoolValue = b);
|
||||||
}
|
}
|
||||||
else if (output.Card is Card.Dmps3Aux1Output)
|
else
|
||||||
{
|
{
|
||||||
var auxOutput = output.Card as Card.Dmps3Aux1Output;
|
var auxOutput = output as Card.Dmps3Aux1Output;
|
||||||
|
|
||||||
Level = auxOutput.Codec2Level;
|
Level = auxOutput.Codec2Level;
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute2OnFeedback.BoolValue));
|
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute2OnFeedback.BoolValue));
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec2LevelFeedback.UShortValue));
|
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec2LevelFeedback.UShortValue));
|
||||||
MuteOnAction = new Action(auxOutput.Codec2MuteOn);
|
MuteOnAction = new Action(auxOutput.Codec2MuteOn);
|
||||||
@@ -474,26 +410,19 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
public void SetVolumeScaled(ushort level)
|
public void SetVolumeScaled(ushort level)
|
||||||
{
|
{
|
||||||
if (ushort.MaxValue + MinLevel != 0)
|
Debug.Console(2, Debug.ErrorLogLevel.None, "Scaling DMPS volume:{0} level:{1} min:{2} max:{3}", Output.Name, level.ToString(), MinLevel.ToString(), MaxLevel.ToString());
|
||||||
|
VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
|
||||||
|
if (EnableVolumeSend == true)
|
||||||
{
|
{
|
||||||
VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
|
Level.UShortValue = VolumeLevelInput;
|
||||||
if (EnableVolumeSend == true)
|
|
||||||
{
|
|
||||||
Level.UShortValue = VolumeLevelInput;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ushort ScaleVolumeFeedback(ushort level)
|
public ushort ScaleVolumeFeedback(ushort level)
|
||||||
{
|
{
|
||||||
short signedLevel = (short)level;
|
short signedLevel = (short)level;
|
||||||
|
Debug.Console(2, Debug.ErrorLogLevel.None, "Scaling DMPS volume:{0} feedback:{1} min:{2} max:{3}", Output.Name, signedLevel.ToString(), MinLevel.ToString(), MaxLevel.ToString());
|
||||||
if (MaxLevel - MinLevel != 0)
|
return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
|
||||||
{
|
|
||||||
return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return (ushort)MinLevel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendScaledVolume(bool pressRelease)
|
public void SendScaledVolume(bool pressRelease)
|
||||||
@@ -547,150 +476,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Dmps3AudioOutputWithMixerBase : Dmps3AudioOutputBase
|
|
||||||
{
|
|
||||||
public UShortOutputSig MinVolumeFeedback { get; private set; }
|
|
||||||
public UShortOutputSig MaxVolumeFeedback { get; private set; }
|
|
||||||
public UShortInputSig StartupVolume { get; private set; }
|
|
||||||
public UShortOutputSig StartupVolumeFeedback { get; private set; }
|
|
||||||
public UShortInputSig PresetNumber { get; private set; }
|
|
||||||
|
|
||||||
public Action RecallPreset { get; private set; }
|
|
||||||
|
|
||||||
public Dmps3AudioOutputWithMixerBase(Card.Dmps3OutputBase card, CrestronControlSystem.Dmps3OutputMixer mixer)
|
|
||||||
: base(card)
|
|
||||||
{
|
|
||||||
MinVolumeFeedback = mixer.MinVolumeFeedback;
|
|
||||||
MaxVolumeFeedback = mixer.MaxVolumeFeedback;
|
|
||||||
StartupVolume = mixer.StartupVolume;
|
|
||||||
StartupVolumeFeedback = mixer.StartupVolumeFeedback;
|
|
||||||
PresetNumber = mixer.PresetNumber;
|
|
||||||
|
|
||||||
RecallPreset = new Action(mixer.RecallPreset);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dmps3AudioOutputWithMixerBase(Card.Dmps3OutputBase card, CrestronControlSystem.Dmps3AttachableOutputMixer mixer)
|
|
||||||
: base(card)
|
|
||||||
{
|
|
||||||
MinVolumeFeedback = mixer.MinVolumeFeedback;
|
|
||||||
MaxVolumeFeedback = mixer.MaxVolumeFeedback;
|
|
||||||
StartupVolume = mixer.StartupVolume;
|
|
||||||
StartupVolumeFeedback = mixer.StartupVolumeFeedback;
|
|
||||||
PresetNumber = mixer.PresetNumber;
|
|
||||||
|
|
||||||
RecallPreset = new Action(mixer.RecallPreset);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dmps3AudioOutputWithMixerBase(Card.Dmps3DmHdmiAudioOutput.Dmps3AudioOutputStream stream)
|
|
||||||
: base(stream)
|
|
||||||
{
|
|
||||||
var mixer = stream.OutputMixer;
|
|
||||||
MinVolumeFeedback = mixer.MinVolumeFeedback;
|
|
||||||
MaxVolumeFeedback = mixer.MaxVolumeFeedback;
|
|
||||||
StartupVolume = mixer.StartupVolume;
|
|
||||||
StartupVolumeFeedback = mixer.StartupVolumeFeedback;
|
|
||||||
PresetNumber = stream.PresetNumber;
|
|
||||||
RecallPreset = new Action(stream.RecallPreset);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dmps3AudioOutputWithMixerBase(Card.Dmps3DmHdmiAudioOutput.Dmps3DmHdmiOutputStream stream)
|
|
||||||
: base(stream)
|
|
||||||
{
|
|
||||||
var mixer = stream.OutputMixer;
|
|
||||||
MinVolumeFeedback = mixer.MinVolumeFeedback;
|
|
||||||
MaxVolumeFeedback = mixer.MaxVolumeFeedback;
|
|
||||||
StartupVolume = mixer.StartupVolume;
|
|
||||||
StartupVolumeFeedback = mixer.StartupVolumeFeedback;
|
|
||||||
PresetNumber = stream.PresetNumber;
|
|
||||||
RecallPreset = new Action(stream.RecallPreset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public class Dmps3AudioOutputBase
|
|
||||||
{
|
|
||||||
public DMOutput Card { get; private set; }
|
|
||||||
public BoolOutputSig MasterMuteOffFeedBack { get; private set; }
|
|
||||||
public BoolOutputSig MasterMuteOnFeedBack { get; private set; }
|
|
||||||
public UShortInputSig MasterVolume { get; private set; }
|
|
||||||
public UShortOutputSig MasterVolumeFeedBack { get; private set; }
|
|
||||||
public BoolInputSig MasterVolumeUp { get; private set; }
|
|
||||||
public BoolInputSig MasterVolumeDown { get; private set; }
|
|
||||||
public BoolOutputSig SourceMuteOffFeedBack { get; private set; }
|
|
||||||
public BoolOutputSig SourceMuteOnFeedBack { get; private set; }
|
|
||||||
public UShortInputSig SourceLevel { get; private set; }
|
|
||||||
public UShortOutputSig SourceLevelFeedBack { get; private set; }
|
|
||||||
public BoolInputSig SourceLevelUp { get; private set; }
|
|
||||||
public BoolInputSig SourceLevelDown { get; private set; }
|
|
||||||
|
|
||||||
public Action MasterMuteOff { get; private set; }
|
|
||||||
public Action MasterMuteOn { get; private set; }
|
|
||||||
public Action SourceMuteOff { get; private set; }
|
|
||||||
public Action SourceMuteOn { get; private set; }
|
|
||||||
|
|
||||||
public Dmps3AudioOutputBase(Card.Dmps3OutputBase card)
|
|
||||||
{
|
|
||||||
Card = card;
|
|
||||||
MasterMuteOffFeedBack = card.MasterMuteOffFeedBack;
|
|
||||||
MasterMuteOnFeedBack = card.MasterMuteOnFeedBack;
|
|
||||||
MasterVolume = card.MasterVolume;
|
|
||||||
MasterVolumeFeedBack = card.MasterVolumeFeedBack;
|
|
||||||
MasterVolumeUp = card.MasterVolumeUp;
|
|
||||||
MasterVolumeDown = card.MasterVolumeDown;
|
|
||||||
SourceMuteOffFeedBack = card.SourceMuteOffFeedBack;
|
|
||||||
SourceMuteOnFeedBack = card.SourceMuteOnFeedBack;
|
|
||||||
SourceLevel = card.SourceLevel;
|
|
||||||
SourceLevelFeedBack = card.SourceLevelFeedBack;
|
|
||||||
SourceLevelUp = card.SourceLevelUp;
|
|
||||||
SourceLevelDown = card.SourceLevelDown;
|
|
||||||
|
|
||||||
MasterMuteOff = new Action(card.MasterMuteOff);
|
|
||||||
MasterMuteOn = new Action(card.MasterMuteOn);
|
|
||||||
SourceMuteOff = new Action(card.SourceMuteOff);
|
|
||||||
SourceMuteOn = new Action(card.SourceMuteOn);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dmps3AudioOutputBase(Card.Dmps3DmHdmiAudioOutput.Dmps3AudioOutputStream stream)
|
|
||||||
{
|
|
||||||
MasterMuteOffFeedBack = stream.MasterMuteOffFeedBack;
|
|
||||||
MasterMuteOnFeedBack = stream.MasterMuteOnFeedBack;
|
|
||||||
MasterVolume = stream.MasterVolume;
|
|
||||||
MasterVolumeFeedBack = stream.MasterVolumeFeedBack;
|
|
||||||
MasterVolumeUp = stream.MasterVolumeUp;
|
|
||||||
MasterVolumeDown = stream.MasterVolumeDown;
|
|
||||||
SourceMuteOffFeedBack = stream.SourceMuteOffFeedBack;
|
|
||||||
SourceMuteOnFeedBack = stream.SourceMuteOnFeedBack;
|
|
||||||
SourceLevel = stream.SourceLevel;
|
|
||||||
SourceLevelFeedBack = stream.SourceLevelFeedBack;
|
|
||||||
SourceLevelUp = stream.SourceLevelUp;
|
|
||||||
SourceLevelDown = stream.SourceLevelDown;
|
|
||||||
|
|
||||||
MasterMuteOff = new Action(stream.MasterMuteOff);
|
|
||||||
MasterMuteOn = new Action(stream.MasterMuteOn);
|
|
||||||
SourceMuteOff = new Action(stream.SourceMuteOff);
|
|
||||||
SourceMuteOn = new Action(stream.SourceMuteOn);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dmps3AudioOutputBase(Card.Dmps3DmHdmiAudioOutput.Dmps3DmHdmiOutputStream stream)
|
|
||||||
{
|
|
||||||
MasterMuteOffFeedBack = stream.MasterMuteOffFeedBack;
|
|
||||||
MasterMuteOnFeedBack = stream.MasterMuteOnFeedBack;
|
|
||||||
MasterVolume = stream.MasterVolume;
|
|
||||||
MasterVolumeFeedBack = stream.MasterVolumeFeedBack;
|
|
||||||
MasterVolumeUp = stream.MasterVolumeUp;
|
|
||||||
MasterVolumeDown = stream.MasterVolumeDown;
|
|
||||||
SourceMuteOffFeedBack = stream.SourceMuteOffFeedBack;
|
|
||||||
SourceMuteOnFeedBack = stream.SourceMuteOnFeedBack;
|
|
||||||
SourceLevel = stream.SourceLevel;
|
|
||||||
SourceLevelFeedBack = stream.SourceLevelFeedBack;
|
|
||||||
SourceLevelUp = stream.SourceLevelUp;
|
|
||||||
SourceLevelDown = stream.SourceLevelDown;
|
|
||||||
|
|
||||||
MasterMuteOff = new Action(stream.MasterMuteOff);
|
|
||||||
MasterMuteOn = new Action(stream.MasterMuteOn);
|
|
||||||
SourceMuteOff = new Action(stream.SourceMuteOff);
|
|
||||||
SourceMuteOn = new Action(stream.SourceMuteOn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum eDmpsLevelType
|
public enum eDmpsLevelType
|
||||||
{
|
{
|
||||||
Master,
|
Master,
|
||||||
|
|||||||
@@ -1,165 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Cards;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public class DmpsDigitalOutputController : Device, IRoutingNumeric, IHasFeedback
|
|
||||||
{
|
|
||||||
public Card.Dmps3OutputBase OutputCard { get; protected set; }
|
|
||||||
|
|
||||||
public RoutingInputPort None { get; protected set; }
|
|
||||||
public RoutingInputPort DigitalMix1 { get; protected set; }
|
|
||||||
public RoutingInputPort DigitalMix2 { get; protected set; }
|
|
||||||
public RoutingInputPort AudioFollowsVideo { get; protected set; }
|
|
||||||
|
|
||||||
public RoutingOutputPort DigitalAudioOut { get; protected set; }
|
|
||||||
|
|
||||||
public IntFeedback AudioSourceNumericFeedback { get; protected set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a list containing the Outputs that we want to expose.
|
|
||||||
/// </summary>
|
|
||||||
public FeedbackCollection<Feedback> Feedbacks { get; private set; }
|
|
||||||
|
|
||||||
public virtual RoutingPortCollection<RoutingInputPort> InputPorts
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new RoutingPortCollection<RoutingInputPort>
|
|
||||||
{
|
|
||||||
None,
|
|
||||||
DigitalMix1,
|
|
||||||
DigitalMix2,
|
|
||||||
AudioFollowsVideo
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new RoutingPortCollection<RoutingOutputPort> { DigitalAudioOut };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public DmpsDigitalOutputController(string key, string name, Card.Dmps3OutputBase outputCard)
|
|
||||||
: base(key, name)
|
|
||||||
{
|
|
||||||
Feedbacks = new FeedbackCollection<Feedback>();
|
|
||||||
OutputCard = outputCard;
|
|
||||||
|
|
||||||
if (outputCard is Card.Dmps3DmOutputBackend)
|
|
||||||
{
|
|
||||||
AudioSourceNumericFeedback = new IntFeedback(() =>
|
|
||||||
{
|
|
||||||
return (int)(outputCard as Card.Dmps3DmOutputBackend).AudioOutSourceDeviceFeedback;
|
|
||||||
});
|
|
||||||
DigitalAudioOut = new RoutingOutputPort(DmPortName.DmOut + OutputCard.Number, eRoutingSignalType.Audio, eRoutingPortConnectionType.DmCat, null, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (outputCard is Card.Dmps3HdmiOutputBackend)
|
|
||||||
{
|
|
||||||
AudioSourceNumericFeedback = new IntFeedback(() =>
|
|
||||||
{
|
|
||||||
return (int)(outputCard as Card.Dmps3HdmiOutputBackend).AudioOutSourceDeviceFeedback;
|
|
||||||
});
|
|
||||||
DigitalAudioOut = new RoutingOutputPort(DmPortName.HdmiOut + OutputCard.Number, eRoutingSignalType.Audio, eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
None = new RoutingInputPort("None", eRoutingSignalType.Audio, eRoutingPortConnectionType.DigitalAudio,
|
|
||||||
eDmps34KAudioOutSourceDevice.NoRoute, this);
|
|
||||||
DigitalMix1 = new RoutingInputPort("DigitalMix1", eRoutingSignalType.Audio, eRoutingPortConnectionType.DigitalAudio,
|
|
||||||
eDmps34KAudioOutSourceDevice.DigitalMixer1, this);
|
|
||||||
DigitalMix2 = new RoutingInputPort("DigitalMix2", eRoutingSignalType.Audio, eRoutingPortConnectionType.DigitalAudio,
|
|
||||||
eDmps34KAudioOutSourceDevice.DigitalMixer2, this);
|
|
||||||
AudioFollowsVideo = new RoutingInputPort("AudioFollowsVideo", eRoutingSignalType.Audio, eRoutingPortConnectionType.DigitalAudio,
|
|
||||||
eDmps34KAudioOutSourceDevice.AudioFollowsVideo, this);
|
|
||||||
|
|
||||||
AddToFeedbackList(AudioSourceNumericFeedback);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Adds feedback(s) to the list
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="newFbs"></param>
|
|
||||||
public void AddToFeedbackList(params Feedback[] newFbs)
|
|
||||||
{
|
|
||||||
foreach (var f in newFbs)
|
|
||||||
{
|
|
||||||
if (f != null)
|
|
||||||
{
|
|
||||||
if (!Feedbacks.Contains(f))
|
|
||||||
{
|
|
||||||
Feedbacks.Add(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
|
|
||||||
|
|
||||||
switch (input)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(None.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(DigitalMix1.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(DigitalMix2.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(AudioFollowsVideo.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IRouting Members
|
|
||||||
|
|
||||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
if ((signalType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
|
||||||
{
|
|
||||||
if (OutputCard is Card.Dmps3DmOutputBackend)
|
|
||||||
{
|
|
||||||
(OutputCard as Card.Dmps3DmOutputBackend).AudioOutSourceDevice = (eDmps34KAudioOutSourceDevice)inputSelector;
|
|
||||||
}
|
|
||||||
else if (OutputCard is Card.Dmps3HdmiOutputBackend)
|
|
||||||
{
|
|
||||||
(OutputCard as Card.Dmps3HdmiOutputBackend).AudioOutSourceDevice = (eDmps34KAudioOutSourceDevice)inputSelector;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -47,23 +47,16 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
try
|
if (InputCard.VideoSourceFeedback != eDmps3InputVideoSource.Auto)
|
||||||
|
return InputCard.VideoSourceFeedback;
|
||||||
|
else // auto
|
||||||
{
|
{
|
||||||
if (InputCard.VideoSourceFeedback != eDmps3InputVideoSource.Auto)
|
if (InputCard.HdmiInputPort.SyncDetectedFeedback.BoolValue)
|
||||||
return InputCard.VideoSourceFeedback;
|
return eDmps3InputVideoSource.Hdmi;
|
||||||
else // auto
|
else if (InputCard.VgaInputPort.SyncDetectedFeedback.BoolValue)
|
||||||
{
|
return eDmps3InputVideoSource.Vga;
|
||||||
if (InputCard.HdmiInputPort.SyncDetectedFeedback.BoolValue)
|
else
|
||||||
return eDmps3InputVideoSource.Hdmi;
|
return eDmps3InputVideoSource.Bnc;
|
||||||
else if (InputCard.VgaInputPort.SyncDetectedFeedback.BoolValue)
|
|
||||||
return eDmps3InputVideoSource.Vga;
|
|
||||||
else
|
|
||||||
return eDmps3InputVideoSource.Bnc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return eDmps3InputVideoSource.Bnc;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,9 +38,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
void Dmps_MicrophoneChange(MicrophoneBase mic, GenericEventArgs args)
|
void Dmps_MicrophoneChange(MicrophoneBase mic, GenericEventArgs args)
|
||||||
{
|
{
|
||||||
if (args.EventId == MicrophoneEventIds.VuFeedBackEventId)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Debug.Console(2, "Dmps Microphone Controller Index: {0} EventId: {1}", mic.ID, args.EventId.ToString());
|
Debug.Console(2, "Dmps Microphone Controller Index: {0} EventId: {1}", mic.ID, args.EventId.ToString());
|
||||||
|
|
||||||
if(Mics.ContainsKey(mic.ID))
|
if(Mics.ContainsKey(mic.ID))
|
||||||
|
|||||||
@@ -26,10 +26,13 @@ namespace PepperDash.Essentials.DM
|
|||||||
public CrestronControlSystem Dmps { get; set; }
|
public CrestronControlSystem Dmps { get; set; }
|
||||||
public ISystemControl SystemControl { get; private set; }
|
public ISystemControl SystemControl { get; private set; }
|
||||||
public bool? EnableRouting { get; private set; }
|
public bool? EnableRouting { get; private set; }
|
||||||
|
|
||||||
|
//Check if DMPS is a DMPS3-4K type for endpoint creation
|
||||||
|
public bool Dmps4kType { get; private set; }
|
||||||
|
|
||||||
//IroutingNumericEvent
|
//IroutingNumericEvent
|
||||||
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
||||||
|
|
||||||
//Feedback for DMPS System Control
|
//Feedback for DMPS System Control
|
||||||
public BoolFeedback SystemPowerOnFeedback { get; private set; }
|
public BoolFeedback SystemPowerOnFeedback { get; private set; }
|
||||||
public BoolFeedback SystemPowerOffFeedback { get; private set; }
|
public BoolFeedback SystemPowerOffFeedback { get; private set; }
|
||||||
@@ -59,7 +62,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
public Dictionary<uint, string> InputNames { get; set; }
|
public Dictionary<uint, string> InputNames { get; set; }
|
||||||
public Dictionary<uint, string> OutputNames { get; set; }
|
public Dictionary<uint, string> OutputNames { get; set; }
|
||||||
public Dictionary<uint, DmCardAudioOutputController> VolumeControls { get; private set; }
|
public Dictionary<uint, DmCardAudioOutputController> VolumeControls { get; private set; }
|
||||||
public Dictionary<uint, DmpsDigitalOutputController> DigitalAudioOutputs { get; private set; }
|
|
||||||
public DmpsMicrophoneController Microphones { get; private set; }
|
public DmpsMicrophoneController Microphones { get; private set; }
|
||||||
|
|
||||||
public const int RouteOffTime = 500;
|
public const int RouteOffTime = 500;
|
||||||
@@ -121,13 +123,14 @@ namespace PepperDash.Essentials.DM
|
|||||||
/// <param name="chassis"></param>
|
/// <param name="chassis"></param>
|
||||||
public DmpsRoutingController(string key, string name, ISystemControl systemControl)
|
public DmpsRoutingController(string key, string name, ISystemControl systemControl)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
Dmps = Global.ControlSystem;
|
Dmps = Global.ControlSystem;
|
||||||
|
|
||||||
switch (systemControl.SystemControlType)
|
switch (systemControl.SystemControlType)
|
||||||
{
|
{
|
||||||
case eSystemControlType.Dmps34K150CSystemControl:
|
case eSystemControlType.Dmps34K150CSystemControl:
|
||||||
SystemControl = systemControl as Dmps34K150CSystemControl;
|
SystemControl = systemControl as Dmps34K150CSystemControl;
|
||||||
|
Dmps4kType = true;
|
||||||
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
|
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
|
||||||
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
|
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
|
||||||
break;
|
break;
|
||||||
@@ -136,11 +139,13 @@ namespace PepperDash.Essentials.DM
|
|||||||
case eSystemControlType.Dmps34K300CSystemControl:
|
case eSystemControlType.Dmps34K300CSystemControl:
|
||||||
case eSystemControlType.Dmps34K350CSystemControl:
|
case eSystemControlType.Dmps34K350CSystemControl:
|
||||||
SystemControl = systemControl as Dmps34K300CSystemControl;
|
SystemControl = systemControl as Dmps34K300CSystemControl;
|
||||||
|
Dmps4kType = true;
|
||||||
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
|
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
|
||||||
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
|
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
SystemControl = systemControl as Dmps3SystemControl;
|
SystemControl = systemControl as Dmps3SystemControl;
|
||||||
|
Dmps4kType = false;
|
||||||
SystemPowerOnFeedback = new BoolFeedback(() =>
|
SystemPowerOnFeedback = new BoolFeedback(() =>
|
||||||
{
|
{
|
||||||
return ((Dmps3SystemControl)SystemControl).SystemPowerOnFeedBack.BoolValue;
|
return ((Dmps3SystemControl)SystemControl).SystemPowerOnFeedBack.BoolValue;
|
||||||
@@ -151,12 +156,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Debug.Console(1, this, "DMPS Type = {0}, 4K Type = {1}", systemControl.SystemControlType, Global.ControlSystemIsDmps4kType);
|
Debug.Console(1, this, "DMPS Type = {0}, 4K Type = {1}", systemControl.SystemControlType, Dmps4kType);
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
||||||
VolumeControls = new Dictionary<uint, DmCardAudioOutputController>();
|
VolumeControls = new Dictionary<uint, DmCardAudioOutputController>();
|
||||||
DigitalAudioOutputs = new Dictionary<uint, DmpsDigitalOutputController>();
|
|
||||||
TxDictionary = new Dictionary<uint, string>();
|
TxDictionary = new Dictionary<uint, string>();
|
||||||
RxDictionary = new Dictionary<uint, string>();
|
RxDictionary = new Dictionary<uint, string>();
|
||||||
|
|
||||||
@@ -248,15 +252,13 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var kvp in OutputNames)
|
foreach (var kvp in OutputNames)
|
||||||
{
|
{
|
||||||
var output = (Dmps.SwitcherOutputs[kvp.Key] as DMOutput);
|
var output = (Dmps.SwitcherOutputs[kvp.Key] as DMOutput);
|
||||||
if (output != null)
|
if (output != null && output.Name.Type != eSigType.NA)
|
||||||
{
|
{
|
||||||
if (output.Name.Supported && kvp.Value.Length > 0)
|
output.Name.StringValue = kvp.Value;
|
||||||
{
|
|
||||||
output.Name.StringValue = kvp.Value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -270,12 +272,9 @@ namespace PepperDash.Essentials.DM
|
|||||||
foreach (var kvp in InputNames)
|
foreach (var kvp in InputNames)
|
||||||
{
|
{
|
||||||
var input = (Dmps.SwitcherInputs[kvp.Key] as DMInput);
|
var input = (Dmps.SwitcherInputs[kvp.Key] as DMInput);
|
||||||
if (input != null)
|
if (input != null && input.Name.Type != eSigType.NA)
|
||||||
{
|
{
|
||||||
if (input.Name.Supported && kvp.Value.Length > 0)
|
input.Name.StringValue = kvp.Value;
|
||||||
{
|
|
||||||
input.Name.StringValue = kvp.Value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -383,21 +382,9 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
if (OutputNameFeedbacks[ioSlot] != null)
|
if (OutputNameFeedbacks[ioSlot] != null)
|
||||||
{
|
{
|
||||||
if (Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3DmOutput ||
|
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
|
||||||
Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3DmOutputBackend ||
|
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputVideoNames.JoinNumber + ioSlotJoin]);
|
||||||
Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3HdmiOutput ||
|
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.JoinNumber + ioSlotJoin]);
|
||||||
Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3HdmiOutputBackend ||
|
|
||||||
Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3DmHdmiAudioOutput)
|
|
||||||
{
|
|
||||||
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputVideoNames.JoinNumber + ioSlotJoin]);
|
|
||||||
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
|
|
||||||
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.JoinNumber + ioSlotJoin]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
|
|
||||||
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.JoinNumber + ioSlotJoin]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (OutputVideoRouteNameFeedbacks[ioSlot] != null)
|
if (OutputVideoRouteNameFeedbacks[ioSlot] != null)
|
||||||
{
|
{
|
||||||
@@ -419,11 +406,13 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
private void LinkInputsToApi(BasicTriList trilist, DmpsRoutingControllerJoinMap joinMap)
|
private void LinkInputsToApi(BasicTriList trilist, DmpsRoutingControllerJoinMap joinMap)
|
||||||
{
|
{
|
||||||
if (Global.ControlSystemIsDmps4k3xxType)
|
if (Dmps4kType)
|
||||||
{
|
{
|
||||||
//Add DMPS-4K mixer input names to end of inputs
|
//DMPS-4K audio inputs 1-5 are aux inputs
|
||||||
trilist.StringInput[joinMap.InputAudioNames.JoinNumber + (uint)Dmps.SwitcherInputs.Count + 4].StringValue = "Digital Mixer 1";
|
for (uint i = 1; i <= 5; i++)
|
||||||
trilist.StringInput[joinMap.InputAudioNames.JoinNumber + (uint)Dmps.SwitcherInputs.Count + 5].StringValue = "Digital Mixer 2";
|
{
|
||||||
|
trilist.StringInput[joinMap.InputAudioNames.JoinNumber + i - 1].StringValue = String.Format("Aux Input {0}", i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (uint i = 1; i <= Dmps.SwitcherInputs.Count; i++)
|
for (uint i = 1; i <= Dmps.SwitcherInputs.Count; i++)
|
||||||
{
|
{
|
||||||
@@ -438,19 +427,18 @@ namespace PepperDash.Essentials.DM
|
|||||||
trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber + ioSlotJoin]);
|
trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber + ioSlotJoin]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (InputNameFeedbacks.ContainsKey(ioSlot) && InputNameFeedbacks[ioSlot] != null)
|
if (InputNameFeedbacks.ContainsKey(ioSlot) && InputNameFeedbacks[ioSlot] != null)
|
||||||
{
|
{
|
||||||
if (Dmps.SwitcherInputs[ioSlot] is Card.Dmps3AnalogAudioInput)
|
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + ioSlotJoin]);
|
||||||
|
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputVideoNames.JoinNumber + ioSlotJoin]);
|
||||||
|
|
||||||
|
if (Dmps4kType)
|
||||||
{
|
{
|
||||||
for (uint j = ioSlot; j < ioSlot + 5; j++)
|
//DMPS-4K Audio Inputs are offset by 5
|
||||||
{
|
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + ioSlotJoin + 5]);
|
||||||
InputNameFeedbacks[j].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + j - 1]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + ioSlotJoin]);
|
|
||||||
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputVideoNames.JoinNumber + ioSlotJoin]);
|
|
||||||
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + ioSlotJoin]);
|
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + ioSlotJoin]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -493,143 +481,69 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
foreach (var card in Dmps.SwitcherOutputs)
|
foreach (var card in Dmps.SwitcherOutputs)
|
||||||
{
|
{
|
||||||
try
|
Debug.Console(1, this, "Output Card Type: {0}", card.CardInputOutputType);
|
||||||
|
|
||||||
|
var outputCard = card as DMOutput;
|
||||||
|
|
||||||
|
if (outputCard == null)
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Output Card Type: {0}", card.CardInputOutputType);
|
Debug.Console(1, this, "Output card {0} is not a DMOutput", card.CardInputOutputType);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
var outputCard = card as DMOutput;
|
Debug.Console(1, this, "Adding Output Card Number {0} Type: {1}", outputCard.Number, outputCard.CardInputOutputType.ToString());
|
||||||
|
VideoOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
|
||||||
if (outputCard == null)
|
{
|
||||||
|
if (outputCard.VideoOutFeedback != null) { return (ushort)outputCard.VideoOutFeedback.Number; }
|
||||||
|
return 0;
|
||||||
|
;
|
||||||
|
});
|
||||||
|
AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
Debug.Console(1, this, "Output card {0} is not a DMOutput", card.CardInputOutputType);
|
if (outputCard.AudioOutFeedback != null)
|
||||||
continue;
|
{
|
||||||
}
|
return (ushort) outputCard.AudioOutFeedback.Number;
|
||||||
|
}
|
||||||
Debug.Console(1, this, "Adding Output Card Number {0} Type: {1}", outputCard.Number, outputCard.CardInputOutputType.ToString());
|
|
||||||
VideoOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
|
|
||||||
{
|
|
||||||
if (outputCard.VideoOutFeedback != null) { return (ushort)outputCard.VideoOutFeedback.Number; }
|
|
||||||
return 0;
|
return 0;
|
||||||
;
|
}
|
||||||
});
|
catch (NotSupportedException)
|
||||||
AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
|
|
||||||
{
|
{
|
||||||
if (!Global.ControlSystemIsDmps4k3xxType)
|
return (ushort) outputCard.AudioOutSourceFeedback;
|
||||||
{
|
}
|
||||||
if (outputCard.AudioOutFeedback != null)
|
});
|
||||||
{
|
|
||||||
return (ushort)outputCard.AudioOutFeedback.Number;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
|
OutputNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
|
||||||
{
|
|
||||||
//Special cases for DMPS-4K digital audio output
|
|
||||||
if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 0)
|
|
||||||
return 0;
|
|
||||||
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 1)
|
|
||||||
return (ushort)Dmps.SwitcherInputs.Count + 5;
|
|
||||||
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 2)
|
|
||||||
return (ushort)Dmps.SwitcherInputs.Count + 6;
|
|
||||||
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 3)
|
|
||||||
return (ushort)outputCard.VideoOutFeedback.Number;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else if (outputCard.AudioOutSourceFeedback == eDmps34KAudioOutSource.NoRoute)
|
|
||||||
{
|
|
||||||
//Fixes for weird audio indexing on DMPS3-4K
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else if (outputCard.AudioOutSourceFeedback == eDmps34KAudioOutSource.AirMedia8)
|
|
||||||
{
|
|
||||||
//Fixes for weird audio indexing on DMPS3-4K
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
else if (outputCard.AudioOutSourceFeedback == eDmps34KAudioOutSource.AirMedia9)
|
|
||||||
{
|
|
||||||
//Fixes for weird audio indexing on DMPS3-4K
|
|
||||||
return 9;
|
|
||||||
}
|
|
||||||
else if ((ushort)outputCard.AudioOutSourceFeedback <= 5)
|
|
||||||
{
|
|
||||||
//Move analog inputs to after regular dm cards
|
|
||||||
return (ushort)outputCard.AudioOutSourceFeedback + (ushort)Dmps.SwitcherInputs.Count - 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Fixes for weird audio indexing on DMPS3-4K
|
|
||||||
return (ushort)outputCard.AudioOutSourceFeedback - 5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
OutputNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
|
|
||||||
{
|
|
||||||
if(OutputNames.ContainsKey(outputCard.Number))
|
|
||||||
{
|
|
||||||
return OutputNames[outputCard.Number];
|
|
||||||
}
|
|
||||||
else if (outputCard.NameFeedback != null && outputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(outputCard.NameFeedback.StringValue))
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Output Card {0} Name: {1}", outputCard.Number, outputCard.NameFeedback.StringValue);
|
|
||||||
return outputCard.NameFeedback.StringValue;
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
});
|
|
||||||
|
|
||||||
OutputVideoRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
|
|
||||||
{
|
|
||||||
if (outputCard.VideoOutFeedback != null && outputCard.VideoOutFeedback.NameFeedback != null)
|
|
||||||
{
|
|
||||||
return outputCard.VideoOutFeedback.NameFeedback.StringValue;
|
|
||||||
}
|
|
||||||
return NoRouteText;
|
|
||||||
});
|
|
||||||
OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
|
|
||||||
{
|
|
||||||
if (!Global.ControlSystemIsDmps4k3xxType)
|
|
||||||
{
|
|
||||||
if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null)
|
|
||||||
{
|
|
||||||
return outputCard.AudioOutFeedback.NameFeedback.StringValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
|
|
||||||
{
|
|
||||||
//Special cases for DMPS-4K digital audio output
|
|
||||||
if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 0)
|
|
||||||
return NoRouteText;
|
|
||||||
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 1)
|
|
||||||
return "Digital Mix 1";
|
|
||||||
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 2)
|
|
||||||
return "Digital Mix 2";
|
|
||||||
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 3)
|
|
||||||
return outputCard.VideoOutFeedback.NameFeedback.StringValue;
|
|
||||||
else
|
|
||||||
return NoRouteText;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return outputCard.AudioOutSourceFeedback.ToString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NoRouteText;
|
|
||||||
});
|
|
||||||
|
|
||||||
OutputEndpointOnlineFeedbacks[outputCard.Number] = new BoolFeedback(() => outputCard.EndpointOnlineFeedback);
|
|
||||||
|
|
||||||
AddOutputCard(outputCard.Number, outputCard);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
{
|
||||||
Debug.LogError(Debug.ErrorLogLevel.Error, string.Format("DMPS Controller exception creating output card: {0}", ex));
|
if (outputCard.NameFeedback != null && outputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(outputCard.NameFeedback.StringValue))
|
||||||
}
|
{
|
||||||
|
Debug.Console(2, this, "Output Card {0} Name: {1}", outputCard.Number, outputCard.NameFeedback.StringValue);
|
||||||
|
return outputCard.NameFeedback.StringValue;
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
});
|
||||||
|
|
||||||
|
OutputVideoRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
|
||||||
|
{
|
||||||
|
if (outputCard.VideoOutFeedback != null && outputCard.VideoOutFeedback.NameFeedback != null)
|
||||||
|
{
|
||||||
|
return outputCard.VideoOutFeedback.NameFeedback.StringValue;
|
||||||
|
}
|
||||||
|
return NoRouteText;
|
||||||
|
});
|
||||||
|
OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
|
||||||
|
{
|
||||||
|
if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null)
|
||||||
|
{
|
||||||
|
return outputCard.AudioOutFeedback.NameFeedback.StringValue;
|
||||||
|
}
|
||||||
|
return NoRouteText;
|
||||||
|
});
|
||||||
|
|
||||||
|
OutputEndpointOnlineFeedbacks[outputCard.Number] = new BoolFeedback(() => outputCard.EndpointOnlineFeedback);
|
||||||
|
|
||||||
|
AddOutputCard(outputCard.Number, outputCard);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -655,15 +569,13 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
InputNameFeedbacks[inputCard.Number] = new StringFeedback(() =>
|
InputNameFeedbacks[inputCard.Number] = new StringFeedback(() =>
|
||||||
{
|
{
|
||||||
if (InputNames.ContainsKey(inputCard.Number))
|
if (inputCard.NameFeedback != null && inputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(inputCard.NameFeedback.StringValue))
|
||||||
{
|
|
||||||
return InputNames[inputCard.Number];
|
|
||||||
}
|
|
||||||
else if (inputCard.NameFeedback != null && inputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(inputCard.NameFeedback.StringValue))
|
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "Input Card {0} Name: {1}", inputCard.Number, inputCard.NameFeedback.StringValue);
|
Debug.Console(2, this, "Input Card {0} Name: {1}", inputCard.Number, inputCard.NameFeedback.StringValue);
|
||||||
return inputCard.NameFeedback.StringValue;
|
return inputCard.NameFeedback.StringValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Debug.Console(2, this, "Input Card {0} Name is null", inputCard.Number);
|
||||||
return "";
|
return "";
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -697,6 +609,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
else if (inputCard is Card.Dmps3HdmiInput)
|
else if (inputCard is Card.Dmps3HdmiInput)
|
||||||
{
|
{
|
||||||
var hdmiInputCard = inputCard as Card.Dmps3HdmiInput;
|
var hdmiInputCard = inputCard as Card.Dmps3HdmiInput;
|
||||||
|
|
||||||
var cecPort = hdmiInputCard.HdmiInputPort;
|
var cecPort = hdmiInputCard.HdmiInputPort;
|
||||||
|
|
||||||
AddInputPortWithDebug(number, string.Format("HdmiIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, cecPort);
|
AddInputPortWithDebug(number, string.Format("HdmiIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, cecPort);
|
||||||
@@ -728,37 +641,17 @@ namespace PepperDash.Essentials.DM
|
|||||||
else if (inputCard is Card.Dmps3DmInput)
|
else if (inputCard is Card.Dmps3DmInput)
|
||||||
{
|
{
|
||||||
var hdmiInputCard = inputCard as Card.Dmps3DmInput;
|
var hdmiInputCard = inputCard as Card.Dmps3DmInput;
|
||||||
|
|
||||||
var cecPort = hdmiInputCard.DmInputPort;
|
var cecPort = hdmiInputCard.DmInputPort;
|
||||||
|
|
||||||
AddInputPortWithDebug(number, string.Format("DmIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, cecPort);
|
AddInputPortWithDebug(number, string.Format("DmIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, cecPort);
|
||||||
}
|
}
|
||||||
else if (inputCard is Card.Dmps3VgaInput)
|
|
||||||
{
|
|
||||||
AddInputPortWithDebug(number, string.Format("VgaIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Vga);
|
|
||||||
}
|
|
||||||
else if (inputCard is Card.Dmps3AirMediaInput)
|
else if (inputCard is Card.Dmps3AirMediaInput)
|
||||||
{
|
{
|
||||||
|
var airMediaInputCard = inputCard as Card.Dmps3AirMediaInput;
|
||||||
|
|
||||||
AddInputPortWithDebug(number, string.Format("AirMediaIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Streaming);
|
AddInputPortWithDebug(number, string.Format("AirMediaIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Streaming);
|
||||||
}
|
}
|
||||||
else if (inputCard is Card.Dmps3AnalogAudioInput)
|
|
||||||
{
|
|
||||||
for (uint i = 0; i <= 4; i++)
|
|
||||||
{
|
|
||||||
uint j = i + 1;
|
|
||||||
uint input = i + number;
|
|
||||||
InputNameFeedbacks[input] = new StringFeedback(() =>
|
|
||||||
{
|
|
||||||
if (InputNames.ContainsKey(input))
|
|
||||||
{
|
|
||||||
return InputNames[input];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return String.Format("Aux Input {0}", j);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -804,44 +697,22 @@ namespace PepperDash.Essentials.DM
|
|||||||
var cecPort = hdmiOutputCard.HdmiOutputPort;
|
var cecPort = hdmiOutputCard.HdmiOutputPort;
|
||||||
|
|
||||||
AddHdmiOutputPort(number, cecPort);
|
AddHdmiOutputPort(number, cecPort);
|
||||||
|
|
||||||
var audioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number), string.Format("Hdmi Audio Output {0}", number), outputCard as Card.Dmps3HdmiOutput);
|
|
||||||
DeviceManager.AddDevice(audioOutput);
|
|
||||||
}
|
}
|
||||||
else if (outputCard is Card.Dmps3HdmiOutputBackend)
|
else if (outputCard is Card.Dmps3HdmiOutputBackend)
|
||||||
{
|
{
|
||||||
var hdmiOutputCard = outputCard as Card.Dmps3HdmiOutputBackend;
|
var hdmiOutputCard = outputCard as Card.Dmps3HdmiOutputBackend;
|
||||||
|
|
||||||
var cecPort = hdmiOutputCard.HdmiOutputPort;
|
var cecPort = hdmiOutputCard.HdmiOutputPort;
|
||||||
|
|
||||||
AddHdmiOutputPort(number, cecPort);
|
AddHdmiOutputPort(number, cecPort);
|
||||||
var audioOutput = new DmpsDigitalOutputController(string.Format("processor-avRouting-HdmiAudioOut{0}", number), string.Format("Hdmi Audio Output {0} Router", number), hdmiOutputCard);
|
|
||||||
DigitalAudioOutputs.Add(number, audioOutput);
|
|
||||||
DeviceManager.AddDevice(audioOutput);
|
|
||||||
}
|
}
|
||||||
else if (outputCard is Card.Dmps3DmOutput)
|
else if (outputCard is Card.Dmps3DmOutput)
|
||||||
{
|
{
|
||||||
AddDmOutputPort(number);
|
AddDmOutputPort(number);
|
||||||
var audioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number), string.Format("Dm Audio Output {0}", number), outputCard as Card.Dmps3DmOutput);
|
|
||||||
DeviceManager.AddDevice(audioOutput);
|
|
||||||
}
|
}
|
||||||
else if (outputCard is Card.Dmps3DmOutputBackend)
|
else if (outputCard is Card.Dmps3DmOutputBackend)
|
||||||
{
|
{
|
||||||
AddDmOutputPort(number);
|
AddDmOutputPort(number);
|
||||||
var audioOutput = new DmpsDigitalOutputController(string.Format("processor-avRouting-DmAudioOut{0}", number), string.Format("Dm Audio Output {0} Router", number), outputCard as Card.Dmps3DmOutputBackend);
|
|
||||||
DigitalAudioOutputs.Add(number, audioOutput);
|
|
||||||
DeviceManager.AddDevice(audioOutput);
|
|
||||||
}
|
|
||||||
else if (outputCard is Card.Dmps3DmHdmiAudioOutput)
|
|
||||||
{
|
|
||||||
var hdmiOutputCard = outputCard as Card.Dmps3DmHdmiAudioOutput;
|
|
||||||
var cecPort = hdmiOutputCard.HdmiOutputPort;
|
|
||||||
AddHdmiOutputPort(number, cecPort);
|
|
||||||
AddDmOutputPort(number);
|
|
||||||
AddAudioOnlyOutputPort(number, "Program");
|
|
||||||
|
|
||||||
var audioOutput = new DmpsAudioOutputController(string.Format("processor-programAudioOutput", number), string.Format("Program Audio Output {0}", number), hdmiOutputCard, hdmiOutputCard.AudioOutputStream);
|
|
||||||
DeviceManager.AddDevice(audioOutput);
|
|
||||||
var digitalAudioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number), string.Format("Hdmi Audio Output {0}", number), hdmiOutputCard, hdmiOutputCard.DmHdmiOutputStream);
|
|
||||||
DeviceManager.AddDevice(digitalAudioOutput);
|
|
||||||
}
|
}
|
||||||
else if (outputCard is Card.Dmps3ProgramOutput)
|
else if (outputCard is Card.Dmps3ProgramOutput)
|
||||||
{
|
{
|
||||||
@@ -856,22 +727,22 @@ namespace PepperDash.Essentials.DM
|
|||||||
switch (outputCard.CardInputOutputType)
|
switch (outputCard.CardInputOutputType)
|
||||||
{
|
{
|
||||||
case eCardInputOutputType.Dmps3Aux1Output:
|
case eCardInputOutputType.Dmps3Aux1Output:
|
||||||
{
|
{
|
||||||
AddAudioOnlyOutputPort(number, "Aux1");
|
AddAudioOnlyOutputPort(number, "Aux1");
|
||||||
|
|
||||||
var aux1Output = new DmpsAudioOutputController(string.Format("processor-aux1AudioOutput"), "Aux1 Audio Output", outputCard as Card.Dmps3Aux1Output);
|
var aux1Output = new DmpsAudioOutputController(string.Format("processor-aux1AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3Aux1Output);
|
||||||
|
|
||||||
DeviceManager.AddDevice(aux1Output);
|
DeviceManager.AddDevice(aux1Output);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case eCardInputOutputType.Dmps3Aux2Output:
|
case eCardInputOutputType.Dmps3Aux2Output:
|
||||||
{
|
{
|
||||||
AddAudioOnlyOutputPort(number, "Aux2");
|
AddAudioOnlyOutputPort(number, "Aux2");
|
||||||
|
|
||||||
var aux2Output = new DmpsAudioOutputController(string.Format("processor-aux2AudioOutput"), "Aux2 Audio Output", outputCard as Card.Dmps3Aux2Output);
|
var aux2Output = new DmpsAudioOutputController(string.Format("processor-aux2AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3Aux2Output);
|
||||||
|
|
||||||
DeviceManager.AddDevice(aux2Output);
|
DeviceManager.AddDevice(aux2Output);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -895,10 +766,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
AddAudioOnlyOutputPort(number, "Dialer");
|
AddAudioOnlyOutputPort(number, "Dialer");
|
||||||
}
|
}
|
||||||
else if (outputCard is Card.Dmps3AecOutput)
|
|
||||||
{
|
|
||||||
AddAudioOnlyOutputPort(number, "Aec");
|
|
||||||
}
|
|
||||||
else if (outputCard is Card.Dmps3DigitalMixOutput)
|
else if (outputCard is Card.Dmps3DigitalMixOutput)
|
||||||
{
|
{
|
||||||
if (number == (uint)CrestronControlSystem.eDmps34K250COutputs.Mix1
|
if (number == (uint)CrestronControlSystem.eDmps34K250COutputs.Mix1
|
||||||
@@ -909,9 +776,10 @@ namespace PepperDash.Essentials.DM
|
|||||||
|| number == (uint)CrestronControlSystem.eDmps34K300COutputs.Mix2
|
|| number == (uint)CrestronControlSystem.eDmps34K300COutputs.Mix2
|
||||||
|| number == (uint)CrestronControlSystem.eDmps34K350COutputs.Mix2)
|
|| number == (uint)CrestronControlSystem.eDmps34K350COutputs.Mix2)
|
||||||
AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps34K250COutputs.Mix2.ToString());
|
AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps34K250COutputs.Mix2.ToString());
|
||||||
|
}
|
||||||
var audioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number % 2 + 1), string.Format("Digital Audio Mix {0}", number % 2 + 1), outputCard as Card.Dmps3DigitalMixOutput);
|
else if (outputCard is Card.Dmps3AecOutput)
|
||||||
DeviceManager.AddDevice(audioOutput);
|
{
|
||||||
|
AddAudioOnlyOutputPort(number, "Aec");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -983,7 +851,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
void Dmps_DMInputChange(Switch device, DMInputEventArgs args)
|
void Dmps_DMInputChange(Switch device, DMInputEventArgs args)
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "DMInputChange Input: {0} EventId: {1}", args.Number, args.EventId.ToString());
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
switch (args.EventId)
|
switch (args.EventId)
|
||||||
@@ -994,12 +861,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
|
InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case (DMInputEventIds.EndpointOnlineEventId):
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "DM Input EndpointOnlineEventId for input: {0}. State: {1}", args.Number, device.Inputs[args.Number].EndpointOnlineFeedback);
|
|
||||||
InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case (DMInputEventIds.VideoDetectedEventId):
|
case (DMInputEventIds.VideoDetectedEventId):
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "DM Input {0} VideoDetectedEventId", args.Number);
|
Debug.Console(2, this, "DM Input {0} VideoDetectedEventId", args.Number);
|
||||||
@@ -1024,13 +885,14 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
void Dmps_DMOutputChange(Switch device, DMOutputEventArgs args)
|
void Dmps_DMOutputChange(Switch device, DMOutputEventArgs args)
|
||||||
{
|
{
|
||||||
|
Debug.Console(2, this, "DMOutputChange Output: {0} EventId: {1}", args.Number, args.EventId.ToString());
|
||||||
|
|
||||||
if (args.EventId == DMOutputEventIds.OutputVuFeedBackEventId)
|
if (args.EventId == DMOutputEventIds.OutputVuFeedBackEventId)
|
||||||
{
|
{
|
||||||
//Frequently called event that isn't needed
|
//Frequently called event that isn't needed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.Console(2, this, "DMOutputChange Output: {0} EventId: {1}", args.Number, args.EventId.ToString());
|
|
||||||
var output = args.Number;
|
var output = args.Number;
|
||||||
|
|
||||||
DMOutput outputCard = Dmps.SwitcherOutputs[output] as DMOutput;
|
DMOutput outputCard = Dmps.SwitcherOutputs[output] as DMOutput;
|
||||||
@@ -1044,11 +906,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
OutputEndpointOnlineFeedbacks[output].FireUpdate();
|
OutputEndpointOnlineFeedbacks[output].FireUpdate();
|
||||||
}
|
}
|
||||||
else if (args.EventId == DMOutputEventIds.EndpointOnlineEventId
|
|
||||||
&& OutputEndpointOnlineFeedbacks.ContainsKey(output))
|
|
||||||
{
|
|
||||||
OutputEndpointOnlineFeedbacks[output].FireUpdate();
|
|
||||||
}
|
|
||||||
else if (args.EventId == DMOutputEventIds.VideoOutEventId)
|
else if (args.EventId == DMOutputEventIds.VideoOutEventId)
|
||||||
{
|
{
|
||||||
if (outputCard != null && outputCard.VideoOutFeedback != null)
|
if (outputCard != null && outputCard.VideoOutFeedback != null)
|
||||||
@@ -1063,68 +920,41 @@ namespace PepperDash.Essentials.DM
|
|||||||
{
|
{
|
||||||
OutputVideoRouteNameFeedbacks[output].FireUpdate();
|
OutputVideoRouteNameFeedbacks[output].FireUpdate();
|
||||||
}
|
}
|
||||||
if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
|
|
||||||
{
|
|
||||||
if (AudioOutputFeedbacks.ContainsKey(output))
|
|
||||||
{
|
|
||||||
AudioOutputFeedbacks[output].FireUpdate();
|
|
||||||
}
|
|
||||||
if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
|
|
||||||
{
|
|
||||||
OutputAudioRouteNameFeedbacks[output].FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (args.EventId == DMOutputEventIds.AudioOutEventId)
|
else if (args.EventId == DMOutputEventIds.AudioOutEventId)
|
||||||
{
|
{
|
||||||
if (!Global.ControlSystemIsDmps4k3xxType)
|
try
|
||||||
{
|
{
|
||||||
if (outputCard != null && outputCard.AudioOutFeedback != null)
|
if (outputCard != null && outputCard.AudioOutFeedback != null)
|
||||||
{
|
{
|
||||||
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", this.Name,
|
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", this.Name,
|
||||||
outputCard.AudioOutFeedback.Number, output);
|
outputCard.AudioOutFeedback.Number, output);
|
||||||
}
|
}
|
||||||
|
if (AudioOutputFeedbacks.ContainsKey(output))
|
||||||
|
{
|
||||||
|
AudioOutputFeedbacks[output].FireUpdate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
catch (NotSupportedException)
|
||||||
{
|
{
|
||||||
if (outputCard != null)
|
if (outputCard != null)
|
||||||
{
|
{
|
||||||
if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
|
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", Name,
|
||||||
{
|
outputCard.AudioOutSourceFeedback, output);
|
||||||
DigitalAudioOutputs[output].AudioSourceNumericFeedback.FireUpdate();
|
}
|
||||||
}
|
if (AudioOutputFeedbacks.ContainsKey(output))
|
||||||
else
|
{
|
||||||
{
|
AudioOutputFeedbacks[output].FireUpdate();
|
||||||
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", Name,
|
|
||||||
outputCard.AudioOutSourceFeedback, output);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (AudioOutputFeedbacks.ContainsKey(output))
|
|
||||||
{
|
|
||||||
AudioOutputFeedbacks[output].FireUpdate();
|
|
||||||
}
|
|
||||||
if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
|
|
||||||
{
|
|
||||||
OutputAudioRouteNameFeedbacks[output].FireUpdate();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (args.EventId == DMOutputEventIds.OutputNameEventId
|
else if (args.EventId == DMOutputEventIds.OutputNameEventId
|
||||||
&& OutputNameFeedbacks.ContainsKey(output))
|
&& OutputNameFeedbacks.ContainsKey(output))
|
||||||
{
|
{
|
||||||
|
Debug.Console(2, this, "DM Output {0} NameFeedbackEventId", output);
|
||||||
OutputNameFeedbacks[output].FireUpdate();
|
OutputNameFeedbacks[output].FireUpdate();
|
||||||
}
|
}
|
||||||
else if (args.EventId == DMOutputEventIds.DigitalMixerAudioSourceFeedBackEventId)
|
|
||||||
{
|
|
||||||
if (AudioOutputFeedbacks.ContainsKey(output))
|
|
||||||
{
|
|
||||||
AudioOutputFeedbacks[output].FireUpdate();
|
|
||||||
}
|
|
||||||
if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
|
|
||||||
{
|
|
||||||
OutputAudioRouteNameFeedbacks[output].FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Dmps_DMSystemChange(Switch device, DMSystemEventArgs args)
|
void Dmps_DMSystemChange(Switch device, DMSystemEventArgs args)
|
||||||
@@ -1172,6 +1002,9 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
Debug.Console(2, this, "Attempting a DM route from input {0} to output {1} {2}", inputSelector, outputSelector, sigType);
|
Debug.Console(2, this, "Attempting a DM route from input {0} to output {1} {2}", inputSelector, outputSelector, sigType);
|
||||||
|
|
||||||
|
//var input = Convert.ToUInt32(inputSelector); // Cast can sometimes fail
|
||||||
|
//var output = Convert.ToUInt32(outputSelector);
|
||||||
|
|
||||||
var input = inputSelector as DMInput;
|
var input = inputSelector as DMInput;
|
||||||
var output = outputSelector as DMOutput;
|
var output = outputSelector as DMOutput;
|
||||||
|
|
||||||
@@ -1189,7 +1022,7 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
if (input == null || (input.Number <= Dmps.NumberOfSwitcherInputs && output.Number <= Dmps.NumberOfSwitcherOutputs &&
|
if (input == null || (input.Number <= Dmps.NumberOfSwitcherInputs && output.Number <= Dmps.NumberOfSwitcherOutputs &&
|
||||||
sigTypeIsUsbOrVideo) ||
|
sigTypeIsUsbOrVideo) ||
|
||||||
(input.Number <= (Dmps.NumberOfSwitcherInputs) && output.Number <= Dmps.NumberOfSwitcherOutputs &&
|
(input.Number <= Dmps.NumberOfSwitcherInputs + 5 && output.Number <= Dmps.NumberOfSwitcherOutputs &&
|
||||||
(sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio))
|
(sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio))
|
||||||
{
|
{
|
||||||
// Check to see if there's an off timer waiting on this and if so, cancel
|
// Check to see if there's an off timer waiting on this and if so, cancel
|
||||||
@@ -1208,6 +1041,11 @@ namespace PepperDash.Essentials.DM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//DMOutput dmOutputCard = output == 0 ? null : Dmps.SwitcherOutputs[output] as DMOutput;
|
||||||
|
|
||||||
|
//if (inCard != null)
|
||||||
|
//{
|
||||||
// NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
|
// NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
|
||||||
if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
||||||
{
|
{
|
||||||
@@ -1216,34 +1054,19 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
||||||
{
|
{
|
||||||
if (!Global.ControlSystemIsDmps4k3xxType)
|
try
|
||||||
{
|
{
|
||||||
output.AudioOut = input;
|
output.AudioOut = input;
|
||||||
}
|
}
|
||||||
else
|
catch (NotSupportedException)
|
||||||
{
|
{
|
||||||
if (input == null)
|
Debug.Console(1, this, "Routing input {0} audio to output {1}",
|
||||||
{
|
(eDmps34KAudioOutSource) (input == null ? 0 : input.Number),
|
||||||
output.AudioOutSource = eDmps34KAudioOutSource.NoRoute;
|
(CrestronControlSystem.eDmps34K350COutputs) output.Number);
|
||||||
}
|
|
||||||
else if (input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaInput || input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaNoStreamingInput)
|
output.AudioOutSource = input == null
|
||||||
{
|
? eDmps34KAudioOutSource.NoRoute
|
||||||
//Special case for weird AirMedia indexing
|
: (eDmps34KAudioOutSource)input.Number;
|
||||||
if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl)
|
|
||||||
output.AudioOutSource = eDmps34KAudioOutSource.AirMedia8;
|
|
||||||
else if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
|
|
||||||
output.AudioOutSource = eDmps34KAudioOutSource.AirMedia9;
|
|
||||||
}
|
|
||||||
else if (input.Number < Dmps.SwitcherInputs.Count)
|
|
||||||
{
|
|
||||||
//Shift video inputs by 5 for weird DMPS3-4K indexing
|
|
||||||
output.AudioOutSource = (eDmps34KAudioOutSource)(input.Number + 5);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Shift analog inputs back to inputs 1-5
|
|
||||||
output.AudioOutSource = (eDmps34KAudioOutSource)(input.Number - Dmps.SwitcherInputs.Count + 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1277,91 +1100,10 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
|
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
|
||||||
{
|
{
|
||||||
if (EnableRouting == false)
|
var input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector];
|
||||||
{
|
var output = Dmps.SwitcherOutputs[outputSelector];
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Attempting a numeric switch from input {0} to output {1} {2}", inputSelector, outputSelector, sigType);
|
ExecuteSwitch(input, output, sigType);
|
||||||
|
|
||||||
if((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
|
||||||
{
|
|
||||||
if (inputSelector <= Dmps.SwitcherInputs.Count && outputSelector <= Dmps.SwitcherOutputs.Count)
|
|
||||||
{
|
|
||||||
var input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector];
|
|
||||||
var output = Dmps.SwitcherOutputs[outputSelector];
|
|
||||||
|
|
||||||
ExecuteSwitch(input, output, sigType);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
|
||||||
{
|
|
||||||
//Special case for DMPS-4K digital audio output
|
|
||||||
if (Global.ControlSystemIsDmps4k3xxType)
|
|
||||||
{
|
|
||||||
if (DigitalAudioOutputs.ContainsKey(outputSelector))
|
|
||||||
{
|
|
||||||
if (inputSelector == 0) //Clear action
|
|
||||||
{
|
|
||||||
DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(0, 0, eRoutingSignalType.Audio);
|
|
||||||
}
|
|
||||||
else if (inputSelector < Dmps.SwitcherInputs.Count) //DMPS-4K video inputs, set to audio follows video
|
|
||||||
{
|
|
||||||
DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(3, 0, eRoutingSignalType.Audio);
|
|
||||||
//Force video route since it is now set so audio follows video
|
|
||||||
ExecuteNumericSwitch(inputSelector, outputSelector, eRoutingSignalType.Video);
|
|
||||||
}
|
|
||||||
else if (inputSelector == Dmps.SwitcherInputs.Count + 5)
|
|
||||||
{
|
|
||||||
//Set to mix 1
|
|
||||||
DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(1, 0, eRoutingSignalType.Audio);
|
|
||||||
}
|
|
||||||
else if (inputSelector == Dmps.SwitcherInputs.Count + 6)
|
|
||||||
{
|
|
||||||
//Set to mix 2
|
|
||||||
DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(2, 0, eRoutingSignalType.Audio);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (inputSelector <= (Dmps.SwitcherInputs.Count + 4) && outputSelector <= Dmps.SwitcherOutputs.Count)
|
|
||||||
{
|
|
||||||
var output = Dmps.SwitcherOutputs[outputSelector] as DMOutput;
|
|
||||||
if (inputSelector == 0)
|
|
||||||
{
|
|
||||||
output.AudioOutSource = eDmps34KAudioOutSource.NoRoute;
|
|
||||||
}
|
|
||||||
else if(inputSelector >= (Dmps.SwitcherInputs.Count))
|
|
||||||
{
|
|
||||||
//Shift analog inputs back to inputs 1-5
|
|
||||||
Debug.Console(1, this, "Attempting analog route input {0} to output {1}", inputSelector - Dmps.SwitcherInputs.Count + 1, outputSelector);
|
|
||||||
output.AudioOutSource = (eDmps34KAudioOutSource)(inputSelector - Dmps.SwitcherInputs.Count + 1);
|
|
||||||
}
|
|
||||||
else if (inputSelector < Dmps.SwitcherInputs.Count)
|
|
||||||
{
|
|
||||||
var input = Dmps.SwitcherInputs[inputSelector] as DMInput;
|
|
||||||
if (input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaInput || input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaNoStreamingInput)
|
|
||||||
{
|
|
||||||
//Special case for weird AirMedia indexing
|
|
||||||
if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl)
|
|
||||||
output.AudioOutSource = eDmps34KAudioOutSource.AirMedia8;
|
|
||||||
else if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
|
|
||||||
output.AudioOutSource = eDmps34KAudioOutSource.AirMedia9;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//Shift video inputs by 5 for weird DMPS3-4K indexing
|
|
||||||
output.AudioOutSource = (eDmps34KAudioOutSource)(inputSelector + 5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (inputSelector <= Dmps.SwitcherInputs.Count && outputSelector <= Dmps.SwitcherOutputs.Count)
|
|
||||||
{
|
|
||||||
var output = Dmps.SwitcherOutputs[outputSelector] as DMOutput;
|
|
||||||
var input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector] as DMInput;
|
|
||||||
output.AudioOut = input;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -1,516 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.DM.Config;
|
|
||||||
using Crestron.SimplSharpPro.DM.Cards;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Chassis
|
|
||||||
{
|
|
||||||
[Description("Wrapper class for all HdMd8xN switchers")]
|
|
||||||
public class HdMd8xNController : CrestronGenericBridgeableBaseDevice, IRoutingNumericWithFeedback, IHasFeedback
|
|
||||||
{
|
|
||||||
private HdMd8xN _Chassis;
|
|
||||||
|
|
||||||
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
|
||||||
|
|
||||||
public Dictionary<uint, string> InputNames { get; set; }
|
|
||||||
public Dictionary<uint, string> OutputNames { get; set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
public FeedbackCollection<BoolFeedback> VideoInputSyncFeedbacks { get; private set; }
|
|
||||||
public FeedbackCollection<IntFeedback> VideoOutputRouteFeedbacks { get; private set; }
|
|
||||||
public FeedbackCollection<IntFeedback> AudioOutputRouteFeedbacks { get; private set; }
|
|
||||||
public FeedbackCollection<StringFeedback> InputNameFeedbacks { get; private set; }
|
|
||||||
public FeedbackCollection<StringFeedback> OutputNameFeedbacks { get; private set; }
|
|
||||||
public FeedbackCollection<StringFeedback> OutputVideoRouteNameFeedbacks { get; private set; }
|
|
||||||
public FeedbackCollection<StringFeedback> OutputAudioRouteNameFeedbacks { get; private set; }
|
|
||||||
public StringFeedback DeviceNameFeedback { get; private set; }
|
|
||||||
|
|
||||||
#region Constructor
|
|
||||||
|
|
||||||
public HdMd8xNController(string key, string name, HdMd8xN chassis,
|
|
||||||
DMChassisPropertiesConfig props)
|
|
||||||
: base(key, name, chassis)
|
|
||||||
{
|
|
||||||
_Chassis = chassis;
|
|
||||||
Name = name;
|
|
||||||
_Chassis.EnableAudioBreakaway.BoolValue = true;
|
|
||||||
|
|
||||||
if (props == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "HdMd8xNController properties are null, failed to build the device");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
InputNames = new Dictionary<uint, string>();
|
|
||||||
if (props.InputNames != null)
|
|
||||||
{
|
|
||||||
InputNames = props.InputNames;
|
|
||||||
}
|
|
||||||
OutputNames = new Dictionary<uint, string>();
|
|
||||||
if (props.OutputNames != null)
|
|
||||||
{
|
|
||||||
OutputNames = props.OutputNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceNameFeedback = new StringFeedback(()=> Name);
|
|
||||||
|
|
||||||
VideoInputSyncFeedbacks = new FeedbackCollection<BoolFeedback>();
|
|
||||||
VideoOutputRouteFeedbacks = new FeedbackCollection<IntFeedback>();
|
|
||||||
AudioOutputRouteFeedbacks = new FeedbackCollection<IntFeedback>();
|
|
||||||
InputNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
|
||||||
OutputNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
|
||||||
OutputVideoRouteNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
|
||||||
OutputAudioRouteNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
|
||||||
|
|
||||||
//Inputs - should always be 8 audio/video inputs
|
|
||||||
for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var index = i;
|
|
||||||
if (!InputNames.ContainsKey(index))
|
|
||||||
{
|
|
||||||
InputNames.Add(index, string.Format("Input{0}", index));
|
|
||||||
}
|
|
||||||
string inputName = InputNames[index];
|
|
||||||
_Chassis.Inputs[index].Name.StringValue = inputName;
|
|
||||||
|
|
||||||
|
|
||||||
InputPorts.Add(new RoutingInputPort(inputName, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, _Chassis.Inputs[index], this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = _Chassis.Inputs[index]
|
|
||||||
});
|
|
||||||
|
|
||||||
VideoInputSyncFeedbacks.Add(new BoolFeedback(inputName, () => _Chassis.Inputs[index].VideoDetectedFeedback.BoolValue));
|
|
||||||
InputNameFeedbacks.Add(new StringFeedback(inputName, () => _Chassis.Inputs[index].NameFeedback.StringValue));
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ErrorLog.Error("Exception creating input {0} on HD-MD8xN Chassis: {1}", i, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Outputs. Either 2 outputs (1 audio, 1 audio/video) for HD-MD8x1 or 4 outputs (2 audio, 2 audio/video) for HD-MD8x2
|
|
||||||
for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var index = i;
|
|
||||||
if (!OutputNames.ContainsKey(index))
|
|
||||||
{
|
|
||||||
OutputNames.Add(index, string.Format("Output{0}", index));
|
|
||||||
}
|
|
||||||
string outputName = OutputNames[index];
|
|
||||||
_Chassis.Outputs[index].Name.StringValue = outputName;
|
|
||||||
|
|
||||||
OutputPorts.Add(new RoutingOutputPort(outputName, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, _Chassis.Outputs[index], this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = _Chassis.Outputs[index]
|
|
||||||
});
|
|
||||||
|
|
||||||
OutputNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].NameFeedback.StringValue));
|
|
||||||
VideoOutputRouteFeedbacks.Add(new IntFeedback(outputName, () => _Chassis.Outputs[index].VideoOutFeedback == null ? 0 : (int)_Chassis.Outputs[index].VideoOutFeedback.Number));
|
|
||||||
AudioOutputRouteFeedbacks.Add(new IntFeedback(outputName, () => _Chassis.Outputs[index].AudioOutFeedback == null ? 0 : (int)_Chassis.Outputs[index].AudioOutFeedback.Number));
|
|
||||||
OutputVideoRouteNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].VideoOutFeedback == null ? "None" : _Chassis.Outputs[index].VideoOutFeedback.NameFeedback.StringValue));
|
|
||||||
OutputAudioRouteNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].AudioOutFeedback == null ? "None" : _Chassis.Outputs[index].VideoOutFeedback.NameFeedback.StringValue));
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
ErrorLog.Error("Exception creating output {0} on HD-MD8xN Chassis: {1}", i, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_Chassis.DMInputChange += Chassis_DMInputChange;
|
|
||||||
_Chassis.DMOutputChange += Chassis_DMOutputChange;
|
|
||||||
|
|
||||||
AddPostActivationAction(AddFeedbackCollections);
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Methods
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Raise an event when the status of a switch object changes.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="e">Arguments defined as IKeyName sender, output, input, and eRoutingSignalType</param>
|
|
||||||
private void OnSwitchChange(RoutingNumericEventArgs e)
|
|
||||||
{
|
|
||||||
var newEvent = NumericSwitchChange;
|
|
||||||
if (newEvent != null) newEvent(this, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region PostActivate
|
|
||||||
|
|
||||||
public void AddFeedbackCollections()
|
|
||||||
{
|
|
||||||
AddFeedbackToList(DeviceNameFeedback);
|
|
||||||
AddCollectionsToList(VideoInputSyncFeedbacks);
|
|
||||||
AddCollectionsToList(VideoOutputRouteFeedbacks, AudioOutputRouteFeedbacks);
|
|
||||||
AddCollectionsToList(InputNameFeedbacks, OutputNameFeedbacks, OutputVideoRouteNameFeedbacks, OutputAudioRouteNameFeedbacks);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region FeedbackCollection Methods
|
|
||||||
|
|
||||||
//Add arrays of collections
|
|
||||||
public void AddCollectionsToList(params FeedbackCollection<BoolFeedback>[] newFbs)
|
|
||||||
{
|
|
||||||
foreach (FeedbackCollection<BoolFeedback> fbCollection in newFbs)
|
|
||||||
{
|
|
||||||
foreach (var item in newFbs)
|
|
||||||
{
|
|
||||||
AddCollectionToList(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public void AddCollectionsToList(params FeedbackCollection<IntFeedback>[] newFbs)
|
|
||||||
{
|
|
||||||
foreach (FeedbackCollection<IntFeedback> fbCollection in newFbs)
|
|
||||||
{
|
|
||||||
foreach (var item in newFbs)
|
|
||||||
{
|
|
||||||
AddCollectionToList(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCollectionsToList(params FeedbackCollection<StringFeedback>[] newFbs)
|
|
||||||
{
|
|
||||||
foreach (FeedbackCollection<StringFeedback> fbCollection in newFbs)
|
|
||||||
{
|
|
||||||
foreach (var item in newFbs)
|
|
||||||
{
|
|
||||||
AddCollectionToList(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Add Collections
|
|
||||||
public void AddCollectionToList(FeedbackCollection<BoolFeedback> newFbs)
|
|
||||||
{
|
|
||||||
foreach (var f in newFbs)
|
|
||||||
{
|
|
||||||
if (f == null) continue;
|
|
||||||
|
|
||||||
AddFeedbackToList(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCollectionToList(FeedbackCollection<IntFeedback> newFbs)
|
|
||||||
{
|
|
||||||
foreach (var f in newFbs)
|
|
||||||
{
|
|
||||||
if (f == null) continue;
|
|
||||||
|
|
||||||
AddFeedbackToList(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddCollectionToList(FeedbackCollection<StringFeedback> newFbs)
|
|
||||||
{
|
|
||||||
foreach (var f in newFbs)
|
|
||||||
{
|
|
||||||
if (f == null) continue;
|
|
||||||
|
|
||||||
AddFeedbackToList(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//Add Individual Feedbacks
|
|
||||||
public void AddFeedbackToList(PepperDash.Essentials.Core.Feedback newFb)
|
|
||||||
{
|
|
||||||
if (newFb == null) return;
|
|
||||||
|
|
||||||
if (!Feedbacks.Contains(newFb))
|
|
||||||
{
|
|
||||||
Feedbacks.Add(newFb);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IRouting Members
|
|
||||||
|
|
||||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType sigType)
|
|
||||||
{
|
|
||||||
var input = inputSelector as DMInput;
|
|
||||||
var output = outputSelector as DMOutput;
|
|
||||||
Debug.Console(2, this, "ExecuteSwitch: input={0} output={1} sigType={2}", input, output, sigType.ToString());
|
|
||||||
|
|
||||||
if (output == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Unable to make switch. Output selector is not DMOutput");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
|
||||||
{
|
|
||||||
_Chassis.VideoEnter.BoolValue = true;
|
|
||||||
if (output != null)
|
|
||||||
{
|
|
||||||
output.VideoOut = input;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
|
||||||
{
|
|
||||||
_Chassis.AudioEnter.BoolValue = true;
|
|
||||||
if (output != null)
|
|
||||||
{
|
|
||||||
output.AudioOut = input;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IRoutingNumeric Members
|
|
||||||
|
|
||||||
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
|
|
||||||
var input = inputSelector == 0 ? null : _Chassis.Inputs[inputSelector];
|
|
||||||
var output = _Chassis.Outputs[outputSelector];
|
|
||||||
|
|
||||||
Debug.Console(2, this, "ExecuteNumericSwitch: input={0} output={1}", input, output);
|
|
||||||
|
|
||||||
ExecuteSwitch(input, output, signalType);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Bridge Linking
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = new DmChassisControllerJoinMap(joinStart);
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<DmChassisControllerJoinMap>(joinMapSerialized);
|
|
||||||
|
|
||||||
if (bridge != null)
|
|
||||||
{
|
|
||||||
bridge.AddJoinMap(Key, joinMap);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
|
||||||
}
|
|
||||||
|
|
||||||
IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
|
|
||||||
|
|
||||||
for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
|
|
||||||
{
|
|
||||||
var joinIndex = i - 1;
|
|
||||||
var input = i;
|
|
||||||
//Digital
|
|
||||||
VideoInputSyncFeedbacks[InputNames[input]].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber + joinIndex]);
|
|
||||||
|
|
||||||
//Serial
|
|
||||||
InputNameFeedbacks[InputNames[input]].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + joinIndex]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
|
|
||||||
{
|
|
||||||
var joinIndex = i - 1;
|
|
||||||
var output = i;
|
|
||||||
//Analog
|
|
||||||
VideoOutputRouteFeedbacks[OutputNames[output]].LinkInputSig(trilist.UShortInput[joinMap.OutputVideo.JoinNumber + joinIndex]);
|
|
||||||
trilist.SetUShortSigAction(joinMap.OutputVideo.JoinNumber + joinIndex, (a) => ExecuteNumericSwitch(a, (ushort)output, eRoutingSignalType.Video));
|
|
||||||
AudioOutputRouteFeedbacks[OutputNames[output]].LinkInputSig(trilist.UShortInput[joinMap.OutputAudio.JoinNumber + joinIndex]);
|
|
||||||
trilist.SetUShortSigAction(joinMap.OutputAudio.JoinNumber + joinIndex, (a) => ExecuteNumericSwitch(a, (ushort)output, eRoutingSignalType.Audio));
|
|
||||||
|
|
||||||
//Serial
|
|
||||||
OutputNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + joinIndex]);
|
|
||||||
OutputVideoRouteNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentVideoInputNames.JoinNumber + joinIndex]);
|
|
||||||
OutputAudioRouteNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentAudioInputNames.JoinNumber + joinIndex]);
|
|
||||||
}
|
|
||||||
|
|
||||||
_Chassis.OnlineStatusChange += Chassis_OnlineStatusChange;
|
|
||||||
|
|
||||||
trilist.OnlineStatusChange += (d, args) =>
|
|
||||||
{
|
|
||||||
if (!args.DeviceOnLine) return;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Events
|
|
||||||
|
|
||||||
void Chassis_OnlineStatusChange(Crestron.SimplSharpPro.GenericBase currentDevice, Crestron.SimplSharpPro.OnlineOfflineEventArgs args)
|
|
||||||
{
|
|
||||||
IsOnline.FireUpdate();
|
|
||||||
|
|
||||||
if (!args.DeviceOnLine) return;
|
|
||||||
|
|
||||||
foreach (var feedback in Feedbacks)
|
|
||||||
{
|
|
||||||
feedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Chassis_DMOutputChange(Switch device, DMOutputEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case DMOutputEventIds.VideoOutEventId:
|
|
||||||
{
|
|
||||||
var output = args.Number;
|
|
||||||
var inputNumber = _Chassis.Outputs[output].VideoOutFeedback == null ? 0 : _Chassis.Outputs[output].VideoOutFeedback.Number;
|
|
||||||
|
|
||||||
var outputName = OutputNames[output];
|
|
||||||
|
|
||||||
var feedback = VideoOutputRouteFeedbacks[outputName];
|
|
||||||
|
|
||||||
if (feedback == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var inPort = InputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output].VideoOutFeedback);
|
|
||||||
var outPort = OutputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output]);
|
|
||||||
|
|
||||||
feedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(output, inputNumber, outPort, inPort, eRoutingSignalType.Video));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.AudioOutEventId:
|
|
||||||
{
|
|
||||||
var output = args.Number;
|
|
||||||
var inputNumber = _Chassis.Outputs[output].AudioOutFeedback == null ? 0 : _Chassis.Outputs[output].AudioOutFeedback.Number;
|
|
||||||
|
|
||||||
var outputName = OutputNames[output];
|
|
||||||
|
|
||||||
var feedback = AudioOutputRouteFeedbacks[outputName];
|
|
||||||
|
|
||||||
if (feedback == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var inPort = InputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output].AudioOutFeedback);
|
|
||||||
var outPort = OutputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output]);
|
|
||||||
|
|
||||||
feedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(output, inputNumber, outPort, inPort, eRoutingSignalType.Audio));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.OutputNameEventId:
|
|
||||||
case DMOutputEventIds.NameFeedbackEventId:
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Event ID {0}: Updating name feedbacks.", args.EventId);
|
|
||||||
Debug.Console(1, this, "Output {0} Name {1}", args.Number,
|
|
||||||
_Chassis.Outputs[args.Number].NameFeedback.StringValue);
|
|
||||||
foreach (var item in OutputNameFeedbacks)
|
|
||||||
{
|
|
||||||
item.FireUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Unhandled DM Output Event ID {0}", args.EventId);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Chassis_DMInputChange(Switch device, DMInputEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case DMInputEventIds.VideoDetectedEventId:
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Event ID {0}: Updating VideoInputSyncFeedbacks", args.EventId);
|
|
||||||
foreach (var item in VideoInputSyncFeedbacks)
|
|
||||||
{
|
|
||||||
item.FireUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMInputEventIds.InputNameFeedbackEventId:
|
|
||||||
case DMInputEventIds.InputNameEventId:
|
|
||||||
case DMInputEventIds.NameFeedbackEventId:
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Event ID {0}: Updating name feedbacks.", args.EventId);
|
|
||||||
Debug.Console(1, this, "Input {0} Name {1}", args.Number,
|
|
||||||
_Chassis.Inputs[args.Number].NameFeedback.StringValue);
|
|
||||||
foreach (var item in InputNameFeedbacks)
|
|
||||||
{
|
|
||||||
item.FireUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Unhandled DM Input Event ID {0}", args.EventId);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Factory
|
|
||||||
|
|
||||||
public class HdMd8xNControllerFactory : EssentialsDeviceFactory<HdMd8xNController>
|
|
||||||
{
|
|
||||||
public HdMd8xNControllerFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "hdmd8x2", "hdmd8x1" };
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory Attempting to create new HD-MD-8xN Device");
|
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject<DMChassisPropertiesConfig>(dc.Properties.ToString());
|
|
||||||
|
|
||||||
var type = dc.Type.ToLower();
|
|
||||||
var control = props.Control;
|
|
||||||
var ipid = control.IpIdInt;
|
|
||||||
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case ("hdmd8x2"):
|
|
||||||
return new HdMd8xNController(dc.Key, dc.Name, new HdMd8x2(ipid, Global.ControlSystem), props);
|
|
||||||
case ("hdmd8x1"):
|
|
||||||
return new HdMd8xNController(dc.Key, dc.Name, new HdMd8x1(ipid, Global.ControlSystem), props);
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -17,12 +17,11 @@ using PepperDash.Essentials.Core;
|
|||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using PepperDash.Essentials.Core.DeviceInfo;
|
using PepperDash.Essentials.Core.DeviceInfo;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
||||||
{
|
{
|
||||||
[Description("Wrapper class for DGE-100")]
|
[Description("Wrapper class for DGE-100")]
|
||||||
public class Dge100Controller : CrestronGenericBaseDevice, IComPorts, IIROutputPorts, IHasBasicTriListWithSmartObject, ICec, IDeviceInfoProvider, IBridgeAdvanced
|
public class Dge100Controller : CrestronGenericBaseDevice, IComPorts, IIROutputPorts, IHasBasicTriListWithSmartObject, ICec, IDeviceInfoProvider
|
||||||
{
|
{
|
||||||
private const int CtpPort = 41795;
|
private const int CtpPort = 41795;
|
||||||
private readonly Dge100 _dge;
|
private readonly Dge100 _dge;
|
||||||
@@ -31,12 +30,9 @@ namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
|||||||
|
|
||||||
public BasicTriListWithSmartObject Panel { get { return _dge; } }
|
public BasicTriListWithSmartObject Panel { get { return _dge; } }
|
||||||
|
|
||||||
private DeviceConfig _dc;
|
private DeviceConfig _dc;
|
||||||
|
|
||||||
public VideoStatusOutputs VideoStatusFeedbacks { get; private set; }
|
|
||||||
|
|
||||||
CrestronTouchpanelPropertiesConfig PropertiesConfig;
|
|
||||||
|
|
||||||
|
CrestronTouchpanelPropertiesConfig PropertiesConfig;
|
||||||
|
|
||||||
public Dge100Controller(string key, string name, Dge100 device, DeviceConfig dc, CrestronTouchpanelPropertiesConfig props)
|
public Dge100Controller(string key, string name, Dge100 device, DeviceConfig dc, CrestronTouchpanelPropertiesConfig props)
|
||||||
:base(key, name, device)
|
:base(key, name, device)
|
||||||
@@ -52,20 +48,8 @@ namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
|||||||
|
|
||||||
_dc = dc;
|
_dc = dc;
|
||||||
|
|
||||||
PropertiesConfig = props;
|
PropertiesConfig = props;
|
||||||
|
}
|
||||||
var videoStatusFuncs = new VideoStatusFuncsWrapper
|
|
||||||
{
|
|
||||||
HdcpActiveFeedbackFunc = () => _dge.HdmiIn.HdcpSupportOnFeedback.BoolValue,
|
|
||||||
VideoResolutionFeedbackFunc = () => _dge.HdmiIn.VideoAttributes.GetVideoResolutionString(),
|
|
||||||
VideoSyncFeedbackFunc = () => _dge.HdmiIn.SyncDetectedFeedback.BoolValue,
|
|
||||||
};
|
|
||||||
|
|
||||||
VideoStatusFeedbacks = new VideoStatusOutputs(videoStatusFuncs);
|
|
||||||
|
|
||||||
_dge.HdmiIn.StreamChange += (s,a) => VideoStatusFeedbacks.FireAll();
|
|
||||||
_dge.HdmiIn.VideoAttributes.AttributeChange += (o, a) => VideoStatusFeedbacks.FireAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IComPorts Members
|
#region IComPorts Members
|
||||||
|
|
||||||
@@ -203,63 +187,6 @@ namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
|||||||
handler(this, new DeviceInfoEventArgs(DeviceInfo));
|
handler(this, new DeviceInfoEventArgs(DeviceInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IBridgeAdvanced Members
|
|
||||||
|
|
||||||
public void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = new DgeJoinMap(joinStart);
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<DgeJoinMap>(joinMapSerialized);
|
|
||||||
|
|
||||||
if (bridge != null)
|
|
||||||
{
|
|
||||||
bridge.AddJoinMap(Key, joinMap);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
|
|
||||||
//Presses
|
|
||||||
trilist.SetSigTrueAction(joinMap.HdmiInHdcpOn.JoinNumber, () => _dge.HdmiIn.HdcpSupportOn());
|
|
||||||
trilist.SetSigTrueAction(joinMap.HdmiInHdcpOff.JoinNumber,() => _dge.HdmiIn.HdcpSupportOff());
|
|
||||||
trilist.SetSigTrueAction(joinMap.HdmiInHdcpToggle.JoinNumber, () => {
|
|
||||||
if(_dge.HdmiIn.HdcpSupportOnFeedback.BoolValue)
|
|
||||||
{
|
|
||||||
_dge.HdmiIn.HdcpSupportOff();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_dge.HdmiIn.HdcpSupportOn();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// Feedbacks
|
|
||||||
VideoStatusFeedbacks.HdcpActiveFeedback.LinkInputSig(trilist.BooleanInput[joinMap.HdmiInHdcpOn.JoinNumber]);
|
|
||||||
VideoStatusFeedbacks.HdcpActiveFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.HdmiInHdcpOff.JoinNumber]);
|
|
||||||
|
|
||||||
VideoStatusFeedbacks.VideoResolutionFeedback.LinkInputSig(trilist.StringInput[joinMap.CurrentInputResolution.JoinNumber]);
|
|
||||||
VideoStatusFeedbacks.VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.SyncDetected.JoinNumber]);
|
|
||||||
|
|
||||||
IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.OnlineStatusChange += (o, a) =>
|
|
||||||
{
|
|
||||||
if (!a.DeviceOnLine) return;
|
|
||||||
|
|
||||||
VideoStatusFeedbacks.FireAll();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
|
||||||
{
|
|
||||||
public class DgeJoinMap : JoinMapBaseAdvanced
|
|
||||||
{
|
|
||||||
[JoinName("IsOnline")]
|
|
||||||
public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DGE Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("CurrentInputResolution")]
|
|
||||||
public JoinDataComplete CurrentInputResolution = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DGE Current Input Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
|
||||||
|
|
||||||
[JoinName("SyncDetected")]
|
|
||||||
public JoinDataComplete SyncDetected = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DGE Sync Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("HdmiHdcpOn")]
|
|
||||||
public JoinDataComplete HdmiInHdcpOn = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DGE HDMI HDCP State On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("HdmiHdcpOff")]
|
|
||||||
public JoinDataComplete HdmiInHdcpOff = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DGE HDMI HDCP State Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
[JoinName("HdmiHdcpToggle")]
|
|
||||||
public JoinDataComplete HdmiInHdcpToggle = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
|
|
||||||
new JoinMetadata { Description = "DGE HDMI HDCP State Toggle", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
|
||||||
|
|
||||||
public DgeJoinMap(uint joinStart)
|
|
||||||
: this(joinStart, typeof(DgeJoinMap))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor to use when extending this Join map
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="joinStart">Join this join map will start at</param>
|
|
||||||
/// <param name="type">Type of the child join map</param>
|
|
||||||
protected DgeJoinMap(uint joinStart, Type type) : base(joinStart, type)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -58,37 +58,37 @@ namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
|||||||
HdmiOut.Port = _dge.HdmiOut; ;
|
HdmiOut.Port = _dge.HdmiOut; ;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class DmDge200CControllerFactory : EssentialsDeviceFactory<DmDge200CController>
|
||||||
|
{
|
||||||
|
public DmDge200CControllerFactory()
|
||||||
|
{
|
||||||
|
TypeNames = new List<string>() { "dmdge200c" };
|
||||||
|
}
|
||||||
|
|
||||||
|
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
var typeName = dc.Type.ToLower();
|
||||||
|
var comm = CommFactory.GetControlPropertiesConfig(dc);
|
||||||
|
var props = JsonConvert.DeserializeObject<CrestronTouchpanelPropertiesConfig>(dc.Properties.ToString());
|
||||||
|
|
||||||
|
Debug.Console(1, "Factory Attempting to create new DgeController Device");
|
||||||
|
|
||||||
|
DmDge200C dgeDevice = null;
|
||||||
|
|
||||||
|
if (typeName == "dmdge200c")
|
||||||
|
dgeDevice = new DmDge200C(comm.IpIdInt, Global.ControlSystem);
|
||||||
|
|
||||||
|
if (dgeDevice == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "Unable to create DGE device");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dgeController = new DmDge200CController(dc.Key , dc.Name, dgeDevice, dc, props);
|
||||||
|
|
||||||
|
return dgeController;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DmDge200CControllerFactory : EssentialsDeviceFactory<DmDge200CController>
|
|
||||||
{
|
|
||||||
public DmDge200CControllerFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "dmdge200c" };
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
var typeName = dc.Type.ToLower();
|
|
||||||
var comm = CommFactory.GetControlPropertiesConfig(dc);
|
|
||||||
var props = JsonConvert.DeserializeObject<CrestronTouchpanelPropertiesConfig>(dc.Properties.ToString());
|
|
||||||
|
|
||||||
Debug.Console(1, "Factory Attempting to create new DgeController Device");
|
|
||||||
|
|
||||||
DmDge200C dgeDevice = null;
|
|
||||||
|
|
||||||
if (typeName == "dmdge200c")
|
|
||||||
dgeDevice = new DmDge200C(comm.IpIdInt, Global.ControlSystem);
|
|
||||||
|
|
||||||
if (dgeDevice == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Unable to create DGE device");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var dgeController = new DmDge200CController(dc.Key, dc.Name, dgeDevice, dc, props);
|
|
||||||
|
|
||||||
return dgeController;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash_Essentials_DM
|
|
||||||
{
|
|
||||||
public interface IHasDmInHdcpSet
|
|
||||||
{
|
|
||||||
void SetDmInHdcpState(eHdcpCapabilityType hdcpState);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasDmInHdcpGet
|
|
||||||
{
|
|
||||||
IntFeedback DmInHdcpStateFeedback { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasDmInHdcp : IHasDmInHdcpGet, IHasDmInHdcpSet
|
|
||||||
{
|
|
||||||
eHdcpCapabilityType DmInHdcpCapability { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public interface IHasHdmiInHdcpSet
|
|
||||||
{
|
|
||||||
void SetHdmiInHdcpState(eHdcpCapabilityType hdcpState);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasHdmiInHdcpGet
|
|
||||||
{
|
|
||||||
IntFeedback HdmiInHdcpStateFeedback { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasHdmiInHdcp : IHasHdmiInHdcpGet, IHasHdmiInHdcpSet
|
|
||||||
{
|
|
||||||
eHdcpCapabilityType HdmiInHdcpCapability { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public interface IHasHdmiIn1HdcpSet
|
|
||||||
{
|
|
||||||
void SetHdmiIn1HdcpState(eHdcpCapabilityType hdcpState);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasHdmiIn1HdcpGet
|
|
||||||
{
|
|
||||||
IntFeedback HdmiIn1HdcpStateFeedback { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasHdmiIn1Hdcp : IHasHdmiIn1HdcpGet, IHasHdmiIn1HdcpSet
|
|
||||||
{
|
|
||||||
eHdcpCapabilityType HdmiIn1HdcpCapability { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public interface IHasHdmiIn2HdcpSet
|
|
||||||
{
|
|
||||||
void SetHdmiIn2HdcpState(eHdcpCapabilityType hdcpState);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasHdmiIn2HdcpGet
|
|
||||||
{
|
|
||||||
IntFeedback HdmiInIn2HdcpStateFeedback { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasHdmi2InHdcp : IHasHdmiIn2HdcpGet, IHasHdmiIn2HdcpSet
|
|
||||||
{
|
|
||||||
eHdcpCapabilityType Hdmi2InHdcpCapability { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public interface IHasDisplayPortInHdcpGet
|
|
||||||
{
|
|
||||||
IntFeedback DisplayPortInHdcpStateFeedback { get; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasDisplayPortInHdcpSet
|
|
||||||
{
|
|
||||||
void SetDisplayPortInHdcpState(eHdcpCapabilityType hdcpState);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface IHasDisplayPortInHdcp : IHasDisplayPortInHdcpGet, IHasDisplayPortInHdcpSet
|
|
||||||
{
|
|
||||||
eHdcpCapabilityType DisplayPortInHdcpCapability { get; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharp.Ssh;
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
using PepperDash.Core;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
namespace PepperDash.Essentials.DM
|
||||||
{
|
{
|
||||||
@@ -28,32 +26,6 @@ namespace PepperDash.Essentials.DM
|
|||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HDBaseTSink};
|
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HDBaseTSink};
|
||||||
PreventRegistration = true;
|
|
||||||
rmc.Register();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = new DmRmcControllerJoinMap(joinStart);
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<DmRmcControllerJoinMap>(joinMapSerialized);
|
|
||||||
|
|
||||||
if (bridge != null)
|
|
||||||
{
|
|
||||||
bridge.AddJoinMap(Key, joinMap);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
|
|
||||||
IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
|
||||||
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region IComPorts Members
|
#region IComPorts Members
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user