diff --git a/PepperDashEssentials/Bridges/JoinMaps/AirMediaControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/AirMediaControllerJoinMap.cs
new file mode 100644
index 00000000..042a3bf3
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/AirMediaControllerJoinMap.cs
@@ -0,0 +1,110 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class AirMediaControllerJoinMap : JoinMapBase
+ {
+ #region Digitals
+ ///
+ /// Indicates that the device is online when high
+ ///
+ public uint IsOnline { get; set; }
+ ///
+ /// Indicates that the device is in session when high
+ ///
+ public uint IsInSession { get; set; }
+ ///
+ /// Indicates sync detected on HDMI input when high
+ ///
+ public uint HdmiVideoSync { get; set; }
+ ///
+ /// Set High to enable automatic input routing and low to disable. Feedback high when enabled
+ ///
+ public uint AutomaticInputRoutingEnabled { get; set; }
+ #endregion
+
+ #region Analogs
+ ///
+ /// Selects source and provides feedback
+ ///
+ public uint VideoOut { get; set; }
+ ///
+ /// Provided error feedback
+ ///
+ public uint ErrorFB { get; set; }
+ ///
+ /// Indicates the number of connected users as feedback
+ ///
+ public uint NumberOfUsersConnectedFB { get; set; }
+ ///
+ /// Sets the login code and provides the current code as feedback
+ ///
+ public uint LoginCode { get; set; }
+ #endregion
+
+ #region Serials
+ ///
+ /// Provides the name defined in config as feedback
+ ///
+ public uint Name { get; set; }
+ ///
+ /// Provides the connection address as feedback
+ ///
+ public uint ConnectionAddressFB { get; set; }
+ ///
+ /// Provides the hostname as feedback
+ ///
+ public uint HostnameFB { get; set; }
+ ///
+ /// Provides the serial number as feedback
+ ///
+ public uint SerialNumberFeedback { get; set; }
+ #endregion
+
+ public AirMediaControllerJoinMap()
+ {
+ // Digital
+ IsOnline = 1;
+ IsInSession = 2;
+ HdmiVideoSync = 3;
+ AutomaticInputRoutingEnabled = 4;
+
+ // Analog
+ VideoOut = 1;
+ ErrorFB = 2;
+ NumberOfUsersConnectedFB = 3;
+ LoginCode = 4;
+
+ // Serial
+ Name = 1;
+ ConnectionAddressFB = 2;
+ HostnameFB = 3;
+ SerialNumberFeedback = 4;
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ IsOnline = IsOnline + joinOffset;
+ IsInSession = IsInSession + joinOffset;
+ HdmiVideoSync = HdmiVideoSync + joinOffset;
+ AutomaticInputRoutingEnabled = AutomaticInputRoutingEnabled + joinOffset;
+
+ VideoOut = VideoOut + joinOffset;
+ ErrorFB = ErrorFB + joinOffset;
+ NumberOfUsersConnectedFB = NumberOfUsersConnectedFB + joinOffset;
+ LoginCode = LoginCode + joinOffset;
+
+ Name = Name + joinOffset;
+ ConnectionAddressFB = ConnectionAddressFB + joinOffset;
+ HostnameFB = HostnameFB + joinOffset;
+ SerialNumberFeedback = SerialNumberFeedback + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs
new file mode 100644
index 00000000..5a37892f
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ ///
+ /// Join map for CameraBase devices
+ ///
+ public class CameraControllerJoinMap : JoinMapBaseAdvanced
+ {
+ [JoinName("TiltUp")]
+ public JoinDataComplete TiltUp = new JoinDataComplete(new JoinData() { JoinNumber = 1, JoinSpan = 1 }, new JoinMetadata() { Label = "Tilt Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("TiltDown")]
+ public JoinDataComplete TiltDown = new JoinDataComplete(new JoinData() { JoinNumber = 2, JoinSpan = 1 }, new JoinMetadata() { Label = "Tilt Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PanLeft")]
+ public JoinDataComplete PanLeft = new JoinDataComplete(new JoinData() { JoinNumber = 3, JoinSpan = 1 }, new JoinMetadata() { Label = "Pan Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PanRight")]
+ public JoinDataComplete PanRight = new JoinDataComplete(new JoinData() { JoinNumber = 4, JoinSpan = 1 }, new JoinMetadata() { Label = "Pan Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ZoomIn")]
+ public JoinDataComplete ZoomIn = new JoinDataComplete(new JoinData() { JoinNumber = 5, JoinSpan = 1 }, new JoinMetadata() { Label = "Zoom In", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ZoomOut")]
+ public JoinDataComplete ZoomOut = new JoinDataComplete(new JoinData() { JoinNumber = 6, JoinSpan = 1 }, new JoinMetadata() { Label = "Zoom Out", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData() { JoinNumber = 9, JoinSpan = 1 }, new JoinMetadata() { Label = "Is Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PowerOn")]
+ public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData() { JoinNumber = 7, JoinSpan = 1 }, new JoinMetadata() { Label = "Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PowerOff")]
+ public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData() { JoinNumber = 8, JoinSpan = 1 }, new JoinMetadata() { Label = "Power Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("NumberOfPresets")]
+ public JoinDataComplete NumberOfPresets = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 1 }, new JoinMetadata() { Label = "Tells Essentials the number of defined presets", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("PresetRecallStart")]
+ public JoinDataComplete PresetRecallStart = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 20 }, new JoinMetadata() { Label = "Preset Recall Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PresetLabelStart")]
+ public JoinDataComplete PresetLabelStart = new JoinDataComplete(new JoinData() { JoinNumber = 11, JoinSpan = 20 }, new JoinMetadata() { Label = "Preset Label Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("PresetSaveStart")]
+ public JoinDataComplete PresetSaveStart = new JoinDataComplete(new JoinData() { JoinNumber = 31, JoinSpan = 20 }, new JoinMetadata() { Label = "Preset Save Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("CameraModeAuto")]
+ public JoinDataComplete CameraModeAuto = new JoinDataComplete(new JoinData() { JoinNumber = 51, JoinSpan = 1 }, new JoinMetadata() { Label = "Camera Mode Auto", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("CameraModeManual")]
+ public JoinDataComplete CameraModeManual = new JoinDataComplete(new JoinData() { JoinNumber = 52, JoinSpan = 1 }, new JoinMetadata() { Label = "Camera Mode Manual", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("CameraModeOff")]
+ public JoinDataComplete CameraModeOff = new JoinDataComplete(new JoinData() { JoinNumber = 53, JoinSpan = 1 }, new JoinMetadata() { Label = "Camera Mode Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("SupportsCameraModeAuto")]
+ public JoinDataComplete SupportsCameraModeAuto = new JoinDataComplete(new JoinData() { JoinNumber = 55, JoinSpan = 1 }, new JoinMetadata() { Label = "Supports Camera Mode Auto", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("SupportsCameraModeOff")]
+ public JoinDataComplete SupportsCameraModeOff = new JoinDataComplete(new JoinData() { JoinNumber = 56, JoinSpan = 1 }, new JoinMetadata() { Label = "Supports Camera Mode Off", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("SupportsPresets")]
+ public JoinDataComplete SupportsPresets = new JoinDataComplete(new JoinData() { JoinNumber = 57, JoinSpan = 1 }, new JoinMetadata() { Label = "Supports Presets", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ public CameraControllerJoinMap(uint joinStart)
+ : base(joinStart, typeof(CameraControllerJoinMap))
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/DigitalLoggerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/DigitalLoggerJoinMap.cs
new file mode 100644
index 00000000..2b0a1c15
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/DigitalLoggerJoinMap.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class DigitalLoggerJoinMap : JoinMapBase
+ {
+ public uint IsOnline { get; set; }
+ public uint CircuitNames { get; set; }
+ public uint CircuitState { get; set; }
+ public uint CircuitCycle { get; set; }
+ public uint CircuitIsCritical { get; set; }
+ public uint CircuitOnCmd { get; set; }
+ public uint CircuitOffCmd { get; set; }
+
+ public DigitalLoggerJoinMap()
+ {
+ // Digital
+ IsOnline = 9;
+ CircuitState = 0;
+ CircuitCycle = 0;
+ CircuitIsCritical = 10;
+ CircuitOnCmd = 10;
+ CircuitOffCmd = 20;
+ // Serial
+ CircuitNames = 0;
+ // Analog
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ IsOnline = IsOnline + joinOffset;
+ CircuitNames = CircuitNames + joinOffset;
+ CircuitState = CircuitState + joinOffset;
+ CircuitCycle = CircuitCycle + joinOffset;
+ CircuitIsCritical = CircuitIsCritical + joinOffset;
+ CircuitOnCmd = CircuitOnCmd + joinOffset;
+ CircuitOffCmd = CircuitOffCmd + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/DisplayControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/DisplayControllerJoinMap.cs
new file mode 100644
index 00000000..ddbec182
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/DisplayControllerJoinMap.cs
@@ -0,0 +1,117 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class DisplayControllerJoinMap : JoinMapBase
+ {
+ #region Digitals
+ ///
+ /// Turns the display off and reports power off feedback
+ ///
+ public uint PowerOff { get; set; }
+ ///
+ /// Turns the display on and repots power on feedback
+ ///
+ public uint PowerOn { get; set; }
+ ///
+ /// Indicates that the display device supports two way communication when high
+ ///
+ public uint IsTwoWayDisplay { get; set; }
+ ///
+ /// Increments the volume while high
+ ///
+ public uint VolumeUp { get; set; }
+ ///
+ /// Decrements teh volume while high
+ ///
+ public uint VolumeDown { get; set; }
+ ///
+ /// Toggles the mute state. Feedback is high when volume is muted
+ ///
+ public uint VolumeMute { get; set; }
+ ///
+ /// Range of digital joins to select inputs and report current input as feedback
+ ///
+ public uint InputSelectOffset { get; set; }
+ ///
+ /// Range of digital joins to report visibility for input buttons
+ ///
+ public uint ButtonVisibilityOffset { get; set; }
+ ///
+ /// High if the device is online
+ ///
+ public uint IsOnline { get; set; }
+ #endregion
+
+ #region Analogs
+ ///
+ /// Analog join to set the input and report current input as feedback
+ ///
+ public uint InputSelect { get; set; }
+ ///
+ /// Sets the volume level and reports the current level as feedback
+ ///
+ public uint VolumeLevel { get; set; }
+ #endregion
+
+ #region Serials
+ ///
+ /// Reports the name of the display as defined in config as feedback
+ ///
+ public uint Name { get; set; }
+ ///
+ /// Range of serial joins that reports the names of the inputs as feedback
+ ///
+ public uint InputNamesOffset { get; set; }
+ #endregion
+
+ public DisplayControllerJoinMap()
+ {
+ // Digital
+ IsOnline = 50;
+ PowerOff = 1;
+ PowerOn = 2;
+ IsTwoWayDisplay = 3;
+ VolumeUp = 5;
+ VolumeDown = 6;
+ VolumeMute = 7;
+
+ ButtonVisibilityOffset = 40;
+ InputSelectOffset = 10;
+
+ // Analog
+ InputSelect = 11;
+ VolumeLevel = 5;
+
+ // Serial
+ Name = 1;
+ InputNamesOffset = 10;
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ IsOnline = IsOnline + joinOffset;
+ PowerOff = PowerOff + joinOffset;
+ PowerOn = PowerOn + joinOffset;
+ IsTwoWayDisplay = IsTwoWayDisplay + joinOffset;
+ ButtonVisibilityOffset = ButtonVisibilityOffset + joinOffset;
+ Name = Name + joinOffset;
+ InputNamesOffset = InputNamesOffset + joinOffset;
+ InputSelectOffset = InputSelectOffset + joinOffset;
+
+ InputSelect = InputSelect + joinOffset;
+
+ VolumeUp = VolumeUp + joinOffset;
+ VolumeDown = VolumeDown + joinOffset;
+ VolumeMute = VolumeMute + joinOffset;
+ VolumeLevel = VolumeLevel + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/DmBladeChassisControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/DmBladeChassisControllerJoinMap.cs
new file mode 100644
index 00000000..8a245ad2
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/DmBladeChassisControllerJoinMap.cs
@@ -0,0 +1,109 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges {
+ public class DmBladeChassisControllerJoinMap : JoinMapBase {
+ #region Digital/Analogs
+ #endregion
+
+ #region Digitals
+ ///
+ /// High when device is online
+ ///
+ public uint IsOnline { get; set; }
+ ///
+ /// Range reports video sync feedback for each input
+ ///
+ public uint VideoSyncStatus { get; set; }
+ ///
+ /// Range reports high if corresponding input's endpoint is online
+ ///
+ public uint InputEndpointOnline { get; set; }
+ ///
+ /// Range reports high if corresponding output's endpoint is online
+ ///
+ public uint OutputEndpointOnline { get; set; }
+ ///
+ /// Range reports high if corresponding input's transmitter supports bridging as a separate device for detailed AV switching, HDCP control, etc.
+ ///
+ public uint TxAdvancedIsPresent { get; set; } // indicates that there is an attached transmitter that should be bridged to be interacted with
+ #endregion
+
+ #region Analogs
+ ///
+ /// Range sets and reports the current video source for the corresponding output
+ ///
+ public uint OutputVideo { get; set; }
+ ///
+ /// Range sets and reports the current HDCP state for the corresponding input card
+ ///
+ public uint HdcpSupportState { get; set; }
+ ///
+ /// Range reports the highest supported HDCP state level for the corresponding input card
+ ///
+ public uint HdcpSupportCapability { get; set; }
+ #endregion
+
+ #region Serials
+ ///
+ /// Range sets and reports the name for the corresponding input card
+ ///
+ public uint InputNames { get; set; }
+ ///
+ /// Range sets and reports the name for the corresponding output card
+ ///
+ public uint OutputNames { get; set; }
+ ///
+ /// Range reports the name of the current video source for the corresponding output card
+ ///
+ public uint OutputCurrentVideoInputNames { get; set; }
+ ///
+ /// Range reports the current input resolution for each corresponding input card
+ ///
+ public uint InputCurrentResolution { get; set; }
+ #endregion
+
+ public DmBladeChassisControllerJoinMap() {
+ //Digital/Analog
+
+ //Digital
+ IsOnline = 11;
+ VideoSyncStatus = 100; //101-299
+ InputEndpointOnline = 500; //501-699
+ OutputEndpointOnline = 700; //701-899
+ TxAdvancedIsPresent = 1000; //1001-1199
+
+ //Analog
+ OutputVideo = 100; //101-299
+ HdcpSupportState = 1000; //1001-1199
+ HdcpSupportCapability = 1200; //1201-1399
+
+
+ //Serial
+ InputNames = 100; //101-299
+ OutputNames = 300; //301-499
+ OutputCurrentVideoInputNames = 2000; //2001-2199
+ InputCurrentResolution = 2400; // 2401-2599
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart) {
+ var joinOffset = joinStart - 1;
+
+ IsOnline = IsOnline + joinOffset;
+ OutputVideo = OutputVideo + joinOffset;
+ VideoSyncStatus = VideoSyncStatus + joinOffset;
+ InputNames = InputNames + joinOffset;
+ OutputNames = OutputNames + joinOffset;
+ OutputCurrentVideoInputNames = OutputCurrentVideoInputNames + joinOffset;
+ InputCurrentResolution = InputCurrentResolution + joinOffset;
+ InputEndpointOnline = InputEndpointOnline + joinOffset;
+ OutputEndpointOnline = OutputEndpointOnline + joinOffset;
+ HdcpSupportState = HdcpSupportState + joinOffset;
+ HdcpSupportCapability = HdcpSupportCapability + joinOffset;
+ }
+ }
+}
diff --git a/PepperDashEssentials/Bridges/JoinMaps/DmChassisControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/DmChassisControllerJoinMap.cs
new file mode 100644
index 00000000..ff6a42d9
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/DmChassisControllerJoinMap.cs
@@ -0,0 +1,151 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class DmChassisControllerJoinMap : JoinMapBase
+ {
+#region Digital/Analogs
+ ///
+ /// Analog input sets System ID, output reports current ID as feedback.
+ /// Digital input applies System ID, output is high when applying busy.
+ ///
+ public uint SystemId { get; set; }
+#endregion
+
+#region Digitals
+ ///
+ /// High when device is online
+ ///
+ public uint IsOnline { get; set; }
+ ///
+ /// Range reports video sync feedback for each input
+ ///
+ public uint VideoSyncStatus { get; set; }
+ ///
+ /// Range reports high if corresponding input's endpoint is online
+ ///
+ public uint InputEndpointOnline { get; set; }
+ ///
+ /// Range reports high if corresponding output's endpoint is online
+ ///
+ public uint OutputEndpointOnline { get; set; }
+ ///
+ /// Range reports high if corresponding input's transmitter supports bridging as a separate device for detailed AV switching, HDCP control, etc.
+ ///
+ public uint TxAdvancedIsPresent { get; set; } // indicates that there is an attached transmitter that should be bridged to be interacted with
+ ///
+ /// Range reports high if corresponding output is disabled by HDCP.
+ ///
+ public uint OutputDisabledByHdcp { get; set; } // indicates that there is an attached transmitter that should be bridged to be interacted with
+#endregion
+
+#region Analogs
+ ///
+ /// Range sets and reports the current video source for the corresponding output
+ ///
+ public uint OutputVideo { get; set; }
+ ///
+ /// Range sets and reports the current audio source for the corresponding output
+ ///
+ public uint OutputAudio { get; set; }
+ ///
+ /// Range sets and reports the current Usb source for the corresponding output
+ ///
+ public uint OutputUsb { get; set; }
+ ///
+ /// Range sets and reports the current Usb source for the corresponding input
+ ///
+ public uint InputUsb { get; set; }
+ ///
+ /// Range sets and reports the current HDCP state for the corresponding input card
+ ///
+ public uint HdcpSupportState { get; set; }
+ ///
+ /// Range reports the highest supported HDCP state level for the corresponding input card
+ ///
+ public uint HdcpSupportCapability { get; set; }
+#endregion
+
+#region Serials
+ ///
+ /// Range sets and reports the name for the corresponding input card
+ ///
+ public uint InputNames { get; set; }
+ ///
+ /// Range sets and reports the name for the corresponding output card
+ ///
+ public uint OutputNames { get; set; }
+ ///
+ /// Range reports the name of the current video source for the corresponding output card
+ ///
+ public uint OutputCurrentVideoInputNames { get; set; }
+ ///
+ /// Range reports the name of the current audio source for the corresponding output card
+ ///
+ public uint OutputCurrentAudioInputNames { get; set; }
+ ///
+ /// Range reports the current input resolution for each corresponding input card
+ ///
+ public uint InputCurrentResolution { get; set; }
+#endregion
+
+ public DmChassisControllerJoinMap()
+ {
+ //Digital/Analog
+ SystemId = 10; // Analog sets/gets SystemId, digital input applies and provides feedback of ID change busy
+
+ //Digital
+ IsOnline = 11;
+ VideoSyncStatus = 100; //101-299
+ InputEndpointOnline = 500; //501-699
+ OutputEndpointOnline = 700; //701-899
+ TxAdvancedIsPresent = 1000; //1001-1199
+ OutputDisabledByHdcp = 1200; //1201-1399
+
+ //Analog
+ OutputVideo = 100; //101-299
+ OutputAudio = 300; //301-499
+ OutputUsb = 500; //501-699
+ InputUsb = 700; //701-899
+ HdcpSupportState = 1000; //1001-1199
+ HdcpSupportCapability = 1200; //1201-1399
+
+
+ //Serial
+ InputNames = 100; //101-299
+ OutputNames = 300; //301-499
+ OutputCurrentVideoInputNames = 2000; //2001-2199
+ OutputCurrentAudioInputNames = 2200; //2201-2399
+ InputCurrentResolution = 2400; // 2401-2599
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ SystemId = SystemId + joinOffset;
+ IsOnline = IsOnline + joinOffset;
+ OutputVideo = OutputVideo + joinOffset;
+ OutputAudio = OutputAudio + joinOffset;
+ OutputUsb = OutputUsb + joinOffset;
+ InputUsb = InputUsb + joinOffset;
+ VideoSyncStatus = VideoSyncStatus + joinOffset;
+ InputNames = InputNames + joinOffset;
+ OutputNames = OutputNames + joinOffset;
+ OutputCurrentVideoInputNames = OutputCurrentVideoInputNames + joinOffset;
+ OutputCurrentAudioInputNames = OutputCurrentAudioInputNames + joinOffset;
+ InputCurrentResolution = InputCurrentResolution + joinOffset;
+ InputEndpointOnline = InputEndpointOnline + joinOffset;
+ OutputEndpointOnline = OutputEndpointOnline + joinOffset;
+ HdcpSupportState = HdcpSupportState + joinOffset;
+ HdcpSupportCapability = HdcpSupportCapability + joinOffset;
+ OutputDisabledByHdcp = OutputDisabledByHdcp + joinOffset;
+ TxAdvancedIsPresent = TxAdvancedIsPresent + joinOffset;
+ }
+ }
+}
diff --git a/PepperDashEssentials/Bridges/JoinMaps/DmRmcControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/DmRmcControllerJoinMap.cs
new file mode 100644
index 00000000..7aa8081a
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/DmRmcControllerJoinMap.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class DmRmcControllerJoinMap : JoinMapBase
+ {
+ #region Digitals
+ ///
+ /// High when device is online (if not attached to a DMP3 or DM chassis with a CPU3 card
+ ///
+ public uint IsOnline { get; set; }
+ #endregion
+
+ #region Serials
+ ///
+ /// Reports the current output resolution
+ ///
+ public uint CurrentOutputResolution { get; set; }
+ ///
+ /// Reports the EDID manufacturer value
+ ///
+ public uint EdidManufacturer { get; set; }
+ ///
+ /// Reports the EDID Name value
+ ///
+ public uint EdidName { get; set; }
+ ///
+ /// Reports the EDID preffered timing value
+ ///
+ public uint EdidPrefferedTiming { get; set; }
+ ///
+ /// Reports the EDID serial number value
+ ///
+ public uint EdidSerialNumber { get; set; }
+ #endregion
+
+ public DmRmcControllerJoinMap()
+ {
+ // Digital
+ IsOnline = 1;
+
+ // Serial
+ CurrentOutputResolution = 1;
+ EdidManufacturer = 2;
+ EdidName = 3;
+ EdidPrefferedTiming = 4;
+ EdidSerialNumber = 5;
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ IsOnline = IsOnline + joinOffset;
+ CurrentOutputResolution = CurrentOutputResolution + joinOffset;
+ EdidManufacturer = EdidManufacturer + joinOffset;
+ EdidName = EdidName + joinOffset;
+ EdidPrefferedTiming = EdidPrefferedTiming + joinOffset;
+ EdidSerialNumber = EdidSerialNumber + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/DmTxControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/DmTxControllerJoinMap.cs
new file mode 100644
index 00000000..6d5c2775
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/DmTxControllerJoinMap.cs
@@ -0,0 +1,98 @@
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class DmTxControllerJoinMap : JoinMapBase
+ {
+ #region Digitals
+ ///
+ /// High when device is online (if not attached to a DMP3 or DM chassis with a CPU3 card
+ ///
+ public uint IsOnline { get; set; }
+ ///
+ /// High when video sync is detected
+ ///
+ public uint VideoSyncStatus { get; set; }
+ ///
+ ///
+ ///
+ public uint FreeRunEnabled { get; set; }
+ #endregion
+
+ #region Analogs
+ ///
+ /// Sets and reports the video source
+ ///
+ public uint VideoInput { get; set; }
+ ///
+ /// Sets and reports the audio source
+ ///
+ public uint AudioInput { get; set; }
+ ///
+ /// Reports the highest supported HDCP state level for the corresponding input card
+ ///
+ public uint HdcpSupportCapability { get; set; }
+ ///
+ /// Sets and reports the current HDCP state for the corresponding input port
+ ///
+ public uint Port1HdcpState { get; set; }
+ ///
+ /// Sets and reports the current HDCP state for the corresponding input port
+ ///
+ public uint Port2HdcpState { get; set; }
+
+ ///
+ /// Sets and reports the current VGA Brightness level
+ ///
+ public uint VgaBrightness { get; set; }
+
+ ///
+ /// Sets and reports the current VGA Contrast level
+ ///
+ public uint VgaContrast { get; set; }
+ #endregion
+
+ #region Serials
+ ///
+ /// Reports the current input resolution
+ ///
+ public uint CurrentInputResolution { get; set; }
+ #endregion
+
+
+ public DmTxControllerJoinMap()
+ {
+ // Digital
+ IsOnline = 1;
+ VideoSyncStatus = 2;
+ FreeRunEnabled = 3;
+ // Serial
+ CurrentInputResolution = 1;
+ // Analog
+ VideoInput = 1;
+ AudioInput = 2;
+ HdcpSupportCapability = 3;
+ Port1HdcpState = 4;
+ Port2HdcpState = 5;
+ VgaBrightness = 6;
+ VgaContrast = 7;
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ IsOnline = IsOnline + joinOffset;
+ VideoSyncStatus = VideoSyncStatus + joinOffset;
+ FreeRunEnabled = FreeRunEnabled + joinOffset;
+ CurrentInputResolution = CurrentInputResolution + joinOffset;
+ VideoInput = VideoInput + joinOffset;
+ AudioInput = AudioInput + joinOffset;
+ HdcpSupportCapability = HdcpSupportCapability + joinOffset;
+ Port1HdcpState = Port1HdcpState + joinOffset;
+ Port2HdcpState = Port2HdcpState + joinOffset;
+ VgaBrightness = VgaBrightness + joinOffset;
+ VgaContrast = VgaContrast + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
new file mode 100644
index 00000000..faa30775
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class DmpsAudioOutputControllerJoinMap : JoinMapBase
+ {
+ #region Digital/Analog
+ ///
+ /// Range of joins for Master Volume
+ /// Analog join 1 is volume level and feedback
+ /// Digital join 1 is Mute on and feedback
+ /// Digital join 2 is Mute off and feedback
+ /// Digital join 3 is volume up
+ /// Digital join 4 is volume down
+ ///
+ public uint MasterVolume { get; set; }
+ ///
+ /// Range of joins for Source Volume
+ /// Analog join 11 is volume level and feedback
+ /// Digital join 11 is Mute on and feedback
+ /// Digital join 12 is Mute off and feedback
+ /// Digital join 13 is volume up
+ /// Digital join 14 is volume down
+ ///
+ public uint SourceVolume { get; set; }
+ ///
+ /// Range of joins for Codec1 Volume (if applicable)
+ /// Analog join 21 is volume level and feedback
+ /// Digital join 21 is Mute on and feedback
+ /// Digital join 22 is Mute off and feedback
+ /// Digital join 23 is volume up
+ /// Digital join 24 is volume down
+ ///
+ public uint Codec1Volume { get; set; }
+ ///
+ /// Range of joins for Codec2 Volume (if applicable)
+ /// Analog join 31 is volume level and feedback
+ /// Digital join 31 is Mute on and feedback
+ /// Digital join 32 is Mute off and feedback
+ /// Digital join 33 is volume up
+ /// Digital join 34 is volume down
+ ///
+ public uint Codec2Volume { get; set; }
+ #endregion
+
+ public DmpsAudioOutputControllerJoinMap()
+ {
+ MasterVolume = 1; // 1-10
+ SourceVolume = 11; // 11-20
+ Codec1Volume = 21; // 21-30
+ Codec2Volume = 31; // 31-40
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart;
+
+ MasterVolume = MasterVolume + joinOffset;
+ SourceVolume = SourceVolume + joinOffset;
+ Codec1Volume = Codec1Volume + joinOffset;
+ Codec2Volume = Codec2Volume + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs
new file mode 100644
index 00000000..ba3a8cd0
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs
@@ -0,0 +1,127 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class DmpsRoutingControllerJoinMap : JoinMapBase
+ {
+ #region Digitals
+ ///
+ /// Range reports video sync feedback for each input
+ ///
+ public uint VideoSyncStatus { get; set; }
+ ///
+ /// Range reports high if corresponding input's endpoint is online
+ ///
+ public uint InputEndpointOnline { get; set; }
+ ///
+ /// Range reports high if corresponding output's endpoint is online
+ ///
+ public uint OutputEndpointOnline { get; set; }
+ #endregion
+
+
+ #region Analogs
+ ///
+ /// Range sets and reports the current video source for the corresponding output
+ ///
+ public uint OutputVideo { get; set; }
+ ///
+ /// Range sets and reports the current audio source for the corresponding output
+ ///
+ public uint OutputAudio { get; set; }
+ ///
+ /// Range sets and reports the current Usb source for the corresponding output
+ ///
+ //public uint OutputUsb { get; set; }
+ /////
+ ///// Range sets and reports the current Usb source for the corresponding input
+ /////
+ //public uint InputUsb { get; set; }
+ /////
+ ///// Range sets and reports the current HDCP state for the corresponding input card
+ /////
+ //public uint HdcpSupportState { get; set; }
+ /////
+ ///// Range reports the highest supported HDCP state level for the corresponding input card
+ /////
+ //public uint HdcpSupportCapability { get; set; }
+ #endregion
+
+ #region Serials
+ ///
+ /// Range sets and reports the name for the corresponding input card
+ ///
+ public uint InputNames { get; set; }
+ ///
+ /// Range sets and reports the name for the corresponding output card
+ ///
+ public uint OutputNames { get; set; }
+ ///
+ /// Range reports the name of the current video source for the corresponding output card
+ ///
+ public uint OutputCurrentVideoInputNames { get; set; }
+ ///
+ /// Range reports the name of the current audio source for the corresponding output card
+ ///
+ public uint OutputCurrentAudioInputNames { get; set; }
+ ///
+ /// Range reports the current input resolution for each corresponding input card
+ ///
+ public uint InputCurrentResolution { get; set; }
+ #endregion
+
+
+ public DmpsRoutingControllerJoinMap()
+ {
+ //Digital
+ VideoSyncStatus = 100; //101-299
+ InputEndpointOnline = 500; //501-699
+ OutputEndpointOnline = 700; //701-899
+
+ //Analog
+ OutputVideo = 100; //101-299
+ OutputAudio = 300; //301-499
+ //OutputUsb = 500; //501-699
+ //InputUsb = 700; //701-899
+ VideoSyncStatus = 100; //101-299
+ //HdcpSupportState = 1000; //1001-1199
+ //HdcpSupportCapability = 1200; //1201-1399
+
+
+ //Serial
+ InputNames = 100; //101-299
+ OutputNames = 300; //301-499
+ OutputCurrentVideoInputNames = 2000; //2001-2199
+ OutputCurrentAudioInputNames = 2200; //2201-2399
+ InputCurrentResolution = 2400; // 2401-2599
+ InputEndpointOnline = 500; //501-699
+ OutputEndpointOnline = 700; //701-899
+
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ OutputVideo = OutputVideo + joinOffset;
+ OutputAudio = OutputAudio + joinOffset;
+ //OutputUsb = OutputUsb + joinOffset;
+ //InputUsb = InputUsb + joinOffset;
+ VideoSyncStatus = VideoSyncStatus + joinOffset;
+ InputNames = InputNames + joinOffset;
+ OutputNames = OutputNames + joinOffset;
+ OutputCurrentVideoInputNames = OutputCurrentVideoInputNames + joinOffset;
+ OutputCurrentAudioInputNames = OutputCurrentAudioInputNames + joinOffset;
+ InputCurrentResolution = InputCurrentResolution + joinOffset;
+ InputEndpointOnline = InputEndpointOnline + joinOffset;
+ OutputEndpointOnline = OutputEndpointOnline + joinOffset;
+ //HdcpSupportState = HdcpSupportState + joinOffset;
+ //HdcpSupportCapability = HdcpSupportCapability + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/GenericLightingJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/GenericLightingJoinMap.cs
new file mode 100644
index 00000000..df5606d0
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/GenericLightingJoinMap.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+
+using PepperDash.Essentials.Core;
+
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class GenericLightingJoinMap : JoinMapBase
+ {
+ public uint IsOnline { get; set; }
+ public uint SelectScene { get; set; }
+ public uint LightingSceneOffset { get; set; }
+ public uint ButtonVisibilityOffset { get; set; }
+ public uint IntegrationIdSet { get; set; }
+
+ public GenericLightingJoinMap()
+ {
+ // Digital
+ IsOnline = 1;
+ SelectScene = 1;
+ IntegrationIdSet = 1;
+ LightingSceneOffset = 10;
+ ButtonVisibilityOffset = 40;
+ // Analog
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ IsOnline = IsOnline + joinOffset;
+ SelectScene = SelectScene + joinOffset;
+ LightingSceneOffset = LightingSceneOffset + joinOffset;
+ ButtonVisibilityOffset = ButtonVisibilityOffset + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs
new file mode 100644
index 00000000..5c91a358
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class GenericRelayControllerJoinMap : JoinMapBase
+ {
+ #region Digitals
+ ///
+ /// Sets and reports the state of the relay (High = closed, Low = Open)
+ ///
+ public uint Relay { get; set; }
+ #endregion
+
+ public GenericRelayControllerJoinMap()
+ {
+ Relay = 1;
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ Relay = Relay + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs
new file mode 100644
index 00000000..a40913ee
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs
@@ -0,0 +1,238 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class GlsOccupancySensorBaseJoinMap : JoinMapBase
+ {
+ #region Digitals
+
+ ///
+ /// High when device is online
+ ///
+ public uint IsOnline { get; set; }
+ ///
+ /// Forces the device to report occupied status
+ ///
+ public uint ForceOccupied { get; set; }
+ ///
+ /// Forces the device to report vacant status
+ ///
+ public uint ForceVacant { get; set; }
+ ///
+ /// Enables raw status reporting
+ ///
+ public uint EnableRawStates { get; set; }
+ ///
+ /// High when raw occupancy is detected
+ ///
+ public uint RawOccupancyFeedback { get; set; }
+ ///
+ /// High when PIR sensor detects motion
+ ///
+ public uint RawOccupancyPirFeedback { get; set; }
+ ///
+ /// High when US sensor detects motion
+ ///
+ public uint RawOccupancyUsFeedback { get; set; }
+ ///
+ /// High when occupancy is detected
+ ///
+ public uint RoomOccupiedFeedback { get; set; }
+ ///
+ /// Hich when occupancy is detected in the grace period
+ ///
+ public uint GraceOccupancyDetectedFeedback { get; set; }
+ ///
+ /// High when vacancy is detected
+ ///
+ public uint RoomVacantFeedback { get; set; }
+
+ ///
+ /// Enables the LED Flash when set high
+ ///
+ public uint EnableLedFlash { get; set; }
+ ///
+ /// Disables the LED flash when set high
+ ///
+ public uint DisableLedFlash { get; set; }
+ ///
+ /// Enables the Short Timeout
+ ///
+ public uint EnableShortTimeout { get; set; }
+ ///
+ /// Disables the Short Timout
+ ///
+ public uint DisableShortTimeout { get; set; }
+ ///
+ /// Set high to enable one technology to trigger occupancy
+ ///
+ public uint OrWhenVacated { get; set; }
+ ///
+ /// Set high to require both technologies to trigger occupancy
+ ///
+ public uint AndWhenVacated { get; set; }
+ ///
+ /// Enables Ultrasonic Sensor A
+ ///
+ public uint EnableUsA { get; set; }
+ ///
+ /// Disables Ultrasonic Sensor A
+ ///
+ public uint DisableUsA { get; set; }
+ ///
+ /// Enables Ultrasonic Sensor B
+ ///
+ public uint EnableUsB { get; set; }
+ ///
+ /// Disables Ultrasonic Sensor B
+ ///
+ public uint DisableUsB { get; set; }
+ ///
+ /// Enables Pir
+ ///
+ public uint EnablePir { get; set; }
+ ///
+ /// Disables Pir
+ ///
+ public uint DisablePir { get; set; }
+ public uint IncrementUsInOccupiedState { get; set; }
+ public uint DecrementUsInOccupiedState { get; set; }
+ public uint IncrementUsInVacantState { get; set; }
+ public uint DecrementUsInVacantState { get; set; }
+ public uint IncrementPirInOccupiedState { get; set; }
+ public uint DecrementPirInOccupiedState { get; set; }
+ public uint IncrementPirInVacantState { get; set; }
+ public uint DecrementPirInVacantState { get; set; }
+ #endregion
+
+ #region Analogs
+ ///
+ /// Sets adn reports the remote timeout value
+ ///
+ public uint Timeout { get; set; }
+ ///
+ /// Reports the local timeout value
+ ///
+ public uint TimeoutLocalFeedback { get; set; }
+ ///
+ /// Sets the minimum internal photo sensor value and reports the current level
+ ///
+ public uint InternalPhotoSensorValue { get; set; }
+ ///
+ /// Sets the minimum external photo sensor value and reports the current level
+ ///
+ public uint ExternalPhotoSensorValue { get; set; }
+
+ public uint UsSensitivityInOccupiedState { get; set; }
+
+ public uint UsSensitivityInVacantState { get; set; }
+
+ public uint PirSensitivityInOccupiedState { get; set; }
+
+ public uint PirSensitivityInVacantState { get; set; }
+ #endregion
+
+ #region Serial
+ public uint Name { get; set; }
+ #endregion
+
+ public GlsOccupancySensorBaseJoinMap()
+ {
+ IsOnline = 1;
+ ForceOccupied = 2;
+ ForceVacant = 3;
+ EnableRawStates = 4;
+ RoomOccupiedFeedback = 2;
+ GraceOccupancyDetectedFeedback = 3;
+ RoomVacantFeedback = 4;
+ RawOccupancyFeedback = 5;
+ RawOccupancyPirFeedback = 6;
+ RawOccupancyUsFeedback = 7;
+ EnableLedFlash = 11;
+ DisableLedFlash = 12;
+ EnableShortTimeout = 13;
+ DisableShortTimeout = 14;
+ OrWhenVacated = 15;
+ AndWhenVacated = 16;
+ EnableUsA = 17;
+ DisableUsA = 18;
+ EnableUsB = 19;
+ DisableUsB = 20;
+ EnablePir = 21;
+ DisablePir = 22;
+ IncrementUsInOccupiedState = 23;
+ DecrementUsInOccupiedState = 24;
+ IncrementUsInVacantState = 25;
+ DecrementUsInVacantState = 26;
+ IncrementPirInOccupiedState = 27;
+ DecrementPirInOccupiedState = 28;
+ IncrementPirInVacantState = 29;
+ DecrementPirInVacantState = 30;
+
+ Timeout = 1;
+ TimeoutLocalFeedback = 2;
+ InternalPhotoSensorValue = 3;
+ ExternalPhotoSensorValue = 4;
+ UsSensitivityInOccupiedState = 5;
+ UsSensitivityInVacantState = 6;
+ PirSensitivityInOccupiedState = 7;
+ PirSensitivityInVacantState = 8;
+
+ Name = 1;
+
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ IsOnline = IsOnline + joinOffset;
+ ForceOccupied = ForceOccupied + joinOffset;
+ ForceVacant = ForceVacant + joinOffset;
+ EnableRawStates = EnableRawStates + joinOffset;
+ RoomOccupiedFeedback = RoomOccupiedFeedback + joinOffset;
+ GraceOccupancyDetectedFeedback = GraceOccupancyDetectedFeedback + joinOffset;
+ RoomVacantFeedback = RoomVacantFeedback + joinOffset;
+ RawOccupancyFeedback = RawOccupancyFeedback + joinOffset;
+ RawOccupancyPirFeedback = RawOccupancyPirFeedback + joinOffset;
+ RawOccupancyUsFeedback = RawOccupancyUsFeedback + joinOffset;
+ EnableLedFlash = EnableLedFlash + joinOffset;
+ DisableLedFlash = DisableLedFlash + joinOffset;
+ EnableShortTimeout = EnableShortTimeout + joinOffset;
+ DisableShortTimeout = DisableShortTimeout + joinOffset;
+ OrWhenVacated = OrWhenVacated + joinOffset;
+ AndWhenVacated = AndWhenVacated + joinOffset;
+ EnableUsA = EnableUsA + joinOffset;
+ DisableUsA = DisableUsA + joinOffset;
+ EnableUsB = EnableUsB + joinOffset;
+ DisableUsB = DisableUsB + joinOffset;
+ EnablePir = EnablePir + joinOffset;
+ DisablePir = DisablePir + joinOffset;
+ IncrementUsInOccupiedState = IncrementUsInOccupiedState + joinOffset;
+ DecrementUsInOccupiedState = DecrementUsInOccupiedState + joinOffset;
+ IncrementUsInVacantState = IncrementUsInVacantState + joinOffset;
+ DecrementUsInVacantState = DecrementUsInVacantState + joinOffset;
+ IncrementPirInOccupiedState = IncrementPirInOccupiedState + joinOffset;
+ DecrementPirInOccupiedState = DecrementPirInOccupiedState + joinOffset;
+ IncrementPirInVacantState = IncrementPirInVacantState + joinOffset;
+ DecrementPirInVacantState = DecrementPirInVacantState + joinOffset;
+
+ Timeout = Timeout + joinOffset;
+ TimeoutLocalFeedback = TimeoutLocalFeedback + joinOffset;
+ InternalPhotoSensorValue = InternalPhotoSensorValue + joinOffset;
+ ExternalPhotoSensorValue = ExternalPhotoSensorValue + joinOffset;
+ UsSensitivityInOccupiedState = UsSensitivityInOccupiedState + joinOffset;
+ UsSensitivityInVacantState = UsSensitivityInVacantState + joinOffset;
+ PirSensitivityInOccupiedState = PirSensitivityInOccupiedState + joinOffset;
+ PirSensitivityInVacantState = PirSensitivityInVacantState + joinOffset;
+
+ Name = Name + joinOffset;
+ }
+ }
+
+}
diff --git a/PepperDashEssentials/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs
new file mode 100644
index 00000000..e88980fe
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs
@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class HdMdxxxCEControllerJoinMap : JoinMapBase
+ {
+ #region Digitals
+ ///
+ /// High when the pair is online
+ ///
+ public uint IsOnline { get; set; }
+
+ ///
+ /// High when the remote end device is online
+ ///
+ public uint RemoteEndDetected { get; set; }
+
+ ///
+ /// Sets Auto Route On and provides feedback
+ ///
+ public uint AutoRouteOn { get; set; }
+
+ ///
+ /// Sets Auto Route Off and provides feedback
+ ///
+ public uint AutoRouteOff { get; set; }
+
+ ///
+ /// Sets Priority Routing On and provides feedback
+ ///
+ public uint PriorityRoutingOn { get; set; }
+
+ ///
+ /// Sets Priority Routing Off and provides feedback
+ ///
+ public uint PriorityRoutingOff { get; set; }
+
+ ///
+ /// Enables OSD and provides feedback
+ ///
+ public uint InputOnScreenDisplayEnabled { get; set; }
+
+ ///
+ /// Disables OSD and provides feedback
+ ///
+ public uint InputOnScreenDisplayDisabled { get; set; }
+
+ ///
+ /// Provides Video Sync Detected feedback for each input
+ ///
+ public uint SyncDetected { get; set; }
+ #endregion
+
+ #region Analogs
+ ///
+ /// Sets the video source for the receiver's HDMI out and provides feedback
+ ///
+ public uint VideoSource { get; set; }
+
+ ///
+ /// Indicates the number of sources supported by the Tx/Rx pair
+ ///
+ public uint SourceCount { get; set; }
+ #endregion
+
+ #region Serials
+ ///
+ /// Indicates the name of each input port
+ ///
+ public uint SourceNames { get; set; }
+ #endregion
+
+ public HdMdxxxCEControllerJoinMap()
+ {
+ //Digital
+ IsOnline = 1;
+ RemoteEndDetected = 2;
+ AutoRouteOn = 3;
+ AutoRouteOff = 4;
+ PriorityRoutingOn = 5;
+ PriorityRoutingOff = 6;
+ InputOnScreenDisplayEnabled = 7;
+ InputOnScreenDisplayDisabled = 8;
+ SyncDetected = 10; // 11-15
+
+ //Analog
+ VideoSource = 1;
+ SourceCount = 2;
+
+ //Serials
+ SourceNames = 10; // 11-15
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ IsOnline = IsOnline + joinOffset;
+ RemoteEndDetected = RemoteEndDetected + joinOffset;
+ AutoRouteOn = AutoRouteOn + joinOffset;
+ AutoRouteOff = AutoRouteOff + joinOffset;
+ PriorityRoutingOn = PriorityRoutingOn + joinOffset;
+ PriorityRoutingOff = PriorityRoutingOff + joinOffset;
+ InputOnScreenDisplayEnabled = InputOnScreenDisplayEnabled + joinOffset;
+ InputOnScreenDisplayDisabled = InputOnScreenDisplayDisabled + joinOffset;
+ SyncDetected = SyncDetected + joinOffset;
+
+ VideoSource = VideoSource + joinOffset;
+ SourceCount = SourceCount + joinOffset;
+
+ SourceNames = SourceNames + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs
new file mode 100644
index 00000000..953bae37
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class IBasicCommunicationJoinMap : JoinMapBase
+ {
+ #region Digitals
+ ///
+ /// Set High to connect, Low to disconnect
+ ///
+ public uint Connect { get; set; }
+ ///
+ /// Reports Connected State (High = Connected)
+ ///
+ public uint Connected { get; set; }
+ #endregion
+
+ #region Analogs
+ ///
+ /// Reports the connections status value
+ ///
+ public uint Status { get; set; }
+ #endregion
+
+ #region Serials
+ ///
+ /// Data back from port
+ ///
+ public uint TextReceived { get; set; }
+ ///
+ /// Sends data to the port
+ ///
+ public uint SendText { get; set; }
+ ///
+ /// Takes a JSON serialized string that sets a COM port's parameters
+ ///
+ public uint SetPortConfig { get; set; }
+ #endregion
+
+ public IBasicCommunicationJoinMap()
+ {
+ TextReceived = 1;
+ SendText = 1;
+ SetPortConfig = 2;
+ Connect = 1;
+ Connected = 1;
+ Status = 1;
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ TextReceived = TextReceived + joinOffset;
+ SendText = SendText + joinOffset;
+ SetPortConfig = SetPortConfig + joinOffset;
+ Connect = Connect + joinOffset;
+ Connected = Connected + joinOffset;
+ Status = Status + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/IDigitalInputJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/IDigitalInputJoinMap.cs
new file mode 100644
index 00000000..65d4ada4
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/IDigitalInputJoinMap.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class IDigitalInputJoinMap : JoinMapBase
+ {
+ #region Digitals
+ ///
+ /// Reports the state of the digital input
+ ///
+ public uint InputState { get; set; }
+ #endregion
+
+ public IDigitalInputJoinMap()
+ {
+ InputState = 1;
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ InputState = InputState + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/SetTopBoxControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/SetTopBoxControllerJoinMap.cs
new file mode 100644
index 00000000..36e5b2da
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/SetTopBoxControllerJoinMap.cs
@@ -0,0 +1,212 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+using Crestron.SimplSharp.Reflection;
+
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class SetTopBoxControllerJoinMap : JoinMapBase
+ {
+ #region Digitals
+ public uint DvrList { get; set; } //
+ public uint Replay { get; set; }
+ public uint Up { get; set; } //
+ public uint Down { get; set; } //
+ public uint Left { get; set; } //
+ public uint Right { get; set; } //
+ public uint Select { get; set; } //
+ public uint Menu { get; set; } //
+ public uint Exit { get; set; } //
+ public uint Digit0 { get; set; } //
+ public uint Digit1 { get; set; } //
+ public uint Digit2 { get; set; } //
+ public uint Digit3 { get; set; } //
+ public uint Digit4 { get; set; } //
+ public uint Digit5 { get; set; } //
+ public uint Digit6 { get; set; } //
+ public uint Digit7 { get; set; } //
+ public uint Digit8 { get; set; } //
+ public uint Digit9 { get; set; } //
+ public uint Dash { get; set; } //
+ public uint KeypadEnter { get; set; } //
+ public uint ChannelUp { get; set; } //
+ public uint ChannelDown { get; set; } //
+ public uint LastChannel { get; set; } //
+ public uint Guide { get; set; } //
+ public uint Info { get; set; } //
+ public uint Red { get; set; } //
+ public uint Green { get; set; } //
+ public uint Yellow { get; set; } //
+ public uint Blue { get; set; } //
+ public uint ChapMinus { get; set; }
+ public uint ChapPlus { get; set; }
+ public uint FFwd { get; set; } //
+ public uint Pause { get; set; } //
+ public uint Play { get; set; } //
+ public uint Record { get; set; }
+ public uint Rewind { get; set; } //
+ public uint Stop { get; set; } //
+
+ public uint PowerOn { get; set; } //
+ public uint PowerOff { get; set; } //
+ public uint PowerToggle { get; set; } //
+
+ public uint HasKeypadAccessoryButton1 { get; set; }
+ public uint HasKeypadAccessoryButton2 { get; set; }
+
+ public uint KeypadAccessoryButton1Press { get; set; }
+ public uint KeypadAccessoryButton2Press { get; set; }
+
+
+ public uint HasDvr { get; set; }
+ public uint HasPresets { get; set; }
+ public uint HasNumeric { get; set; }
+ public uint HasDpad { get; set; }
+
+
+ #endregion
+
+ #region Analogs
+
+ #endregion
+
+ #region Strings
+ public uint Name { get; set; }
+ public uint LoadPresets { get; set; }
+ public uint KeypadAccessoryButton1Label { get; set; }
+ public uint KeypadAccessoryButton2Label { get; set; }
+
+ #endregion
+
+ public SetTopBoxControllerJoinMap()
+ {
+ PowerOn = 1;
+ PowerOff = 2;
+ PowerToggle = 3;
+
+ HasDpad = 4;
+ Up = 4;
+ Down = 5;
+ Left = 6;
+ Right = 7;
+ Select = 8;
+ Menu = 9;
+ Exit = 10;
+
+ HasNumeric = 11;
+ Digit0 = 11;
+ Digit1 = 12;
+ Digit2 = 13;
+ Digit3 = 14;
+ Digit4 = 15;
+ Digit5 = 16;
+ Digit6 = 17;
+ Digit7 = 18;
+ Digit8 = 19;
+ Digit9 = 20;
+ Dash = 21;
+ KeypadEnter = 22;
+ ChannelUp = 23;
+ ChannelDown = 24;
+ LastChannel = 25;
+
+ Guide = 26;
+ Info = 27;
+ Red = 28;
+ Green = 29;
+ Yellow = 30;
+ Blue = 31;
+
+ HasDvr = 32;
+ DvrList = 32;
+ Play = 33;
+ Pause = 34;
+ Stop = 35;
+ FFwd = 36;
+ Rewind = 37;
+ ChapPlus = 38;
+ ChapMinus = 39;
+ Replay = 40;
+ Record = 41;
+ HasKeypadAccessoryButton1 = 42;
+ KeypadAccessoryButton1Press = 42;
+ HasKeypadAccessoryButton2 = 43;
+ KeypadAccessoryButton2Press = 43;
+
+ Name = 1;
+ KeypadAccessoryButton1Label = 42;
+ KeypadAccessoryButton2Label = 43;
+
+ LoadPresets = 50;
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ PowerOn += joinOffset;
+ PowerOff += joinOffset;
+ PowerToggle += joinOffset;
+
+ HasDpad += joinOffset;
+ Up += joinOffset;
+ Down += joinOffset;
+ Left += joinOffset;
+ Right += joinOffset;
+ Select += joinOffset;
+ Menu += joinOffset;
+ Exit += joinOffset;
+
+ HasNumeric += joinOffset;
+ Digit0 += joinOffset;
+ Digit1 += joinOffset;
+ Digit2 += joinOffset;
+ Digit3 += joinOffset;
+ Digit4 += joinOffset;
+ Digit5 += joinOffset;
+ Digit6 += joinOffset;
+ Digit7 += joinOffset;
+ Digit8 += joinOffset;
+ Digit9 += joinOffset;
+ Dash += joinOffset;
+ KeypadEnter += joinOffset;
+ ChannelUp += joinOffset;
+ ChannelDown += joinOffset;
+ LastChannel += joinOffset;
+
+ Guide += joinOffset;
+ Info += joinOffset;
+ Red += joinOffset;
+ Green += joinOffset;
+ Yellow += joinOffset;
+ Blue += joinOffset;
+
+ HasDvr += joinOffset;
+ DvrList += joinOffset;
+ Play += joinOffset;
+ Pause += joinOffset;
+ Stop += joinOffset;
+ FFwd += joinOffset;
+ Rewind += joinOffset;
+ ChapPlus += joinOffset;
+ ChapMinus += joinOffset;
+ Replay += joinOffset;
+ Record += joinOffset;
+ HasKeypadAccessoryButton1 += joinOffset;
+ KeypadAccessoryButton1Press += joinOffset;
+ HasKeypadAccessoryButton2 += joinOffset;
+ KeypadAccessoryButton2Press += joinOffset;
+
+ Name += joinOffset;
+ KeypadAccessoryButton1Label += joinOffset;
+ KeypadAccessoryButton2Label += joinOffset;
+
+ LoadPresets += joinOffset;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/StatusSignControllerJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/StatusSignControllerJoinMap.cs
new file mode 100644
index 00000000..ad8f1577
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/StatusSignControllerJoinMap.cs
@@ -0,0 +1,49 @@
+using System.Linq;
+using Crestron.SimplSharp.Reflection;
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class StatusSignControllerJoinMap:JoinMapBase
+ {
+ public uint IsOnline { get; set; }
+ public uint Name { get; set; }
+ public uint RedLed { get; set; }
+ public uint GreenLed { get; set; }
+ public uint BlueLed { get; set; }
+ public uint RedControl { get; set; }
+ public uint GreenControl { get; set; }
+ public uint BlueControl { get; set; }
+
+ public StatusSignControllerJoinMap()
+ {
+ //digital
+ IsOnline = 1;
+ RedControl = 2;
+ GreenControl = 3;
+ BlueControl = 4;
+
+ //Analog
+ RedLed = 2;
+ GreenLed = 3;
+ BlueLed = 4;
+
+ //string
+ Name = 1;
+
+
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+ var properties =
+ GetType().GetCType().GetProperties().Where(p => p.PropertyType == typeof (uint)).ToList();
+
+ foreach (var propertyInfo in properties)
+ {
+ propertyInfo.SetValue(this, (uint) propertyInfo.GetValue(this, null) + joinOffset, null);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/Bridges/JoinMaps/SystemMonitorJoinMap.cs b/PepperDashEssentials/Bridges/JoinMaps/SystemMonitorJoinMap.cs
new file mode 100644
index 00000000..b2b66263
--- /dev/null
+++ b/PepperDashEssentials/Bridges/JoinMaps/SystemMonitorJoinMap.cs
@@ -0,0 +1,225 @@
+using PepperDash.Essentials.Core;
+
+namespace PepperDash.Essentials.Bridges
+{
+ public class SystemMonitorJoinMap : JoinMapBase
+ {
+ ///
+ /// Offset to indicate where the range of iterated program joins will start
+ ///
+ public uint ProgramStartJoin { get; set; }
+
+ ///
+ /// Offset to indicate where the range of iterated Ethernet joins will start
+ ///
+ public uint EthernetStartJoin { get; set; }
+
+ ///
+ /// Offset between each program join set
+ ///
+ public uint ProgramOffsetJoin { get; set; }
+
+ ///
+ /// Offset between each Ethernet Interface join set
+ ///
+ public uint EthernetOffsetJoin { get; set; }
+
+ #region Digitals
+ ///
+ /// Range Sets and reports whether the corresponding program slot is started
+ ///
+ public uint ProgramStart { get; set; }
+ ///
+ /// Range Sets and reports whether the corresponding program slot is stopped
+ ///
+ public uint ProgramStop { get; set; }
+ ///
+ /// Range Sets and reports whether the corresponding program is registered
+ ///
+ public uint ProgramRegister { get; set; }
+ ///
+ /// Range Sets and reports whether the corresponding program is unregistered
+ ///
+ public uint ProgramUnregister { get; set; }
+ #endregion
+
+ #region Analogs
+ ///
+ /// Sets and reports the time zone
+ ///
+ public uint TimeZone { get; set; }
+ #endregion
+
+ #region Serials
+ ///
+ /// Reports the time zone name
+ ///
+ public uint TimeZoneName { get; set; }
+ ///
+ /// Reports the IO Controller Version
+ ///
+ public uint IOControllerVersion { get; set; }
+ ///
+ /// Reports the SNMP App Version
+ ///
+ public uint SnmpAppVersion { get; set; }
+ ///
+ /// Reports the BACnet App Version
+ ///
+ public uint BACnetAppVersion { get; set; }
+ ///
+ /// Reports the firmware version
+ ///
+ public uint ControllerVersion { get; set; }
+
+ ///
+ /// Reports the name of the corresponding program
+ ///
+ public uint ProgramName { get; set; }
+ ///
+ /// Reports the compile time of the corresponding program
+ ///
+ public uint ProgramCompiledTime { get; set; }
+ ///
+ /// Reports the Crestron Database version of the corresponding program
+ ///
+ public uint ProgramCrestronDatabaseVersion { get; set; }
+ ///
+ /// Reports the Environment Version of the corresponding program
+ ///
+ public uint ProgramEnvironmentVersion { get; set; }
+ ///
+ /// Serialized JSON output that aggregates the program info of the corresponding program
+ ///
+ public uint AggregatedProgramInfo { get; set; }
+ ///
+ /// Reports the controller serial number
+ ///
+ public uint SerialNumber { get; set; }
+ ///
+ /// Reports the controller model
+ ///
+ public uint Model { get; set; }
+ ///
+ /// Reports the Host name set on the corresponding interface
+ ///
+ public uint HostName { get; set; }
+ ///
+ /// Reports the Current IP address set on the corresponding interface. If DHCP is enabled, this will be the DHCP assigned address.
+ ///
+ public uint CurrentIpAddress { get; set; }
+ ///
+ /// Reporst the Current Default Gateway set on the corresponding interface. If DHCP is enabled, this will be the DHCP assigned gateway
+ ///
+ public uint CurrentDefaultGateway { get; set; }
+ ///
+ /// Reports the Current Subnet Mask set on the corresponding interface. If DHCP is enabled, this will be the DHCP assigned subnet mask
+ ///
+ public uint CurrentSubnetMask { get; set; }
+ ///
+ /// Reports the Static IP address set on the corresponding interface. If DHCP is disabled, this will match the Current IP address
+ ///
+ public uint StaticIpAddress { get; set; }
+ ///
+ /// Reporst the Static Default Gateway set on the corresponding interface. If DHCP is disabled, this will match the Current gateway
+ ///
+ public uint StaticDefaultGateway { get; set; }
+ ///
+ /// Reports the Current Subnet Mask set on the corresponding interface. If DHCP is enabled, this will be the DHCP assigned subnet mask
+ ///
+ public uint StaticSubnetMask { get; set; }
+ ///
+ /// Reports the current DomainFeedback on the corresponding interface
+ ///
+ public uint Domain { get; set; }
+ ///
+ /// Reports the current DNS Servers on the corresponding interface
+ ///
+ public uint DnsServer { get; set; }
+ ///
+ /// Reports the MAC Address of the corresponding interface
+ ///
+ public uint MacAddress { get; set; }
+ ///
+ /// Reports the DHCP Status of the corresponding interface
+ ///
+ public uint DhcpStatus { get; set; }
+
+ ///
+ /// Reports the current uptime. Updated in 5 minute intervals.
+ ///
+ public uint Uptime { get; set; }
+
+ ///
+ /// Reports the date of the last boot
+ ///
+ public uint LastBoot { get; set; }
+ #endregion
+
+ public SystemMonitorJoinMap()
+ {
+ TimeZone = 1;
+
+ TimeZoneName = 1;
+ IOControllerVersion = 2;
+ SnmpAppVersion = 3;
+ BACnetAppVersion = 4;
+ ControllerVersion = 5;
+ SerialNumber = 6;
+ Model = 7;
+ Uptime = 8;
+ LastBoot = 9;
+
+
+ ProgramStartJoin = 10;
+
+ ProgramOffsetJoin = 5;
+
+ // Offset in groups of 5 joins
+ ProgramStart = 1;
+ ProgramStop = 2;
+ ProgramRegister = 3;
+ ProgramUnregister = 4;
+
+ ProgramName = 1;
+ ProgramCompiledTime = 2;
+ ProgramCrestronDatabaseVersion = 3;
+ ProgramEnvironmentVersion = 4;
+ AggregatedProgramInfo = 5;
+
+ EthernetStartJoin = 75;
+
+ EthernetOffsetJoin = 15;
+
+ // Offset in groups of 15
+ HostName = 1;
+ CurrentIpAddress = 2;
+ CurrentSubnetMask = 3;
+ CurrentDefaultGateway = 4;
+ StaticIpAddress = 5;
+ StaticSubnetMask = 6;
+ StaticDefaultGateway = 7;
+ Domain = 8;
+ DnsServer = 9;
+ MacAddress = 10;
+ DhcpStatus = 11;
+ }
+
+ public override void OffsetJoinNumbers(uint joinStart)
+ {
+ var joinOffset = joinStart - 1;
+
+ TimeZone = TimeZone + joinOffset;
+
+ TimeZoneName = TimeZoneName + joinOffset;
+ IOControllerVersion = IOControllerVersion + joinOffset;
+ SnmpAppVersion = SnmpAppVersion + joinOffset;
+ BACnetAppVersion = BACnetAppVersion + joinOffset;
+ ControllerVersion = ControllerVersion + joinOffset;
+
+ // Sets the initial join value where the iterated program joins will begin
+ ProgramStartJoin = ProgramStartJoin + joinOffset;
+ EthernetStartJoin = EthernetStartJoin + joinOffset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/PepperDashEssentials/PepperDashEssentials.csproj b/PepperDashEssentials/PepperDashEssentials.csproj
index c403d1c3..62cae03f 100644
--- a/PepperDashEssentials/PepperDashEssentials.csproj
+++ b/PepperDashEssentials/PepperDashEssentials.csproj
@@ -124,8 +124,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+