mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-01-27 03:14:57 +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
|
||||
FodyWeavers.xsd
|
||||
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
|
||||
VisualStudioVersion = 17.4.33213.308
|
||||
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
|
||||
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
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash.Essentials", "src\PepperDash.Essentials\PepperDash.Essentials.csproj", "{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash.Essentials.Core", "src\PepperDash.Essentials.Core\PepperDash.Essentials.Core.csproj", "{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}"
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PepperDash.Essentials.Core", "src\PepperDash.Essentials.Core\PepperDash.Essentials.Core.csproj", "{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}"
|
||||
EndProject
|
||||
Global
|
||||
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}.Release|Any CPU.ActiveCfg = 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.Build.0 = Debug|Any CPU
|
||||
{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
</Target>
|
||||
<Target Name="Copy CPZ" AfterTargets="SimplSharpPostProcess" Condition="$(ProjectType) == 'Program'">
|
||||
<Message Text="Copying CPZ"></Message>
|
||||
<Move SourceFiles="$(TargetDir)\$(TargetName).cpz" DestinationFiles="$(TargetDir)\$(TargetName).$(Version).cpz" />
|
||||
<Copy SourceFiles="$(TargetDir)\$(TargetName).$(Version).cpz" DestinationFiles="$(PackageOutputPath)\$(TargetName).$(Version).cpz"/>
|
||||
<Move SourceFiles="$(TargetDir)$(TargetName).cpz" DestinationFiles="$(TargetDir)$(TargetName).$(Version).cpz" />
|
||||
<Copy SourceFiles="$(TargetDir)$(TargetName).$(Version).cpz" DestinationFiles="$(PackageOutputPath)\$(TargetName).$(Version).cpz"/>
|
||||
</Target>
|
||||
<Target Name="Clean CPZ" AfterTargets="AfterClean" Condition="$(ProjectType) == 'Program'">
|
||||
<Delete Files="$(PackageOutputPath)\$(TargetName).$(Version).cpz"/>
|
||||
|
||||
@@ -167,7 +167,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
|
||||
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,
|
||||
"{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; }
|
||||
|
||||
[JsonProperty("rooms")]
|
||||
public List<ApiRoomPropertiesConfig> Rooms { get; set; }
|
||||
public List<ApiRoomPropertiesConfig> Rooms { get; set; }
|
||||
|
||||
|
||||
public class ApiDevicePropertiesConfig
|
||||
@@ -444,7 +444,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
{
|
||||
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)
|
||||
@@ -459,34 +459,34 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
{
|
||||
case "eiscapiadv":
|
||||
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 = null;
|
||||
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 = null;
|
||||
break;
|
||||
}
|
||||
eisc = new VirtualControlEISCClient(controlProperties.IpIdInt, controlProperties.RoomId,
|
||||
Global.ControlSystem);
|
||||
break;
|
||||
}
|
||||
eisc = new VirtualControlEISCClient(controlProperties.IpIdInt, controlProperties.RoomId,
|
||||
Global.ControlSystem);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
eisc = null;
|
||||
break;
|
||||
|
||||
@@ -8,6 +8,18 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||
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")]
|
||||
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 });
|
||||
@@ -36,6 +48,28 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
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 });
|
||||
|
||||
[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>
|
||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||
/// </summary>
|
||||
@@ -50,7 +84,8 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
/// </summary>
|
||||
/// <param name="joinStart">Join this join map will start at</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 },
|
||||
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>
|
||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||
/// </summary>
|
||||
@@ -78,7 +88,8 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
/// </summary>
|
||||
/// <param name="joinStart">Join this join map will start at</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")]
|
||||
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")]
|
||||
public JoinDataComplete OutletCount = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace PepperDash.Essentials.Core.Bridges
|
||||
[JoinName("ProgramOffsetJoin")]
|
||||
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 });
|
||||
|
||||
|
||||
[JoinName("ProgramStart")]
|
||||
public JoinDataComplete ProgramStart = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
|
||||
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 },
|
||||
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>
|
||||
/// Constructor to use when instantiating this Join Map without inheriting from it
|
||||
/// </summary>
|
||||
|
||||
@@ -83,6 +83,15 @@ namespace PepperDash.Essentials.Core
|
||||
}
|
||||
case eControlMethod.Telnet:
|
||||
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:
|
||||
break;
|
||||
}
|
||||
@@ -117,41 +126,54 @@ namespace PepperDash.Essentials.Core
|
||||
/// <returns></returns>
|
||||
public static ICec GetCecPort(ControlPropertiesConfig config)
|
||||
{
|
||||
var dev = DeviceManager.GetDeviceForKey(config.ControlPortDevKey);
|
||||
try
|
||||
{
|
||||
var dev = DeviceManager.GetDeviceForKey(config.ControlPortDevKey);
|
||||
|
||||
if (dev != null)
|
||||
{
|
||||
if (!String.IsNullOrEmpty(config.ControlPortName))
|
||||
{
|
||||
Debug.Console(0, "GetCecPort: device '{0}' {1}", config.ControlPortDevKey, dev == null
|
||||
? "is not valid, failed to get cec port"
|
||||
: "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 (inputPort.Port is ICec)
|
||||
return inputPort.Port as ICec;
|
||||
}
|
||||
if (String.IsNullOrEmpty(config.ControlPortName))
|
||||
{
|
||||
Debug.Console(0, "GetCecPort: '{0}' - Configuration missing 'ControlPortName'", config.ControlPortDevKey);
|
||||
return null;
|
||||
}
|
||||
|
||||
var outputPort = (dev as IRoutingInputsOutputs).OutputPorts[config.ControlPortName];
|
||||
|
||||
if (outputPort != null)
|
||||
{
|
||||
if (outputPort.Port is ICec)
|
||||
return outputPort.Port as ICec;
|
||||
}
|
||||
var inputsOutputs = dev as IRoutingInputsOutputs;
|
||||
if (inputsOutputs == null)
|
||||
{
|
||||
Debug.Console(0, "GetCecPort: Device '{0}' does not support IRoutingInputsOutputs, failed to get CEC port called '{1}'",
|
||||
config.ControlPortDevKey, config.ControlPortName);
|
||||
|
||||
else
|
||||
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;
|
||||
}
|
||||
|
||||
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>
|
||||
|
||||
@@ -226,12 +226,18 @@ namespace PepperDash.Essentials.Core
|
||||
/// </summary>
|
||||
public class IrOutPortConfig
|
||||
{
|
||||
[JsonProperty("port")]
|
||||
public IROutputPort Port { get; set; }
|
||||
|
||||
[JsonProperty("fileName")]
|
||||
public string FileName { get; set; }
|
||||
|
||||
[JsonProperty("useBridgeJoinMap")]
|
||||
public bool UseBridgeJoinMap { get; set; }
|
||||
|
||||
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.
|
||||
/// </summary>
|
||||
/// <param name="s">Device key from which to report data</param>
|
||||
public static void GetRoutingPorts(string s)
|
||||
{
|
||||
var device = GetDeviceForKey(s);
|
||||
public static void GetRoutingPorts(string s)
|
||||
{
|
||||
var device = GetDeviceForKey(s);
|
||||
|
||||
if (device == null) return;
|
||||
var inputPorts = ((device as IRoutingInputs) != null) ? (device as IRoutingInputs).InputPorts : null;
|
||||
var outputPorts = ((device as IRoutingOutputs) != null) ? (device as IRoutingOutputs).OutputPorts : null;
|
||||
if (inputPorts != null)
|
||||
{
|
||||
Debug.Console(0, "Device {0} has {1} Input Ports:", s, inputPorts.Count);
|
||||
foreach (var routingInputPort in inputPorts)
|
||||
{
|
||||
Debug.Console(0, "{0}", routingInputPort.Key);
|
||||
}
|
||||
}
|
||||
if (outputPorts != null)
|
||||
{
|
||||
Debug.Console(0, "Device {0} has {1} Output Ports:", s, outputPorts.Count);
|
||||
foreach (var routingOutputPort in outputPorts)
|
||||
{
|
||||
Debug.Console(0, "{0}", routingOutputPort.Key);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (inputPorts != null)
|
||||
{
|
||||
CrestronConsole.ConsoleCommandResponse("Device {0} has {1} Input Ports:{2}", s, inputPorts.Count, CrestronEnvironment.NewLine);
|
||||
foreach (var routingInputPort in inputPorts)
|
||||
{
|
||||
CrestronConsole.ConsoleCommandResponse("{0}{1}", routingInputPort.Key, CrestronEnvironment.NewLine);
|
||||
}
|
||||
}
|
||||
if (outputPorts == null) return;
|
||||
CrestronConsole.ConsoleCommandResponse("Device {0} has {1} Output Ports:{2}", s, outputPorts.Count, CrestronEnvironment.NewLine);
|
||||
foreach (var routingOutputPort in outputPorts)
|
||||
{
|
||||
CrestronConsole.ConsoleCommandResponse("{0}{1}", routingOutputPort.Key, CrestronEnvironment.NewLine);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempts to set the debug level of a device
|
||||
@@ -435,7 +433,7 @@ namespace PepperDash.Essentials.Core
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -447,7 +445,7 @@ namespace PepperDash.Essentials.Core
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -458,18 +456,18 @@ namespace PepperDash.Essentials.Core
|
||||
var min = Convert.ToUInt32(timeout);
|
||||
|
||||
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)
|
||||
{
|
||||
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
|
||||
{
|
||||
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
|
||||
}
|
||||
|
||||
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>
|
||||
/// Devices the basic needs for a Device Factory
|
||||
/// </summary>
|
||||
|
||||
@@ -2,12 +2,13 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Crestron.SimplSharpPro.DeviceSupport;
|
||||
using Full.Newtonsoft.Json;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
using PepperDash.Essentials.Core.Bridges;
|
||||
using PepperDash.Essentials.Core.Config;
|
||||
using PepperDash_Essentials_Core.Bridges.JoinMaps;
|
||||
|
||||
namespace PepperDash.Essentials.Core.Devices
|
||||
{
|
||||
@@ -21,12 +22,11 @@ namespace PepperDash.Essentials.Core.Devices
|
||||
|
||||
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)
|
||||
{
|
||||
_port = irPort;
|
||||
|
||||
if (_port == null)
|
||||
{
|
||||
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))
|
||||
joinMap = JsonConvert.DeserializeObject<GenericIrControllerJoinMap>(joinMapSerialized);
|
||||
|
||||
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
|
||||
});
|
||||
if (_port.UseBridgeJoinMap)
|
||||
{
|
||||
Debug.Console(0, this, "Using new IR bridge join map");
|
||||
|
||||
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();
|
||||
|
||||
@@ -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 GenericIrControllerFactory()
|
||||
|
||||
@@ -72,6 +72,10 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
IBasicVolumeControls CurrentVolumeControls { get; }
|
||||
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 bool UseBridgeJoinMap { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Constructor for IrDevice base class. If a null port is provided, this class will
|
||||
/// still function without trying to talk to a port.
|
||||
@@ -55,9 +57,10 @@ namespace PepperDash.Essentials.Core
|
||||
: base(key)
|
||||
{
|
||||
DriverLoaded = new BoolFeedback(() => DriverIsLoaded);
|
||||
UseBridgeJoinMap = config.Properties["control"].Value<bool>("useBridgeJoinMap");
|
||||
AddPostActivationAction(() =>
|
||||
{
|
||||
IrPort = postActivationFunc(config);
|
||||
IrPort = postActivationFunc(config);
|
||||
|
||||
if (IrPort == null)
|
||||
{
|
||||
@@ -69,8 +72,8 @@ namespace PepperDash.Essentials.Core
|
||||
Debug.Console(1, "*************Attempting to load IR file: {0}***************", filePath);
|
||||
|
||||
LoadDriver(filePath);
|
||||
|
||||
PrintAvailableCommands();
|
||||
|
||||
PrintAvailableCommands();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Crestron.SimplSharp;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
@@ -8,6 +9,7 @@ namespace PepperDash_Essentials_Core.Devices
|
||||
/// <summary>
|
||||
/// Interface for any device that is able to control it'spower and has a configurable reboot time
|
||||
/// </summary>
|
||||
[Obsolete("PepperDash_Essentials_Core.Devices is Deprecated - use PepperDash.Essentials.Core")]
|
||||
public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
|
||||
{
|
||||
/// <summary>
|
||||
@@ -24,6 +26,7 @@ namespace PepperDash_Essentials_Core.Devices
|
||||
/// <summary>
|
||||
/// Interface for any device that contains a collection of IHasPowerReboot Devices
|
||||
/// </summary>
|
||||
[Obsolete("PepperDash_Essentials_Core.Devices is Deprecated - use PepperDash.Essentials.Core")]
|
||||
public interface IHasControlledPowerOutlets : IKeyName
|
||||
{
|
||||
/// <summary>
|
||||
|
||||
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.ComponentModel;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
@@ -8,17 +9,70 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.Reflection;
|
||||
using Full.Newtonsoft.Json.Linq;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core.Config;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
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
|
||||
{
|
||||
@@ -174,33 +167,26 @@ namespace PepperDash.Essentials.Core
|
||||
/// <summary>
|
||||
/// Prints the type names and associated metadata from the FactoryMethods collection.
|
||||
/// </summary>
|
||||
/// <param name="command"></param>
|
||||
/// <param name="filter"></param>
|
||||
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))
|
||||
{
|
||||
types = FactoryMethods.Where(k => k.Key.Contains(filter)).ToDictionary(k => k.Key, k => k.Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
types = FactoryMethods;
|
||||
}
|
||||
|
||||
Debug.Console(0, "Device Types:");
|
||||
CrestronConsole.ConsoleCommandResponse("Device Types:");
|
||||
|
||||
foreach (var type in types.OrderBy(t => t.Key))
|
||||
{
|
||||
var description = type.Value.Description;
|
||||
var cType = "Not Specified by Plugin";
|
||||
|
||||
if(type.Value.CType != null)
|
||||
if (type.Value.CType != null)
|
||||
{
|
||||
cType = type.Value.CType.FullName;
|
||||
}
|
||||
|
||||
Debug.Console(0,
|
||||
CrestronConsole.ConsoleCommandResponse(
|
||||
@"Type: '{0}'
|
||||
CType: '{1}'
|
||||
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>
|
||||
/// <param name="fileName"></param>
|
||||
/// <returns></returns>
|
||||
public static FileInfo[] GetFiles(string fileName)
|
||||
{
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
|
||||
var files = dirInfo.GetFiles(Path.GetFileName(fileName));
|
||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
|
||||
if (files.Count() > 0)
|
||||
{
|
||||
return files;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static FileInfo[] GetFiles(string fileName)
|
||||
{
|
||||
string fullFilePath = Global.FilePathPrefix + fileName;
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fullFilePath));
|
||||
var files = dirInfo.GetFiles(Path.GetFileName(fullFilePath));
|
||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fullFilePath);
|
||||
if (files.Count() > 0)
|
||||
{
|
||||
return files;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static FileInfo GetFile(string fileName)
|
||||
{
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
|
||||
var files = dirInfo.GetFiles(Path.GetFileName(fileName));
|
||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
|
||||
if (files.Count() > 0)
|
||||
{
|
||||
return files.FirstOrDefault();
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
public static FileInfo GetFile(string fileName)
|
||||
{
|
||||
string fullFilePath = Global.FilePathPrefix + fileName;
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fullFilePath));
|
||||
var files = dirInfo.GetFiles(Path.GetFileName(fullFilePath));
|
||||
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fullFilePath);
|
||||
if (files.Count() > 0)
|
||||
{
|
||||
return files.FirstOrDefault();
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -81,7 +83,7 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
if (fileLock.TryEnter())
|
||||
{
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(file.Name);
|
||||
DirectoryInfo dirInfo = new DirectoryInfo(file.DirectoryName);
|
||||
Debug.Console(2, "FileIO Getting Data {0}", file.FullName);
|
||||
|
||||
if (File.Exists(file.FullName))
|
||||
@@ -202,7 +204,7 @@ namespace PepperDash.Essentials.Core
|
||||
public static void WriteDataToFile(string data, string filePath)
|
||||
{
|
||||
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.Start();
|
||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
|
||||
@@ -217,7 +219,8 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
if (fileLock.TryEnter())
|
||||
{
|
||||
using (StreamWriter sw = new StreamWriter(filePath))
|
||||
|
||||
using (StreamWriter sw = new StreamWriter(filePath))
|
||||
{
|
||||
sw.Write(data);
|
||||
sw.Flush();
|
||||
|
||||
@@ -150,15 +150,20 @@ namespace PepperDash.Essentials.Core.Fusion
|
||||
ReadGuidFile(guidFilePath);
|
||||
}
|
||||
|
||||
if (Room.RoomOccupancy != null)
|
||||
var occupancyRoom = Room as IRoomOccupancy;
|
||||
|
||||
if (occupancyRoom != null)
|
||||
{
|
||||
if (Room.OccupancyStatusProviderIsRemote)
|
||||
if (occupancyRoom.RoomOccupancy != null)
|
||||
{
|
||||
SetUpRemoteOccupancy();
|
||||
}
|
||||
else
|
||||
{
|
||||
SetUpLocalOccupancy();
|
||||
if (occupancyRoom.OccupancyStatusProviderIsRemote)
|
||||
{
|
||||
SetUpRemoteOccupancy();
|
||||
}
|
||||
else
|
||||
{
|
||||
SetUpLocalOccupancy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1525,10 +1530,15 @@ namespace PepperDash.Essentials.Core.Fusion
|
||||
// Tie to method on occupancy object
|
||||
//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);
|
||||
Room.RoomOccupancy.RoomIsOccupiedFeedback.LinkInputSig(occSensorAsset.RoomOccupied.InputSig);
|
||||
Room.RoomOccupancy.RoomIsOccupiedFeedback.OutputChange += RoomIsOccupiedFeedback_OutputChange;
|
||||
|
||||
RoomOccupancyRemoteStringFeedback.LinkInputSig(occSensorAsset.RoomOccupancyInfo.InputSig);
|
||||
|
||||
//}
|
||||
|
||||
@@ -2,10 +2,8 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp.Reflection;
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
@@ -105,22 +103,22 @@ namespace PepperDash.Essentials.Core
|
||||
/// </summary>
|
||||
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
|
||||
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);
|
||||
Debug.Console(2, "Found {0} Digital Joins", digitals.Count);
|
||||
CrestronConsole.ConsoleCommandResponse("Found {0} Digital Joins", digitals.Count);
|
||||
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);
|
||||
Debug.Console(2, "Found {0} Analog Joins", analogs.Count);
|
||||
CrestronConsole.ConsoleCommandResponse("Found {0} Analog Joins", analogs.Count);
|
||||
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);
|
||||
Debug.Console(2, "Found {0} Serial Joins", serials.Count);
|
||||
CrestronConsole.ConsoleCommandResponse("Found {0} Serial Joins", serials.Count);
|
||||
PrintJoinList(GetSortedJoins(serials));
|
||||
|
||||
}
|
||||
@@ -143,7 +141,7 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
foreach (var join in joins)
|
||||
{
|
||||
Debug.Console(0,
|
||||
CrestronConsole.ConsoleCommandResponse(
|
||||
@"Join Number: {0} | Label: '{1}' | JoinSpan: '{2}' | Type: '{3}' | Capabilities: '{4}'",
|
||||
join.Value.JoinNumber,
|
||||
join.Value.Label,
|
||||
@@ -238,25 +236,45 @@ namespace PepperDash.Essentials.Core
|
||||
/// </summary>
|
||||
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
|
||||
Debug.Console(0, "Digitals:");
|
||||
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);
|
||||
PrintJoinList(GetSortedJoins(digitals));
|
||||
sb.AppendLine(String.Format("# {0}", GetType().Name));
|
||||
sb.AppendLine();
|
||||
sb.AppendLine("## 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 = 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);
|
||||
PrintJoinList(GetSortedJoins(analogs));
|
||||
var analogs =
|
||||
Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Analog) == eJoinType.Analog)
|
||||
.ToDictionary(j => j.Key, j => j.Value);
|
||||
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);
|
||||
PrintJoinList(GetSortedJoins(serials));
|
||||
var serials =
|
||||
Joins.Where(j => (j.Value.Metadata.JoinType & eJoinType.Serial) == eJoinType.Serial)
|
||||
.ToDictionary(j => j.Key, j => j.Value);
|
||||
var serialSb = AppendJoinList(GetSortedJoins(serials));
|
||||
|
||||
sb.EnsureCapacity(sb.Length + digitalSb.Length + analogSb.Length + serialSb.Length);
|
||||
sb.Append(digitalSb).Append(analogSb).Append(serialSb);
|
||||
return sb;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Prints the join information to console
|
||||
/// </summary>
|
||||
@@ -264,37 +282,11 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
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:");
|
||||
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);
|
||||
WriteJoinmapMarkdown(JoinmapStringBuilder(), pluginType, bridgeKey, deviceKey);
|
||||
|
||||
}
|
||||
|
||||
@@ -305,7 +297,7 @@ namespace PepperDash.Essentials.Core
|
||||
using (var sw = new StreamWriter(fileName))
|
||||
{
|
||||
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>
|
||||
/// <param name="joins"></param>
|
||||
/// <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();
|
||||
|
||||
@@ -324,20 +316,6 @@ namespace PepperDash.Essentials.Core
|
||||
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)
|
||||
{
|
||||
@@ -380,16 +358,18 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
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)
|
||||
{
|
||||
join.SetCustomJoinData(customJoinData.Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(2, "No matching key found in join map for: '{0}'", customJoinData.Key);
|
||||
}
|
||||
}
|
||||
|
||||
PrintJoinMapInfo();
|
||||
|
||||
@@ -45,7 +45,20 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
public StringFeedback UptimeFeedback { 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)
|
||||
{
|
||||
Debug.Console(2, this, "Adding SystemMonitorController.");
|
||||
@@ -65,6 +78,9 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
UptimeFeedback = new StringFeedback(() => _uptime);
|
||||
LastStartFeedback = new StringFeedback(()=> _lastStart);
|
||||
|
||||
IsApplianceFeedback = new BoolFeedback(() => _isApplianceFb);
|
||||
IsServerFeedback = new BoolFeedback(() => _isServerFb);
|
||||
|
||||
ProgramStatusFeedbackCollection = new Dictionary<uint, ProgramStatusFeedbacks>();
|
||||
|
||||
foreach (var prog in SystemMonitor.ProgramCollection)
|
||||
@@ -125,6 +141,26 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
_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)
|
||||
{
|
||||
if (ethernetEventArgs.EthernetEventType != eEthernetEventType.LinkUp) return;
|
||||
@@ -187,6 +223,9 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
SerialNumberFeedback.FireUpdate();
|
||||
ModelFeedback.FireUpdate();
|
||||
|
||||
IsApplianceFeedback.FireUpdate();
|
||||
IsServerFeedback.FireUpdate();
|
||||
|
||||
OnSystemMonitorPropertiesChanged();
|
||||
}
|
||||
|
||||
@@ -239,6 +278,11 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
UptimeFeedback.LinkInputSig(trilist.StringInput[joinMap.Uptime.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
|
||||
LinkProgramInfoJoins(this, trilist, joinMap);
|
||||
|
||||
@@ -303,11 +347,13 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
p.Value.AggregatedProgramInfoFeedback.LinkInputSig(
|
||||
trilist.StringInput[programSlotJoinStart + joinMap.AggregatedProgramInfo.JoinNumber]);
|
||||
|
||||
trilist.SetSigHeldAction(programSlotJoinStart + joinMap.ProgramReset.JoinNumber, 10000, () => ProgramReset(programNumber));
|
||||
|
||||
programSlotJoinStart = programSlotJoinStart + joinMap.ProgramOffsetJoin.JoinSpan;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//// Sets the time zone
|
||||
//// Sets the time zone
|
||||
//public void SetTimeZone(int timeZone)
|
||||
//{
|
||||
// SystemMonitor.TimeZoneInformation.TimeZoneNumber = timeZone;
|
||||
@@ -519,11 +565,11 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
ProgramUnregisteredFeedback =
|
||||
new BoolFeedback(() => Program.RegistrationState == eProgramRegistrationState.Unregister);
|
||||
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);
|
||||
CrestronDataBaseVersionFeedback = new StringFeedback(() => ProgramInfo.CrestronDb);
|
||||
EnvironmentVersionFeedback = new StringFeedback(() => ProgramInfo.Environment);
|
||||
AggregatedProgramInfoFeedback = new StringFeedback(() => JsonConvert.SerializeObject(ProgramInfo));
|
||||
|
||||
GetProgramInfo();
|
||||
@@ -576,9 +622,9 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
// Assume no valid program info. Constructing a new object will wipe all properties
|
||||
ProgramInfo = new ProgramInfo(Program.Number)
|
||||
{
|
||||
OperatingState = Program.OperatingState,
|
||||
OperatingState = Program.OperatingState,
|
||||
RegistrationState = Program.RegistrationState
|
||||
};
|
||||
};
|
||||
|
||||
UpdateFeedbacks();
|
||||
|
||||
@@ -595,13 +641,20 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
|
||||
if (ProgramInfo.ProgramFile.Contains(".dll"))
|
||||
{
|
||||
// SSP Program
|
||||
// SSP Program
|
||||
ProgramInfo.FriendlyName = ParseConsoleData(response, "Friendly Name", ": ", "\n");
|
||||
ProgramInfo.ApplicationName = ParseConsoleData(response, "Application Name", ": ", "\n");
|
||||
ProgramInfo.ProgramTool = ParseConsoleData(response, "Program Tool", ": ", "\n");
|
||||
ProgramInfo.MinFirmwareVersion = ParseConsoleData(response, "Min Firmware Version", ": ",
|
||||
"\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"))
|
||||
{
|
||||
@@ -692,6 +745,15 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
[JsonProperty("compilerRevision")]
|
||||
public string CompilerRevision { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public Version CompilerRevisionInfo
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Version(CompilerRevision);
|
||||
}
|
||||
}
|
||||
|
||||
[JsonProperty("compileTime")]
|
||||
public string CompileTime { get; set; }
|
||||
|
||||
@@ -732,7 +794,7 @@ namespace PepperDash.Essentials.Core.Monitoring
|
||||
ProgramFile = "";
|
||||
FriendlyName = "";
|
||||
CompilerRevision = "";
|
||||
CompileTime = "";
|
||||
CompileTime = "";
|
||||
Include4Dat = "";
|
||||
|
||||
SystemName = "";
|
||||
|
||||
@@ -87,18 +87,32 @@ namespace PepperDash.Essentials.Core
|
||||
{
|
||||
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, "Sensitivity found, attempting to set value '{0}' from config",
|
||||
PropertiesConfig.Sensitivity);
|
||||
_partitionSensor.Sensitivity.UShortValue = (ushort) PropertiesConfig.Sensitivity;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(1, this, "Sensitivity null, no value specified in config");
|
||||
}
|
||||
Debug.Console(1, this, "Attempting to apply settings to sensor from config");
|
||||
|
||||
if (PropertiesConfig.Sensitivity != null)
|
||||
{
|
||||
Debug.Console(1, this, "Sensitivity found, attempting to set value '{0}' from config",
|
||||
PropertiesConfig.Sensitivity);
|
||||
_partitionSensor.Sensitivity.UShortValue = (ushort)PropertiesConfig.Sensitivity;
|
||||
}
|
||||
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).
|
||||
/// </remarks>
|
||||
[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" />
|
||||
</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">
|
||||
<Aliases>Full</Aliases>
|
||||
</PackageReference>
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
|
||||
</Reference>
|
||||
<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>
|
||||
<HintPath>..\..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
|
||||
</Reference>
|
||||
@@ -94,7 +94,7 @@
|
||||
</Reference>
|
||||
<Reference Include="SimplSharpCWSHelperInterface, Version=2.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCWSHelperInterface.dll</HintPath>
|
||||
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCWSHelperInterface.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SimplSharpHelperInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
@@ -127,6 +127,8 @@
|
||||
<Compile Include="Bridges\IBridge.cs" />
|
||||
<Compile Include="Bridges\JoinMaps\AirMediaControllerJoinMap.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\IDigitalOutputJoinMap.cs" />
|
||||
<Compile Include="Bridges\JoinMaps\PduJoinMapBase.cs" />
|
||||
@@ -200,6 +202,8 @@
|
||||
<Compile Include="Crestron IO\Relay\GenericRelayDevice.cs" />
|
||||
<Compile Include="Crestron IO\Relay\ISwitchedOutput.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\GetFeedbacksForDeviceRequestHandler.cs" />
|
||||
<Compile Include="Web\EssentialsWebApiHelpers.cs" />
|
||||
@@ -417,12 +421,6 @@
|
||||
<None Include="app.config" />
|
||||
<None Include="Properties\ControlSystem.cfg" />
|
||||
</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" />
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
|
||||
@@ -194,13 +194,13 @@ namespace PepperDash.Essentials
|
||||
/// <param name="command"></param>
|
||||
public static void ReportAssemblyVersions(string command)
|
||||
{
|
||||
Debug.Console(0, "Loaded Assemblies:");
|
||||
|
||||
CrestronConsole.ConsoleCommandResponse("Loaded Assemblies:" + CrestronEnvironment.NewLine);
|
||||
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>
|
||||
/// Moves any .dll assemblies not already loaded from the plugins folder to loadedPlugins folder
|
||||
/// </summary>
|
||||
|
||||
@@ -40,7 +40,7 @@ namespace PepperDash.Essentials.Core
|
||||
|
||||
ScheduledEventGroup FeatureEventGroup;
|
||||
|
||||
public IEssentialsRoom Room { get; private set; }
|
||||
public IRoomOccupancy Room { get; private set; }
|
||||
|
||||
private Fusion.EssentialsHuddleSpaceFusionSystemControllerBase FusionRoom;
|
||||
|
||||
@@ -86,7 +86,7 @@ namespace PepperDash.Essentials.Core
|
||||
/// </summary>
|
||||
void SetUpDevice()
|
||||
{
|
||||
Room = DeviceManager.GetDeviceForKey(PropertiesConfig.RoomKey) as IEssentialsRoom;
|
||||
Room = DeviceManager.GetDeviceForKey(PropertiesConfig.RoomKey) as IRoomOccupancy;
|
||||
|
||||
if (Room != null)
|
||||
{
|
||||
@@ -237,12 +237,23 @@ namespace PepperDash.Essentials.Core
|
||||
|
||||
if (FeatureEnabled)
|
||||
{
|
||||
// Check room power state first
|
||||
if (!Room.OnFeedback.BoolValue)
|
||||
{
|
||||
Debug.Console(1, this, "Powering Room on to default source");
|
||||
Room.RunDefaultPresentRoute();
|
||||
var essentialsRoom = Room as IEssentialsRoom;
|
||||
|
||||
if (essentialsRoom != null) {
|
||||
if (!essentialsRoom.OnFeedback.BoolValue)
|
||||
{
|
||||
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.Linq;
|
||||
using System.Text;
|
||||
@@ -13,8 +11,6 @@ using PepperDash.Essentials.Core.Config;
|
||||
using PepperDash.Essentials.Core.Devices;
|
||||
using PepperDash.Essentials.Core.DeviceTypeInterfaces;
|
||||
|
||||
using Full.Newtonsoft.Json;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
/// <summary>
|
||||
@@ -37,7 +33,7 @@ namespace PepperDash.Essentials.Core
|
||||
public BoolFeedback IsWarmingUpFeedback { 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; }
|
||||
|
||||
|
||||
@@ -17,15 +17,10 @@ namespace PepperDash.Essentials.Core
|
||||
/// </summary>
|
||||
public interface IEssentialsRoom : IKeyName, IReconfigurableDevice, IRunDefaultPresentRoute, IEnvironmentalControls
|
||||
{
|
||||
BoolFeedback OnFeedback { get; }
|
||||
|
||||
event EventHandler<EventArgs> RoomOccupancyIsSet;
|
||||
BoolFeedback OnFeedback { get; }
|
||||
|
||||
BoolFeedback IsWarmingUpFeedback { get; }
|
||||
BoolFeedback IsCoolingDownFeedback { get; }
|
||||
|
||||
IOccupancyStatusProvider RoomOccupancy { get; }
|
||||
bool OccupancyStatusProviderIsRemote { get; }
|
||||
BoolFeedback IsCoolingDownFeedback { get; }
|
||||
|
||||
bool IsMobileControlEnabled { get; }
|
||||
IMobileControlRoomBridge MobileControlRoomBridge { get; }
|
||||
@@ -35,31 +30,16 @@ namespace PepperDash.Essentials.Core
|
||||
SecondsCountdownTimer ShutdownPromptTimer { get; }
|
||||
int ShutdownPromptSeconds { get; }
|
||||
int ShutdownVacancySeconds { get; }
|
||||
eShutdownType ShutdownType { get; }
|
||||
|
||||
EssentialsRoomEmergencyBase Emergency { get; }
|
||||
|
||||
Core.Privacy.MicrophonePrivacyController MicrophonePrivacy { get; }
|
||||
eShutdownType ShutdownType { get; }
|
||||
|
||||
string LogoUrlLightBkgnd { get; }
|
||||
string LogoUrlDarkBkgnd { get; }
|
||||
|
||||
eVacancyMode VacancyMode { get; }
|
||||
void StartShutdown(eShutdownType type);
|
||||
|
||||
bool ZeroVolumeWhenSwtichingVolumeDevices { get; }
|
||||
void Shutdown();
|
||||
|
||||
void StartShutdown(eShutdownType type);
|
||||
void StartRoomVacancyTimer(eVacancyMode mode);
|
||||
|
||||
void Shutdown();
|
||||
|
||||
void SetRoomOccupancy(IOccupancyStatusProvider statusProvider, int timeoutMinutes);
|
||||
|
||||
void PowerOnToDefaultOrLastSource();
|
||||
|
||||
void SetDefaultLevels();
|
||||
|
||||
void RoomVacatedForTimeoutPeriod(object o);
|
||||
void PowerOnToDefaultOrLastSource();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -41,7 +41,6 @@ namespace PepperDash.Essentials.Core
|
||||
void RunRouteAction(string routeKey, string sourceListKey);
|
||||
|
||||
void RunRouteAction(string routeKey, string sourceListKey, Action successCallback);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -78,4 +77,30 @@ namespace PepperDash.Essentials.Core
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
public interface IRoutingHasVideoInputSyncFeedbacks
|
||||
{
|
||||
FeedbackCollection<BoolFeedback> VideoInputSyncFeedbacks { get; }
|
||||
}
|
||||
}
|
||||
@@ -42,7 +42,7 @@ namespace PepperDash.Essentials.Core
|
||||
public enum eRoutingPortConnectionType
|
||||
{
|
||||
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>
|
||||
|
||||
@@ -199,5 +199,45 @@ namespace PepperDash.Essentials.Core.Routing
|
||||
/// MediaPlayer
|
||||
/// </summary>
|
||||
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.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using System.Globalization;
|
||||
using Crestron.SimplSharpPro;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
|
||||
namespace PepperDash.Essentials.Core.Touchpanels
|
||||
{
|
||||
/// <summary>
|
||||
/// A wrapper class for the touchpanel portion of an MPC3 class process to allow for configurable
|
||||
/// behavior of the keybad buttons
|
||||
/// </summary>
|
||||
public class Mpc3TouchpanelController : Device
|
||||
{
|
||||
MPC3Basic _Touchpanel;
|
||||
/// <summary>
|
||||
/// A wrapper class for the touchpanel portion of an MPC3 class process to allow for configurable
|
||||
/// behavior of the keybad buttons
|
||||
/// </summary>
|
||||
public class Mpc3TouchpanelController : Device
|
||||
{
|
||||
readonly MPC3Basic _touchpanel;
|
||||
|
||||
Dictionary<string, KeypadButton> _Buttons;
|
||||
readonly Dictionary<string, KeypadButton> _buttons;
|
||||
|
||||
public Mpc3TouchpanelController(string key, string name, CrestronControlSystem processor, Dictionary<string, KeypadButton> buttons)
|
||||
: base(key, name)
|
||||
{
|
||||
_Touchpanel = processor.ControllerTouchScreenSlotDevice as MPC3Basic;
|
||||
_Buttons = buttons;
|
||||
public Mpc3TouchpanelController(string key, string name, CrestronControlSystem processor, Dictionary<string, KeypadButton> buttons)
|
||||
: base(key, name)
|
||||
{
|
||||
_touchpanel = processor.ControllerTouchScreenSlotDevice as MPC3Basic;
|
||||
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(() =>
|
||||
{
|
||||
// Link up the button feedbacks to the specified BoolFeedbacks
|
||||
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();
|
||||
_touchpanel.BaseEvent += _touchpanel_BaseEvent;
|
||||
_touchpanel.ButtonStateChange += _touchpanel_ButtonStateChange;
|
||||
_touchpanel.PanelStateChange += _touchpanel_PanelStateChange;
|
||||
|
||||
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;
|
||||
var iFeedback = feedback as IntFeedback;
|
||||
if (bFeedback != null)
|
||||
{
|
||||
AddPostActivationAction(() =>
|
||||
{
|
||||
foreach (var button in _buttons)
|
||||
{
|
||||
var buttonKey = button.Key.ToLower();
|
||||
var buttonConfig = button.Value;
|
||||
|
||||
if (bKey == "power")
|
||||
{
|
||||
bFeedback.LinkCrestronFeedback(_Touchpanel.FeedbackPower);
|
||||
continue;
|
||||
}
|
||||
else if (bKey == "mute")
|
||||
{
|
||||
bFeedback.LinkCrestronFeedback(_Touchpanel.FeedbackMute);
|
||||
continue;
|
||||
}
|
||||
InitializeButton(buttonKey, buttonConfig);
|
||||
InitializeButtonFeedback(buttonKey, buttonConfig);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Link to the Crestron Feedback corresponding to the button number
|
||||
bFeedback.LinkCrestronFeedback(_Touchpanel.Feedbacks[UInt16.Parse(button.Key)]);
|
||||
}
|
||||
else if (iFeedback != null)
|
||||
{
|
||||
if (bKey == "volumefeedback")
|
||||
{
|
||||
var volFeedback = feedback as IntFeedback;
|
||||
// TODO: Figure out how to subsribe to a volume IntFeedback and link it to the voluem
|
||||
volFeedback.LinkInputSig(_Touchpanel.VolumeBargraph);
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// Enables/disables buttons based on event type configuration
|
||||
/// </summary>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="config"></param>
|
||||
public void InitializeButton(string key, KeypadButton config)
|
||||
{
|
||||
if (config == null)
|
||||
{
|
||||
Debug.Console(1, this, "Button '{0}' config is null, unable to initialize", key);
|
||||
return;
|
||||
}
|
||||
|
||||
void _Touchpanel_ButtonStateChange(GenericBase device, Crestron.SimplSharpPro.DeviceSupport.ButtonEventArgs args)
|
||||
{
|
||||
Debug.Console(1, this, "Button {0} ({1}), {2}", args.Button.Number, args.Button.Name, args.NewButtonState);
|
||||
var type = args.NewButtonState.ToString();
|
||||
int buttonNumber;
|
||||
TryParseInt(key, out buttonNumber);
|
||||
|
||||
if (_Buttons.ContainsKey(args.Button.Number.ToString()))
|
||||
{
|
||||
Press(args.Button.Number.ToString(), type);
|
||||
}
|
||||
else if(_Buttons.ContainsKey(args.Button.Name.ToString()))
|
||||
{
|
||||
Press(args.Button.Name.ToString(), type);
|
||||
}
|
||||
}
|
||||
var buttonEventTypes = config.EventTypes;
|
||||
BoolOutputSig enabledFb = null;
|
||||
BoolOutputSig disabledFb = null;
|
||||
|
||||
/// <summary>
|
||||
/// Runs the function associated with this button/type. One of the following strings:
|
||||
/// Pressed, Released, Tapped, DoubleTapped, Held, HeldReleased
|
||||
/// </summary>
|
||||
/// <param name="number"></param>
|
||||
/// <param name="type"></param>
|
||||
public void Press(string number, string 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(number)) { return; }
|
||||
var but = _Buttons[number];
|
||||
if (but.EventTypes.ContainsKey(type))
|
||||
{
|
||||
foreach (var a in but.EventTypes[type]) { DeviceJsonApi.DoDeviceAction(a); }
|
||||
}
|
||||
}
|
||||
switch (key)
|
||||
{
|
||||
case ("power"):
|
||||
{
|
||||
if (buttonEventTypes == null || buttonEventTypes.Keys == null)
|
||||
_touchpanel.DisablePowerButton();
|
||||
else
|
||||
_touchpanel.EnablePowerButton();
|
||||
|
||||
|
||||
}
|
||||
enabledFb = _touchpanel.PowerButtonEnabledFeedBack;
|
||||
disabledFb = _touchpanel.PowerButtonDisabledFeedBack;
|
||||
|
||||
/// <summary>
|
||||
/// Represents the configuration of a keybad buggon
|
||||
/// </summary>
|
||||
public class KeypadButton
|
||||
{
|
||||
public Dictionary<string, DeviceActionWrapper[]> EventTypes { get; set; }
|
||||
public KeypadButtonFeedback Feedback { get; set; }
|
||||
break;
|
||||
}
|
||||
//case ("volumeup"):
|
||||
// {
|
||||
// break;
|
||||
// }
|
||||
//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>
|
||||
///
|
||||
/// </summary>
|
||||
public class KeypadButtonFeedback
|
||||
{
|
||||
public string DeviceKey { get; set; }
|
||||
public string FeedbackName { get; set; }
|
||||
}
|
||||
enabledFb = _touchpanel.MuteButtonEnabledFeedBack;
|
||||
disabledFb = _touchpanel.MuteButtonDisabledFeedBack;
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
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 Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.WebScripting;
|
||||
using Crestron.SimplSharpPro.Diagnostics;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Core.Web;
|
||||
using PepperDash.Essentials.Core.Web.RequestHandlers;
|
||||
@@ -20,13 +17,13 @@ namespace PepperDash.Essentials.Core.Web
|
||||
/// http(s)://{ipaddress}/cws/{basePath}
|
||||
/// http(s)://{ipaddress}/VirtualControl/Rooms/{roomId}/cws/{basePath}
|
||||
/// </example>
|
||||
private readonly string _defaultBasePath =
|
||||
CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance ? string.Format("/app{0:00}/api", InitialParametersClass.ApplicationNumber) : "/api";
|
||||
private readonly string _defaultBasePath = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance
|
||||
? 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 DebugInfo = 0;
|
||||
private const int DebugVerbose = 0;
|
||||
private const int DebugInfo = 1;
|
||||
private const int DebugVerbose = 2;
|
||||
|
||||
/// <summary>
|
||||
/// CWS base path
|
||||
@@ -98,11 +95,6 @@ namespace PepperDash.Essentials.Core.Web
|
||||
Name = "DevProps",
|
||||
RouteHandler = new DevPropsRequestHandler()
|
||||
},
|
||||
//new HttpCwsRoute("devprops/{key}")
|
||||
//{
|
||||
// Name = "DevProps",
|
||||
// RouteHandler = new DevPropsRequestHandler()
|
||||
//},
|
||||
new HttpCwsRoute("devjson")
|
||||
{
|
||||
Name = "DevJson",
|
||||
@@ -113,11 +105,6 @@ namespace PepperDash.Essentials.Core.Web
|
||||
Name = "SetDeviceStreamDebug",
|
||||
RouteHandler = new SetDeviceStreamDebugRequestHandler()
|
||||
},
|
||||
//new HttpCwsRoute("setdevicestreamdebug/{deviceKey}/{state}")
|
||||
//{
|
||||
// Name = "SetDeviceStreamDebug",
|
||||
// RouteHandler = new SetDeviceStreamDebugRequestHandler()
|
||||
//},
|
||||
new HttpCwsRoute("disableallstreamdebug")
|
||||
{
|
||||
Name = "DisableAllStreamDebug",
|
||||
@@ -173,12 +160,7 @@ namespace PepperDash.Essentials.Core.Web
|
||||
if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
|
||||
{
|
||||
/*
|
||||
RMC4>
|
||||
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;
|
||||
CrestronConsole.SendControlSystemCommand("webserver", ref response);
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp.WebScripting;
|
||||
using Crestron.SimplSharp.WebScripting;
|
||||
using Newtonsoft.Json;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Core.Web.RequestHandlers;
|
||||
@@ -10,25 +8,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
public class AppDebugRequestHandler : WebApiBaseRequestHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -37,7 +24,7 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
/// <param name="context"></param>
|
||||
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);
|
||||
|
||||
@@ -46,40 +33,7 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(body, false);
|
||||
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>
|
||||
@@ -107,7 +61,7 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
|
||||
var appDebug = new AppDebug();
|
||||
var requestBody = JsonConvert.DeserializeAnonymousType(data, appDebug);
|
||||
|
||||
|
||||
Debug.SetDebugLevel(requestBody.Level);
|
||||
|
||||
appDebug.Level = Debug.Level;
|
||||
@@ -118,33 +72,11 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(responseBody, false);
|
||||
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
|
||||
{
|
||||
[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
|
||||
{
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// base(true) enables CORS support by default
|
||||
/// </remarks>
|
||||
public DefaultRequestHandler()
|
||||
: base(true)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// </summary>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp.WebScripting;
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Core.Web.RequestHandlers;
|
||||
|
||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
@@ -8,69 +8,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
public class DevJsonRequestHandler : WebApiBaseRequestHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -108,32 +53,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.Console(1, "Exception Message: {0}", ex.Message);
|
||||
Debug.Console(2, "Exception Stack Trace: {0}", ex.StackTrace);
|
||||
if(ex.InnerException != null) Debug.Console(2, "Exception Inner: {0}", ex.InnerException);
|
||||
|
||||
context.Response.StatusCode = 400;
|
||||
context.Response.StatusDescription = "Bad Request";
|
||||
context.Response.End();
|
||||
}
|
||||
}
|
||||
|
||||
/// <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
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -58,71 +47,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(js, false);
|
||||
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 Newtonsoft.Json;
|
||||
using PepperDash.Core.Web.RequestHandlers;
|
||||
@@ -9,69 +8,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
public class DevPropsRequestHandler : WebApiBaseRequestHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -128,27 +72,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(deviceProps, false);
|
||||
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
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -83,27 +28,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.StatusDescription = "OK";
|
||||
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
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -109,71 +98,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(js, false);
|
||||
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
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -84,74 +73,6 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
||||
context.Response.Write(js, false);
|
||||
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
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -102,71 +91,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(js, false);
|
||||
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 Newtonsoft.Json;
|
||||
using Full.Newtonsoft.Json;
|
||||
using PepperDash.Core.Web.RequestHandlers;
|
||||
|
||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
@@ -8,25 +10,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
public class GetTypesByFilterRequestHandler : WebApiBaseRequestHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -75,71 +66,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(js, false);
|
||||
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 Newtonsoft.Json;
|
||||
using Full.Newtonsoft.Json;
|
||||
using PepperDash.Core.Web.RequestHandlers;
|
||||
|
||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
@@ -8,25 +10,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
public class GetTypesRequestHandler : WebApiBaseRequestHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -65,71 +56,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(js, false);
|
||||
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 Newtonsoft.Json;
|
||||
using Full.Newtonsoft.Json;
|
||||
using PepperDash.Core.Web.RequestHandlers;
|
||||
|
||||
namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
@@ -8,25 +10,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
public class ReportVersionsRequestHandler : WebApiBaseRequestHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -56,71 +47,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(js, false);
|
||||
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;
|
||||
using Newtonsoft.Json;
|
||||
extern alias Full
|
||||
|
||||
using Crestron.SimplSharp.WebScripting;
|
||||
using Full.Newtonsoft.Json;
|
||||
using PepperDash.Core.Web.RequestHandlers;
|
||||
using PepperDash.Essentials.Core.Config;
|
||||
|
||||
@@ -8,25 +10,14 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
public class ShowConfigRequestHandler : WebApiBaseRequestHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles CONNECT method requests
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
protected override void HandleConnect(HttpCwsContext context)
|
||||
/// <remarks>
|
||||
/// 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>
|
||||
@@ -44,71 +35,5 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers
|
||||
context.Response.Write(config, false);
|
||||
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