Compare commits

...

35 Commits

Author SHA1 Message Date
Neil Dorin
c56caff1cb Merge branch 'development' into feature/dmps-dm-fixes 2022-06-21 12:12:35 -06:00
Andrew Welker
5131e73567 Merge pull request #944 from PepperDash/hotfix/zoom-recording-prompt
Hotfix/zoom recording prompt
2022-06-21 13:11:45 -05:00
Neil Dorin
e02c267988 Merge branch 'development' into hotfix/zoom-recording-prompt 2022-06-21 11:47:33 -06:00
Alex Johnson
53c9f9e664 Fixes issue where sometimes clear route doesn't work on DMPS3 2022-06-17 14:42:51 -04:00
Alex Johnson
5b94d89bc3 Improvements for DMPS3-4K-150 types 2022-06-15 20:26:32 -04:00
Alex Johnson
6dbdd0587d Reworks audio routing on DMPS-4K units. 2022-06-15 08:49:52 -04:00
Alex Johnson
1a5d4896e1 Fixes online feedback for DM endpoints that are attached to a 3 series DM chassis or a DMPS-4K unit. 2022-06-14 10:43:29 -04:00
Alex Johnson
50e9a7935f Adds HD-MD-8xn switcher type support 2022-06-14 10:25:06 -04:00
Alex Johnson
03e4c913ac Adds HD-MD-8xn switcher type support 2022-06-14 10:24:19 -04:00
Alex Johnson
b26e1b97aa Removes redundant check for DMPS-4K type. Property exists elsewhere 2022-06-14 10:23:51 -04:00
Alex Johnson
60b6cea697 Adds digital audio output volume control for DMPS to bridge 2022-06-14 10:13:02 -04:00
Alex Johnson
dfc0915fe0 Adds DM switcher name to bridge 2022-06-14 09:56:40 -04:00
Alex Johnson
96e3d52b95 Switch DMPS units to only wait until devices are registered before continuing. No need to wait for devices to be activated. 2022-06-14 09:43:59 -04:00
Andrew Welker
a74753d4a3 Merge pull request #923 from PepperDash/feature/fileio
feature: add static fileio class to read and write files
2022-05-03 15:28:09 -06:00
Andrew Welker
768a93d44d Merge branch 'development' into feature/fileio 2022-05-02 13:40:30 -06:00
Andrew Welker
46cb10f452 Merge pull request #937 from PepperDash/hotfix/zoomroom-duplicate-passwordRequired-eventhandlers
Hotfix/zoomroom duplicate password required eventhandlers
2022-05-02 13:40:12 -06:00
Andrew Welker
5386f0fffb Merge branch 'development' into feature/fileio 2022-04-28 10:07:48 -06:00
Andrew Welker
ad3ae0de69 Merge branch 'development' into hotfix/zoomroom-duplicate-passwordRequired-eventhandlers 2022-04-28 10:07:24 -06:00
Andrew Welker
892167d236 Merge pull request #938 from PepperDash/release/1.10.0
Release/1.10.0
2022-04-28 10:07:06 -06:00
Andrew Welker
e843098ac3 Merge branch 'development' into release/1.10.0 2022-04-28 09:05:25 -06:00
Jason T Alborough
1566e04edf Merge branch 'development' into feature/fileio 2022-04-20 14:20:05 -04:00
Jason Alborough
f902a57f60 feature: add fileLock for reads 2022-04-19 15:19:27 -04:00
Jason Alborough
33c7038d99 feature: write file is now on a low priority thread.
feature: add asynchronous read file methods and event
2022-03-24 17:50:34 -04:00
Trevor Payne
7f36a00813 Merge pull request #926 from PepperDash/feature/add-room-factories
feat: add ability to build rooms with extant device factory
2022-03-23 15:51:20 -05:00
Trevor Payne
c4843d68f4 feat: add ability to build rooms with extant device factory
RESOLVES #925
2022-03-23 15:28:25 -05:00
Jason Alborough
7e8d88c3af fix: fix method name in test 2022-03-21 18:32:34 -04:00
Jason Alborough
c539c79135 fix: fix case on \user\ folder path for four series support. 2022-03-21 17:08:36 -04:00
Jason Alborough
281b6f065f fix: remove method FileExsists
fix: fixed casing in debug statement
fix: changed the method name to ReadDataFromFile.
feature: added an overload ReadDataFromFile(string)
2022-03-21 17:06:18 -04:00
Jason Alborough
acfbefca00 feature: add static fileio class to read and write files 2022-03-15 09:33:06 -04:00
Trevor Payne
397c0f250b Merge pull request #916 from PepperDash/feature/split-volume-interfaces-for-composition
Feature/split volume interfaces for composition
2022-03-14 23:17:26 -05:00
Trevor Payne
a1dce1bb17 Merge branch 'development' into feature/split-volume-interfaces-for-composition 2022-03-14 22:58:13 -05:00
Nick Genovese
15aacbd8c8 Merge pull request #910 from PepperDash/bugfix/lightingBase-sceneIndex
Updates to forEach loop sceneIndex to include local sceneIndex context
2022-03-14 20:32:42 -04:00
Nick Genovese
34a695ba95 feat (essentials): fixed a few build issues with the new volume interfaces 2022-03-14 19:51:55 -04:00
Nick Genovese
0ab1ece445 feat (essentials): split up volume interfaces for better composition
fix (essentials): fixed a few misc devices that are probably deprecated anyhow
2022-03-14 19:26:50 -04:00
Jonathan Arndt
747c68bd1e Updates to forEach loop sceneIndex to include local sceneIndex context 2022-02-16 22:17:45 -08:00
24 changed files with 1972 additions and 355 deletions

View File

@@ -53,14 +53,14 @@ namespace PepperDash.Essentials
// to allow any HD-BaseT DM endpoints to register first.
if (Global.ControlSystemIsDmpsType)
{
Debug.Console(2, "******************* InitializeSystem() Entering **********************");
Debug.Console(1, "******************* InitializeSystem() Entering **********************");
_initializeEvent = new CEvent();
DeviceManager.AllDevicesActivated += (o, a) =>
DeviceManager.AllDevicesRegistered += (o, a) =>
{
_initializeEvent.Set();
Debug.Console(2, "******************* InitializeSystem() Exiting **********************");
Debug.Console(1, "******************* InitializeSystem() Exiting **********************");
};
_initializeEvent.Wait(30000);
@@ -490,21 +490,17 @@ namespace PepperDash.Essentials
}
}
AddRoomAndBuildMC(room);
if (room is IEssentialsHuddleSpaceRoom)
{
DeviceManager.AddDevice(room);
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is EssentialsHuddleSpaceRoom, attempting to add to DeviceManager with Fusion with IP-ID {0:X2}", fusionIpId);
DeviceManager.AddDevice(new Core.Fusion.EssentialsHuddleSpaceFusionSystemControllerBase(room, fusionIpId, fusionJoinMapKey));
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
CreateMobileControlBridge(room);
}
else if (room is IEssentialsHuddleVtc1Room)
{
DeviceManager.AddDevice(room);
if (!(room is EssentialsCombinedHuddleVtc1Room))
{
@@ -512,28 +508,15 @@ namespace PepperDash.Essentials
DeviceManager.AddDevice(new EssentialsHuddleVtc1FusionController((IEssentialsHuddleVtc1Room)room, fusionIpId, fusionJoinMapKey));
}
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge...");
CreateMobileControlBridge(room);
}
else if (room is EssentialsTechRoom)
{
DeviceManager.AddDevice(room);
Debug.Console(0, Debug.ErrorLogLevel.Notice,
"Room is EssentialsTechRoom, Attempting to add to DeviceManager with Fusion with IP-ID {0:X2}", fusionIpId);
DeviceManager.AddDevice(new EssentialsTechRoomFusionSystemController((EssentialsTechRoom)room, fusionIpId, fusionJoinMapKey));
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge");
CreateMobileControlBridge(room);
}
else
{
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Room is NOT EssentialsRoom, attempting to add to DeviceManager w/o Fusion");
DeviceManager.AddDevice(room);
}
fusionIpId += 1;
}
else
@@ -547,6 +530,15 @@ namespace PepperDash.Essentials
}
private static void AddRoomAndBuildMC(IEssentialsRoom room)
{
DeviceManager.AddDevice(room);
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to build Mobile Control Bridge");
CreateMobileControlBridge(room);
}
private static void CreateMobileControlBridge(object room)
{
var mobileControl = GetMobileControlDevice();

View File

@@ -19,32 +19,41 @@ namespace PepperDash.Essentials.Room.Config
/// Returns a room object from this config data
/// </summary>
/// <returns></returns>
public static Device GetRoomObject(DeviceConfig roomConfig)
public static IKeyed GetRoomObject(DeviceConfig roomConfig)
{
var typeName = roomConfig.Type.ToLower();
if (typeName == "huddle")
{
return new EssentialsHuddleSpaceRoom(roomConfig);
}
if (typeName == "huddlevtc1")
switch (typeName)
{
return new EssentialsHuddleVtc1Room(roomConfig);
case "huddle" :
{
return new EssentialsHuddleSpaceRoom(roomConfig);
}
case "huddlevtc1" :
{
return new EssentialsHuddleVtc1Room(roomConfig);
}
case "ddvc01bridge" :
{
return new Device(roomConfig.Key, roomConfig.Name); // placeholder device that does nothing.
}
case "dualdisplay" :
{
return new EssentialsDualDisplayRoom(roomConfig);
}
case "combinedhuddlevtc1" :
{
return new EssentialsCombinedHuddleVtc1Room(roomConfig);
}
case "techroom" :
{
return new EssentialsTechRoom(roomConfig);
}
default :
{
return Core.DeviceFactory.GetDevice(roomConfig);
}
}
if (typeName == "ddvc01bridge")
{
return new Device(roomConfig.Key, roomConfig.Name); // placeholder device that does nothing.
}
if (typeName == "dualdisplay")
{
return new EssentialsDualDisplayRoom(roomConfig);
}
if (typeName == "combinedhuddlevtc1")
{
return new EssentialsCombinedHuddleVtc1Room(roomConfig);
}
return typeName != "techroom" ? null : new EssentialsTechRoom(roomConfig);
}
/// <summary>

View File

@@ -24,6 +24,10 @@ namespace PepperDash.Essentials.Core.Bridges
JoinType = eJoinType.Digital
});
[JoinName("Name")]
public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
new JoinMetadata { Description = "DM Chassis Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
[JoinName("SystemId")]
public JoinDataComplete SystemId = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
new JoinMetadata { Description = "DM Chassis SystemId Get/Set/Trigger/", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalAnalog });

View File

@@ -17,6 +17,10 @@ namespace PepperDash.Essentials.Core.Bridges
public JoinDataComplete MixerPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
new JoinMetadata { Description = "Mixer Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
[JoinName("MixerEqPresetRecall")]
public JoinDataComplete MixerEqPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
new JoinMetadata { Description = "Mixer Eq Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
[JoinName("MasterVolumeMuteOn")]
public JoinDataComplete MasterVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
new JoinMetadata { Description = "Master Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });

View File

@@ -1,4 +1,4 @@
using System;
using System;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Core.Bridges.JoinMaps
{
@@ -3111,4 +3111,4 @@ namespace PepperDash_Essentials_Core.Bridges.JoinMaps
{
}
}
}
}

View File

@@ -20,7 +20,7 @@ namespace PepperDash.Essentials.Core
/// </summary>
public FeedbackCollection<Feedback> Feedbacks { get; private set; }
public BoolFeedback IsOnline { get; private set; }
public BoolFeedback IsOnline { get; set; }
public BoolFeedback IsRegistered { get; private set; }
public StringFeedback IpConnectionsText { get; private set; }
@@ -73,11 +73,14 @@ namespace PepperDash.Essentials.Core
{
//Debug.Console(1, this, " Does not require registration. Skipping");
var response = Hardware.RegisterWithLogging(Key);
if (response != eDeviceRegistrationUnRegistrationResponse.Success)
if (Hardware.Registerable && !Hardware.Registered)
{
//Debug.Console(0, this, "ERROR: Cannot register Crestron device: {0}", response);
return false;
var response = Hardware.RegisterWithLogging(Key);
if (response != eDeviceRegistrationUnRegistrationResponse.Success)
{
//Debug.Console(0, this, "ERROR: Cannot register Crestron device: {0}", response);
return false;
}
}
IsRegistered.FireUpdate();
@@ -86,7 +89,10 @@ namespace PepperDash.Essentials.Core
{
AddPostActivationAction(() =>
{
var response = Hardware.RegisterWithLogging(Key);
if (Hardware.Registerable && !Hardware.Registered)
{
var response = Hardware.RegisterWithLogging(Key);
}
IsRegistered.FireUpdate();
});

View File

@@ -14,6 +14,7 @@ namespace PepperDash.Essentials.Core
public static class DeviceManager
{
public static event EventHandler<EventArgs> AllDevicesActivated;
public static event EventHandler<EventArgs> AllDevicesRegistered;
private static readonly CCriticalSection DeviceCriticalSection = new CCriticalSection();
private static readonly CEvent AllowAddDevicesCEvent = new CEvent(false, true);
@@ -57,6 +58,8 @@ namespace PepperDash.Essentials.Core
{
try
{
OnAllDevicesRegistered();
DeviceCriticalSection.Enter();
AddDeviceEnabled = false;
// PreActivate all devices
@@ -129,6 +132,15 @@ namespace PepperDash.Essentials.Core
}
}
private static void OnAllDevicesRegistered()
{
var handler = AllDevicesRegistered;
if (handler != null)
{
handler(null, new EventArgs());
}
}
/// <summary>
/// Calls activate on all Device class items
/// </summary>

View File

@@ -7,25 +7,53 @@ using Crestron.SimplSharp;
namespace PepperDash.Essentials.Core
{
/// <summary>
/// Defines minimal volume control methods
/// Defines minimal volume and mute control methods
/// </summary>
public interface IBasicVolumeControls
public interface IBasicVolumeControls : IHasVolumeControl, IHasMuteControl
{
void VolumeUp(bool pressRelease);
void VolumeDown(bool pressRelease);
void MuteToggle();
}
/// <summary>
/// Defines basic volume control methods
/// </summary>
public interface IHasVolumeControl
{
void VolumeUp(bool pressRelease);
void VolumeDown(bool pressRelease);
}
/// <summary>
/// Defines volume control methods and properties with feedback
/// </summary>
public interface IHasVolumeControlWithFeedback : IHasVolumeControl
{
void SetVolume(ushort level);
IntFeedback VolumeLevelFeedback { get; }
}
/// <summary>
/// Defines basic mute control methods
/// </summary>
public interface IHasMuteControl
{
void MuteToggle();
}
/// <summary>
/// Defines mute control methods and properties with feedback
/// </summary>
public interface IHasMuteControlWithFeedback : IHasMuteControl
{
BoolFeedback MuteFeedback { get; }
void MuteOn();
void MuteOff();
}
/// <summary>
/// Adds feedback and direct volume level set to IBasicVolumeControls
/// </summary>
public interface IBasicVolumeWithFeedback : IBasicVolumeControls
public interface IBasicVolumeWithFeedback : IBasicVolumeControls, IHasVolumeControlWithFeedback, IHasMuteControlWithFeedback
{
void SetVolume(ushort level);
void MuteOn();
void MuteOff();
IntFeedback VolumeLevelFeedback { get; }
BoolFeedback MuteFeedback { get; }
}
/// <summary>

View File

@@ -0,0 +1,278 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Crestron.SimplSharp.CrestronIO;
using PepperDash.Core;
using Crestron.SimplSharpPro.CrestronThread;
namespace PepperDash.Essentials.Core
{
public static class FileIO
{
static CCriticalSection fileLock = new CCriticalSection();
public delegate void GotFileEventHandler(object sender, FileEventArgs e);
public static event GotFileEventHandler GotFileEvent;
/// <summary>
/// Get the full file info from a path/filename, can include wildcards.
/// </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 GetFile(string fileName)
{
DirectoryInfo dirInfo = new DirectoryInfo(Path.GetDirectoryName(fileName));
var files = dirInfo.GetFiles(Path.GetFileName(fileName));
Debug.Console(0, "FileIO found: {0}, {1}", files.Count(), fileName);
if (files.Count() > 0)
{
return files.FirstOrDefault();
}
else
{
return null;
}
}
/// <summary>
/// Get the data from string path/filename
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static string ReadDataFromFile(string fileName)
{
try
{
return ReadDataFromFile(GetFile(fileName));
}
catch (Exception e)
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
return "";
}
}
/// <summary>
/// Get the data with fileInfo object
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static string ReadDataFromFile(FileInfo file)
{
try
{
if (fileLock.TryEnter())
{
DirectoryInfo dirInfo = new DirectoryInfo(file.Name);
Debug.Console(2, "FileIO Getting Data {0}", file.FullName);
if (File.Exists(file.FullName))
{
using (StreamReader r = new StreamReader(file.FullName))
{
return r.ReadToEnd();
}
}
else
{
Debug.Console(2, "File {0} does not exsist", file.FullName);
return "";
}
}
else
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock");
return "";
}
}
catch (Exception e)
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
return "";
}
finally
{
if (fileLock != null && !fileLock.Disposed)
fileLock.Leave();
}
}
public static void ReadDataFromFileASync(string fileName)
{
try
{
ReadDataFromFileASync(GetFile(fileName));
}
catch (Exception e)
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
}
}
public static void ReadDataFromFileASync(FileInfo file)
{
try
{
CrestronInvoke.BeginInvoke(o => _ReadDataFromFileASync(file));
}
catch (Exception e)
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
}
}
private static void _ReadDataFromFileASync(FileInfo file)
{
string data;
try
{
if (fileLock.TryEnter())
{
DirectoryInfo dirInfo = new DirectoryInfo(file.Name);
Debug.Console(2, "FileIO Getting Data {0}", file.FullName);
if (File.Exists(file.FullName))
{
using (StreamReader r = new StreamReader(file.FullName))
{
data = r.ReadToEnd();
}
}
else
{
Debug.Console(2, "File {0} Does not exsist", file.FullName);
data = "";
}
GotFileEvent.Invoke(null, new FileEventArgs(data));
}
else
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock");
}
}
catch (Exception e)
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO read failed: \r{0}", e);
data = "";
}
finally
{
if (fileLock != null && !fileLock.Disposed)
fileLock.Leave();
}
}
/// <summary>
///
/// </summary>
/// <param name="data"></param>
/// <param name="filePath"></param>
/// <summary>
///
/// </summary>
/// <param name="data"></param>
/// <param name="filePath"></param>
public static void WriteDataToFile(string data, string filePath)
{
Thread _WriteFileThread;
_WriteFileThread = new Thread((O) => _WriteFileMethod(data, filePath), null, Thread.eThreadStartOptions.CreateSuspended);
_WriteFileThread.Priority = Thread.eThreadPriority.LowestPriority;
_WriteFileThread.Start();
Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WriteFile Thread");
}
static object _WriteFileMethod(string data, string filePath)
{
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Attempting to write file: '{0}'", filePath);
try
{
if (fileLock.TryEnter())
{
using (StreamWriter sw = new StreamWriter(filePath))
{
sw.Write(data);
sw.Flush();
}
}
else
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "FileIO Unable to enter FileLock");
}
}
catch (Exception e)
{
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: FileIO write failed: \r{0}", e);
}
finally
{
if (fileLock != null && !fileLock.Disposed)
fileLock.Leave();
}
return null;
}
/// <summary>
///
/// </summary>
/// <returns></returns>
public static bool FileIoUnitTest()
{
var testData = "Testing FileIO";
FileIO.WriteDataToFile(testData, "\\user\\FileIOTest.pdt");
var file = FileIO.GetFile("\\user\\*FileIOTest*");
var readData = FileIO.ReadDataFromFile(file);
Debug.Console(0, "Returned {0}", readData);
File.Delete(file.FullName);
if (testData == readData)
{
return true;
}
else
{
return false;
}
}
}
public class FileEventArgs
{
public FileEventArgs(string data) { Data = data; }
public string Data { get; private set; } // readonly
}
}

View File

@@ -6,6 +6,7 @@ using System.Collections.Generic;
using Crestron.SimplSharp.CrestronIO;
using Crestron.SimplSharp.CrestronDataStore;
using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DM;
using PepperDash.Core;
using PepperDash.Essentials.License;
@@ -39,7 +40,14 @@ namespace PepperDash.Essentials.Core
{
get
{
return ControlSystem.ControllerPrompt.ToLower().IndexOf("dmps") > -1;
if(ControlSystem.SystemControl != null)
{
if(ControlSystem.SystemControl.SystemControlType > 0)
{
return true;
}
}
return false;
}
}
@@ -50,7 +58,39 @@ namespace PepperDash.Essentials.Core
{
get
{
return ControlSystemIsDmpsType && ControlSystem.ControllerPrompt.ToLower().IndexOf("4k") > -1;
if(ControlSystem.SystemControl != null)
{
if(ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K150CSystemControl ||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K200CSystemControl ||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl ||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K300CSystemControl ||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
{
return true;
}
}
return false;
}
}
/// <summary>
/// True when the processor type is a DMPS 4K 200/300/250/350 variant
/// </summary>
public static bool ControlSystemIsDmps4k3xxType
{
get
{
if(ControlSystem.SystemControl != null)
{
if(ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K200CSystemControl ||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl ||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K300CSystemControl ||
ControlSystem.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
{
return true;
}
}
return false;
}
}

View File

@@ -99,13 +99,18 @@ namespace PepperDash.Essentials.Core.Lighting
var sceneIndex = 0;
foreach (var scene in lightingDevice.LightingScenes)
{
trilist.SetSigTrueAction((uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex), () => lightingDevice.SelectScene(lightingDevice.LightingScenes[sceneIndex]));
var index1 = sceneIndex;
trilist.SetSigTrueAction((uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex), () =>
{
var index = index1;
Debug.Console(2, this, "LightingDevice: sceneIndex: {0} index: {1} > inside action", index1, index);
lightingDevice.SelectScene(lightingDevice.LightingScenes[index]);
});
scene.IsActiveFeedback.LinkInputSig(trilist.BooleanInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)]);
trilist.StringInput[(uint)(joinMap.SelectSceneDirect.JoinNumber + sceneIndex)].StringValue = scene.Name;
trilist.BooleanInput[(uint)(joinMap.ButtonVisibility.JoinNumber + sceneIndex)].BoolValue = true;
sceneIndex++;
}
return joinMap;
}

View File

@@ -224,6 +224,7 @@
<Compile Include="Feedbacks\IntFeedback.cs" />
<Compile Include="Feedbacks\SerialFeedback.cs" />
<Compile Include="Feedbacks\StringFeedback.cs" />
<Compile Include="File\FileIO.cs" />
<Compile Include="Fusion\EssentialsHuddleSpaceFusionSystemControllerBase.cs" />
<Compile Include="Fusion\FusionCustomPropertiesBridge.cs" />
<Compile Include="Fusion\FusionEventHandlers.cs" />

View File

@@ -1482,6 +1482,8 @@ namespace PepperDash.Essentials.DM
LinkChassisToApi(trilist, joinMap);
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
// Link up inputs & outputs
for (uint i = 1; i <= Chassis.NumberOfOutputs; i++)
{

View File

@@ -17,52 +17,89 @@ using PepperDash.Essentials.DM.Config;
namespace PepperDash.Essentials.DM
{
/// <summary>
/// Exposes the volume levels for Program, Aux1 or Aux2 outputs on a DMPS3 chassis
/// Exposes the volume levels for Program, Aux1, Aux2, Codec1, Codec2, and Digital outputs on a DMPS3 chassis
/// </summary>
public class DmpsAudioOutputController : EssentialsBridgeableDevice
{
Card.Dmps3OutputBase OutputCard;
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)
{
OutputCard = card;
OutputCard.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
card.BaseDevice.DMOutputChange += new DMOutputEventHandler(BaseDevice_DMOutputChange);
if (card is Card.Dmps3ProgramOutput)
{
MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3ProgramOutput).OutputMixer);
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
Codec1VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec1);
Codec2VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec2);
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)
{
MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3Aux1Output).OutputMixer);
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
Codec2VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec2);
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)
{
MasterVolumeLevel = new DmpsAudioOutputWithMixer(card, eDmpsLevelType.Master, (card as Card.Dmps3Aux2Output).OutputMixer);
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
Codec1VolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Codec1);
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 //Digital Outputs
else if (card is Card.Dmps3DigitalMixOutput)
{
MasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Master);
SourceVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.Source);
MicsMasterVolumeLevel = new DmpsAudioOutput(card, eDmpsLevelType.MicsMaster);
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);
}
}
@@ -185,6 +222,11 @@ namespace PepperDash.Essentials.DM
{
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)
@@ -234,21 +276,37 @@ namespace PepperDash.Essentials.DM
}
}
public class DmpsAudioOutputWithMixer : DmpsAudioOutput
public class DmpsAudioOutputWithMixerAndEq : DmpsAudioOutputWithMixer
{
CrestronControlSystem.Dmps3OutputMixerWithMonoAndStereo Mixer;
public DmpsAudioOutputWithMixer(Card.Dmps3OutputBase output, eDmpsLevelType type, CrestronControlSystem.Dmps3OutputMixerWithMonoAndStereo mixer)
private CrestronControlSystem.Dmps3OutputEqualizer Eq;
public DmpsAudioOutputWithMixerAndEq(Dmps3AudioOutputWithMixerBase output, eDmpsLevelType type, CrestronControlSystem.Dmps3OutputEqualizer eq)
: base(output, type)
{
Mixer = mixer;
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)Mixer.MinVolumeFeedback.UShortValue;
MinLevel = (short)Output.MinVolumeFeedback.UShortValue;
if (VolumeLevelScaledFeedback != null)
{
VolumeLevelScaledFeedback.FireUpdate();
@@ -257,7 +315,7 @@ namespace PepperDash.Essentials.DM
public void GetVolumeMax()
{
MaxLevel = (short)Mixer.MaxVolumeFeedback.UShortValue;
MaxLevel = (short)Output.MaxVolumeFeedback.UShortValue;
if (VolumeLevelScaledFeedback != null)
{
VolumeLevelScaledFeedback.FireUpdate();
@@ -266,23 +324,36 @@ namespace PepperDash.Essentials.DM
public void RecallPreset(ushort preset)
{
Debug.Console(1, "DMPS Recalling Preset {0}", preset);
Mixer.PresetNumber.UShortValue = preset;
Mixer.RecallPreset();
Output.PresetNumber.UShortValue = preset;
Output.RecallPreset();
if (!Global.ControlSystemIsDmps4kType)
{
//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
{
Card.Dmps3OutputBase Output;
eDmpsLevelType Type;
UShortInputSig Level;
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; }
@@ -292,9 +363,8 @@ namespace PepperDash.Essentials.DM
Action<bool> VolumeUpAction;
Action<bool> VolumeDownAction;
public DmpsAudioOutput(Card.Dmps3OutputBase output, eDmpsLevelType type)
public DmpsAudioOutput(Dmps3AudioOutputBase output, eDmpsLevelType type)
{
Output = output;
VolumeLevelInput = 0;
EnableVolumeSend = false;
Type = type;
@@ -306,47 +376,46 @@ namespace PepperDash.Essentials.DM
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);
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:
{
Level = output.MicMasterLevel;
MuteFeedback = new BoolFeedback(new Func<bool>(() => Output.MicMasterMuteOnFeedBack.BoolValue));
VolumeLevelFeedback = new IntFeedback(new Func<int>(() => Output.MicMasterLevelFeedBack.UShortValue));
MuteOnAction = new Action(Output.MicMasterMuteOn);
MuteOffAction = new Action(Output.MicMasterMuteOff);
VolumeUpAction = new Action<bool>((b) => Output.MicMasterLevelUp.BoolValue = b);
VolumeDownAction = new Action<bool>((b) => Output.MicMasterLevelDown.BoolValue = b);
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);
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:
{
var programOutput = output as Card.Dmps3ProgramOutput;
if (programOutput != null)
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);
@@ -354,12 +423,10 @@ namespace PepperDash.Essentials.DM
VolumeUpAction = new Action<bool>((b) => programOutput.Codec1LevelUp.BoolValue = b);
VolumeDownAction = new Action<bool>((b) => programOutput.Codec1LevelDown.BoolValue = b);
}
else
else if (output.Card is Card.Dmps3Aux2Output)
{
var auxOutput = output as 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);
@@ -371,12 +438,10 @@ namespace PepperDash.Essentials.DM
}
case eDmpsLevelType.Codec2:
{
var programOutput = output as Card.Dmps3ProgramOutput;
if (programOutput != null)
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);
@@ -384,12 +449,11 @@ namespace PepperDash.Essentials.DM
VolumeUpAction = new Action<bool>((b) => programOutput.Codec2LevelUp.BoolValue = b);
VolumeDownAction = new Action<bool>((b) => programOutput.Codec2LevelDown.BoolValue = b);
}
else
else if (output.Card is Card.Dmps3Aux1Output)
{
var auxOutput = output as 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);
@@ -410,19 +474,26 @@ namespace PepperDash.Essentials.DM
public void SetVolumeScaled(ushort level)
{
Debug.Console(2, Debug.ErrorLogLevel.None, "Scaling DMPS volume:{0} level:{1} min:{2} max:{3}", Output.Name, level.ToString(), MinLevel.ToString(), MaxLevel.ToString());
VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
if (EnableVolumeSend == true)
if (ushort.MaxValue + MinLevel != 0)
{
Level.UShortValue = VolumeLevelInput;
VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
if (EnableVolumeSend == true)
{
Level.UShortValue = VolumeLevelInput;
}
}
}
public ushort ScaleVolumeFeedback(ushort level)
{
short signedLevel = (short)level;
Debug.Console(2, Debug.ErrorLogLevel.None, "Scaling DMPS volume:{0} feedback:{1} min:{2} max:{3}", Output.Name, signedLevel.ToString(), MinLevel.ToString(), MaxLevel.ToString());
return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
if (MaxLevel - MinLevel != 0)
{
return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
}
else
return (ushort)MinLevel;
}
public void SendScaledVolume(bool pressRelease)
@@ -476,6 +547,150 @@ namespace PepperDash.Essentials.DM
#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,

View File

@@ -0,0 +1,165 @@
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
}
}

View File

@@ -47,16 +47,23 @@ namespace PepperDash.Essentials.DM
{
get
{
if (InputCard.VideoSourceFeedback != eDmps3InputVideoSource.Auto)
return InputCard.VideoSourceFeedback;
else // auto
try
{
if (InputCard.HdmiInputPort.SyncDetectedFeedback.BoolValue)
return eDmps3InputVideoSource.Hdmi;
else if (InputCard.VgaInputPort.SyncDetectedFeedback.BoolValue)
return eDmps3InputVideoSource.Vga;
else
return eDmps3InputVideoSource.Bnc;
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;
}
}
}

View File

@@ -38,6 +38,9 @@ namespace PepperDash.Essentials.DM
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))

View File

@@ -26,13 +26,10 @@ namespace PepperDash.Essentials.DM
public CrestronControlSystem Dmps { get; set; }
public ISystemControl SystemControl { get; private set; }
public bool? EnableRouting { get; private set; }
//Check if DMPS is a DMPS3-4K type for endpoint creation
public bool Dmps4kType { get; private set; }
//IroutingNumericEvent
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
//Feedback for DMPS System Control
public BoolFeedback SystemPowerOnFeedback { get; private set; }
public BoolFeedback SystemPowerOffFeedback { get; private set; }
@@ -62,6 +59,7 @@ namespace PepperDash.Essentials.DM
public Dictionary<uint, string> InputNames { get; set; }
public Dictionary<uint, string> OutputNames { get; set; }
public Dictionary<uint, DmCardAudioOutputController> VolumeControls { get; private set; }
public Dictionary<uint, DmpsDigitalOutputController> DigitalAudioOutputs { get; private set; }
public DmpsMicrophoneController Microphones { get; private set; }
public const int RouteOffTime = 500;
@@ -123,14 +121,13 @@ namespace PepperDash.Essentials.DM
/// <param name="chassis"></param>
public DmpsRoutingController(string key, string name, ISystemControl systemControl)
: base(key, name)
{
{
Dmps = Global.ControlSystem;
switch (systemControl.SystemControlType)
{
case eSystemControlType.Dmps34K150CSystemControl:
SystemControl = systemControl as Dmps34K150CSystemControl;
Dmps4kType = true;
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
break;
@@ -139,13 +136,11 @@ namespace PepperDash.Essentials.DM
case eSystemControlType.Dmps34K300CSystemControl:
case eSystemControlType.Dmps34K350CSystemControl:
SystemControl = systemControl as Dmps34K300CSystemControl;
Dmps4kType = true;
SystemPowerOnFeedback = new BoolFeedback(() => { return true; });
SystemPowerOffFeedback = new BoolFeedback(() => { return false; });
break;
default:
SystemControl = systemControl as Dmps3SystemControl;
Dmps4kType = false;
SystemPowerOnFeedback = new BoolFeedback(() =>
{
return ((Dmps3SystemControl)SystemControl).SystemPowerOnFeedBack.BoolValue;
@@ -156,11 +151,12 @@ namespace PepperDash.Essentials.DM
});
break;
}
Debug.Console(1, this, "DMPS Type = {0}, 4K Type = {1}", systemControl.SystemControlType, Dmps4kType);
Debug.Console(1, this, "DMPS Type = {0}, 4K Type = {1}", systemControl.SystemControlType, Global.ControlSystemIsDmps4kType);
InputPorts = new RoutingPortCollection<RoutingInputPort>();
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
VolumeControls = new Dictionary<uint, DmCardAudioOutputController>();
DigitalAudioOutputs = new Dictionary<uint, DmpsDigitalOutputController>();
TxDictionary = new Dictionary<uint, string>();
RxDictionary = new Dictionary<uint, string>();
@@ -252,13 +248,15 @@ namespace PepperDash.Essentials.DM
{
return;
}
foreach (var kvp in OutputNames)
{
var output = (Dmps.SwitcherOutputs[kvp.Key] as DMOutput);
if (output != null && output.Name.Type != eSigType.NA)
if (output != null)
{
output.Name.StringValue = kvp.Value;
if (output.Name.Supported && kvp.Value.Length > 0)
{
output.Name.StringValue = kvp.Value;
}
}
}
}
@@ -272,9 +270,12 @@ namespace PepperDash.Essentials.DM
foreach (var kvp in InputNames)
{
var input = (Dmps.SwitcherInputs[kvp.Key] as DMInput);
if (input != null && input.Name.Type != eSigType.NA)
if (input != null)
{
input.Name.StringValue = kvp.Value;
if (input.Name.Supported && kvp.Value.Length > 0)
{
input.Name.StringValue = kvp.Value;
}
}
}
}
@@ -382,9 +383,20 @@ namespace PepperDash.Essentials.DM
}
if (OutputNameFeedbacks[ioSlot] != null)
{
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputVideoNames.JoinNumber + ioSlotJoin]);
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.JoinNumber + ioSlotJoin]);
if (Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3DmOutput ||
Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3DmOutputBackend ||
Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3HdmiOutput ||
Dmps.SwitcherOutputs[ioSlot].CardInputOutputType == eCardInputOutputType.Dmps3HdmiOutputBackend)
{
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputVideoNames.JoinNumber + ioSlotJoin]);
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.JoinNumber + ioSlotJoin]);
}
else
{
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputAudioNames.JoinNumber + ioSlotJoin]);
}
}
if (OutputVideoRouteNameFeedbacks[ioSlot] != null)
{
@@ -406,13 +418,11 @@ namespace PepperDash.Essentials.DM
private void LinkInputsToApi(BasicTriList trilist, DmpsRoutingControllerJoinMap joinMap)
{
if (Dmps4kType)
if (Global.ControlSystemIsDmps4k3xxType)
{
//DMPS-4K audio inputs 1-5 are aux inputs
for (uint i = 1; i <= 5; i++)
{
trilist.StringInput[joinMap.InputAudioNames.JoinNumber + i - 1].StringValue = String.Format("Aux Input {0}", i);
}
//Add DMPS-4K mixer input names to end of inputs
trilist.StringInput[joinMap.InputAudioNames.JoinNumber + (uint)Dmps.SwitcherInputs.Count + 4].StringValue = "Digital Mixer 1";
trilist.StringInput[joinMap.InputAudioNames.JoinNumber + (uint)Dmps.SwitcherInputs.Count + 5].StringValue = "Digital Mixer 2";
}
for (uint i = 1; i <= Dmps.SwitcherInputs.Count; i++)
{
@@ -427,18 +437,19 @@ namespace PepperDash.Essentials.DM
trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber + ioSlotJoin]);
}
if (InputNameFeedbacks.ContainsKey(ioSlot) && InputNameFeedbacks[ioSlot] != null)
if (InputNameFeedbacks.ContainsKey(ioSlot) && InputNameFeedbacks[ioSlot] != null)
{
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + ioSlotJoin]);
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputVideoNames.JoinNumber + ioSlotJoin]);
if (Dmps4kType)
if (Dmps.SwitcherInputs[ioSlot] is Card.Dmps3AnalogAudioInput)
{
//DMPS-4K Audio Inputs are offset by 5
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + ioSlotJoin + 5]);
for (uint j = ioSlot; j < ioSlot + 5; j++)
{
InputNameFeedbacks[j].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + j - 1]);
}
}
else
{
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + ioSlotJoin]);
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputVideoNames.JoinNumber + ioSlotJoin]);
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputAudioNames.JoinNumber + ioSlotJoin]);
}
}
@@ -481,69 +492,143 @@ namespace PepperDash.Essentials.DM
{
foreach (var card in Dmps.SwitcherOutputs)
{
Debug.Console(1, this, "Output Card Type: {0}", card.CardInputOutputType);
var outputCard = card as DMOutput;
if (outputCard == null)
try
{
Debug.Console(1, this, "Output card {0} is not a DMOutput", card.CardInputOutputType);
continue;
}
Debug.Console(1, this, "Output Card Type: {0}", card.CardInputOutputType);
Debug.Console(1, this, "Adding Output Card Number {0} Type: {1}", outputCard.Number, outputCard.CardInputOutputType.ToString());
VideoOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
{
if (outputCard.VideoOutFeedback != null) { return (ushort)outputCard.VideoOutFeedback.Number; }
return 0;
;
});
AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
{
try
var outputCard = card as DMOutput;
if (outputCard == null)
{
if (outputCard.AudioOutFeedback != null)
{
return (ushort) outputCard.AudioOutFeedback.Number;
}
Debug.Console(1, this, "Output card {0} is not a DMOutput", card.CardInputOutputType);
continue;
}
Debug.Console(1, this, "Adding Output Card Number {0} Type: {1}", outputCard.Number, outputCard.CardInputOutputType.ToString());
VideoOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
{
if (outputCard.VideoOutFeedback != null) { return (ushort)outputCard.VideoOutFeedback.Number; }
return 0;
}
catch (NotSupportedException)
;
});
AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
{
return (ushort) outputCard.AudioOutSourceFeedback;
}
});
if (!Global.ControlSystemIsDmps4k3xxType)
{
if (outputCard.AudioOutFeedback != null)
{
return (ushort)outputCard.AudioOutFeedback.Number;
}
return 0;
}
else
{
OutputNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
{
//Special cases for DMPS-4K digital audio output
if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 0)
return 0;
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 1)
return (ushort)Dmps.SwitcherInputs.Count + 5;
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 2)
return (ushort)Dmps.SwitcherInputs.Count + 6;
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 3)
return (ushort)outputCard.VideoOutFeedback.Number;
else
return 0;
}
else if (outputCard.AudioOutSourceFeedback == eDmps34KAudioOutSource.NoRoute)
{
//Fixes for weird audio indexing on DMPS3-4K
return 0;
}
else if (outputCard.AudioOutSourceFeedback == eDmps34KAudioOutSource.AirMedia8)
{
//Fixes for weird audio indexing on DMPS3-4K
return 8;
}
else if (outputCard.AudioOutSourceFeedback == eDmps34KAudioOutSource.AirMedia9)
{
//Fixes for weird audio indexing on DMPS3-4K
return 9;
}
else if ((ushort)outputCard.AudioOutSourceFeedback <= 5)
{
//Move analog inputs to after regular dm cards
return (ushort)outputCard.AudioOutSourceFeedback + (ushort)Dmps.SwitcherInputs.Count - 1;
}
else
{
//Fixes for weird audio indexing on DMPS3-4K
return (ushort)outputCard.AudioOutSourceFeedback - 5;
}
}
});
OutputNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
{
if(OutputNames.ContainsKey(outputCard.Number))
{
return OutputNames[outputCard.Number];
}
else if (outputCard.NameFeedback != null && outputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(outputCard.NameFeedback.StringValue))
{
Debug.Console(2, this, "Output Card {0} Name: {1}", outputCard.Number, outputCard.NameFeedback.StringValue);
return outputCard.NameFeedback.StringValue;
}
return "";
});
OutputVideoRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
{
if (outputCard.VideoOutFeedback != null && outputCard.VideoOutFeedback.NameFeedback != null)
{
return outputCard.VideoOutFeedback.NameFeedback.StringValue;
}
return NoRouteText;
});
OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
{
if (!Global.ControlSystemIsDmps4k3xxType)
{
if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null)
{
return outputCard.AudioOutFeedback.NameFeedback.StringValue;
}
}
else
{
if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
{
//Special cases for DMPS-4K digital audio output
if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 0)
return NoRouteText;
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 1)
return "Digital Mix 1";
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 2)
return "Digital Mix 2";
else if (DigitalAudioOutputs[outputCard.Number].AudioSourceNumericFeedback.UShortValue == 3)
return outputCard.VideoOutFeedback.NameFeedback.StringValue;
else
return NoRouteText;
}
else
{
return outputCard.AudioOutSourceFeedback.ToString();
}
}
return NoRouteText;
});
OutputEndpointOnlineFeedbacks[outputCard.Number] = new BoolFeedback(() => outputCard.EndpointOnlineFeedback);
AddOutputCard(outputCard.Number, outputCard);
}
catch (Exception ex)
{
if (outputCard.NameFeedback != null && outputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(outputCard.NameFeedback.StringValue))
{
Debug.Console(2, this, "Output Card {0} Name: {1}", outputCard.Number, outputCard.NameFeedback.StringValue);
return outputCard.NameFeedback.StringValue;
}
return "";
});
OutputVideoRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
{
if (outputCard.VideoOutFeedback != null && outputCard.VideoOutFeedback.NameFeedback != null)
{
return outputCard.VideoOutFeedback.NameFeedback.StringValue;
}
return NoRouteText;
});
OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
{
if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null)
{
return outputCard.AudioOutFeedback.NameFeedback.StringValue;
}
return NoRouteText;
});
OutputEndpointOnlineFeedbacks[outputCard.Number] = new BoolFeedback(() => outputCard.EndpointOnlineFeedback);
AddOutputCard(outputCard.Number, outputCard);
Debug.LogError(Debug.ErrorLogLevel.Error, string.Format("DMPS Controller exception creating output card: {0}", ex));
}
}
}
@@ -569,13 +654,15 @@ namespace PepperDash.Essentials.DM
InputNameFeedbacks[inputCard.Number] = new StringFeedback(() =>
{
if (inputCard.NameFeedback != null && inputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(inputCard.NameFeedback.StringValue))
if (InputNames.ContainsKey(inputCard.Number))
{
return InputNames[inputCard.Number];
}
else if (inputCard.NameFeedback != null && inputCard.NameFeedback != CrestronControlSystem.NullStringOutputSig && !string.IsNullOrEmpty(inputCard.NameFeedback.StringValue))
{
Debug.Console(2, this, "Input Card {0} Name: {1}", inputCard.Number, inputCard.NameFeedback.StringValue);
return inputCard.NameFeedback.StringValue;
}
Debug.Console(2, this, "Input Card {0} Name is null", inputCard.Number);
return "";
});
@@ -609,7 +696,6 @@ namespace PepperDash.Essentials.DM
else if (inputCard is Card.Dmps3HdmiInput)
{
var hdmiInputCard = inputCard as Card.Dmps3HdmiInput;
var cecPort = hdmiInputCard.HdmiInputPort;
AddInputPortWithDebug(number, string.Format("HdmiIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Hdmi, cecPort);
@@ -641,17 +727,37 @@ namespace PepperDash.Essentials.DM
else if (inputCard is Card.Dmps3DmInput)
{
var hdmiInputCard = inputCard as Card.Dmps3DmInput;
var cecPort = hdmiInputCard.DmInputPort;
AddInputPortWithDebug(number, string.Format("DmIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.DmCat, cecPort);
}
else if (inputCard is Card.Dmps3VgaInput)
{
AddInputPortWithDebug(number, string.Format("VgaIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Vga);
}
else if (inputCard is Card.Dmps3AirMediaInput)
{
var airMediaInputCard = inputCard as Card.Dmps3AirMediaInput;
AddInputPortWithDebug(number, string.Format("AirMediaIn{0}", number), eRoutingSignalType.Audio | eRoutingSignalType.Video, eRoutingPortConnectionType.Streaming);
}
else if (inputCard is Card.Dmps3AnalogAudioInput)
{
for (uint i = 0; i <= 4; i++)
{
uint j = i + 1;
uint input = i + number;
InputNameFeedbacks[input] = new StringFeedback(() =>
{
if (InputNames.ContainsKey(input))
{
return InputNames[input];
}
else
{
return String.Format("Aux Input {0}", j);
}
});
}
}
}
@@ -697,22 +803,44 @@ namespace PepperDash.Essentials.DM
var cecPort = hdmiOutputCard.HdmiOutputPort;
AddHdmiOutputPort(number, cecPort);
var audioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number), string.Format("Hdmi Audio Output {0}", number), outputCard as Card.Dmps3HdmiOutput);
DeviceManager.AddDevice(audioOutput);
}
else if (outputCard is Card.Dmps3HdmiOutputBackend)
{
var hdmiOutputCard = outputCard as Card.Dmps3HdmiOutputBackend;
var cecPort = hdmiOutputCard.HdmiOutputPort;
AddHdmiOutputPort(number, cecPort);
var audioOutput = new DmpsDigitalOutputController(string.Format("processor-avRouting-HdmiAudioOut{0}", number), string.Format("Hdmi Audio Output {0} Router", number), hdmiOutputCard);
DigitalAudioOutputs.Add(number, audioOutput);
DeviceManager.AddDevice(audioOutput);
}
else if (outputCard is Card.Dmps3DmOutput)
{
AddDmOutputPort(number);
var audioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number), string.Format("Dm Audio Output {0}", number), outputCard as Card.Dmps3DmOutput);
DeviceManager.AddDevice(audioOutput);
}
else if (outputCard is Card.Dmps3DmOutputBackend)
{
AddDmOutputPort(number);
var audioOutput = new DmpsDigitalOutputController(string.Format("processor-avRouting-DmAudioOut{0}", number), string.Format("Dm Audio Output {0} Router", number), outputCard as Card.Dmps3DmOutputBackend);
DigitalAudioOutputs.Add(number, audioOutput);
DeviceManager.AddDevice(audioOutput);
}
else if (outputCard is Card.Dmps3DmHdmiAudioOutput)
{
var hdmiOutputCard = outputCard as Card.Dmps3DmHdmiAudioOutput;
var cecPort = hdmiOutputCard.HdmiOutputPort;
AddHdmiOutputPort(number, cecPort);
AddDmOutputPort(number);
AddAudioOnlyOutputPort(number, "Program");
var audioOutput = new DmpsAudioOutputController(string.Format("processor-programAudioOutput", number), string.Format("Program Audio Output {0}", number), hdmiOutputCard, hdmiOutputCard.AudioOutputStream);
DeviceManager.AddDevice(audioOutput);
var digitalAudioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number), string.Format("Hdmi Audio Output {0}", number), hdmiOutputCard, hdmiOutputCard.DmHdmiOutputStream);
DeviceManager.AddDevice(digitalAudioOutput);
}
else if (outputCard is Card.Dmps3ProgramOutput)
{
@@ -727,22 +855,22 @@ namespace PepperDash.Essentials.DM
switch (outputCard.CardInputOutputType)
{
case eCardInputOutputType.Dmps3Aux1Output:
{
AddAudioOnlyOutputPort(number, "Aux1");
{
AddAudioOnlyOutputPort(number, "Aux1");
var aux1Output = new DmpsAudioOutputController(string.Format("processor-aux1AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3Aux1Output);
var aux1Output = new DmpsAudioOutputController(string.Format("processor-aux1AudioOutput"), "Aux1 Audio Output", outputCard as Card.Dmps3Aux1Output);
DeviceManager.AddDevice(aux1Output);
}
DeviceManager.AddDevice(aux1Output);
}
break;
case eCardInputOutputType.Dmps3Aux2Output:
{
AddAudioOnlyOutputPort(number, "Aux2");
{
AddAudioOnlyOutputPort(number, "Aux2");
var aux2Output = new DmpsAudioOutputController(string.Format("processor-aux2AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3Aux2Output);
var aux2Output = new DmpsAudioOutputController(string.Format("processor-aux2AudioOutput"), "Aux2 Audio Output", outputCard as Card.Dmps3Aux2Output);
DeviceManager.AddDevice(aux2Output);
}
DeviceManager.AddDevice(aux2Output);
}
break;
}
}
@@ -766,6 +894,10 @@ namespace PepperDash.Essentials.DM
{
AddAudioOnlyOutputPort(number, "Dialer");
}
else if (outputCard is Card.Dmps3AecOutput)
{
AddAudioOnlyOutputPort(number, "Aec");
}
else if (outputCard is Card.Dmps3DigitalMixOutput)
{
if (number == (uint)CrestronControlSystem.eDmps34K250COutputs.Mix1
@@ -776,10 +908,9 @@ namespace PepperDash.Essentials.DM
|| number == (uint)CrestronControlSystem.eDmps34K300COutputs.Mix2
|| number == (uint)CrestronControlSystem.eDmps34K350COutputs.Mix2)
AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps34K250COutputs.Mix2.ToString());
}
else if (outputCard is Card.Dmps3AecOutput)
{
AddAudioOnlyOutputPort(number, "Aec");
var audioOutput = new DmpsAudioOutputController(string.Format("processor-digitalAudioOutput{0}", number % 2 + 1), string.Format("Digital Audio Mix {0}", number % 2 + 1), outputCard as Card.Dmps3DigitalMixOutput);
DeviceManager.AddDevice(audioOutput);
}
else
{
@@ -851,6 +982,7 @@ namespace PepperDash.Essentials.DM
void Dmps_DMInputChange(Switch device, DMInputEventArgs args)
{
Debug.Console(2, this, "DMInputChange Input: {0} EventId: {1}", args.Number, args.EventId.ToString());
try
{
switch (args.EventId)
@@ -861,6 +993,12 @@ namespace PepperDash.Essentials.DM
InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
break;
}
case (DMInputEventIds.EndpointOnlineEventId):
{
Debug.Console(2, this, "DM Input EndpointOnlineEventId for input: {0}. State: {1}", args.Number, device.Inputs[args.Number].EndpointOnlineFeedback);
InputEndpointOnlineFeedbacks[args.Number].FireUpdate();
break;
}
case (DMInputEventIds.VideoDetectedEventId):
{
Debug.Console(2, this, "DM Input {0} VideoDetectedEventId", args.Number);
@@ -885,14 +1023,13 @@ namespace PepperDash.Essentials.DM
}
void Dmps_DMOutputChange(Switch device, DMOutputEventArgs args)
{
Debug.Console(2, this, "DMOutputChange Output: {0} EventId: {1}", args.Number, args.EventId.ToString());
if (args.EventId == DMOutputEventIds.OutputVuFeedBackEventId)
{
//Frequently called event that isn't needed
return;
}
Debug.Console(2, this, "DMOutputChange Output: {0} EventId: {1}", args.Number, args.EventId.ToString());
var output = args.Number;
DMOutput outputCard = Dmps.SwitcherOutputs[output] as DMOutput;
@@ -906,6 +1043,11 @@ namespace PepperDash.Essentials.DM
{
OutputEndpointOnlineFeedbacks[output].FireUpdate();
}
else if (args.EventId == DMOutputEventIds.EndpointOnlineEventId
&& OutputEndpointOnlineFeedbacks.ContainsKey(output))
{
OutputEndpointOnlineFeedbacks[output].FireUpdate();
}
else if (args.EventId == DMOutputEventIds.VideoOutEventId)
{
if (outputCard != null && outputCard.VideoOutFeedback != null)
@@ -920,41 +1062,68 @@ namespace PepperDash.Essentials.DM
{
OutputVideoRouteNameFeedbacks[output].FireUpdate();
}
if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
{
if (AudioOutputFeedbacks.ContainsKey(output))
{
AudioOutputFeedbacks[output].FireUpdate();
}
if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
{
OutputAudioRouteNameFeedbacks[output].FireUpdate();
}
}
}
else if (args.EventId == DMOutputEventIds.AudioOutEventId)
{
try
if (!Global.ControlSystemIsDmps4k3xxType)
{
if (outputCard != null && outputCard.AudioOutFeedback != null)
{
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", this.Name,
outputCard.AudioOutFeedback.Number, output);
}
if (AudioOutputFeedbacks.ContainsKey(output))
{
AudioOutputFeedbacks[output].FireUpdate();
}
}
catch (NotSupportedException)
else
{
if (outputCard != null)
{
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", Name,
outputCard.AudioOutSourceFeedback, output);
}
if (AudioOutputFeedbacks.ContainsKey(output))
{
AudioOutputFeedbacks[output].FireUpdate();
if (outputCard is Card.Dmps3DmOutputBackend || outputCard is Card.Dmps3HdmiOutputBackend)
{
DigitalAudioOutputs[output].AudioSourceNumericFeedback.FireUpdate();
}
else
{
Debug.Console(2, this, "DMSwitchAudio:{0} Routed Input:{1} Output:{2}'", Name,
outputCard.AudioOutSourceFeedback, output);
}
}
}
if (AudioOutputFeedbacks.ContainsKey(output))
{
AudioOutputFeedbacks[output].FireUpdate();
}
if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
{
OutputAudioRouteNameFeedbacks[output].FireUpdate();
}
}
else if (args.EventId == DMOutputEventIds.OutputNameEventId
&& OutputNameFeedbacks.ContainsKey(output))
{
Debug.Console(2, this, "DM Output {0} NameFeedbackEventId", output);
OutputNameFeedbacks[output].FireUpdate();
}
else if (args.EventId == DMOutputEventIds.DigitalMixerAudioSourceFeedBackEventId)
{
if (AudioOutputFeedbacks.ContainsKey(output))
{
AudioOutputFeedbacks[output].FireUpdate();
}
if (OutputAudioRouteNameFeedbacks.ContainsKey(output))
{
OutputAudioRouteNameFeedbacks[output].FireUpdate();
}
}
}
void Dmps_DMSystemChange(Switch device, DMSystemEventArgs args)
@@ -1002,9 +1171,6 @@ namespace PepperDash.Essentials.DM
Debug.Console(2, this, "Attempting a DM route from input {0} to output {1} {2}", inputSelector, outputSelector, sigType);
//var input = Convert.ToUInt32(inputSelector); // Cast can sometimes fail
//var output = Convert.ToUInt32(outputSelector);
var input = inputSelector as DMInput;
var output = outputSelector as DMOutput;
@@ -1022,7 +1188,7 @@ namespace PepperDash.Essentials.DM
if (input == null || (input.Number <= Dmps.NumberOfSwitcherInputs && output.Number <= Dmps.NumberOfSwitcherOutputs &&
sigTypeIsUsbOrVideo) ||
(input.Number <= Dmps.NumberOfSwitcherInputs + 5 && output.Number <= Dmps.NumberOfSwitcherOutputs &&
(input.Number <= (Dmps.NumberOfSwitcherInputs) && output.Number <= Dmps.NumberOfSwitcherOutputs &&
(sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio))
{
// Check to see if there's an off timer waiting on this and if so, cancel
@@ -1041,11 +1207,6 @@ namespace PepperDash.Essentials.DM
}
}
//DMOutput dmOutputCard = output == 0 ? null : Dmps.SwitcherOutputs[output] as DMOutput;
//if (inCard != null)
//{
// NOTE THAT BITWISE COMPARISONS - TO CATCH ALL ROUTING TYPES
if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
{
@@ -1054,19 +1215,34 @@ namespace PepperDash.Essentials.DM
if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
{
try
if (!Global.ControlSystemIsDmps4k3xxType)
{
output.AudioOut = input;
}
catch (NotSupportedException)
else
{
Debug.Console(1, this, "Routing input {0} audio to output {1}",
(eDmps34KAudioOutSource) (input == null ? 0 : input.Number),
(CrestronControlSystem.eDmps34K350COutputs) output.Number);
output.AudioOutSource = input == null
? eDmps34KAudioOutSource.NoRoute
: (eDmps34KAudioOutSource)input.Number;
if (input == null)
{
output.AudioOutSource = eDmps34KAudioOutSource.NoRoute;
}
else if (input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaInput || input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaNoStreamingInput)
{
//Special case for weird AirMedia indexing
if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl)
output.AudioOutSource = eDmps34KAudioOutSource.AirMedia8;
else if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
output.AudioOutSource = eDmps34KAudioOutSource.AirMedia9;
}
else if (input.Number < Dmps.SwitcherInputs.Count)
{
//Shift video inputs by 5 for weird DMPS3-4K indexing
output.AudioOutSource = (eDmps34KAudioOutSource)(input.Number + 5);
}
else
{
//Shift analog inputs back to inputs 1-5
output.AudioOutSource = (eDmps34KAudioOutSource)(input.Number - Dmps.SwitcherInputs.Count + 1);
}
}
}
@@ -1100,10 +1276,91 @@ namespace PepperDash.Essentials.DM
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType sigType)
{
var input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector];
var output = Dmps.SwitcherOutputs[outputSelector];
if (EnableRouting == false)
{
return;
}
ExecuteSwitch(input, output, sigType);
Debug.Console(1, this, "Attempting a numeric switch from input {0} to output {1} {2}", inputSelector, outputSelector, sigType);
if((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
{
if (inputSelector <= Dmps.SwitcherInputs.Count && outputSelector <= Dmps.SwitcherOutputs.Count)
{
var input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector];
var output = Dmps.SwitcherOutputs[outputSelector];
ExecuteSwitch(input, output, sigType);
}
}
else if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
{
//Special case for DMPS-4K digital audio output
if (Global.ControlSystemIsDmps4k3xxType)
{
if (DigitalAudioOutputs.ContainsKey(outputSelector))
{
if (inputSelector == 0) //Clear action
{
DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(0, 0, eRoutingSignalType.Audio);
}
else if (inputSelector < Dmps.SwitcherInputs.Count) //DMPS-4K video inputs, set to audio follows video
{
DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(3, 0, eRoutingSignalType.Audio);
//Force video route since it is now set so audio follows video
ExecuteNumericSwitch(inputSelector, outputSelector, eRoutingSignalType.Video);
}
else if (inputSelector == Dmps.SwitcherInputs.Count + 5)
{
//Set to mix 1
DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(1, 0, eRoutingSignalType.Audio);
}
else if (inputSelector == Dmps.SwitcherInputs.Count + 6)
{
//Set to mix 2
DigitalAudioOutputs[outputSelector].ExecuteNumericSwitch(2, 0, eRoutingSignalType.Audio);
}
}
else if (inputSelector <= (Dmps.SwitcherInputs.Count + 4) && outputSelector <= Dmps.SwitcherOutputs.Count)
{
var output = Dmps.SwitcherOutputs[outputSelector] as DMOutput;
if (inputSelector == 0)
{
output.AudioOutSource = eDmps34KAudioOutSource.NoRoute;
}
else if(inputSelector >= (Dmps.SwitcherInputs.Count))
{
//Shift analog inputs back to inputs 1-5
Debug.Console(1, this, "Attempting analog route input {0} to output {1}", inputSelector - Dmps.SwitcherInputs.Count + 1, outputSelector);
output.AudioOutSource = (eDmps34KAudioOutSource)(inputSelector - Dmps.SwitcherInputs.Count + 1);
}
else if (inputSelector < Dmps.SwitcherInputs.Count)
{
var input = Dmps.SwitcherInputs[inputSelector] as DMInput;
if (input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaInput || input.CardInputOutputType == eCardInputOutputType.Dmps3AirMediaNoStreamingInput)
{
//Special case for weird AirMedia indexing
if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K250CSystemControl)
output.AudioOutSource = eDmps34KAudioOutSource.AirMedia8;
else if (Dmps.SystemControl.SystemControlType == eSystemControlType.Dmps34K350CSystemControl)
output.AudioOutSource = eDmps34KAudioOutSource.AirMedia9;
}
else
{
//Shift video inputs by 5 for weird DMPS3-4K indexing
output.AudioOutSource = (eDmps34KAudioOutSource)(inputSelector + 5);
}
}
}
}
else if (inputSelector <= Dmps.SwitcherInputs.Count && outputSelector <= Dmps.SwitcherOutputs.Count)
{
var output = Dmps.SwitcherOutputs[outputSelector] as DMOutput;
var input = inputSelector == 0 ? null : Dmps.SwitcherInputs[inputSelector] as DMInput;
output.AudioOut = input;
}
}
}
#endregion

View File

@@ -0,0 +1,516 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Crestron.SimplSharp;
using Crestron.SimplSharpPro.DeviceSupport;
using Crestron.SimplSharpPro.DM;
using PepperDash.Core;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.DM.Config;
using Crestron.SimplSharpPro.DM.Cards;
using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core.Config;
namespace PepperDash.Essentials.DM.Chassis
{
[Description("Wrapper class for all HdMd8xN switchers")]
public class HdMd8xNController : CrestronGenericBridgeableBaseDevice, IRoutingNumericWithFeedback, IHasFeedback
{
private HdMd8xN _Chassis;
public event EventHandler<RoutingNumericEventArgs> NumericSwitchChange;
public Dictionary<uint, string> InputNames { get; set; }
public Dictionary<uint, string> OutputNames { get; set; }
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
public FeedbackCollection<BoolFeedback> VideoInputSyncFeedbacks { get; private set; }
public FeedbackCollection<IntFeedback> VideoOutputRouteFeedbacks { get; private set; }
public FeedbackCollection<IntFeedback> AudioOutputRouteFeedbacks { get; private set; }
public FeedbackCollection<StringFeedback> InputNameFeedbacks { get; private set; }
public FeedbackCollection<StringFeedback> OutputNameFeedbacks { get; private set; }
public FeedbackCollection<StringFeedback> OutputVideoRouteNameFeedbacks { get; private set; }
public FeedbackCollection<StringFeedback> OutputAudioRouteNameFeedbacks { get; private set; }
public StringFeedback DeviceNameFeedback { get; private set; }
#region Constructor
public HdMd8xNController(string key, string name, HdMd8xN chassis,
DMChassisPropertiesConfig props)
: base(key, name, chassis)
{
_Chassis = chassis;
Name = name;
_Chassis.EnableAudioBreakaway.BoolValue = true;
if (props == null)
{
Debug.Console(1, this, "HdMd8xNController properties are null, failed to build the device");
return;
}
InputNames = new Dictionary<uint, string>();
if (props.InputNames != null)
{
InputNames = props.InputNames;
}
OutputNames = new Dictionary<uint, string>();
if (props.OutputNames != null)
{
OutputNames = props.OutputNames;
}
DeviceNameFeedback = new StringFeedback(()=> Name);
VideoInputSyncFeedbacks = new FeedbackCollection<BoolFeedback>();
VideoOutputRouteFeedbacks = new FeedbackCollection<IntFeedback>();
AudioOutputRouteFeedbacks = new FeedbackCollection<IntFeedback>();
InputNameFeedbacks = new FeedbackCollection<StringFeedback>();
OutputNameFeedbacks = new FeedbackCollection<StringFeedback>();
OutputVideoRouteNameFeedbacks = new FeedbackCollection<StringFeedback>();
OutputAudioRouteNameFeedbacks = new FeedbackCollection<StringFeedback>();
InputPorts = new RoutingPortCollection<RoutingInputPort>();
OutputPorts = new RoutingPortCollection<RoutingOutputPort>();
//Inputs - should always be 8 audio/video inputs
for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
{
try
{
var index = i;
if (!InputNames.ContainsKey(index))
{
InputNames.Add(index, string.Format("Input{0}", index));
}
string inputName = InputNames[index];
_Chassis.Inputs[index].Name.StringValue = inputName;
InputPorts.Add(new RoutingInputPort(inputName, eRoutingSignalType.AudioVideo,
eRoutingPortConnectionType.Hdmi, _Chassis.Inputs[index], this)
{
FeedbackMatchObject = _Chassis.Inputs[index]
});
VideoInputSyncFeedbacks.Add(new BoolFeedback(inputName, () => _Chassis.Inputs[index].VideoDetectedFeedback.BoolValue));
InputNameFeedbacks.Add(new StringFeedback(inputName, () => _Chassis.Inputs[index].NameFeedback.StringValue));
}
catch (Exception ex)
{
ErrorLog.Error("Exception creating input {0} on HD-MD8xN Chassis: {1}", i, ex);
}
}
//Outputs. Either 2 outputs (1 audio, 1 audio/video) for HD-MD8x1 or 4 outputs (2 audio, 2 audio/video) for HD-MD8x2
for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
{
try
{
var index = i;
if (!OutputNames.ContainsKey(index))
{
OutputNames.Add(index, string.Format("Output{0}", index));
}
string outputName = OutputNames[index];
_Chassis.Outputs[index].Name.StringValue = outputName;
OutputPorts.Add(new RoutingOutputPort(outputName, eRoutingSignalType.AudioVideo,
eRoutingPortConnectionType.Hdmi, _Chassis.Outputs[index], this)
{
FeedbackMatchObject = _Chassis.Outputs[index]
});
OutputNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].NameFeedback.StringValue));
VideoOutputRouteFeedbacks.Add(new IntFeedback(outputName, () => _Chassis.Outputs[index].VideoOutFeedback == null ? 0 : (int)_Chassis.Outputs[index].VideoOutFeedback.Number));
AudioOutputRouteFeedbacks.Add(new IntFeedback(outputName, () => _Chassis.Outputs[index].AudioOutFeedback == null ? 0 : (int)_Chassis.Outputs[index].AudioOutFeedback.Number));
OutputVideoRouteNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].VideoOutFeedback == null ? "None" : _Chassis.Outputs[index].VideoOutFeedback.NameFeedback.StringValue));
OutputAudioRouteNameFeedbacks.Add(new StringFeedback(outputName, () => _Chassis.Outputs[index].AudioOutFeedback == null ? "None" : _Chassis.Outputs[index].VideoOutFeedback.NameFeedback.StringValue));
}
catch (Exception ex)
{
ErrorLog.Error("Exception creating output {0} on HD-MD8xN Chassis: {1}", i, ex);
}
}
_Chassis.DMInputChange += Chassis_DMInputChange;
_Chassis.DMOutputChange += Chassis_DMOutputChange;
AddPostActivationAction(AddFeedbackCollections);
}
#endregion
#region Methods
/// <summary>
/// Raise an event when the status of a switch object changes.
/// </summary>
/// <param name="e">Arguments defined as IKeyName sender, output, input, and eRoutingSignalType</param>
private void OnSwitchChange(RoutingNumericEventArgs e)
{
var newEvent = NumericSwitchChange;
if (newEvent != null) newEvent(this, e);
}
#region PostActivate
public void AddFeedbackCollections()
{
AddFeedbackToList(DeviceNameFeedback);
AddCollectionsToList(VideoInputSyncFeedbacks);
AddCollectionsToList(VideoOutputRouteFeedbacks, AudioOutputRouteFeedbacks);
AddCollectionsToList(InputNameFeedbacks, OutputNameFeedbacks, OutputVideoRouteNameFeedbacks, OutputAudioRouteNameFeedbacks);
}
#endregion
#region FeedbackCollection Methods
//Add arrays of collections
public void AddCollectionsToList(params FeedbackCollection<BoolFeedback>[] newFbs)
{
foreach (FeedbackCollection<BoolFeedback> fbCollection in newFbs)
{
foreach (var item in newFbs)
{
AddCollectionToList(item);
}
}
}
public void AddCollectionsToList(params FeedbackCollection<IntFeedback>[] newFbs)
{
foreach (FeedbackCollection<IntFeedback> fbCollection in newFbs)
{
foreach (var item in newFbs)
{
AddCollectionToList(item);
}
}
}
public void AddCollectionsToList(params FeedbackCollection<StringFeedback>[] newFbs)
{
foreach (FeedbackCollection<StringFeedback> fbCollection in newFbs)
{
foreach (var item in newFbs)
{
AddCollectionToList(item);
}
}
}
//Add Collections
public void AddCollectionToList(FeedbackCollection<BoolFeedback> newFbs)
{
foreach (var f in newFbs)
{
if (f == null) continue;
AddFeedbackToList(f);
}
}
public void AddCollectionToList(FeedbackCollection<IntFeedback> newFbs)
{
foreach (var f in newFbs)
{
if (f == null) continue;
AddFeedbackToList(f);
}
}
public void AddCollectionToList(FeedbackCollection<StringFeedback> newFbs)
{
foreach (var f in newFbs)
{
if (f == null) continue;
AddFeedbackToList(f);
}
}
//Add Individual Feedbacks
public void AddFeedbackToList(PepperDash.Essentials.Core.Feedback newFb)
{
if (newFb == null) return;
if (!Feedbacks.Contains(newFb))
{
Feedbacks.Add(newFb);
}
}
#endregion
#region IRouting Members
public void ExecuteSwitch(object inputSelector, object outputSelector, eRoutingSignalType sigType)
{
var input = inputSelector as DMInput;
var output = outputSelector as DMOutput;
Debug.Console(2, this, "ExecuteSwitch: input={0} output={1} sigType={2}", input, output, sigType.ToString());
if (output == null)
{
Debug.Console(0, this, "Unable to make switch. Output selector is not DMOutput");
return;
}
if ((sigType & eRoutingSignalType.Video) == eRoutingSignalType.Video)
{
_Chassis.VideoEnter.BoolValue = true;
if (output != null)
{
output.VideoOut = input;
}
}
if ((sigType & eRoutingSignalType.Audio) == eRoutingSignalType.Audio)
{
_Chassis.AudioEnter.BoolValue = true;
if (output != null)
{
output.AudioOut = input;
}
}
}
#endregion
#region IRoutingNumeric Members
public void ExecuteNumericSwitch(ushort inputSelector, ushort outputSelector, eRoutingSignalType signalType)
{
var input = inputSelector == 0 ? null : _Chassis.Inputs[inputSelector];
var output = _Chassis.Outputs[outputSelector];
Debug.Console(2, this, "ExecuteNumericSwitch: input={0} output={1}", input, output);
ExecuteSwitch(input, output, signalType);
}
#endregion
#endregion
#region Bridge Linking
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
var joinMap = new DmChassisControllerJoinMap(joinStart);
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
if (!string.IsNullOrEmpty(joinMapSerialized))
joinMap = JsonConvert.DeserializeObject<DmChassisControllerJoinMap>(joinMapSerialized);
if (bridge != null)
{
bridge.AddJoinMap(Key, joinMap);
}
else
{
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
}
IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
trilist.StringInput[joinMap.Name.JoinNumber].StringValue = this.Name;
for (uint i = 1; i <= _Chassis.NumberOfInputs; i++)
{
var joinIndex = i - 1;
var input = i;
//Digital
VideoInputSyncFeedbacks[InputNames[input]].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber + joinIndex]);
//Serial
InputNameFeedbacks[InputNames[input]].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + joinIndex]);
}
for (uint i = 1; i <= _Chassis.NumberOfOutputs; i++)
{
var joinIndex = i - 1;
var output = i;
//Analog
VideoOutputRouteFeedbacks[OutputNames[output]].LinkInputSig(trilist.UShortInput[joinMap.OutputVideo.JoinNumber + joinIndex]);
trilist.SetUShortSigAction(joinMap.OutputVideo.JoinNumber + joinIndex, (a) => ExecuteNumericSwitch(a, (ushort)output, eRoutingSignalType.Video));
AudioOutputRouteFeedbacks[OutputNames[output]].LinkInputSig(trilist.UShortInput[joinMap.OutputAudio.JoinNumber + joinIndex]);
trilist.SetUShortSigAction(joinMap.OutputAudio.JoinNumber + joinIndex, (a) => ExecuteNumericSwitch(a, (ushort)output, eRoutingSignalType.Audio));
//Serial
OutputNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + joinIndex]);
OutputVideoRouteNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentVideoInputNames.JoinNumber + joinIndex]);
OutputAudioRouteNameFeedbacks[OutputNames[output]].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentAudioInputNames.JoinNumber + joinIndex]);
}
_Chassis.OnlineStatusChange += Chassis_OnlineStatusChange;
trilist.OnlineStatusChange += (d, args) =>
{
if (!args.DeviceOnLine) return;
};
}
#endregion
#region Events
void Chassis_OnlineStatusChange(Crestron.SimplSharpPro.GenericBase currentDevice, Crestron.SimplSharpPro.OnlineOfflineEventArgs args)
{
IsOnline.FireUpdate();
if (!args.DeviceOnLine) return;
foreach (var feedback in Feedbacks)
{
feedback.FireUpdate();
}
}
void Chassis_DMOutputChange(Switch device, DMOutputEventArgs args)
{
switch (args.EventId)
{
case DMOutputEventIds.VideoOutEventId:
{
var output = args.Number;
var inputNumber = _Chassis.Outputs[output].VideoOutFeedback == null ? 0 : _Chassis.Outputs[output].VideoOutFeedback.Number;
var outputName = OutputNames[output];
var feedback = VideoOutputRouteFeedbacks[outputName];
if (feedback == null)
{
return;
}
var inPort = InputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output].VideoOutFeedback);
var outPort = OutputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output]);
feedback.FireUpdate();
OnSwitchChange(new RoutingNumericEventArgs(output, inputNumber, outPort, inPort, eRoutingSignalType.Video));
break;
}
case DMOutputEventIds.AudioOutEventId:
{
var output = args.Number;
var inputNumber = _Chassis.Outputs[output].AudioOutFeedback == null ? 0 : _Chassis.Outputs[output].AudioOutFeedback.Number;
var outputName = OutputNames[output];
var feedback = AudioOutputRouteFeedbacks[outputName];
if (feedback == null)
{
return;
}
var inPort = InputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output].AudioOutFeedback);
var outPort = OutputPorts.FirstOrDefault(p => p.FeedbackMatchObject == _Chassis.Outputs[output]);
feedback.FireUpdate();
OnSwitchChange(new RoutingNumericEventArgs(output, inputNumber, outPort, inPort, eRoutingSignalType.Audio));
break;
}
case DMOutputEventIds.OutputNameEventId:
case DMOutputEventIds.NameFeedbackEventId:
{
Debug.Console(1, this, "Event ID {0}: Updating name feedbacks.", args.EventId);
Debug.Console(1, this, "Output {0} Name {1}", args.Number,
_Chassis.Outputs[args.Number].NameFeedback.StringValue);
foreach (var item in OutputNameFeedbacks)
{
item.FireUpdate();
}
break;
}
default:
{
Debug.Console(1, this, "Unhandled DM Output Event ID {0}", args.EventId);
break;
}
}
}
void Chassis_DMInputChange(Switch device, DMInputEventArgs args)
{
switch (args.EventId)
{
case DMInputEventIds.VideoDetectedEventId:
{
Debug.Console(1, this, "Event ID {0}: Updating VideoInputSyncFeedbacks", args.EventId);
foreach (var item in VideoInputSyncFeedbacks)
{
item.FireUpdate();
}
break;
}
case DMInputEventIds.InputNameFeedbackEventId:
case DMInputEventIds.InputNameEventId:
case DMInputEventIds.NameFeedbackEventId:
{
Debug.Console(1, this, "Event ID {0}: Updating name feedbacks.", args.EventId);
Debug.Console(1, this, "Input {0} Name {1}", args.Number,
_Chassis.Inputs[args.Number].NameFeedback.StringValue);
foreach (var item in InputNameFeedbacks)
{
item.FireUpdate();
}
break;
}
default:
{
Debug.Console(1, this, "Unhandled DM Input Event ID {0}", args.EventId);
break;
}
}
}
#endregion
#region Factory
public class HdMd8xNControllerFactory : EssentialsDeviceFactory<HdMd8xNController>
{
public HdMd8xNControllerFactory()
{
TypeNames = new List<string>() { "hdmd8x2", "hdmd8x1" };
}
public override EssentialsDevice BuildDevice(DeviceConfig dc)
{
Debug.Console(1, "Factory Attempting to create new HD-MD-8xN Device");
var props = JsonConvert.DeserializeObject<DMChassisPropertiesConfig>(dc.Properties.ToString());
var type = dc.Type.ToLower();
var control = props.Control;
var ipid = control.IpIdInt;
switch (type)
{
case ("hdmd8x2"):
return new HdMd8xNController(dc.Key, dc.Name, new HdMd8x2(ipid, Global.ControlSystem), props);
case ("hdmd8x1"):
return new HdMd8xNController(dc.Key, dc.Name, new HdMd8x1(ipid, Global.ControlSystem), props);
default:
return null;
}
}
}
#endregion
}
}

View File

@@ -30,14 +30,15 @@ namespace PepperDash.Essentials.DM
: 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();
_rmc.OnlineStatusChange += (currentDevice, args) => { if (args.DeviceOnLine) UpdateDeviceInfo(); };
IsOnline.OutputChange += (currentDevice, args) => { if (args.BoolValue) UpdateDeviceInfo(); };
}
protected void LinkDmRmcToApi(DmRmcControllerBase rmc, BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
@@ -60,7 +61,7 @@ namespace PepperDash.Essentials.DM
Debug.Console(1, rmc, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
rmc.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
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]);
@@ -330,53 +331,84 @@ namespace PepperDash.Essentials.DM
var parentDev = DeviceManager.GetDeviceForKey(pKey);
if (parentDev is DmpsRoutingController)
{
if ((parentDev as DmpsRoutingController).Dmps4kType)
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)
{
return GetDmRmcControllerForDmps4k(key, name, typeName, parentDev as DmpsRoutingController, props.ParentOutputNumber);
Debug.Console(0, "Cannot create DMPS device '{0}'. Output number '{1}' is out of range",
key, num);
return null;
}
else
// Must use different constructor for DMPS4K types. No IPID
if (Global.ControlSystemIsDmps4kType)
{
return GetDmRmcControllerForDmps(key, name, typeName, ipid, parentDev as DmpsRoutingController, props.ParentOutputNumber);
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 = dmps.OutputEndpointOnlineFeedbacks[num];
rmc.IsOnline.OutputChange += (currentDevice, args) =>
{
foreach (var feedback in rmc.Feedbacks)
{
if (feedback != null)
feedback.FireUpdate();
}
};
return rmc;
}
return GetDmRmcControllerForDmps(key, name, typeName, ipid, dmps, props.ParentOutputNumber);
}
if (!(parentDev is IDmSwitch))
{
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a DM Chassis.",
key, pKey);
return null;
}
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);
var chassis = (parentDev as IDmSwitch).Chassis;
var num = props.ParentOutputNumber;
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;
}
var controller = parentDev as IDmSwitch;
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)
{
return GetDmRmcControllerForCpu3Chassis(key, name, typeName, chassis, num, parentDev);
}
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;
}
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)
{
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 = controller.OutputEndpointOnlineFeedbacks[num];
rmc.IsOnline.OutputChange += (currentDevice, args) =>
{
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,

View File

@@ -137,7 +137,7 @@ namespace PepperDash.Essentials.DM
try
{
// Must use different constructor for CPU3 or DMPS3-4K types. No IPID
if (isCpu3 || Global.ControlSystemIsDmps4kType)
if (isCpu3 || (parentDev is DmpsRoutingController && Global.ControlSystemIsDmps4kType))
{
if (typeName.StartsWith("dmtx200"))
return new DmTx200Controller(key, name, new DmTx200C2G(dmInput));
@@ -145,7 +145,7 @@ namespace PepperDash.Essentials.DM
return new DmTx201CController(key, name, new DmTx201C(dmInput));
if (typeName.StartsWith("dmtx201s"))
return new DmTx201SController(key, name, new DmTx201S(dmInput));
if (typeName.StartsWith("dmtx4k100"))
if (typeName.StartsWith("dmtx4k100"))
return new DmTx4k100Controller(key, name, new DmTx4K100C1G(dmInput));
if (typeName.StartsWith("dmtx4kz100"))
return new DmTx4kz100Controller(key, name, new DmTx4kz100C1G(dmInput));
@@ -153,7 +153,7 @@ namespace PepperDash.Essentials.DM
return new DmTx4k202CController(key, name, new DmTx4k202C(dmInput));
if (typeName.StartsWith("dmtx4kz202"))
return new DmTx4kz202CController(key, name, new DmTx4kz202C(dmInput));
if (typeName.StartsWith("dmtx4k302"))
if (typeName.StartsWith("dmtx4k302"))
return new DmTx4k302CController(key, name, new DmTx4k302C(dmInput));
if (typeName.StartsWith("dmtx4kz302"))
return new DmTx4kz302CController(key, name, new DmTx4kz302C(dmInput));
@@ -228,6 +228,41 @@ namespace PepperDash.Essentials.DM
}
AddToFeedbackList(ActiveVideoInputFeedback);
var parentDev = DeviceManager.GetDeviceForKey(key);
var num = hardware.DMInput.Number;
//If Dmps4K, change online feedback to chassis, tx feedback does not work
if (parentDev is DmpsRoutingController && Global.ControlSystemIsDmps4kType)
{
var dmps = parentDev as DmpsRoutingController;
Debug.Console(0, "DM endpoint input {0} is for Dmps4k, changing online feedback to chassis", num);
IsOnline = dmps.InputEndpointOnlineFeedbacks[num];
}
//If Cpu3 Chassis, change online feedback to chassis, tx feedback does not work
else if (parentDev is DmChassisController)
{
var controller = parentDev as DmChassisController;
var chassis = controller.Chassis;
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)
{
Debug.Console(0, "DM endpoint output {0} is for Cpu3, changing online feedback to chassis", num);
IsOnline = controller.InputEndpointOnlineFeedbacks[num];
}
}
IsOnline.OutputChange += (currentDevice, args) =>
{
foreach (var feedback in Feedbacks)
{
if (feedback != null)
feedback.FireUpdate();
}
};
}
protected DmTxControllerBase(string key, string name, DmHDBasedTEndPoint hardware) : base(key, name, hardware)

View File

@@ -93,6 +93,7 @@
<ItemGroup>
<Compile Include="AirMedia\AirMediaPropertiesConfig.cs" />
<Compile Include="AirMedia\AirMediaController.cs" />
<Compile Include="Chassis\DmpsDigitalOutputController.cs" />
<Compile Include="Chassis\DmpsMicrophoneController.cs" />
<Compile Include="Chassis\DmBladeChassisController.cs" />
<Compile Include="Chassis\DmCardAudioOutput.cs" />
@@ -100,6 +101,7 @@
<Compile Include="Chassis\DmpsAudioOutputController.cs" />
<Compile Include="Chassis\DmpsInternalVirtualDmTxController.cs" />
<Compile Include="Chassis\DmpsRoutingController.cs" />
<Compile Include="Chassis\HdMd8xNController.cs" />
<Compile Include="Chassis\HdMdNxM4kEBridgeableController.cs" />
<Compile Include="Chassis\HdMdNxM4kEController.cs" />
<Compile Include="Config\InputPropertiesConfig.cs" />

View File

@@ -308,7 +308,7 @@ namespace PepperDash.Essentials.Devices.Displays
//Send((string)selector);
}
void SetVolume(ushort level)
public void SetVolume(ushort level)
{
var levelString = string.Format("{0}{1:X4}\x03", VolumeLevelPartialCmd, level);
AppendChecksumAndSend(levelString);
@@ -333,10 +333,13 @@ namespace PepperDash.Essentials.Devices.Displays
Send(MuteOnCmd);
}
void IBasicVolumeWithFeedback.SetVolume(ushort level)
/*
public void IBasicVolumeWithFeedback.SetVolume(ushort level)
{
SetVolume(level);
}
*/
#endregion

View File

@@ -290,7 +290,7 @@ namespace PepperDash.Essentials.Devices.Displays
//Send((string)selector);
}
void SetVolume(ushort level)
public void SetVolume(ushort level)
{
var levelString = string.Format("{0}{1:X3}\x03", VolumeLevelPartialCmd, level);
@@ -315,11 +315,12 @@ namespace PepperDash.Essentials.Devices.Displays
Send(MuteOnCmd);
}
/*
void IBasicVolumeWithFeedback.SetVolume(ushort level)
{
SetVolume(level);
}
*/
#endregion
#region IBasicVolumeControls Members