Merge pull request #462 from PepperDash/release/1.6.5

Release/1.6.5 Development
This commit is contained in:
Andrew Welker
2020-10-22 13:31:38 -06:00
committed by GitHub
8 changed files with 729 additions and 607 deletions

View File

@@ -11,5 +11,8 @@ namespace PepperDash_Essentials_Core.DeviceTypeInterfaces
List<LanguageLabel> UiLabels { get; set; } List<LanguageLabel> UiLabels { get; set; }
List<LanguageLabel> Sources { get; set; } List<LanguageLabel> Sources { get; set; }
List<LanguageLabel> Destinations { get; set; } List<LanguageLabel> Destinations { get; set; }
List<LanguageLabel> SourceGroupNames { get; set; }
List<LanguageLabel> DestinationGroupNames { get; set; }
List<LanguageLabel> RoomNames { get; set; }
} }
} }

View File

@@ -0,0 +1,17 @@
using System.Collections.Generic;
namespace PepperDash.Essentials.Core
{
public interface IHasDspPresets
{
List<IDspPreset> Presets { get; }
void RecallPreset(IDspPreset preset);
}
public interface IDspPreset
{
string Name { get; }
}
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
namespace PepperDash_Essentials_Core.Gateways
{
public class CenCn2Controller
{
}
}

View File

@@ -190,6 +190,7 @@
<Compile Include="Devices\EssentialsBridgeableDevice.cs" /> <Compile Include="Devices\EssentialsBridgeableDevice.cs" />
<Compile Include="Devices\EssentialsDevice.cs" /> <Compile Include="Devices\EssentialsDevice.cs" />
<Compile Include="Devices\GenericIRController.cs" /> <Compile Include="Devices\GenericIRController.cs" />
<Compile Include="Devices\IDspPreset.cs" />
<Compile Include="Devices\IProjectorInterfaces.cs" /> <Compile Include="Devices\IProjectorInterfaces.cs" />
<Compile Include="Devices\PC\InRoomPc.cs" /> <Compile Include="Devices\PC\InRoomPc.cs" />
<Compile Include="Devices\PC\Laptop.cs" /> <Compile Include="Devices\PC\Laptop.cs" />

View File

@@ -118,7 +118,10 @@ namespace PepperDash.Essentials.DM
OutputEndpointOnlineFeedbacks = new Dictionary<uint, BoolFeedback>(); OutputEndpointOnlineFeedbacks = new Dictionary<uint, BoolFeedback>();
Debug.Console(1, this, "{0} Switcher Inputs Present.", Dmps.SwitcherInputs.Count); Debug.Console(1, this, "{0} Switcher Inputs Present.", Dmps.SwitcherInputs.Count);
Debug.Console(1, this, "{0} Switcher Outputs Present.", Dmps.SwitcherOutputs.Count); Debug.Console(1, this, "{0} Switcher Outputs Present.", Dmps.SwitcherOutputs.Count);
Debug.Console(1, this, "{0} Inputs in ControlSystem", Dmps.NumberOfSwitcherInputs);
Debug.Console(1, this, "{0} Outputs in ControlSystem", Dmps.NumberOfSwitcherOutputs);
SetupOutputCards(); SetupOutputCards();
@@ -128,32 +131,50 @@ namespace PepperDash.Essentials.DM
public override bool CustomActivate() public override bool CustomActivate()
{ {
// Set input and output names from config // Set input and output names from config
if (InputNames != null) SetInputNames();
{
foreach (var kvp in InputNames) SetOutputNames();
{
var input = (Dmps.SwitcherInputs[kvp.Key] as DMInput);
if (input != null)
input.Name.StringValue = kvp.Value;
}
}
if (OutputNames != null)
{
foreach (var kvp in OutputNames)
{
var output = (Dmps.SwitcherOutputs[kvp.Key] as DMOutput);
if (output != null)
output.Name.StringValue = kvp.Value;
}
}
// Subscribe to events // Subscribe to events
Dmps.DMInputChange += new DMInputEventHandler(Dmps_DMInputChange); Dmps.DMInputChange += Dmps_DMInputChange;
Dmps.DMOutputChange += new DMOutputEventHandler(Dmps_DMOutputChange); Dmps.DMOutputChange += Dmps_DMOutputChange;
return base.CustomActivate(); return base.CustomActivate();
} }
private void SetOutputNames()
{
if (OutputNames == null)
{
return;
}
foreach (var kvp in OutputNames)
{
var output = (Dmps.SwitcherOutputs[kvp.Key] as DMOutput);
if (output != null && output.Name.Type != eSigType.NA)
{
output.Name.StringValue = kvp.Value;
}
}
}
private void SetInputNames()
{
if (InputNames == null)
{
return;
}
foreach (var kvp in InputNames)
{
var input = (Dmps.SwitcherInputs[kvp.Key] as DMInput);
if (input != null && input.Name.Type != eSigType.NA)
{
input.Name.StringValue = kvp.Value;
}
}
}
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge) public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{ {
var joinMap = new DmpsRoutingControllerJoinMap(joinStart); var joinMap = new DmpsRoutingControllerJoinMap(joinStart);
@@ -175,171 +196,197 @@ namespace PepperDash.Essentials.DM
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
// Link up outputs // Link up outputs
for (uint i = 1; i <= Dmps.NumberOfSwitcherInputs; i++) LinkInputsToApi(trilist, joinMap);
{
Debug.Console(2, this, "Linking Input Card {0}", i);
var ioSlot = i; LinkOutputsToApi(trilist, joinMap);
var ioSlotJoin = ioSlot - 1; }
//if (TxDictionary.ContainsKey(ioSlot)) private void LinkOutputsToApi(BasicTriList trilist, DmpsRoutingControllerJoinMap joinMap)
//{ {
// Debug.Console(2, "Creating Tx Feedbacks {0}", ioSlot); for (uint i = 1; i <= Dmps.SwitcherOutputs.Count; i++)
// var TxKey = TxDictionary[ioSlot]; {
// var TxDevice = DeviceManager.GetDeviceForKey(TxKey) as DmTxControllerBase; Debug.Console(2, this, "Linking Output Card {0}", i);
// //TxDevice.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
// // TxDevice.AnyVideoInput.VideoStatus.VideoSyncFeedback.LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline + ioSlot]);
// // trilist.SetUShortSigAction((ApiMap.HdcpSupport[ioSlot]), u => TxDevice.SetHdcpSupportAll((ePdtHdcpSupport)(u)));
// // TxDevice.HdcpSupportAllFeedback.LinkInputSig(trilist.UShortInput[joinMap. + ioSlot]);
// // trilist.UShortInput[ApiMap.HdcpSupportCapability[ioSlot]].UShortValue = TxDevice.HdcpSupportCapability;
//}
//else
//{
// // dmChassis.VideoInputSyncFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[ApiMap.TxVideoSyncStatus[ioSlot]]);
//}
if (VideoInputSyncFeedbacks[ioSlot] != null)
VideoInputSyncFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber + ioSlotJoin]);
if (InputNameFeedbacks[ioSlot] != null)
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + ioSlotJoin]);
trilist.SetStringSigAction(joinMap.InputNames.JoinNumber + ioSlotJoin, new Action<string>(s =>
{
var inputCard = Dmps.SwitcherInputs[ioSlot] as DMInput;
if (inputCard != null)
{
if (inputCard.NameFeedback != null && !string.IsNullOrEmpty(inputCard.NameFeedback.StringValue) && inputCard.NameFeedback.StringValue != s)
if (inputCard.Name != null)
inputCard.Name.StringValue = s;
}
}));
if (InputEndpointOnlineFeedbacks[ioSlot] != null)
InputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.InputEndpointOnline.JoinNumber + ioSlotJoin]);
}
for (uint i = 1; i <= Dmps.NumberOfSwitcherOutputs; i++)
{
Debug.Console(2, this, "Linking Output Card {0}", i);
var ioSlot = i; var ioSlot = i;
var ioSlotJoin = ioSlot - 1; var ioSlotJoin = ioSlot - 1;
// Control // Control
trilist.SetUShortSigAction(joinMap.OutputVideo.JoinNumber + ioSlotJoin, o => ExecuteSwitch(o, ioSlot, eRoutingSignalType.Video)); trilist.SetUShortSigAction(joinMap.OutputVideo.JoinNumber + ioSlotJoin,
trilist.SetUShortSigAction(joinMap.OutputAudio.JoinNumber + ioSlotJoin, o => ExecuteSwitch(o, ioSlot, eRoutingSignalType.Audio)); o => ExecuteSwitch(o, ioSlot, eRoutingSignalType.Video));
trilist.SetUShortSigAction(joinMap.OutputAudio.JoinNumber + ioSlotJoin,
o => ExecuteSwitch(o, ioSlot, eRoutingSignalType.Audio));
trilist.SetStringSigAction(joinMap.OutputNames.JoinNumber + ioSlotJoin, s => trilist.SetStringSigAction(joinMap.OutputNames.JoinNumber + ioSlotJoin, s =>
{ {
var outputCard = Dmps.SwitcherOutputs[ioSlot] as DMOutput; var outputCard = Dmps.SwitcherOutputs[ioSlot] as DMOutput;
//Debug.Console(2, dmpsRouter, "Output Name String Sig Action for Output Card {0}", ioSlot); //Debug.Console(2, dmpsRouter, "Output Name String Sig Action for Output Card {0}", ioSlot);
if (outputCard != null) if (outputCard == null)
{ {
//Debug.Console(2, dmpsRouter, "Card Type: {0}", outputCard.CardInputOutputType); return;
}
if (!(outputCard is Card.Dmps3CodecOutput) && outputCard.NameFeedback != null) //Debug.Console(2, dmpsRouter, "Card Type: {0}", outputCard.CardInputOutputType);
{
if (!string.IsNullOrEmpty(outputCard.NameFeedback.StringValue)) if (outputCard is Card.Dmps3CodecOutput || outputCard.NameFeedback == null)
{ {
//Debug.Console(2, dmpsRouter, "NameFeedabck: {0}", outputCard.NameFeedback.StringValue); return;
}
if (outputCard.NameFeedback.StringValue != s && outputCard.Name != null) if (string.IsNullOrEmpty(outputCard.NameFeedback.StringValue))
{ {
outputCard.Name.StringValue = s; return;
} }
} //Debug.Console(2, dmpsRouter, "NameFeedabck: {0}", outputCard.NameFeedback.StringValue);
}
} if (outputCard.NameFeedback.StringValue != s && outputCard.Name != null)
}); {
outputCard.Name.StringValue = s;
// Feedback }
});
// Feedback
if (VideoOutputFeedbacks[ioSlot] != null) if (VideoOutputFeedbacks[ioSlot] != null)
VideoOutputFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputVideo.JoinNumber + ioSlotJoin]); {
VideoOutputFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputVideo.JoinNumber + ioSlotJoin]);
}
if (AudioOutputFeedbacks[ioSlot] != null) if (AudioOutputFeedbacks[ioSlot] != null)
AudioOutputFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputAudio.JoinNumber + ioSlotJoin]); {
AudioOutputFeedbacks[ioSlot].LinkInputSig(trilist.UShortInput[joinMap.OutputAudio.JoinNumber + ioSlotJoin]);
}
if (OutputNameFeedbacks[ioSlot] != null) if (OutputNameFeedbacks[ioSlot] != null)
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]); {
OutputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputNames.JoinNumber + ioSlotJoin]);
}
if (OutputVideoRouteNameFeedbacks[ioSlot] != null) if (OutputVideoRouteNameFeedbacks[ioSlot] != null)
OutputVideoRouteNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentVideoInputNames.JoinNumber + ioSlotJoin]); {
OutputVideoRouteNameFeedbacks[ioSlot].LinkInputSig(
trilist.StringInput[joinMap.OutputCurrentVideoInputNames.JoinNumber + ioSlotJoin]);
}
if (OutputAudioRouteNameFeedbacks[ioSlot] != null) if (OutputAudioRouteNameFeedbacks[ioSlot] != null)
OutputAudioRouteNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.OutputCurrentAudioInputNames.JoinNumber + ioSlotJoin]); {
OutputAudioRouteNameFeedbacks[ioSlot].LinkInputSig(
trilist.StringInput[joinMap.OutputCurrentAudioInputNames.JoinNumber + ioSlotJoin]);
}
if (OutputEndpointOnlineFeedbacks[ioSlot] != null) if (OutputEndpointOnlineFeedbacks[ioSlot] != null)
OutputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(trilist.BooleanInput[joinMap.OutputEndpointOnline.JoinNumber + ioSlotJoin]); {
} OutputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(
} trilist.BooleanInput[joinMap.OutputEndpointOnline.JoinNumber + ioSlotJoin]);
}
}
}
private void LinkInputsToApi(BasicTriList trilist, DmpsRoutingControllerJoinMap joinMap)
{
for (uint i = 1; i <= Dmps.SwitcherInputs.Count; i++)
{
Debug.Console(2, this, "Linking Input Card {0}", i);
var ioSlot = i;
var ioSlotJoin = ioSlot - 1;
if (VideoInputSyncFeedbacks[ioSlot] != null)
{
VideoInputSyncFeedbacks[ioSlot].LinkInputSig(
trilist.BooleanInput[joinMap.VideoSyncStatus.JoinNumber + ioSlotJoin]);
}
if (InputNameFeedbacks[ioSlot] != null)
{
InputNameFeedbacks[ioSlot].LinkInputSig(trilist.StringInput[joinMap.InputNames.JoinNumber + ioSlotJoin]);
}
trilist.SetStringSigAction(joinMap.InputNames.JoinNumber + ioSlotJoin, s =>
{
var inputCard = Dmps.SwitcherInputs[ioSlot] as DMInput;
if (inputCard == null)
{
return;
}
if (inputCard.NameFeedback == null || string.IsNullOrEmpty(inputCard.NameFeedback.StringValue) ||
inputCard.NameFeedback.StringValue == s)
{
return;
}
if (inputCard.Name != null)
{
inputCard.Name.StringValue = s;
}
});
if (InputEndpointOnlineFeedbacks[ioSlot] != null)
{
InputEndpointOnlineFeedbacks[ioSlot].LinkInputSig(
trilist.BooleanInput[joinMap.InputEndpointOnline.JoinNumber + ioSlotJoin]);
}
}
}
/// <summary> /// <summary>
/// Iterate the SwitcherOutputs collection to setup feedbacks and add routing ports /// Iterate the SwitcherOutputs collection to setup feedbacks and add routing ports
/// </summary> /// </summary>
void SetupOutputCards() void SetupOutputCards()
{ {
foreach (var card in Dmps.SwitcherOutputs) foreach (var card in Dmps.SwitcherOutputs)
{ {
Debug.Console(1, this, "Output Card Type: {0}", card.CardInputOutputType);
var outputCard = card as DMOutput;
var outputCard = card as DMOutput;
if (outputCard == null)
{
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()); Debug.Console(1, this, "Adding Output Card Number {0} Type: {1}", outputCard.Number, outputCard.CardInputOutputType.ToString());
VideoOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
if (outputCard != null)
{ {
VideoOutputFeedbacks[outputCard.Number] = new IntFeedback(() => if (outputCard.VideoOutFeedback != null) { return (ushort)outputCard.VideoOutFeedback.Number; }
{ return 0;
if (outputCard.VideoOutFeedback != null) { return (ushort)outputCard.VideoOutFeedback.Number; } ;
else { return 0; }; });
}); AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() =>
AudioOutputFeedbacks[outputCard.Number] = new IntFeedback(() => {
{ if (outputCard.AudioOutFeedback != null) { return (ushort)outputCard.AudioOutFeedback.Number; }
if (outputCard.AudioOutFeedback != null) { return (ushort)outputCard.AudioOutFeedback.Number; } return 0;
else { return 0; }; ;
}); });
OutputNameFeedbacks[outputCard.Number] = new StringFeedback(() => OutputNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
{
if (outputCard.NameFeedback != null && !string.IsNullOrEmpty(outputCard.NameFeedback.StringValue))
{ {
if (outputCard.NameFeedback != null && !string.IsNullOrEmpty(outputCard.NameFeedback.StringValue)) Debug.Console(2, this, "Output Card {0} Name: {1}", outputCard.Number, outputCard.NameFeedback.StringValue);
{ return outputCard.NameFeedback.StringValue;
Debug.Console(2, this, "Output Card {0} Name: {1}", outputCard.Number, outputCard.NameFeedback.StringValue); }
return outputCard.NameFeedback.StringValue; return "";
} });
else
{
return "";
}
});
OutputVideoRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() => OutputVideoRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
{
if (outputCard.VideoOutFeedback != null && outputCard.VideoOutFeedback.NameFeedback != null)
{ {
if (outputCard.VideoOutFeedback != null && outputCard.VideoOutFeedback.NameFeedback != null) return outputCard.VideoOutFeedback.NameFeedback.StringValue;
{ }
return outputCard.VideoOutFeedback.NameFeedback.StringValue; return NoRouteText;
} });
else OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
{ {
return NoRouteText; if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null)
}
});
OutputAudioRouteNameFeedbacks[outputCard.Number] = new StringFeedback(() =>
{ {
if (outputCard.AudioOutFeedback != null && outputCard.AudioOutFeedback.NameFeedback != null) return outputCard.AudioOutFeedback.NameFeedback.StringValue;
{ }
return outputCard.AudioOutFeedback.NameFeedback.StringValue; return NoRouteText;
} });
else
{
return NoRouteText;
} OutputEndpointOnlineFeedbacks[outputCard.Number] = new BoolFeedback(() => outputCard.EndpointOnlineFeedback);
});
OutputEndpointOnlineFeedbacks[outputCard.Number] = new BoolFeedback(() => { return outputCard.EndpointOnlineFeedback; }); AddOutputCard(outputCard.Number, outputCard);
AddOutputCard(outputCard.Number, outputCard);
}
} }
} }
@@ -494,18 +541,23 @@ namespace PepperDash.Essentials.DM
var cecPort = hdmiOutputCard.HdmiOutputPort; var cecPort = hdmiOutputCard.HdmiOutputPort;
AddHdmiOutputPort(number, cecPort); AddHdmiOutputPort(number, cecPort);
}
return; else if (outputCard is Card.Dmps3HdmiOutputBackend)
{
var hdmiOutputCard = outputCard as Card.Dmps3HdmiOutputBackend;
var cecPort = hdmiOutputCard.HdmiOutputPort;
AddHdmiOutputPort(number, cecPort);
} }
else if (outputCard is Card.Dmps3DmOutput) else if (outputCard is Card.Dmps3DmOutput)
{ {
var dmOutputCard = outputCard as Card.Dmps3DmOutput; AddDmOutputPort(number);
}
var cecPort = dmOutputCard.DmOutputPort; else if (outputCard is Card.Dmps3DmOutputBackend)
{
AddDmOutputPort(number); AddDmOutputPort(number);
return;
} }
else if (outputCard is Card.Dmps3ProgramOutput) else if (outputCard is Card.Dmps3ProgramOutput)
{ {
@@ -513,50 +565,51 @@ namespace PepperDash.Essentials.DM
var programOutput = new DmpsAudioOutputController(string.Format("processor-programAudioOutput"), "Program Audio Output", outputCard as Card.Dmps3OutputBase); var programOutput = new DmpsAudioOutputController(string.Format("processor-programAudioOutput"), "Program Audio Output", outputCard as Card.Dmps3OutputBase);
DeviceManager.AddDevice(programOutput); DeviceManager.AddDevice(programOutput);
return;
} }
else if (outputCard is Card.Dmps3AuxOutput) else if (outputCard is Card.Dmps3AuxOutput)
{ {
if (outputCard.CardInputOutputType == eCardInputOutputType.Dmps3Aux1Output) switch (outputCard.CardInputOutputType)
{ {
AddAudioOnlyOutputPort(number, "Aux1"); case eCardInputOutputType.Dmps3Aux1Output:
{
AddAudioOnlyOutputPort(number, "Aux1");
var aux1Output = new DmpsAudioOutputController(string.Format("processor-aux1AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3OutputBase); var aux1Output = new DmpsAudioOutputController(string.Format("processor-aux1AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3OutputBase);
DeviceManager.AddDevice(aux1Output); DeviceManager.AddDevice(aux1Output);
} }
else if (outputCard.CardInputOutputType == eCardInputOutputType.Dmps3Aux2Output) break;
{ case eCardInputOutputType.Dmps3Aux2Output:
AddAudioOnlyOutputPort(number, "Aux2"); {
AddAudioOnlyOutputPort(number, "Aux2");
var aux2Output = new DmpsAudioOutputController(string.Format("processor-aux2AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3OutputBase); var aux2Output = new DmpsAudioOutputController(string.Format("processor-aux2AudioOutput"), "Program Audio Output", outputCard as Card.Dmps3OutputBase);
DeviceManager.AddDevice(aux2Output); DeviceManager.AddDevice(aux2Output);
} }
return; break;
} }
else if (outputCard is Card.Dmps3CodecOutput) }
{ else if (outputCard is Card.Dmps3CodecOutput)
if (number == (uint)CrestronControlSystem.eDmps300cOutputs.Codec1 {
|| number == (uint)CrestronControlSystem.eDmps3200cOutputs.Codec1 switch (number)
|| number == (uint)CrestronControlSystem.eDmps3300cAecOutputs.Codec1 {
|| number == (uint)CrestronControlSystem.eDmps34K250COutputs.Codec1 case (uint)CrestronControlSystem.eDmps34K350COutputs.Codec1:
|| number == (uint)CrestronControlSystem.eDmps34K350COutputs.Codec1) case (uint)CrestronControlSystem.eDmps34K250COutputs.Codec1:
AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps300cOutputs.Codec1.ToString()); case (uint)CrestronControlSystem.eDmps3300cAecOutputs.Codec1:
else if (number == (uint)CrestronControlSystem.eDmps300cOutputs.Codec2 AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps300cOutputs.Codec1.ToString());
|| number == (uint)CrestronControlSystem.eDmps3200cOutputs.Codec2 break;
|| number == (uint)CrestronControlSystem.eDmps3300cAecOutputs.Codec2 case (uint)CrestronControlSystem.eDmps34K350COutputs.Codec2:
|| number == (uint)CrestronControlSystem.eDmps34K250COutputs.Codec2 case (uint)CrestronControlSystem.eDmps34K250COutputs.Codec2:
|| number == (uint)CrestronControlSystem.eDmps34K350COutputs.Codec2) case (uint)CrestronControlSystem.eDmps3300cAecOutputs.Codec2:
AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps300cOutputs.Codec2.ToString()); AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps300cOutputs.Codec2.ToString());
return; break;
} }
}
else if (outputCard is Card.Dmps3DialerOutput) else if (outputCard is Card.Dmps3DialerOutput)
{ {
AddAudioOnlyOutputPort(number, "Dialer"); AddAudioOnlyOutputPort(number, "Dialer");
return;
} }
else if (outputCard is Card.Dmps3DigitalMixOutput) else if (outputCard is Card.Dmps3DigitalMixOutput)
{ {
@@ -567,13 +620,11 @@ namespace PepperDash.Essentials.DM
if (number == (uint)CrestronControlSystem.eDmps34K250COutputs.Mix2 if (number == (uint)CrestronControlSystem.eDmps34K250COutputs.Mix2
|| number == (uint)CrestronControlSystem.eDmps34K300COutputs.Mix2 || number == (uint)CrestronControlSystem.eDmps34K300COutputs.Mix2
|| number == (uint)CrestronControlSystem.eDmps34K350COutputs.Mix2) || number == (uint)CrestronControlSystem.eDmps34K350COutputs.Mix2)
AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps34K250COutputs.Mix2.ToString()); AddAudioOnlyOutputPort(number, CrestronControlSystem.eDmps34K250COutputs.Mix2.ToString());
return;
} }
else if (outputCard is Card.Dmps3AecOutput) else if (outputCard is Card.Dmps3AecOutput)
{ {
AddAudioOnlyOutputPort(number, "Aec"); AddAudioOnlyOutputPort(number, "Aec");
return;
} }
else else
{ {

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using Crestron.SimplSharpPro.DM; using Crestron.SimplSharpPro.DM;
using Crestron.SimplSharpPro.DM.Cards;
using Crestron.SimplSharpPro.DM.Endpoints.Receivers; using Crestron.SimplSharpPro.DM.Endpoints.Receivers;
using Newtonsoft.Json; using Newtonsoft.Json;
using PepperDash.Core; using PepperDash.Core;
@@ -221,6 +222,10 @@ namespace PepperDash.Essentials.DM
DmRmcPropertiesConfig props, string pKey, uint ipid) DmRmcPropertiesConfig props, string pKey, uint ipid)
{ {
var parentDev = DeviceManager.GetDeviceForKey(pKey); var parentDev = DeviceManager.GetDeviceForKey(pKey);
if (parentDev is DmpsRoutingController)
{
return GetDmRmcControllerForDmps(key, name, typeName, parentDev as DmpsRoutingController, props.ParentOutputNumber);
}
if (!(parentDev is IDmSwitch)) if (!(parentDev is IDmSwitch))
{ {
Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a DM Chassis.", Debug.Console(0, "Cannot create DM device '{0}'. '{1}' is not a DM Chassis.",
@@ -285,6 +290,28 @@ namespace PepperDash.Essentials.DM
return null; return null;
} }
private static CrestronGenericBaseDevice GetDmRmcControllerForDmps(string key, string name, string typeName,
DmpsRoutingController controller, uint num)
{
Func<string, string, DMOutput, CrestronGenericBaseDevice> dmpsHandler;
if (ChassisCpu3Dict.TryGetValue(typeName.ToLower(), out dmpsHandler))
{
var output = controller.Dmps.SwitcherOutputs[num] as DMOutput;
if (output != null)
{
return dmpsHandler(key, name, output);
}
Debug.Console(0, Debug.ErrorLogLevel.Error,
"Cannot attach DM-RMC of type '{0}' to output {1} on DMPS chassis. Output is not a DM Output.",
typeName, num);
return null;
}
Debug.Console(0, Debug.ErrorLogLevel.Error, "Cannot create DM-RMC of type '{0}' to output {1} on DMPS chassis", typeName, num);
return null;
}
private static CrestronGenericBaseDevice GetDmRmcControllerForProcessor(string key, string name, string typeName, uint ipid) private static CrestronGenericBaseDevice GetDmRmcControllerForProcessor(string key, string name, string typeName, uint ipid)
{ {
try try
@@ -305,6 +332,8 @@ namespace PepperDash.Essentials.DM
return null; return null;
} }
} }
} }
public class DmRmcControllerFactory : EssentialsDeviceFactory<DmRmcControllerBase> public class DmRmcControllerFactory : EssentialsDeviceFactory<DmRmcControllerBase>

View File

@@ -6,390 +6,398 @@ using Crestron.SimplSharp;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Config; using PepperDash.Essentials.Core.Config;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
namespace PepperDash.Essentials.Devices.Common.DSP namespace PepperDash.Essentials.Devices.Common.DSP
{ {
// QUESTIONS: // QUESTIONS:
// //
// When subscribing, just use the Instance ID for Custom Name? // When subscribing, just use the Instance ID for Custom Name?
// Verbose on subscriptions? // Verbose on subscriptions?
// Example subscription feedback responses // Example subscription feedback responses
// ! "publishToken":"name" "value":-77.0 // ! "publishToken":"name" "value":-77.0
// ! "myLevelName" -77 // ! "myLevelName" -77
public class BiampTesiraForteDsp : DspBase public class BiampTesiraForteDsp : DspBase
{ {
public IBasicCommunication Communication { get; private set; } public IBasicCommunication Communication { get; private set; }
public CommunicationGather PortGather { get; private set; } public CommunicationGather PortGather { get; private set; }
public StatusMonitorBase CommunicationMonitor { get; private set; } public StatusMonitorBase CommunicationMonitor { get; private set; }
new public Dictionary<string, TesiraForteLevelControl> LevelControlPoints { get; private set; } public new Dictionary<string, TesiraForteLevelControl> LevelControlPoints { get; private set; }
public bool isSubscribed; public bool isSubscribed;
private CTimer SubscriptionTimer; private CTimer SubscriptionTimer;
CrestronQueue CommandQueue; private CrestronQueue CommandQueue;
bool CommandQueueInProgress = false; private bool CommandQueueInProgress = false;
//new public Dictionary<string, DspControlPoint> DialerControlPoints { get; private set; } //new public Dictionary<string, DspControlPoint> DialerControlPoints { get; private set; }
//new public Dictionary<string, DspControlPoint> SwitcherControlPoints { get; private set; } //new public Dictionary<string, DspControlPoint> SwitcherControlPoints { get; private set; }
/// <summary> /// <summary>
/// Shows received lines as hex /// Shows received lines as hex
/// </summary> /// </summary>
public bool ShowHexResponse { get; set; } public bool ShowHexResponse { get; set; }
public BiampTesiraForteDsp(string key, string name, IBasicCommunication comm, BiampTesiraFortePropertiesConfig props) : public BiampTesiraForteDsp(string key, string name, IBasicCommunication comm,
base(key, name) BiampTesiraFortePropertiesConfig props) :
{ base(key, name)
CommandQueue = new CrestronQueue(100); {
CommandQueue = new CrestronQueue(100);
Communication = comm;
var socket = comm as ISocketStatus; Communication = comm;
if (socket != null) var socket = comm as ISocketStatus;
{ if (socket != null)
// This instance uses IP control {
// This instance uses IP control
socket.ConnectionChange += new EventHandler<GenericSocketStatusChageEventArgs>(socket_ConnectionChange);
} socket.ConnectionChange += new EventHandler<GenericSocketStatusChageEventArgs>(socket_ConnectionChange);
else }
{ else
// This instance uses RS-232 control {
} // This instance uses RS-232 control
PortGather = new CommunicationGather(Communication, "\x0d\x0a"); }
PortGather.LineReceived += this.Port_LineReceived; PortGather = new CommunicationGather(Communication, "\x0d\x0a");
if (props.CommunicationMonitorProperties != null) PortGather.LineReceived += this.Port_LineReceived;
{ if (props.CommunicationMonitorProperties != null)
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, props.CommunicationMonitorProperties); {
} CommunicationMonitor = new GenericCommunicationMonitor(this, Communication,
else props.CommunicationMonitorProperties);
{ }
//#warning Need to deal with this poll string else
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, 120000, 120000, 300000, "SESSION get aliases\x0d\x0a"); {
} //#warning Need to deal with this poll string
CommunicationMonitor = new GenericCommunicationMonitor(this, Communication, 120000, 120000, 300000,
LevelControlPoints = new Dictionary<string, TesiraForteLevelControl>(); "SESSION get aliases\x0d\x0a");
}
foreach (KeyValuePair<string, BiampTesiraForteLevelControlBlockConfig> block in props.LevelControlBlocks)
{ LevelControlPoints = new Dictionary<string, TesiraForteLevelControl>();
this.LevelControlPoints.Add(block.Key, new TesiraForteLevelControl(block.Key, block.Value, this));
} foreach (KeyValuePair<string, BiampTesiraForteLevelControlBlockConfig> block in props.LevelControlBlocks)
{
} this.LevelControlPoints.Add(block.Key, new TesiraForteLevelControl(block.Key, block.Value, this));
}
public override bool CustomActivate()
{ }
Communication.Connect();
CommunicationMonitor.StatusChange += (o, a) => { Debug.Console(2, this, "Communication monitor state: {0}", CommunicationMonitor.Status); }; public override bool CustomActivate()
CommunicationMonitor.Start(); {
Communication.Connect();
CrestronConsole.AddNewConsoleCommand(SendLine, "send" + Key, "", ConsoleAccessLevelEnum.AccessOperator); CommunicationMonitor.StatusChange +=
CrestronConsole.AddNewConsoleCommand(s => Communication.Connect(), "con" + Key, "", ConsoleAccessLevelEnum.AccessOperator); (o, a) => { Debug.Console(2, this, "Communication monitor state: {0}", CommunicationMonitor.Status); };
return true; CommunicationMonitor.Start();
}
CrestronConsole.AddNewConsoleCommand(SendLine, "send" + Key, "", ConsoleAccessLevelEnum.AccessOperator);
void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs e) CrestronConsole.AddNewConsoleCommand(s => Communication.Connect(), "con" + Key, "",
{ ConsoleAccessLevelEnum.AccessOperator);
Debug.Console(2, this, "Socket Status Change: {0}", e.Client.ClientStatus.ToString()); return true;
}
if (e.Client.IsConnected)
{ private void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs e)
// Tasks on connect {
} Debug.Console(2, this, "Socket Status Change: {0}", e.Client.ClientStatus.ToString());
else
{ if (e.Client.IsConnected)
// Cleanup items from this session {
// Tasks on connect
if (SubscriptionTimer != null) }
{ else
SubscriptionTimer.Stop(); {
SubscriptionTimer = null; // Cleanup items from this session
}
if (SubscriptionTimer != null)
isSubscribed = false; {
CommandQueue.Clear(); SubscriptionTimer.Stop();
CommandQueueInProgress = false; SubscriptionTimer = null;
} }
}
isSubscribed = false;
/// <summary> CommandQueue.Clear();
/// Initiates the subscription process to the DSP CommandQueueInProgress = false;
/// </summary> }
void SubscribeToAttributes() }
{
SendLine("SESSION set verbose true"); /// <summary>
/// Initiates the subscription process to the DSP
foreach (KeyValuePair<string, TesiraForteLevelControl> level in LevelControlPoints) /// </summary>
{ private void SubscribeToAttributes()
level.Value.Subscribe(); {
} SendLine("SESSION set verbose true");
if (!CommandQueueInProgress) foreach (KeyValuePair<string, TesiraForteLevelControl> level in LevelControlPoints)
SendNextQueuedCommand(); {
level.Value.Subscribe();
ResetSubscriptionTimer(); }
}
if (!CommandQueueInProgress)
/// <summary> SendNextQueuedCommand();
/// Resets or Sets the subscription timer
/// </summary> ResetSubscriptionTimer();
void ResetSubscriptionTimer() }
{
isSubscribed = true; /// <summary>
/// Resets or Sets the subscription timer
if (SubscriptionTimer != null) /// </summary>
{ private void ResetSubscriptionTimer()
SubscriptionTimer = new CTimer(o => SubscribeToAttributes(), 30000); {
SubscriptionTimer.Reset(); isSubscribed = true;
} if (SubscriptionTimer != null)
} {
SubscriptionTimer = new CTimer(o => SubscribeToAttributes(), 30000);
/// <summary> SubscriptionTimer.Reset();
/// Handles a response message from the DSP
/// </summary> }
/// <param name="dev"></param> }
/// <param name="args"></param>
void Port_LineReceived(object dev, GenericCommMethodReceiveTextArgs args) /// <summary>
{ /// Handles a response message from the DSP
if (Debug.Level == 2) /// </summary>
Debug.Console(2, this, "RX: '{0}'", /// <param name="dev"></param>
ShowHexResponse ? ComTextHelper.GetEscapedText(args.Text) : args.Text); /// <param name="args"></param>
private void Port_LineReceived(object dev, GenericCommMethodReceiveTextArgs args)
Debug.Console(1, this, "RX: '{0}'", args.Text); {
if (Debug.Level == 2)
try Debug.Console(2, this, "RX: '{0}'",
{ ShowHexResponse ? ComTextHelper.GetEscapedText(args.Text) : args.Text);
if (args.Text.IndexOf("Welcome to the Tesira Text Protocol Server...") > -1)
{ Debug.Console(1, this, "RX: '{0}'", args.Text);
// Indicates a new TTP session
try
SubscribeToAttributes(); {
} if (args.Text.IndexOf("Welcome to the Tesira Text Protocol Server...") > -1)
else if (args.Text.IndexOf("publishToken") > -1) {
{ // Indicates a new TTP session
// response is from a subscribed attribute
SubscribeToAttributes();
string pattern = "! \"publishToken\":[\"](.*)[\"] \"value\":(.*)"; }
else if (args.Text.IndexOf("publishToken") > -1)
Match match = Regex.Match(args.Text, pattern); {
// response is from a subscribed attribute
if (match.Success)
{ string pattern = "! \"publishToken\":[\"](.*)[\"] \"value\":(.*)";
string key; Match match = Regex.Match(args.Text, pattern);
string customName; if (match.Success)
{
string value;
string key;
customName = match.Groups[1].Value;
string customName;
// Finds the key (everything before the '~' character
key = customName.Substring(0, customName.IndexOf("~", 0) - 1); string value;
value = match.Groups[2].Value; customName = match.Groups[1].Value;
foreach (KeyValuePair<string, TesiraForteLevelControl> controlPoint in LevelControlPoints) // Finds the key (everything before the '~' character
{ key = customName.Substring(0, customName.IndexOf("~", 0) - 1);
if (customName == controlPoint.Value.LevelCustomName || customName == controlPoint.Value.MuteCustomName)
{ value = match.Groups[2].Value;
controlPoint.Value.ParseSubscriptionMessage(customName, value);
return; foreach (KeyValuePair<string, TesiraForteLevelControl> controlPoint in LevelControlPoints)
} {
if (customName == controlPoint.Value.LevelCustomName ||
} customName == controlPoint.Value.MuteCustomName)
} {
controlPoint.Value.ParseSubscriptionMessage(customName, value);
/// same for dialers return;
/// same for switchers }
} }
else if (args.Text.IndexOf("+OK") > -1) }
{
if (args.Text == "+OK" || args.Text.IndexOf("list\":") > -1 ) // Check for a simple "+OK" only 'ack' repsonse or a list response and ignore /// same for dialers
return; /// same for switchers
// response is not from a subscribed attribute. From a get/set/toggle/increment/decrement command }
else if (args.Text.IndexOf("+OK") > -1)
if (!CommandQueue.IsEmpty) {
{ if (args.Text == "+OK" || args.Text.IndexOf("list\":") > -1)
if (CommandQueue.Peek() is QueuedCommand) // Check for a simple "+OK" only 'ack' repsonse or a list response and ignore
{ return;
// Expected response belongs to a child class
QueuedCommand tempCommand = (QueuedCommand)CommandQueue.TryToDequeue(); // response is not from a subscribed attribute. From a get/set/toggle/increment/decrement command
//Debug.Console(1, this, "Command Dequeued. CommandQueue Size: {0}", CommandQueue.Count);
if (!CommandQueue.IsEmpty)
tempCommand.ControlPoint.ParseGetMessage(tempCommand.AttributeCode, args.Text); {
} if (CommandQueue.Peek() is QueuedCommand)
else {
{ // Expected response belongs to a child class
// Expected response belongs to this class QueuedCommand tempCommand = (QueuedCommand) CommandQueue.TryToDequeue();
string temp = (string)CommandQueue.TryToDequeue(); //Debug.Console(1, this, "Command Dequeued. CommandQueue Size: {0}", CommandQueue.Count);
//Debug.Console(1, this, "Command Dequeued. CommandQueue Size: {0}", CommandQueue.Count);
tempCommand.ControlPoint.ParseGetMessage(tempCommand.AttributeCode, args.Text);
} }
else
if (CommandQueue.IsEmpty) {
CommandQueueInProgress = false; // Expected response belongs to this class
else string temp = (string) CommandQueue.TryToDequeue();
SendNextQueuedCommand(); //Debug.Console(1, this, "Command Dequeued. CommandQueue Size: {0}", CommandQueue.Count);
} }
if (CommandQueue.IsEmpty)
} CommandQueueInProgress = false;
else if (args.Text.IndexOf("-ERR") > -1) else
{ SendNextQueuedCommand();
// Error response
}
switch (args.Text)
{
case "-ERR ALREADY_SUBSCRIBED": }
{ else if (args.Text.IndexOf("-ERR") > -1)
ResetSubscriptionTimer(); {
break; // Error response
}
default: switch (args.Text)
{ {
Debug.Console(0, this, "Error From DSP: '{0}'", args.Text); case "-ERR ALREADY_SUBSCRIBED":
break; {
} ResetSubscriptionTimer();
} break;
}
} default:
} {
catch (Exception e) Debug.Console(0, this, "Error From DSP: '{0}'", args.Text);
{ break;
if (Debug.Level == 2) }
Debug.Console(2, this, "Error parsing response: '{0}'\n{1}", args.Text, e); }
}
}
} }
catch (Exception e)
/// <summary> {
/// Sends a command to the DSP (with delimiter appended) if (Debug.Level == 2)
/// </summary> Debug.Console(2, this, "Error parsing response: '{0}'\n{1}", args.Text, e);
/// <param name="s">Command to send</param> }
public void SendLine(string s)
{ }
Debug.Console(1, this, "TX: '{0}'", s);
Communication.SendText(s + "\x0a"); /// <summary>
} /// Sends a command to the DSP (with delimiter appended)
/// </summary>
/// <summary> /// <param name="s">Command to send</param>
/// Adds a command from a child module to the queue public void SendLine(string s)
/// </summary> {
/// <param name="command">Command object from child module</param> Debug.Console(1, this, "TX: '{0}'", s);
public void EnqueueCommand(QueuedCommand commandToEnqueue) Communication.SendText(s + "\x0a");
{ }
CommandQueue.Enqueue(commandToEnqueue);
//Debug.Console(1, this, "Command (QueuedCommand) Enqueued '{0}'. CommandQueue has '{1}' Elements.", commandToEnqueue.Command, CommandQueue.Count); /// <summary>
/// Adds a command from a child module to the queue
if(!CommandQueueInProgress) /// </summary>
SendNextQueuedCommand(); /// <param name="command">Command object from child module</param>
} public void EnqueueCommand(QueuedCommand commandToEnqueue)
{
/// <summary> CommandQueue.Enqueue(commandToEnqueue);
/// Adds a raw string command to the queue //Debug.Console(1, this, "Command (QueuedCommand) Enqueued '{0}'. CommandQueue has '{1}' Elements.", commandToEnqueue.Command, CommandQueue.Count);
/// </summary>
/// <param name="command"></param> if (!CommandQueueInProgress)
public void EnqueueCommand(string command) SendNextQueuedCommand();
{ }
CommandQueue.Enqueue(command);
//Debug.Console(1, this, "Command (string) Enqueued '{0}'. CommandQueue has '{1}' Elements.", command, CommandQueue.Count);
/// <summary>
if (!CommandQueueInProgress) /// Adds a raw string command to the queue
SendNextQueuedCommand(); /// </summary>
} /// <param name="command"></param>
public void EnqueueCommand(string command)
/// <summary> {
/// Sends the next queued command to the DSP CommandQueue.Enqueue(command);
/// </summary> //Debug.Console(1, this, "Command (string) Enqueued '{0}'. CommandQueue has '{1}' Elements.", command, CommandQueue.Count);
void SendNextQueuedCommand()
{ if (!CommandQueueInProgress)
//Debug.Console(2, this, "Attempting to send next queued command. CommandQueueInProgress: {0} Communication isConnected: {1}", CommandQueueInProgress, Communication.IsConnected); SendNextQueuedCommand();
}
//if (CommandQueue.IsEmpty)
// CommandQueueInProgress = false; /// <summary>
/// Sends the next queued command to the DSP
//Debug.Console(1, this, "CommandQueue has {0} Elements:\n", CommandQueue.Count); /// </summary>
private void SendNextQueuedCommand()
//foreach (object o in CommandQueue) {
//{ //Debug.Console(2, this, "Attempting to send next queued command. CommandQueueInProgress: {0} Communication isConnected: {1}", CommandQueueInProgress, Communication.IsConnected);
// if (o is string)
// Debug.Console(1, this, "{0}", o); //if (CommandQueue.IsEmpty)
// else if(o is QueuedCommand) // CommandQueueInProgress = false;
// {
// var item = (QueuedCommand)o; //Debug.Console(1, this, "CommandQueue has {0} Elements:\n", CommandQueue.Count);
// Debug.Console(1, this, "{0}", item.Command);
// } //foreach (object o in CommandQueue)
//} //{
// if (o is string)
//Debug.Console(1, this, "End of CommandQueue"); // Debug.Console(1, this, "{0}", o);
// else if(o is QueuedCommand)
if (Communication.IsConnected && !CommandQueue.IsEmpty) // {
{ // var item = (QueuedCommand)o;
CommandQueueInProgress = true; // Debug.Console(1, this, "{0}", item.Command);
// }
if (CommandQueue.Peek() is QueuedCommand) //}
{
QueuedCommand nextCommand = new QueuedCommand(); //Debug.Console(1, this, "End of CommandQueue");
nextCommand = (QueuedCommand)CommandQueue.Peek(); if (Communication.IsConnected && !CommandQueue.IsEmpty)
{
SendLine(nextCommand.Command); CommandQueueInProgress = true;
}
else if (CommandQueue.Peek() is QueuedCommand)
{ {
string nextCommand = (string)CommandQueue.Peek(); QueuedCommand nextCommand = new QueuedCommand();
SendLine(nextCommand); nextCommand = (QueuedCommand) CommandQueue.Peek();
}
} SendLine(nextCommand.Command);
}
} else
{
/// <summary> string nextCommand = (string) CommandQueue.Peek();
/// Sends a command to execute a preset
/// </summary> SendLine(nextCommand);
/// <param name="name">Preset Name</param> }
public override void RunPreset(string name) }
{
SendLine(string.Format("DEVICE recallPreset {0}", name)); }
}
/// <summary>
public class QueuedCommand /// Sends a command to execute a preset
{ /// </summary>
public string Command { get; set; } /// <param name="name">Preset Name</param>
public string AttributeCode { get; set; } public void RunPreset(string name)
public TesiraForteControlPoint ControlPoint { get; set; } {
} SendLine(string.Format("DEVICE recallPreset {0}", name));
} }
public class BiampTesiraForteDspFactory : EssentialsDeviceFactory<BiampTesiraForteDsp> public class QueuedCommand
{ {
public BiampTesiraForteDspFactory() public string Command { get; set; }
{ public string AttributeCode { get; set; }
TypeNames = new List<string>() { "biamptesira" }; public TesiraForteControlPoint ControlPoint { get; set; }
} }
}
public override EssentialsDevice BuildDevice(DeviceConfig dc)
{ public class BiampTesiraForteDspFactory : EssentialsDeviceFactory<BiampTesiraForteDsp>
Debug.Console(1, "Factory Attempting to create new BiampTesira Device"); {
var comm = CommFactory.CreateCommForDevice(dc); public BiampTesiraForteDspFactory()
var props = Newtonsoft.Json.JsonConvert.DeserializeObject<BiampTesiraFortePropertiesConfig>( {
dc.Properties.ToString()); TypeNames = new List<string>() {"biamptesira"};
return new BiampTesiraForteDsp(dc.Key, dc.Name, comm, props); }
}
} public override EssentialsDevice BuildDevice(DeviceConfig dc)
{
} Debug.Console(1, "Factory Attempting to create new BiampTesira Device");
var comm = CommFactory.CreateCommForDevice(dc);
var props = Newtonsoft.Json.JsonConvert.DeserializeObject<BiampTesiraFortePropertiesConfig>(
dc.Properties.ToString());
return new BiampTesiraForteDsp(dc.Key, dc.Name, comm, props);
}
}
}

View File

@@ -15,18 +15,19 @@ namespace PepperDash.Essentials.Devices.Common.DSP
public Dictionary<string, DspControlPoint> DialerControlPoints { get; private set; } public Dictionary<string, DspControlPoint> DialerControlPoints { get; private set; }
public Dictionary<string, DspControlPoint> SwitcherControlPoints { get; private set; } public Dictionary<string, DspControlPoint> SwitcherControlPoints { get; private set; }
public abstract void RunPreset(string name); public DspBase(string key, string name) :
base(key, name)
public DspBase(string key, string name) : {
base(key, name) { } }
// in audio call feedback // in audio call feedback
// VOIP // VOIP
// Phone dialer // Phone dialer
} }
// Fusion // Fusion