mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-14 04:04:58 +00:00
Merge pull request #1153 from PepperDash/feature-2.0.0/move-dm-to-library
Move DM Project to library
This commit is contained in:
37
.github/workflows/add-issues-to-project.yml
vendored
37
.github/workflows/add-issues-to-project.yml
vendored
@@ -1,37 +0,0 @@
|
|||||||
name: Add bugs to bugs project
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types:
|
|
||||||
- opened
|
|
||||||
- labeled
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-secret:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
my-key: ${{ steps.my-key.outputs.defined }}
|
|
||||||
steps:
|
|
||||||
- id: my-key
|
|
||||||
if: "${{ env.MY_KEY != '' }}"
|
|
||||||
run: echo "::set-output name=defined::true"
|
|
||||||
env:
|
|
||||||
MY_KEY: ${{ secrets.PROJECT_URL }}
|
|
||||||
throw-error:
|
|
||||||
name: Check
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: [check-secret]
|
|
||||||
if: needs.check-secret.outputs.my-key != 'true'
|
|
||||||
steps:
|
|
||||||
- run: echo "The Project URL Repo Secret is empty"
|
|
||||||
add-to-project:
|
|
||||||
name: Add issue to project
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: [check-secret]
|
|
||||||
if: needs.check-secret.outputs.my-key == 'true'
|
|
||||||
steps:
|
|
||||||
- uses: actions/add-to-project@main
|
|
||||||
with:
|
|
||||||
project-url: ${{ secrets.PROJECT_URL }}
|
|
||||||
github-token: ${{ secrets.GH_PROJECTS_PASSWORD }}
|
|
||||||
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -389,3 +389,4 @@ MigrationBackup/
|
|||||||
# Fody - auto-generated XML schema
|
# Fody - auto-generated XML schema
|
||||||
FodyWeavers.xsd
|
FodyWeavers.xsd
|
||||||
essentials-framework/Essentials Interfaces/PepperDash_Essentials_Interfaces/PepperDash_Essentials_Interfaces.csproj
|
essentials-framework/Essentials Interfaces/PepperDash_Essentials_Interfaces/PepperDash_Essentials_Interfaces.csproj
|
||||||
|
.DS_Store
|
||||||
|
|||||||
@@ -3,13 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
|||||||
# Visual Studio Version 17
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 17.4.33213.308
|
VisualStudioVersion = 17.4.33213.308
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash.Essentials.Devices.Common", "src\PepperDash.Essentials.Devices.Common\PepperDash.Essentials.Devices.Common.csproj", "{53E204B7-97DD-441D-A96C-721DF014DF82}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PepperDash.Essentials.Devices.Common", "src\PepperDash.Essentials.Devices.Common\PepperDash.Essentials.Devices.Common.csproj", "{53E204B7-97DD-441D-A96C-721DF014DF82}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash.Essentials.DM", "src\PepperDash.Essentials.DM\PepperDash.Essentials.DM.csproj", "{08EB4B98-9B4D-455A-81E0-4F913E08ADB5}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PepperDash.Essentials", "src\PepperDash.Essentials\PepperDash.Essentials.csproj", "{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash.Essentials", "src\PepperDash.Essentials\PepperDash.Essentials.csproj", "{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PepperDash.Essentials.Core", "src\PepperDash.Essentials.Core\PepperDash.Essentials.Core.csproj", "{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}"
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash.Essentials.Core", "src\PepperDash.Essentials.Core\PepperDash.Essentials.Core.csproj", "{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}"
|
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@@ -21,10 +19,6 @@ Global
|
|||||||
{53E204B7-97DD-441D-A96C-721DF014DF82}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{53E204B7-97DD-441D-A96C-721DF014DF82}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{53E204B7-97DD-441D-A96C-721DF014DF82}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{53E204B7-97DD-441D-A96C-721DF014DF82}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{53E204B7-97DD-441D-A96C-721DF014DF82}.Release|Any CPU.Build.0 = Release|Any CPU
|
{53E204B7-97DD-441D-A96C-721DF014DF82}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{08EB4B98-9B4D-455A-81E0-4F913E08ADB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{08EB4B98-9B4D-455A-81E0-4F913E08ADB5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{08EB4B98-9B4D-455A-81E0-4F913E08ADB5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{08EB4B98-9B4D-455A-81E0-4F913E08ADB5}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
|||||||
@@ -19,8 +19,8 @@
|
|||||||
</Target>
|
</Target>
|
||||||
<Target Name="Copy CPZ" AfterTargets="SimplSharpPostProcess" Condition="$(ProjectType) == 'Program'">
|
<Target Name="Copy CPZ" AfterTargets="SimplSharpPostProcess" Condition="$(ProjectType) == 'Program'">
|
||||||
<Message Text="Copying CPZ"></Message>
|
<Message Text="Copying CPZ"></Message>
|
||||||
<Move SourceFiles="$(TargetDir)\$(TargetName).cpz" DestinationFiles="$(TargetDir)\$(TargetName).$(Version).cpz" />
|
<Move SourceFiles="$(TargetDir)$(TargetName).cpz" DestinationFiles="$(TargetDir)$(TargetName).$(Version).cpz" />
|
||||||
<Copy SourceFiles="$(TargetDir)\$(TargetName).$(Version).cpz" DestinationFiles="$(PackageOutputPath)\$(TargetName).$(Version).cpz"/>
|
<Copy SourceFiles="$(TargetDir)$(TargetName).$(Version).cpz" DestinationFiles="$(PackageOutputPath)\$(TargetName).$(Version).cpz"/>
|
||||||
</Target>
|
</Target>
|
||||||
<Target Name="Clean CPZ" AfterTargets="AfterClean" Condition="$(ProjectType) == 'Program'">
|
<Target Name="Clean CPZ" AfterTargets="AfterClean" Condition="$(ProjectType) == 'Program'">
|
||||||
<Delete Files="$(PackageOutputPath)\$(TargetName).$(Version).cpz"/>
|
<Delete Files="$(PackageOutputPath)\$(TargetName).$(Version).cpz"/>
|
||||||
|
|||||||
@@ -167,7 +167,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.",
|
||||||
@@ -411,7 +411,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
|
||||||
@@ -444,7 +444,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)
|
||||||
@@ -459,34 +459,34 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
{
|
{
|
||||||
case "eiscapiadv":
|
case "eiscapiadv":
|
||||||
case "eiscapiadvanced":
|
case "eiscapiadvanced":
|
||||||
{
|
|
||||||
eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(controlProperties.IpIdInt,
|
|
||||||
controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "eiscapiadvancedserver":
|
|
||||||
{
|
|
||||||
eisc = new EISCServer(controlProperties.IpIdInt, Global.ControlSystem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "eiscapiadvancedclient":
|
|
||||||
{
|
|
||||||
eisc = new EISCClient(controlProperties.IpIdInt, controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "vceiscapiadv":
|
|
||||||
case "vceiscapiadvanced":
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(controlProperties.RoomId))
|
|
||||||
{
|
{
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to build VC-4 EISC Client for device {0}. Room ID is missing or empty", dc.Key);
|
eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(controlProperties.IpIdInt,
|
||||||
eisc = null;
|
controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "eiscapiadvancedserver":
|
||||||
|
{
|
||||||
|
eisc = new EISCServer(controlProperties.IpIdInt, Global.ControlSystem);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "eiscapiadvancedclient":
|
||||||
|
{
|
||||||
|
eisc = new EISCClient(controlProperties.IpIdInt, controlProperties.TcpSshProperties.Address, Global.ControlSystem);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "vceiscapiadv":
|
||||||
|
case "vceiscapiadvanced":
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(controlProperties.RoomId))
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to build VC-4 EISC Client for device {0}. Room ID is missing or empty", dc.Key);
|
||||||
|
eisc = null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
eisc = new VirtualControlEISCClient(controlProperties.IpIdInt, controlProperties.RoomId,
|
||||||
|
Global.ControlSystem);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
eisc = new VirtualControlEISCClient(controlProperties.IpIdInt, controlProperties.RoomId,
|
|
||||||
Global.ControlSystem);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
eisc = null;
|
eisc = null;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -8,6 +8,18 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "DM RMC Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
new JoinMetadata { Description = "DM RMC Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("VideoMuteOn")]
|
||||||
|
public JoinDataComplete VideoMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "DM RMC Mute Video", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("VideoMuteOff")]
|
||||||
|
public JoinDataComplete VideoMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "DM RMC UnMute Video", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
|
[JoinName("VideoMuteToggle")]
|
||||||
|
public JoinDataComplete VideoMuteToggle = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
|
||||||
|
new JoinMetadata { Description = "DM RMC Mute Video Toggle", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
[JoinName("CurrentOutputResolution")]
|
[JoinName("CurrentOutputResolution")]
|
||||||
public JoinDataComplete CurrentOutputResolution = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
public JoinDataComplete CurrentOutputResolution = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "DM RMC Current Output Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
new JoinMetadata { Description = "DM RMC Current Output Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
|
||||||
@@ -36,6 +48,28 @@ 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>
|
||||||
@@ -50,7 +84,8 @@ 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) : base(joinStart, type)
|
protected DmRmcControllerJoinMap(uint joinStart, Type type)
|
||||||
|
: base(joinStart, type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,16 @@ 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>
|
||||||
@@ -78,7 +88,8 @@ 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) : base(joinStart, type)
|
protected DmTxControllerJoinMap(uint joinStart, Type type)
|
||||||
|
: base(joinStart, type)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,827 @@
|
|||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
|
namespace PepperDash_Essentials_Core.Bridges.JoinMaps
|
||||||
|
{
|
||||||
|
public sealed class GenericIrControllerJoinMap : JoinMapBaseAdvanced
|
||||||
|
{
|
||||||
|
[JoinName("PLAY")]
|
||||||
|
public JoinDataComplete Play = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 1,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "PLAY",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("STOP")]
|
||||||
|
public JoinDataComplete Stop = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 2,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "STOP",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("PAUSE")]
|
||||||
|
public JoinDataComplete Pause = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 3,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "PAUSE",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("FSCAN")]
|
||||||
|
public JoinDataComplete ForwardScan = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 4,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "FSCAN",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("RSCAN")]
|
||||||
|
public JoinDataComplete ReverseScan = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 5,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "RSCAN",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("F_SKIP")]
|
||||||
|
public JoinDataComplete ForwardSkip = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 6,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "F_SKIP",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("R_SKIP")]
|
||||||
|
public JoinDataComplete ReverseSkip = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 7,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "R_SKIP",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("RECORD")]
|
||||||
|
public JoinDataComplete Record = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 8,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "RECORD",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("POWER")]
|
||||||
|
public JoinDataComplete Power = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 9,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "POWER",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("0")]
|
||||||
|
public JoinDataComplete Kp0 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 10,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "0",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("1")]
|
||||||
|
public JoinDataComplete Kp1 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 11,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "1",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("2")]
|
||||||
|
public JoinDataComplete Kp2 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 12,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "2",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("3")]
|
||||||
|
public JoinDataComplete Kp3 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 13,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "3",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("4")]
|
||||||
|
public JoinDataComplete Kp4 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 14,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "4",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("5")]
|
||||||
|
public JoinDataComplete Kp5 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 15,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "5",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("6")]
|
||||||
|
public JoinDataComplete Kp6 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 16,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "6",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("7")]
|
||||||
|
public JoinDataComplete Kp7 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 17,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "7",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("8")]
|
||||||
|
public JoinDataComplete Kp8 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 18,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "8",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("9")]
|
||||||
|
public JoinDataComplete Kp9 = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 19,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "9",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
// [JoinName("+10")]
|
||||||
|
// public JoinDataComplete Kp9 = new JoinDataComplete(
|
||||||
|
// new JoinData
|
||||||
|
// {
|
||||||
|
// JoinNumber = 20,
|
||||||
|
// JoinSpan = 1
|
||||||
|
// },
|
||||||
|
// new JoinMetadata
|
||||||
|
// {
|
||||||
|
// Description = "+10",
|
||||||
|
// JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
// JoinType = eJoinType.Digital
|
||||||
|
// });
|
||||||
|
|
||||||
|
[JoinName("ENTER")]
|
||||||
|
public JoinDataComplete Enter = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 21,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "ENTER",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("CH+")]
|
||||||
|
public JoinDataComplete ChannelUp = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 22,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "CH+",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("CH-")]
|
||||||
|
public JoinDataComplete ChannelDown = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 23,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "CH-",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("*")]
|
||||||
|
public JoinDataComplete KpStar = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 24,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "*",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("#")]
|
||||||
|
public JoinDataComplete KpPound = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 25,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "#",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
// [JoinName(".")]
|
||||||
|
// public JoinDataComplete KpPound = new JoinDataComplete(
|
||||||
|
// new JoinData
|
||||||
|
// {
|
||||||
|
// JoinNumber = 26,
|
||||||
|
// JoinSpan = 1
|
||||||
|
// },
|
||||||
|
// new JoinMetadata
|
||||||
|
// {
|
||||||
|
// Description = ".",
|
||||||
|
// JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
// JoinType = eJoinType.Digital
|
||||||
|
// });
|
||||||
|
|
||||||
|
[JoinName("POWER_ON")]
|
||||||
|
public JoinDataComplete PowerOn = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 27,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "POWER_ON",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("POWER_OFF")]
|
||||||
|
public JoinDataComplete PowerOff = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 28,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "POWER_OFF",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("PLAY_PAUSE")]
|
||||||
|
public JoinDataComplete PlayPause = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 29,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "PLAY_PAUSE",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("LAST")]
|
||||||
|
public JoinDataComplete Last = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 30,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "LAST",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("HOME")]
|
||||||
|
public JoinDataComplete Home = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 40,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "HOME",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("BACK")]
|
||||||
|
public JoinDataComplete Back = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 41,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "BACK",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("GUIDE")]
|
||||||
|
public JoinDataComplete Guide = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 42,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "GUIDE",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("INFO")]
|
||||||
|
public JoinDataComplete Info = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 43,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "INFO",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("MENU")]
|
||||||
|
public JoinDataComplete Menu = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 44,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "MENU",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("UP_ARROW")]
|
||||||
|
public JoinDataComplete DpadUp = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 45,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "UP_ARROW",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("DN_ARROW")]
|
||||||
|
public JoinDataComplete DpadDown = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 46,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "DN_ARROW",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("LEFT_ARROW")]
|
||||||
|
public JoinDataComplete DpadLeft = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 47,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "LEFT_ARROW",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("RIGHT_ARROW")]
|
||||||
|
public JoinDataComplete DpadRight = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 48,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "RIGHT_ARROW",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("SELECT")]
|
||||||
|
public JoinDataComplete DpadSelect = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 49,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "SELECT",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("OPTIONS")]
|
||||||
|
public JoinDataComplete Options = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 50,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "OPTIONS",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("RETURN")]
|
||||||
|
public JoinDataComplete Return = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 51,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "RETURN",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("DVR")]
|
||||||
|
public JoinDataComplete Dvr = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 52,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "DVR",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("ON_DEMAND")]
|
||||||
|
public JoinDataComplete OnDemand = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 53,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "ON_DEMAND",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("PAGE_UP")]
|
||||||
|
public JoinDataComplete PageUp = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 54,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "PAGE_UP",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("PAGE_DOWN")]
|
||||||
|
public JoinDataComplete PageDown = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 55,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "PAGE_DOWN",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("F_SRCH")]
|
||||||
|
public JoinDataComplete ForwardSearch = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 56,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "F_SRCH",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("R_SRCH")]
|
||||||
|
public JoinDataComplete ReverseSearch = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 57,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "R_SRCH",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("TRACK+")]
|
||||||
|
public JoinDataComplete TrackPlus = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 58,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "TRACK+",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("TRACK-")]
|
||||||
|
public JoinDataComplete TrackMinus = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 59,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "TRACK-",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("A")]
|
||||||
|
public JoinDataComplete KpA = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 61,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "A",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("B")]
|
||||||
|
public JoinDataComplete KpB = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 62,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "B",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("C")]
|
||||||
|
public JoinDataComplete KpC = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 63,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "C",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("D")]
|
||||||
|
public JoinDataComplete KpD = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 64,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "D",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("RED")]
|
||||||
|
public JoinDataComplete KpRed = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 65,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "RED",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("GREEN")]
|
||||||
|
public JoinDataComplete KpGreen = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 66,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "GREEN",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("YELLOW")]
|
||||||
|
public JoinDataComplete KpYellow = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 67,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "YELLOW",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
[JoinName("BLUE")]
|
||||||
|
public JoinDataComplete KpBlue = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 68,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "BLUE",
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
public GenericIrControllerJoinMap(uint joinStart)
|
||||||
|
: base(joinStart, typeof(GenericIrControllerJoinMap))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,190 @@
|
|||||||
|
using System;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
|
namespace PepperDash_Essentials_Core.Bridges
|
||||||
|
{
|
||||||
|
public class HdPsXxxControllerJoinMap : JoinMapBaseAdvanced
|
||||||
|
{
|
||||||
|
|
||||||
|
#region Digital
|
||||||
|
|
||||||
|
[JoinName("EnableAutoRoute")]
|
||||||
|
public JoinDataComplete EnableAutoRoute = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 1,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Enable Automatic Routing on Xx1 Switchers",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("InputSync")]
|
||||||
|
public JoinDataComplete InputSync = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 2,
|
||||||
|
JoinSpan = 8
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Device Input Sync",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("EnableInputHdcp")]
|
||||||
|
public JoinDataComplete EnableInputHdcp = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 11,
|
||||||
|
JoinSpan = 8
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Device Enable Input Hdcp",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("DisableInputHdcp")]
|
||||||
|
public JoinDataComplete DisableInputHdcp = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 21,
|
||||||
|
JoinSpan = 8
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Device Disnable Input Hdcp",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("IsOnline")]
|
||||||
|
public JoinDataComplete IsOnline = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 30,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Device Onlne",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region Analog
|
||||||
|
|
||||||
|
[JoinName("OutputRoute")]
|
||||||
|
public JoinDataComplete OutputRoute = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 11,
|
||||||
|
JoinSpan = 2
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Device Output Route Set/Get",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
|
||||||
|
JoinType = eJoinType.Analog
|
||||||
|
});
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
#region Serial
|
||||||
|
|
||||||
|
[JoinName("Name")]
|
||||||
|
public JoinDataComplete Name = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 1,
|
||||||
|
JoinSpan = 1
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Device Name",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("InputName")]
|
||||||
|
public JoinDataComplete InputName = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 2,
|
||||||
|
JoinSpan = 8
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Device Input Name",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("OutputName")]
|
||||||
|
public JoinDataComplete OutputName = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 11,
|
||||||
|
JoinSpan = 2
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Device Output Name",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[JoinName("OutputRoutedName")]
|
||||||
|
public JoinDataComplete OutputRoutedName = new JoinDataComplete(
|
||||||
|
new JoinData
|
||||||
|
{
|
||||||
|
JoinNumber = 16,
|
||||||
|
JoinSpan = 2
|
||||||
|
},
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = "Device Output Route Name",
|
||||||
|
JoinCapabilities = eJoinCapabilities.ToSIMPL,
|
||||||
|
JoinType = eJoinType.Serial
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/// <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 HdPsXxxControllerJoinMap(uint joinStart)
|
||||||
|
: this(joinStart, typeof(HdPsXxxControllerJoinMap))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <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 HdPsXxxControllerJoinMap(uint joinStart, Type type)
|
||||||
|
: base(joinStart, type)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
|||||||
|
|
||||||
[JoinName("Online")]
|
[JoinName("Online")]
|
||||||
public JoinDataComplete Online = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
public JoinDataComplete Online = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
new JoinMetadata { Description = "PDU Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
new JoinMetadata { Description = "Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
|
||||||
|
|
||||||
[JoinName("OutletCount")]
|
[JoinName("OutletCount")]
|
||||||
public JoinDataComplete OutletCount = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
public JoinDataComplete OutletCount = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||||
|
|||||||
@@ -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,6 +132,23 @@ 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>
|
||||||
|
|||||||
@@ -83,6 +83,15 @@ namespace PepperDash.Essentials.Core
|
|||||||
}
|
}
|
||||||
case eControlMethod.Telnet:
|
case eControlMethod.Telnet:
|
||||||
break;
|
break;
|
||||||
|
case eControlMethod.SecureTcpIp:
|
||||||
|
{
|
||||||
|
var secureTcp = new GenericSecureTcpIpClient(deviceConfig.Key + "-secureTcp", c.Address, c.Port, c.BufferSize);
|
||||||
|
secureTcp.AutoReconnect = c.AutoReconnect;
|
||||||
|
if (secureTcp.AutoReconnect)
|
||||||
|
secureTcp.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
|
||||||
|
comm = secureTcp;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -117,41 +126,54 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static ICec GetCecPort(ControlPropertiesConfig config)
|
public static ICec GetCecPort(ControlPropertiesConfig config)
|
||||||
{
|
{
|
||||||
var dev = DeviceManager.GetDeviceForKey(config.ControlPortDevKey);
|
try
|
||||||
|
{
|
||||||
|
var dev = DeviceManager.GetDeviceForKey(config.ControlPortDevKey);
|
||||||
|
|
||||||
if (dev != null)
|
Debug.Console(0, "GetCecPort: device '{0}' {1}", config.ControlPortDevKey, dev == null
|
||||||
{
|
? "is not valid, failed to get cec port"
|
||||||
if (!String.IsNullOrEmpty(config.ControlPortName))
|
: "found in device manager, attempting to get cec port");
|
||||||
{
|
|
||||||
|
|
||||||
var inputPort = (dev as IRoutingInputsOutputs).InputPorts[config.ControlPortName];
|
if (dev == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
if (inputPort != null)
|
if (String.IsNullOrEmpty(config.ControlPortName))
|
||||||
{
|
{
|
||||||
if (inputPort.Port is ICec)
|
Debug.Console(0, "GetCecPort: '{0}' - Configuration missing 'ControlPortName'", config.ControlPortDevKey);
|
||||||
return inputPort.Port as ICec;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var outputPort = (dev as IRoutingInputsOutputs).OutputPorts[config.ControlPortName];
|
|
||||||
|
|
||||||
if (outputPort != null)
|
var inputsOutputs = dev as IRoutingInputsOutputs;
|
||||||
{
|
if (inputsOutputs == null)
|
||||||
if (outputPort.Port is ICec)
|
{
|
||||||
return outputPort.Port as ICec;
|
Debug.Console(0, "GetCecPort: Device '{0}' does not support IRoutingInputsOutputs, failed to get CEC port called '{1}'",
|
||||||
}
|
config.ControlPortDevKey, config.ControlPortName);
|
||||||
|
|
||||||
else
|
return null;
|
||||||
Debug.Console(0, "GetCecPort: Device '{0}' does not have a CEC port called: '{1}'",
|
}
|
||||||
config.ControlPortDevKey, config.ControlPortName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, "GetCecPort: '{0}' - Configuration missing 'ControlPortName'", config.ControlPortDevKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Debug.Console(0, "GetCecPort: Device '{0}' is not a valid device.", config.ControlPortDevKey);
|
|
||||||
|
|
||||||
return null;
|
var inputPort = inputsOutputs.InputPorts[config.ControlPortName];
|
||||||
|
if (inputPort != null && inputPort.Port is ICec)
|
||||||
|
return inputPort.Port as ICec;
|
||||||
|
|
||||||
|
|
||||||
|
var outputPort = inputsOutputs.OutputPorts[config.ControlPortName];
|
||||||
|
if (outputPort != null && outputPort.Port is ICec)
|
||||||
|
return outputPort.Port as ICec;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.Console(1, "GetCecPort Exception Message: {0}", ex.Message);
|
||||||
|
Debug.Console(2, "GetCecPort Exception StackTrace: {0}", ex.StackTrace);
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
Debug.Console(0, "GetCecPort Exception InnerException: {0}", ex.InnerException);
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, "GetCecPort: Device '{0}' does not have a CEC port called '{1}'",
|
||||||
|
config.ControlPortDevKey, config.ControlPortName);
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -226,12 +226,18 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class IrOutPortConfig
|
public class IrOutPortConfig
|
||||||
{
|
{
|
||||||
|
[JsonProperty("port")]
|
||||||
public IROutputPort Port { get; set; }
|
public IROutputPort Port { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("fileName")]
|
||||||
public string FileName { get; set; }
|
public string FileName { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("useBridgeJoinMap")]
|
||||||
|
public bool UseBridgeJoinMap { get; set; }
|
||||||
|
|
||||||
public IrOutPortConfig()
|
public IrOutPortConfig()
|
||||||
{
|
{
|
||||||
FileName = "";
|
FileName = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using PepperDash.Essentials.Core;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core.DeviceInfo
|
||||||
|
{
|
||||||
|
public static class NetworkDeviceHelpers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Event raised when ArpTable changes
|
||||||
|
/// </summary>
|
||||||
|
public static event ArpTableEventHandler ArpTableUpdated;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delegate called by ArpTableUpdated
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="args">contains the entire ARP table and a bool to note if there was an error in retrieving the data</param>
|
||||||
|
public delegate void ArpTableEventHandler(ArpTableEventArgs args);
|
||||||
|
|
||||||
|
private static readonly char NewLineSplitter = CrestronEnvironment.NewLine.ToCharArray().First();
|
||||||
|
private static readonly string NewLine = CrestronEnvironment.NewLine;
|
||||||
|
|
||||||
|
private static readonly CCriticalSection Lock = new CCriticalSection();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Last resolved ARP table - it is recommended to refresh the arp before using this.
|
||||||
|
/// </summary>
|
||||||
|
public static List<ArpEntry> ArpTable { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Force recheck of ARP table
|
||||||
|
/// </summary>
|
||||||
|
public static void RefreshArp()
|
||||||
|
{
|
||||||
|
var error = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Lock.Enter();
|
||||||
|
var consoleResponse = string.Empty;
|
||||||
|
if (!CrestronConsole.SendControlSystemCommand("showarptable", ref consoleResponse)) return;
|
||||||
|
if (string.IsNullOrEmpty(consoleResponse))
|
||||||
|
{
|
||||||
|
error = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ArpTable.Clear();
|
||||||
|
|
||||||
|
Debug.Console(2, "ConsoleResponse of 'showarptable' : {0}{1}", NewLine, consoleResponse);
|
||||||
|
|
||||||
|
var myLines =
|
||||||
|
consoleResponse.Split(NewLineSplitter)
|
||||||
|
.ToList()
|
||||||
|
.Where(o => (o.Contains(':') && !o.Contains("Type", StringComparison.OrdinalIgnoreCase)))
|
||||||
|
.ToList();
|
||||||
|
foreach (var line in myLines)
|
||||||
|
{
|
||||||
|
var item = line;
|
||||||
|
var seperator = item.Contains('\t') ? '\t' : ' ';
|
||||||
|
var dataPoints = item.Split(seperator);
|
||||||
|
if (dataPoints == null || dataPoints.Length < 2) continue;
|
||||||
|
var ipAddress = SanitizeIpAddress(dataPoints.First().TrimAll());
|
||||||
|
var macAddress = dataPoints.Last();
|
||||||
|
ArpTable.Add(new ArpEntry(ipAddress, macAddress));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Exception in \"RefreshArp\" : {0}", ex.Message);
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Lock.Leave();
|
||||||
|
OnArpTableUpdated(new ArpTableEventArgs(ArpTable, error));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static void OnArpTableUpdated(ArpTableEventArgs args)
|
||||||
|
{
|
||||||
|
if (args == null) return;
|
||||||
|
var handler = ArpTableUpdated;
|
||||||
|
if (handler == null) return;
|
||||||
|
handler.Invoke(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
static NetworkDeviceHelpers()
|
||||||
|
{
|
||||||
|
ArpTable = new List<ArpEntry>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Removes leading zeros, leading whitespace, and trailing whitespace from an IPAddress string
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ipAddressIn">Ip Address to Santitize</param>
|
||||||
|
/// <returns>Sanitized Ip Address</returns>
|
||||||
|
public static string SanitizeIpAddress(string ipAddressIn)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var ipAddress = IPAddress.Parse(ipAddressIn.TrimStart('0'));
|
||||||
|
return ipAddress.ToString();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Unable to Santize Ip : {0}", ex.Message);
|
||||||
|
return ipAddressIn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resolves a hostname by IP Address using DNS
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ipAddress">IP Address to resolve from</param>
|
||||||
|
/// <returns>Resolved Hostname - on failure to determine hostname, will return IP Address</returns>
|
||||||
|
public static string ResolveHostnameFromIp(string ipAddress)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var santitizedIp = SanitizeIpAddress(ipAddress);
|
||||||
|
var hostEntry = Dns.GetHostEntry(santitizedIp);
|
||||||
|
return hostEntry == null ? ipAddress : hostEntry.HostName;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Exception Resolving Hostname from IP Address : {0}", ex.Message);
|
||||||
|
return ipAddress;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resolves an IP Address by hostname using DNS
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hostName">Hostname to resolve from</param>
|
||||||
|
/// <returns>Resolved IP Address - on a failure to determine IP Address, will return hostname</returns>
|
||||||
|
public static string ResolveIpFromHostname(string hostName)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var hostEntry = Dns.GetHostEntry(hostName);
|
||||||
|
return hostEntry == null ? hostName : hostEntry.AddressList.First().ToString();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.Console(0, "Exception Resolving IP Address from Hostname : {0}", ex.Message);
|
||||||
|
return hostName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Object to hold data about an arp entry
|
||||||
|
/// </summary>
|
||||||
|
public class ArpEntry
|
||||||
|
{
|
||||||
|
public readonly IPAddress IpAddress;
|
||||||
|
public readonly string MacAddress;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructs new ArpEntry object
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="ipAddress">string formatted as ipv4 address</param>
|
||||||
|
/// <param name="macAddress">mac address string - format is unimportant</param>
|
||||||
|
public ArpEntry(string ipAddress, string macAddress)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(ipAddress))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("\"ipAddress\" cannot be null or empty");
|
||||||
|
}
|
||||||
|
if (string.IsNullOrEmpty(macAddress))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("\"macAddress\" cannot be null or empty");
|
||||||
|
}
|
||||||
|
IpAddress = IPAddress.Parse(ipAddress.TrimStart().TrimStart('0').TrimEnd());
|
||||||
|
MacAddress = macAddress;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Arguments passed by the ArpTableUpdated event
|
||||||
|
/// </summary>
|
||||||
|
public class ArpTableEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The retrieved ARP Table
|
||||||
|
/// </summary>
|
||||||
|
public readonly List<ArpEntry> ArpTable;
|
||||||
|
/// <summary>
|
||||||
|
/// True if there was a problem retrieving the ARP Table
|
||||||
|
/// </summary>
|
||||||
|
public readonly bool Error;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for ArpTableEventArgs
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="arpTable">The entirety of the retrieved ARP table</param>
|
||||||
|
/// <param name="error">True of an error was encountered updating the ARP table</param>
|
||||||
|
public ArpTableEventArgs(List<ArpEntry> arpTable, bool error)
|
||||||
|
{
|
||||||
|
ArpTable = arpTable;
|
||||||
|
Error = error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor for ArpTableEventArgs - assumes no error encountered in retrieving ARP Table
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="arpTable">The entirety of the retrieved ARP table</param>
|
||||||
|
public ArpTableEventArgs(List<ArpEntry> arpTable)
|
||||||
|
{
|
||||||
|
ArpTable = arpTable;
|
||||||
|
Error = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -379,30 +379,28 @@ 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)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Device {0} has {1} Input Ports:", s, inputPorts.Count);
|
CrestronConsole.ConsoleCommandResponse("Device {0} has {1} Input Ports:{2}", s, inputPorts.Count, CrestronEnvironment.NewLine);
|
||||||
foreach (var routingInputPort in inputPorts)
|
foreach (var routingInputPort in inputPorts)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "{0}", routingInputPort.Key);
|
CrestronConsole.ConsoleCommandResponse("{0}{1}", routingInputPort.Key, CrestronEnvironment.NewLine);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (outputPorts != null)
|
if (outputPorts == null) return;
|
||||||
{
|
CrestronConsole.ConsoleCommandResponse("Device {0} has {1} Output Ports:{2}", s, outputPorts.Count, CrestronEnvironment.NewLine);
|
||||||
Debug.Console(0, "Device {0} has {1} Output Ports:", s, outputPorts.Count);
|
foreach (var routingOutputPort in outputPorts)
|
||||||
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
|
||||||
@@ -435,7 +433,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
if (device == null)
|
if (device == null)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Unable to get device with key: {0}", deviceKey);
|
CrestronConsole.ConsoleCommandResponse("Unable to get device with key: {0}", deviceKey);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -447,7 +445,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Unable to convert setting value. Please use off/rx/tx/both");
|
CrestronConsole.ConsoleCommandResponse("Unable to convert setting value. Please use off/rx/tx/both");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,18 +456,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);
|
||||||
Debug.Console(0, "Device: '{0}' debug level set to {1} for {2} minutes", deviceKey, debugSetting, min);
|
CrestronConsole.ConsoleCommandResponse("Device: '{0}' debug level set to {1} for {2} minutes", deviceKey, debugSetting, min);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "Unable to convert minutes or settings value. Please use an integer value for minutes. Errro: {0}", e);
|
CrestronConsole.ConsoleCommandResponse("Unable to convert minutes or settings value. Please use an integer value for minutes. Error: {0}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
device.StreamDebugging.SetDebuggingWithDefaultTimeout(debugSetting);
|
device.StreamDebugging.SetDebuggingWithDefaultTimeout(debugSetting);
|
||||||
Debug.Console(0, "Device: '{0}' debug level set to {1} for default time (30 minutes)", deviceKey, debugSetting);
|
CrestronConsole.ConsoleCommandResponse("Device: '{0}' debug level set to {1} for default time (30 minutes)", deviceKey, debugSetting);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,6 +121,41 @@ namespace PepperDash.Essentials.Core
|
|||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract class ProcessorExtensionDeviceFactory<T> : IProcessorExtensionDeviceFactory where T: EssentialsDevice
|
||||||
|
{
|
||||||
|
#region IProcessorExtensionDeviceFactory Members
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A list of strings that can be used in the type property of a DeviceConfig object to build an instance of this device
|
||||||
|
/// </summary>
|
||||||
|
public List<string> TypeNames { get; protected set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Loads an item to the ProcessorExtensionDeviceFactory.ProcessorExtensionFactoryMethods dictionary for each entry in the TypeNames list
|
||||||
|
/// </summary>
|
||||||
|
public void LoadFactories()
|
||||||
|
{
|
||||||
|
foreach (var typeName in TypeNames)
|
||||||
|
{
|
||||||
|
//Debug.Console(2, "Getting Description Attribute from class: '{0}'", typeof(T).FullName);
|
||||||
|
var descriptionAttribute = typeof(T).GetCustomAttributes(typeof(DescriptionAttribute), true) as DescriptionAttribute[];
|
||||||
|
string description = descriptionAttribute[0].Description;
|
||||||
|
var snippetAttribute = typeof(T).GetCustomAttributes(typeof(ConfigSnippetAttribute), true) as ConfigSnippetAttribute[];
|
||||||
|
ProcessorExtensionDeviceFactory.AddFactoryForType(typeName.ToLower(), description, typeof(T), BuildDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The method that will build the device
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dc">The device config</param>
|
||||||
|
/// <returns>An instance of the device</returns>
|
||||||
|
public abstract EssentialsDevice BuildDevice(DeviceConfig dc);
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Devices the basic needs for a Device Factory
|
/// Devices the basic needs for a Device Factory
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -2,12 +2,13 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
using Crestron.SimplSharpPro.DeviceSupport;
|
||||||
using Full.Newtonsoft.Json;
|
using Full.Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
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.Bridges.JoinMaps;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Devices
|
namespace PepperDash.Essentials.Core.Devices
|
||||||
{
|
{
|
||||||
@@ -21,12 +22,11 @@ namespace PepperDash.Essentials.Core.Devices
|
|||||||
|
|
||||||
private readonly IrOutputPortController _port;
|
private readonly IrOutputPortController _port;
|
||||||
|
|
||||||
public string[] IrCommands {get { return _port.IrFileCommands; }}
|
public string[] IrCommands {get { return _port.IrFileCommands; }}
|
||||||
|
|
||||||
public GenericIrController(string key, string name, IrOutputPortController irPort) : base(key, name)
|
public GenericIrController(string key, string name, IrOutputPortController irPort) : base(key, name)
|
||||||
{
|
{
|
||||||
_port = irPort;
|
_port = irPort;
|
||||||
|
|
||||||
if (_port == null)
|
if (_port == null)
|
||||||
{
|
{
|
||||||
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "IR Port is null, device will not function");
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "IR Port is null, device will not function");
|
||||||
@@ -73,23 +73,65 @@ namespace PepperDash.Essentials.Core.Devices
|
|||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
if (!string.IsNullOrEmpty(joinMapSerialized))
|
||||||
joinMap = JsonConvert.DeserializeObject<GenericIrControllerJoinMap>(joinMapSerialized);
|
joinMap = JsonConvert.DeserializeObject<GenericIrControllerJoinMap>(joinMapSerialized);
|
||||||
|
|
||||||
for (uint i = 0; i < _port.IrFileCommands.Length; i++)
|
if (_port.UseBridgeJoinMap)
|
||||||
{
|
{
|
||||||
var cmd = _port.IrFileCommands[i];
|
Debug.Console(0, this, "Using new IR bridge join map");
|
||||||
var joinData = new JoinDataComplete(new JoinData {JoinNumber = i, JoinSpan = 1},
|
|
||||||
new JoinMetadata
|
|
||||||
{
|
|
||||||
Description = cmd,
|
|
||||||
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
|
||||||
JoinType = eJoinType.Digital
|
|
||||||
});
|
|
||||||
|
|
||||||
joinData.SetJoinOffset(joinStart);
|
var bridgeJoins = joinMap.Joins.Where((kv) => _port.IrFileCommands.Any(cmd => cmd == kv.Key)).ToDictionary(kv => kv.Key);
|
||||||
|
if (bridgeJoins == null)
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Failed to link new IR bridge join map");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
joinMap.Joins.Add(cmd,joinData);
|
joinMap.Joins.Clear();
|
||||||
|
|
||||||
trilist.SetBoolSigAction(joinData.JoinNumber, (b) => Press(cmd, b));
|
foreach (var bridgeJoin in bridgeJoins)
|
||||||
}
|
{
|
||||||
|
var key = bridgeJoin.Key;
|
||||||
|
var joinDataKey = bridgeJoin.Value.Key;
|
||||||
|
var joinDataValue = bridgeJoin.Value.Value;
|
||||||
|
var joinNumber = bridgeJoin.Value.Value.JoinNumber;
|
||||||
|
|
||||||
|
Debug.Console(2, this, @"bridgeJoin: Key-'{0}'
|
||||||
|
Value.Key-'{1}'
|
||||||
|
Value.JoinNumber-'{2}'
|
||||||
|
Value.Metadata.Description-'{3}'",
|
||||||
|
key,
|
||||||
|
joinDataKey,
|
||||||
|
joinNumber,
|
||||||
|
joinDataValue.Metadata.Description);
|
||||||
|
|
||||||
|
|
||||||
|
joinMap.Joins.Add(key, joinDataValue);
|
||||||
|
|
||||||
|
trilist.SetBoolSigAction(joinNumber, (b) => Press(key, b));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(0, this, "Using legacy IR join mapping based on available IR commands");
|
||||||
|
|
||||||
|
joinMap.Joins.Clear();
|
||||||
|
|
||||||
|
for (uint i = 0; i < _port.IrFileCommands.Length; i++)
|
||||||
|
{
|
||||||
|
var cmd = _port.IrFileCommands[i];
|
||||||
|
var joinData = new JoinDataComplete(new JoinData { JoinNumber = i, JoinSpan = 1 },
|
||||||
|
new JoinMetadata
|
||||||
|
{
|
||||||
|
Description = cmd,
|
||||||
|
JoinCapabilities = eJoinCapabilities.FromSIMPL,
|
||||||
|
JoinType = eJoinType.Digital
|
||||||
|
});
|
||||||
|
|
||||||
|
joinData.SetJoinOffset(joinStart);
|
||||||
|
|
||||||
|
joinMap.Joins.Add(cmd, joinData);
|
||||||
|
|
||||||
|
trilist.SetBoolSigAction(joinData.JoinNumber, (b) => Press(cmd, b));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
joinMap.PrintJoinMapInfo();
|
joinMap.PrintJoinMapInfo();
|
||||||
|
|
||||||
@@ -111,13 +153,6 @@ namespace PepperDash.Essentials.Core.Devices
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class GenericIrControllerJoinMap : JoinMapBaseAdvanced
|
|
||||||
{
|
|
||||||
public GenericIrControllerJoinMap(uint joinStart) : base(joinStart)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class GenericIrControllerFactory : EssentialsDeviceFactory<GenericIrController>
|
public class GenericIrControllerFactory : EssentialsDeviceFactory<GenericIrController>
|
||||||
{
|
{
|
||||||
public GenericIrControllerFactory()
|
public GenericIrControllerFactory()
|
||||||
|
|||||||
@@ -72,6 +72,10 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
IBasicVolumeControls CurrentVolumeControls { get; }
|
IBasicVolumeControls CurrentVolumeControls { get; }
|
||||||
event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||||
|
|
||||||
|
void SetDefaultLevels();
|
||||||
|
|
||||||
|
bool ZeroVolumeWhenSwtichingVolumeDevices { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
public string[] IrFileCommands { get { return IrPort.AvailableStandardIRCmds(IrPortUid); } }
|
public string[] IrFileCommands { get { return IrPort.AvailableStandardIRCmds(IrPortUid); } }
|
||||||
|
|
||||||
|
public bool UseBridgeJoinMap { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor for IrDevice base class. If a null port is provided, this class will
|
/// Constructor for IrDevice base class. If a null port is provided, this class will
|
||||||
/// still function without trying to talk to a port.
|
/// still function without trying to talk to a port.
|
||||||
@@ -55,9 +57,10 @@ namespace PepperDash.Essentials.Core
|
|||||||
: base(key)
|
: base(key)
|
||||||
{
|
{
|
||||||
DriverLoaded = new BoolFeedback(() => DriverIsLoaded);
|
DriverLoaded = new BoolFeedback(() => DriverIsLoaded);
|
||||||
|
UseBridgeJoinMap = config.Properties["control"].Value<bool>("useBridgeJoinMap");
|
||||||
AddPostActivationAction(() =>
|
AddPostActivationAction(() =>
|
||||||
{
|
{
|
||||||
IrPort = postActivationFunc(config);
|
IrPort = postActivationFunc(config);
|
||||||
|
|
||||||
if (IrPort == null)
|
if (IrPort == null)
|
||||||
{
|
{
|
||||||
@@ -69,8 +72,8 @@ namespace PepperDash.Essentials.Core
|
|||||||
Debug.Console(1, "*************Attempting to load IR file: {0}***************", filePath);
|
Debug.Console(1, "*************Attempting to load IR file: {0}***************", filePath);
|
||||||
|
|
||||||
LoadDriver(filePath);
|
LoadDriver(filePath);
|
||||||
|
|
||||||
PrintAvailableCommands();
|
PrintAvailableCommands();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
using PepperDash.Essentials.Core;
|
||||||
@@ -8,6 +9,7 @@ namespace PepperDash_Essentials_Core.Devices
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for any device that is able to control it'spower and has a configurable reboot time
|
/// Interface for any device that is able to control it'spower and has a configurable reboot time
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("PepperDash_Essentials_Core.Devices is Deprecated - use PepperDash.Essentials.Core")]
|
||||||
public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
|
public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -24,6 +26,7 @@ namespace PepperDash_Essentials_Core.Devices
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interface for any device that contains a collection of IHasPowerReboot Devices
|
/// Interface for any device that contains a collection of IHasPowerReboot Devices
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
[Obsolete("PepperDash_Essentials_Core.Devices is Deprecated - use PepperDash.Essentials.Core")]
|
||||||
public interface IHasControlledPowerOutlets : IKeyName
|
public interface IHasControlledPowerOutlets : IKeyName
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
87
src/PepperDash.Essentials.Core/Devices/PowerInterfaces.cs
Normal file
87
src/PepperDash.Essentials.Core/Devices/PowerInterfaces.cs
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
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; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -8,17 +9,70 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
public static class StringExtensions
|
public static class StringExtensions
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Returns null if a string is empty, otherwise returns the string
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="s">string input</param>
|
||||||
|
/// <returns>null if the string is emtpy, otherwise returns the string</returns>
|
||||||
public static string NullIfEmpty(this string s)
|
public static string NullIfEmpty(this string s)
|
||||||
{
|
{
|
||||||
return string.IsNullOrEmpty(s) ? null : s;
|
return string.IsNullOrEmpty(s) ? null : s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns null if a string is empty or made of only whitespace characters, otherwise returns the string
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="s">string input</param>
|
||||||
|
/// <returns>null if the string is wempty or made of only whitespace characters, otherwise returns the string</returns>
|
||||||
public static string NullIfWhiteSpace(this string s)
|
public static string NullIfWhiteSpace(this string s)
|
||||||
{
|
{
|
||||||
return string.IsNullOrEmpty(s.Trim()) ? null : s;
|
return string.IsNullOrEmpty(s.Trim()) ? null : s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a replacement string if the input string is empty or made of only whitespace characters, otherwise returns the input string
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="s">input string</param>
|
||||||
|
/// <param name="newString">string to replace with if input string is empty or whitespace</param>
|
||||||
|
/// <returns>returns newString if s is null, emtpy, or made of whitespace characters, otherwise returns s</returns>
|
||||||
public static string ReplaceIfNullOrEmpty(this string s, string newString)
|
public static string ReplaceIfNullOrEmpty(this string s, string newString)
|
||||||
{
|
{
|
||||||
return string.IsNullOrEmpty(s) ? newString : s;
|
return string.IsNullOrEmpty(s) ? newString : s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Overload for Contains that allows setting an explicit String Comparison
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source">Source String</param>
|
||||||
|
/// <param name="toCheck">String to check in Source String</param>
|
||||||
|
/// <param name="comp">Comparison parameters</param>
|
||||||
|
/// <returns>true of string contains "toCheck"</returns>
|
||||||
|
public static bool Contains(this string source, string toCheck, StringComparison comp)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(source)) return false;
|
||||||
|
return source.IndexOf(toCheck, comp) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Performs TrimStart() and TrimEnd() on source string
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source">String to Trim</param>
|
||||||
|
/// <returns>Trimmed String</returns>
|
||||||
|
public static string TrimAll(this string source)
|
||||||
|
{
|
||||||
|
return string.IsNullOrEmpty(source) ? string.Empty : source.TrimStart().TrimEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Performs TrimStart(chars char[]) and TrimEnd(chars char[]) on source string.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source">String to Trim</param>
|
||||||
|
/// <param name="chars">Char Array to trim from string</param>
|
||||||
|
/// <returns>Trimmed String</returns>
|
||||||
|
public static string TrimAll(this string source, char[] chars)
|
||||||
|
{
|
||||||
|
return string.IsNullOrEmpty(source) ? string.Empty : source.TrimStart(chars).TrimEnd(chars);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,20 +1,13 @@
|
|||||||
extern alias Full;
|
extern alias Full;
|
||||||
|
|
||||||
|
using Crestron.SimplSharp;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
using Full.Newtonsoft.Json.Linq;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.GeneralIO;
|
|
||||||
using Crestron.SimplSharp.Reflection;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using Full.Newtonsoft.Json.Linq;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using PepperDash.Essentials.Core.CrestronIO;
|
|
||||||
using PepperDash.Essentials.Core.Touchpanels;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
@@ -174,33 +167,26 @@ 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="command"></param>
|
/// <param name="filter"></param>
|
||||||
public static void GetDeviceFactoryTypes(string filter)
|
public static void GetDeviceFactoryTypes(string filter)
|
||||||
{
|
{
|
||||||
Dictionary<string, DeviceFactoryWrapper> types = new Dictionary<string, DeviceFactoryWrapper>();
|
var types = !string.IsNullOrEmpty(filter)
|
||||||
|
? FactoryMethods.Where(k => k.Key.Contains(filter)).ToDictionary(k => k.Key, k => k.Value)
|
||||||
|
: FactoryMethods;
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(filter))
|
CrestronConsole.ConsoleCommandResponse("Device Types:");
|
||||||
{
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug.Console(0,
|
CrestronConsole.ConsoleCommandResponse(
|
||||||
@"Type: '{0}'
|
@"Type: '{0}'
|
||||||
CType: '{1}'
|
CType: '{1}'
|
||||||
Description: {2}", type.Key, cType, description);
|
Description: {2}", type.Key, cType, description);
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
public interface IProcessorExtensionDeviceFactory
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Loads all the extension factories to the ProcessorExtensionDeviceFactory
|
||||||
|
/// </summary>
|
||||||
|
void LoadFactories();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,155 @@
|
|||||||
|
extern alias Full;
|
||||||
|
using Crestron.SimplSharp.Reflection;
|
||||||
|
using Full.Newtonsoft.Json.Linq;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using PepperDash.Core;
|
||||||
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace PepperDash.Essentials.Core
|
||||||
|
{
|
||||||
|
|
||||||
|
public class ProcessorExtensionDeviceFactory
|
||||||
|
{
|
||||||
|
public ProcessorExtensionDeviceFactory() {
|
||||||
|
var assy = Assembly.GetExecutingAssembly();
|
||||||
|
PluginLoader.SetEssentialsAssembly(assy.GetName().Name, assy);
|
||||||
|
|
||||||
|
var extensions = assy.GetTypes().Where(ct => typeof(IProcessorExtensionDeviceFactory)
|
||||||
|
.IsAssignableFrom(ct) && !ct.IsInterface && !ct.IsAbstract);
|
||||||
|
|
||||||
|
if (extensions != null )
|
||||||
|
{
|
||||||
|
foreach ( var extension in extensions )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var factory = (IProcessorExtensionDeviceFactory)Crestron.SimplSharp.Reflection.Activator.CreateInstance(extension);
|
||||||
|
factory.LoadFactories();
|
||||||
|
}
|
||||||
|
catch( Exception e )
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to load extension device: '{1}' ProcessorExtensionDeviceFactory: {0}", e, extension.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A dictionary of factory methods, keyed by config types, added by plugins.
|
||||||
|
/// These methods are looked up and called by GetDevice in this class.
|
||||||
|
/// </summary>
|
||||||
|
static Dictionary<string, DeviceFactoryWrapper> ProcessorExtensionFactoryMethods =
|
||||||
|
new Dictionary<string, DeviceFactoryWrapper>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds a plugin factory method
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dc"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static void AddFactoryForType(string extensionName, Func<DeviceConfig, IKeyed> method)
|
||||||
|
{
|
||||||
|
//Debug.Console(1, Debug.ErrorLogLevel.Notice, "Adding factory method for type '{0}'", typeName);
|
||||||
|
ProcessorExtensionDeviceFactory.ProcessorExtensionFactoryMethods.Add(extensionName, new DeviceFactoryWrapper() { FactoryMethod = method });
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddFactoryForType(string extensionName, string description, CType cType, Func<DeviceConfig, IKeyed> method)
|
||||||
|
{
|
||||||
|
//Debug.Console(1, Debug.ErrorLogLevel.Notice, "Adding factory method for type '{0}'", typeName);
|
||||||
|
|
||||||
|
if (ProcessorExtensionFactoryMethods.ContainsKey(extensionName))
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to add extension device: '{0}'. Already exists in ProcessorExtensionDeviceFactory", extensionName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var wrapper = new DeviceFactoryWrapper() { CType = cType, Description = description, FactoryMethod = method };
|
||||||
|
ProcessorExtensionDeviceFactory.ProcessorExtensionFactoryMethods.Add(extensionName, wrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CheckForSecrets(IEnumerable<Full.Newtonsoft.Json.Linq.JProperty> obj)
|
||||||
|
{
|
||||||
|
foreach (var prop in obj.Where(prop => prop.Value as Full.Newtonsoft.Json.Linq.JObject != null))
|
||||||
|
{
|
||||||
|
if (prop.Name.ToLower() == "secret")
|
||||||
|
{
|
||||||
|
var secret = GetSecret(prop.Children().First().ToObject<SecretsPropertiesConfig>());
|
||||||
|
//var secret = GetSecret(JsonConvert.DeserializeObject<SecretsPropertiesConfig>(prop.Children().First().ToString()));
|
||||||
|
prop.Parent.Replace(secret);
|
||||||
|
}
|
||||||
|
var recurseProp = prop.Value as Full.Newtonsoft.Json.Linq.JObject;
|
||||||
|
if (recurseProp == null) return;
|
||||||
|
CheckForSecrets(recurseProp.Properties());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetSecret(SecretsPropertiesConfig data)
|
||||||
|
{
|
||||||
|
var secretProvider = SecretsManager.GetSecretProviderByKey(data.Provider);
|
||||||
|
if (secretProvider == null) return null;
|
||||||
|
var secret = secretProvider.GetSecret(data.Key);
|
||||||
|
if (secret != null) return (string)secret.Value;
|
||||||
|
Debug.Console(1,
|
||||||
|
"Unable to retrieve secret {0}{1} - Make sure you've added it to the secrets provider",
|
||||||
|
data.Provider, data.Key);
|
||||||
|
return String.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The factory method for processor extension devices. Also iterates the Factory methods that have
|
||||||
|
/// been loaded from plugins
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dc"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static IKeyed GetExtensionDevice(DeviceConfig dc)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Loading '{0}' from Essentials Core", dc.Type);
|
||||||
|
|
||||||
|
var localDc = new DeviceConfig(dc);
|
||||||
|
|
||||||
|
var key = localDc.Key;
|
||||||
|
var name = localDc.Name;
|
||||||
|
var type = localDc.Type;
|
||||||
|
var properties = localDc.Properties;
|
||||||
|
//var propRecurse = properties;
|
||||||
|
|
||||||
|
var typeName = localDc.Type.ToLower();
|
||||||
|
|
||||||
|
var jObject = properties as Full.Newtonsoft.Json.Linq.JObject;
|
||||||
|
if (jObject != null)
|
||||||
|
{
|
||||||
|
var jProp = jObject.Properties();
|
||||||
|
|
||||||
|
CheckForSecrets(jProp);
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(2, "typeName = {0}", typeName);
|
||||||
|
// Check for types that have been added by plugin dlls.
|
||||||
|
return !ProcessorExtensionFactoryMethods.ContainsKey(typeName) ? null : ProcessorExtensionFactoryMethods[typeName].FactoryMethod(localDc);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Exception occurred while creating device {0}: {1}", dc.Key, ex.Message);
|
||||||
|
|
||||||
|
Debug.Console(2, "{0}", ex.StackTrace);
|
||||||
|
|
||||||
|
if (ex.InnerException == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, Debug.ErrorLogLevel.Error, "Inner exception while creating device {0}: {1}", dc.Key,
|
||||||
|
ex.InnerException.Message);
|
||||||
|
Debug.Console(2, "{0}", ex.InnerException.StackTrace);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -21,35 +21,37 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="fileName"></param>
|
/// <param name="fileName"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static FileInfo[] GetFiles(string fileName)
|
public static FileInfo[] GetFiles(string fileName)
|
||||||
{
|
{
|
||||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
|
string fullFilePath = Global.FilePathPrefix + fileName;
|
||||||
var files = dirInfo.GetFiles(Path.GetFileName(fileName));
|
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fullFilePath));
|
||||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
|
var files = dirInfo.GetFiles(Path.GetFileName(fullFilePath));
|
||||||
if (files.Count() > 0)
|
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fullFilePath);
|
||||||
{
|
if (files.Count() > 0)
|
||||||
return files;
|
{
|
||||||
}
|
return files;
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
return null;
|
{
|
||||||
}
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static FileInfo GetFile(string fileName)
|
public static FileInfo GetFile(string fileName)
|
||||||
{
|
{
|
||||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
|
string fullFilePath = Global.FilePathPrefix + fileName;
|
||||||
var files = dirInfo.GetFiles(Path.GetFileName(fileName));
|
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fullFilePath));
|
||||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
|
var files = dirInfo.GetFiles(Path.GetFileName(fullFilePath));
|
||||||
if (files.Count() > 0)
|
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fullFilePath);
|
||||||
{
|
if (files.Count() > 0)
|
||||||
return files.FirstOrDefault();
|
{
|
||||||
}
|
return files.FirstOrDefault();
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
return null;
|
{
|
||||||
}
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -81,7 +83,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
if (fileLock.TryEnter())
|
if (fileLock.TryEnter())
|
||||||
{
|
{
|
||||||
DirectoryInfo dirInfo = new DirectoryInfo(file.Name);
|
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))
|
||||||
@@ -202,7 +204,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
public static void WriteDataToFile(string data, string filePath)
|
public static void WriteDataToFile(string data, string filePath)
|
||||||
{
|
{
|
||||||
Thread _WriteFileThread;
|
Thread _WriteFileThread;
|
||||||
_WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended);
|
_WriteFileThread = new Thread((O) => _WriteFileMethod(data, Global.FilePathPrefix + "/" + filePath), null, Thread.eThreadStartOptions.CreateSuspended);
|
||||||
_WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority;
|
_WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority;
|
||||||
_WriteFileThread.Start();
|
_WriteFileThread.Start();
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
|
Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
|
||||||
@@ -217,7 +219,8 @@ 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();
|
||||||
|
|||||||
@@ -150,15 +150,20 @@ namespace PepperDash.Essentials.Core.Fusion
|
|||||||
ReadGuidFile(guidFilePath);
|
ReadGuidFile(guidFilePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Room.RoomOccupancy != null)
|
var occupancyRoom = Room as IRoomOccupancy;
|
||||||
|
|
||||||
|
if (occupancyRoom != null)
|
||||||
{
|
{
|
||||||
if (Room.OccupancyStatusProviderIsRemote)
|
if (occupancyRoom.RoomOccupancy != null)
|
||||||
{
|
{
|
||||||
SetUpRemoteOccupancy();
|
if (occupancyRoom.OccupancyStatusProviderIsRemote)
|
||||||
}
|
{
|
||||||
else
|
SetUpRemoteOccupancy();
|
||||||
{
|
}
|
||||||
SetUpLocalOccupancy();
|
else
|
||||||
|
{
|
||||||
|
SetUpLocalOccupancy();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1525,10 +1530,15 @@ namespace PepperDash.Essentials.Core.Fusion
|
|||||||
// Tie to method on occupancy object
|
// Tie to method on occupancy object
|
||||||
//occSensorShutdownMinutes.OutputSig.UserObject(new Action(ushort)(b => Room.OccupancyObj.SetShutdownMinutes(b));
|
//occSensorShutdownMinutes.OutputSig.UserObject(new Action(ushort)(b => Room.OccupancyObj.SetShutdownMinutes(b));
|
||||||
|
|
||||||
|
var occRoom = Room as IRoomOccupancy;
|
||||||
|
|
||||||
|
if (occRoom != null)
|
||||||
|
{
|
||||||
|
occRoom.RoomOccupancy.RoomIsOccupiedFeedback.LinkInputSig(occSensorAsset.RoomOccupied.InputSig);
|
||||||
|
occRoom.RoomOccupancy.RoomIsOccupiedFeedback.OutputChange += RoomIsOccupiedFeedback_OutputChange;
|
||||||
|
}
|
||||||
RoomOccupancyRemoteStringFeedback = new StringFeedback(() => _roomOccupancyRemoteString);
|
RoomOccupancyRemoteStringFeedback = new StringFeedback(() => _roomOccupancyRemoteString);
|
||||||
Room.RoomOccupancy.RoomIsOccupiedFeedback.LinkInputSig(occSensorAsset.RoomOccupied.InputSig);
|
|
||||||
Room.RoomOccupancy.RoomIsOccupiedFeedback.OutputChange += RoomIsOccupiedFeedback_OutputChange;
|
|
||||||
RoomOccupancyRemoteStringFeedback.LinkInputSig(occSensorAsset.RoomOccupancyInfo.InputSig);
|
RoomOccupancyRemoteStringFeedback.LinkInputSig(occSensorAsset.RoomOccupancyInfo.InputSig);
|
||||||
|
|
||||||
//}
|
//}
|
||||||
|
|||||||
@@ -2,10 +2,8 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Crestron.SimplSharp.Reflection;
|
using Crestron.SimplSharp.Reflection;
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
using Crestron.SimplSharp.CrestronIO;
|
||||||
@@ -105,22 +103,22 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void PrintJoinMapInfo()
|
public void PrintJoinMapInfo()
|
||||||
{
|
{
|
||||||
Debug.Console(0, "{0}:\n", GetType().Name);
|
CrestronConsole.ConsoleCommandResponse("{0}:\n", GetType().Name);
|
||||||
|
|
||||||
// Get the joins of each type and print them
|
// Get the joins of each type and print them
|
||||||
Debug.Console(0, "Digitals:");
|
CrestronConsole.ConsoleCommandResponse("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);
|
||||||
Debug.Console(2, "Found {0} Digital Joins", digitals.Count);
|
CrestronConsole.ConsoleCommandResponse("Found {0} Digital Joins", digitals.Count);
|
||||||
PrintJoinList(GetSortedJoins(digitals));
|
PrintJoinList(GetSortedJoins(digitals));
|
||||||
|
|
||||||
Debug.Console(0, "Analogs:");
|
CrestronConsole.ConsoleCommandResponse("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);
|
||||||
Debug.Console(2, "Found {0} Analog Joins", analogs.Count);
|
CrestronConsole.ConsoleCommandResponse("Found {0} Analog Joins", analogs.Count);
|
||||||
PrintJoinList(GetSortedJoins(analogs));
|
PrintJoinList(GetSortedJoins(analogs));
|
||||||
|
|
||||||
Debug.Console(0, "Serials:");
|
CrestronConsole.ConsoleCommandResponse("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);
|
||||||
Debug.Console(2, "Found {0} Serial Joins", serials.Count);
|
CrestronConsole.ConsoleCommandResponse("Found {0} Serial Joins", serials.Count);
|
||||||
PrintJoinList(GetSortedJoins(serials));
|
PrintJoinList(GetSortedJoins(serials));
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -143,7 +141,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
foreach (var join in joins)
|
foreach (var join in joins)
|
||||||
{
|
{
|
||||||
Debug.Console(0,
|
CrestronConsole.ConsoleCommandResponse(
|
||||||
@"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,
|
||||||
@@ -238,25 +236,45 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void PrintJoinMapInfo()
|
public void PrintJoinMapInfo()
|
||||||
{
|
{
|
||||||
Debug.Console(0, "{0}:\n", GetType().Name);
|
var sb = JoinmapStringBuilder();
|
||||||
|
|
||||||
|
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
|
||||||
Debug.Console(0, "Digitals:");
|
sb.AppendLine(String.Format("# {0}", GetType().Name));
|
||||||
var digitals = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Digital) == eJoinType.Digital).ToDictionary(j => j.Key, j => j.Value);
|
sb.AppendLine();
|
||||||
Debug.Console(2, "Found {0} Digital Joins", digitals.Count);
|
sb.AppendLine("## Digitals");
|
||||||
PrintJoinList(GetSortedJoins(digitals));
|
sb.AppendLine();
|
||||||
|
// 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();
|
||||||
|
|
||||||
Debug.Console(0, "Analogs:");
|
var analogs =
|
||||||
var analogs = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Analog) == eJoinType.Analog).ToDictionary(j => j.Key, j => j.Value);
|
Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Analog) == eJoinType.Analog)
|
||||||
Debug.Console(2, "Found {0} Analog Joins", analogs.Count);
|
.ToDictionary(j => j.Key, j => j.Value);
|
||||||
PrintJoinList(GetSortedJoins(analogs));
|
var analogSb = AppendJoinList(GetSortedJoins(analogs));
|
||||||
|
analogSb.AppendLine("## Serials");
|
||||||
|
analogSb.AppendLine();
|
||||||
|
|
||||||
Debug.Console(0, "Serials:");
|
var serials =
|
||||||
var serials = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Serial) == eJoinType.Serial).ToDictionary(j => j.Key, j => j.Value);
|
Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Serial) == eJoinType.Serial)
|
||||||
Debug.Console(2, "Found {0} Serial Joins", serials.Count);
|
.ToDictionary(j => j.Key, j => j.Value);
|
||||||
PrintJoinList(GetSortedJoins(serials));
|
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>
|
/// <summary>
|
||||||
/// Prints the join information to console
|
/// Prints the join information to console
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -264,37 +282,11 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
var pluginType = GetType().Name;
|
var pluginType = GetType().Name;
|
||||||
|
|
||||||
Debug.Console(0, "{0}:\n", pluginType);
|
CrestronConsole.ConsoleCommandResponse("{0}:\n", pluginType);
|
||||||
|
|
||||||
var sb = new StringBuilder();
|
|
||||||
|
|
||||||
sb.AppendLine(String.Format("# {0}", GetType().Name));
|
|
||||||
sb.AppendLine(String.Format("Generated from '{0}' on bridge '{1}'", deviceKey, bridgeKey));
|
|
||||||
sb.AppendLine();
|
|
||||||
sb.AppendLine("## 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);
|
|
||||||
Debug.Console(2, "Found {0} Digital Joins", digitals.Count);
|
|
||||||
var digitalSb = AppendJoinList(GetSortedJoins(digitals));
|
|
||||||
digitalSb.AppendLine("## Analogs");
|
|
||||||
digitalSb.AppendLine();
|
|
||||||
|
|
||||||
Debug.Console(0, "Analogs:");
|
WriteJoinmapMarkdown(JoinmapStringBuilder(), pluginType, bridgeKey, deviceKey);
|
||||||
var analogs = Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Analog) == eJoinType.Analog).ToDictionary(j => j.Key, j => j.Value);
|
|
||||||
Debug.Console(2, "Found {0} Analog Joins", analogs.Count);
|
|
||||||
var analogSb = AppendJoinList(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);
|
|
||||||
Debug.Console(2, "Found {0} Serial Joins", serials.Count);
|
|
||||||
var serialSb = AppendJoinList(GetSortedJoins(serials));
|
|
||||||
|
|
||||||
sb.EnsureCapacity(sb.Length + digitalSb.Length + analogSb.Length + serialSb.Length);
|
|
||||||
sb.Append(digitalSb).Append(analogSb).Append(serialSb);
|
|
||||||
|
|
||||||
WriteJoinmapMarkdown(sb, pluginType, bridgeKey, deviceKey);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,7 +297,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
using (var sw = new StreamWriter(fileName))
|
using (var sw = new StreamWriter(fileName))
|
||||||
{
|
{
|
||||||
sw.WriteLine(stringBuilder.ToString());
|
sw.WriteLine(stringBuilder.ToString());
|
||||||
Debug.Console(0, "Joinmap Readme generated and written to {0}", fileName);
|
CrestronConsole.ConsoleCommandResponse("Joinmap Readme generated and written to {0}", fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -315,7 +307,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="joins"></param>
|
/// <param name="joins"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
List<KeyValuePair<string, JoinDataComplete>> GetSortedJoins(Dictionary<string, JoinDataComplete> joins)
|
static List<KeyValuePair<string, JoinDataComplete>> GetSortedJoins(Dictionary<string, JoinDataComplete> joins)
|
||||||
{
|
{
|
||||||
var sortedJoins = joins.ToList();
|
var sortedJoins = joins.ToList();
|
||||||
|
|
||||||
@@ -324,20 +316,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
return sortedJoins;
|
return sortedJoins;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintJoinList(List<KeyValuePair<string, JoinDataComplete>> joins)
|
|
||||||
{
|
|
||||||
foreach (var join in joins)
|
|
||||||
{
|
|
||||||
Debug.Console(0,
|
|
||||||
@"Join Number: {0} | JoinSpan: '{1}' | JoinName: {2} | Description: '{3}' | Type: '{4}' | Capabilities: '{5}'",
|
|
||||||
join.Value.JoinNumber,
|
|
||||||
join.Value.JoinSpan,
|
|
||||||
join.Key,
|
|
||||||
String.IsNullOrEmpty(join.Value.AttributeName) ? join.Value.Metadata.Label : join.Value.AttributeName,
|
|
||||||
join.Value.Metadata.JoinType.ToString(),
|
|
||||||
join.Value.Metadata.JoinCapabilities.ToString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static StringBuilder AppendJoinList(List<KeyValuePair<string, JoinDataComplete>> joins)
|
static StringBuilder AppendJoinList(List<KeyValuePair<string, JoinDataComplete>> joins)
|
||||||
{
|
{
|
||||||
@@ -380,16 +358,18 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
foreach (var customJoinData in joinData)
|
foreach (var customJoinData in joinData)
|
||||||
{
|
{
|
||||||
var join = Joins[customJoinData.Key];
|
JoinDataComplete join;
|
||||||
|
|
||||||
|
if (!Joins.TryGetValue(customJoinData.Key, out join))
|
||||||
|
{
|
||||||
|
Debug.Console(2, "No matching key found in join map for: '{0}'", customJoinData.Key);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (join != null)
|
if (join != null)
|
||||||
{
|
{
|
||||||
join.SetCustomJoinData(customJoinData.Value);
|
join.SetCustomJoinData(customJoinData.Value);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(2, "No matching key found in join map for: '{0}'", customJoinData.Key);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PrintJoinMapInfo();
|
PrintJoinMapInfo();
|
||||||
|
|||||||
@@ -45,7 +45,20 @@ 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 SystemMonitorController(string key)
|
public BoolFeedback IsApplianceFeedback { get; protected set; }
|
||||||
|
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.");
|
||||||
@@ -65,6 +78,9 @@ 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)
|
||||||
@@ -125,6 +141,26 @@ 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;
|
||||||
@@ -187,6 +223,9 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
SerialNumberFeedback.FireUpdate();
|
SerialNumberFeedback.FireUpdate();
|
||||||
ModelFeedback.FireUpdate();
|
ModelFeedback.FireUpdate();
|
||||||
|
|
||||||
|
IsApplianceFeedback.FireUpdate();
|
||||||
|
IsServerFeedback.FireUpdate();
|
||||||
|
|
||||||
OnSystemMonitorPropertiesChanged();
|
OnSystemMonitorPropertiesChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,6 +278,11 @@ 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);
|
||||||
|
|
||||||
@@ -303,11 +347,13 @@ 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;
|
||||||
@@ -519,11 +565,11 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
ProgramUnregisteredFeedback =
|
ProgramUnregisteredFeedback =
|
||||||
new BoolFeedback(() => Program.RegistrationState == eProgramRegistrationState.Unregister);
|
new BoolFeedback(() => Program.RegistrationState == eProgramRegistrationState.Unregister);
|
||||||
ProgramUnregisteredFeedback.FireUpdate();
|
ProgramUnregisteredFeedback.FireUpdate();
|
||||||
|
|
||||||
ProgramNameFeedback = new StringFeedback(() => ProgramInfo.ProgramFile);
|
ProgramNameFeedback = new StringFeedback(() => ProgramInfo.ProgramFile);
|
||||||
|
CrestronDataBaseVersionFeedback = new StringFeedback(() => ProgramInfo.CrestronDb);
|
||||||
|
EnvironmentVersionFeedback = new StringFeedback(() => ProgramInfo.Environment);
|
||||||
ProgramCompileTimeFeedback = new StringFeedback(() => ProgramInfo.CompileTime);
|
ProgramCompileTimeFeedback = new StringFeedback(() => ProgramInfo.CompileTime);
|
||||||
CrestronDataBaseVersionFeedback = new StringFeedback(() => ProgramInfo.CrestronDb);
|
|
||||||
EnvironmentVersionFeedback = new StringFeedback(() => ProgramInfo.Environment);
|
|
||||||
AggregatedProgramInfoFeedback = new StringFeedback(() => JsonConvert.SerializeObject(ProgramInfo));
|
AggregatedProgramInfoFeedback = new StringFeedback(() => JsonConvert.SerializeObject(ProgramInfo));
|
||||||
|
|
||||||
GetProgramInfo();
|
GetProgramInfo();
|
||||||
@@ -576,9 +622,9 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
// Assume no valid program info. Constructing a new object will wipe all properties
|
// Assume no valid program info. Constructing a new object will wipe all properties
|
||||||
ProgramInfo = new ProgramInfo(Program.Number)
|
ProgramInfo = new ProgramInfo(Program.Number)
|
||||||
{
|
{
|
||||||
OperatingState = Program.OperatingState,
|
OperatingState = Program.OperatingState,
|
||||||
RegistrationState = Program.RegistrationState
|
RegistrationState = Program.RegistrationState
|
||||||
};
|
};
|
||||||
|
|
||||||
UpdateFeedbacks();
|
UpdateFeedbacks();
|
||||||
|
|
||||||
@@ -595,13 +641,20 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
|
|
||||||
if (ProgramInfo.ProgramFile.Contains(".dll"))
|
if (ProgramInfo.ProgramFile.Contains(".dll"))
|
||||||
{
|
{
|
||||||
// SSP Program
|
// SSP Program
|
||||||
ProgramInfo.FriendlyName = ParseConsoleData(response, "Friendly Name", ": ", "\n");
|
ProgramInfo.FriendlyName = ParseConsoleData(response, "Friendly Name", ": ", "\n");
|
||||||
ProgramInfo.ApplicationName = ParseConsoleData(response, "Application Name", ": ", "\n");
|
ProgramInfo.ApplicationName = ParseConsoleData(response, "Application Name", ": ", "\n");
|
||||||
ProgramInfo.ProgramTool = ParseConsoleData(response, "Program Tool", ": ", "\n");
|
ProgramInfo.ProgramTool = ParseConsoleData(response, "Program Tool", ": ", "\n");
|
||||||
ProgramInfo.MinFirmwareVersion = ParseConsoleData(response, "Min Firmware Version", ": ",
|
ProgramInfo.MinFirmwareVersion = ParseConsoleData(response, "Min Firmware Version", ": ",
|
||||||
"\n");
|
"\n");
|
||||||
ProgramInfo.PlugInVersion = ParseConsoleData(response, "PlugInVersion", ": ", "\n");
|
ProgramInfo.PlugInVersion = ParseConsoleData(response, "PlugInVersion", ": ", "\n");
|
||||||
|
|
||||||
|
ProgramInfo.ProgramFile += string.Format(" {0}.{1}.{2}",
|
||||||
|
ProgramInfo.CompilerRevisionInfo.Major,
|
||||||
|
ProgramInfo.CompilerRevisionInfo.Minor,
|
||||||
|
ProgramInfo.CompilerRevisionInfo.Build);
|
||||||
|
|
||||||
|
ProgramInfo.Environment = ProgramInfo.ProgramTool;
|
||||||
}
|
}
|
||||||
else if (ProgramInfo.ProgramFile.Contains(".smw"))
|
else if (ProgramInfo.ProgramFile.Contains(".smw"))
|
||||||
{
|
{
|
||||||
@@ -692,6 +745,15 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
[JsonProperty("compilerRevision")]
|
[JsonProperty("compilerRevision")]
|
||||||
public string CompilerRevision { get; set; }
|
public string CompilerRevision { get; set; }
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
public Version CompilerRevisionInfo
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new Version(CompilerRevision);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[JsonProperty("compileTime")]
|
[JsonProperty("compileTime")]
|
||||||
public string CompileTime { get; set; }
|
public string CompileTime { get; set; }
|
||||||
|
|
||||||
@@ -732,7 +794,7 @@ namespace PepperDash.Essentials.Core.Monitoring
|
|||||||
ProgramFile = "";
|
ProgramFile = "";
|
||||||
FriendlyName = "";
|
FriendlyName = "";
|
||||||
CompilerRevision = "";
|
CompilerRevision = "";
|
||||||
CompileTime = "";
|
CompileTime = "";
|
||||||
Include4Dat = "";
|
Include4Dat = "";
|
||||||
|
|
||||||
SystemName = "";
|
SystemName = "";
|
||||||
|
|||||||
@@ -87,18 +87,32 @@ namespace PepperDash.Essentials.Core
|
|||||||
{
|
{
|
||||||
if (_partitionSensor.IsOnline == false) return;
|
if (_partitionSensor.IsOnline == false) return;
|
||||||
|
|
||||||
Debug.Console(1, this, "Attempting to apply settings to sensor from config");
|
// Default to enable
|
||||||
|
_partitionSensor.Enable.BoolValue = true;
|
||||||
|
|
||||||
if (PropertiesConfig.Sensitivity != null)
|
Debug.Console(1, this, "Attempting to apply settings to sensor from config");
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Sensitivity found, attempting to set value '{0}' from config",
|
if (PropertiesConfig.Sensitivity != null)
|
||||||
PropertiesConfig.Sensitivity);
|
{
|
||||||
_partitionSensor.Sensitivity.UShortValue = (ushort) PropertiesConfig.Sensitivity;
|
Debug.Console(1, this, "Sensitivity found, attempting to set value '{0}' from config",
|
||||||
}
|
PropertiesConfig.Sensitivity);
|
||||||
else
|
_partitionSensor.Sensitivity.UShortValue = (ushort)PropertiesConfig.Sensitivity;
|
||||||
{
|
}
|
||||||
Debug.Console(1, this, "Sensitivity null, no value specified in config");
|
else
|
||||||
}
|
{
|
||||||
|
Debug.Console(1, this, "Sensitivity null, no value specified in config");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PropertiesConfig.Enable != null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Enable found, attempting to set value '{0}' from config",
|
||||||
|
PropertiesConfig.Enable);
|
||||||
|
_partitionSensor.Enable.BoolValue = (bool)PropertiesConfig.Enable;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Enable null, no value specified in config");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,9 @@ namespace PepperDash_Essentials_Core.PartitionSensor
|
|||||||
/// The sensitivity range shall be between 1(lowest) to 10 (highest).
|
/// The sensitivity range shall be between 1(lowest) to 10 (highest).
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
[JsonProperty("sensitivity")]
|
[JsonProperty("sensitivity")]
|
||||||
public ushort? Sensitivity { get; set; }
|
public ushort? Sensitivity { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("enable")]
|
||||||
|
public bool? Enable { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Crestron.SimplSharp.SDK.ProgramLibrary" Version="2.19.36" />
|
<PackageReference Include="Crestron.SimplSharp.SDK.ProgramLibrary" Version="2.20.31" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2">
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.2">
|
||||||
<Aliases>Full</Aliases>
|
<Aliases>Full</Aliases>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
|||||||
@@ -83,7 +83,7 @@
|
|||||||
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
|
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="mscorlib" />
|
<Reference Include="mscorlib" />
|
||||||
<Reference Include="PepperDash_Core, Version=1.0.42.30563, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="PepperDash_Core, Version=1.2.1.30543, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
|
<HintPath>..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
@@ -94,7 +94,7 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="SimplSharpCWSHelperInterface, Version=2.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
<Reference Include="SimplSharpCWSHelperInterface, Version=2.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
<HintPath>..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCWSHelperInterface.dll</HintPath>
|
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCWSHelperInterface.dll</HintPath>
|
||||||
</Reference>
|
</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>
|
||||||
@@ -127,6 +127,8 @@
|
|||||||
<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\GenericIrControllerJoinMap.cs" />
|
||||||
|
<Compile Include="Bridges\JoinMaps\HdPsXxxControllerJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\IAnalogInputJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\IAnalogInputJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\IDigitalOutputJoinMap.cs" />
|
<Compile Include="Bridges\JoinMaps\IDigitalOutputJoinMap.cs" />
|
||||||
<Compile Include="Bridges\JoinMaps\PduJoinMapBase.cs" />
|
<Compile Include="Bridges\JoinMaps\PduJoinMapBase.cs" />
|
||||||
@@ -200,6 +202,8 @@
|
|||||||
<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="Device Info\NetworkDeviceHelpers.cs" />
|
||||||
|
<Compile Include="Devices\PowerInterfaces.cs" />
|
||||||
<Compile Include="Web\RequestHandlers\AppDebugRequestHandler.cs" />
|
<Compile Include="Web\RequestHandlers\AppDebugRequestHandler.cs" />
|
||||||
<Compile Include="Web\RequestHandlers\GetFeedbacksForDeviceRequestHandler.cs" />
|
<Compile Include="Web\RequestHandlers\GetFeedbacksForDeviceRequestHandler.cs" />
|
||||||
<Compile Include="Web\EssentialsWebApiHelpers.cs" />
|
<Compile Include="Web\EssentialsWebApiHelpers.cs" />
|
||||||
@@ -417,12 +421,6 @@
|
|||||||
<None Include="app.config" />
|
<None Include="app.config" />
|
||||||
<None Include="Properties\ControlSystem.cfg" />
|
<None Include="Properties\ControlSystem.cfg" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\Essentials Interfaces\PepperDash_Essentials_Interfaces\PepperDash_Essentials_Interfaces.csproj">
|
|
||||||
<Project>{E51D7C84-4906-486C-B2BA-EEB3B4E9731B}</Project>
|
|
||||||
<Name>PepperDash_Essentials_Interfaces</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" />
|
<Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" />
|
||||||
<ProjectExtensions>
|
<ProjectExtensions>
|
||||||
<VisualStudio>
|
<VisualStudio>
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
Debug.Console(0, "{0} Version: {1}", assembly.Name, assembly.Version);
|
CrestronConsole.ConsoleCommandResponse("{0} Version: {1}" + CrestronEnvironment.NewLine, 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>
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
ScheduledEventGroup FeatureEventGroup;
|
ScheduledEventGroup FeatureEventGroup;
|
||||||
|
|
||||||
public IEssentialsRoom Room { get; private set; }
|
public IRoomOccupancy Room { get; private set; }
|
||||||
|
|
||||||
private Fusion.EssentialsHuddleSpaceFusionSystemControllerBase FusionRoom;
|
private Fusion.EssentialsHuddleSpaceFusionSystemControllerBase FusionRoom;
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void SetUpDevice()
|
void SetUpDevice()
|
||||||
{
|
{
|
||||||
Room = DeviceManager.GetDeviceForKey(PropertiesConfig.RoomKey) as IEssentialsRoom;
|
Room = DeviceManager.GetDeviceForKey(PropertiesConfig.RoomKey) as IRoomOccupancy;
|
||||||
|
|
||||||
if (Room != null)
|
if (Room != null)
|
||||||
{
|
{
|
||||||
@@ -237,12 +237,23 @@ namespace PepperDash.Essentials.Core
|
|||||||
|
|
||||||
if (FeatureEnabled)
|
if (FeatureEnabled)
|
||||||
{
|
{
|
||||||
// Check room power state first
|
var essentialsRoom = Room as IEssentialsRoom;
|
||||||
if (!Room.OnFeedback.BoolValue)
|
|
||||||
{
|
if (essentialsRoom != null) {
|
||||||
Debug.Console(1, this, "Powering Room on to default source");
|
if (!essentialsRoom.OnFeedback.BoolValue)
|
||||||
Room.RunDefaultPresentRoute();
|
{
|
||||||
|
Debug.Console(1, this, "Powering Room on to default source");
|
||||||
|
|
||||||
|
var defaultRouteRoom = Room as IRunDefaultPresentRoute;
|
||||||
|
|
||||||
|
if (defaultRouteRoom != null)
|
||||||
|
{
|
||||||
|
defaultRouteRoom.RunDefaultPresentRoute();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// Check room power state first
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
extern alias Full;
|
using System;
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -13,8 +11,6 @@ using PepperDash.Essentials.Core.Config;
|
|||||||
using PepperDash.Essentials.Core.Devices;
|
using PepperDash.Essentials.Core.Devices;
|
||||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||||
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core
|
namespace PepperDash.Essentials.Core
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -37,7 +33,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
public BoolFeedback IsWarmingUpFeedback { get; private set; }
|
public BoolFeedback IsWarmingUpFeedback { get; private set; }
|
||||||
public BoolFeedback IsCoolingDownFeedback { get; private set; }
|
public BoolFeedback IsCoolingDownFeedback { get; private set; }
|
||||||
|
|
||||||
public IOccupancyStatusProvider RoomOccupancy { get; private set; }
|
public IOccupancyStatusProvider RoomOccupancy { get; protected set; }
|
||||||
|
|
||||||
public bool OccupancyStatusProviderIsRemote { get; private set; }
|
public bool OccupancyStatusProviderIsRemote { get; private set; }
|
||||||
|
|
||||||
|
|||||||
@@ -17,15 +17,10 @@ namespace PepperDash.Essentials.Core
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IEssentialsRoom : IKeyName, IReconfigurableDevice, IRunDefaultPresentRoute, IEnvironmentalControls
|
public interface IEssentialsRoom : IKeyName, IReconfigurableDevice, IRunDefaultPresentRoute, IEnvironmentalControls
|
||||||
{
|
{
|
||||||
BoolFeedback OnFeedback { get; }
|
BoolFeedback OnFeedback { get; }
|
||||||
|
|
||||||
event EventHandler<EventArgs> RoomOccupancyIsSet;
|
|
||||||
|
|
||||||
BoolFeedback IsWarmingUpFeedback { get; }
|
BoolFeedback IsWarmingUpFeedback { get; }
|
||||||
BoolFeedback IsCoolingDownFeedback { get; }
|
BoolFeedback IsCoolingDownFeedback { get; }
|
||||||
|
|
||||||
IOccupancyStatusProvider RoomOccupancy { get; }
|
|
||||||
bool OccupancyStatusProviderIsRemote { get; }
|
|
||||||
|
|
||||||
bool IsMobileControlEnabled { get; }
|
bool IsMobileControlEnabled { get; }
|
||||||
IMobileControlRoomBridge MobileControlRoomBridge { get; }
|
IMobileControlRoomBridge MobileControlRoomBridge { get; }
|
||||||
@@ -35,31 +30,16 @@ namespace PepperDash.Essentials.Core
|
|||||||
SecondsCountdownTimer ShutdownPromptTimer { get; }
|
SecondsCountdownTimer ShutdownPromptTimer { get; }
|
||||||
int ShutdownPromptSeconds { get; }
|
int ShutdownPromptSeconds { get; }
|
||||||
int ShutdownVacancySeconds { get; }
|
int ShutdownVacancySeconds { get; }
|
||||||
eShutdownType ShutdownType { get; }
|
eShutdownType ShutdownType { get; }
|
||||||
|
|
||||||
EssentialsRoomEmergencyBase Emergency { get; }
|
|
||||||
|
|
||||||
Core.Privacy.MicrophonePrivacyController MicrophonePrivacy { get; }
|
|
||||||
|
|
||||||
string LogoUrlLightBkgnd { get; }
|
string LogoUrlLightBkgnd { get; }
|
||||||
string LogoUrlDarkBkgnd { get; }
|
string LogoUrlDarkBkgnd { get; }
|
||||||
|
|
||||||
eVacancyMode VacancyMode { get; }
|
void StartShutdown(eShutdownType type);
|
||||||
|
|
||||||
bool ZeroVolumeWhenSwtichingVolumeDevices { get; }
|
void Shutdown();
|
||||||
|
|
||||||
void StartShutdown(eShutdownType type);
|
void PowerOnToDefaultOrLastSource();
|
||||||
void StartRoomVacancyTimer(eVacancyMode mode);
|
|
||||||
|
|
||||||
void Shutdown();
|
|
||||||
|
|
||||||
void SetRoomOccupancy(IOccupancyStatusProvider statusProvider, int timeoutMinutes);
|
|
||||||
|
|
||||||
void PowerOnToDefaultOrLastSource();
|
|
||||||
|
|
||||||
void SetDefaultLevels();
|
|
||||||
|
|
||||||
void RoomVacatedForTimeoutPeriod(object o);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,6 @@ namespace PepperDash.Essentials.Core
|
|||||||
void RunRouteAction(string routeKey, string sourceListKey);
|
void RunRouteAction(string routeKey, string sourceListKey);
|
||||||
|
|
||||||
void RunRouteAction(string routeKey, string sourceListKey, Action successCallback);
|
void RunRouteAction(string routeKey, string sourceListKey, Action successCallback);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -78,4 +77,30 @@ namespace PepperDash.Essentials.Core
|
|||||||
bool HasEnvironmentalControlDevices { get; }
|
bool HasEnvironmentalControlDevices { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IRoomOccupancy:IKeyed
|
||||||
|
{
|
||||||
|
IOccupancyStatusProvider RoomOccupancy { get; }
|
||||||
|
bool OccupancyStatusProviderIsRemote { get; }
|
||||||
|
|
||||||
|
void SetRoomOccupancy(IOccupancyStatusProvider statusProvider, int timeoutMinutes);
|
||||||
|
|
||||||
|
void RoomVacatedForTimeoutPeriod(object o);
|
||||||
|
|
||||||
|
void StartRoomVacancyTimer(eVacancyMode mode);
|
||||||
|
|
||||||
|
eVacancyMode VacancyMode { get; }
|
||||||
|
|
||||||
|
event EventHandler<EventArgs> RoomOccupancyIsSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IEmergency
|
||||||
|
{
|
||||||
|
EssentialsRoomEmergencyBase Emergency { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IMicrophonePrivacy
|
||||||
|
{
|
||||||
|
Core.Privacy.MicrophonePrivacyController MicrophonePrivacy { get; }
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -204,4 +204,9 @@ namespace PepperDash.Essentials.Core
|
|||||||
SigType = sigType;
|
SigType = sigType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface IRoutingHasVideoInputSyncFeedbacks
|
||||||
|
{
|
||||||
|
FeedbackCollection<BoolFeedback> VideoInputSyncFeedbacks { get; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -42,7 +42,7 @@ namespace PepperDash.Essentials.Core
|
|||||||
public enum eRoutingPortConnectionType
|
public enum eRoutingPortConnectionType
|
||||||
{
|
{
|
||||||
None, BackplaneOnly, DisplayPort, Dvi, Hdmi, Rgb, Vga, LineAudio, DigitalAudio, Sdi,
|
None, BackplaneOnly, DisplayPort, Dvi, Hdmi, Rgb, Vga, LineAudio, DigitalAudio, Sdi,
|
||||||
Composite, Component, DmCat, DmMmFiber, DmSmFiber, Speaker, Streaming
|
Composite, Component, DmCat, DmMmFiber, DmSmFiber, Speaker, Streaming, UsbC, HdBaseT
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -199,5 +199,45 @@ namespace PepperDash.Essentials.Core.Routing
|
|||||||
/// MediaPlayer
|
/// MediaPlayer
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string MediaPlayer = "mediaPlayer";
|
public const string MediaPlayer = "mediaPlayer";
|
||||||
}
|
/// <summary>
|
||||||
|
/// UsbCIn
|
||||||
|
/// </summary>
|
||||||
|
public const string UsbCIn = "usbCIn";
|
||||||
|
/// <summary>
|
||||||
|
/// UsbCIn1
|
||||||
|
/// </summary>
|
||||||
|
public const string UsbCIn1 = "usbCIn1";
|
||||||
|
/// <summary>
|
||||||
|
/// UsbCIn2
|
||||||
|
/// </summary>
|
||||||
|
public const string UsbCIn2 = "usbCIn2";
|
||||||
|
/// <summary>
|
||||||
|
/// UsbCIn3
|
||||||
|
/// </summary>
|
||||||
|
public const string UsbCIn3 = "usbCIn3";
|
||||||
|
/// <summary>
|
||||||
|
/// UsbCOut
|
||||||
|
/// </summary>
|
||||||
|
public const string UsbCOut = "usbCOut";
|
||||||
|
/// <summary>
|
||||||
|
/// UsbCOut1
|
||||||
|
/// </summary>
|
||||||
|
public const string UsbCOut1 = "usbCOut1";
|
||||||
|
/// <summary>
|
||||||
|
/// UsbCOut2
|
||||||
|
/// </summary>
|
||||||
|
public const string UsbCOut2 = "usbCOut2";
|
||||||
|
/// <summary>
|
||||||
|
/// UsbCOut3
|
||||||
|
/// </summary>
|
||||||
|
public const string UsbCOut3 = "usbCOut3";
|
||||||
|
/// <summary>
|
||||||
|
/// HdBaseTIn
|
||||||
|
/// </summary>
|
||||||
|
public const string HdBaseTIn = "hdBaseTIn";
|
||||||
|
/// <summary>
|
||||||
|
/// HdBaseTOut
|
||||||
|
/// </summary>
|
||||||
|
public const string HdBaseTOut = "hdBaseTOut";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,144 +1,352 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Globalization;
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
using Crestron.SimplSharpPro;
|
||||||
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Touchpanels
|
namespace PepperDash.Essentials.Core.Touchpanels
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A wrapper class for the touchpanel portion of an MPC3 class process to allow for configurable
|
/// A wrapper class for the touchpanel portion of an MPC3 class process to allow for configurable
|
||||||
/// behavior of the keybad buttons
|
/// behavior of the keybad buttons
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class Mpc3TouchpanelController : Device
|
public class Mpc3TouchpanelController : Device
|
||||||
{
|
{
|
||||||
MPC3Basic _Touchpanel;
|
readonly MPC3Basic _touchpanel;
|
||||||
|
|
||||||
Dictionary<string, KeypadButton> _Buttons;
|
readonly Dictionary<string, KeypadButton> _buttons;
|
||||||
|
|
||||||
public Mpc3TouchpanelController(string key, string name, CrestronControlSystem processor, Dictionary<string, KeypadButton> buttons)
|
public Mpc3TouchpanelController(string key, string name, CrestronControlSystem processor, Dictionary<string, KeypadButton> buttons)
|
||||||
: base(key, name)
|
: base(key, name)
|
||||||
{
|
{
|
||||||
_Touchpanel = processor.ControllerTouchScreenSlotDevice as MPC3Basic;
|
_touchpanel = processor.ControllerTouchScreenSlotDevice as MPC3Basic;
|
||||||
_Buttons = buttons;
|
if (_touchpanel == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Failed to construct MPC3 Touchpanel Controller with key {0}, check configuration", key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_Touchpanel.ButtonStateChange += new Crestron.SimplSharpPro.DeviceSupport.ButtonEventHandler(_Touchpanel_ButtonStateChange);
|
if (_touchpanel.Registerable)
|
||||||
|
{
|
||||||
|
var registrationResponse = _touchpanel.Register();
|
||||||
|
Debug.Console(0, this, "touchpanel registration response: {0}", registrationResponse);
|
||||||
|
}
|
||||||
|
|
||||||
AddPostActivationAction(() =>
|
_touchpanel.BaseEvent += _touchpanel_BaseEvent;
|
||||||
{
|
_touchpanel.ButtonStateChange += _touchpanel_ButtonStateChange;
|
||||||
// Link up the button feedbacks to the specified BoolFeedbacks
|
_touchpanel.PanelStateChange += _touchpanel_PanelStateChange;
|
||||||
foreach (var button in _Buttons)
|
|
||||||
{
|
|
||||||
var feedbackConfig = button.Value.Feedback;
|
|
||||||
var device = DeviceManager.GetDeviceForKey(feedbackConfig.DeviceKey) as Device;
|
|
||||||
if (device != null)
|
|
||||||
{
|
|
||||||
var bKey = button.Key.ToLower();
|
|
||||||
|
|
||||||
var feedback = device.GetFeedbackProperty(feedbackConfig.FeedbackName);
|
_buttons = buttons;
|
||||||
|
if (_buttons == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this,
|
||||||
|
"Button properties are null, failed to setup MPC3 Touch Controller, check configuration");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var bFeedback = feedback as BoolFeedback;
|
AddPostActivationAction(() =>
|
||||||
var iFeedback = feedback as IntFeedback;
|
{
|
||||||
if (bFeedback != null)
|
foreach (var button in _buttons)
|
||||||
{
|
{
|
||||||
|
var buttonKey = button.Key.ToLower();
|
||||||
|
var buttonConfig = button.Value;
|
||||||
|
|
||||||
if (bKey == "power")
|
InitializeButton(buttonKey, buttonConfig);
|
||||||
{
|
InitializeButtonFeedback(buttonKey, buttonConfig);
|
||||||
bFeedback.LinkCrestronFeedback(_Touchpanel.FeedbackPower);
|
}
|
||||||
continue;
|
});
|
||||||
}
|
}
|
||||||
else if (bKey == "mute")
|
|
||||||
{
|
|
||||||
bFeedback.LinkCrestronFeedback(_Touchpanel.FeedbackMute);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Link to the Crestron Feedback corresponding to the button number
|
/// <summary>
|
||||||
bFeedback.LinkCrestronFeedback(_Touchpanel.Feedbacks[UInt16.Parse(button.Key)]);
|
/// Enables/disables buttons based on event type configuration
|
||||||
}
|
/// </summary>
|
||||||
else if (iFeedback != null)
|
/// <param name="key"></param>
|
||||||
{
|
/// <param name="config"></param>
|
||||||
if (bKey == "volumefeedback")
|
public void InitializeButton(string key, KeypadButton config)
|
||||||
{
|
{
|
||||||
var volFeedback = feedback as IntFeedback;
|
if (config == null)
|
||||||
// TODO: Figure out how to subsribe to a volume IntFeedback and link it to the voluem
|
{
|
||||||
volFeedback.LinkInputSig(_Touchpanel.VolumeBargraph);
|
Debug.Console(1, this, "Button '{0}' config is null, unable to initialize", key);
|
||||||
}
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Unable to get BoolFeedback with name: {0} from device: {1}", feedbackConfig.FeedbackName, device.Key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Unable to get device with key: {0}", feedbackConfig.DeviceKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void _Touchpanel_ButtonStateChange(GenericBase device, Crestron.SimplSharpPro.DeviceSupport.ButtonEventArgs args)
|
int buttonNumber;
|
||||||
{
|
TryParseInt(key, out buttonNumber);
|
||||||
Debug.Console(1, this, "Button {0} ({1}), {2}", args.Button.Number, args.Button.Name, args.NewButtonState);
|
|
||||||
var type = args.NewButtonState.ToString();
|
|
||||||
|
|
||||||
if (_Buttons.ContainsKey(args.Button.Number.ToString()))
|
var buttonEventTypes = config.EventTypes;
|
||||||
{
|
BoolOutputSig enabledFb = null;
|
||||||
Press(args.Button.Number.ToString(), type);
|
BoolOutputSig disabledFb = null;
|
||||||
}
|
|
||||||
else if(_Buttons.ContainsKey(args.Button.Name.ToString()))
|
|
||||||
{
|
|
||||||
Press(args.Button.Name.ToString(), type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
switch (key)
|
||||||
/// Runs the function associated with this button/type. One of the following strings:
|
{
|
||||||
/// Pressed, Released, Tapped, DoubleTapped, Held, HeldReleased
|
case ("power"):
|
||||||
/// </summary>
|
{
|
||||||
/// <param name="number"></param>
|
if (buttonEventTypes == null || buttonEventTypes.Keys == null)
|
||||||
/// <param name="type"></param>
|
_touchpanel.DisablePowerButton();
|
||||||
public void Press(string number, string type)
|
else
|
||||||
{
|
_touchpanel.EnablePowerButton();
|
||||||
// TODO: In future, consider modifying this to generate actions at device activation time
|
|
||||||
// to prevent the need to dynamically call the method via reflection on each button press
|
|
||||||
if (!_Buttons.ContainsKey(number)) { return; }
|
|
||||||
var but = _Buttons[number];
|
|
||||||
if (but.EventTypes.ContainsKey(type))
|
|
||||||
{
|
|
||||||
foreach (var a in but.EventTypes[type]) { DeviceJsonApi.DoDeviceAction(a); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
enabledFb = _touchpanel.PowerButtonEnabledFeedBack;
|
||||||
|
disabledFb = _touchpanel.PowerButtonDisabledFeedBack;
|
||||||
|
|
||||||
/// <summary>
|
break;
|
||||||
/// Represents the configuration of a keybad buggon
|
}
|
||||||
/// </summary>
|
//case ("volumeup"):
|
||||||
public class KeypadButton
|
// {
|
||||||
{
|
// break;
|
||||||
public Dictionary<string, DeviceActionWrapper[]> EventTypes { get; set; }
|
// }
|
||||||
public KeypadButtonFeedback Feedback { get; set; }
|
//case ("volumedown"):
|
||||||
|
// {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
//case ("volumefeedback"):
|
||||||
|
// {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
case ("mute"):
|
||||||
|
{
|
||||||
|
if (buttonEventTypes == null || buttonEventTypes.Keys == null)
|
||||||
|
_touchpanel.DisableMuteButton();
|
||||||
|
else
|
||||||
|
_touchpanel.EnableMuteButton();
|
||||||
|
|
||||||
public KeypadButton()
|
|
||||||
{
|
|
||||||
EventTypes = new Dictionary<string, DeviceActionWrapper[]>();
|
|
||||||
Feedback = new KeypadButtonFeedback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
enabledFb = _touchpanel.MuteButtonEnabledFeedBack;
|
||||||
///
|
disabledFb = _touchpanel.MuteButtonDisabledFeedBack;
|
||||||
/// </summary>
|
|
||||||
public class KeypadButtonFeedback
|
break;
|
||||||
{
|
}
|
||||||
public string DeviceKey { get; set; }
|
default:
|
||||||
public string FeedbackName { get; set; }
|
{
|
||||||
}
|
if (buttonNumber == 0 || buttonNumber > 9)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (buttonEventTypes == null || buttonEventTypes.Keys == null)
|
||||||
|
_touchpanel.DisableNumericalButton((uint)buttonNumber);
|
||||||
|
else
|
||||||
|
_touchpanel.EnableNumericalButton((uint)buttonNumber);
|
||||||
|
|
||||||
|
|
||||||
|
if (_touchpanel.NumericalButtonEnabledFeedBack != null)
|
||||||
|
enabledFb = _touchpanel.NumericalButtonEnabledFeedBack[(uint)buttonNumber];
|
||||||
|
|
||||||
|
if (_touchpanel.NumericalButtonDisabledFeedBack != null)
|
||||||
|
disabledFb = _touchpanel.NumericalButtonDisabledFeedBack[(uint)buttonNumber];
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Debug.Console(0, this, "InitializeButton: key-'{0}' enabledFb-'{1}', disabledFb-'{2}'",
|
||||||
|
key, enabledFb ?? (object)"null", disabledFb ?? (object)"null");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Links button feedback if configured
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="config"></param>
|
||||||
|
public void InitializeButtonFeedback(string key, KeypadButton config)
|
||||||
|
{
|
||||||
|
//Debug.Console(1, this, "Initializing button '{0}' feedback...", key);
|
||||||
|
|
||||||
|
if (config == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Button '{0}' config is null, skipping.", key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int buttonNumber;
|
||||||
|
TryParseInt(key, out buttonNumber);
|
||||||
|
|
||||||
|
// Link up the button feedbacks to the specified device feedback
|
||||||
|
var buttonFeedback = config.Feedback;
|
||||||
|
if (buttonFeedback == null || string.IsNullOrEmpty(buttonFeedback.DeviceKey))
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Button '{0}' feedback not configured, skipping.",
|
||||||
|
key);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Feedback deviceFeedback;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var device = DeviceManager.GetDeviceForKey(buttonFeedback.DeviceKey) as Device;
|
||||||
|
if (device == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Button '{0}' feedback deviceKey '{1}' not found.",
|
||||||
|
key, buttonFeedback.DeviceKey);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
deviceFeedback = device.GetFeedbackProperty(buttonFeedback.FeedbackName);
|
||||||
|
if (deviceFeedback == null)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "Button '{0}' feedbackName property '{1}' not found.",
|
||||||
|
key, buttonFeedback.FeedbackName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO [ ] verify if this can replace the current method
|
||||||
|
//Debug.Console(0, this, "deviceFeedback.GetType().Name: '{0}'", deviceFeedback.GetType().Name);
|
||||||
|
//switch (feedback.GetType().Name.ToLower())
|
||||||
|
//{
|
||||||
|
// case("boolfeedback"):
|
||||||
|
// {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// case("intfeedback"):
|
||||||
|
// {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// case("stringfeedback"):
|
||||||
|
// {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "InitializeButtonFeedback (button '{1}', deviceKey '{2}') Exception Message: {0}",
|
||||||
|
ex.Message, key, buttonFeedback.DeviceKey);
|
||||||
|
Debug.Console(2, this, "InitializeButtonFeedback (button '{1}', deviceKey '{2}') Exception StackTrace: {0}",
|
||||||
|
ex.StackTrace, key, buttonFeedback.DeviceKey);
|
||||||
|
if (ex.InnerException != null) Debug.Console(2, this, "InitializeButtonFeedback (button '{1}', deviceKey '{2}') InnerException: {0}",
|
||||||
|
ex.InnerException, key, buttonFeedback.DeviceKey);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var boolFeedback = deviceFeedback as BoolFeedback;
|
||||||
|
var intFeedback = deviceFeedback as IntFeedback;
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case ("power"):
|
||||||
|
{
|
||||||
|
if (boolFeedback != null) boolFeedback.LinkCrestronFeedback(_touchpanel.FeedbackPower);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ("volumeup"):
|
||||||
|
case ("volumedown"):
|
||||||
|
case ("volumefeedback"):
|
||||||
|
{
|
||||||
|
if (intFeedback != null)
|
||||||
|
{
|
||||||
|
var volumeFeedback = intFeedback;
|
||||||
|
volumeFeedback.LinkInputSig(_touchpanel.VolumeBargraph);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ("mute"):
|
||||||
|
{
|
||||||
|
if (boolFeedback != null) boolFeedback.LinkCrestronFeedback(_touchpanel.FeedbackMute);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
if (boolFeedback != null) boolFeedback.LinkCrestronFeedback(_touchpanel.Feedbacks[(uint)buttonNumber]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Try parse int helper method
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str"></param>
|
||||||
|
/// <param name="result"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool TryParseInt(string str, out int result)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
result = int.Parse(str);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _touchpanel_BaseEvent(GenericBase device, BaseEventArgs args)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "BaseEvent: eventId-'{0}', index-'{1}'", args.EventId, args.Index);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _touchpanel_ButtonStateChange(GenericBase device, Crestron.SimplSharpPro.DeviceSupport.ButtonEventArgs args)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "ButtonStateChange: buttonNumber-'{0}' buttonName-'{1}', buttonState-'{2}'", args.Button.Number, args.Button.Name, args.NewButtonState);
|
||||||
|
var type = args.NewButtonState.ToString();
|
||||||
|
|
||||||
|
if (_buttons.ContainsKey(args.Button.Number.ToString(CultureInfo.InvariantCulture)))
|
||||||
|
{
|
||||||
|
Press(args.Button.Number.ToString(CultureInfo.InvariantCulture), type);
|
||||||
|
}
|
||||||
|
else if (_buttons.ContainsKey(args.Button.Name.ToString()))
|
||||||
|
{
|
||||||
|
Press(args.Button.Name.ToString(), type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _touchpanel_PanelStateChange(GenericBase device, BaseEventArgs args)
|
||||||
|
{
|
||||||
|
Debug.Console(1, this, "PanelStateChange: eventId-'{0}', index-'{1}'", args.EventId, args.Index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Runs the function associated with this button/type. One of the following strings:
|
||||||
|
/// Pressed, Released, Tapped, DoubleTapped, Held, HeldReleased
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="buttonKey"></param>
|
||||||
|
/// <param name="type"></param>
|
||||||
|
public void Press(string buttonKey, string type)
|
||||||
|
{
|
||||||
|
Debug.Console(2, this, "Press: buttonKey-'{0}', type-'{1}'", buttonKey, type);
|
||||||
|
|
||||||
|
// TODO: In future, consider modifying this to generate actions at device activation time
|
||||||
|
// to prevent the need to dynamically call the method via reflection on each button press
|
||||||
|
if (!_buttons.ContainsKey(buttonKey)) return;
|
||||||
|
|
||||||
|
var button = _buttons[buttonKey];
|
||||||
|
if (!button.EventTypes.ContainsKey(type)) return;
|
||||||
|
|
||||||
|
foreach (var eventType in button.EventTypes[type]) DeviceJsonApi.DoDeviceAction(eventType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the configuration of a keypad button
|
||||||
|
/// </summary>
|
||||||
|
public class KeypadButton
|
||||||
|
{
|
||||||
|
[JsonProperty("eventTypes")]
|
||||||
|
public Dictionary<string, DeviceActionWrapper[]> EventTypes { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("feedback")]
|
||||||
|
public KeypadButtonFeedback Feedback { get; set; }
|
||||||
|
|
||||||
|
public KeypadButton()
|
||||||
|
{
|
||||||
|
EventTypes = new Dictionary<string, DeviceActionWrapper[]>();
|
||||||
|
Feedback = new KeypadButtonFeedback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the configuration of a keypad button feedback
|
||||||
|
/// </summary>
|
||||||
|
public class KeypadButtonFeedback
|
||||||
|
{
|
||||||
|
[JsonProperty("deviceKey")]
|
||||||
|
public string DeviceKey { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("feedbackName")]
|
||||||
|
public string FeedbackName { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -3,9 +3,6 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Crestron.SimplSharp;
|
using Crestron.SimplSharp;
|
||||||
using Crestron.SimplSharp.WebScripting;
|
using Crestron.SimplSharp.WebScripting;
|
||||||
using Crestron.SimplSharpPro.Diagnostics;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Web;
|
using PepperDash.Core.Web;
|
||||||
using PepperDash.Essentials.Core.Web.RequestHandlers;
|
using PepperDash.Essentials.Core.Web.RequestHandlers;
|
||||||
@@ -20,13 +17,13 @@ namespace PepperDash.Essentials.Core.Web
|
|||||||
/// http(s)://{ipaddress}/cws/{basePath}
|
/// http(s)://{ipaddress}/cws/{basePath}
|
||||||
/// http(s)://{ipaddress}/VirtualControl/Rooms/{roomId}/cws/{basePath}
|
/// http(s)://{ipaddress}/VirtualControl/Rooms/{roomId}/cws/{basePath}
|
||||||
/// </example>
|
/// </example>
|
||||||
private readonly string _defaultBasePath =
|
private readonly string _defaultBasePath = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance
|
||||||
CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance ? string.Format("/app{0:00}/api", InitialParametersClass.ApplicationNumber) : "/api";
|
? string.Format("/app{0:00}/api", InitialParametersClass.ApplicationNumber)
|
||||||
|
: "/api";
|
||||||
|
|
||||||
// TODO [ ] Reset debug levels to proper value Trace = 0, Info = 1, Verbose = 2
|
|
||||||
private const int DebugTrace = 0;
|
private const int DebugTrace = 0;
|
||||||
private const int DebugInfo = 0;
|
private const int DebugInfo = 1;
|
||||||
private const int DebugVerbose = 0;
|
private const int DebugVerbose = 2;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// CWS base path
|
/// CWS base path
|
||||||
@@ -98,11 +95,6 @@ namespace PepperDash.Essentials.Core.Web
|
|||||||
Name = "DevProps",
|
Name = "DevProps",
|
||||||
RouteHandler = new DevPropsRequestHandler()
|
RouteHandler = new DevPropsRequestHandler()
|
||||||
},
|
},
|
||||||
//new HttpCwsRoute("devprops/{key}")
|
|
||||||
//{
|
|
||||||
// Name = "DevProps",
|
|
||||||
// RouteHandler = new DevPropsRequestHandler()
|
|
||||||
//},
|
|
||||||
new HttpCwsRoute("devjson")
|
new HttpCwsRoute("devjson")
|
||||||
{
|
{
|
||||||
Name = "DevJson",
|
Name = "DevJson",
|
||||||
@@ -113,11 +105,6 @@ namespace PepperDash.Essentials.Core.Web
|
|||||||
Name = "SetDeviceStreamDebug",
|
Name = "SetDeviceStreamDebug",
|
||||||
RouteHandler = new SetDeviceStreamDebugRequestHandler()
|
RouteHandler = new SetDeviceStreamDebugRequestHandler()
|
||||||
},
|
},
|
||||||
//new HttpCwsRoute("setdevicestreamdebug/{deviceKey}/{state}")
|
|
||||||
//{
|
|
||||||
// Name = "SetDeviceStreamDebug",
|
|
||||||
// RouteHandler = new SetDeviceStreamDebugRequestHandler()
|
|
||||||
//},
|
|
||||||
new HttpCwsRoute("disableallstreamdebug")
|
new HttpCwsRoute("disableallstreamdebug")
|
||||||
{
|
{
|
||||||
Name = "DisableAllStreamDebug",
|
Name = "DisableAllStreamDebug",
|
||||||
@@ -173,12 +160,7 @@ namespace PepperDash.Essentials.Core.Web
|
|||||||
if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
|
if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
RMC4>
|
|
||||||
WEBSERVER [ON | OFF | TIMEOUT <VALUE IN SECONDS> | MAXSESSIONSPERUSER <Number of sessions>]
|
WEBSERVER [ON | OFF | TIMEOUT <VALUE IN SECONDS> | MAXSESSIONSPERUSER <Number of sessions>]
|
||||||
WEBSERVER [TIMEOUT] will display current session timeout value
|
|
||||||
WEBSERVER MAXSESSIONSPERUSER will display current max web sessions per user
|
|
||||||
WEBSERVER ALLOWSHAREDSESSION will display whether 'samesite = none' would be set on cookies
|
|
||||||
No parameter - displays current setting
|
|
||||||
*/
|
*/
|
||||||
var response = string.Empty;
|
var response = string.Empty;
|
||||||
CrestronConsole.SendControlSystemCommand("webserver", ref response);
|
CrestronConsole.SendControlSystemCommand("webserver", ref response);
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
using System;
|
using Crestron.SimplSharp.WebScripting;
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core;
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
using PepperDash.Core.Web.RequestHandlers;
|
||||||
@@ -10,25 +8,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class AppDebugRequestHandler : WebApiBaseRequestHandler
|
public class AppDebugRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public AppDebugRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -37,7 +24,7 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
/// <param name="context"></param>
|
/// <param name="context"></param>
|
||||||
protected override void HandleGet(HttpCwsContext context)
|
protected override void HandleGet(HttpCwsContext context)
|
||||||
{
|
{
|
||||||
var appDebug = new AppDebug {Level = Debug.Level};
|
var appDebug = new AppDebug { Level = Debug.Level };
|
||||||
|
|
||||||
var body = JsonConvert.SerializeObject(appDebug, Formatting.Indented);
|
var body = JsonConvert.SerializeObject(appDebug, Formatting.Indented);
|
||||||
|
|
||||||
@@ -46,40 +33,7 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(body, false);
|
context.Response.Write(body, false);
|
||||||
context.Response.End();
|
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>
|
/// <summary>
|
||||||
/// Handles POST method requests
|
/// Handles POST method requests
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -107,7 +61,7 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
|
|
||||||
var appDebug = new AppDebug();
|
var appDebug = new AppDebug();
|
||||||
var requestBody = JsonConvert.DeserializeAnonymousType(data, appDebug);
|
var requestBody = JsonConvert.DeserializeAnonymousType(data, appDebug);
|
||||||
|
|
||||||
Debug.SetDebugLevel(requestBody.Level);
|
Debug.SetDebugLevel(requestBody.Level);
|
||||||
|
|
||||||
appDebug.Level = Debug.Level;
|
appDebug.Level = Debug.Level;
|
||||||
@@ -118,33 +72,11 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(responseBody, false);
|
context.Response.Write(responseBody, false);
|
||||||
context.Response.End();
|
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 AppDebug
|
public class AppDebug
|
||||||
{
|
{
|
||||||
[JsonProperty("level", NullValueHandling = NullValueHandling.Ignore)]
|
[JsonProperty("level", NullValueHandling = NullValueHandling.Ignore)]
|
||||||
public int Level { get; set; }
|
public int Level { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,17 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
{
|
{
|
||||||
public class DefaultRequestHandler : WebApiBaseRequestHandler
|
public class DefaultRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Constructor
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public DefaultRequestHandler()
|
||||||
|
: base(true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Handles CONNECT method requests
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
using Crestron.SimplSharp.WebScripting;
|
||||||
|
using PepperDash.Core;
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
using PepperDash.Core.Web.RequestHandlers;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||||
@@ -8,69 +8,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class DevJsonRequestHandler : WebApiBaseRequestHandler
|
public class DevJsonRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public DevJsonRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -108,32 +53,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
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.StatusCode = 400;
|
||||||
context.Response.StatusDescription = "Bad Request";
|
context.Response.StatusDescription = "Bad Request";
|
||||||
context.Response.End();
|
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,25 +8,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class DevListRequestHandler : WebApiBaseRequestHandler
|
public class DevListRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public DevListRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -58,71 +47,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(js, false);
|
context.Response.Write(js, false);
|
||||||
context.Response.End();
|
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)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System.Text;
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp.WebScripting;
|
using Crestron.SimplSharp.WebScripting;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
using PepperDash.Core.Web.RequestHandlers;
|
||||||
@@ -9,69 +8,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class DevPropsRequestHandler : WebApiBaseRequestHandler
|
public class DevPropsRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public DevPropsRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -128,27 +72,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(deviceProps, false);
|
context.Response.Write(deviceProps, false);
|
||||||
context.Response.End();
|
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,69 +6,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class DisableAllStreamDebugRequestHandler : WebApiBaseRequestHandler
|
public class DisableAllStreamDebugRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public DisableAllStreamDebugRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -83,27 +28,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.StatusDescription = "OK";
|
context.Response.StatusDescription = "OK";
|
||||||
context.Response.End();
|
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,25 +8,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class GetFeedbacksForDeviceRequestHandler : WebApiBaseRequestHandler
|
public class GetFeedbacksForDeviceRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public GetFeedbacksForDeviceRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -109,71 +98,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(js, false);
|
context.Response.Write(js, false);
|
||||||
context.Response.End();
|
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)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,25 +9,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class GetJoinMapForBridgeKeyRequestHandler : WebApiBaseRequestHandler
|
public class GetJoinMapForBridgeKeyRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public GetJoinMapForBridgeKeyRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -84,74 +73,6 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
||||||
context.Response.Write(js, false);
|
context.Response.Write(js, false);
|
||||||
context.Response.End();
|
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)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,25 +8,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class GetJoinMapForDeviceKeyRequestHandler : WebApiBaseRequestHandler
|
public class GetJoinMapForDeviceKeyRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public GetJoinMapForDeviceKeyRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -102,71 +91,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(js, false);
|
context.Response.Write(js, false);
|
||||||
context.Response.End();
|
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)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
using System.Linq;
|
extern alias Full
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
using Crestron.SimplSharp.WebScripting;
|
using Crestron.SimplSharp.WebScripting;
|
||||||
using Newtonsoft.Json;
|
using Full.Newtonsoft.Json;
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
using PepperDash.Core.Web.RequestHandlers;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||||
@@ -8,25 +10,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class GetTypesByFilterRequestHandler : WebApiBaseRequestHandler
|
public class GetTypesByFilterRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public GetTypesByFilterRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -75,71 +66,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(js, false);
|
context.Response.Write(js, false);
|
||||||
context.Response.End();
|
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)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
using System.Linq;
|
extern alias Full
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
using Crestron.SimplSharp.WebScripting;
|
using Crestron.SimplSharp.WebScripting;
|
||||||
using Newtonsoft.Json;
|
using Full.Newtonsoft.Json;
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
using PepperDash.Core.Web.RequestHandlers;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||||
@@ -8,25 +10,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class GetTypesRequestHandler : WebApiBaseRequestHandler
|
public class GetTypesRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public GetTypesRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -65,71 +56,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(js, false);
|
context.Response.Write(js, false);
|
||||||
context.Response.End();
|
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)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
using System.Linq;
|
extern alias Full
|
||||||
|
|
||||||
|
using System.Linq;
|
||||||
using Crestron.SimplSharp.WebScripting;
|
using Crestron.SimplSharp.WebScripting;
|
||||||
using Newtonsoft.Json;
|
using Full.Newtonsoft.Json;
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
using PepperDash.Core.Web.RequestHandlers;
|
||||||
|
|
||||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||||
@@ -8,25 +10,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class ReportVersionsRequestHandler : WebApiBaseRequestHandler
|
public class ReportVersionsRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public ReportVersionsRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -56,71 +47,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(js, false);
|
context.Response.Write(js, false);
|
||||||
context.Response.End();
|
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)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
using Crestron.SimplSharp.WebScripting;
|
extern alias Full
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
using Crestron.SimplSharp.WebScripting;
|
||||||
|
using Full.Newtonsoft.Json;
|
||||||
using PepperDash.Core.Web.RequestHandlers;
|
using PepperDash.Core.Web.RequestHandlers;
|
||||||
using PepperDash.Essentials.Core.Config;
|
using PepperDash.Essentials.Core.Config;
|
||||||
|
|
||||||
@@ -8,25 +10,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
public class ShowConfigRequestHandler : WebApiBaseRequestHandler
|
public class ShowConfigRequestHandler : WebApiBaseRequestHandler
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Handles CONNECT method requests
|
/// Constructor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="context"></param>
|
/// <remarks>
|
||||||
protected override void HandleConnect(HttpCwsContext context)
|
/// base(true) enables CORS support by default
|
||||||
|
/// </remarks>
|
||||||
|
public ShowConfigRequestHandler()
|
||||||
|
: base(true)
|
||||||
{
|
{
|
||||||
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>
|
/// <summary>
|
||||||
@@ -44,71 +35,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
|||||||
context.Response.Write(config, false);
|
context.Response.Write(config, false);
|
||||||
context.Response.End();
|
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)
|
|
||||||
{
|
|
||||||
context.Response.StatusCode = 501;
|
|
||||||
context.Response.StatusDescription = "Not Implemented";
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,368 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.DeviceSupport.Support;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.AirMedia;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using Full.Newtonsoft.Json.Linq;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.AirMedia
|
|
||||||
{
|
|
||||||
[Description("Wrapper class for an AM-200 or AM-300")]
|
|
||||||
public class AirMediaController : CrestronGenericBridgeableBaseDevice, IRoutingNumericWithFeedback, IIROutputPorts, IComPorts
|
|
||||||
{
|
|
||||||
public AmX00 AirMedia { get; private set; }
|
|
||||||
|
|
||||||
public DeviceConfig DeviceConfig { get; private set; }
|
|
||||||
|
|
||||||
AirMediaPropertiesConfig PropertiesConfig;
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
//IroutingNumericEvent
|
|
||||||
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
|
||||||
|
|
||||||
public BoolFeedback IsInSessionFeedback { get; private set; }
|
|
||||||
public IntFeedback ErrorFeedback { get; private set; }
|
|
||||||
public IntFeedback NumberOfUsersConnectedFeedback { get; set; }
|
|
||||||
public IntFeedback LoginCodeFeedback { get; set; }
|
|
||||||
public StringFeedback ConnectionAddressFeedback { get; set; }
|
|
||||||
public StringFeedback HostnameFeedback { get; set; }
|
|
||||||
public IntFeedback VideoOutFeedback { get; private set; }
|
|
||||||
public BoolFeedback HdmiVideoSyncDetectedFeedback { get; private set; }
|
|
||||||
public StringFeedback SerialNumberFeedback { get; private set; }
|
|
||||||
public BoolFeedback AutomaticInputRoutingEnabledFeedback { get; private set; }
|
|
||||||
|
|
||||||
public AirMediaController(string key, string name, AmX00 device, DeviceConfig dc, AirMediaPropertiesConfig props)
|
|
||||||
: base(key, name, device)
|
|
||||||
{
|
|
||||||
|
|
||||||
AirMedia = device;
|
|
||||||
|
|
||||||
DeviceConfig = dc;
|
|
||||||
|
|
||||||
PropertiesConfig = props;
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
|
||||||
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.Osd, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.None, new Action(SelectPinPointUxLandingPage), this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = 0
|
|
||||||
});
|
|
||||||
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.AirMediaIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Streaming, new Action(SelectAirMedia), this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = 1
|
|
||||||
});
|
|
||||||
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.HdmiIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, new Action(SelectHdmiIn), this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = 2
|
|
||||||
});
|
|
||||||
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.AirBoardIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.None, new Action(SelectAirboardIn), this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = 4
|
|
||||||
});
|
|
||||||
|
|
||||||
if (AirMedia is Am300)
|
|
||||||
{
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, new Action(SelectDmIn), this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = 3
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
OutputPorts.Add(new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this));
|
|
||||||
|
|
||||||
AirMedia.AirMedia.AirMediaChange += new Crestron.SimplSharpPro.DeviceSupport.GenericEventHandler(AirMedia_AirMediaChange);
|
|
||||||
|
|
||||||
IsInSessionFeedback = new BoolFeedback(new Func<bool>(() => AirMedia.AirMedia.StatusFeedback.UShortValue == 0));
|
|
||||||
ErrorFeedback = new IntFeedback(new Func<int>(() => AirMedia.AirMedia.ErrorFeedback.UShortValue));
|
|
||||||
NumberOfUsersConnectedFeedback = new IntFeedback(new Func<int>(() => AirMedia.AirMedia.NumberOfUsersConnectedFeedback.UShortValue));
|
|
||||||
LoginCodeFeedback = new IntFeedback(new Func<int>(() => AirMedia.AirMedia.LoginCodeFeedback.UShortValue));
|
|
||||||
ConnectionAddressFeedback = new StringFeedback(new Func<string>(() => AirMedia.AirMedia.ConnectionAddressFeedback.StringValue));
|
|
||||||
HostnameFeedback = new StringFeedback(new Func<string>(() => AirMedia.AirMedia.HostNameFeedback.StringValue));
|
|
||||||
|
|
||||||
// TODO: Figure out if we can actually get the TSID/Serial
|
|
||||||
SerialNumberFeedback = new StringFeedback(new Func<string>(() => "unknown"));
|
|
||||||
|
|
||||||
AirMedia.DisplayControl.DisplayControlChange += new Crestron.SimplSharpPro.DeviceSupport.GenericEventHandler(DisplayControl_DisplayControlChange);
|
|
||||||
|
|
||||||
VideoOutFeedback = new IntFeedback(new Func<int>(() => Convert.ToInt16(AirMedia.DisplayControl.VideoOutFeedback)));
|
|
||||||
AutomaticInputRoutingEnabledFeedback = new BoolFeedback(new Func<bool>(() => AirMedia.DisplayControl.EnableAutomaticRoutingFeedback.BoolValue));
|
|
||||||
|
|
||||||
AirMedia.HdmiIn.StreamChange += new Crestron.SimplSharpPro.DeviceSupport.StreamEventHandler(HdmiIn_StreamChange);
|
|
||||||
|
|
||||||
HdmiVideoSyncDetectedFeedback = new BoolFeedback(new Func<bool>(() => AirMedia.HdmiIn.SyncDetectedFeedback.BoolValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool CustomActivate()
|
|
||||||
{
|
|
||||||
if (PropertiesConfig.AutoSwitchingEnabled)
|
|
||||||
AirMedia.DisplayControl.EnableAutomaticRouting();
|
|
||||||
else
|
|
||||||
AirMedia.DisplayControl.DisableAutomaticRouting();
|
|
||||||
|
|
||||||
return base.CustomActivate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = new AirMediaControllerJoinMap(joinStart);
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<AirMediaControllerJoinMap>(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 Airmedia: {0}", Name);
|
|
||||||
|
|
||||||
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = Name;
|
|
||||||
|
|
||||||
var commMonitor = this as ICommunicationMonitor;
|
|
||||||
|
|
||||||
commMonitor.CommunicationMonitor.IsOnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
|
||||||
|
|
||||||
IsInSessionFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsInSession.JoinNumber]);
|
|
||||||
HdmiVideoSyncDetectedFeedback.LinkInputSig(trilist.BooleanInput[joinMap.HdmiVideoSync.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetSigTrueAction(joinMap.AutomaticInputRoutingEnabled.JoinNumber, AirMedia.DisplayControl.EnableAutomaticRouting);
|
|
||||||
trilist.SetSigFalseAction(joinMap.AutomaticInputRoutingEnabled.JoinNumber, AirMedia.DisplayControl.DisableAutomaticRouting);
|
|
||||||
AutomaticInputRoutingEnabledFeedback.LinkInputSig(trilist.BooleanInput[joinMap.AutomaticInputRoutingEnabled.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetUShortSigAction(joinMap.VideoOut.JoinNumber, (u) => SelectVideoOut(u));
|
|
||||||
|
|
||||||
VideoOutFeedback.LinkInputSig(trilist.UShortInput[joinMap.VideoOut.JoinNumber]);
|
|
||||||
ErrorFeedback.LinkInputSig(trilist.UShortInput[joinMap.ErrorFB.JoinNumber]);
|
|
||||||
NumberOfUsersConnectedFeedback.LinkInputSig(trilist.UShortInput[joinMap.NumberOfUsersConnectedFB.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetUShortSigAction(joinMap.LoginCode.JoinNumber, (u) => AirMedia.AirMedia.LoginCode.UShortValue = u);
|
|
||||||
LoginCodeFeedback.LinkInputSig(trilist.UShortInput[joinMap.LoginCode.JoinNumber]);
|
|
||||||
|
|
||||||
ConnectionAddressFeedback.LinkInputSig(trilist.StringInput[joinMap.ConnectionAddressFB.JoinNumber]);
|
|
||||||
HostnameFeedback.LinkInputSig(trilist.StringInput[joinMap.HostnameFB.JoinNumber]);
|
|
||||||
SerialNumberFeedback.LinkInputSig(trilist.StringInput[joinMap.SerialNumberFeedback.JoinNumber]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AirMedia_AirMediaChange(object sender, Crestron.SimplSharpPro.DeviceSupport.GenericEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == AirMediaInputSlot.AirMediaStatusFeedbackEventId)
|
|
||||||
IsInSessionFeedback.FireUpdate();
|
|
||||||
else if (args.EventId == AirMediaInputSlot.AirMediaErrorFeedbackEventId)
|
|
||||||
ErrorFeedback.FireUpdate();
|
|
||||||
else if (args.EventId == AirMediaInputSlot.AirMediaNumberOfUserConnectedEventId)
|
|
||||||
NumberOfUsersConnectedFeedback.FireUpdate();
|
|
||||||
else if (args.EventId == AirMediaInputSlot.AirMediaLoginCodeEventId)
|
|
||||||
LoginCodeFeedback.FireUpdate();
|
|
||||||
else if (args.EventId == AirMediaInputSlot.AirMediaConnectionAddressFeedbackEventId)
|
|
||||||
ConnectionAddressFeedback.FireUpdate();
|
|
||||||
else if (args.EventId == AirMediaInputSlot.AirMediaHostNameFeedbackEventId)
|
|
||||||
HostnameFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DisplayControl_DisplayControlChange(object sender, Crestron.SimplSharpPro.DeviceSupport.GenericEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == AmX00.VideoOutFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutFeedback.FireUpdate();
|
|
||||||
|
|
||||||
var localInputPort =
|
|
||||||
InputPorts.FirstOrDefault(p => (int) p.FeedbackMatchObject == VideoOutFeedback.UShortValue);
|
|
||||||
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoOutFeedback.UShortValue, OutputPorts.First(),
|
|
||||||
localInputPort, eRoutingSignalType.AudioVideo));
|
|
||||||
}
|
|
||||||
else if (args.EventId == AmX00.EnableAutomaticRoutingFeedbackEventId)
|
|
||||||
AutomaticInputRoutingEnabledFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiIn_StreamChange(Stream stream, Crestron.SimplSharpPro.DeviceSupport.StreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == DMInputEventIds.SourceSyncEventId)
|
|
||||||
HdmiVideoSyncDetectedFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the VideoOut source ( 0 = PinpointUX, 1 = AirMedia, 2 = HDMI, 3 = DM, 4 = Airboard )
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="source">source number</param>
|
|
||||||
public void SelectVideoOut(uint source)
|
|
||||||
{
|
|
||||||
AirMedia.DisplayControl.VideoOut = (AmX00DisplayControl.eAirMediaX00VideoSource)source;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Selects the PinPointUXLandingPage input
|
|
||||||
/// </summary>
|
|
||||||
public void SelectPinPointUxLandingPage()
|
|
||||||
{
|
|
||||||
AirMedia.DisplayControl.VideoOut = AmX00DisplayControl.eAirMediaX00VideoSource.PinPointUxLandingPage;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Selects the AirMedia input
|
|
||||||
/// </summary>
|
|
||||||
public void SelectAirMedia()
|
|
||||||
{
|
|
||||||
AirMedia.DisplayControl.VideoOut = AmX00DisplayControl.eAirMediaX00VideoSource.AirMedia;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Selects the DM input
|
|
||||||
/// </summary>
|
|
||||||
public void SelectDmIn()
|
|
||||||
{
|
|
||||||
AirMedia.DisplayControl.VideoOut = AmX00DisplayControl.eAirMediaX00VideoSource.DM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Selects the HDMI INput
|
|
||||||
/// </summary>
|
|
||||||
public void SelectHdmiIn()
|
|
||||||
{
|
|
||||||
AirMedia.DisplayControl.VideoOut = AmX00DisplayControl.eAirMediaX00VideoSource.HDMI;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SelectAirboardIn()
|
|
||||||
{
|
|
||||||
AirMedia.DisplayControl.VideoOut = AmX00DisplayControl.eAirMediaX00VideoSource.AirBoard;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Reboots the device
|
|
||||||
/// </summary>
|
|
||||||
public void RebootDevice()
|
|
||||||
{
|
|
||||||
AirMedia.AirMedia.DeviceReboot();
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts
|
|
||||||
{
|
|
||||||
get { return AirMedia.IROutputPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int NumberOfIROutputPorts
|
|
||||||
{
|
|
||||||
get { return AirMedia.NumberOfIROutputPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
|
|
||||||
public CrestronCollection<ComPort> ComPorts
|
|
||||||
{
|
|
||||||
get { return AirMedia.ComPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int NumberOfComPorts
|
|
||||||
{
|
|
||||||
get { return AirMedia.NumberOfComPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region IRoutingNumeric Members
|
|
||||||
|
|
||||||
public void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
if ((signalType & eRoutingSignalType.Video) != eRoutingSignalType.Video) return;
|
|
||||||
if (!Enum.IsDefined(typeof (AmX00DisplayControl.eAirMediaX00VideoSource), input))
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Invalid Video Source Index : {0}", input);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
AirMedia.DisplayControl.VideoOut = (AmX00DisplayControl.eAirMediaX00VideoSource) input;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IRouting Members
|
|
||||||
|
|
||||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Input Selector = {0}", inputSelector.ToString());
|
|
||||||
var handler = inputSelector as Action;
|
|
||||||
if (handler == null) return;
|
|
||||||
handler();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
public class AirMediaControllerFactory : EssentialsDeviceFactory<AirMediaController>
|
|
||||||
{
|
|
||||||
public AirMediaControllerFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "am200", "am300" };
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
var type = dc.Type.ToLower();
|
|
||||||
|
|
||||||
Debug.Console(1, "Factory Attempting to create new AirMedia Device");
|
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject<AirMediaPropertiesConfig>(dc.Properties.ToString());
|
|
||||||
AmX00 amDevice = null;
|
|
||||||
if (type == "am200")
|
|
||||||
amDevice = new Crestron.SimplSharpPro.DM.AirMedia.Am200(props.Control.IpIdInt, Global.ControlSystem);
|
|
||||||
else if (type == "am300")
|
|
||||||
amDevice = new Crestron.SimplSharpPro.DM.AirMedia.Am300(props.Control.IpIdInt, Global.ControlSystem);
|
|
||||||
|
|
||||||
return new AirMediaController(dc.Key, dc.Name, amDevice, dc, props);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.AirMedia
|
|
||||||
{
|
|
||||||
public class AirMediaPropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("control")]
|
|
||||||
public ControlPropertiesConfig Control { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("autoSwitching")]
|
|
||||||
public bool AutoSwitchingEnabled { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "http://json-schema.org/draft-03/schema#",
|
|
||||||
"title": "DmChassisController Properties Config Schema",
|
|
||||||
"description": "",
|
|
||||||
"$ref": "EssentialsConfigSchema.json#definitions/Device",
|
|
||||||
"properties": {
|
|
||||||
"properties": {
|
|
||||||
"$ref": "#/propertiesConfig"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"propertiesConfig": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": true,
|
|
||||||
"properties": {
|
|
||||||
"control": {
|
|
||||||
"required":true,
|
|
||||||
"type": "object",
|
|
||||||
"$ref": "../../ControlPropertiesConfigSchema.json#/ControlPropertiesConfig"
|
|
||||||
},
|
|
||||||
"volumeControls": {
|
|
||||||
"title": "Volume Controls",
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": {
|
|
||||||
"type": "object",
|
|
||||||
"$ref": "#/dmAudioCardPropertiesConfig"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"inputSlots": {
|
|
||||||
"required":true,
|
|
||||||
"title": "Input Slots",
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"outputSlots": {
|
|
||||||
"required":true,
|
|
||||||
"title": "Output Slots",
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"inputNames": {
|
|
||||||
"title": "Input Names",
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"outputNames": {
|
|
||||||
"title": "Output Names",
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"noRouteText": {
|
|
||||||
"title": "No Route Text",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"inputSlotSupportsHdcp2": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": {
|
|
||||||
"type": "boolean"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dmAudioCardPropertiesConfig": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"OutLevel": {
|
|
||||||
"title": "Output Level",
|
|
||||||
"type": "integer"
|
|
||||||
},
|
|
||||||
"isVolumeControlPoint": {
|
|
||||||
"title": "Volume Control Point?",
|
|
||||||
"type": "boolean"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,116 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
public class DmCardAudioOutputController : IBasicVolumeWithFeedback
|
|
||||||
{
|
|
||||||
public Audio.Output Output { get; private set; }
|
|
||||||
|
|
||||||
public IntFeedback VolumeLevelFeedback { get; private set; }
|
|
||||||
|
|
||||||
public BoolFeedback MuteFeedback { get; private set; }
|
|
||||||
|
|
||||||
ushort PreMuteVolumeLevel;
|
|
||||||
bool IsMuted;
|
|
||||||
|
|
||||||
public DmCardAudioOutputController(Audio.Output output)
|
|
||||||
{
|
|
||||||
Output = output;
|
|
||||||
VolumeLevelFeedback = new IntFeedback(() => Output.VolumeFeedback.UShortValue);
|
|
||||||
MuteFeedback = new BoolFeedback(() => IsMuted);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IBasicVolumeWithFeedback Members
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public void MuteOff()
|
|
||||||
{
|
|
||||||
SetVolume(PreMuteVolumeLevel);
|
|
||||||
IsMuted = false;
|
|
||||||
MuteFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public void MuteOn()
|
|
||||||
{
|
|
||||||
PreMuteVolumeLevel = Output.VolumeFeedback.UShortValue;
|
|
||||||
SetVolume(0);
|
|
||||||
IsMuted = true;
|
|
||||||
MuteFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public void SetVolume(ushort level)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "Set volume out {0}", level);
|
|
||||||
Output.Volume.UShortValue = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
internal void VolumeEventFromChassis()
|
|
||||||
{
|
|
||||||
VolumeLevelFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IBasicVolumeControls Members
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public void MuteToggle()
|
|
||||||
{
|
|
||||||
if (IsMuted)
|
|
||||||
MuteOff();
|
|
||||||
else
|
|
||||||
MuteOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public void VolumeDown(bool pressRelease)
|
|
||||||
{
|
|
||||||
if (pressRelease)
|
|
||||||
{
|
|
||||||
var remainingRatio = Output.Volume.UShortValue / 65535;
|
|
||||||
Output.Volume.CreateRamp(0, (uint)(400 * remainingRatio));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Output.Volume.StopRamp();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public void VolumeUp(bool pressRelease)
|
|
||||||
{
|
|
||||||
if (pressRelease)
|
|
||||||
{
|
|
||||||
var remainingRatio = (65535 - Output.Volume.UShortValue) / 65535;
|
|
||||||
Output.Volume.CreateRamp(65535, 400);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
Output.Volume.StopRamp();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,705 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Cards;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.DM.Config;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Exposes the volume levels for Program, Aux1, Aux2, Codec1, Codec2, and Digital outputs on a DMPS3 chassis
|
|
||||||
/// </summary>
|
|
||||||
public class DmpsAudioOutputController : EssentialsBridgeableDevice
|
|
||||||
{
|
|
||||||
public DmpsAudioOutput MasterVolumeLevel { get; private set; }
|
|
||||||
public DmpsAudioOutput SourceVolumeLevel { get; private set; }
|
|
||||||
public DmpsAudioOutput MicsMasterVolumeLevel { get; private set; }
|
|
||||||
public DmpsAudioOutput Codec1VolumeLevel { 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)
|
|
||||||
: base(key, name)
|
|
||||||
{
|
|
||||||
card.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
|
|
||||||
|
|
||||||
if (card is Card.Dmps3ProgramOutput)
|
|
||||||
{
|
|
||||||
var programOutput = card as Card.Dmps3ProgramOutput;
|
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, programOutput.OutputMixer);
|
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, programOutput.OutputEqualizer);
|
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
|
||||||
Codec1VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec1);
|
|
||||||
Codec2VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec2);
|
|
||||||
}
|
|
||||||
else if (card is Card.Dmps3Aux1Output)
|
|
||||||
{
|
|
||||||
var auxOutput = card as Card.Dmps3Aux1Output;
|
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, auxOutput.OutputMixer);
|
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, auxOutput.OutputEqualizer);
|
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
|
||||||
Codec2VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec2);
|
|
||||||
}
|
|
||||||
else if (card is Card.Dmps3Aux2Output)
|
|
||||||
{
|
|
||||||
var auxOutput = card as Card.Dmps3Aux2Output;
|
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, auxOutput.OutputMixer);
|
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixerAndEq(output, eDmpsLevelType.Master, auxOutput.OutputEqualizer);
|
|
||||||
SourceVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Source);
|
|
||||||
MicsMasterVolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.MicsMaster);
|
|
||||||
Codec1VolumeLevel = new DmpsAudioOutput(output, eDmpsLevelType.Codec1);
|
|
||||||
}
|
|
||||||
else if (card is Card.Dmps3DigitalMixOutput)
|
|
||||||
{
|
|
||||||
var mixOutput = card as Card.Dmps3DigitalMixOutput;
|
|
||||||
var output = new Dmps3AudioOutputWithMixerBase(card, mixOutput.OutputMixer);
|
|
||||||
MasterVolumeLevel = new DmpsAudioOutputWithMixer(output, eDmpsLevelType.Master);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void BaseDevice_DMOutputChange(Switch device, DMOutputEventArgs args)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Dmps Audio Controller Event Output: {0} EventId: {1}", args.Number, args.EventId.ToString());
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case DMOutputEventIds.OutputVuFeedBackEventId:
|
|
||||||
{
|
|
||||||
//Frequently called event that isn't needed
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.MasterVolumeFeedBackEventId:
|
|
||||||
{
|
|
||||||
MasterVolumeLevel.VolumeLevelFeedback.FireUpdate();
|
|
||||||
MasterVolumeLevel.VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.MasterMuteOnFeedBackEventId:
|
|
||||||
{
|
|
||||||
MasterVolumeLevel.MuteFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.SourceLevelFeedBackEventId:
|
|
||||||
{
|
|
||||||
SourceVolumeLevel.VolumeLevelFeedback.FireUpdate();
|
|
||||||
SourceVolumeLevel.VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.SourceMuteOnFeedBackEventId:
|
|
||||||
{
|
|
||||||
SourceVolumeLevel.MuteFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.MicMasterLevelFeedBackEventId:
|
|
||||||
{
|
|
||||||
MicsMasterVolumeLevel.VolumeLevelFeedback.FireUpdate();
|
|
||||||
MicsMasterVolumeLevel.VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.MicMasterMuteOnFeedBackEventId:
|
|
||||||
{
|
|
||||||
MicsMasterVolumeLevel.MuteFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.Codec1LevelFeedBackEventId:
|
|
||||||
{
|
|
||||||
if (Codec1VolumeLevel != null)
|
|
||||||
{
|
|
||||||
Codec1VolumeLevel.VolumeLevelFeedback.FireUpdate();
|
|
||||||
Codec1VolumeLevel.VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.Codec1MuteOnFeedBackEventId:
|
|
||||||
{
|
|
||||||
if (Codec1VolumeLevel != null)
|
|
||||||
Codec1VolumeLevel.MuteFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.Codec2LevelFeedBackEventId:
|
|
||||||
{
|
|
||||||
if (Codec2VolumeLevel != null)
|
|
||||||
{
|
|
||||||
Codec2VolumeLevel.VolumeLevelFeedback.FireUpdate();
|
|
||||||
Codec2VolumeLevel.VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.Codec2MuteOnFeedBackEventId:
|
|
||||||
{
|
|
||||||
if (Codec2VolumeLevel != null)
|
|
||||||
Codec2VolumeLevel.MuteFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.MinVolumeFeedBackEventId:
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "MinVolumeFeedBackEventId: {0}", args.Index);
|
|
||||||
var level = MasterVolumeLevel as DmpsAudioOutputWithMixer;
|
|
||||||
if (level != null)
|
|
||||||
{
|
|
||||||
level.GetVolumeMin();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DMOutputEventIds.MaxVolumeFeedBackEventId:
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "MaxVolumeFeedBackEventId: {0}", args.Index);
|
|
||||||
var level = MasterVolumeLevel as DmpsAudioOutputWithMixer;
|
|
||||||
if (level != null)
|
|
||||||
{
|
|
||||||
level.GetVolumeMax();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = new DmpsAudioOutputControllerJoinMap(joinStart);
|
|
||||||
|
|
||||||
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"));
|
|
||||||
|
|
||||||
if (MasterVolumeLevel != null)
|
|
||||||
{
|
|
||||||
SetUpDmpsAudioOutputJoins(trilist, MasterVolumeLevel, joinMap.MasterVolumeLevel.JoinNumber);
|
|
||||||
var mixer = MasterVolumeLevel as DmpsAudioOutputWithMixer;
|
|
||||||
if (mixer != null)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
SetUpDmpsAudioOutputJoins(trilist, SourceVolumeLevel, joinMap.SourceVolumeLevel.JoinNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MicsMasterVolumeLevel != null)
|
|
||||||
{
|
|
||||||
SetUpDmpsAudioOutputJoins(trilist, MicsMasterVolumeLevel, joinMap.MicsMasterVolumeLevel.JoinNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Codec1VolumeLevel != null)
|
|
||||||
{
|
|
||||||
SetUpDmpsAudioOutputJoins(trilist, Codec1VolumeLevel, joinMap.Codec1VolumeLevel.JoinNumber);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Codec2VolumeLevel != null)
|
|
||||||
{
|
|
||||||
SetUpDmpsAudioOutputJoins(trilist, Codec2VolumeLevel, joinMap.Codec2VolumeLevel.JoinNumber);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void SetUpDmpsAudioOutputJoins(BasicTriList trilist, DmpsAudioOutput output, uint joinStart)
|
|
||||||
{
|
|
||||||
var volumeLevelJoin = joinStart;
|
|
||||||
var volumeLevelScaledJoin = joinStart + 1;
|
|
||||||
var muteOnJoin = joinStart;
|
|
||||||
var muteOffJoin = joinStart + 1;
|
|
||||||
var volumeUpJoin = joinStart + 2;
|
|
||||||
var volumeDownJoin = joinStart + 3;
|
|
||||||
var sendScaledVolumeJoin = joinStart + 4;
|
|
||||||
|
|
||||||
output.VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[volumeLevelJoin]);
|
|
||||||
output.VolumeLevelScaledFeedback.LinkInputSig(trilist.UShortInput[volumeLevelScaledJoin]);
|
|
||||||
|
|
||||||
trilist.SetSigTrueAction(muteOnJoin, output.MuteOn);
|
|
||||||
output.MuteFeedback.LinkInputSig(trilist.BooleanInput[muteOnJoin]);
|
|
||||||
trilist.SetSigTrueAction(muteOffJoin, output.MuteOff);
|
|
||||||
output.MuteFeedback.LinkComplementInputSig(trilist.BooleanInput[muteOffJoin]);
|
|
||||||
|
|
||||||
trilist.SetBoolSigAction(volumeUpJoin, output.VolumeUp);
|
|
||||||
trilist.SetBoolSigAction(volumeDownJoin, output.VolumeDown);
|
|
||||||
trilist.SetBoolSigAction(sendScaledVolumeJoin, output.SendScaledVolume);
|
|
||||||
trilist.SetUShortSigAction(volumeLevelJoin, output.SetVolume);
|
|
||||||
trilist.SetUShortSigAction(volumeLevelScaledJoin, output.SetVolumeScaled);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
{
|
|
||||||
Dmps3AudioOutputWithMixerBase Output;
|
|
||||||
|
|
||||||
public DmpsAudioOutputWithMixer(Dmps3AudioOutputWithMixerBase output, eDmpsLevelType type)
|
|
||||||
: base(output, type)
|
|
||||||
{
|
|
||||||
Output = output;
|
|
||||||
GetVolumeMax();
|
|
||||||
GetVolumeMin();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void GetVolumeMin()
|
|
||||||
{
|
|
||||||
MinLevel = (short)Output.MinVolumeFeedback.UShortValue;
|
|
||||||
if (VolumeLevelScaledFeedback != null)
|
|
||||||
{
|
|
||||||
VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void GetVolumeMax()
|
|
||||||
{
|
|
||||||
MaxLevel = (short)Output.MaxVolumeFeedback.UShortValue;
|
|
||||||
if (VolumeLevelScaledFeedback != null)
|
|
||||||
{
|
|
||||||
VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RecallPreset(ushort preset)
|
|
||||||
{
|
|
||||||
Output.PresetNumber.UShortValue = preset;
|
|
||||||
Output.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
|
|
||||||
{
|
|
||||||
private UShortInputSig Level;
|
|
||||||
private bool EnableVolumeSend;
|
|
||||||
private ushort VolumeLevelInput;
|
|
||||||
protected short MinLevel { get; set; }
|
|
||||||
protected short MaxLevel { get; set; }
|
|
||||||
|
|
||||||
public eDmpsLevelType Type { get; private set; }
|
|
||||||
public BoolFeedback MuteFeedback { get; private set; }
|
|
||||||
public IntFeedback VolumeLevelFeedback { get; private set; }
|
|
||||||
public IntFeedback VolumeLevelScaledFeedback { get; private set; }
|
|
||||||
|
|
||||||
Action MuteOnAction;
|
|
||||||
Action MuteOffAction;
|
|
||||||
Action<bool> VolumeUpAction;
|
|
||||||
Action<bool> VolumeDownAction;
|
|
||||||
|
|
||||||
public DmpsAudioOutput(Dmps3AudioOutputBase output, eDmpsLevelType type)
|
|
||||||
{
|
|
||||||
VolumeLevelInput = 0;
|
|
||||||
EnableVolumeSend = false;
|
|
||||||
Type = type;
|
|
||||||
MinLevel = -800;
|
|
||||||
MaxLevel = 100;
|
|
||||||
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case eDmpsLevelType.Master:
|
|
||||||
{
|
|
||||||
Level = output.MasterVolume;
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => output.MasterMuteOnFeedBack.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => output.MasterVolumeFeedBack.UShortValue));
|
|
||||||
MuteOnAction = new Action(output.MasterMuteOn);
|
|
||||||
MuteOffAction = new Action(output.MasterMuteOff);
|
|
||||||
VolumeUpAction = new Action<bool>((b) => output.MasterVolumeUp.BoolValue = b);
|
|
||||||
VolumeDownAction = new Action<bool>((b) => output.MasterVolumeDown.BoolValue = b);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case eDmpsLevelType.MicsMaster:
|
|
||||||
{
|
|
||||||
if (output.Card is Card.Dmps3OutputBase)
|
|
||||||
{
|
|
||||||
var micOutput = output.Card as Card.Dmps3OutputBase;
|
|
||||||
Level = micOutput.MicMasterLevel;
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => micOutput.MicMasterMuteOnFeedBack.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => micOutput.MicMasterLevelFeedBack.UShortValue));
|
|
||||||
MuteOnAction = new Action(micOutput.MicMasterMuteOn);
|
|
||||||
MuteOffAction = new Action(micOutput.MicMasterMuteOff);
|
|
||||||
VolumeUpAction = new Action<bool>((b) => micOutput.MicMasterLevelUp.BoolValue = b);
|
|
||||||
VolumeDownAction = new Action<bool>((b) => micOutput.MicMasterLevelDown.BoolValue = b);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case eDmpsLevelType.Source:
|
|
||||||
{
|
|
||||||
Level = output.SourceLevel;
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => output.SourceMuteOnFeedBack.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => output.SourceLevelFeedBack.UShortValue));
|
|
||||||
MuteOnAction = new Action(output.SourceMuteOn);
|
|
||||||
MuteOffAction = new Action(output.SourceMuteOff);
|
|
||||||
VolumeUpAction = new Action<bool>((b) => output.SourceLevelUp.BoolValue = b);
|
|
||||||
VolumeDownAction = new Action<bool>((b) => output.SourceLevelDown.BoolValue = b);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case eDmpsLevelType.Codec1:
|
|
||||||
{
|
|
||||||
if (output.Card is Card.Dmps3ProgramOutput)
|
|
||||||
{
|
|
||||||
var programOutput = output.Card as Card.Dmps3ProgramOutput;
|
|
||||||
Level = programOutput.Codec1Level;
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec1LevelFeedback.UShortValue));
|
|
||||||
MuteOnAction = new Action(programOutput.Codec1MuteOn);
|
|
||||||
MuteOffAction = new Action(programOutput.Codec1MuteOff);
|
|
||||||
VolumeUpAction = new Action<bool>((b) => programOutput.Codec1LevelUp.BoolValue = b);
|
|
||||||
VolumeDownAction = new Action<bool>((b) => programOutput.Codec1LevelDown.BoolValue = b);
|
|
||||||
}
|
|
||||||
else if (output.Card is Card.Dmps3Aux2Output)
|
|
||||||
{
|
|
||||||
var auxOutput = output.Card as Card.Dmps3Aux2Output;
|
|
||||||
Level = auxOutput.Codec1Level;
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute1OnFeedback.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec1LevelFeedback.UShortValue));
|
|
||||||
MuteOnAction = new Action(auxOutput.Codec1MuteOn);
|
|
||||||
MuteOffAction = new Action(auxOutput.Codec1MuteOff);
|
|
||||||
VolumeUpAction = new Action<bool>((b) => auxOutput.Codec1LevelUp.BoolValue = b);
|
|
||||||
VolumeDownAction = new Action<bool>((b) => auxOutput.Codec1LevelDown.BoolValue = b);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case eDmpsLevelType.Codec2:
|
|
||||||
{
|
|
||||||
if (output.Card is Card.Dmps3ProgramOutput)
|
|
||||||
{
|
|
||||||
var programOutput = output.Card as Card.Dmps3ProgramOutput;
|
|
||||||
Level = programOutput.Codec2Level;
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => programOutput.CodecMute1OnFeedback.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => programOutput.Codec2LevelFeedback.UShortValue));
|
|
||||||
MuteOnAction = new Action(programOutput.Codec2MuteOn);
|
|
||||||
MuteOffAction = new Action(programOutput.Codec2MuteOff);
|
|
||||||
VolumeUpAction = new Action<bool>((b) => programOutput.Codec2LevelUp.BoolValue = b);
|
|
||||||
VolumeDownAction = new Action<bool>((b) => programOutput.Codec2LevelDown.BoolValue = b);
|
|
||||||
}
|
|
||||||
else if (output.Card is Card.Dmps3Aux1Output)
|
|
||||||
{
|
|
||||||
var auxOutput = output.Card as Card.Dmps3Aux1Output;
|
|
||||||
|
|
||||||
Level = auxOutput.Codec2Level;
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => auxOutput.CodecMute2OnFeedback.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => auxOutput.Codec2LevelFeedback.UShortValue));
|
|
||||||
MuteOnAction = new Action(auxOutput.Codec2MuteOn);
|
|
||||||
MuteOffAction = new Action(auxOutput.Codec2MuteOff);
|
|
||||||
VolumeUpAction = new Action<bool>((b) => auxOutput.Codec2LevelUp.BoolValue = b);
|
|
||||||
VolumeDownAction = new Action<bool>((b) => auxOutput.Codec2LevelDown.BoolValue = b);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (VolumeLevelFeedback != null)
|
|
||||||
{
|
|
||||||
VolumeLevelScaledFeedback = new IntFeedback(new Func<int>(() => ScaleVolumeFeedback(VolumeLevelFeedback.UShortValue)));
|
|
||||||
VolumeLevelFeedback.FireUpdate();
|
|
||||||
VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetVolumeScaled(ushort level)
|
|
||||||
{
|
|
||||||
if (ushort.MaxValue + MinLevel != 0)
|
|
||||||
{
|
|
||||||
VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
|
|
||||||
if (EnableVolumeSend == true)
|
|
||||||
{
|
|
||||||
Level.UShortValue = VolumeLevelInput;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ushort ScaleVolumeFeedback(ushort level)
|
|
||||||
{
|
|
||||||
short signedLevel = (short)level;
|
|
||||||
|
|
||||||
if (MaxLevel - MinLevel != 0)
|
|
||||||
{
|
|
||||||
return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return (ushort)MinLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendScaledVolume(bool pressRelease)
|
|
||||||
{
|
|
||||||
EnableVolumeSend = pressRelease;
|
|
||||||
if (pressRelease == false)
|
|
||||||
{
|
|
||||||
SetVolumeScaled(VolumeLevelInput);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IBasicVolumeWithFeedback Members
|
|
||||||
|
|
||||||
public void SetVolume(ushort level)
|
|
||||||
{
|
|
||||||
Level.UShortValue = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MuteOn()
|
|
||||||
{
|
|
||||||
MuteOnAction();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MuteOff()
|
|
||||||
{
|
|
||||||
MuteOffAction();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IBasicVolumeControls Members
|
|
||||||
|
|
||||||
public void VolumeUp(bool pressRelease)
|
|
||||||
{
|
|
||||||
VolumeUpAction(pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void VolumeDown(bool pressRelease)
|
|
||||||
{
|
|
||||||
VolumeDownAction(pressRelease);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MuteToggle()
|
|
||||||
{
|
|
||||||
if (MuteFeedback.BoolValue)
|
|
||||||
MuteOff();
|
|
||||||
else
|
|
||||||
MuteOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
#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
|
|
||||||
{
|
|
||||||
Master,
|
|
||||||
Source,
|
|
||||||
MicsMaster,
|
|
||||||
Codec1,
|
|
||||||
Codec2,
|
|
||||||
Mic
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,458 +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 DmpsInternalVirtualHdmiVgaInputController : Device, ITxRouting, IHasFeedback
|
|
||||||
{
|
|
||||||
public Card.Dmps3HdmiVgaInput InputCard { get; protected set; }
|
|
||||||
|
|
||||||
public eHdcpCapabilityType HdcpSupportCapability { get; protected set; }
|
|
||||||
public StringFeedback ActiveVideoInputFeedback { get; protected set; }
|
|
||||||
|
|
||||||
public RoutingInputPortWithVideoStatuses HdmiIn { get; protected set; }
|
|
||||||
public RoutingInputPortWithVideoStatuses VgaIn { get; protected set; }
|
|
||||||
public RoutingInputPort AudioIn { get; protected set; }
|
|
||||||
public RoutingInputPortWithVideoStatuses AnyVideoInput { get; protected set; }
|
|
||||||
|
|
||||||
public RoutingOutputPort VirtualDmOut { get; protected set; }
|
|
||||||
|
|
||||||
public IntFeedback VideoSourceNumericFeedback { get; protected set; }
|
|
||||||
public IntFeedback AudioSourceNumericFeedback { get; protected set; }
|
|
||||||
public IntFeedback HdmiInHdcpCapabilityFeedback { get; protected set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a list containing the Outputs that we want to expose.
|
|
||||||
/// </summary>
|
|
||||||
public FeedbackCollection<Feedback> Feedbacks { get; private set; }
|
|
||||||
|
|
||||||
public void SetPortHdcpCapability(eHdcpCapabilityType hdcpMode, uint port) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helps get the "real" inputs, including when in Auto
|
|
||||||
/// </summary>
|
|
||||||
public eDmps3InputVideoSource ActualVideoInput
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (InputCard.VideoSourceFeedback != eDmps3InputVideoSource.Auto)
|
|
||||||
return InputCard.VideoSourceFeedback;
|
|
||||||
else // auto
|
|
||||||
{
|
|
||||||
if (InputCard.HdmiInputPort.SyncDetectedFeedback.BoolValue)
|
|
||||||
return eDmps3InputVideoSource.Hdmi;
|
|
||||||
else if (InputCard.VgaInputPort.SyncDetectedFeedback.BoolValue)
|
|
||||||
return eDmps3InputVideoSource.Vga;
|
|
||||||
else
|
|
||||||
return eDmps3InputVideoSource.Bnc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return eDmps3InputVideoSource.Bnc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual RoutingPortCollection<RoutingInputPort> InputPorts
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new RoutingPortCollection<RoutingInputPort>
|
|
||||||
{
|
|
||||||
HdmiIn,
|
|
||||||
VgaIn,
|
|
||||||
AudioIn,
|
|
||||||
AnyVideoInput
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new RoutingPortCollection<RoutingOutputPort> { VirtualDmOut };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public DmpsInternalVirtualHdmiVgaInputController(string key, string name, DMInput inputCard)
|
|
||||||
: base(key, name)
|
|
||||||
{
|
|
||||||
Feedbacks = new FeedbackCollection<Feedback>();
|
|
||||||
|
|
||||||
if (inputCard is Card.Dmps3HdmiVgaInput)
|
|
||||||
{
|
|
||||||
InputCard = inputCard as Card.Dmps3HdmiVgaInput;
|
|
||||||
|
|
||||||
HdmiIn = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn, eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
|
||||||
eDmps3InputVideoSource.Hdmi, this, VideoStatusHelper.GetHdmiInputStatusFuncs(InputCard.HdmiInputPort));
|
|
||||||
VgaIn = new RoutingInputPortWithVideoStatuses(DmPortName.VgaIn,
|
|
||||||
eRoutingSignalType.Video, eRoutingPortConnectionType.Vga, eDmps3InputVideoSource.Vga, this,
|
|
||||||
VideoStatusHelper.GetVgaInputStatusFuncs(InputCard.VgaInputPort));
|
|
||||||
AudioIn = new RoutingInputPort(DmPortName.AudioIn, eRoutingSignalType.Audio, eRoutingPortConnectionType.LineAudio,
|
|
||||||
eDmps3InputAudioSource.Analog, this);
|
|
||||||
|
|
||||||
if (InputCard.HdmiInputPort.HdcpSupportedLevelFeedback == eHdcpSupportedLevel.Hdcp2xSupport)
|
|
||||||
HdcpSupportCapability = eHdcpCapabilityType.Hdcp2_2Support;
|
|
||||||
else if (InputCard.HdmiInputPort.HdcpSupportedLevelFeedback == eHdcpSupportedLevel.Hdcp1xSupport)
|
|
||||||
HdcpSupportCapability = eHdcpCapabilityType.Hdcp1xSupport;
|
|
||||||
|
|
||||||
var combinedFuncs = new VideoStatusFuncsWrapper
|
|
||||||
{
|
|
||||||
HdcpActiveFeedbackFunc = () =>
|
|
||||||
(ActualVideoInput == eDmps3InputVideoSource.Hdmi
|
|
||||||
&& InputCard.HdmiInputPort.VideoAttributes.HdcpActiveFeedback.BoolValue),
|
|
||||||
|
|
||||||
HdcpStateFeedbackFunc = () =>
|
|
||||||
{
|
|
||||||
if (ActualVideoInput == eDmps3InputVideoSource.Hdmi)
|
|
||||||
return InputCard.HdmiInputPort.VideoAttributes.HdcpStateFeedback.ToString();
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
|
|
||||||
VideoResolutionFeedbackFunc = () =>
|
|
||||||
{
|
|
||||||
if (ActualVideoInput == eDmps3InputVideoSource.Hdmi)
|
|
||||||
return InputCard.HdmiInputPort.VideoAttributes.GetVideoResolutionString();
|
|
||||||
if (ActualVideoInput == eDmps3InputVideoSource.Vga)
|
|
||||||
return InputCard.VgaInputPort.VideoAttributes.GetVideoResolutionString();
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
VideoSyncFeedbackFunc = () =>
|
|
||||||
(ActualVideoInput == eDmps3InputVideoSource.Hdmi
|
|
||||||
&& InputCard.HdmiInputPort.SyncDetectedFeedback.BoolValue)
|
|
||||||
|| (ActualVideoInput == eDmps3InputVideoSource.Vga
|
|
||||||
&& InputCard.VgaInputPort.SyncDetectedFeedback.BoolValue),
|
|
||||||
|
|
||||||
HasVideoStatusFunc = () =>
|
|
||||||
(ActualVideoInput == eDmps3InputVideoSource.Hdmi
|
|
||||||
&& HdmiIn.VideoStatus.HasVideoStatusFeedback.BoolValue)
|
|
||||||
|| (ActualVideoInput == eDmps3InputVideoSource.Vga
|
|
||||||
&& VgaIn.VideoStatus.HasVideoStatusFeedback.BoolValue)
|
|
||||||
};
|
|
||||||
|
|
||||||
AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
|
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, eDmps3InputVideoSource.Auto, this, combinedFuncs);
|
|
||||||
|
|
||||||
ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput", () => ActualVideoInput.ToString());
|
|
||||||
|
|
||||||
VideoSourceNumericFeedback = new IntFeedback(() =>
|
|
||||||
{
|
|
||||||
return (int)InputCard.VideoSourceFeedback;
|
|
||||||
});
|
|
||||||
AudioSourceNumericFeedback = new IntFeedback(() =>
|
|
||||||
{
|
|
||||||
return (int)InputCard.AudioSourceFeedback;
|
|
||||||
});
|
|
||||||
|
|
||||||
HdmiInHdcpCapabilityFeedback = new IntFeedback("HdmiInHdcpCapability", () =>
|
|
||||||
{
|
|
||||||
if (InputCard.HdmiInputPort.HdcpSupportOnFeedback.BoolValue)
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiIn.Port = InputCard.HdmiInputPort;
|
|
||||||
|
|
||||||
VirtualDmOut = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.None, null, this);
|
|
||||||
|
|
||||||
AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiInHdcpCapabilityFeedback);
|
|
||||||
|
|
||||||
//AddPostActivationAction(() =>
|
|
||||||
//{
|
|
||||||
// Link up all of these damned events to the various RoutingPorts via a helper handler
|
|
||||||
InputCard.HdmiInputPort.InputOutput.BaseDevice.BaseEvent += (o, a) => FowardInputStreamChange(HdmiIn, a.EventId);
|
|
||||||
InputCard.HdmiInputPort.VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn, a.EventId);
|
|
||||||
|
|
||||||
InputCard.VgaInputPort.InputOutput.BaseDevice.BaseEvent += (o, a) => FowardInputStreamChange(VgaIn, a.EventId);
|
|
||||||
InputCard.VgaInputPort.VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(VgaIn, a.EventId);
|
|
||||||
//});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Relays the input stream change to the appropriate RoutingInputPort.
|
|
||||||
/// </summary>
|
|
||||||
protected void FowardInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
|
||||||
{
|
|
||||||
if (eventId == Crestron.SimplSharpPro.DM.DMInputEventIds.SourceSyncEventId)
|
|
||||||
{
|
|
||||||
inputPort.VideoStatus.VideoSyncFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Relays the VideoAttributes change to a RoutingInputPort
|
|
||||||
/// </summary>
|
|
||||||
protected void ForwardVideoAttributeChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
|
||||||
{
|
|
||||||
switch (eventId)
|
|
||||||
{
|
|
||||||
case VideoAttributeEventIds.HdcpActiveFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoAttributeEventIds.HdcpStateFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.HdcpStateFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.HdcpStateFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoAttributeEventIds.HorizontalResolutionFeedbackEventId:
|
|
||||||
case VideoAttributeEventIds.VerticalResolutionFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoAttributeEventIds.FramesPerSecondFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region ITxRouting Members
|
|
||||||
|
|
||||||
|
|
||||||
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(eDmps3InputVideoSource.Auto, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(HdmiIn.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(VgaIn.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IRouting Members
|
|
||||||
|
|
||||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
if ((signalType | eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
|
||||||
InputCard.VideoSource = (eDmps3InputVideoSource)inputSelector;
|
|
||||||
if ((signalType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
|
||||||
InputCard.AudioSource = (eDmps3InputAudioSource)inputSelector;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public class DmpsInternalVirtualHdmiVgaBncInputController : DmpsInternalVirtualHdmiVgaInputController
|
|
||||||
{
|
|
||||||
public new Card.Dmps3HdmiVgaBncInput InputCard { get; private set; }
|
|
||||||
|
|
||||||
public RoutingInputPortWithVideoStatuses BncIn { get; private set; }
|
|
||||||
public RoutingInputPort SpdifIn { get; private set; }
|
|
||||||
|
|
||||||
public override RoutingPortCollection<RoutingInputPort> InputPorts
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new RoutingPortCollection<RoutingInputPort>
|
|
||||||
{
|
|
||||||
HdmiIn,
|
|
||||||
VgaIn,
|
|
||||||
BncIn,
|
|
||||||
SpdifIn,
|
|
||||||
AnyVideoInput
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public DmpsInternalVirtualHdmiVgaBncInputController(string key, string name, Card.Dmps3HdmiVgaBncInput inputCard)
|
|
||||||
: base(key, name, inputCard)
|
|
||||||
{
|
|
||||||
InputCard = inputCard;
|
|
||||||
|
|
||||||
HdmiIn = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn, eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
|
||||||
eDmps3InputVideoSource.Hdmi, this, VideoStatusHelper.GetHdmiInputStatusFuncs(InputCard.HdmiInputPort));
|
|
||||||
VgaIn = new RoutingInputPortWithVideoStatuses(DmPortName.VgaIn,
|
|
||||||
eRoutingSignalType.Video, eRoutingPortConnectionType.Vga, eDmps3InputVideoSource.Vga, this,
|
|
||||||
VideoStatusHelper.GetVgaInputStatusFuncs(InputCard.VgaInputPort));
|
|
||||||
BncIn = new RoutingInputPortWithVideoStatuses(DmPortName.BncIn, eRoutingSignalType.Video, eRoutingPortConnectionType.Component,
|
|
||||||
eDmps3InputVideoSource.Bnc, this, VideoStatusHelper.GetBncInputStatusFuncs(InputCard.BncInputPort));
|
|
||||||
SpdifIn = new RoutingInputPort(DmPortName.SpdifIn, eRoutingSignalType.Audio, eRoutingPortConnectionType.DigitalAudio,
|
|
||||||
eDmps3InputAudioSource.Spdif, this);
|
|
||||||
|
|
||||||
if (InputCard.HdmiInputPort.HdcpSupportedLevelFeedback == eHdcpSupportedLevel.Hdcp2xSupport)
|
|
||||||
HdcpSupportCapability = eHdcpCapabilityType.Hdcp2_2Support;
|
|
||||||
else if (InputCard.HdmiInputPort.HdcpSupportedLevelFeedback == eHdcpSupportedLevel.Hdcp1xSupport)
|
|
||||||
HdcpSupportCapability = eHdcpCapabilityType.Hdcp1xSupport;
|
|
||||||
|
|
||||||
var combinedFuncs = new VideoStatusFuncsWrapper
|
|
||||||
{
|
|
||||||
HdcpActiveFeedbackFunc = () =>
|
|
||||||
(ActualVideoInput == eDmps3InputVideoSource.Hdmi
|
|
||||||
&& InputCard.HdmiInputPort.VideoAttributes.HdcpActiveFeedback.BoolValue),
|
|
||||||
|
|
||||||
HdcpStateFeedbackFunc = () =>
|
|
||||||
{
|
|
||||||
if (ActualVideoInput == eDmps3InputVideoSource.Hdmi)
|
|
||||||
return InputCard.HdmiInputPort.VideoAttributes.HdcpStateFeedback.ToString();
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
|
|
||||||
VideoResolutionFeedbackFunc = () =>
|
|
||||||
{
|
|
||||||
if (ActualVideoInput == eDmps3InputVideoSource.Hdmi)
|
|
||||||
return InputCard.HdmiInputPort.VideoAttributes.GetVideoResolutionString();
|
|
||||||
if (ActualVideoInput == eDmps3InputVideoSource.Vga)
|
|
||||||
return InputCard.VgaInputPort.VideoAttributes.GetVideoResolutionString();
|
|
||||||
if (ActualVideoInput == eDmps3InputVideoSource.Bnc)
|
|
||||||
return InputCard.BncInputPort.VideoAttributes.GetVideoResolutionString();
|
|
||||||
return "";
|
|
||||||
},
|
|
||||||
VideoSyncFeedbackFunc = () =>
|
|
||||||
(ActualVideoInput == eDmps3InputVideoSource.Hdmi
|
|
||||||
&& InputCard.HdmiInputPort.SyncDetectedFeedback.BoolValue)
|
|
||||||
|| (ActualVideoInput == eDmps3InputVideoSource.Vga
|
|
||||||
&& InputCard.VgaInputPort.SyncDetectedFeedback.BoolValue)
|
|
||||||
|| (ActualVideoInput == eDmps3InputVideoSource.Bnc
|
|
||||||
&& InputCard.BncInputPort.VideoDetectedFeedback.BoolValue),
|
|
||||||
|
|
||||||
HasVideoStatusFunc = () =>
|
|
||||||
(ActualVideoInput == eDmps3InputVideoSource.Hdmi
|
|
||||||
&& HdmiIn.VideoStatus.HasVideoStatusFeedback.BoolValue)
|
|
||||||
|| (ActualVideoInput == eDmps3InputVideoSource.Vga
|
|
||||||
&& VgaIn.VideoStatus.HasVideoStatusFeedback.BoolValue)
|
|
||||||
|| (ActualVideoInput == eDmps3InputVideoSource.Bnc
|
|
||||||
&&BncIn.VideoStatus.HasVideoStatusFeedback.BoolValue)
|
|
||||||
};
|
|
||||||
|
|
||||||
AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
|
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, 0, this, combinedFuncs);
|
|
||||||
|
|
||||||
ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput", () => ActualVideoInput.ToString());
|
|
||||||
|
|
||||||
VideoSourceNumericFeedback = new IntFeedback(() =>
|
|
||||||
{
|
|
||||||
return (int)InputCard.VideoSourceFeedback;
|
|
||||||
});
|
|
||||||
AudioSourceNumericFeedback = new IntFeedback(() =>
|
|
||||||
{
|
|
||||||
return (int)InputCard.AudioSourceFeedback;
|
|
||||||
});
|
|
||||||
|
|
||||||
HdmiInHdcpCapabilityFeedback = new IntFeedback("HdmiInHdcpCapability", () =>
|
|
||||||
{
|
|
||||||
if (InputCard.HdmiInputPort.HdcpSupportOnFeedback.BoolValue)
|
|
||||||
return 1;
|
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiIn.Port = InputCard.HdmiInputPort;
|
|
||||||
|
|
||||||
VirtualDmOut = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.None, null, this);
|
|
||||||
|
|
||||||
AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiInHdcpCapabilityFeedback);
|
|
||||||
|
|
||||||
//AddPostActivationAction(() =>
|
|
||||||
//{
|
|
||||||
// Link up all of these damned events to the various RoutingPorts via a helper handler
|
|
||||||
InputCard.HdmiInputPort.InputOutput.BaseDevice.BaseEvent += (o, a) => FowardInputStreamChange(HdmiIn, a.EventId);
|
|
||||||
InputCard.HdmiInputPort.VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn, a.EventId);
|
|
||||||
|
|
||||||
InputCard.VgaInputPort.InputOutput.BaseDevice.BaseEvent += (o, a) => FowardInputStreamChange(VgaIn, a.EventId);
|
|
||||||
InputCard.VgaInputPort.VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(VgaIn, a.EventId);
|
|
||||||
|
|
||||||
InputCard.BncInputPort.InputOutput.BaseDevice.BaseEvent += (o, a) => FowardInputStreamChange(HdmiIn, a.EventId);
|
|
||||||
InputCard.BncInputPort.VideoAttributes.AttributeChange += (o, a) => ForwardVideoAttributeChange(HdmiIn, a.EventId);
|
|
||||||
//});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
|
|
||||||
|
|
||||||
switch (input)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(eDmps3InputVideoSource.Auto, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(HdmiIn.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(VgaIn.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(BncIn.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,195 +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;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Exposes the volume levels for microphones DMPS3 chassis
|
|
||||||
/// </summary>
|
|
||||||
public class DmpsMicrophoneController
|
|
||||||
{
|
|
||||||
private Dictionary<uint, DmpsMicrophone> Mics;
|
|
||||||
|
|
||||||
public DmpsMicrophoneController(CrestronControlSystem dmps)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "Creating Dmps Microphone Controller");
|
|
||||||
Mics = new Dictionary<uint,DmpsMicrophone>();
|
|
||||||
|
|
||||||
foreach (var mic in dmps.Microphones)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Dmps Microphone Controller Adding Mic: {0} Name: {1}", mic.ID, mic.Name);
|
|
||||||
var dmpsMic = new DmpsMicrophone("processor-microphone" + mic.ID, mic.Name, mic);
|
|
||||||
|
|
||||||
DeviceManager.AddDevice(dmpsMic);
|
|
||||||
Mics.Add(mic.ID, dmpsMic);
|
|
||||||
}
|
|
||||||
|
|
||||||
dmps.MicrophoneChange += new MicrophoneChangeEventHandler(Dmps_MicrophoneChange);
|
|
||||||
}
|
|
||||||
|
|
||||||
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());
|
|
||||||
|
|
||||||
if(Mics.ContainsKey(mic.ID))
|
|
||||||
{
|
|
||||||
Mics[mic.ID].Event(args.EventId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DmpsMicrophone : EssentialsBridgeableDevice, IBasicVolumeWithFeedback
|
|
||||||
{
|
|
||||||
MicrophoneBase Mic;
|
|
||||||
|
|
||||||
private bool EnableVolumeSend;
|
|
||||||
private ushort VolumeLevelInput;
|
|
||||||
protected short MinLevel { get; set; }
|
|
||||||
protected short MaxLevel { get; set; }
|
|
||||||
|
|
||||||
public BoolFeedback MuteFeedback { get; private set; }
|
|
||||||
public IntFeedback VolumeLevelFeedback { get; private set; }
|
|
||||||
public IntFeedback VolumeLevelScaledFeedback { get; private set; }
|
|
||||||
public StringFeedback NameFeedback { get; private set; }
|
|
||||||
|
|
||||||
Action MuteOnAction;
|
|
||||||
Action MuteOffAction;
|
|
||||||
|
|
||||||
public DmpsMicrophone(string key, string name, MicrophoneBase mic) : base(key, name)
|
|
||||||
{
|
|
||||||
Mic = mic;
|
|
||||||
VolumeLevelInput = 0;
|
|
||||||
EnableVolumeSend = false;
|
|
||||||
MinLevel = 0;
|
|
||||||
MaxLevel = 600;
|
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(new Func<bool>(() => Mic.MuteOnFeedBack.BoolValue));
|
|
||||||
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => Mic.GainFeedBack.UShortValue));
|
|
||||||
VolumeLevelScaledFeedback = new IntFeedback(new Func<int>(() => ScaleVolumeFeedback(VolumeLevelFeedback.UShortValue)));
|
|
||||||
NameFeedback = new StringFeedback(new Func<string>(() => "Microphone " + Mic.ID));
|
|
||||||
MuteOnAction = new Action(Mic.MuteOn);
|
|
||||||
MuteOffAction = new Action(Mic.MuteOff);
|
|
||||||
|
|
||||||
VolumeLevelFeedback.FireUpdate();
|
|
||||||
VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
NameFeedback.FireUpdate();
|
|
||||||
MuteFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = new DmpsMicrophoneControllerJoinMap(joinStart);
|
|
||||||
|
|
||||||
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"));
|
|
||||||
|
|
||||||
VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[joinMap.MicGain.JoinNumber]);
|
|
||||||
VolumeLevelScaledFeedback.LinkInputSig(trilist.UShortInput[joinMap.MicGainScaled.JoinNumber ]);
|
|
||||||
MuteFeedback.LinkInputSig(trilist.BooleanInput[joinMap.MicMuteOn.JoinNumber]);
|
|
||||||
MuteFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.MicMuteOff.JoinNumber]);
|
|
||||||
NameFeedback.LinkInputSig(trilist.StringInput[joinMap.MicName.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetUShortSigAction(joinMap.MicGain.JoinNumber, SetVolume);
|
|
||||||
trilist.SetUShortSigAction(joinMap.MicGainScaled.JoinNumber, SetVolumeScaled);
|
|
||||||
trilist.SetBoolSigAction(joinMap.MicGainScaledSend.JoinNumber, SendScaledVolume);
|
|
||||||
trilist.SetSigTrueAction(joinMap.MicMuteOn.JoinNumber, MuteOnAction);
|
|
||||||
trilist.SetSigTrueAction(joinMap.MicMuteOff.JoinNumber, MuteOffAction);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Event(int id)
|
|
||||||
{
|
|
||||||
if (id == MicrophoneEventIds.MuteOnFeedBackEventId)
|
|
||||||
{
|
|
||||||
MuteFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
else if (id == MicrophoneEventIds.GainFeedBackEventId)
|
|
||||||
{
|
|
||||||
VolumeLevelFeedback.FireUpdate();
|
|
||||||
VolumeLevelScaledFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetVolumeScaled(ushort level)
|
|
||||||
{
|
|
||||||
VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
|
|
||||||
if (EnableVolumeSend == true)
|
|
||||||
{
|
|
||||||
Mic.Gain.UShortValue = VolumeLevelInput;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public ushort ScaleVolumeFeedback(ushort level)
|
|
||||||
{
|
|
||||||
short signedLevel = (short)level;
|
|
||||||
return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendScaledVolume(bool pressRelease)
|
|
||||||
{
|
|
||||||
EnableVolumeSend = pressRelease;
|
|
||||||
if (pressRelease == false)
|
|
||||||
{
|
|
||||||
SetVolumeScaled(VolumeLevelInput);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IBasicVolumeWithFeedback Members
|
|
||||||
|
|
||||||
public void SetVolume(ushort level)
|
|
||||||
{
|
|
||||||
Mic.Gain.UShortValue = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MuteOn()
|
|
||||||
{
|
|
||||||
MuteOnAction();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MuteOff()
|
|
||||||
{
|
|
||||||
MuteOffAction();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IBasicVolumeControls Members
|
|
||||||
|
|
||||||
public void VolumeUp(bool pressRelease)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void VolumeDown(bool pressRelease)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MuteToggle()
|
|
||||||
{
|
|
||||||
if (MuteFeedback.BoolValue)
|
|
||||||
MuteOff();
|
|
||||||
else
|
|
||||||
MuteOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,518 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using Full.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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,506 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using Full.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 PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Chassis
|
|
||||||
{
|
|
||||||
[Description("Wrapper class for all HdMdNxM4E switchers")]
|
|
||||||
public class HdMdNxM4kEBridgeableController : CrestronGenericBridgeableBaseDevice, IRoutingNumericWithFeedback, IHasFeedback
|
|
||||||
{
|
|
||||||
private HdMdNxM _Chassis;
|
|
||||||
private HdMd4x14kE _Chassis4x1;
|
|
||||||
|
|
||||||
//IroutingNumericEvent
|
|
||||||
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<StringFeedback> InputNameFeedbacks { get; private set; }
|
|
||||||
public FeedbackCollection<StringFeedback> OutputNameFeedbacks { get; private set; }
|
|
||||||
public FeedbackCollection<StringFeedback> OutputRouteNameFeedbacks { get; private set; }
|
|
||||||
public FeedbackCollection<BoolFeedback> InputHdcpEnableFeedback { get; private set; }
|
|
||||||
public StringFeedback DeviceNameFeedback { get; private set; }
|
|
||||||
public BoolFeedback AutoRouteFeedback { get; private set; }
|
|
||||||
|
|
||||||
#region Constructor
|
|
||||||
|
|
||||||
public HdMdNxM4kEBridgeableController(string key, string name, HdMdNxM chassis,
|
|
||||||
HdMdNxM4kEBridgeablePropertiesConfig props)
|
|
||||||
: base(key, name, chassis)
|
|
||||||
{
|
|
||||||
_Chassis = chassis;
|
|
||||||
Name = name;
|
|
||||||
|
|
||||||
if (props == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "HdMdNx4keBridgeableController properties are null, failed to build the device");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (props.Inputs != null)
|
|
||||||
{
|
|
||||||
foreach (var kvp in props.Inputs)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "props.Inputs: {0}-{1}", kvp.Key, kvp.Value);
|
|
||||||
}
|
|
||||||
InputNames = props.Inputs;
|
|
||||||
}
|
|
||||||
if (props.Outputs != null)
|
|
||||||
{
|
|
||||||
foreach (var kvp in props.Outputs)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "props.Outputs: {0}-{1}", kvp.Key, kvp.Value);
|
|
||||||
}
|
|
||||||
OutputNames = props.Outputs;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceNameFeedback = new StringFeedback(()=>Name);
|
|
||||||
|
|
||||||
VideoInputSyncFeedbacks = new FeedbackCollection<BoolFeedback>();
|
|
||||||
VideoOutputRouteFeedbacks = new FeedbackCollection<IntFeedback>();
|
|
||||||
InputNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
|
||||||
OutputNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
|
||||||
OutputRouteNameFeedbacks = new FeedbackCollection<StringFeedback>();
|
|
||||||
InputHdcpEnableFeedback = new FeedbackCollection<BoolFeedback>();
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
|
||||||
|
|
||||||
if (_Chassis.NumberOfInputs == 1)
|
|
||||||
{
|
|
||||||
_Chassis4x1 = _Chassis as HdMd4x14kE;
|
|
||||||
AutoRouteFeedback = new BoolFeedback(() => _Chassis4x1.AutoModeOnFeedback.BoolValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
|
|
||||||
{
|
|
||||||
var index = i;
|
|
||||||
var inputName = InputNames[index];
|
|
||||||
//_Chassis.Inputs[index].Name.StringValue = inputName;
|
|
||||||
_Chassis.HdmiInputs[index].Name.StringValue = inputName;
|
|
||||||
|
|
||||||
InputPorts.Add(new RoutingInputPort(inputName, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, _Chassis.HdmiInputs[index], this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = _Chassis.HdmiInputs[index]
|
|
||||||
});
|
|
||||||
VideoInputSyncFeedbacks.Add(new BoolFeedback(inputName, () => _Chassis.Inputs[index].VideoDetectedFeedback.BoolValue));
|
|
||||||
//InputNameFeedbacks.Add(new StringFeedback(inputName, () => _Chassis.Inputs[index].NameFeedback.StringValue));
|
|
||||||
InputNameFeedbacks.Add(new StringFeedback(inputName, () => InputNames[index]));
|
|
||||||
InputHdcpEnableFeedback.Add(new BoolFeedback(inputName, () => _Chassis.HdmiInputs[index].HdmiInputPort.HdcpSupportOnFeedback.BoolValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
|
|
||||||
{
|
|
||||||
var index = i;
|
|
||||||
var outputName = OutputNames[index];
|
|
||||||
//_Chassis.Outputs[index].Name.StringValue = outputName;
|
|
||||||
//_Chassis.HdmiOutputs[index].Name.StringValue = outputName;
|
|
||||||
|
|
||||||
OutputPorts.Add(new RoutingOutputPort(outputName, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, _Chassis.HdmiOutputs[index], this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = _Chassis.HdmiOutputs[index]
|
|
||||||
});
|
|
||||||
VideoOutputRouteFeedbacks.Add(new IntFeedback(outputName, () => _Chassis.Outputs[index].VideoOutFeedback == null ? 0 : (int)_Chassis.Outputs[index].VideoOutFeedback.Number));
|
|
||||||
OutputNameFeedbacks.Add(new StringFeedback(outputName, () => OutputNames[index]));
|
|
||||||
OutputRouteNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].VideoOutFeedback.NameFeedback.StringValue));
|
|
||||||
}
|
|
||||||
|
|
||||||
_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);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void EnableHdcp(uint port)
|
|
||||||
{
|
|
||||||
if (port > _Chassis.NumberOfInputs) return;
|
|
||||||
if (port <= 0) return;
|
|
||||||
|
|
||||||
_Chassis.HdmiInputs[port].HdmiInputPort.HdcpSupportOn();
|
|
||||||
InputHdcpEnableFeedback[InputNames[port]].FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DisableHdcp(uint port)
|
|
||||||
{
|
|
||||||
if (port > _Chassis.NumberOfInputs) return;
|
|
||||||
if (port <= 0) return;
|
|
||||||
|
|
||||||
_Chassis.HdmiInputs[port].HdmiInputPort.HdcpSupportOff();
|
|
||||||
InputHdcpEnableFeedback[InputNames[port]].FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void EnableAutoRoute()
|
|
||||||
{
|
|
||||||
if (_Chassis.NumberOfInputs != 1) return;
|
|
||||||
|
|
||||||
if (_Chassis4x1 == null) return;
|
|
||||||
|
|
||||||
_Chassis4x1.AutoModeOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void DisableAutoRoute()
|
|
||||||
{
|
|
||||||
if (_Chassis.NumberOfInputs != 1) return;
|
|
||||||
|
|
||||||
if (_Chassis4x1 == null) return;
|
|
||||||
|
|
||||||
_Chassis4x1.AutoModeOff();
|
|
||||||
}
|
|
||||||
|
|
||||||
#region PostActivate
|
|
||||||
|
|
||||||
public void AddFeedbackCollections()
|
|
||||||
{
|
|
||||||
AddFeedbackToList(DeviceNameFeedback);
|
|
||||||
AddCollectionsToList(VideoInputSyncFeedbacks, InputHdcpEnableFeedback);
|
|
||||||
AddCollectionsToList(VideoOutputRouteFeedbacks);
|
|
||||||
AddCollectionsToList(InputNameFeedbacks, OutputNameFeedbacks, OutputRouteNameFeedbacks);
|
|
||||||
}
|
|
||||||
|
|
||||||
#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 signalType)
|
|
||||||
{
|
|
||||||
var input = inputSelector as HdMdNxMHdmiInput; //changed from HdMdNxM4kzEHdmiInput;
|
|
||||||
var output = outputSelector as HdMdNxMHdmiOutput;
|
|
||||||
Debug.Console(2, this, "ExecuteSwitch: input={0} output={1}", input, output);
|
|
||||||
|
|
||||||
if (output == null)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Unable to make switch. output selector is not HdMdNxMHdmiOutput");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to make switch only when necessary. The unit appears to toggle when already selected.
|
|
||||||
var current = output.VideoOut;
|
|
||||||
if (current != input)
|
|
||||||
output.VideoOut = input;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IRoutingNumeric Members
|
|
||||||
|
|
||||||
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
var input = inputSelector == 0 ? null : _Chassis.HdmiInputs[inputSelector];
|
|
||||||
var output = _Chassis.HdmiOutputs[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 HdMdNxM4kEControllerJoinMap(joinStart);
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<HdMdNxM4kEControllerJoinMap>(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]);
|
|
||||||
DeviceNameFeedback.LinkInputSig(trilist.StringInput[joinMap.Name.JoinNumber]);
|
|
||||||
|
|
||||||
if (_Chassis4x1 != null)
|
|
||||||
{
|
|
||||||
trilist.SetSigTrueAction(joinMap.EnableAutoRoute.JoinNumber, () => _Chassis4x1.AutoModeOn());
|
|
||||||
trilist.SetSigFalseAction(joinMap.EnableAutoRoute.JoinNumber, () => _Chassis4x1.AutoModeOff());
|
|
||||||
AutoRouteFeedback.LinkInputSig(trilist.BooleanInput[joinMap.EnableAutoRoute.JoinNumber]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
|
|
||||||
{
|
|
||||||
var joinIndex = i - 1;
|
|
||||||
var input = i;
|
|
||||||
//Digital
|
|
||||||
VideoInputSyncFeedbacks[InputNames[input]].LinkInputSig(trilist.BooleanInput[joinMap.InputSync.JoinNumber + joinIndex]);
|
|
||||||
InputHdcpEnableFeedback[InputNames[input]].LinkInputSig(trilist.BooleanInput[joinMap.EnableInputHdcp.JoinNumber + joinIndex]);
|
|
||||||
InputHdcpEnableFeedback[InputNames[input]].LinkComplementInputSig(trilist.BooleanInput[joinMap.DisableInputHdcp.JoinNumber + joinIndex]);
|
|
||||||
trilist.SetSigTrueAction(joinMap.EnableInputHdcp.JoinNumber + joinIndex, () => EnableHdcp(input));
|
|
||||||
trilist.SetSigTrueAction(joinMap.DisableInputHdcp.JoinNumber + joinIndex, () => DisableHdcp(input));
|
|
||||||
|
|
||||||
//Serial
|
|
||||||
InputNameFeedbacks[InputNames[input]].LinkInputSig(trilist.StringInput[joinMap.InputName.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.OutputRoute.JoinNumber + joinIndex]);
|
|
||||||
trilist.SetUShortSigAction(joinMap.OutputRoute.JoinNumber + joinIndex, (a) => ExecuteNumericSwitch(a, (ushort) output, eRoutingSignalType.AudioVideo));
|
|
||||||
|
|
||||||
//Serial
|
|
||||||
OutputNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputName.JoinNumber + joinIndex]);
|
|
||||||
OutputRouteNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputRoutedName.JoinNumber + joinIndex]);
|
|
||||||
}
|
|
||||||
|
|
||||||
_Chassis.OnlineStatusChange += Chassis_OnlineStatusChange;
|
|
||||||
|
|
||||||
trilist.OnlineStatusChange += (d, args) =>
|
|
||||||
{
|
|
||||||
if (!args.DeviceOnLine) return;
|
|
||||||
|
|
||||||
// feedback updates was moved to the Chassis_OnlineStatusChange
|
|
||||||
// due to the amount of time it takes for the device to come online
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#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();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_Chassis4x1 != null)
|
|
||||||
AutoRouteFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Chassis_DMOutputChange(Switch device, DMOutputEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId != DMOutputEventIds.VideoOutEventId) return;
|
|
||||||
|
|
||||||
var output = args.Number;
|
|
||||||
|
|
||||||
var inputNumber = _Chassis.HdmiOutputs[output].VideoOutFeedback == null
|
|
||||||
? 0
|
|
||||||
: _Chassis.HdmiOutputs[output].VideoOutFeedback.Number;
|
|
||||||
|
|
||||||
var outputName = OutputNames[output];
|
|
||||||
|
|
||||||
var feedback = VideoOutputRouteFeedbacks[outputName];
|
|
||||||
|
|
||||||
if (feedback == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var inPort =
|
|
||||||
InputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.HdmiOutputs[output].VideoOutFeedback);
|
|
||||||
var outPort = OutputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.HdmiOutputs[output]);
|
|
||||||
|
|
||||||
feedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(output, inputNumber, outPort, inPort, eRoutingSignalType.AudioVideo));
|
|
||||||
}
|
|
||||||
|
|
||||||
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.HdmiInputs[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 HdMdNxM4kEControllerFactory : EssentialsDeviceFactory<HdMdNxM4kEBridgeableController>
|
|
||||||
{
|
|
||||||
public HdMdNxM4kEControllerFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "hdmd4x14ke-bridgeable", "hdmd4x24ke", "hdmd6x24ke" };
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory Attempting to create new HD-MD-NxM-4K-E Device");
|
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject<HdMdNxM4kEBridgeablePropertiesConfig>(dc.Properties.ToString());
|
|
||||||
|
|
||||||
var type = dc.Type.ToLower();
|
|
||||||
var control = props.Control;
|
|
||||||
var ipid = control.IpIdInt;
|
|
||||||
var address = control.TcpSshProperties.Address;
|
|
||||||
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case ("hdmd4x14ke-bridgeable"):
|
|
||||||
return new HdMdNxM4kEBridgeableController(dc.Key, dc.Name, new HdMd4x14kE(ipid, address, Global.ControlSystem), props);
|
|
||||||
case ("hdmd4x24ke"):
|
|
||||||
return new HdMdNxM4kEBridgeableController(dc.Key, dc.Name, new HdMd4x24kE(ipid, address, Global.ControlSystem), props);
|
|
||||||
case ("hdmd6x24ke"):
|
|
||||||
return new HdMdNxM4kEBridgeableController(dc.Key, dc.Name, new HdMd6x24kE(ipid, address, Global.ControlSystem), props);
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,171 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using PepperDash.Essentials.DM.Config;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Chassis
|
|
||||||
{
|
|
||||||
[Obsolete("Please use HdMdNxM4kEBridgeable Controller")]
|
|
||||||
public class HdMdNxM4kEController : CrestronGenericBaseDevice, IRoutingInputsOutputs, IRouting
|
|
||||||
{
|
|
||||||
public HdMdNxM Chassis { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="chassis"></param>
|
|
||||||
public HdMdNxM4kEController(string key, string name, HdMdNxM chassis,
|
|
||||||
HdMdNxM4kEPropertiesConfig props)
|
|
||||||
: base(key, name, chassis)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Type hdmd4x14ke is obsolete. Please use hdmd4x14ke-bridgeable");
|
|
||||||
Chassis = chassis;
|
|
||||||
|
|
||||||
// logical ports
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
|
||||||
for (uint i = 1; i <= 4; i++)
|
|
||||||
{
|
|
||||||
InputPorts.Add(new RoutingInputPort("hdmiIn" + i, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.Hdmi, i, this));
|
|
||||||
}
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
|
|
||||||
OutputPorts.Add(new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this));
|
|
||||||
|
|
||||||
// physical settings
|
|
||||||
if (props != null && props.Inputs != null)
|
|
||||||
{
|
|
||||||
var inputRegex = new Regex(@"(?<InputNum>\d)", RegexOptions.IgnoreCase);
|
|
||||||
foreach (var kvp in props.Inputs)
|
|
||||||
{
|
|
||||||
// get numnbers from key and convert to int
|
|
||||||
//var inputNum = Convert.ToUInt32(kvp.Key.Substring(6));
|
|
||||||
var inputMatch = inputRegex.Match(kvp.Key);
|
|
||||||
if (inputMatch == null) continue;
|
|
||||||
|
|
||||||
var inputNum = Convert.ToUInt32(inputMatch.Groups["InputNum"].Value);
|
|
||||||
|
|
||||||
var port = chassis.HdmiInputs[inputNum].HdmiInputPort;
|
|
||||||
// set hdcp disables
|
|
||||||
if (kvp.Value.DisableHdcp)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Configuration disables HDCP support on {0}", kvp.Key);
|
|
||||||
port.HdcpSupportOff();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
port.HdcpSupportOn();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool CustomActivate()
|
|
||||||
{
|
|
||||||
var result = Chassis.Register();
|
|
||||||
if (result != Crestron.SimplSharpPro.eDeviceRegistrationUnRegistrationResponse.Success)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Device registration failed: {0}", result);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.CustomActivate();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#region IRouting Members
|
|
||||||
|
|
||||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
// Try to make switch only when necessary. The unit appears to toggle when already selected.
|
|
||||||
var current = Chassis.HdmiOutputs[1].VideoOut;
|
|
||||||
if (current != Chassis.HdmiInputs[(uint)inputSelector])
|
|
||||||
Chassis.HdmiOutputs[1].VideoOut = Chassis.HdmiInputs[(uint)inputSelector];
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="type"></param>
|
|
||||||
/// <param name="properties"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
/// /*
|
|
||||||
/*
|
|
||||||
public static HdMdNxM4kEController GetController(string key, string name,
|
|
||||||
string type, HdMdNxM4kEPropertiesConfig properties)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var ipid = properties.Control.IpIdInt;
|
|
||||||
var address = properties.Control.TcpSshProperties.Address;
|
|
||||||
|
|
||||||
type = type.ToLower();
|
|
||||||
if (type == "hdmd4x14ke")
|
|
||||||
{
|
|
||||||
Debug.Console(0, @"The 'hdmd4x14ke' device is not an Essentials Bridgeable device.
|
|
||||||
If an essentials Bridgeable Device is required, use the 'hdmd4x14ke-bridgeable' type");
|
|
||||||
|
|
||||||
var chassis = new HdMd4x14kE(ipid, address, Global.ControlSystem);
|
|
||||||
return new HdMdNxM4kEController(key, name, chassis, properties);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "ERROR Creating device key {0}: \r{1}", key, e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
#region Factory
|
|
||||||
|
|
||||||
public class HdMdNxM4kEFactory : EssentialsDeviceFactory<HdMdNxM4kEController>
|
|
||||||
{
|
|
||||||
public HdMdNxM4kEFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() {"hdmd4x14ke"};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Factory Attempting to create new HD-MD-NxM-4K-E Device");
|
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject<HdMdNxM4kEPropertiesConfig>(dc.Properties.ToString());
|
|
||||||
|
|
||||||
var type = dc.Type.ToLower();
|
|
||||||
var control = props.Control;
|
|
||||||
var ipid = control.IpIdInt;
|
|
||||||
var address = control.TcpSshProperties.Address;
|
|
||||||
|
|
||||||
return new HdMdNxM4kEController(dc.Key, dc.Name, new HdMd4x14kE(ipid, address, Global.ControlSystem), props);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using Full.Newtonsoft.Json.Converters;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Config
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents the "properties" property of a DM device config
|
|
||||||
/// </summary>
|
|
||||||
public class DMChassisPropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("control")]
|
|
||||||
public ControlPropertiesConfig Control { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("volumeControls")]
|
|
||||||
public Dictionary<uint, DmCardAudioPropertiesConfig> VolumeControls { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("inputSlots")]
|
|
||||||
public Dictionary<uint, string> InputSlots { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("outputSlots")]
|
|
||||||
public Dictionary<uint, string> OutputSlots { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("inputNames")]
|
|
||||||
public Dictionary<uint, string> InputNames { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("outputNames")]
|
|
||||||
public Dictionary<uint, string> OutputNames { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("noRouteText")]
|
|
||||||
public string NoRouteText { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("inputSlotSupportsHdcp2")]
|
|
||||||
public Dictionary<uint, bool> InputSlotSupportsHdcp2 { get; set; }
|
|
||||||
|
|
||||||
public DMChassisPropertiesConfig()
|
|
||||||
{
|
|
||||||
InputSlotSupportsHdcp2 = new Dictionary<uint, bool>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public class DmCardAudioPropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("outLevel")]
|
|
||||||
public int OutLevel { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("isVolumeControlPoint")]
|
|
||||||
public bool IsVolumeControlPoint { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharp.CrestronIO;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.AirMedia;
|
|
||||||
using Crestron.SimplSharpPro.UI;
|
|
||||||
using Crestron.SimplSharp.Reflection;
|
|
||||||
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using Full.Newtonsoft.Json.Linq;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using PepperDash.Essentials.DM.AirMedia;
|
|
||||||
using PepperDash.Essentials.DM.Endpoints.DGEs;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Responsible for loading the type factories for this library
|
|
||||||
/// </summary>
|
|
||||||
public class DeviceFactory
|
|
||||||
{
|
|
||||||
public DeviceFactory()
|
|
||||||
{
|
|
||||||
var assy = Assembly.GetExecutingAssembly();
|
|
||||||
PluginLoader.SetEssentialsAssembly(assy.GetName().Name, assy);
|
|
||||||
|
|
||||||
var types = assy.GetTypes().Where(ct => typeof(IDeviceFactory).IsAssignableFrom(ct) && !ct.IsInterface && !ct.IsAbstract);
|
|
||||||
|
|
||||||
if (types != null)
|
|
||||||
{
|
|
||||||
foreach (var type in types)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var factory = (IDeviceFactory)Crestron.SimplSharp.Reflection.Activator.CreateInstance(type);
|
|
||||||
factory.LoadTypeFactories();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Unable to load type: '{1}' DeviceFactory: {0}", e, type.Name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using Full.Newtonsoft.Json.Converters;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Config
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents the "properties" property of a DM TX device config
|
|
||||||
/// </summary>
|
|
||||||
public class DmRmcPropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("control")]
|
|
||||||
public ControlPropertiesConfig Control { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("parentDeviceKey")]
|
|
||||||
public string ParentDeviceKey { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("parentOutputNumber")]
|
|
||||||
public uint ParentOutputNumber { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using Full.Newtonsoft.Json.Converters;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Config
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents the "properties" property of a DM TX device config
|
|
||||||
/// </summary>
|
|
||||||
public class DmTxPropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("control")]
|
|
||||||
public ControlPropertiesConfig Control { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("parentDeviceKey")]
|
|
||||||
public string ParentDeviceKey { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("parentInputNumber")]
|
|
||||||
public uint ParentInputNumber { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("autoSwitching")]
|
|
||||||
public bool AutoSwitching { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using Full.Newtonsoft.Json.Converters;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Config
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represents the "properties" property of a DM device config
|
|
||||||
/// </summary>
|
|
||||||
public class DmpsRoutingPropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("inputNames")]
|
|
||||||
public Dictionary<uint, string> InputNames { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("outputNames")]
|
|
||||||
public Dictionary<uint, string> OutputNames { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("noRouteText")]
|
|
||||||
public string NoRouteText { get; set; }
|
|
||||||
|
|
||||||
public DmpsRoutingPropertiesConfig()
|
|
||||||
{
|
|
||||||
InputNames = new Dictionary<uint, string>();
|
|
||||||
OutputNames = new Dictionary<uint, string>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Config
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Defines the properties section of HdMdNxM boxes
|
|
||||||
/// </summary>
|
|
||||||
public class HdMdNxM4kEPropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("control")]
|
|
||||||
public ControlPropertiesConfig Control { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("inputs")]
|
|
||||||
public Dictionary<string, InputPropertiesConfig> Inputs { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class HdMdNxM4kEBridgeablePropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("control")]
|
|
||||||
public ControlPropertiesConfig Control { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("inputs")]
|
|
||||||
public Dictionary<uint, string> Inputs { get; set; }
|
|
||||||
|
|
||||||
[JsonProperty("outputs")]
|
|
||||||
public Dictionary<uint, string> Outputs { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Config
|
|
||||||
{
|
|
||||||
public class InputPropertiesConfig
|
|
||||||
{
|
|
||||||
public string Name { get; set; }
|
|
||||||
|
|
||||||
public bool DisableHdcp { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,319 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Represent both a transmitter and receiver pair of the HD-MD-400-C-E / HD-MD-300-C-E / HD-MD-200-C-E kits
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper class for all HD-MD variants")]
|
|
||||||
public class HdMdxxxCEController : CrestronGenericBridgeableBaseDevice, IRouting//, IComPorts
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
///// DmLite Ports
|
|
||||||
///// </summary>
|
|
||||||
//public RoutingOutputPort ToRx { get; private set; }
|
|
||||||
//public RoutingInputPort FromTx { get; private set; }
|
|
||||||
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public HdMdxxxCE TxRxPair { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The value of the current video source for the HDMI output on the receiver
|
|
||||||
/// </summary>
|
|
||||||
public IntFeedback VideoSourceFeedback { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Indicates if Auto Route is on on the transmitter
|
|
||||||
/// </summary>
|
|
||||||
public BoolFeedback AutoRouteOnFeedback { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Indicates if Priority Routing is on on the transmitter
|
|
||||||
/// </summary>
|
|
||||||
public BoolFeedback PriorityRoutingOnFeedback { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// INdicates if the On Screen Display is enabled
|
|
||||||
/// </summary>
|
|
||||||
public BoolFeedback InputOnScreenDisplayEnabledFeedback { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Indicates if video sync is detected on each of the inputs
|
|
||||||
/// </summary>
|
|
||||||
public Dictionary<uint, BoolFeedback> SyncDetectedFeedbacks { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Indicates if the remote end device is detected
|
|
||||||
/// </summary>
|
|
||||||
public BoolFeedback RemoteEndDetectedFeedback { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
|
||||||
{
|
|
||||||
get { return new RoutingPortCollection<RoutingOutputPort> { HdmiOut }; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public HdMdxxxCEController(string key, string name, HdMdxxxCE txRxPair)
|
|
||||||
:base(key, name, txRxPair)
|
|
||||||
{
|
|
||||||
|
|
||||||
TxRxPair = txRxPair;
|
|
||||||
|
|
||||||
RemoteEndDetectedFeedback = new BoolFeedback(() => TxRxPair.RemoteEndDetectedOnFeedback.BoolValue);
|
|
||||||
|
|
||||||
AutoRouteOnFeedback = new BoolFeedback(() => TxRxPair.TransmitterAutoModeOnFeedback.BoolValue);
|
|
||||||
|
|
||||||
PriorityRoutingOnFeedback = new BoolFeedback(() => TxRxPair.PriorityRoutingOnFeedback.BoolValue);
|
|
||||||
|
|
||||||
InputOnScreenDisplayEnabledFeedback = new BoolFeedback(() => TxRxPair.OnScreenDisplayEnabledFeedback.BoolValue);
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort>();
|
|
||||||
|
|
||||||
SyncDetectedFeedbacks = new Dictionary<uint, BoolFeedback>();
|
|
||||||
|
|
||||||
// Add the HDMI input port on the receiver
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.Hdmi, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.Hdmi, 1, this));
|
|
||||||
|
|
||||||
SyncDetectedFeedbacks.Add(1, new BoolFeedback( () => TxRxPair.HdmiInputs[1].VideoDetectedFeedback.BoolValue));
|
|
||||||
|
|
||||||
if(txRxPair is HdMd400CE)
|
|
||||||
{
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.HdmiIn1, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.Hdmi, 2, this));
|
|
||||||
SyncDetectedFeedbacks.Add(2, new BoolFeedback(() => TxRxPair.HdmiInputs[2].VideoDetectedFeedback.BoolValue));
|
|
||||||
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.HdmiIn2, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.Hdmi, 3, this));
|
|
||||||
SyncDetectedFeedbacks.Add(3, new BoolFeedback(() => TxRxPair.HdmiInputs[3].VideoDetectedFeedback.BoolValue));
|
|
||||||
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.VgaIn, eRoutingSignalType.Video | eRoutingSignalType.Audio,
|
|
||||||
eRoutingPortConnectionType.Vga, 4, this));
|
|
||||||
SyncDetectedFeedbacks.Add(4, new BoolFeedback(() => TxRxPair.VgaInputs[1].VideoDetectedFeedback.BoolValue));
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
InputPorts[DmPortName.HdmiIn1].Port = TxRxPair.HdmiInputs[1];
|
|
||||||
InputPorts[DmPortName.HdmiIn2].Port = TxRxPair.HdmiInputs[2];
|
|
||||||
}
|
|
||||||
else if (txRxPair is HdMd300CE)
|
|
||||||
{
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.HdmiIn, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.Hdmi, 2, this));
|
|
||||||
SyncDetectedFeedbacks.Add(2, new BoolFeedback(() => TxRxPair.HdmiInputs[2].VideoDetectedFeedback.BoolValue));
|
|
||||||
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.VgaIn, eRoutingSignalType.Video | eRoutingSignalType.Audio,
|
|
||||||
eRoutingPortConnectionType.Vga, 3, this));
|
|
||||||
SyncDetectedFeedbacks.Add(3, new BoolFeedback(() => TxRxPair.VgaInputs[1].VideoDetectedFeedback.BoolValue));
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
InputPorts[DmPortName.HdmiIn].Port = TxRxPair.HdmiInputs[1];
|
|
||||||
}
|
|
||||||
else if (txRxPair is HdMd200CE || txRxPair is HdMd200C1GE)
|
|
||||||
{
|
|
||||||
InputPorts.Add(new RoutingInputPort(DmPortName.HdmiIn, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.Hdmi, 2, this));
|
|
||||||
SyncDetectedFeedbacks.Add(2, new BoolFeedback(() => TxRxPair.HdmiInputs[2].VideoDetectedFeedback.BoolValue));
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
InputPorts[DmPortName.HdmiIn].Port = TxRxPair.HdmiInputs[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
//ToRx = new RoutingOutputPort(DmPortName.ToTx, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
// eRoutingPortConnectionType.DmCat, null, this);
|
|
||||||
|
|
||||||
//FromTx = new RoutingInputPort(DmPortName.FromTx, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
// eRoutingPortConnectionType.DmCat, null, this);
|
|
||||||
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
OutputPorts[DmPortName.HdmiOut].Port = TxRxPair.HdmiOutputs[1];
|
|
||||||
|
|
||||||
TxRxPair.DMInputChange += new DMInputEventHandler(TxRxPair_DMInputChange);
|
|
||||||
TxRxPair.DMOutputChange += new DMOutputEventHandler(TxRxPair_DMOutputChange);
|
|
||||||
TxRxPair.DMSystemChange += new DMSystemEventHandler(TxRxPair_DMSystemChange);
|
|
||||||
|
|
||||||
VideoSourceFeedback = new IntFeedback(() => (int)TxRxPair.HdmiOutputs[1].VideoOutFeedback.Number);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TxRxPair_DMSystemChange(Switch device, DMSystemEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == DMSystemEventIds.RemoteEndDetectedEventId)
|
|
||||||
RemoteEndDetectedFeedback.FireUpdate();
|
|
||||||
else if (args.EventId == DMSystemEventIds.TransmitterAutoModeOnEventId)
|
|
||||||
AutoRouteOnFeedback.FireUpdate();
|
|
||||||
else if (args.EventId == DMSystemEventIds.PriorityRoutingOnEventId)
|
|
||||||
PriorityRoutingOnFeedback.FireUpdate();
|
|
||||||
else if (args.EventId == DMSystemEventIds.OnScreenDisplayEnabledEventId)
|
|
||||||
InputOnScreenDisplayEnabledFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TxRxPair_DMOutputChange(Switch device, DMOutputEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == DMOutputEventIds.VideoOutEventId)
|
|
||||||
VideoSourceFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TxRxPair_DMInputChange(Switch device, DMInputEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == DMInputEventIds.VideoDetectedEventId)
|
|
||||||
SyncDetectedFeedbacks[args.Number].FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AutoRouteOn()
|
|
||||||
{
|
|
||||||
TxRxPair.TransmitterAutoModeOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AutoRouteOff()
|
|
||||||
{
|
|
||||||
TxRxPair.TransmitterAutoModeOff();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PriorityRouteOn()
|
|
||||||
{
|
|
||||||
TxRxPair.PriorityRoutingOn();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PriorityRouteOff()
|
|
||||||
{
|
|
||||||
TxRxPair.PriorityRoutingOff();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnScreenDisplayEnable()
|
|
||||||
{
|
|
||||||
TxRxPair.OnScreenDisplayEnabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnScreenDisplayDisable()
|
|
||||||
{
|
|
||||||
TxRxPair.OnScreenDisplayDisabled();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
var number = Convert.ToUInt32(inputSelector); // Cast can sometimes fail
|
|
||||||
|
|
||||||
var input = number == 0 ? null : TxRxPair.Inputs[number];
|
|
||||||
|
|
||||||
TxRxPair.HdmiOutputs[1].VideoOut = input;
|
|
||||||
}
|
|
||||||
|
|
||||||
// This device has a different class for com ports which will make it hard to implement IComPorts....
|
|
||||||
|
|
||||||
//#region IComPorts Members
|
|
||||||
//public CrestronCollection<ComPort> ComPorts { get { return TxRxPair.ComPorts as CrestronCollection<ComPort>; } }
|
|
||||||
//public int NumberOfComPorts { get { return 1; } }
|
|
||||||
//#endregion
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = new HdMdxxxCEControllerJoinMap(joinStart);
|
|
||||||
|
|
||||||
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(joinMapSerialized))
|
|
||||||
joinMap = JsonConvert.DeserializeObject<HdMdxxxCEControllerJoinMap>(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]);
|
|
||||||
RemoteEndDetectedFeedback.LinkInputSig(trilist.BooleanInput[joinMap.RemoteEndDetected.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetSigTrueAction(joinMap.AutoRouteOn.JoinNumber, AutoRouteOn);
|
|
||||||
AutoRouteOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.AutoRouteOn.JoinNumber]);
|
|
||||||
trilist.SetSigTrueAction(joinMap.AutoRouteOff.JoinNumber, AutoRouteOff);
|
|
||||||
AutoRouteOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.AutoRouteOff.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetSigTrueAction(joinMap.PriorityRoutingOn.JoinNumber, PriorityRouteOn);
|
|
||||||
PriorityRoutingOnFeedback.LinkInputSig(trilist.BooleanInput[joinMap.PriorityRoutingOn.JoinNumber]);
|
|
||||||
trilist.SetSigTrueAction(joinMap.PriorityRoutingOff.JoinNumber, PriorityRouteOff);
|
|
||||||
PriorityRoutingOnFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.PriorityRoutingOff.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetSigTrueAction(joinMap.InputOnScreenDisplayEnabled.JoinNumber, OnScreenDisplayEnable);
|
|
||||||
InputOnScreenDisplayEnabledFeedback.LinkInputSig(trilist.BooleanInput[joinMap.InputOnScreenDisplayEnabled.JoinNumber]);
|
|
||||||
trilist.SetSigTrueAction(joinMap.AutoRouteOff.JoinNumber, OnScreenDisplayDisable);
|
|
||||||
InputOnScreenDisplayEnabledFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.InputOnScreenDisplayDisabled.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetUShortSigAction(joinMap.VideoSource.JoinNumber, (i) => ExecuteSwitch(i, null, eRoutingSignalType.Video | eRoutingSignalType.Audio));
|
|
||||||
VideoSourceFeedback.LinkInputSig(trilist.UShortInput[joinMap.VideoSource.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.UShortInput[joinMap.SourceCount.JoinNumber].UShortValue = (ushort)InputPorts.Count;
|
|
||||||
|
|
||||||
foreach (var input in InputPorts)
|
|
||||||
{
|
|
||||||
var number = Convert.ToUInt16(input.Selector);
|
|
||||||
var numberJoin = (UInt16)(number - 1);
|
|
||||||
SyncDetectedFeedbacks[number].LinkInputSig(trilist.BooleanInput[joinMap.SyncDetected.JoinNumber + numberJoin]);
|
|
||||||
trilist.StringInput[joinMap.SourceNames.JoinNumber + numberJoin].StringValue = input.Key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class HdMdxxxCEPropertiesConfig
|
|
||||||
{
|
|
||||||
public ControlPropertiesConfig Control { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class HdMdxxxCEControllerFactory : EssentialsDeviceFactory<HdMdxxxCEController>
|
|
||||||
{
|
|
||||||
public HdMdxxxCEControllerFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "hdmd400ce", "hdmd300ce", "hdmd200ce", "hdmd200c1ge"};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
var typeName = dc.Type.ToLower();
|
|
||||||
var key = dc.Key;
|
|
||||||
var name = dc.Name;
|
|
||||||
|
|
||||||
Debug.Console(1, "Factory Attempting to create new HD-MD Device");
|
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject
|
|
||||||
<PepperDash.Essentials.DM.HdMdxxxCEPropertiesConfig>(dc.Properties.ToString());
|
|
||||||
|
|
||||||
if (typeName.Equals("hdmd400ce"))
|
|
||||||
return new PepperDash.Essentials.DM.HdMdxxxCEController(key, name,
|
|
||||||
new HdMd400CE(props.Control.IpIdInt, props.Control.TcpSshProperties.Address, Global.ControlSystem));
|
|
||||||
else if (typeName.Equals("hdmd300ce"))
|
|
||||||
return new PepperDash.Essentials.DM.HdMdxxxCEController(key, name,
|
|
||||||
new HdMd300CE(props.Control.IpIdInt, props.Control.TcpSshProperties.Address, Global.ControlSystem));
|
|
||||||
else if (typeName.Equals("hdmd200ce"))
|
|
||||||
return new PepperDash.Essentials.DM.HdMdxxxCEController(key, name,
|
|
||||||
new HdMd200CE(props.Control.IpIdInt, props.Control.TcpSshProperties.Address, Global.ControlSystem));
|
|
||||||
else if (typeName.Equals("hdmd200c1ge"))
|
|
||||||
return new PepperDash.Essentials.DM.HdMdxxxCEController(key, name,
|
|
||||||
new HdMd200C1GE(props.Control.IpIdInt, props.Control.TcpSshProperties.Address, Global.ControlSystem));
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Constants for consistent port naming
|
|
||||||
/// </summary>
|
|
||||||
public class DmPortName
|
|
||||||
{
|
|
||||||
public const string AirBoardIn = "AirBoardIn";
|
|
||||||
public const string AirMediaIn = "AirMediaIn";
|
|
||||||
public const string AnyVideoIn = "AnyVideoIn";
|
|
||||||
public const string AudioIn = "AudioIn";
|
|
||||||
public const string AudioLoopOut = "AudioLoopOut";
|
|
||||||
public const string BalancedAudioOut = "BalancedAudioOut";
|
|
||||||
public const string BalancedAudioOut1 = "BalancedAudioOut1";
|
|
||||||
public const string BalancedAudioOut2 = "BalancedAudioOut2";
|
|
||||||
public const string BncIn = "BncIn";
|
|
||||||
public const string CompositeIn = "CompositeIn";
|
|
||||||
public const string DisplayPortIn = "DisplayPortIn";
|
|
||||||
public const string DmIn = "DmIn";
|
|
||||||
public const string DmOut = "DmOut";
|
|
||||||
public const string DmOut1 = "DmOut1";
|
|
||||||
public const string DmOut2 = "DmOut2";
|
|
||||||
public const string FromTx = "FromTx";
|
|
||||||
public const string Hdmi = "Hdmi";
|
|
||||||
public const string HdmiIn = "HdmiIn";
|
|
||||||
public const string HdmiIn1 = "HdmiIn1";
|
|
||||||
public const string HdmiIn2 = "HdmiIn2";
|
|
||||||
public const string HdmiOut1 = "HdmiOut1";
|
|
||||||
public const string HdmiOut2 = "HdmiOut2";
|
|
||||||
public const string HdmiLoopOut = "HdmiLoopOut";
|
|
||||||
public const string HdmiOut = "HdmiOut";
|
|
||||||
public const string Osd = "Osd";
|
|
||||||
public const string SpdifIn = "SpdifIn";
|
|
||||||
public const string ToTx = "ToTx";
|
|
||||||
public const string VgaIn = "VgaIn";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,225 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net.Sockets;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.UI;
|
|
||||||
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
|
|
||||||
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using PepperDash.Essentials.Core.DeviceInfo;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
|
||||||
{
|
|
||||||
[Description("Wrapper class for DGE-100")]
|
|
||||||
public class Dge100Controller : CrestronGenericBaseDevice, IComPorts, IIROutputPorts, IHasBasicTriListWithSmartObject, ICec, IDeviceInfoProvider
|
|
||||||
{
|
|
||||||
private const int CtpPort = 41795;
|
|
||||||
private readonly Dge100 _dge;
|
|
||||||
|
|
||||||
private readonly TsxCcsUcCodec100EthernetReservedSigs _dgeEthernetInfo;
|
|
||||||
|
|
||||||
public BasicTriListWithSmartObject Panel { get { return _dge; } }
|
|
||||||
|
|
||||||
private DeviceConfig _dc;
|
|
||||||
|
|
||||||
CrestronTouchpanelPropertiesConfig PropertiesConfig;
|
|
||||||
|
|
||||||
public Dge100Controller(string key, string name, Dge100 device, DeviceConfig dc, CrestronTouchpanelPropertiesConfig props)
|
|
||||||
:base(key, name, device)
|
|
||||||
{
|
|
||||||
_dge = device;
|
|
||||||
_dgeEthernetInfo = _dge.ExtenderEthernetReservedSigs;
|
|
||||||
//_dgeEthernetInfo.DeviceExtenderSigChange += (extender, args) => UpdateDeviceInfo();
|
|
||||||
_dgeEthernetInfo.Use();
|
|
||||||
|
|
||||||
DeviceInfo = new DeviceInfo();
|
|
||||||
|
|
||||||
_dge.OnlineStatusChange += (currentDevice, args) => { if (args.DeviceOnLine) UpdateDeviceInfo(); };
|
|
||||||
|
|
||||||
_dc = dc;
|
|
||||||
|
|
||||||
PropertiesConfig = props;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
|
|
||||||
public CrestronCollection<ComPort> ComPorts
|
|
||||||
{
|
|
||||||
get { return _dge.ComPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int NumberOfComPorts
|
|
||||||
{
|
|
||||||
get { return _dge.NumberOfComPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts
|
|
||||||
{
|
|
||||||
get { return _dge.IROutputPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int NumberOfIROutputPorts
|
|
||||||
{
|
|
||||||
get { return _dge.NumberOfIROutputPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
public Cec StreamCec { get { return _dge.HdmiOut.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Implementation of IDeviceInfoProvider
|
|
||||||
|
|
||||||
public DeviceInfo DeviceInfo { get; private set; }
|
|
||||||
|
|
||||||
public event DeviceInfoChangeHandler DeviceInfoChanged;
|
|
||||||
|
|
||||||
public void UpdateDeviceInfo()
|
|
||||||
{
|
|
||||||
DeviceInfo.IpAddress = _dgeEthernetInfo.IpAddressFeedback.StringValue;
|
|
||||||
DeviceInfo.MacAddress = _dgeEthernetInfo.MacAddressFeedback.StringValue;
|
|
||||||
|
|
||||||
GetFirmwareAndSerialInfo();
|
|
||||||
|
|
||||||
OnDeviceInfoChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GetFirmwareAndSerialInfo()
|
|
||||||
{
|
|
||||||
if (String.IsNullOrEmpty(_dgeEthernetInfo.IpAddressFeedback.StringValue))
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "IP Address information not yet received. No device is online");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var tcpClient = new GenericTcpIpClient("", _dgeEthernetInfo.IpAddressFeedback.StringValue, CtpPort, 1024){AutoReconnect = false};
|
|
||||||
|
|
||||||
var gather = new CommunicationGather(tcpClient, "\r\n\r\n");
|
|
||||||
|
|
||||||
tcpClient.ConnectionChange += (sender, args) =>
|
|
||||||
{
|
|
||||||
if (!args.Client.IsConnected)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
args.Client.SendText("ver\r\n");
|
|
||||||
};
|
|
||||||
|
|
||||||
gather.LineReceived += (sender, args) =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "{0}", args.Text);
|
|
||||||
|
|
||||||
if (args.Text.ToLower().Contains("host"))
|
|
||||||
{
|
|
||||||
DeviceInfo.HostName = args.Text.Split(':')[1].Trim();
|
|
||||||
|
|
||||||
Debug.Console(1, this, "hostname: {0}", DeviceInfo.HostName);
|
|
||||||
tcpClient.Disconnect();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//ignore console prompt
|
|
||||||
/*if (args.Text.ToLower().Contains(">"))
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Ignoring console");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.Text.ToLower().Contains("dge"))
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Ignoring DGE");
|
|
||||||
return;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
if (!args.Text.Contains('['))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var splitResponse = args.Text.Split('[');
|
|
||||||
|
|
||||||
foreach (string t in splitResponse)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "{0}", t);
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceInfo.SerialNumber = splitResponse[1].Split(' ')[4].Replace("#", "");
|
|
||||||
DeviceInfo.FirmwareVersion = splitResponse[1].Split(' ')[0];
|
|
||||||
|
|
||||||
Debug.Console(1, this, "Firmware: {0} SerialNumber: {1}", DeviceInfo.FirmwareVersion,
|
|
||||||
DeviceInfo.SerialNumber);
|
|
||||||
|
|
||||||
tcpClient.SendText("host\r\n");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Exception getting data: {0}", ex.Message);
|
|
||||||
Debug.Console(0, this, "response: {0}", args.Text);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
tcpClient.Connect();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnDeviceInfoChange()
|
|
||||||
{
|
|
||||||
var handler = DeviceInfoChanged;
|
|
||||||
|
|
||||||
if (handler == null) return;
|
|
||||||
|
|
||||||
handler(this, new DeviceInfoEventArgs(DeviceInfo));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Dge100ControllerFactory : EssentialsDeviceFactory<Dge100Controller>
|
|
||||||
{
|
|
||||||
public Dge100ControllerFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>() { "dge100" };
|
|
||||||
}
|
|
||||||
|
|
||||||
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");
|
|
||||||
|
|
||||||
Dge100 dgeDevice = null;
|
|
||||||
if (typeName == "dge100")
|
|
||||||
dgeDevice = new Dge100(comm.IpIdInt, Global.ControlSystem);
|
|
||||||
|
|
||||||
if (dgeDevice == null)
|
|
||||||
{
|
|
||||||
Debug.Console(1, "Unable to create DGE device");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var dgeController = new Dge100Controller(dc.Key, dc.Name, dgeDevice, dc, props);
|
|
||||||
|
|
||||||
return dgeController;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
|
||||||
{
|
|
||||||
public class DgePropertiesConfig
|
|
||||||
{
|
|
||||||
[JsonProperty("control")]
|
|
||||||
public ControlPropertiesConfig Control { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Crestron.SimplSharp;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.UI;
|
|
||||||
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM.Endpoints.DGEs
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Wrapper class for DGE-100 and DM-DGE-200-C
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper class for DM-DGE-200-C")]
|
|
||||||
public class DmDge200CController : Dge100Controller, IRoutingInputsOutputs
|
|
||||||
{
|
|
||||||
private readonly DmDge200C _dge;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public DmDge200CController(string key, string name, DmDge200C device, DeviceConfig dc, CrestronTouchpanelPropertiesConfig props)
|
|
||||||
: base(key, name, device, dc, props)
|
|
||||||
{
|
|
||||||
_dge = device;
|
|
||||||
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> { DmIn };
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> { HdmiOut };
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
public class HDBaseTRxController : DmHdBaseTControllerBase, IRoutingInputsOutputs,
|
|
||||||
IComPorts
|
|
||||||
{
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HDBaseTSink { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
public HDBaseTRxController(string key, string name, HDRx3CB rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HDBaseTSink = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this) {Port = Rmc};
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HDBaseTSink};
|
|
||||||
}
|
|
||||||
|
|
||||||
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
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return Rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return Rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-100-S")]
|
|
||||||
public class DmRmc100SController : DmRmcControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmc100S _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmc100SController(string key, string name, DmRmc100S rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this) {Port = _rmc};
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-150-S")]
|
|
||||||
public class DmRmc150SController : DmRmcControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmc150S _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts
|
|
||||||
{
|
|
||||||
get; private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set ;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmc150SController(string key, string name, DmRmc150S rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-200-C")]
|
|
||||||
public class DmRmc200CController : DmRmcControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmc200C _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts
|
|
||||||
{
|
|
||||||
get; private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
|
||||||
{
|
|
||||||
get; private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmc200CController(string key, string name, DmRmc200C rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString());
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId || args.EventId == EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId ||
|
|
||||||
args.EventId == EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-200-S2")]
|
|
||||||
public class DmRmc200S2Controller : DmRmcControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmc200S2 _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmc200S2Controller(string key, string name, DmRmc200S2 rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString());
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId || args.EventId == EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId ||
|
|
||||||
args.EventId == EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-200-S")]
|
|
||||||
public class DmRmc200SController : DmRmcControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmc200S _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
|
||||||
{
|
|
||||||
get; private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmc200SController(string key, string name, DmRmc200S rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString());
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId || args.EventId == EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId ||
|
|
||||||
args.EventId == EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,196 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-4K-SCALER-C")]
|
|
||||||
public class DmRmc4kScalerCController : DmRmcControllerBase, IRoutingInputsOutputs, IBasicVolumeWithFeedback,
|
|
||||||
IIROutputPorts, IComPorts, ICec, IRelayPorts
|
|
||||||
{
|
|
||||||
private readonly DmRmc4kScalerC _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
public RoutingOutputPort BalancedAudioOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmc4kScalerCController(string key, string name, DmRmc4kScalerC rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
BalancedAudioOut = new RoutingOutputPort(DmPortName.BalancedAudioOut, eRoutingSignalType.Audio,
|
|
||||||
eRoutingPortConnectionType.LineAudio, null, this);
|
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(() => false);
|
|
||||||
|
|
||||||
VolumeLevelFeedback = new IntFeedback("MainVolumeLevelFeedback", () =>
|
|
||||||
rmc.AudioOutput.VolumeFeedback.UShortValue);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut, BalancedAudioOut};
|
|
||||||
|
|
||||||
VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString());
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId || args.EventId == EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId ||
|
|
||||||
args.EventId == EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the CEC stream directly from the HDMI port.
|
|
||||||
/// </summary>
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IRelayPorts Members
|
|
||||||
|
|
||||||
public int NumberOfRelayPorts
|
|
||||||
{
|
|
||||||
get { return _rmc.NumberOfRelayPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public CrestronCollection<Relay> RelayPorts
|
|
||||||
{
|
|
||||||
get { return _rmc.RelayPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IBasicVolumeWithFeedback Members
|
|
||||||
|
|
||||||
public BoolFeedback MuteFeedback
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Not implemented
|
|
||||||
/// </summary>
|
|
||||||
public void MuteOff()
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "DM Endpoint {0} does not have a mute function", Key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Not implemented
|
|
||||||
/// </summary>
|
|
||||||
public void MuteOn()
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "DM Endpoint {0} does not have a mute function", Key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetVolume(ushort level)
|
|
||||||
{
|
|
||||||
_rmc.AudioOutput.Volume.UShortValue = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntFeedback VolumeLevelFeedback
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IBasicVolumeControls Members
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Not implemented
|
|
||||||
/// </summary>
|
|
||||||
public void MuteToggle()
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "DM Endpoint {0} does not have a mute function", Key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void VolumeDown(bool pressRelease)
|
|
||||||
{
|
|
||||||
if (pressRelease)
|
|
||||||
SigHelper.RampTimeScaled(_rmc.AudioOutput.Volume, 0, 4000);
|
|
||||||
else
|
|
||||||
_rmc.AudioOutput.Volume.StopRamp();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void VolumeUp(bool pressRelease)
|
|
||||||
{
|
|
||||||
if (pressRelease)
|
|
||||||
SigHelper.RampTimeScaled(_rmc.AudioOutput.Volume, 65535, 4000);
|
|
||||||
else
|
|
||||||
_rmc.AudioOutput.Volume.StopRamp();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
|
|
||||||
[Description("Wrapper Class for DM-RMC-4K-100-C-1G")]
|
|
||||||
public class DmRmc4k100C1GController : DmHdBaseTControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmc4K100C1G _rmc;
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
public DmRmc4k100C1GController(string key, string name, DmRmc4K100C1G rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this) {Port = _rmc};
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
}
|
|
||||||
|
|
||||||
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 IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
public Cec StreamCec { get { return _rmc.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-4K-SCALER-C-DSP")]
|
|
||||||
public class DmRmc4kScalerCDspController : DmRmcControllerBase, IRoutingInputsOutputs, IBasicVolumeWithFeedback,
|
|
||||||
IIROutputPorts, IComPorts, ICec, IRelayPorts
|
|
||||||
{
|
|
||||||
private readonly DmRmc4kScalerCDsp _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
public RoutingOutputPort BalancedAudioOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmc4kScalerCDspController(string key, string name, DmRmc4kScalerCDsp rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
BalancedAudioOut = new RoutingOutputPort(DmPortName.BalancedAudioOut, eRoutingSignalType.Audio,
|
|
||||||
eRoutingPortConnectionType.LineAudio, null, this);
|
|
||||||
|
|
||||||
MuteFeedback = new BoolFeedback(() => false);
|
|
||||||
VolumeLevelFeedback = new IntFeedback("MainVolumeLevelFeedback", () =>
|
|
||||||
rmc.AudioOutput.VolumeFeedback.UShortValue);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString());
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut, BalancedAudioOut};
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId || args.EventId == EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId ||
|
|
||||||
args.EventId == EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the CEC stream directly from the HDMI port.
|
|
||||||
/// </summary>
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IRelayPorts Members
|
|
||||||
|
|
||||||
public int NumberOfRelayPorts
|
|
||||||
{
|
|
||||||
get { return _rmc.NumberOfRelayPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public CrestronCollection<Relay> RelayPorts
|
|
||||||
{
|
|
||||||
get { return _rmc.RelayPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IBasicVolumeWithFeedback Members
|
|
||||||
|
|
||||||
public BoolFeedback MuteFeedback
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Not implemented
|
|
||||||
/// </summary>
|
|
||||||
public void MuteOff()
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "DM Endpoint {0} does not have a mute function", Key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Not implemented
|
|
||||||
/// </summary>
|
|
||||||
public void MuteOn()
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "DM Endpoint {0} does not have a mute function", Key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetVolume(ushort level)
|
|
||||||
{
|
|
||||||
_rmc.AudioOutput.Volume.UShortValue = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntFeedback VolumeLevelFeedback
|
|
||||||
{
|
|
||||||
get;
|
|
||||||
private set;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IBasicVolumeControls Members
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Not implemented
|
|
||||||
/// </summary>
|
|
||||||
public void MuteToggle()
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "DM Endpoint {0} does not have a mute function", Key);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void VolumeDown(bool pressRelease)
|
|
||||||
{
|
|
||||||
if (pressRelease)
|
|
||||||
SigHelper.RampTimeScaled(_rmc.AudioOutput.Volume, 0, 4000);
|
|
||||||
else
|
|
||||||
_rmc.AudioOutput.Volume.StopRamp();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void VolumeUp(bool pressRelease)
|
|
||||||
{
|
|
||||||
if (pressRelease)
|
|
||||||
SigHelper.RampTimeScaled(_rmc.AudioOutput.Volume, 65535, 4000);
|
|
||||||
else
|
|
||||||
_rmc.AudioOutput.Volume.StopRamp();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
[Description("Wrapper Class for DM-RMC-4K-Z-100-C")]
|
|
||||||
public class DmRmc4kZ100CController : DmRmcX100CController
|
|
||||||
{
|
|
||||||
private readonly DmRmc4kz100C _rmc;
|
|
||||||
|
|
||||||
public DmRmc4kZ100CController(string key, string name, DmRmc4kz100C rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
|
|
||||||
//removed to prevent NullReferenceException
|
|
||||||
//_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId:
|
|
||||||
case EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId:
|
|
||||||
case EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId:
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case EndpointOutputStreamEventIds.HotplugDetectedEventId:
|
|
||||||
if (_rmc.HdmiOutput.ConnectedDevice == null) return;
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Core;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
[Description("Wrapper Class for DM-RMC-4K-Z-SCALER-C")]
|
|
||||||
public class DmRmc4kZScalerCController : DmRmcControllerBase, IRmcRoutingWithFeedback,
|
|
||||||
IIROutputPorts, IComPorts, ICec, IRelayPorts
|
|
||||||
{
|
|
||||||
private readonly DmRmc4kzScalerC _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingInputPort HdmiIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The value of the current video source for the HDMI output on the receiver
|
|
||||||
/// </summary>
|
|
||||||
public IntFeedback AudioVideoSourceNumericFeedback { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
//IroutingNumericEvent
|
|
||||||
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
|
||||||
|
|
||||||
/// <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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public DmRmc4kZScalerCController(string key, string name, DmRmc4kzScalerC rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = 1
|
|
||||||
};
|
|
||||||
HdmiIn = new RoutingInputPort(DmPortName.HdmiIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, 0, this)
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = 2
|
|
||||||
};
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString());
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn, HdmiIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
_rmc.OnlineStatusChange += _rmc_OnlineStatusChange;
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
|
|
||||||
AudioVideoSourceNumericFeedback = new IntFeedback(() => (ushort)(_rmc.SelectedSourceFeedback));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void _rmc_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args)
|
|
||||||
{
|
|
||||||
AudioVideoSourceNumericFeedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioVideoSourceNumericFeedback.UShortValue, eRoutingSignalType.AudioVideo));
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId || args.EventId == EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId ||
|
|
||||||
args.EventId == EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.SelectedSourceFeedbackEventId)
|
|
||||||
{
|
|
||||||
var localInputPort =
|
|
||||||
InputPorts.FirstOrDefault(p => (int)p.FeedbackMatchObject == AudioVideoSourceNumericFeedback.UShortValue);
|
|
||||||
|
|
||||||
|
|
||||||
AudioVideoSourceNumericFeedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioVideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localInputPort, eRoutingSignalType.AudioVideo));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the CEC stream directly from the HDMI port.
|
|
||||||
/// </summary>
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
#region IRmcRouting Members
|
|
||||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Attempting a route from input {0} to HDMI Output", inputSelector);
|
|
||||||
|
|
||||||
var number = Convert.ToUInt16(inputSelector);
|
|
||||||
|
|
||||||
_rmc.AudioVideoSource = (DmRmc4kzScalerC.eAudioVideoSource)number;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Attempting a route from input {0} to HDMI Output", inputSelector);
|
|
||||||
|
|
||||||
_rmc.AudioVideoSource = (DmRmc4kzScalerC.eAudioVideoSource)inputSelector;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Implementation of IRelayPorts
|
|
||||||
|
|
||||||
public CrestronCollection<Relay> RelayPorts
|
|
||||||
{
|
|
||||||
get { return _rmc.RelayPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public int NumberOfRelayPorts
|
|
||||||
{
|
|
||||||
get { return _rmc.NumberOfRelayPorts; }
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,531 +0,0 @@
|
|||||||
extern alias Full;
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Cards;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
using Full.Newtonsoft.Json;
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
using PepperDash.Essentials.Core.DeviceInfo;
|
|
||||||
using PepperDash.Essentials.DM.Config;
|
|
||||||
using PepperDash.Essentials.Core.Config;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
[Description("Wrapper class for all DM-RMC variants")]
|
|
||||||
public abstract class DmRmcControllerBase : CrestronGenericBridgeableBaseDevice, IDeviceInfoProvider
|
|
||||||
{
|
|
||||||
private const int CtpPort = 41795;
|
|
||||||
private readonly EndpointReceiverBase _rmc; //kept here just in case. Only property or method on this class that's not device-specific is the DMOutput that it's attached to.
|
|
||||||
|
|
||||||
public StringFeedback VideoOutputResolutionFeedback { get; protected set; }
|
|
||||||
public StringFeedback EdidManufacturerFeedback { get; protected set; }
|
|
||||||
public StringFeedback EdidNameFeedback { get; protected set; }
|
|
||||||
public StringFeedback EdidPreferredTimingFeedback { get; protected set; }
|
|
||||||
public StringFeedback EdidSerialNumberFeedback { get; protected set; }
|
|
||||||
|
|
||||||
protected DmRmcControllerBase(string key, string name, EndpointReceiverBase device)
|
|
||||||
: base(key, name, device)
|
|
||||||
{
|
|
||||||
_rmc = device;
|
|
||||||
|
|
||||||
// if wired to a chassis, skip registration step in base class
|
|
||||||
PreventRegistration = _rmc.DMOutput != null;
|
|
||||||
|
|
||||||
AddToFeedbackList(VideoOutputResolutionFeedback, EdidManufacturerFeedback, EdidSerialNumberFeedback, EdidNameFeedback, EdidPreferredTimingFeedback);
|
|
||||||
|
|
||||||
DeviceInfo = new DeviceInfo();
|
|
||||||
|
|
||||||
IsOnline.OutputChange += (currentDevice, args) => { if (args.BoolValue) UpdateDeviceInfo(); };
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void LinkDmRmcToApi(DmRmcControllerBase rmc, 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, rmc, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
|
|
||||||
|
|
||||||
IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
|
|
||||||
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = rmc.Name;
|
|
||||||
if (rmc.VideoOutputResolutionFeedback != null)
|
|
||||||
rmc.VideoOutputResolutionFeedback.LinkInputSig(trilist.StringInput[joinMap.CurrentOutputResolution.JoinNumber]);
|
|
||||||
if (rmc.EdidManufacturerFeedback != null)
|
|
||||||
rmc.EdidManufacturerFeedback.LinkInputSig(trilist.StringInput[joinMap.EdidManufacturer.JoinNumber]);
|
|
||||||
if (rmc.EdidNameFeedback != null)
|
|
||||||
rmc.EdidNameFeedback.LinkInputSig(trilist.StringInput[joinMap.EdidName.JoinNumber]);
|
|
||||||
if (rmc.EdidPreferredTimingFeedback != null)
|
|
||||||
rmc.EdidPreferredTimingFeedback.LinkInputSig(trilist.StringInput[joinMap.EdidPrefferedTiming.JoinNumber]);
|
|
||||||
if (rmc.EdidSerialNumberFeedback != null)
|
|
||||||
rmc.EdidSerialNumberFeedback.LinkInputSig(trilist.StringInput[joinMap.EdidSerialNumber.JoinNumber]);
|
|
||||||
|
|
||||||
//If the device is an DM-RMC-4K-Z-SCALER-C
|
|
||||||
var routing = rmc as IRmcRouting;
|
|
||||||
|
|
||||||
if (routing == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (routing.AudioVideoSourceNumericFeedback != null)
|
|
||||||
routing.AudioVideoSourceNumericFeedback.LinkInputSig(trilist.UShortInput[joinMap.AudioVideoSource.JoinNumber]);
|
|
||||||
|
|
||||||
trilist.SetUShortSigAction(joinMap.AudioVideoSource.JoinNumber, a => routing.ExecuteNumericSwitch(a, 1, eRoutingSignalType.AudioVideo));
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Implementation of IDeviceInfoProvider
|
|
||||||
|
|
||||||
public DeviceInfo DeviceInfo { get; private set; }
|
|
||||||
public event DeviceInfoChangeHandler DeviceInfoChanged;
|
|
||||||
|
|
||||||
public void UpdateDeviceInfo()
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "Updating Device Info");
|
|
||||||
|
|
||||||
if (_rmc.ConnectedIpList.Count == 0)
|
|
||||||
{
|
|
||||||
Debug.Console(1, this, "IP Address information not yet received. No device is online");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceInfo.IpAddress = _rmc.ConnectedIpList[0].DeviceIpAddress;
|
|
||||||
|
|
||||||
foreach (var ip in _rmc.ConnectedIpList)
|
|
||||||
{
|
|
||||||
Debug.Console(0, this, "Connected IP Address: {0}", ip.DeviceIpAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
GetFirmwareAndSerialInfo();
|
|
||||||
|
|
||||||
OnDeviceInfoChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void GetFirmwareAndSerialInfo()
|
|
||||||
{
|
|
||||||
var tcpClient = new GenericTcpIpClient(String.Format("{0}-devInfoSocket", Key), _rmc.ConnectedIpList[0].DeviceIpAddress, CtpPort, 1024)
|
|
||||||
{
|
|
||||||
AutoReconnect = false,
|
|
||||||
};
|
|
||||||
|
|
||||||
var gather = new CommunicationGather(tcpClient, "\r\n\r\n");
|
|
||||||
|
|
||||||
tcpClient.ConnectionChange += (sender, args) =>
|
|
||||||
{
|
|
||||||
if (!args.Client.IsConnected)
|
|
||||||
{
|
|
||||||
OnDeviceInfoChange();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
args.Client.SendText("ver\r\n");
|
|
||||||
};
|
|
||||||
|
|
||||||
gather.LineReceived += (sender, args) =>
|
|
||||||
{
|
|
||||||
//ignore console prompt
|
|
||||||
if (args.Text.ToLower().Contains(">"))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (args.Text.ToLower().Contains("host"))
|
|
||||||
{
|
|
||||||
DeviceInfo.HostName = args.Text.Split(':')[1].Trim();
|
|
||||||
|
|
||||||
tcpClient.SendText("maca\r\n");
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.Text.ToLower().Contains("mac"))
|
|
||||||
{
|
|
||||||
DeviceInfo.MacAddress = args.Text.Split(':')[1].Trim().Replace(" ", ":");
|
|
||||||
|
|
||||||
tcpClient.Disconnect();
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!args.Text.ToLower().Contains("rmc"))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
DeviceInfo.SerialNumber = args.Text.Split('[')[1].Split(' ')[4].Replace("#", "");
|
|
||||||
DeviceInfo.FirmwareVersion = args.Text.Split('[')[1].Split(' ')[1];
|
|
||||||
|
|
||||||
tcpClient.SendText("host\r\n");
|
|
||||||
};
|
|
||||||
|
|
||||||
tcpClient.Connect();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OnDeviceInfoChange()
|
|
||||||
{
|
|
||||||
var handler = DeviceInfoChanged;
|
|
||||||
|
|
||||||
if (handler == null) return;
|
|
||||||
|
|
||||||
handler(this, new DeviceInfoEventArgs(DeviceInfo));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class DmHdBaseTControllerBase : CrestronGenericBridgeableBaseDevice
|
|
||||||
{
|
|
||||||
protected HDBaseTBase Rmc;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
protected DmHdBaseTControllerBase(string key, string name, HDBaseTBase rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
Rmc = rmc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DmRmcHelper
|
|
||||||
{
|
|
||||||
private static readonly Dictionary<string, Func<string, string, uint, CrestronGenericBaseDevice>> ProcessorFactoryDict;
|
|
||||||
private static readonly Dictionary<string, Func<string, string, DMOutput, CrestronGenericBaseDevice>> ChassisCpu3Dict;
|
|
||||||
|
|
||||||
private static readonly Dictionary<string, Func<string, string, uint, DMOutput, CrestronGenericBaseDevice>>
|
|
||||||
ChassisDict;
|
|
||||||
|
|
||||||
static DmRmcHelper()
|
|
||||||
{
|
|
||||||
ProcessorFactoryDict = new Dictionary<string, Func<string, string, uint, CrestronGenericBaseDevice>>
|
|
||||||
{
|
|
||||||
{"dmrmc100c", (k, n, i) => new DmRmcX100CController(k, n, new DmRmc100C(i, Global.ControlSystem))},
|
|
||||||
{"dmrmc100s", (k, n, i) => new DmRmc100SController(k, n, new DmRmc100S(i, Global.ControlSystem))},
|
|
||||||
{"dmrmc4k100c", (k, n, i) => new DmRmcX100CController(k, n, new DmRmc4k100C(i, Global.ControlSystem))},
|
|
||||||
{"dmrmc4kz100c", (k, n, i) => new DmRmc4kZ100CController(k, n, new DmRmc4kz100C(i, Global.ControlSystem))},
|
|
||||||
{"dmrmc150s", (k, n, i) => new DmRmc150SController(k, n, new DmRmc150S(i, Global.ControlSystem))},
|
|
||||||
{"dmrmc200c", (k, n, i) => new DmRmc200CController(k, n, new DmRmc200C(i, Global.ControlSystem))},
|
|
||||||
{"dmrmc200s", (k, n, i) => new DmRmc200SController(k, n, new DmRmc200S(i, Global.ControlSystem))},
|
|
||||||
{"dmrmc200s2", (k, n, i) => new DmRmc200S2Controller(k, n, new DmRmc200S2(i, Global.ControlSystem))},
|
|
||||||
{"dmrmcscalerc", (k, n, i) => new DmRmcScalerCController(k, n, new DmRmcScalerC(i, Global.ControlSystem))},
|
|
||||||
{"dmrmcscalers", (k, n, i) => new DmRmcScalerSController(k, n, new DmRmcScalerS(i, Global.ControlSystem))},
|
|
||||||
{
|
|
||||||
"dmrmcscalers2",
|
|
||||||
(k, n, i) => new DmRmcScalerS2Controller(k, n, new DmRmcScalerS2(i, Global.ControlSystem))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dmrmc4kscalerc",
|
|
||||||
(k, n, i) => new DmRmc4kScalerCController(k, n, new DmRmc4kScalerC(i, Global.ControlSystem))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dmrmc4kscalercdsp",
|
|
||||||
(k, n, i) => new DmRmc4kScalerCDspController(k, n, new DmRmc4kScalerCDsp(i, Global.ControlSystem))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dmrmc4kzscalerc",
|
|
||||||
(k, n, i) => new DmRmc4kZScalerCController(k, n, new DmRmc4kzScalerC(i, Global.ControlSystem))
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
ChassisCpu3Dict = new Dictionary<string, Func<string, string, DMOutput, CrestronGenericBaseDevice>>
|
|
||||||
{
|
|
||||||
{"dmrmc100c", (k, n, d) => new DmRmcX100CController(k, n, new DmRmc100C(d))},
|
|
||||||
{"dmrmc100s", (k, n, d) => new DmRmc100SController(k, n, new DmRmc100S(d))},
|
|
||||||
{"dmrmc4k100c", (k, n, d) => new DmRmcX100CController(k, n, new DmRmc4k100C(d))},
|
|
||||||
{"dmrmc4kz100c", (k, n, d) => new DmRmc4kZ100CController(k, n, new DmRmc4kz100C(d))},
|
|
||||||
{"dmrmc150s", (k, n, d) => new DmRmc150SController(k, n, new DmRmc150S(d))},
|
|
||||||
{"dmrmc200c", (k, n, d) => new DmRmc200CController(k, n, new DmRmc200C(d))},
|
|
||||||
{"dmrmc200s", (k, n, d) => new DmRmc200SController(k, n, new DmRmc200S(d))},
|
|
||||||
{"dmrmc200s2", (k, n, d) => new DmRmc200S2Controller(k, n, new DmRmc200S2(d))},
|
|
||||||
{"dmrmcscalerc", (k, n, d) => new DmRmcScalerCController(k, n, new DmRmcScalerC(d))},
|
|
||||||
{"dmrmcscalers", (k, n, d) => new DmRmcScalerSController(k, n, new DmRmcScalerS(d))},
|
|
||||||
{
|
|
||||||
"dmrmcscalers2",
|
|
||||||
(k, n, d) => new DmRmcScalerS2Controller(k, n, new DmRmcScalerS2(d))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dmrmc4kscalerc",
|
|
||||||
(k, n, d) => new DmRmc4kScalerCController(k, n, new DmRmc4kScalerC(d))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dmrmc4kscalercdsp",
|
|
||||||
(k, n, d) => new DmRmc4kScalerCDspController(k, n, new DmRmc4kScalerCDsp(d))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dmrmc4kzscalerc",
|
|
||||||
(k, n, d) => new DmRmc4kZScalerCController(k, n, new DmRmc4kzScalerC(d))
|
|
||||||
},
|
|
||||||
{"hdbasetrx", (k,n,d) => new HDBaseTRxController(k,n, new HDRx3CB(d))},
|
|
||||||
{"dmrmc4k100c1g", (k,n,d) => new DmRmc4k100C1GController(k,n, new DmRmc4K100C1G(d))}
|
|
||||||
};
|
|
||||||
|
|
||||||
ChassisDict = new Dictionary<string, Func<string, string, uint, DMOutput, CrestronGenericBaseDevice>>
|
|
||||||
{
|
|
||||||
{"dmrmc100c", (k, n, i, d) => new DmRmcX100CController(k, n, new DmRmc100C(i,d))},
|
|
||||||
{"dmrmc100s", (k, n,i, d) => new DmRmc100SController(k, n, new DmRmc100S(i,d))},
|
|
||||||
{"dmrmc4k100c", (k, n,i, d) => new DmRmcX100CController(k, n, new DmRmc4k100C(i,d))},
|
|
||||||
{"dmrmc4kz100c", (k, n,i, d) => new DmRmc4kZ100CController(k, n, new DmRmc4kz100C(i,d))},
|
|
||||||
{"dmrmc150s", (k, n,i, d) => new DmRmc150SController(k, n, new DmRmc150S(i,d))},
|
|
||||||
{"dmrmc200c", (k, n,i, d) => new DmRmc200CController(k, n, new DmRmc200C(i,d))},
|
|
||||||
{"dmrmc200s", (k, n,i, d) => new DmRmc200SController(k, n, new DmRmc200S(i,d))},
|
|
||||||
{"dmrmc200s2", (k, n,i, d) => new DmRmc200S2Controller(k, n, new DmRmc200S2(i,d))},
|
|
||||||
{"dmrmcscalerc", (k, n,i, d) => new DmRmcScalerCController(k, n, new DmRmcScalerC(i,d))},
|
|
||||||
{"dmrmcscalers", (k, n,i, d) => new DmRmcScalerSController(k, n, new DmRmcScalerS(i,d))},
|
|
||||||
{
|
|
||||||
"dmrmcscalers2",
|
|
||||||
(k, n,i, d) => new DmRmcScalerS2Controller(k, n, new DmRmcScalerS2(i, d))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dmrmc4kscalerc",
|
|
||||||
(k, n,i, d) => new DmRmc4kScalerCController(k, n, new DmRmc4kScalerC(i, d))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dmrmc4kscalercdsp",
|
|
||||||
(k, n,i, d) => new DmRmc4kScalerCDspController(k, n, new DmRmc4kScalerCDsp(i, d))
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"dmrmc4kzscalerc",
|
|
||||||
(k, n,i, d) => new DmRmc4kZScalerCController(k, n, new DmRmc4kzScalerC(i, d))
|
|
||||||
},
|
|
||||||
{"hdbasetrx", (k,n,i,d) => new HDBaseTRxController(k,n, new HDRx3CB(i, d))},
|
|
||||||
{"dmrmc4k100c1g", (k,n,i,d) => new DmRmc4k100C1GController(k,n, new DmRmc4K100C1G(i, d))}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// A factory method for various DmRmcControllers
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">device key. Used to uniquely identify device</param>
|
|
||||||
/// <param name="name">device name</param>
|
|
||||||
/// <param name="typeName">device type name. Used to retrived the correct device</param>
|
|
||||||
/// <param name="props">Config from config file</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static CrestronGenericBaseDevice GetDmRmcController(string key, string name, string typeName, DmRmcPropertiesConfig props)
|
|
||||||
{
|
|
||||||
typeName = typeName.ToLower();
|
|
||||||
var ipid = props.Control.IpIdInt;
|
|
||||||
|
|
||||||
var pKey = props.ParentDeviceKey.ToLower();
|
|
||||||
|
|
||||||
// Non-DM-chassis endpoints
|
|
||||||
return pKey == "processor" ? GetDmRmcControllerForProcessor(key, name, typeName, ipid) : GetDmRmcControllerForChassis(key, name, typeName, props, pKey, ipid);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static CrestronGenericBaseDevice GetDmRmcControllerForChassis(string key, string name, string typeName,
|
|
||||||
DmRmcPropertiesConfig props, string pKey, uint ipid)
|
|
||||||
{
|
|
||||||
var parentDev = DeviceManager.GetDeviceForKey(pKey);
|
|
||||||
if (parentDev is DmpsRoutingController)
|
|
||||||
{
|
|
||||||
var dmps = parentDev as DmpsRoutingController;
|
|
||||||
//Check that the input is within range of this chassis' possible inputs
|
|
||||||
var num = props.ParentOutputNumber;
|
|
||||||
Debug.Console(1, "Creating DMPS device '{0}'. Output number '{1}'.", key, num);
|
|
||||||
if (num <= 0 || num > dmps.Dmps.SwitcherOutputs.Count)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Cannot create DMPS device '{0}'. Output number '{1}' is out of range",
|
|
||||||
key, num);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
// Must use different constructor for DMPS4K types. No IPID
|
|
||||||
if (Global.ControlSystemIsDmps4kType || typeName == "hdbasetrx" || typeName == "dmrmc4k100c1g")
|
|
||||||
{
|
|
||||||
var rmc = GetDmRmcControllerForDmps4k(key, name, typeName, dmps, props.ParentOutputNumber);
|
|
||||||
Debug.Console(0, "DM endpoint output {0} is for Dmps4k, changing online feedback to chassis", num);
|
|
||||||
rmc.IsOnline.SetValueFunc(() => dmps.OutputEndpointOnlineFeedbacks[num].BoolValue);
|
|
||||||
dmps.OutputEndpointOnlineFeedbacks[num].OutputChange += (o, a) =>
|
|
||||||
{
|
|
||||||
foreach (var feedback in rmc.Feedbacks)
|
|
||||||
{
|
|
||||||
if (feedback != null)
|
|
||||||
feedback.FireUpdate();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return rmc;
|
|
||||||
}
|
|
||||||
return GetDmRmcControllerForDmps(key, name, typeName, ipid, dmps, props.ParentOutputNumber);
|
|
||||||
}
|
|
||||||
else if (parentDev is DmChassisController)
|
|
||||||
{
|
|
||||||
var controller = parentDev as DmChassisController;
|
|
||||||
var chassis = controller.Chassis;
|
|
||||||
var num = props.ParentOutputNumber;
|
|
||||||
Debug.Console(1, "Creating DM Chassis device '{0}'. Output number '{1}'.", key, num);
|
|
||||||
|
|
||||||
if (num <= 0 || num > chassis.NumberOfOutputs)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Cannot create DM device '{0}'. Output number '{1}' is out of range",
|
|
||||||
key, num);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
controller.RxDictionary.Add(num, key);
|
|
||||||
// Catch constructor failures, mainly dues to IPID
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// Must use different constructor for CPU3 chassis types. No IPID
|
|
||||||
if (chassis is DmMd8x8Cpu3 || chassis is DmMd16x16Cpu3 ||
|
|
||||||
chassis is DmMd32x32Cpu3 || chassis is DmMd8x8Cpu3rps ||
|
|
||||||
chassis is DmMd16x16Cpu3rps || chassis is DmMd32x32Cpu3rps ||
|
|
||||||
chassis is DmMd128x128 || chassis is DmMd64x64
|
|
||||||
|| typeName == "hdbasetrx" || typeName == "dmrmc4k100c1g")
|
|
||||||
{
|
|
||||||
var rmc = GetDmRmcControllerForCpu3Chassis(key, name, typeName, chassis, num, parentDev);
|
|
||||||
Debug.Console(0, "DM endpoint output {0} is for Cpu3, changing online feedback to chassis", num);
|
|
||||||
rmc.IsOnline.SetValueFunc(() => controller.OutputEndpointOnlineFeedbacks[num].BoolValue);
|
|
||||||
controller.OutputEndpointOnlineFeedbacks[num].OutputChange += (o, a) =>
|
|
||||||
{
|
|
||||||
foreach (var feedback in rmc.Feedbacks)
|
|
||||||
{
|
|
||||||
if (feedback != null)
|
|
||||||
feedback.FireUpdate();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return rmc;
|
|
||||||
}
|
|
||||||
return GetDmRmcControllerForCpu2Chassis(key, name, typeName, ipid, chassis, num, parentDev);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "[{0}] WARNING: Cannot create DM-RMC device: {1}", key, e.Message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a DM Chassis or DMPS.",
|
|
||||||
key, pKey);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static CrestronGenericBaseDevice GetDmRmcControllerForCpu2Chassis(string key, string name, string typeName,
|
|
||||||
uint ipid, Switch chassis, uint num, IKeyed parentDev)
|
|
||||||
{
|
|
||||||
Func<string, string, uint, DMOutput, CrestronGenericBaseDevice> handler;
|
|
||||||
if (ChassisDict.TryGetValue(typeName.ToLower(), out handler))
|
|
||||||
{
|
|
||||||
return handler(key, name, ipid, chassis.Outputs[num]);
|
|
||||||
}
|
|
||||||
Debug.Console(0, "Cannot create DM-RMC of type '{0}' with parent device {1}", typeName, parentDev.Key);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static CrestronGenericBaseDevice GetDmRmcControllerForCpu3Chassis(string key, string name, string typeName,
|
|
||||||
Switch chassis, uint num, IKeyed parentDev)
|
|
||||||
{
|
|
||||||
Func<string, string, DMOutput, CrestronGenericBaseDevice> cpu3Handler;
|
|
||||||
if (ChassisCpu3Dict.TryGetValue(typeName.ToLower(), out cpu3Handler))
|
|
||||||
{
|
|
||||||
return cpu3Handler(key, name, chassis.Outputs[num]);
|
|
||||||
}
|
|
||||||
Debug.Console(0, "Cannot create DM-RMC of type '{0}' with parent device {1}", typeName, parentDev.Key);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static CrestronGenericBaseDevice GetDmRmcControllerForDmps(string key, string name, string typeName,
|
|
||||||
uint ipid, DmpsRoutingController controller, uint num)
|
|
||||||
{
|
|
||||||
Func<string, string, uint, DMOutput, CrestronGenericBaseDevice> dmpsHandler;
|
|
||||||
if (ChassisDict.TryGetValue(typeName.ToLower(), out dmpsHandler))
|
|
||||||
{
|
|
||||||
var output = controller.Dmps.SwitcherOutputs[num] as DMOutput;
|
|
||||||
|
|
||||||
if (output != null)
|
|
||||||
{
|
|
||||||
return dmpsHandler(key, name, ipid, output);
|
|
||||||
}
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
|
||||||
"Cannot attach DM-RMC of type '{0}' to output {1} on DMPS chassis. Output is not a DM Output.",
|
|
||||||
typeName, num);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Cannot create DM-RMC of type '{0}' to output {1} on DMPS chassis", typeName, num);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static CrestronGenericBaseDevice GetDmRmcControllerForDmps4k(string key, string name, string typeName,
|
|
||||||
DmpsRoutingController controller, uint num)
|
|
||||||
{
|
|
||||||
Func<string, string, DMOutput, CrestronGenericBaseDevice> dmps4kHandler;
|
|
||||||
if (ChassisCpu3Dict.TryGetValue(typeName.ToLower(), out dmps4kHandler))
|
|
||||||
{
|
|
||||||
var output = controller.Dmps.SwitcherOutputs[num] as DMOutput;
|
|
||||||
|
|
||||||
if (output != null)
|
|
||||||
{
|
|
||||||
return dmps4kHandler(key, name, output);
|
|
||||||
}
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
|
||||||
"Cannot attach DM-RMC of type '{0}' to output {1} on DMPS-4K chassis. Output is not a DM Output.",
|
|
||||||
typeName, num);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Cannot create DM-RMC of type '{0}' to output {1} on DMPS-4K chassis", typeName, num);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static CrestronGenericBaseDevice GetDmRmcControllerForProcessor(string key, string name, string typeName, uint ipid)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Func<string, string, uint, CrestronGenericBaseDevice> handler;
|
|
||||||
|
|
||||||
if (ProcessorFactoryDict.TryGetValue(typeName.ToLower(), out handler))
|
|
||||||
{
|
|
||||||
return handler(key, name, ipid);
|
|
||||||
}
|
|
||||||
Debug.Console(0, "Cannot create DM-RMC of type: '{0}'", typeName);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Debug.Console(0, "[{0}] WARNING: Cannot create DM-RMC device: {1}", key, e.Message);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DmRmcControllerFactory : EssentialsDeviceFactory<DmRmcControllerBase>
|
|
||||||
{
|
|
||||||
public DmRmcControllerFactory()
|
|
||||||
{
|
|
||||||
TypeNames = new List<string>
|
|
||||||
{ "hdbasetrx", "dmrmc4k100c1g", "dmrmc100c", "dmrmc100s", "dmrmc4k100c", "dmrmc150s",
|
|
||||||
"dmrmc200c", "dmrmc200s", "dmrmc200s2", "dmrmcscalerc", "dmrmcscalers", "dmrmcscalers2", "dmrmc4kscalerc", "dmrmc4kscalercdsp",
|
|
||||||
"dmrmc4kz100c", "dmrmc4kzscalerc" };
|
|
||||||
}
|
|
||||||
|
|
||||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
|
||||||
{
|
|
||||||
var type = dc.Type.ToLower();
|
|
||||||
|
|
||||||
Debug.Console(1, "Factory Attempting to create new DM-RMC Device");
|
|
||||||
|
|
||||||
var props = JsonConvert.DeserializeObject
|
|
||||||
<DmRmcPropertiesConfig>(dc.Properties.ToString());
|
|
||||||
return DmRmcHelper.GetDmRmcController(dc.Key, dc.Name, type, props);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-SCALER-C")]
|
|
||||||
public class DmRmcScalerCController : DmRmcControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmcScalerC _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmcScalerCController(string key, string name, DmRmcScalerC rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString());
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId || args.EventId == EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId ||
|
|
||||||
args.EventId == EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the CEC stream directly from the HDMI port.
|
|
||||||
/// </summary>
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,109 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-SCALER-S2")]
|
|
||||||
public class DmRmcScalerS2Controller : DmRmcControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmcScalerS2 _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmcScalerS2Controller(string key, string name, DmRmcScalerS2 rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString());
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId || args.EventId == EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId ||
|
|
||||||
args.EventId == EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the CEC stream directly from the HDMI port.
|
|
||||||
/// </summary>
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-SCALER-S")]
|
|
||||||
public class DmRmcScalerSController : DmRmcControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmcScalerS _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmcScalerSController(string key, string name, DmRmcScalerS rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
EdidManufacturerFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Manufacturer.StringValue);
|
|
||||||
EdidNameFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.Name.StringValue);
|
|
||||||
EdidPreferredTimingFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.PreferredTiming.StringValue);
|
|
||||||
EdidSerialNumberFeedback = new StringFeedback(() => _rmc.HdmiOutput.ConnectedDevice.SerialNumber.StringValue);
|
|
||||||
|
|
||||||
VideoOutputResolutionFeedback = new StringFeedback(() => _rmc.HdmiOutput.GetVideoResolutionString());
|
|
||||||
|
|
||||||
_rmc.HdmiOutput.OutputStreamChange += HdmiOutput_OutputStreamChange;
|
|
||||||
_rmc.HdmiOutput.ConnectedDevice.DeviceInformationChange += ConnectedDevice_DeviceInformationChange;
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiOut.Port = _rmc.HdmiOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HdmiOutput_OutputStreamChange(EndpointOutputStream outputStream, EndpointOutputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
if (args.EventId == EndpointOutputStreamEventIds.HorizontalResolutionFeedbackEventId || args.EventId == EndpointOutputStreamEventIds.VerticalResolutionFeedbackEventId ||
|
|
||||||
args.EventId == EndpointOutputStreamEventIds.FramesPerSecondFeedbackEventId)
|
|
||||||
{
|
|
||||||
VideoOutputResolutionFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConnectedDevice_DeviceInformationChange(ConnectedDeviceInformation connectedDevice, ConnectedDeviceEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case ConnectedDeviceEventIds.ManufacturerEventId:
|
|
||||||
EdidManufacturerFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.NameEventId:
|
|
||||||
EdidNameFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.PreferredTimingEventId:
|
|
||||||
EdidPreferredTimingFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case ConnectedDeviceEventIds.SerialNumberEventId:
|
|
||||||
EdidSerialNumberFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the CEC stream directly from the HDMI port.
|
|
||||||
/// </summary>
|
|
||||||
public Cec StreamCec { get { return _rmc.HdmiOutput.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
|
|
||||||
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Builds a controller for basic DM-RMCs (both 4K and non-4K) with Com and IR ports and no control functions
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper Class for DM-RMC-4K-100-C & DM-RMC-100-C")]
|
|
||||||
public class DmRmcX100CController : DmRmcControllerBase, IRoutingInputsOutputs,
|
|
||||||
IIROutputPorts, IComPorts, ICec
|
|
||||||
{
|
|
||||||
private readonly DmRmc100C _rmc;
|
|
||||||
|
|
||||||
public RoutingInputPort DmIn { get; protected set; }
|
|
||||||
public RoutingOutputPort HdmiOut { get; protected set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts { get; protected set; }
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; protected set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Make a Crestron RMC and put it in here
|
|
||||||
/// </summary>
|
|
||||||
public DmRmcX100CController(string key, string name, DmRmc100C rmc)
|
|
||||||
: base(key, name, rmc)
|
|
||||||
{
|
|
||||||
_rmc = rmc;
|
|
||||||
DmIn = new RoutingInputPort(DmPortName.DmIn, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.DmCat, 0, this);
|
|
||||||
HdmiOut = new RoutingOutputPort(DmPortName.HdmiOut, eRoutingSignalType.AudioVideo,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this) {Port = _rmc};
|
|
||||||
|
|
||||||
InputPorts = new RoutingPortCollection<RoutingInputPort> {DmIn};
|
|
||||||
OutputPorts = new RoutingPortCollection<RoutingOutputPort> {HdmiOut};
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
LinkDmRmcToApi(this, trilist, joinStart, joinMapKey, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region IIROutputPorts Members
|
|
||||||
public CrestronCollection<IROutputPort> IROutputPorts { get { return _rmc.IROutputPorts; } }
|
|
||||||
public int NumberOfIROutputPorts { get { return _rmc.NumberOfIROutputPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region IComPorts Members
|
|
||||||
public CrestronCollection<ComPort> ComPorts { get { return _rmc.ComPorts; } }
|
|
||||||
public int NumberOfComPorts { get { return _rmc.NumberOfComPorts; } }
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region ICec Members
|
|
||||||
public Cec StreamCec { get { return _rmc.StreamCec; } }
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,415 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
// using eVst = Crestron.SimplSharpPro.DeviceSupport.eX02VideoSourceType;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Controller class for all DM-TX-201C/S/F transmitters
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper class for DM-TX-200-C")]
|
|
||||||
public class DmTx200Controller : DmTxControllerBase, ITxRoutingWithFeedback, IHasFreeRun, IVgaBrightnessContrastControls
|
|
||||||
{
|
|
||||||
public DmTx200C2G Tx { get; private set; }
|
|
||||||
|
|
||||||
public RoutingInputPortWithVideoStatuses HdmiInput { get; private set; }
|
|
||||||
public RoutingInputPortWithVideoStatuses VgaInput { get; private set; }
|
|
||||||
public RoutingOutputPort DmOutput { get; private set; }
|
|
||||||
|
|
||||||
public override StringFeedback ActiveVideoInputFeedback { get; protected set; }
|
|
||||||
public IntFeedback VideoSourceNumericFeedback { get; protected set; }
|
|
||||||
public IntFeedback AudioSourceNumericFeedback { get; protected set; }
|
|
||||||
public IntFeedback HdmiInHdcpCapabilityFeedback { get; protected set; } //actually state
|
|
||||||
public BoolFeedback HdmiVideoSyncFeedback { get; protected set; }
|
|
||||||
public BoolFeedback VgaVideoSyncFeedback { get; protected set; }
|
|
||||||
|
|
||||||
public BoolFeedback FreeRunEnabledFeedback { get; protected set; }
|
|
||||||
|
|
||||||
public IntFeedback VgaBrightnessFeedback { get; protected set; }
|
|
||||||
public IntFeedback VgaContrastFeedback { get; protected set; }
|
|
||||||
|
|
||||||
//IroutingNumericEvent
|
|
||||||
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
|
||||||
|
|
||||||
/// <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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helps get the "real" inputs, including when in Auto
|
|
||||||
/// </summary>
|
|
||||||
public DmTx200Base.eSourceSelection ActualActiveVideoInput
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (Tx.VideoSourceFeedback == DmTx200Base.eSourceSelection.Digital ||
|
|
||||||
Tx.VideoSourceFeedback == DmTx200Base.eSourceSelection.Analog ||
|
|
||||||
Tx.VideoSourceFeedback == DmTx200Base.eSourceSelection.Disable)
|
|
||||||
return Tx.VideoSourceFeedback;
|
|
||||||
if (Tx.HdmiInput.SyncDetectedFeedback.BoolValue)
|
|
||||||
return DmTx200Base.eSourceSelection.Digital;
|
|
||||||
|
|
||||||
return Tx.VgaInput.SyncDetectedFeedback.BoolValue ? DmTx200Base.eSourceSelection.Analog : DmTx200Base.eSourceSelection.Disable;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new RoutingPortCollection<RoutingInputPort>
|
|
||||||
{
|
|
||||||
HdmiInput,
|
|
||||||
VgaInput,
|
|
||||||
AnyVideoInput
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new RoutingPortCollection<RoutingOutputPort> { DmOutput };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="tx"></param>
|
|
||||||
public DmTx200Controller(string key, string name, DmTx200C2G tx, bool preventRegistration)
|
|
||||||
: base(key, name, tx)
|
|
||||||
{
|
|
||||||
Tx = tx;
|
|
||||||
PreventRegistration = preventRegistration;
|
|
||||||
|
|
||||||
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
|
||||||
DmTx200Base.eSourceSelection.Digital, this,
|
|
||||||
VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInput))
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = DmTx200Base.eSourceSelection.Digital
|
|
||||||
};
|
|
||||||
|
|
||||||
VgaInput = new RoutingInputPortWithVideoStatuses(DmPortName.VgaIn,
|
|
||||||
eRoutingSignalType.Video, eRoutingPortConnectionType.Vga, DmTx200Base.eSourceSelection.Analog, this,
|
|
||||||
VideoStatusHelper.GetVgaInputStatusFuncs(tx.VgaInput))
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = DmTx200Base.eSourceSelection.Analog
|
|
||||||
};
|
|
||||||
|
|
||||||
ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput",
|
|
||||||
() => ActualActiveVideoInput.ToString());
|
|
||||||
|
|
||||||
Tx.HdmiInput.InputStreamChange += InputStreamChangeEvent;
|
|
||||||
Tx.VgaInput.InputStreamChange += VgaInputOnInputStreamChange;
|
|
||||||
Tx.BaseEvent += Tx_BaseEvent;
|
|
||||||
Tx.OnlineStatusChange += Tx_OnlineStatusChange;
|
|
||||||
|
|
||||||
VideoSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
|
|
||||||
AudioSourceNumericFeedback = new IntFeedback(() => (int)Tx.AudioSourceFeedback);
|
|
||||||
|
|
||||||
HdmiInHdcpCapabilityFeedback = new IntFeedback("HdmiInHdcpCapability", () => tx.HdmiInput.HdcpSupportOnFeedback.BoolValue ? 1 : 0);
|
|
||||||
|
|
||||||
//setting this on the base class so that we can get it easily on the chassis.
|
|
||||||
HdcpStateFeedback = HdmiInHdcpCapabilityFeedback;
|
|
||||||
|
|
||||||
HdcpSupportCapability = eHdcpCapabilityType.HdcpAutoSupport;
|
|
||||||
|
|
||||||
HdmiVideoSyncFeedback = new BoolFeedback(() => tx.HdmiInput.SyncDetectedFeedback.BoolValue);
|
|
||||||
|
|
||||||
VgaVideoSyncFeedback = new BoolFeedback(() => tx.VgaInput.SyncDetectedFeedback.BoolValue);
|
|
||||||
|
|
||||||
FreeRunEnabledFeedback = new BoolFeedback(() => tx.VgaInput.FreeRunFeedback == eDmFreeRunSetting.Enabled);
|
|
||||||
|
|
||||||
VgaBrightnessFeedback = new IntFeedback(() => tx.VgaInput.VideoControls.BrightnessFeedback.UShortValue);
|
|
||||||
VgaContrastFeedback = new IntFeedback(() => tx.VgaInput.VideoControls.ContrastFeedback.UShortValue);
|
|
||||||
|
|
||||||
tx.VgaInput.VideoControls.ControlChange += VideoControls_ControlChange;
|
|
||||||
|
|
||||||
|
|
||||||
var combinedFuncs = new VideoStatusFuncsWrapper
|
|
||||||
{
|
|
||||||
HdcpActiveFeedbackFunc = () =>
|
|
||||||
(ActualActiveVideoInput == DmTx200Base.eSourceSelection.Digital
|
|
||||||
&& tx.HdmiInput.VideoAttributes.HdcpActiveFeedback.BoolValue),
|
|
||||||
|
|
||||||
HdcpStateFeedbackFunc = () => ActualActiveVideoInput == DmTx200Base.eSourceSelection.Digital ? tx.HdmiInput.VideoAttributes.HdcpStateFeedback.ToString() : "",
|
|
||||||
|
|
||||||
VideoResolutionFeedbackFunc = () =>
|
|
||||||
{
|
|
||||||
if (ActualActiveVideoInput == DmTx200Base.eSourceSelection.Digital)
|
|
||||||
return tx.HdmiInput.VideoAttributes.GetVideoResolutionString();
|
|
||||||
return ActualActiveVideoInput == DmTx200Base.eSourceSelection.Analog ? tx.VgaInput.VideoAttributes.GetVideoResolutionString() : "";
|
|
||||||
},
|
|
||||||
VideoSyncFeedbackFunc = () =>
|
|
||||||
(ActualActiveVideoInput == DmTx200Base.eSourceSelection.Digital
|
|
||||||
&& tx.HdmiInput.SyncDetectedFeedback.BoolValue)
|
|
||||||
|| (ActualActiveVideoInput == DmTx200Base.eSourceSelection.Analog
|
|
||||||
&& tx.VgaInput.SyncDetectedFeedback.BoolValue)
|
|
||||||
|| (ActualActiveVideoInput == DmTx200Base.eSourceSelection.Auto
|
|
||||||
&& (tx.VgaInput.SyncDetectedFeedback.BoolValue || tx.HdmiInput.SyncDetectedFeedback.BoolValue))
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
|
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, 0, this, combinedFuncs);
|
|
||||||
|
|
||||||
DmOutput = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.DmCat, null, this);
|
|
||||||
|
|
||||||
AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiInHdcpCapabilityFeedback, HdmiVideoSyncFeedback,
|
|
||||||
VgaVideoSyncFeedback);
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiInput.Port = Tx.HdmiInput;
|
|
||||||
VgaInput.Port = Tx.VgaInput;
|
|
||||||
DmOutput.Port = Tx.DmOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void VgaInputOnInputStreamChange(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case EndpointInputStreamEventIds.FreeRunFeedbackEventId:
|
|
||||||
FreeRunEnabledFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
|
|
||||||
VgaVideoSyncFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void VideoControls_ControlChange(object sender, GenericEventArgs args)
|
|
||||||
{
|
|
||||||
var id = args.EventId;
|
|
||||||
Debug.Console(2, this, "EventId {0}", args.EventId);
|
|
||||||
|
|
||||||
switch (id)
|
|
||||||
{
|
|
||||||
case VideoControlsEventIds.BrightnessFeedbackEventId:
|
|
||||||
VgaBrightnessFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoControlsEventIds.ContrastFeedbackEventId:
|
|
||||||
VgaContrastFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tx_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args)
|
|
||||||
{
|
|
||||||
var localVideoInputPort =
|
|
||||||
InputPorts.FirstOrDefault(p => (DmTx200Base.eSourceSelection) p.Selector == Tx.VideoSourceFeedback);
|
|
||||||
var localAudioInputPort =
|
|
||||||
InputPorts.FirstOrDefault(p => (DmTx200Base.eSourceSelection) p.Selector == Tx.AudioSourceFeedback);
|
|
||||||
|
|
||||||
|
|
||||||
ActiveVideoInputFeedback.FireUpdate();
|
|
||||||
VideoSourceNumericFeedback.FireUpdate();
|
|
||||||
AudioSourceNumericFeedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localAudioInputPort, eRoutingSignalType.Audio));
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool CustomActivate()
|
|
||||||
{
|
|
||||||
|
|
||||||
Tx.HdmiInput.InputStreamChange += (o, a) => FowardInputStreamChange(HdmiInput, a.EventId);
|
|
||||||
Tx.HdmiInput.VideoAttributes.AttributeChange += (o, a) => FireVideoAttributeChange(HdmiInput, a.EventId);
|
|
||||||
|
|
||||||
Tx.VgaInput.InputStreamChange += (o, a) => FowardInputStreamChange(VgaInput, a.EventId);
|
|
||||||
Tx.VgaInput.VideoAttributes.AttributeChange += (o, a) => FireVideoAttributeChange(VgaInput, a.EventId);
|
|
||||||
|
|
||||||
// Base does register and sets up comm monitoring.
|
|
||||||
return base.CustomActivate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = GetDmTxJoinMap(joinStart, joinMapKey);
|
|
||||||
|
|
||||||
if (HdmiVideoSyncFeedback != null)
|
|
||||||
{
|
|
||||||
HdmiVideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input1VideoSyncStatus.JoinNumber]);
|
|
||||||
}
|
|
||||||
if (VgaVideoSyncFeedback != null)
|
|
||||||
{
|
|
||||||
VgaVideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input2VideoSyncStatus.JoinNumber]);
|
|
||||||
}
|
|
||||||
|
|
||||||
LinkDmTxToApi(this, trilist, joinMap, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Enables or disables free run
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="enable"></param>
|
|
||||||
public void SetFreeRunEnabled(bool enable)
|
|
||||||
{
|
|
||||||
Tx.VgaInput.FreeRun = enable ? eDmFreeRunSetting.Enabled : eDmFreeRunSetting.Disabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the VGA brightness level
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="level"></param>
|
|
||||||
public void SetVgaBrightness(ushort level)
|
|
||||||
{
|
|
||||||
Tx.VgaInput.VideoControls.Brightness.UShortValue = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the VGA contrast level
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="level"></param>
|
|
||||||
public void SetVgaContrast(ushort level)
|
|
||||||
{
|
|
||||||
Tx.VgaInput.VideoControls.Contrast.UShortValue = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
|
|
||||||
|
|
||||||
switch (input)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(DmTx200Base.eSourceSelection.Auto, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(HdmiInput.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(VgaInput.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(DmTx200Base.eSourceSelection.Disable, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
if ((signalType | eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
|
||||||
Tx.VideoSource = (DmTx200Base.eSourceSelection)inputSelector;
|
|
||||||
if ((signalType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
|
||||||
Tx.AudioSource = (DmTx200Base.eSourceSelection)inputSelector;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tx_BaseEvent(GenericBase device, BaseEventArgs args)
|
|
||||||
{
|
|
||||||
var id = args.EventId;
|
|
||||||
Debug.Console(2, this, "EventId {0}", args.EventId);
|
|
||||||
|
|
||||||
switch (id)
|
|
||||||
{
|
|
||||||
case EndpointTransmitterBase.VideoSourceFeedbackEventId:
|
|
||||||
var localVideoInputPort = InputPorts.FirstOrDefault(p => (DmTx200Base.eSourceSelection)p.Selector == Tx.VideoSourceFeedback);
|
|
||||||
Debug.Console(2, this, " Video Source: {0}", Tx.VideoSourceFeedback);
|
|
||||||
VideoSourceNumericFeedback.FireUpdate();
|
|
||||||
ActiveVideoInputFeedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
|
||||||
break;
|
|
||||||
case EndpointTransmitterBase.AudioSourceFeedbackEventId:
|
|
||||||
var localInputAudioPort = InputPorts.FirstOrDefault(p => (DmTx200Base.eSourceSelection)p.Selector == Tx.AudioSourceFeedback);
|
|
||||||
Debug.Console(2, this, " Audio Source: {0}", Tx.AudioSourceFeedback);
|
|
||||||
AudioSourceNumericFeedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localInputAudioPort, eRoutingSignalType.Audio));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputStreamChangeEvent(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "{0} event {1} stream {2}", Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
|
|
||||||
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case EndpointInputStreamEventIds.HdcpSupportOffFeedbackEventId:
|
|
||||||
HdmiInHdcpCapabilityFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case EndpointInputStreamEventIds.HdcpSupportOnFeedbackEventId:
|
|
||||||
HdmiInHdcpCapabilityFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
|
|
||||||
HdmiVideoSyncFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Relays the input stream change to the appropriate RoutingInputPort.
|
|
||||||
/// </summary>
|
|
||||||
void FowardInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
|
||||||
{
|
|
||||||
if (eventId != EndpointInputStreamEventIds.SyncDetectedFeedbackEventId)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
inputPort.VideoStatus.VideoSyncFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Relays the VideoAttributes change to a RoutingInputPort
|
|
||||||
/// </summary>
|
|
||||||
void FireVideoAttributeChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
|
||||||
{
|
|
||||||
//// LOCATION: Crestron.SimplSharpPro.DM.VideoAttributeEventIds
|
|
||||||
//Debug.Console(2, this, "VideoAttributes_AttributeChange event id={0} from {1}",
|
|
||||||
// args.EventId, (sender as VideoAttributesEnhanced).Owner.GetType());
|
|
||||||
switch (eventId)
|
|
||||||
{
|
|
||||||
case VideoAttributeEventIds.HdcpActiveFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoAttributeEventIds.HdcpStateFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.HdcpStateFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.HdcpStateFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoAttributeEventIds.HorizontalResolutionFeedbackEventId:
|
|
||||||
case VideoAttributeEventIds.VerticalResolutionFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoAttributeEventIds.FramesPerSecondFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,430 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Crestron.SimplSharpPro;
|
|
||||||
using Crestron.SimplSharpPro.DeviceSupport;
|
|
||||||
using Crestron.SimplSharpPro.DM;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints;
|
|
||||||
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
using PepperDash.Core;
|
|
||||||
using PepperDash.Essentials.Core;
|
|
||||||
using PepperDash.Essentials.Core.Bridges;
|
|
||||||
|
|
||||||
namespace PepperDash.Essentials.DM
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Controller class for all DM-TX-201C/S/F transmitters
|
|
||||||
/// </summary>
|
|
||||||
[Description("Wrapper class for DM-TX-201-C")]
|
|
||||||
public class DmTx201CController : DmTxControllerBase, ITxRoutingWithFeedback, IHasFreeRun, IVgaBrightnessContrastControls
|
|
||||||
{
|
|
||||||
public DmTx201C Tx { get; private set; }
|
|
||||||
|
|
||||||
public RoutingInputPortWithVideoStatuses HdmiInput { get; private set; }
|
|
||||||
public RoutingInputPortWithVideoStatuses VgaInput { get; private set; }
|
|
||||||
public RoutingOutputPort DmOutput { get; private set; }
|
|
||||||
public RoutingOutputPort HdmiLoopOut { get; private set; }
|
|
||||||
|
|
||||||
public override StringFeedback ActiveVideoInputFeedback { get; protected set; }
|
|
||||||
public IntFeedback VideoSourceNumericFeedback { get; protected set; }
|
|
||||||
public IntFeedback AudioSourceNumericFeedback { get; protected set; }
|
|
||||||
public IntFeedback HdmiInHdcpCapabilityFeedback { get; protected set; }
|
|
||||||
public BoolFeedback HdmiVideoSyncFeedback { get; protected set; }
|
|
||||||
public BoolFeedback VgaVideoSyncFeedback { get; protected set; }
|
|
||||||
|
|
||||||
public BoolFeedback FreeRunEnabledFeedback { get; protected set; }
|
|
||||||
|
|
||||||
public IntFeedback VgaBrightnessFeedback { get; protected set; }
|
|
||||||
public IntFeedback VgaContrastFeedback { get; protected set; }
|
|
||||||
|
|
||||||
//IroutingNumericEvent
|
|
||||||
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
|
|
||||||
|
|
||||||
/// <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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Helps get the "real" inputs, including when in Auto
|
|
||||||
/// </summary>
|
|
||||||
public DmTx200Base.eSourceSelection ActualActiveVideoInput
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (Tx.VideoSourceFeedback == DmTx200Base.eSourceSelection.Digital ||
|
|
||||||
Tx.VideoSourceFeedback == DmTx200Base.eSourceSelection.Analog ||
|
|
||||||
Tx.VideoSourceFeedback == DmTx200Base.eSourceSelection.Disable)
|
|
||||||
return Tx.VideoSourceFeedback;
|
|
||||||
else // auto
|
|
||||||
{
|
|
||||||
if (Tx.HdmiInput.SyncDetectedFeedback.BoolValue)
|
|
||||||
return DmTx200Base.eSourceSelection.Digital;
|
|
||||||
else if (Tx.VgaInput.SyncDetectedFeedback.BoolValue)
|
|
||||||
return DmTx200Base.eSourceSelection.Analog;
|
|
||||||
else
|
|
||||||
return DmTx200Base.eSourceSelection.Disable;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingInputPort> InputPorts
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new RoutingPortCollection<RoutingInputPort>
|
|
||||||
{
|
|
||||||
HdmiInput,
|
|
||||||
VgaInput,
|
|
||||||
AnyVideoInput
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public RoutingPortCollection<RoutingOutputPort> OutputPorts
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new RoutingPortCollection<RoutingOutputPort> { DmOutput, HdmiLoopOut };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key"></param>
|
|
||||||
/// <param name="name"></param>
|
|
||||||
/// <param name="tx"></param>
|
|
||||||
public DmTx201CController(string key, string name, DmTx201C tx, bool preventRegistration)
|
|
||||||
: base(key, name, tx)
|
|
||||||
{
|
|
||||||
Tx = tx;
|
|
||||||
PreventRegistration = preventRegistration;
|
|
||||||
|
|
||||||
HdmiInput = new RoutingInputPortWithVideoStatuses(DmPortName.HdmiIn,
|
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi,
|
|
||||||
DmTx200Base.eSourceSelection.Digital, this,
|
|
||||||
VideoStatusHelper.GetHdmiInputStatusFuncs(tx.HdmiInput))
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = DmTx200Base.eSourceSelection.Digital
|
|
||||||
};
|
|
||||||
|
|
||||||
VgaInput = new RoutingInputPortWithVideoStatuses(DmPortName.VgaIn,
|
|
||||||
eRoutingSignalType.Video, eRoutingPortConnectionType.Vga, DmTx200Base.eSourceSelection.Analog, this,
|
|
||||||
VideoStatusHelper.GetVgaInputStatusFuncs(tx.VgaInput))
|
|
||||||
{
|
|
||||||
FeedbackMatchObject = DmTx200Base.eSourceSelection.Analog
|
|
||||||
};
|
|
||||||
|
|
||||||
ActiveVideoInputFeedback = new StringFeedback("ActiveVideoInput",
|
|
||||||
() => ActualActiveVideoInput.ToString());
|
|
||||||
|
|
||||||
Tx.HdmiInput.InputStreamChange += InputStreamChangeEvent;
|
|
||||||
Tx.VgaInput.InputStreamChange += VgaInputOnInputStreamChange;
|
|
||||||
Tx.BaseEvent += Tx_BaseEvent;
|
|
||||||
Tx.OnlineStatusChange += new OnlineStatusChangeEventHandler(Tx_OnlineStatusChange);
|
|
||||||
|
|
||||||
VideoSourceNumericFeedback = new IntFeedback(() => (int)Tx.VideoSourceFeedback);
|
|
||||||
|
|
||||||
AudioSourceNumericFeedback = new IntFeedback(() => (int)Tx.AudioSourceFeedback);
|
|
||||||
|
|
||||||
HdmiInHdcpCapabilityFeedback = new IntFeedback("HdmiInHdcpCapability", () =>
|
|
||||||
(tx.HdmiInput.HdcpSupportOnFeedback.BoolValue ? 1 : 0));
|
|
||||||
|
|
||||||
HdcpStateFeedback = HdmiInHdcpCapabilityFeedback;
|
|
||||||
|
|
||||||
HdmiVideoSyncFeedback = new BoolFeedback(() => (bool)tx.HdmiInput.SyncDetectedFeedback.BoolValue);
|
|
||||||
|
|
||||||
VgaVideoSyncFeedback = new BoolFeedback(() => (bool)tx.VgaInput.SyncDetectedFeedback.BoolValue);
|
|
||||||
|
|
||||||
FreeRunEnabledFeedback = new BoolFeedback(() => tx.VgaInput.FreeRunFeedback == eDmFreeRunSetting.Enabled);
|
|
||||||
|
|
||||||
VgaBrightnessFeedback = new IntFeedback(() => tx.VgaInput.VideoControls.BrightnessFeedback.UShortValue);
|
|
||||||
|
|
||||||
VgaContrastFeedback = new IntFeedback(() => tx.VgaInput.VideoControls.ContrastFeedback.UShortValue);
|
|
||||||
|
|
||||||
tx.VgaInput.VideoControls.ControlChange += VideoControls_ControlChange;
|
|
||||||
|
|
||||||
HdcpSupportCapability = eHdcpCapabilityType.HdcpAutoSupport;
|
|
||||||
|
|
||||||
var combinedFuncs = new VideoStatusFuncsWrapper
|
|
||||||
{
|
|
||||||
HdcpActiveFeedbackFunc = () =>
|
|
||||||
(ActualActiveVideoInput == DmTx200Base.eSourceSelection.Digital
|
|
||||||
&& tx.HdmiInput.VideoAttributes.HdcpActiveFeedback.BoolValue),
|
|
||||||
|
|
||||||
HdcpStateFeedbackFunc = () => ActualActiveVideoInput == DmTx200Base.eSourceSelection.Digital ?
|
|
||||||
tx.HdmiInput.VideoAttributes.HdcpStateFeedback.ToString() : "",
|
|
||||||
|
|
||||||
VideoResolutionFeedbackFunc = () =>
|
|
||||||
{
|
|
||||||
if (ActualActiveVideoInput == DmTx200Base.eSourceSelection.Digital)
|
|
||||||
return tx.HdmiInput.VideoAttributes.GetVideoResolutionString();
|
|
||||||
return ActualActiveVideoInput == DmTx200Base.eSourceSelection.Analog ?
|
|
||||||
tx.VgaInput.VideoAttributes.GetVideoResolutionString() : "";
|
|
||||||
},
|
|
||||||
|
|
||||||
VideoSyncFeedbackFunc = () =>
|
|
||||||
(ActualActiveVideoInput == DmTx200Base.eSourceSelection.Digital
|
|
||||||
&& tx.HdmiInput.SyncDetectedFeedback.BoolValue)
|
|
||||||
|| (ActualActiveVideoInput == DmTx200Base.eSourceSelection.Analog
|
|
||||||
&& tx.VgaInput.SyncDetectedFeedback.BoolValue)
|
|
||||||
|| (ActualActiveVideoInput == DmTx200Base.eSourceSelection.Auto
|
|
||||||
&& (tx.VgaInput.SyncDetectedFeedback.BoolValue || tx.HdmiInput.SyncDetectedFeedback.BoolValue))
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
AnyVideoInput = new RoutingInputPortWithVideoStatuses(DmPortName.AnyVideoIn,
|
|
||||||
eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.None, 0, this, combinedFuncs);
|
|
||||||
|
|
||||||
DmOutput = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, null, this);
|
|
||||||
HdmiLoopOut = new RoutingOutputPort(DmPortName.HdmiLoopOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
|
|
||||||
eRoutingPortConnectionType.Hdmi, null, this);
|
|
||||||
|
|
||||||
AddToFeedbackList(ActiveVideoInputFeedback, VideoSourceNumericFeedback, AudioSourceNumericFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.HasVideoStatusFeedback, AnyVideoInput.VideoStatus.HdcpActiveFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.HdcpStateFeedback, AnyVideoInput.VideoStatus.VideoResolutionFeedback,
|
|
||||||
AnyVideoInput.VideoStatus.VideoSyncFeedback, HdmiInHdcpCapabilityFeedback, HdmiVideoSyncFeedback,
|
|
||||||
VgaVideoSyncFeedback);
|
|
||||||
|
|
||||||
// Set Ports for CEC
|
|
||||||
HdmiInput.Port = Tx.HdmiInput;
|
|
||||||
VgaInput.Port = Tx.VgaInput;
|
|
||||||
HdmiLoopOut.Port = Tx.HdmiOutput;
|
|
||||||
DmOutput.Port = Tx.DmOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VideoControls_ControlChange(object sender, Crestron.SimplSharpPro.DeviceSupport.GenericEventArgs args)
|
|
||||||
{
|
|
||||||
var id = args.EventId;
|
|
||||||
Debug.Console(2, this, "EventId {0}", args.EventId);
|
|
||||||
|
|
||||||
switch (id)
|
|
||||||
{
|
|
||||||
case VideoControlsEventIds.BrightnessFeedbackEventId:
|
|
||||||
VgaBrightnessFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoControlsEventIds.ContrastFeedbackEventId:
|
|
||||||
VgaContrastFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tx_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args)
|
|
||||||
{
|
|
||||||
var localVideoInputPort =
|
|
||||||
InputPorts.FirstOrDefault(p => (DmTx200Base.eSourceSelection)p.Selector == Tx.VideoSourceFeedback);
|
|
||||||
var localAudioInputPort =
|
|
||||||
InputPorts.FirstOrDefault(p => (DmTx200Base.eSourceSelection)p.Selector == Tx.AudioSourceFeedback);
|
|
||||||
|
|
||||||
|
|
||||||
ActiveVideoInputFeedback.FireUpdate();
|
|
||||||
VideoSourceNumericFeedback.FireUpdate();
|
|
||||||
AudioSourceNumericFeedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localAudioInputPort, eRoutingSignalType.Audio));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void VgaInputOnInputStreamChange(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case EndpointInputStreamEventIds.FreeRunFeedbackEventId:
|
|
||||||
FreeRunEnabledFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
|
|
||||||
VgaVideoSyncFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool CustomActivate()
|
|
||||||
{
|
|
||||||
Tx.HdmiInput.InputStreamChange += (o, a) => FowardInputStreamChange(HdmiInput, a.EventId);
|
|
||||||
Tx.HdmiInput.VideoAttributes.AttributeChange += (o, a) => FireVideoAttributeChange(HdmiInput, a.EventId);
|
|
||||||
|
|
||||||
Tx.VgaInput.InputStreamChange += (o, a) => FowardInputStreamChange(VgaInput, a.EventId);
|
|
||||||
Tx.VgaInput.VideoAttributes.AttributeChange += (o, a) => FireVideoAttributeChange(VgaInput, a.EventId);
|
|
||||||
|
|
||||||
// Base does register and sets up comm monitoring.
|
|
||||||
return base.CustomActivate();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
|
|
||||||
{
|
|
||||||
var joinMap = GetDmTxJoinMap(joinStart, joinMapKey);
|
|
||||||
|
|
||||||
if (HdmiVideoSyncFeedback != null)
|
|
||||||
{
|
|
||||||
HdmiVideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input1VideoSyncStatus.JoinNumber]);
|
|
||||||
}
|
|
||||||
if (VgaVideoSyncFeedback != null)
|
|
||||||
{
|
|
||||||
VgaVideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Input2VideoSyncStatus.JoinNumber]);
|
|
||||||
}
|
|
||||||
|
|
||||||
LinkDmTxToApi(this, trilist, joinMap, bridge);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Enables or disables free run
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="enable"></param>
|
|
||||||
public void SetFreeRunEnabled(bool enable)
|
|
||||||
{
|
|
||||||
Tx.VgaInput.FreeRun = enable ? eDmFreeRunSetting.Enabled : eDmFreeRunSetting.Disabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the VGA brightness level
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="level"></param>
|
|
||||||
public void SetVgaBrightness(ushort level)
|
|
||||||
{
|
|
||||||
Tx.VgaInput.VideoControls.Brightness.UShortValue = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the VGA contrast level
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="level"></param>
|
|
||||||
public void SetVgaContrast(ushort level)
|
|
||||||
{
|
|
||||||
Tx.VgaInput.VideoControls.Contrast.UShortValue = level;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Switches the audio/video source based on the integer value (0-Auto, 1-HDMI, 2-VGA, 3-Disable)
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="input"></param>
|
|
||||||
/// <param name="output"></param>
|
|
||||||
/// <param name="type"></param>
|
|
||||||
public void ExecuteNumericSwitch(ushort input, ushort output, eRoutingSignalType type)
|
|
||||||
{
|
|
||||||
Debug.Console(2, this, "Executing Numeric Switch to input {0}.", input);
|
|
||||||
|
|
||||||
switch (input)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(DmTx200Base.eSourceSelection.Auto, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(HdmiInput.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 2:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(VgaInput.Selector, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 3:
|
|
||||||
{
|
|
||||||
ExecuteSwitch(DmTx200Base.eSourceSelection.Disable, null, type);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType signalType)
|
|
||||||
{
|
|
||||||
if((signalType | eRoutingSignalType.Video) == eRoutingSignalType.Video)
|
|
||||||
Tx.VideoSource = (DmTx200Base.eSourceSelection)inputSelector;
|
|
||||||
if ((signalType | eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
|
|
||||||
Tx.AudioSource = (DmTx200Base.eSourceSelection)inputSelector;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tx_BaseEvent(GenericBase device, BaseEventArgs args)
|
|
||||||
{
|
|
||||||
var id = args.EventId;
|
|
||||||
Debug.Console(2, this, "EventId {0}", args.EventId);
|
|
||||||
|
|
||||||
switch (id)
|
|
||||||
{
|
|
||||||
case EndpointTransmitterBase.VideoSourceFeedbackEventId:
|
|
||||||
var localVideoInputPort = InputPorts.FirstOrDefault(p => (DmTx200Base.eSourceSelection)p.Selector == Tx.VideoSourceFeedback);
|
|
||||||
Debug.Console(2, this, " Video Source: {0}", Tx.VideoSourceFeedback);
|
|
||||||
VideoSourceNumericFeedback.FireUpdate();
|
|
||||||
ActiveVideoInputFeedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, VideoSourceNumericFeedback.UShortValue, OutputPorts.First(), localVideoInputPort, eRoutingSignalType.Video));
|
|
||||||
break;
|
|
||||||
case EndpointTransmitterBase.AudioSourceFeedbackEventId:
|
|
||||||
var localInputAudioPort = InputPorts.FirstOrDefault(p => (DmTx200Base.eSourceSelection)p.Selector == Tx.AudioSourceFeedback);
|
|
||||||
Debug.Console(2, this, " Audio Source: {0}", Tx.AudioSourceFeedback);
|
|
||||||
AudioSourceNumericFeedback.FireUpdate();
|
|
||||||
OnSwitchChange(new RoutingNumericEventArgs(1, AudioSourceNumericFeedback.UShortValue, OutputPorts.First(), localInputAudioPort, eRoutingSignalType.Audio));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InputStreamChangeEvent(EndpointInputStream inputStream, EndpointInputStreamEventArgs args)
|
|
||||||
{
|
|
||||||
Debug.Console(2, "{0} event {1} stream {2}", Tx.ToString(), inputStream.ToString(), args.EventId.ToString());
|
|
||||||
|
|
||||||
switch (args.EventId)
|
|
||||||
{
|
|
||||||
case EndpointInputStreamEventIds.HdcpSupportOffFeedbackEventId:
|
|
||||||
HdmiInHdcpCapabilityFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case EndpointInputStreamEventIds.HdcpSupportOnFeedbackEventId:
|
|
||||||
HdmiInHdcpCapabilityFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case EndpointInputStreamEventIds.SyncDetectedFeedbackEventId:
|
|
||||||
HdmiVideoSyncFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Relays the input stream change to the appropriate RoutingInputPort.
|
|
||||||
/// </summary>
|
|
||||||
void FowardInputStreamChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
|
||||||
{
|
|
||||||
if (eventId != EndpointInputStreamEventIds.SyncDetectedFeedbackEventId)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
inputPort.VideoStatus.VideoSyncFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.VideoSyncFeedback.FireUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Relays the VideoAttributes change to a RoutingInputPort
|
|
||||||
/// </summary>
|
|
||||||
void FireVideoAttributeChange(RoutingInputPortWithVideoStatuses inputPort, int eventId)
|
|
||||||
{
|
|
||||||
//// LOCATION: Crestron.SimplSharpPro.DM.VideoAttributeEventIds
|
|
||||||
//Debug.Console(2, this, "VideoAttributes_AttributeChange event id={0} from {1}",
|
|
||||||
// args.EventId, (sender as VideoAttributesEnhanced).Owner.GetType());
|
|
||||||
switch (eventId)
|
|
||||||
{
|
|
||||||
case VideoAttributeEventIds.HdcpActiveFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.HdcpActiveFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoAttributeEventIds.HdcpStateFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.HdcpStateFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.HdcpStateFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoAttributeEventIds.HorizontalResolutionFeedbackEventId:
|
|
||||||
case VideoAttributeEventIds.VerticalResolutionFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
case VideoAttributeEventIds.FramesPerSecondFeedbackEventId:
|
|
||||||
inputPort.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
AnyVideoInput.VideoStatus.VideoResolutionFeedback.FireUpdate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user