Compare commits

..

44 Commits
1.7.2 ... 1.7.3

Author SHA1 Message Date
Andrew Welker
9abd911a95 Merge pull request #573 from PepperDash/release/1.7.3
Release/1.7.3
2021-01-26 15:46:35 -07:00
Andrew Welker
968f85b04e Merge pull request #566 from PepperDash/hotfix/nuspec-core-version
Hotfix/nuspec core version
2021-01-26 14:02:17 -07:00
Andrew Welker
6e09ef35ab Merge branch 'development' into hotfix/nuspec-core-version 2021-01-26 13:39:41 -07:00
Andrew Welker
a36bce4d5e Merge pull request #571 from PepperDash/hotfix/ComsMessageQueue-throws-exception
Hotfix/coms message queue throws exception
2021-01-26 13:39:29 -07:00
Andrew Welker
5374e58197 Merge pull request #565 from PepperDash/hotfix/nuspec-core-version
Update PD Core version in Essentials nuspec
2021-01-26 13:39:03 -07:00
Andrew Welker
cbfa7d869b Merge branch 'main' into hotfix/nuspec-core-version 2021-01-26 13:23:37 -07:00
Andrew Welker
434fb1be59 Merge branch 'development' into hotfix/ComsMessageQueue-throws-exception 2021-01-26 13:12:05 -07:00
Andrew Welker
dbec078dae Merge pull request #568 from PepperDash/hotfix/ComsMessageQueue-throws-exception
Validate method now checks the parameter
2021-01-26 13:11:52 -07:00
Andrew Welker
e9a8e42525 Merge pull request #572 from PepperDash/feature/genericqueue-upgrades
Sets the queue size to 25
2021-01-26 13:11:37 -07:00
Andrew Welker
8ad7b429a2 Merge branch 'development' into feature/genericqueue-upgrades 2021-01-26 12:49:48 -07:00
Andrew Welker
a1c27d64ad Merge pull request #570 from PepperDash/hotfix/fusion-error-rollup
Hotfix/fusion error rollup
2021-01-26 12:47:43 -07:00
Andrew Welker
4814d0f769 Merge branch 'main' into hotfix/ComsMessageQueue-throws-exception 2021-01-26 12:45:14 -07:00
Neil Dorin
b7d7196071 Sets the queue size to 25 2021-01-26 12:32:04 -07:00
Andrew Welker
d8225a80b6 Merge branch 'development' into hotfix/fusion-error-rollup 2021-01-26 12:31:33 -07:00
Andrew Welker
1b0d9ae904 Merge branch 'main' into hotfix/nuspec-core-version 2021-01-26 11:47:09 -07:00
Andrew Welker
7228733aad Merge pull request #569 from PepperDash/hotfix/fusion-error-rollup
Updates to properly clear errors when there are none and set message …
2021-01-26 11:46:49 -07:00
Nick Genovese
809639c3f9 Validate method now checks the parameter 2021-01-26 13:17:55 -05:00
Andrew Welker
24e59e1474 Update PepperDash_Essentials_Core.nuspec 2021-01-26 11:05:42 -07:00
Neil Dorin
42c483f581 Updates to properly clear errors when there are none and set message to "Room Ok." 2021-01-25 17:56:20 -07:00
Andrew Welker
7ba0ecdf5c Merge pull request #556 from PepperDash/feature/add-hdbasettx-support
Feature/add hdbasettx support
2021-01-25 16:56:23 -07:00
Andrew Welker
ece36b4042 Merge branch 'development' into feature/add-hdbasettx-support 2021-01-25 15:19:34 -07:00
Andrew Welker
ca5b35b39c Merge pull request #558 from PepperDash/feature/add-fusion-joinmaps
Feature/add fusion joinmaps
2021-01-25 15:19:17 -07:00
Andrew Welker
8f804766e5 Merge branch 'development' into feature/add-fusion-joinmaps 2021-01-25 12:34:02 -07:00
Neil Dorin
00207d1570 Merge pull request #561 from PepperDash/feature/genericqueue-upgrades
#560 Adds constructors with priority and fixed debug statments to use…
2021-01-25 11:18:46 -07:00
Neil Dorin
65747b6ad2 #560 Adds constructors with priority and fixed debug statments to use error log 2021-01-25 10:55:27 -07:00
Andrew Welker
f7174e2492 Merge branch 'development' into feature/add-fusion-joinmaps 2021-01-22 13:09:08 -07:00
Andrew Welker
55cbd094be Merge branch 'development' into feature/add-hdbasettx-support 2021-01-20 17:06:20 -07:00
Andrew Welker
da5fd7e743 Merge pull request #555 from PepperDash/hotfix/videocodecbase-incoming-call-popup
Hotfix/videocodecbase incoming call popup
2021-01-20 14:52:05 -07:00
Neil Dorin
8545622c79 Merge branch 'development' into hotfix/videocodecbase-incoming-call-popup 2021-01-20 14:33:01 -07:00
Neil Dorin
2f172c998a Merge pull request #552 from batourin/development
Add hdbasettx device to Essentials DM
2021-01-18 15:28:09 -07:00
Maxim Batourine
6d66c5adee add HDBaseTTxController to project file 2021-01-18 13:16:19 -05:00
Maxim Batourine
8ccbed6d81 Add hdbasettx device 2021-01-16 22:57:45 -05:00
Andrew Welker
c3c58e3201 Merge pull request #551 from PepperDash/hotfix/zoomroom-obtp-dialing
Hotfix/zoomroom obtp dialing
2021-01-15 12:08:45 -07:00
Andrew Welker
f547eb3a09 Merge branch 'development' into hotfix/zoomroom-obtp-dialing 2021-01-15 11:50:35 -07:00
Andrew Welker
6dbe1b6f31 Merge pull request #547 from PepperDash/feature/merge-into-dev
Feature/merge into dev
2021-01-13 09:14:23 -07:00
Andrew Welker
e15ed3c77f Merge branch 'development' into feature/merge-into-dev 2021-01-13 08:28:15 -07:00
Neil Dorin
435879e19b Merge pull request #541 from batourin/development
[BUG] Add safety check for casting device into interface
2021-01-12 16:57:43 -07:00
Neil Dorin
17ccaecf5e Merge pull request #534 from PepperDash/feature/get-prop-by-name-fixes
Feature/get prop by name fixes
2021-01-12 16:56:12 -07:00
Neil Dorin
684b8db546 Merge branch 'development' into feature/get-prop-by-name-fixes 2021-01-12 15:49:18 -07:00
Neil Dorin
14991bce95 Merge pull request #544 from PepperDash/release/1.7.0
Release/1.7.0
2021-01-12 11:04:50 -07:00
Maxim Batourine
08fe408dc1 Add safety check for casting device into interface
(device as IRoutingInputsOutputs).InputPorts will throw Exception on accessing InputPorts property if device do not implement such interface.
2021-01-07 19:31:24 -05:00
Jason Alborough
0a34f48e0a Fixes for the static GetPropertyByName method in DeviceJsonApi...now returns a property object rather than a PropertyInfo object 2020-12-18 17:07:20 -05:00
Jason Alborough
fc91ba7c1e Fixes Namespace and Implements IKeyed in both interfaces. 2020-12-16 15:00:30 -05:00
Jason Alborough
1cad1976ee #499 Adds interfaces ILogStrings and ILogStringsWithLevel to PepperDash_Essentials_Core.Interfaces 2020-12-16 14:39:53 -05:00
13 changed files with 234 additions and 45 deletions

View File

@@ -83,13 +83,13 @@ namespace PepperDash.Essentials.Core
/// <returns></returns>
public static object GetPropertyByName(string deviceObjectPath, string propertyName)
{
var obj = FindObjectOnPath(deviceObjectPath);
if(obj == null)
var dev = FindObjectOnPath(deviceObjectPath);
if(dev == null)
return "{ \"error\":\"No Device\"}";
object prop = dev.GetType().GetCType().GetProperty(propertyName).GetValue(dev, null);
CType t = obj.GetType();
var prop = t.GetProperty(propertyName);
// var prop = t.GetProperty(propertyName);
if (prop != null)
{
return prop;

View File

@@ -360,9 +360,9 @@ namespace PepperDash.Essentials.Core
{
var device = GetDeviceForKey(s);
if (device == null) return;
var inputPorts = (device as IRoutingInputsOutputs).InputPorts;
var outputPorts = (device as IRoutingInputsOutputs).OutputPorts;
if (device == null) return;
var inputPorts = ((device as IRoutingInputs) != null) ? (device as IRoutingInputs).InputPorts : null;
var outputPorts = ((device as IRoutingOutputs) != null) ? (device as IRoutingOutputs).OutputPorts : null;
if (inputPorts != null)
{
Debug.Console(0, "Device {0} has {1} Input Ports:", s, inputPorts.Count);

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Core;
namespace PepperDash.Essentials.Core.Interfaces
{
public interface ILogStrings : IKeyed
{
/// <summary>
/// Defines a class that is capable of logging a string
/// </summary>
void SendToLog(IKeyed device, string logMessage);
}
}

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using PepperDash.Core;
namespace PepperDash.Essentials.Core.Interfaces
{
public interface ILogStringsWithLevel : IKeyed
{
/// <summary>
/// Defines a class that is capable of logging a string with an int level
/// </summary>
void SendToLog(IKeyed device, Debug.ErrorLogLevel level,string logMessage);
}
}

View File

@@ -64,30 +64,34 @@ namespace PepperDash.Essentials.Core
initialStatus = MonitorStatus.InWarning;
prefix = "2:";
}
else if (InWarning.Count() > 0)
else if (IsOk.Count() > 0)
initialStatus = MonitorStatus.IsOk;
else
initialStatus = MonitorStatus.StatusUnknown;
// Build the error message string
if (InError.Count() > 0 || InWarning.Count() > 0)
{
StringBuilder sb = new StringBuilder(prefix);
if (InError.Count() > 0)
{
// Do string splits and joins
sb.Append(string.Format("{0} Errors:", InError.Count()));
foreach (var mon in InError)
sb.Append(string.Format("{0}, ", mon.Parent.Key));
}
if (InWarning.Count() > 0)
{
sb.Append(string.Format("{0} Warnings:", InWarning.Count()));
foreach (var mon in InWarning)
sb.Append(string.Format("{0}, ", mon.Parent.Key));
}
Message = sb.ToString();
}
if (InError.Count() > 0 || InWarning.Count() > 0)
{
StringBuilder sb = new StringBuilder(prefix);
if (InError.Count() > 0)
{
// Do string splits and joins
sb.Append(string.Format("{0} Errors:", InError.Count()));
foreach (var mon in InError)
sb.Append(string.Format("{0}, ", mon.Parent.Key));
}
if (InWarning.Count() > 0)
{
sb.Append(string.Format("{0} Warnings:", InWarning.Count()));
foreach (var mon in InWarning)
sb.Append(string.Format("{0}, ", mon.Parent.Key));
}
Message = sb.ToString();
}
else
{
Message = "Room Ok.";
}
// Want to fire even if status doesn't change because the message may.
Status = initialStatus;

View File

@@ -225,6 +225,8 @@
<Compile Include="Gateways\CenRfgwController.cs" />
<Compile Include="Gateways\EssentialsRfGatewayConfig.cs" />
<Compile Include="Global\EthernetAdapterInfo.cs" />
<Compile Include="Interfaces\ILogStrings.cs" />
<Compile Include="Interfaces\ILogStringsWithLevel.cs" />
<Compile Include="Queues\ComsMessage.cs" />
<Compile Include="Queues\ProcessStringMessage.cs" />
<Compile Include="Queues\GenericQueue.cs" />

View File

@@ -14,7 +14,7 @@
<tags>crestron 3series 4series</tags>
<repository type="git" url="https://github.com/PepperDash/Essentials"/>
<dependencies>
<dependency id="PepperDashCore" version="[1.0.44, 1.1.0)"/>
<dependency id="PepperDashCore" version="[1.0.45, 1.1.0)"/>
</dependencies>
</metadata>
<files>

View File

@@ -40,7 +40,7 @@ namespace PepperDash_Essentials_Core.Queues
private void Validate(IBasicCommunication coms, object message)
{
if (_coms == null)
if (coms == null)
throw new ArgumentNullException("coms");
if (message == null)

View File

@@ -15,23 +15,36 @@ namespace PepperDash_Essentials_Core.Queues
protected readonly Thread _worker;
protected readonly CEvent _waitHandle = new CEvent();
private readonly bool _delayEnabled;
private readonly int _delayTime;
private bool _delayEnabled;
private int _delayTime;
/// <summary>
/// If the instance has been disposed.
/// </summary>
public bool Disposed { get; private set; }
/// <summary>
/// Constructor with no thread priority
/// </summary>
/// <param name="key"></param>
public GenericQueue(string key)
: this(key, Thread.eThreadPriority.NotSet)
{
}
/// <summary>
/// Constructor for generic queue with no pacing
/// </summary>
/// <param name="key">Key</param>
public GenericQueue(string key)
public GenericQueue(string key, Thread.eThreadPriority priority)
{
_key = key;
_queue = new CrestronQueue<IQueueMessage>();
_worker = new Thread(ProcessQueue, null, Thread.eThreadStartOptions.Running);
_queue = new CrestronQueue<IQueueMessage>(25);
_worker = new Thread(ProcessQueue, null, Thread.eThreadStartOptions.Running)
{
Priority = priority
};
CrestronEnvironment.ProgramStatusEventHandler += programEvent =>
{
@@ -49,11 +62,28 @@ namespace PepperDash_Essentials_Core.Queues
/// <param name="pacing">Pacing in ms between actions</param>
public GenericQueue(string key, int pacing)
: this(key)
{
SetDelayValues(pacing);
}
/// <summary>
/// Constructor with pacing and priority
/// </summary>
/// <param name="key"></param>
/// <param name="pacing"></param>
/// <param name="priority"></param>
public GenericQueue(string key, int pacing, Thread.eThreadPriority priority)
: this(key, priority)
{
SetDelayValues(pacing);
}
private void SetDelayValues(int pacing)
{
_delayEnabled = pacing > 0;
_delayTime = pacing;
}
/// <summary>
/// Thread callback
/// </summary>
@@ -83,7 +113,7 @@ namespace PepperDash_Essentials_Core.Queues
}
catch (Exception ex)
{
Debug.ConsoleWithLog(0, this, "Caught an exception in the Queue {0}\r{1}\r{2}", ex.Message, ex.InnerException, ex.StackTrace);
Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Caught an exception in the Queue {0}\r{1}\r{2}", ex.Message, ex.InnerException, ex.StackTrace);
}
}
else _waitHandle.Wait();

View File

@@ -122,7 +122,9 @@ namespace PepperDash.Essentials.DM
return new DmTx4kz302CController(key, name, new DmTx4kz302C(chassis.Inputs[num]));
if (typeName.StartsWith("dmtx401"))
return new DmTx401CController(key, name, new DmTx401C(chassis.Inputs[num]));
}
if (typeName.StartsWith("hdbasettx"))
return new HDBaseTTxController(key, name, new HDTx3CB(chassis.Inputs[num]));
}
else
{
if (typeName.StartsWith("dmtx200"))
@@ -145,7 +147,9 @@ namespace PepperDash.Essentials.DM
return new DmTx4kz302CController(key, name, new DmTx4kz302C(ipid, chassis.Inputs[num]));
if (typeName.StartsWith("dmtx401"))
return new DmTx401CController(key, name, new DmTx401C(ipid, chassis.Inputs[num]));
}
if (typeName.StartsWith("hdbasettx"))
return new HDBaseTTxController(key, name, new HDTx3CB(ipid, chassis.Inputs[num]));
}
}
catch (Exception e)
{
@@ -355,7 +359,7 @@ namespace PepperDash.Essentials.DM
public DmTxControllerFactory()
{
TypeNames = new List<string>() { "dmtx200c", "dmtx201c", "dmtx201s", "dmtx4k100c", "dmtx4k202c", "dmtx4kz202c", "dmtx4k302c", "dmtx4kz302c",
"dmtx401c", "dmtx401s", "dmtx4k100c1g", "dmtx4kz100c1g" };
"dmtx401c", "dmtx401s", "dmtx4k100c1g", "dmtx4kz100c1g", "hdbasettx" };
}
public override EssentialsDevice BuildDevice(DeviceConfig dc)

View File

@@ -0,0 +1,113 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crestron.SimplSharp;
using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DeviceSupport;
using Crestron.SimplSharpPro.DM.Endpoints.Transmitters;
using Newtonsoft.Json;
using PepperDash.Core;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges;
namespace PepperDash.Essentials.DM
{
/// <summary>
/// Controller class for suitable for HDBaseT transmitters
/// </summary>
[Description("Wrapper Class for HDBaseT devices based on HDTx3CB class")]
public class HDBaseTTxController: BasicDmTxControllerBase, IRoutingInputsOutputs, IComPorts
{
public RoutingInputPort HdmiIn { get; private set; }
public RoutingOutputPort DmOut { get; private set; }
public HDBaseTTxController(string key, string name, HDTx3CB tx)
: base(key, name, tx)
{
HdmiIn = new RoutingInputPort(DmPortName.HdmiIn1, eRoutingSignalType.Audio | eRoutingSignalType.Video,
eRoutingPortConnectionType.Hdmi, null, this) { Port = tx };
DmOut = new RoutingOutputPort(DmPortName.DmOut, eRoutingSignalType.Audio | eRoutingSignalType.Video,
eRoutingPortConnectionType.DmCat, null, this);
InputPorts = new RoutingPortCollection<RoutingInputPort> { HdmiIn };
OutputPorts = new RoutingPortCollection<RoutingOutputPort> { DmOut };
}
#region IRoutingInputs Members
public RoutingPortCollection<RoutingInputPort> InputPorts { get; private set; }
#endregion
#region IRoutingOutputs Members
public RoutingPortCollection<RoutingOutputPort> OutputPorts { get; private set; }
#endregion
#region IComPorts Members
public CrestronCollection<ComPort> ComPorts { get { return (Hardware as HDTx3CB).ComPorts; } }
public int NumberOfComPorts { get { return (Hardware as HDTx3CB).NumberOfComPorts; } }
#endregion
#region CrestronBridgeableBaseDevice abstract overrides
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
var joinMap = new HDBaseTTxControllerJoinMap(joinStart);
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
if (!string.IsNullOrEmpty(joinMapSerialized))
joinMap = JsonConvert.DeserializeObject<HDBaseTTxControllerJoinMap>(joinMapSerialized);
if (bridge != null)
{
bridge.AddJoinMap(Key, joinMap);
}
else
{
Debug.Console(0, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
}
Debug.Console(1, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
this.IsOnline.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
}
#endregion
}
public class HDBaseTTxControllerJoinMap : JoinMapBaseAdvanced
{
[JoinName("IsOnline")]
public JoinDataComplete IsOnline = new JoinDataComplete(
new JoinData
{
JoinNumber = 1,
JoinSpan = 1
},
new JoinMetadata
{
Description = "HDBaseT device online feedback",
JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital
});
/// <summary>
/// Plugin device BridgeJoinMap constructor
/// </summary>
/// <param name="joinStart">This will be the join it starts on the EISC bridge</param>
public HDBaseTTxControllerJoinMap(uint joinStart)
: base(joinStart, typeof(HDBaseTTxControllerJoinMap))
{
}
}
}

View File

@@ -65,12 +65,12 @@
</Reference>
<Reference Include="SimplSharpCustomAttributesInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCustomAttributesInterface.dll</HintPath>
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCustomAttributesInterface.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SimplSharpHelperInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpHelperInterface.dll</HintPath>
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpHelperInterface.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SimplSharpNewtonsoft, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
@@ -79,7 +79,7 @@
</Reference>
<Reference Include="SimplSharpPro, Version=1.5.3.17, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpPro.exe</HintPath>
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpPro.exe</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SimplSharpReflectionInterface, Version=1.0.5583.25238, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
@@ -108,6 +108,7 @@
<Compile Include="Endpoints\Transmitters\DmTx4kz202CController.cs" />
<Compile Include="Endpoints\Transmitters\DmTx201SController.cs" />
<Compile Include="Endpoints\Transmitters\DmTx4kz100Controller.cs" />
<Compile Include="Endpoints\Transmitters\HDBaseTTxController.cs" />
<Compile Include="Endpoints\Transmitters\TxInterfaces.cs" />
<Compile Include="IDmSwitch.cs" />
<Compile Include="Config\DmpsRoutingConfig.cs" />

View File

@@ -69,12 +69,12 @@
</Reference>
<Reference Include="SimplSharpCustomAttributesInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCustomAttributesInterface.dll</HintPath>
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCustomAttributesInterface.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SimplSharpHelperInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpHelperInterface.dll</HintPath>
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpHelperInterface.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SimplSharpNewtonsoft, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
@@ -83,7 +83,7 @@
</Reference>
<Reference Include="SimplSharpPro, Version=1.5.3.17, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpPro.exe</HintPath>
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpPro.exe</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="SimplSharpReflectionInterface, Version=1.0.5583.25238, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">