diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
index 2da94bb0..c7d5c0e5 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
@@ -13,6 +13,10 @@ namespace PepperDash.Essentials.Core.Bridges
public JoinDataComplete MasterVolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
new JoinMetadata { Description = "Master Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("MixerPresetRecall")]
+ 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("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 });
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsMicrophoneControllerJoinMap.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsMicrophoneControllerJoinMap.cs
new file mode 100644
index 00000000..6922c569
--- /dev/null
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Bridges/JoinMaps/DmpsMicrophoneControllerJoinMap.cs
@@ -0,0 +1,50 @@
+using System;
+
+namespace PepperDash.Essentials.Core.Bridges
+{
+ public class DmpsMicrophoneControllerJoinMap : JoinMapBaseAdvanced
+ {
+ [JoinName("MicGain")]
+ public JoinDataComplete MicGain = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Gain dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MicGainScaled")]
+ public JoinDataComplete MicGainScaled = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Gain 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MicMuteOn")]
+ public JoinDataComplete MicMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicMuteOff")]
+ public JoinDataComplete MicMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicGainScaledSend")]
+ public JoinDataComplete MicGainScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Gain Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicName")]
+ public JoinDataComplete MicName = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Name Get", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public DmpsMicrophoneControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(DmpsMicrophoneControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected DmpsMicrophoneControllerJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj
index 3c7a6c31..cdf6406c 100644
--- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj
+++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/PepperDash_Essentials_Core.csproj
@@ -131,6 +131,7 @@
+
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsAudioOutputController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsAudioOutputController.cs
index c2cd741f..97c582b3 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsAudioOutputController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsAudioOutputController.cs
@@ -175,6 +175,11 @@ namespace PepperDash.Essentials.DM
if (MasterVolumeLevel != null)
{
SetUpDmpsAudioOutputJoins(trilist, MasterVolumeLevel, joinMap.MasterVolumeLevel.JoinNumber);
+ var mixer = MasterVolumeLevel as DmpsAudioOutputWithMixer;
+ if (mixer != null)
+ {
+ trilist.SetUShortSigAction(3, mixer.RecallPreset);
+ }
}
if (SourceVolumeLevel != null)
@@ -253,6 +258,12 @@ namespace PepperDash.Essentials.DM
VolumeLevelScaledFeedback.FireUpdate();
}
}
+
+ public void RecallPreset(ushort preset)
+ {
+ Mixer.PresetNumber.UShortValue = preset;
+ Mixer.RecallPreset();
+ }
}
public class DmpsAudioOutput : IBasicVolumeWithFeedback
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsMicrophoneController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsMicrophoneController.cs
new file mode 100644
index 00000000..55615bcc
--- /dev/null
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsMicrophoneController.cs
@@ -0,0 +1,186 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using Crestron.SimplSharpPro;
+using Crestron.SimplSharpPro.DeviceSupport;
+using PepperDash.Core;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.Bridges;
+
+
+namespace PepperDash.Essentials.DM
+{
+ ///
+ /// Exposes the volume levels for microphones DMPS3 chassis
+ ///
+ public class DmpsMicrophoneController
+ {
+ private Dictionary Mics;
+
+ public DmpsMicrophoneController(CrestronControlSystem dmps)
+ {
+ Debug.Console(2, "Creating Dmps Microphone Controller");
+ Mics = new Dictionary();
+
+ foreach (var mic in dmps.Microphones)
+ {
+ Debug.Console(0, "Dmps Microphone Controller Adding Mic: {0} Name: {1}", mic.ID, mic.Name);
+ var dmpsMic = new DmpsMicrophone("processor-microphone" + mic.ID, mic.Name, mic);
+
+ DeviceManager.AddDevice(dmpsMic);
+ Mics.Add(mic.ID, dmpsMic);
+ }
+
+ dmps.MicrophoneChange += new MicrophoneChangeEventHandler(Dmps_MicrophoneChange);
+ }
+
+ void Dmps_MicrophoneChange(MicrophoneBase mic, GenericEventArgs args)
+ {
+ Debug.Console(2, "Dmps Microphone Controller Index: {0} EventId: {1}", mic.ID, args.EventId.ToString());
+
+ if(Mics.ContainsKey(mic.ID))
+ {
+ Mics[mic.ID].Event();
+ }
+ }
+ }
+
+ public class DmpsMicrophone : EssentialsBridgeableDevice, IBasicVolumeWithFeedback
+ {
+ MicrophoneBase Mic;
+
+ private bool EnableVolumeSend;
+ private ushort VolumeLevelInput;
+ protected short MinLevel { get; set; }
+ protected short MaxLevel { get; set; }
+
+ public BoolFeedback MuteFeedback { get; private set; }
+ public IntFeedback VolumeLevelFeedback { get; private set; }
+ public IntFeedback VolumeLevelScaledFeedback { get; private set; }
+ public StringFeedback NameFeedback { get; private set; }
+
+ Action MuteOnAction;
+ Action MuteOffAction;
+
+ public DmpsMicrophone(string key, string name, MicrophoneBase mic) : base(key, name)
+ {
+ Mic = mic;
+ VolumeLevelInput = 0;
+ EnableVolumeSend = false;
+ MinLevel = 0;
+ MaxLevel = 600;
+
+ MuteFeedback = new BoolFeedback(new Func(() => Mic.MuteOnFeedBack.BoolValue));
+ VolumeLevelFeedback = new IntFeedback(new Func(() => Mic.GainFeedBack.UShortValue));
+ VolumeLevelScaledFeedback = new IntFeedback(new Func(() => ScaleVolumeFeedback(VolumeLevelFeedback.UShortValue)));
+ NameFeedback = new StringFeedback(new Func(() => "Microphone " + Mic.ID));
+ MuteOnAction = new Action(Mic.MuteOn);
+ MuteOffAction = new Action(Mic.MuteOff);
+
+ VolumeLevelFeedback.FireUpdate();
+ VolumeLevelScaledFeedback.FireUpdate();
+ NameFeedback.FireUpdate();
+ MuteFeedback.FireUpdate();
+ }
+
+ public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = new DmpsMicrophoneControllerJoinMap(joinStart);
+
+ if (bridge != null)
+ {
+ bridge.AddJoinMap(Key, joinMap);
+ }
+ else
+ {
+ Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
+ }
+
+ Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
+
+ VolumeLevelFeedback.LinkInputSig(trilist.UShortInput[joinMap.MicGain.JoinNumber]);
+ VolumeLevelScaledFeedback.LinkInputSig(trilist.UShortInput[joinMap.MicGainScaled.JoinNumber ]);
+ MuteFeedback.LinkInputSig(trilist.BooleanInput[joinMap.MicMuteOn.JoinNumber]);
+ MuteFeedback.LinkComplementInputSig(trilist.BooleanInput[joinMap.MicMuteOff.JoinNumber]);
+ NameFeedback.LinkInputSig(trilist.StringInput[joinMap.MicName.JoinNumber]);
+
+ trilist.SetUShortSigAction(joinMap.MicGain.JoinNumber, SetVolume);
+ trilist.SetUShortSigAction(joinMap.MicGainScaled.JoinNumber, SetVolumeScaled);
+ trilist.SetBoolSigAction(joinMap.MicGainScaledSend.JoinNumber, SendScaledVolume);
+ trilist.SetSigTrueAction(joinMap.MicMuteOn.JoinNumber, MuteOnAction);
+ trilist.SetSigTrueAction(joinMap.MicMuteOff.JoinNumber, MuteOffAction);
+ }
+
+ public void Event()
+ {
+ VolumeLevelFeedback.FireUpdate();
+ VolumeLevelScaledFeedback.FireUpdate();
+ MuteFeedback.FireUpdate();
+ }
+
+ public void SetVolumeScaled(ushort level)
+ {
+ VolumeLevelInput = (ushort)(level * (MaxLevel - MinLevel) / ushort.MaxValue + MinLevel);
+ if (EnableVolumeSend == true)
+ {
+ Mic.Gain.UShortValue = VolumeLevelInput;
+ }
+ }
+
+ public ushort ScaleVolumeFeedback(ushort level)
+ {
+ short signedLevel = (short)level;
+ return (ushort)((signedLevel - MinLevel) * ushort.MaxValue / (MaxLevel - MinLevel));
+ }
+
+ public void SendScaledVolume(bool pressRelease)
+ {
+ EnableVolumeSend = pressRelease;
+ if (pressRelease == false)
+ {
+ SetVolumeScaled(VolumeLevelInput);
+ }
+ }
+
+ #region IBasicVolumeWithFeedback Members
+
+ public void SetVolume(ushort level)
+ {
+ Mic.Gain.UShortValue = level;
+ }
+
+ public void MuteOn()
+ {
+ MuteOnAction();
+ }
+
+ public void MuteOff()
+ {
+ MuteOffAction();
+ }
+
+ #endregion
+
+ #region IBasicVolumeControls Members
+
+ public void VolumeUp(bool pressRelease)
+ {
+ }
+
+ public void VolumeDown(bool pressRelease)
+ {
+ }
+
+ public void MuteToggle()
+ {
+ if (MuteFeedback.BoolValue)
+ MuteOff();
+ else
+ MuteOn();
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs
index 35c83f2c..b1c8b532 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs
+++ b/essentials-framework/Essentials DM/Essentials_DM/Chassis/DmpsRoutingController.cs
@@ -60,6 +60,7 @@ namespace PepperDash.Essentials.DM
public Dictionary InputNames { get; set; }
public Dictionary OutputNames { get; set; }
public Dictionary VolumeControls { get; private set; }
+ public DmpsMicrophoneController Microphones { get; private set; }
public const int RouteOffTime = 500;
Dictionary RouteOffTimers = new Dictionary();
@@ -192,6 +193,8 @@ namespace PepperDash.Essentials.DM
SetupOutputCards();
SetupInputCards();
+
+ Microphones = new DmpsMicrophoneController(Dmps);
}
public override bool CustomActivate()
diff --git a/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj b/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj
index 4f674d9d..cef61b1a 100644
--- a/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj
+++ b/essentials-framework/Essentials DM/Essentials_DM/PepperDash_Essentials_DM.csproj
@@ -93,6 +93,7 @@
+