diff --git a/.github/workflows/essentials-3-dev-build.yml b/.github/workflows/essentials-3-dev-build.yml
new file mode 100644
index 000000000..3943d5be1
--- /dev/null
+++ b/.github/workflows/essentials-3-dev-build.yml
@@ -0,0 +1,247 @@
+name: Essentials v3 Development Build
+
+on:
+ push:
+ branches:
+ - feature-3.0.0/*
+ - hotfix-3.0.0/*
+ - release-3.0.0/*
+ - development-3.0.0
+
+env:
+ SOLUTION_PATH: .
+ SOLUTION_FILE: PepperDash.Essentials
+ VERSION: 0.0.0-buildtype-buildnumber
+ BUILD_TYPE: Debug
+ RELEASE_BRANCH: main
+jobs:
+ Build_Project_4-Series:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ # Detect environment (Act vs GitHub)
+ - name: Detect environment
+ id: detect_env
+ run: |
+ if [ -n "$ACT" ]; then
+ echo "is_local=true" >> $GITHUB_OUTPUT
+ else
+ echo "is_local=false" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Install prerequisites
+ run: |
+ if [ "${{ steps.detect_env.outputs.is_local }}" == "true" ]; then
+ # For Act - no sudo needed
+ apt-get update
+ apt-get install -y curl wget libicu-dev git unzip
+ else
+ # For GitHub runners - sudo required
+ sudo apt-get update
+ sudo apt-get install -y curl wget libicu-dev git unzip
+ fi
+
+ - name: Set Version Number
+ id: setVersion
+ shell: bash
+ run: |
+ latestVersion="3.0.0"
+ newVersion=$latestVersion
+ phase=""
+ newVersionString=""
+
+ if [[ $GITHUB_REF =~ ^refs/pull/.* ]]; then
+ phase="beta"
+ newVersionString="${newVersion}-${phase}-${GITHUB_RUN_NUMBER}"
+ elif [[ $GITHUB_REF =~ ^refs/heads/hotfix-3.0.0/.* ]]; then
+ phase="hotfix"
+ newVersionString="${newVersion}-${phase}-${GITHUB_RUN_NUMBER}"
+ elif [[ $GITHUB_REF =~ ^refs/heads/feature-3.0.0/.* ]]; then
+ phase="alpha"
+ newVersionString="${newVersion}-${phase}-${GITHUB_RUN_NUMBER}"
+ elif [[ $GITHUB_REF == "refs/heads/development-3.0.0" ]]; then
+ phase="beta"
+ newVersionString="${newVersion}-${phase}-${GITHUB_RUN_NUMBER}"
+ elif [[ $GITHUB_REF =~ ^refs/heads/release-3.0.0/.* ]]; then
+ version=$(echo $GITHUB_REF | awk -F '/' '{print $NF}' | sed 's/v//')
+ phase="rc"
+ newVersionString="${version}-${phase}-${GITHUB_RUN_NUMBER}"
+ else
+ # For local builds or unrecognized branches
+ newVersionString="${newVersion}-local"
+ fi
+
+ echo "version=$newVersionString" >> $GITHUB_OUTPUT
+
+ # Create Build Properties file
+ - name: Create Build Properties
+ run: |
+ cat > Directory.Build.props << EOF
+
+
+ ${{ steps.setVersion.outputs.version }}
+ ${{ steps.setVersion.outputs.version }}
+ ${{ steps.setVersion.outputs.version }}
+ ${{ steps.setVersion.outputs.version }}
+ ${{ steps.setVersion.outputs.version }}
+ ${{ steps.setVersion.outputs.version }}
+
+
+ EOF
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: '8.0.x'
+
+ - name: Restore NuGet Packages
+ run: dotnet restore ${SOLUTION_FILE}.sln
+
+ - name: Build Solution
+ run: dotnet build ${SOLUTION_FILE}.sln --configuration ${BUILD_TYPE} --no-restore
+
+ # Copy the CPZ file to the output directory with version in the filename
+ - name: Copy and Rename CPZ Files
+ run: |
+ mkdir -p ./output/cpz
+
+ # Find the main CPZ file in the build output
+ if [ -f "./src/PepperDash.Essentials/bin/${BUILD_TYPE}/net8/PepperDashEssentials.cpz" ]; then
+ cp "./src/PepperDash.Essentials/bin/${BUILD_TYPE}/net8/PepperDashEssentials.cpz" "./output/cpz/PepperDashEssentials.${{ steps.setVersion.outputs.version }}.cpz"
+ echo "Main CPZ file copied and renamed successfully."
+ else
+ echo "Warning: Main CPZ file not found at expected location."
+ find ./src -name "*.cpz" | xargs -I {} cp {} ./output/cpz/
+ fi
+
+ - name: Pack Solution
+ run: dotnet pack ${SOLUTION_FILE}.sln --configuration ${BUILD_TYPE} --output ./output/nuget --no-build
+
+ # List build artifacts (runs in both environments)
+ - name: List Build Artifacts
+ run: |
+ echo "=== Build Artifacts ==="
+ echo "NuGet Packages:"
+ find ./output/nuget -type f | sort
+ echo ""
+ echo "CPZ/CPLZ Files:"
+ find ./output -name "*.cpz" -o -name "*.cplz" | sort
+ echo "======================="
+
+ # Enhanced package inspection for local runs
+ - name: Inspect NuGet Packages
+ if: steps.detect_env.outputs.is_local == 'true'
+ run: |
+ echo "=== NuGet Package Details ==="
+ for pkg in $(find ./output/nuget -name "*.nupkg"); do
+ echo "Package: $(basename "$pkg")"
+ echo "Size: $(du -h "$pkg" | cut -f1)"
+
+ # Extract and show package contents
+ echo "Contents:"
+ unzip -l "$pkg" | tail -n +4 | head -n -2
+ echo "--------------------------"
+
+ # Try to extract and show the nuspec file (contains metadata)
+ echo "Metadata:"
+ unzip -p "$pkg" "*.nuspec" 2>/dev/null | grep -E "(||||)" || echo "Metadata extraction failed"
+ echo "--------------------------"
+ done
+ echo "==========================="
+
+ # Tag creation - GitHub version
+ - name: Create tag for non-rc builds (GitHub)
+ if: ${{ !contains(steps.setVersion.outputs.version, 'rc') && steps.detect_env.outputs.is_local == 'false' }}
+ run: |
+ git config --global user.name "GitHub Actions"
+ git config --global user.email "actions@github.com"
+ git tag ${{ steps.setVersion.outputs.version }}
+ git push --tags origin
+
+ # Tag creation - Act mock version
+ - name: Create tag for non-rc builds (Act Mock)
+ if: ${{ !contains(steps.setVersion.outputs.version, 'rc') && steps.detect_env.outputs.is_local == 'true' }}
+ run: |
+ echo "Would create git tag: ${{ steps.setVersion.outputs.version }}"
+ echo "Would push tag to: origin"
+
+ # Release creation - GitHub version
+ - name: Create Release (GitHub)
+ if: steps.detect_env.outputs.is_local == 'false'
+ id: create_release
+ uses: ncipollo/release-action@v1
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ artifacts: 'output/cpz/*,output/**/*.cplz'
+ generateReleaseNotes: true
+ prerelease: ${{contains('debug', env.BUILD_TYPE)}}
+ tag: ${{ steps.setVersion.outputs.version }}
+
+ # Release creation - Act mock version with enhanced output
+ - name: Create Release (Act Mock)
+ if: steps.detect_env.outputs.is_local == 'true'
+ run: |
+ echo "=== Mock Release Creation ==="
+ echo "Would create release with:"
+ echo "- Tag: ${{ steps.setVersion.outputs.version }}"
+ echo "- Prerelease: ${{contains('debug', env.BUILD_TYPE)}}"
+ echo "- Artifacts matching pattern: output/cpz/*,output/**/*.cplz"
+ echo ""
+ echo "Matching artifacts:"
+ find ./output/cpz -type f
+ find ./output -name "*.cplz"
+
+ # Detailed info about release artifacts
+ echo ""
+ echo "Artifact Details:"
+ for artifact in $(find ./output/cpz -type f; find ./output -name "*.cplz"); do
+ echo "File: $(basename "$artifact")"
+ echo "Size: $(du -h "$artifact" | cut -f1)"
+ echo "Created: $(stat -c %y "$artifact")"
+ echo "MD5: $(md5sum "$artifact" | cut -d' ' -f1)"
+ echo "--------------------------"
+ done
+ echo "============================"
+
+ # NuGet setup - GitHub version
+ - name: Setup NuGet (GitHub)
+ if: steps.detect_env.outputs.is_local == 'false'
+ run: |
+ dotnet nuget add source https://nuget.pkg.github.com/pepperdash/index.json -n github -u pepperdash -p ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text
+
+ # NuGet setup - Act mock version
+ - name: Setup NuGet (Act Mock)
+ if: steps.detect_env.outputs.is_local == 'true'
+ run: |
+ echo "=== Mock NuGet Setup ==="
+ echo "Would add GitHub NuGet source: https://nuget.pkg.github.com/pepperdash/index.json"
+ echo "======================="
+
+ # Publish to NuGet - GitHub version
+ - name: Publish to Nuget (GitHub)
+ if: steps.detect_env.outputs.is_local == 'false'
+ run: dotnet nuget push ./output/nuget/*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }}
+
+ # Publish to NuGet - Act mock version
+ - name: Publish to Nuget (Act Mock)
+ if: steps.detect_env.outputs.is_local == 'true'
+ run: |
+ echo "=== Mock Publish to NuGet ==="
+ echo "Would publish the following packages to https://api.nuget.org/v3/index.json:"
+ find ./output/nuget -name "*.nupkg" | sort
+ echo "============================="
+
+ # Publish to GitHub NuGet - GitHub version
+ - name: Publish to Github Nuget (GitHub)
+ if: steps.detect_env.outputs.is_local == 'false'
+ run: dotnet nuget push ./output/nuget/*.nupkg --source github --api-key ${{ secrets.GITHUB_TOKEN }}
+
+ # Publish to GitHub NuGet - Act mock version
+ - name: Publish to Github Nuget (Act Mock)
+ if: steps.detect_env.outputs.is_local == 'true'
+ run: |
+ echo "=== Mock Publish to GitHub NuGet ==="
+ echo "Would publish the following packages to the GitHub NuGet registry:"
+ find ./output/nuget -name "*.nupkg" | sort
+ echo "=================================="
\ No newline at end of file
diff --git a/Crestron-Library-Usage-Analysis.md b/Crestron-Library-Usage-Analysis.md
new file mode 100644
index 000000000..e69de29bb
diff --git a/runtimeconfig.json b/runtimeconfig.json
new file mode 100644
index 000000000..32835bac5
--- /dev/null
+++ b/runtimeconfig.json
@@ -0,0 +1,7 @@
+{
+ "runtimeOptions": {
+ "configProperties": {
+ "System.Globalization.Invariant": false
+ }
+ }
+}
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 152c9f180..ef8e86b0e 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -1,6 +1,6 @@
- 2.4.0-local
+ 3.0.0-local
$(Version)
PepperDash Technology
PepperDash Technology
diff --git a/src/PepperDash.Core/Comm/CommunicationGather.cs b/src/PepperDash.Core/Comm/CommunicationGather.cs
index 9ffe8262b..27d42888d 100644
--- a/src/PepperDash.Core/Comm/CommunicationGather.cs
+++ b/src/PepperDash.Core/Comm/CommunicationGather.cs
@@ -8,8 +8,8 @@
using PepperDash.Core;
-namespace PepperDash.Core
-{
+namespace PepperDash.Core;
+
///
/// Defines the string event handler for line events on the gather
///
@@ -30,7 +30,7 @@ public class CommunicationGather
///
/// The communication port that this gathers on
///
- public ICommunicationReceiver Port { get; private set; }
+ public ICommunicationReceiver Port { get; private set; }
///
/// Default false. If true, the delimiter will be included in the line output
@@ -67,22 +67,22 @@ public CommunicationGather(ICommunicationReceiver port, char delimiter)
///
///
///
- public CommunicationGather(ICommunicationReceiver port, string delimiter)
- :this(port, new string[] { delimiter} )
+ public CommunicationGather(ICommunicationReceiver port, string delimiter)
+ :this(port, new string[] { delimiter} )
{
}
- ///
- /// Constructor for using an array of string delimiters
- ///
- ///
- ///
- public CommunicationGather(ICommunicationReceiver port, string[] delimiters)
- {
- Port = port;
- StringDelimiters = delimiters;
- port.TextReceived += Port_TextReceivedStringDelimiter;
- }
+ ///
+ /// Constructor for using an array of string delimiters
+ ///
+ ///
+ ///
+ public CommunicationGather(ICommunicationReceiver port, string[] delimiters)
+ {
+ Port = port;
+ StringDelimiters = delimiters;
+ port.TextReceived += Port_TextReceivedStringDelimiter;
+ }
///
/// Disconnects this gather from the Port's TextReceived event. This will not fire LineReceived
@@ -136,35 +136,35 @@ void Port_TextReceivedStringDelimiter(object sender, GenericCommMethodReceiveTex
ReceiveBuffer.Append(args.Text);
var str = ReceiveBuffer.ToString();
- // Case: Receiving DEVICE get version\x0d\0x0a+OK "value":"1234"\x0d\x0a
-
- // RX: DEV
- // Split: (1) "DEV"
- // RX: I
- // Split: (1) "DEVI"
- // RX: CE get version
- // Split: (1) "DEVICE get version"
- // RX: \x0d\x0a+OK "value":"1234"\x0d\x0a
- // Split: (2) DEVICE get version, +OK "value":"1234"
-
- // Iterate the delimiters and fire an event for any matching delimiter
- foreach (var delimiter in StringDelimiters)
+ // Case: Receiving DEVICE get version\x0d\0x0a+OK "value":"1234"\x0d\x0a
+
+ // RX: DEV
+ // Split: (1) "DEV"
+ // RX: I
+ // Split: (1) "DEVI"
+ // RX: CE get version
+ // Split: (1) "DEVICE get version"
+ // RX: \x0d\x0a+OK "value":"1234"\x0d\x0a
+ // Split: (2) DEVICE get version, +OK "value":"1234"
+
+ // Iterate the delimiters and fire an event for any matching delimiter
+ foreach (var delimiter in StringDelimiters)
+ {
+ var lines = Regex.Split(str, delimiter);
+ if (lines.Length == 1)
+ continue;
+
+ for (int i = 0; i < lines.Length - 1; i++)
{
- var lines = Regex.Split(str, delimiter);
- if (lines.Length == 1)
- continue;
-
- for (int i = 0; i < lines.Length - 1; i++)
- {
- string strToSend = null;
- if (IncludeDelimiter)
- strToSend = lines[i] + delimiter;
- else
- strToSend = lines[i];
- handler(this, new GenericCommMethodReceiveTextArgs(strToSend, delimiter));
- }
- ReceiveBuffer = new StringBuilder(lines[lines.Length - 1]);
+ string strToSend = null;
+ if (IncludeDelimiter)
+ strToSend = lines[i] + delimiter;
+ else
+ strToSend = lines[i];
+ handler(this, new GenericCommMethodReceiveTextArgs(strToSend, delimiter));
}
+ ReceiveBuffer = new StringBuilder(lines[lines.Length - 1]);
+ }
}
}
@@ -175,5 +175,4 @@ void Port_TextReceivedStringDelimiter(object sender, GenericCommMethodReceiveTex
{
Stop();
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/CommunicationStreamDebugging.cs b/src/PepperDash.Core/Comm/CommunicationStreamDebugging.cs
index 0a38d826e..1b3cfb1f2 100644
--- a/src/PepperDash.Core/Comm/CommunicationStreamDebugging.cs
+++ b/src/PepperDash.Core/Comm/CommunicationStreamDebugging.cs
@@ -5,173 +5,172 @@
using Crestron.SimplSharp;
using PepperDash.Core;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Controls the ability to disable/enable debugging of TX/RX data sent to/from a device with a built in timer to disable
+///
+public class CommunicationStreamDebugging
{
///
- /// Controls the ability to disable/enable debugging of TX/RX data sent to/from a device with a built in timer to disable
+ /// Device Key that this instance configures
+ ///
+ public string ParentDeviceKey { get; private set; }
+
+ ///
+ /// Timer to disable automatically if not manually disabled
+ ///
+ private CTimer DebugExpiryPeriod;
+
+ ///
+ /// The current debug setting
+ ///
+ public eStreamDebuggingSetting DebugSetting { get; private set; }
+
+ private uint _DebugTimeoutInMs;
+ private const uint _DefaultDebugTimeoutMin = 30;
+
+ ///
+ /// Timeout in Minutes
///
- public class CommunicationStreamDebugging
+ public uint DebugTimeoutMinutes
{
- ///
- /// Device Key that this instance configures
- ///
- public string ParentDeviceKey { get; private set; }
-
- ///
- /// Timer to disable automatically if not manually disabled
- ///
- private CTimer DebugExpiryPeriod;
-
- ///
- /// The current debug setting
- ///
- public eStreamDebuggingSetting DebugSetting { get; private set; }
-
- private uint _DebugTimeoutInMs;
- private const uint _DefaultDebugTimeoutMin = 30;
-
- ///
- /// Timeout in Minutes
- ///
- public uint DebugTimeoutMinutes
+ get
{
- get
- {
- return _DebugTimeoutInMs/60000;
- }
+ return _DebugTimeoutInMs/60000;
}
+ }
+
+ ///
+ /// Indicates that receive stream debugging is enabled
+ ///
+ public bool RxStreamDebuggingIsEnabled{ get; private set; }
+
+ ///
+ /// Indicates that transmit stream debugging is enabled
+ ///
+ public bool TxStreamDebuggingIsEnabled { get; private set; }
+
+ ///
+ /// Constructor
+ ///
+ ///
+ public CommunicationStreamDebugging(string parentDeviceKey)
+ {
+ ParentDeviceKey = parentDeviceKey;
+ }
+
- ///
- /// Indicates that receive stream debugging is enabled
- ///
- public bool RxStreamDebuggingIsEnabled{ get; private set; }
-
- ///
- /// Indicates that transmit stream debugging is enabled
- ///
- public bool TxStreamDebuggingIsEnabled { get; private set; }
-
- ///
- /// Constructor
- ///
- ///
- public CommunicationStreamDebugging(string parentDeviceKey)
+ ///
+ /// Sets the debugging setting and if not setting to off, assumes the default of 30 mintues
+ ///
+ ///
+ public void SetDebuggingWithDefaultTimeout(eStreamDebuggingSetting setting)
+ {
+ if (setting == eStreamDebuggingSetting.Off)
{
- ParentDeviceKey = parentDeviceKey;
+ DisableDebugging();
+ return;
}
+ SetDebuggingWithSpecificTimeout(setting, _DefaultDebugTimeoutMin);
+ }
- ///
- /// Sets the debugging setting and if not setting to off, assumes the default of 30 mintues
- ///
- ///
- public void SetDebuggingWithDefaultTimeout(eStreamDebuggingSetting setting)
+ ///
+ /// Sets the debugging setting for the specified number of minutes
+ ///
+ ///
+ ///
+ public void SetDebuggingWithSpecificTimeout(eStreamDebuggingSetting setting, uint minutes)
+ {
+ if (setting == eStreamDebuggingSetting.Off)
{
- if (setting == eStreamDebuggingSetting.Off)
- {
- DisableDebugging();
- return;
- }
-
- SetDebuggingWithSpecificTimeout(setting, _DefaultDebugTimeoutMin);
+ DisableDebugging();
+ return;
}
- ///
- /// Sets the debugging setting for the specified number of minutes
- ///
- ///
- ///
- public void SetDebuggingWithSpecificTimeout(eStreamDebuggingSetting setting, uint minutes)
- {
- if (setting == eStreamDebuggingSetting.Off)
- {
- DisableDebugging();
- return;
- }
+ _DebugTimeoutInMs = minutes * 60000;
- _DebugTimeoutInMs = minutes * 60000;
+ StopDebugTimer();
- StopDebugTimer();
+ DebugExpiryPeriod = new CTimer((o) => DisableDebugging(), _DebugTimeoutInMs);
- DebugExpiryPeriod = new CTimer((o) => DisableDebugging(), _DebugTimeoutInMs);
+ if ((setting & eStreamDebuggingSetting.Rx) == eStreamDebuggingSetting.Rx)
+ RxStreamDebuggingIsEnabled = true;
- if ((setting & eStreamDebuggingSetting.Rx) == eStreamDebuggingSetting.Rx)
- RxStreamDebuggingIsEnabled = true;
+ if ((setting & eStreamDebuggingSetting.Tx) == eStreamDebuggingSetting.Tx)
+ TxStreamDebuggingIsEnabled = true;
- if ((setting & eStreamDebuggingSetting.Tx) == eStreamDebuggingSetting.Tx)
- TxStreamDebuggingIsEnabled = true;
+ Debug.SetDeviceDebugSettings(ParentDeviceKey, setting);
+
+ }
- Debug.SetDeviceDebugSettings(ParentDeviceKey, setting);
-
- }
+ ///
+ /// Disabled debugging
+ ///
+ private void DisableDebugging()
+ {
+ StopDebugTimer();
- ///
- /// Disabled debugging
- ///
- private void DisableDebugging()
- {
- StopDebugTimer();
+ Debug.SetDeviceDebugSettings(ParentDeviceKey, eStreamDebuggingSetting.Off);
+ }
- Debug.SetDeviceDebugSettings(ParentDeviceKey, eStreamDebuggingSetting.Off);
- }
+ private void StopDebugTimer()
+ {
+ RxStreamDebuggingIsEnabled = false;
+ TxStreamDebuggingIsEnabled = false;
- private void StopDebugTimer()
+ if (DebugExpiryPeriod == null)
{
- RxStreamDebuggingIsEnabled = false;
- TxStreamDebuggingIsEnabled = false;
-
- if (DebugExpiryPeriod == null)
- {
- return;
- }
-
- DebugExpiryPeriod.Stop();
- DebugExpiryPeriod.Dispose();
- DebugExpiryPeriod = null;
+ return;
}
+
+ DebugExpiryPeriod.Stop();
+ DebugExpiryPeriod.Dispose();
+ DebugExpiryPeriod = null;
}
+}
+///
+/// The available settings for stream debugging
+///
+[Flags]
+public enum eStreamDebuggingSetting
+{
///
- /// The available settings for stream debugging
+ /// Debug off
///
- [Flags]
- public enum eStreamDebuggingSetting
- {
- ///
- /// Debug off
- ///
- Off = 0,
- ///
- /// Debug received data
- ///
- Rx = 1,
- ///
- /// Debug transmitted data
- ///
- Tx = 2,
- ///
- /// Debug both received and transmitted data
- ///
- Both = Rx | Tx
- }
+ Off = 0,
+ ///
+ /// Debug received data
+ ///
+ Rx = 1,
+ ///
+ /// Debug transmitted data
+ ///
+ Tx = 2,
+ ///
+ /// Debug both received and transmitted data
+ ///
+ Both = Rx | Tx
+}
+///
+/// The available settings for stream debugging response types
+///
+[Flags]
+public enum eStreamDebuggingDataTypeSettings
+{
///
- /// The available settings for stream debugging response types
+ /// Debug data in byte format
///
- [Flags]
- public enum eStreamDebuggingDataTypeSettings
- {
- ///
- /// Debug data in byte format
- ///
- Bytes = 0,
- ///
- /// Debug data in text format
- ///
- Text = 1,
- ///
- /// Debug data in both byte and text formats
- ///
- Both = Bytes | Text,
- }
+ Bytes = 0,
+ ///
+ /// Debug data in text format
+ ///
+ Text = 1,
+ ///
+ /// Debug data in both byte and text formats
+ ///
+ Both = Bytes | Text,
}
diff --git a/src/PepperDash.Core/Comm/ControlPropertiesConfig.cs b/src/PepperDash.Core/Comm/ControlPropertiesConfig.cs
index ff869f779..d0dd2b97a 100644
--- a/src/PepperDash.Core/Comm/ControlPropertiesConfig.cs
+++ b/src/PepperDash.Core/Comm/ControlPropertiesConfig.cs
@@ -3,91 +3,90 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Config properties that indicate how to communicate with a device for control
+///
+public class ControlPropertiesConfig
{
///
- /// Config properties that indicate how to communicate with a device for control
+ /// The method of control
///
- public class ControlPropertiesConfig
- {
- ///
- /// The method of control
- ///
- [JsonProperty("method")]
- [JsonConverter(typeof(StringEnumConverter))]
- public eControlMethod Method { get; set; }
+ [JsonProperty("method")]
+ [JsonConverter(typeof(StringEnumConverter))]
+ public eControlMethod Method { get; set; }
- ///
- /// The key of the device that contains the control port
- ///
- [JsonProperty("controlPortDevKey", NullValueHandling = NullValueHandling.Ignore)]
- public string ControlPortDevKey { get; set; }
+ ///
+ /// The key of the device that contains the control port
+ ///
+ [JsonProperty("controlPortDevKey", NullValueHandling = NullValueHandling.Ignore)]
+ public string ControlPortDevKey { get; set; }
- ///
- /// The number of the control port on the device specified by ControlPortDevKey
- ///
- [JsonProperty("controlPortNumber", NullValueHandling = NullValueHandling.Ignore)] // In case "null" is present in config on this value
- public uint? ControlPortNumber { get; set; }
+ ///
+ /// The number of the control port on the device specified by ControlPortDevKey
+ ///
+ [JsonProperty("controlPortNumber", NullValueHandling = NullValueHandling.Ignore)] // In case "null" is present in config on this value
+ public uint? ControlPortNumber { get; set; }
- ///
- /// The name of the control port on the device specified by ControlPortDevKey
- ///
- [JsonProperty("controlPortName", NullValueHandling = NullValueHandling.Ignore)] // In case "null" is present in config on this value
- public string ControlPortName { get; set; }
+ ///
+ /// The name of the control port on the device specified by ControlPortDevKey
+ ///
+ [JsonProperty("controlPortName", NullValueHandling = NullValueHandling.Ignore)] // In case "null" is present in config on this value
+ public string ControlPortName { get; set; }
- ///
- /// Properties for ethernet based communications
- ///
- [JsonProperty("tcpSshProperties", NullValueHandling = NullValueHandling.Ignore)]
- public TcpSshPropertiesConfig TcpSshProperties { get; set; }
+ ///
+ /// Properties for ethernet based communications
+ ///
+ [JsonProperty("tcpSshProperties", NullValueHandling = NullValueHandling.Ignore)]
+ public TcpSshPropertiesConfig TcpSshProperties { get; set; }
- ///
- /// The filename and path for the IR file
- ///
- [JsonProperty("irFile", NullValueHandling = NullValueHandling.Ignore)]
- public string IrFile { get; set; }
+ ///
+ /// The filename and path for the IR file
+ ///
+ [JsonProperty("irFile", NullValueHandling = NullValueHandling.Ignore)]
+ public string IrFile { get; set; }
- ///
- /// The IpId of a Crestron device
- ///
- [JsonProperty("ipId", NullValueHandling = NullValueHandling.Ignore)]
- public string IpId { get; set; }
+ ///
+ /// The IpId of a Crestron device
+ ///
+ [JsonProperty("ipId", NullValueHandling = NullValueHandling.Ignore)]
+ public string IpId { get; set; }
- ///
- /// Readonly uint representation of the IpId
- ///
- [JsonIgnore]
- public uint IpIdInt { get { return Convert.ToUInt32(IpId, 16); } }
+ ///
+ /// Readonly uint representation of the IpId
+ ///
+ [JsonIgnore]
+ public uint IpIdInt { get { return Convert.ToUInt32(IpId, 16); } }
- ///
- /// Char indicating end of line
- ///
- [JsonProperty("endOfLineChar", NullValueHandling = NullValueHandling.Ignore)]
- public char EndOfLineChar { get; set; }
+ ///
+ /// Char indicating end of line
+ ///
+ [JsonProperty("endOfLineChar", NullValueHandling = NullValueHandling.Ignore)]
+ public char EndOfLineChar { get; set; }
- ///
- /// Defaults to Environment.NewLine;
- ///
- [JsonProperty("endOfLineString", NullValueHandling = NullValueHandling.Ignore)]
- public string EndOfLineString { get; set; }
+ ///
+ /// Defaults to Environment.NewLine;
+ ///
+ [JsonProperty("endOfLineString", NullValueHandling = NullValueHandling.Ignore)]
+ public string EndOfLineString { get; set; }
- ///
- /// Indicates
- ///
- [JsonProperty("deviceReadyResponsePattern", NullValueHandling = NullValueHandling.Ignore)]
- public string DeviceReadyResponsePattern { get; set; }
+ ///
+ /// Indicates
+ ///
+ [JsonProperty("deviceReadyResponsePattern", NullValueHandling = NullValueHandling.Ignore)]
+ public string DeviceReadyResponsePattern { get; set; }
- ///
- /// Used when communcating to programs running in VC-4
- ///
- [JsonProperty("roomId", NullValueHandling = NullValueHandling.Ignore)]
- public string RoomId { get; set; }
+ ///
+ /// Used when communcating to programs running in VC-4
+ ///
+ [JsonProperty("roomId", NullValueHandling = NullValueHandling.Ignore)]
+ public string RoomId { get; set; }
- ///
- /// Constructor
- ///
- public ControlPropertiesConfig()
- {
- }
+ ///
+ /// Constructor
+ ///
+ public ControlPropertiesConfig()
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/EventArgs.cs b/src/PepperDash.Core/Comm/EventArgs.cs
index cf76d6b38..f018d0729 100644
--- a/src/PepperDash.Core/Comm/EventArgs.cs
+++ b/src/PepperDash.Core/Comm/EventArgs.cs
@@ -16,28 +16,28 @@ PepperDash Technology Corporation reserves all rights under applicable laws.
using Crestron.SimplSharp.CrestronSockets;
-namespace PepperDash.Core
-{
- ///
- /// Delegate for notifying of socket status changes
- ///
- ///
- public delegate void GenericSocketStatusChangeEventDelegate(ISocketStatus client);
+namespace PepperDash.Core;
- ///
- /// EventArgs class for socket status changes
- ///
+///
+/// Delegate for notifying of socket status changes
+///
+///
+public delegate void GenericSocketStatusChangeEventDelegate(ISocketStatus client);
+
+///
+/// EventArgs class for socket status changes
+///
public class GenericSocketStatusChageEventArgs : EventArgs
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ISocketStatus Client { get; private set; }
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
public GenericSocketStatusChageEventArgs(ISocketStatus client)
{
Client = client;
@@ -46,105 +46,105 @@ public GenericSocketStatusChageEventArgs(ISocketStatus client)
/// S+ Constructor
///
public GenericSocketStatusChageEventArgs() { }
- }
-
+}
+
+///
+/// Delegate for notifying of TCP Server state changes
+///
+///
+public delegate void GenericTcpServerStateChangedEventDelegate(ServerState state);
+
+///
+/// EventArgs class for TCP Server state changes
+///
+public class GenericTcpServerStateChangedEventArgs : EventArgs
+{
///
- /// Delegate for notifying of TCP Server state changes
+ ///
///
- ///
- public delegate void GenericTcpServerStateChangedEventDelegate(ServerState state);
+ public ServerState State { get; private set; }
///
- /// EventArgs class for TCP Server state changes
+ ///
///
- public class GenericTcpServerStateChangedEventArgs : EventArgs
+ ///
+ public GenericTcpServerStateChangedEventArgs(ServerState state)
{
- ///
- ///
- ///
- public ServerState State { get; private set; }
-
- ///
- ///
- ///
- ///
- public GenericTcpServerStateChangedEventArgs(ServerState state)
- {
- State = state;
- }
+ State = state;
+ }
///
/// S+ Constructor
///
public GenericTcpServerStateChangedEventArgs() { }
- }
+}
+
+///
+/// Delegate for TCP Server socket status changes
+///
+///
+///
+///
+public delegate void GenericTcpServerSocketStatusChangeEventDelegate(object socket, uint clientIndex, SocketStatus clientStatus);
+///
+/// EventArgs for TCP server socket status changes
+///
+public class GenericTcpServerSocketStatusChangeEventArgs : EventArgs
+{
+ ///
+ ///
+ ///
+ public object Socket { get; private set; }
+ ///
+ ///
+ ///
+ public uint ReceivedFromClientIndex { get; private set; }
+ ///
+ ///
+ ///
+ public SocketStatus ClientStatus { get; set; }
///
- /// Delegate for TCP Server socket status changes
+ ///
///
///
- ///
///
- public delegate void GenericTcpServerSocketStatusChangeEventDelegate(object socket, uint clientIndex, SocketStatus clientStatus);
+ public GenericTcpServerSocketStatusChangeEventArgs(object socket, SocketStatus clientStatus)
+ {
+ Socket = socket;
+ ClientStatus = clientStatus;
+ }
+
///
- /// EventArgs for TCP server socket status changes
+ ///
///
- public class GenericTcpServerSocketStatusChangeEventArgs : EventArgs
+ ///
+ ///
+ ///
+ public GenericTcpServerSocketStatusChangeEventArgs(object socket, uint clientIndex, SocketStatus clientStatus)
{
- ///
- ///
- ///
- public object Socket { get; private set; }
- ///
- ///
- ///
- public uint ReceivedFromClientIndex { get; private set; }
- ///
- ///
- ///
- public SocketStatus ClientStatus { get; set; }
-
- ///
- ///
- ///
- ///
- ///
- public GenericTcpServerSocketStatusChangeEventArgs(object socket, SocketStatus clientStatus)
- {
- Socket = socket;
- ClientStatus = clientStatus;
- }
-
- ///
- ///
- ///
- ///
- ///
- ///
- public GenericTcpServerSocketStatusChangeEventArgs(object socket, uint clientIndex, SocketStatus clientStatus)
- {
- Socket = socket;
- ReceivedFromClientIndex = clientIndex;
- ClientStatus = clientStatus;
- }
+ Socket = socket;
+ ReceivedFromClientIndex = clientIndex;
+ ClientStatus = clientStatus;
+ }
///
/// S+ Constructor
///
public GenericTcpServerSocketStatusChangeEventArgs() { }
- }
+}
+///
+/// EventArgs for TCP server com method receive text
+///
+public class GenericTcpServerCommMethodReceiveTextArgs : EventArgs
+{
///
- /// EventArgs for TCP server com method receive text
+ ///
+ ///
+ public uint ReceivedFromClientIndex { get; private set; }
+
+ ///
+ ///
///
- public class GenericTcpServerCommMethodReceiveTextArgs : EventArgs
- {
- ///
- ///
- ///
- public uint ReceivedFromClientIndex { get; private set; }
-
- ///
- ///
- ///
public ushort ReceivedFromClientIndexShort
{
get
@@ -153,99 +153,96 @@ public ushort ReceivedFromClientIndexShort
}
}
- ///
- ///
- ///
- public string Text { get; private set; }
-
- ///
- ///
- ///
- ///
- public GenericTcpServerCommMethodReceiveTextArgs(string text)
- {
- Text = text;
- }
-
- ///
- ///
- ///
- ///
- ///
- public GenericTcpServerCommMethodReceiveTextArgs(string text, uint clientIndex)
- {
- Text = text;
- ReceivedFromClientIndex = clientIndex;
- }
+ ///
+ ///
+ ///
+ public string Text { get; private set; }
+
+ ///
+ ///
+ ///
+ ///
+ public GenericTcpServerCommMethodReceiveTextArgs(string text)
+ {
+ Text = text;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public GenericTcpServerCommMethodReceiveTextArgs(string text, uint clientIndex)
+ {
+ Text = text;
+ ReceivedFromClientIndex = clientIndex;
+ }
///
/// S+ Constructor
///
public GenericTcpServerCommMethodReceiveTextArgs() { }
- }
+}
+
+///
+/// EventArgs for TCP server client ready for communication
+///
+public class GenericTcpServerClientReadyForcommunicationsEventArgs : EventArgs
+{
+ ///
+ ///
+ ///
+ public bool IsReady;
///
- /// EventArgs for TCP server client ready for communication
+ ///
///
- public class GenericTcpServerClientReadyForcommunicationsEventArgs : EventArgs
+ ///
+ public GenericTcpServerClientReadyForcommunicationsEventArgs(bool isReady)
{
- ///
- ///
- ///
- public bool IsReady;
-
- ///
- ///
- ///
- ///
- public GenericTcpServerClientReadyForcommunicationsEventArgs(bool isReady)
- {
- IsReady = isReady;
- }
+ IsReady = isReady;
+ }
///
/// S+ Constructor
///
public GenericTcpServerClientReadyForcommunicationsEventArgs() { }
- }
+}
+
+///
+/// EventArgs for UDP connected
+///
+public class GenericUdpConnectedEventArgs : EventArgs
+{
+ ///
+ ///
+ ///
+ public ushort UConnected;
+ ///
+ ///
+ ///
+ public bool Connected;
+
+ ///
+ /// Constructor
+ ///
+ public GenericUdpConnectedEventArgs() { }
///
- /// EventArgs for UDP connected
+ ///
///
- public class GenericUdpConnectedEventArgs : EventArgs
+ ///
+ public GenericUdpConnectedEventArgs(ushort uconnected)
{
- ///
- ///
- ///
- public ushort UConnected;
- ///
- ///
- ///
- public bool Connected;
-
- ///
- /// Constructor
- ///
- public GenericUdpConnectedEventArgs() { }
-
- ///
- ///
- ///
- ///
- public GenericUdpConnectedEventArgs(ushort uconnected)
- {
- UConnected = uconnected;
- }
-
- ///
- ///
- ///
- ///
- public GenericUdpConnectedEventArgs(bool connected)
- {
- Connected = connected;
- }
+ UConnected = uconnected;
+ }
+ ///
+ ///
+ ///
+ ///
+ public GenericUdpConnectedEventArgs(bool connected)
+ {
+ Connected = connected;
}
-
+}
-}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/GenericSecureTcpIpClient.cs b/src/PepperDash.Core/Comm/GenericSecureTcpIpClient.cs
index 5ad2e29de..f78672865 100644
--- a/src/PepperDash.Core/Comm/GenericSecureTcpIpClient.cs
+++ b/src/PepperDash.Core/Comm/GenericSecureTcpIpClient.cs
@@ -7,949 +7,947 @@
using Crestron.SimplSharp.CrestronSockets;
using PepperDash.Core.Logging;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// A class to handle secure TCP/IP communications with a server
+///
+public class GenericSecureTcpIpClient : Device, ISocketStatusWithStreamDebugging, IAutoReconnect
{
+ private const string SplusKey = "Uninitialized Secure Tcp _client";
///
- /// A class to handle secure TCP/IP communications with a server
+ /// Stream debugging
///
- public class GenericSecureTcpIpClient : Device, ISocketStatusWithStreamDebugging, IAutoReconnect
- {
- private const string SplusKey = "Uninitialized Secure Tcp _client";
- ///
- /// Stream debugging
- ///
- public CommunicationStreamDebugging StreamDebugging { get; private set; }
+ public CommunicationStreamDebugging StreamDebugging { get; private set; }
- ///
- /// Fires when data is received from the server and returns it as a Byte array
- ///
- public event EventHandler BytesReceived;
+ ///
+ /// Fires when data is received from the server and returns it as a Byte array
+ ///
+ public event EventHandler BytesReceived;
- ///
- /// Fires when data is received from the server and returns it as text
- ///
- public event EventHandler TextReceived;
+ ///
+ /// Fires when data is received from the server and returns it as text
+ ///
+ public event EventHandler TextReceived;
- #region GenericSecureTcpIpClient Events & Delegates
+ #region GenericSecureTcpIpClient Events & Delegates
- ///
- ///
- ///
- //public event GenericSocketStatusChangeEventDelegate SocketStatusChange;
- public event EventHandler ConnectionChange;
+ ///
+ ///
+ ///
+ //public event GenericSocketStatusChangeEventDelegate SocketStatusChange;
+ public event EventHandler ConnectionChange;
- ///
- /// Auto reconnect evant handler
- ///
- public event EventHandler AutoReconnectTriggered;
+ ///
+ /// Auto reconnect evant handler
+ ///
+ public event EventHandler AutoReconnectTriggered;
- ///
- /// Event for Receiving text. Once subscribed to this event the receive callback will start a thread that dequeues the messages and invokes the event on a new thread.
- /// It is not recommended to use both the TextReceived event and the TextReceivedQueueInvoke event.
- ///
- public event EventHandler TextReceivedQueueInvoke;
-
- ///
- /// For a client with a pre shared key, this will fire after the communication is established and the key exchange is complete. If you require
- /// a key and subscribe to the socket change event and try to send data on a connection the data sent will interfere with the key exchange and disconnect.
- ///
- public event EventHandler ClientReadyForCommunications;
+ ///
+ /// Event for Receiving text. Once subscribed to this event the receive callback will start a thread that dequeues the messages and invokes the event on a new thread.
+ /// It is not recommended to use both the TextReceived event and the TextReceivedQueueInvoke event.
+ ///
+ public event EventHandler TextReceivedQueueInvoke;
+
+ ///
+ /// For a client with a pre shared key, this will fire after the communication is established and the key exchange is complete. If you require
+ /// a key and subscribe to the socket change event and try to send data on a connection the data sent will interfere with the key exchange and disconnect.
+ ///
+ public event EventHandler ClientReadyForCommunications;
- #endregion
+ #endregion
- #region GenricTcpIpClient properties
+ #region GenricTcpIpClient properties
- private string _hostname;
+ private string _hostname;
- ///
- /// Address of server
- ///
- public string Hostname
+ ///
+ /// Address of server
+ ///
+ public string Hostname
+ {
+ get { return _hostname; }
+ set
{
- get { return _hostname; }
- set
+ _hostname = value;
+ if (_client != null)
{
- _hostname = value;
- if (_client != null)
- {
- _client.AddressClientConnectedTo = _hostname;
- }
+ _client.AddressClientConnectedTo = _hostname;
}
}
+ }
- ///
- /// Port on server
- ///
- public int Port { get; set; }
+ ///
+ /// Port on server
+ ///
+ public int Port { get; set; }
- ///
- /// S+ helper
- ///
- public ushort UPort
- {
- get { return Convert.ToUInt16(Port); }
- set { Port = Convert.ToInt32(value); }
- }
+ ///
+ /// S+ helper
+ ///
+ public ushort UPort
+ {
+ get { return Convert.ToUInt16(Port); }
+ set { Port = Convert.ToInt32(value); }
+ }
- ///
- /// Defaults to 2000
- ///
- public int BufferSize { get; set; }
+ ///
+ /// Defaults to 2000
+ ///
+ public int BufferSize { get; set; }
- ///
- /// Internal secure client
- ///
- private SecureTCPClient _client;
+ ///
+ /// Internal secure client
+ ///
+ private SecureTCPClient _client;
- ///
- /// Bool showing if socket is connected
- ///
- public bool IsConnected
- {
- get { return _client != null && _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
- }
+ ///
+ /// Bool showing if socket is connected
+ ///
+ public bool IsConnected
+ {
+ get { return _client != null && _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
+ }
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsConnected
- {
- get { return (ushort)(IsConnected ? 1 : 0); }
- }
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsConnected
+ {
+ get { return (ushort)(IsConnected ? 1 : 0); }
+ }
- ///
- /// _client socket status Read only
- ///
- public SocketStatus ClientStatus
+ ///
+ /// _client socket status Read only
+ ///
+ public SocketStatus ClientStatus
+ {
+ get
{
- get
- {
- return _client == null ? SocketStatus.SOCKET_STATUS_NO_CONNECT : _client.ClientStatus;
- }
+ return _client == null ? SocketStatus.SOCKET_STATUS_NO_CONNECT : _client.ClientStatus;
}
+ }
- ///
- /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
- /// and IsConnected would be true when this == 2.
- ///
- public ushort UStatus
- {
- get { return (ushort)ClientStatus; }
- }
+ ///
+ /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
+ /// and IsConnected would be true when this == 2.
+ ///
+ public ushort UStatus
+ {
+ get { return (ushort)ClientStatus; }
+ }
- ///
- /// Status text shows the message associated with socket status
- ///
- public string ClientStatusText { get { return ClientStatus.ToString(); } }
+ ///
+ /// Status text shows the message associated with socket status
+ ///
+ public string ClientStatusText { get { return ClientStatus.ToString(); } }
- ///
- /// Connection failure reason
- ///
- public string ConnectionFailure { get { return ClientStatus.ToString(); } }
+ ///
+ /// Connection failure reason
+ ///
+ public string ConnectionFailure { get { return ClientStatus.ToString(); } }
- ///
- /// bool to track if auto reconnect should be set on the socket
- ///
- public bool AutoReconnect { get; set; }
+ ///
+ /// bool to track if auto reconnect should be set on the socket
+ ///
+ public bool AutoReconnect { get; set; }
- ///
- /// S+ helper for AutoReconnect
- ///
- public ushort UAutoReconnect
- {
- get { return (ushort)(AutoReconnect ? 1 : 0); }
- set { AutoReconnect = value == 1; }
- }
+ ///
+ /// S+ helper for AutoReconnect
+ ///
+ public ushort UAutoReconnect
+ {
+ get { return (ushort)(AutoReconnect ? 1 : 0); }
+ set { AutoReconnect = value == 1; }
+ }
- ///
- /// Milliseconds to wait before attempting to reconnect. Defaults to 5000
- ///
- public int AutoReconnectIntervalMs { get; set; }
+ ///
+ /// Milliseconds to wait before attempting to reconnect. Defaults to 5000
+ ///
+ public int AutoReconnectIntervalMs { get; set; }
- ///
- /// Flag Set only when the disconnect method is called.
- ///
- bool DisconnectCalledByUser;
+ ///
+ /// Flag Set only when the disconnect method is called.
+ ///
+ bool DisconnectCalledByUser;
- ///
- ///
- ///
- public bool Connected
- {
- get { return _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
- }
+ ///
+ ///
+ ///
+ public bool Connected
+ {
+ get { return _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
+ }
- // private Timer for auto reconnect
- private CTimer RetryTimer;
+ // private Timer for auto reconnect
+ private CTimer RetryTimer;
- #endregion
+ #endregion
- #region GenericSecureTcpIpClient properties
+ #region GenericSecureTcpIpClient properties
- ///
- /// Bool to show whether the server requires a preshared key. This is used in the DynamicTCPServer class
- ///
- public bool SharedKeyRequired { get; set; }
+ ///
+ /// Bool to show whether the server requires a preshared key. This is used in the DynamicTCPServer class
+ ///
+ public bool SharedKeyRequired { get; set; }
- ///
- /// S+ helper for requires shared key bool
- ///
- public ushort USharedKeyRequired
+ ///
+ /// S+ helper for requires shared key bool
+ ///
+ public ushort USharedKeyRequired
+ {
+ set
{
- set
- {
- if (value == 1)
- SharedKeyRequired = true;
- else
- SharedKeyRequired = false;
- }
+ if (value == 1)
+ SharedKeyRequired = true;
+ else
+ SharedKeyRequired = false;
}
+ }
- ///
- /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module
- ///
- public string SharedKey { get; set; }
+ ///
+ /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module
+ ///
+ public string SharedKey { get; set; }
- ///
- /// flag to show the client is waiting for the server to send the shared key
- ///
- private bool WaitingForSharedKeyResponse { get; set; }
+ ///
+ /// flag to show the client is waiting for the server to send the shared key
+ ///
+ private bool WaitingForSharedKeyResponse { get; set; }
- ///
- /// Semaphore on connect method
- ///
- bool IsTryingToConnect;
-
- ///
- /// Bool showing if socket is ready for communication after shared key exchange
- ///
- public bool IsReadyForCommunication { get; set; }
-
- ///
- /// S+ helper for IsReadyForCommunication
- ///
- public ushort UIsReadyForCommunication
- {
- get { return (ushort)(IsReadyForCommunication ? 1 : 0); }
- }
+ ///
+ /// Semaphore on connect method
+ ///
+ bool IsTryingToConnect;
- ///
- /// Bool Heartbeat Enabled flag
- ///
- public bool HeartbeatEnabled { get; set; }
+ ///
+ /// Bool showing if socket is ready for communication after shared key exchange
+ ///
+ public bool IsReadyForCommunication { get; set; }
- ///
- /// S+ helper for Heartbeat Enabled
- ///
- public ushort UHeartbeatEnabled
- {
- get { return (ushort)(HeartbeatEnabled ? 1 : 0); }
- set { HeartbeatEnabled = value == 1; }
- }
+ ///
+ /// S+ helper for IsReadyForCommunication
+ ///
+ public ushort UIsReadyForCommunication
+ {
+ get { return (ushort)(IsReadyForCommunication ? 1 : 0); }
+ }
- ///
- /// Heartbeat String
- ///
- public string HeartbeatString { get; set; }
- //public int HeartbeatInterval = 50000;
+ ///
+ /// Bool Heartbeat Enabled flag
+ ///
+ public bool HeartbeatEnabled { get; set; }
- ///
- /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+
- ///
- public int HeartbeatInterval { get; set; }
+ ///
+ /// S+ helper for Heartbeat Enabled
+ ///
+ public ushort UHeartbeatEnabled
+ {
+ get { return (ushort)(HeartbeatEnabled ? 1 : 0); }
+ set { HeartbeatEnabled = value == 1; }
+ }
- ///
- /// Simpl+ Heartbeat Analog value in seconds
- ///
- public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatInterval = (value * 1000); } }
+ ///
+ /// Heartbeat String
+ ///
+ public string HeartbeatString { get; set; }
+ //public int HeartbeatInterval = 50000;
- CTimer HeartbeatSendTimer;
- CTimer HeartbeatAckTimer;
+ ///
+ /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+
+ ///
+ public int HeartbeatInterval { get; set; }
- // Used to force disconnection on a dead connect attempt
- CTimer ConnectFailTimer;
- CTimer WaitForSharedKey;
- private int ConnectionCount;
+ ///
+ /// Simpl+ Heartbeat Analog value in seconds
+ ///
+ public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatInterval = (value * 1000); } }
- bool ProgramIsStopping;
+ CTimer HeartbeatSendTimer;
+ CTimer HeartbeatAckTimer;
- ///
- /// Queue lock
- ///
- CCriticalSection DequeueLock = new CCriticalSection();
+ // Used to force disconnection on a dead connect attempt
+ CTimer ConnectFailTimer;
+ CTimer WaitForSharedKey;
+ private int ConnectionCount;
- ///
- /// Receive Queue size. Defaults to 20. Will set to 20 if QueueSize property is less than 20. Use constructor or set queue size property before
- /// calling initialize.
- ///
- public int ReceiveQueueSize { get; set; }
+ bool ProgramIsStopping;
- ///
- /// Queue to temporarily store received messages with the source IP and Port info. Defaults to size 20. Use constructor or set queue size property before
- /// calling initialize.
- ///
- private CrestronQueue MessageQueue;
+ ///
+ /// Queue lock
+ ///
+ CCriticalSection DequeueLock = new CCriticalSection();
- #endregion
+ ///
+ /// Receive Queue size. Defaults to 20. Will set to 20 if QueueSize property is less than 20. Use constructor or set queue size property before
+ /// calling initialize.
+ ///
+ public int ReceiveQueueSize { get; set; }
- #region Constructors
+ ///
+ /// Queue to temporarily store received messages with the source IP and Port info. Defaults to size 20. Use constructor or set queue size property before
+ /// calling initialize.
+ ///
+ private CrestronQueue MessageQueue;
- ///
- /// Constructor
- ///
- ///
- ///
- ///
- ///
- public GenericSecureTcpIpClient(string key, string address, int port, int bufferSize)
- : base(key)
- {
- StreamDebugging = new CommunicationStreamDebugging(key);
- Hostname = address;
- Port = port;
- BufferSize = bufferSize;
- AutoReconnectIntervalMs = 5000;
+ #endregion
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- }
+ #region Constructors
- ///
- /// Contstructor that sets all properties by calling the initialize method with a config object.
- ///
- ///
- ///
- public GenericSecureTcpIpClient(string key, TcpClientConfigObject clientConfigObject)
- : base(key)
- {
- StreamDebugging = new CommunicationStreamDebugging(key);
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- AutoReconnectIntervalMs = 5000;
- BufferSize = 2000;
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
+ ///
+ ///
+ public GenericSecureTcpIpClient(string key, string address, int port, int bufferSize)
+ : base(key)
+ {
+ StreamDebugging = new CommunicationStreamDebugging(key);
+ Hostname = address;
+ Port = port;
+ BufferSize = bufferSize;
+ AutoReconnectIntervalMs = 5000;
- Initialize(clientConfigObject);
- }
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ }
- ///
- /// Default constructor for S+
- ///
- public GenericSecureTcpIpClient()
- : base(SplusKey)
- {
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- AutoReconnectIntervalMs = 5000;
- BufferSize = 2000;
- }
+ ///
+ /// Contstructor that sets all properties by calling the initialize method with a config object.
+ ///
+ ///
+ ///
+ public GenericSecureTcpIpClient(string key, TcpClientConfigObject clientConfigObject)
+ : base(key)
+ {
+ StreamDebugging = new CommunicationStreamDebugging(key);
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ AutoReconnectIntervalMs = 5000;
+ BufferSize = 2000;
+
+ Initialize(clientConfigObject);
+ }
+
+ ///
+ /// Default constructor for S+
+ ///
+ public GenericSecureTcpIpClient()
+ : base(SplusKey)
+ {
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ AutoReconnectIntervalMs = 5000;
+ BufferSize = 2000;
+ }
+
+ ///
+ /// Just to help S+ set the key
+ ///
+ public void Initialize(string key)
+ {
+ Key = key;
+ }
- ///
- /// Just to help S+ set the key
- ///
- public void Initialize(string key)
+ ///
+ /// Initialize called by the constructor that accepts a client config object. Can be called later to reset properties of client.
+ ///
+ ///
+ public void Initialize(TcpClientConfigObject config)
+ {
+ if (config == null)
{
- Key = key;
+ Debug.Console(0, this, "Could not initialize client with key: {0}", Key);
+ return;
}
-
- ///
- /// Initialize called by the constructor that accepts a client config object. Can be called later to reset properties of client.
- ///
- ///
- public void Initialize(TcpClientConfigObject config)
+ try
{
- if (config == null)
- {
- Debug.Console(0, this, "Could not initialize client with key: {0}", Key);
- return;
- }
- try
- {
- Hostname = config.Control.TcpSshProperties.Address;
- Port = config.Control.TcpSshProperties.Port > 0 && config.Control.TcpSshProperties.Port <= 65535
- ? config.Control.TcpSshProperties.Port
- : 80;
+ Hostname = config.Control.TcpSshProperties.Address;
+ Port = config.Control.TcpSshProperties.Port > 0 && config.Control.TcpSshProperties.Port <= 65535
+ ? config.Control.TcpSshProperties.Port
+ : 80;
- AutoReconnect = config.Control.TcpSshProperties.AutoReconnect;
- AutoReconnectIntervalMs = config.Control.TcpSshProperties.AutoReconnectIntervalMs > 1000
- ? config.Control.TcpSshProperties.AutoReconnectIntervalMs
- : 5000;
+ AutoReconnect = config.Control.TcpSshProperties.AutoReconnect;
+ AutoReconnectIntervalMs = config.Control.TcpSshProperties.AutoReconnectIntervalMs > 1000
+ ? config.Control.TcpSshProperties.AutoReconnectIntervalMs
+ : 5000;
- SharedKey = config.SharedKey;
- SharedKeyRequired = config.SharedKeyRequired;
+ SharedKey = config.SharedKey;
+ SharedKeyRequired = config.SharedKeyRequired;
- HeartbeatEnabled = config.HeartbeatRequired;
- HeartbeatRequiredIntervalInSeconds = config.HeartbeatRequiredIntervalInSeconds > 0
- ? config.HeartbeatRequiredIntervalInSeconds
- : (ushort)15;
+ HeartbeatEnabled = config.HeartbeatRequired;
+ HeartbeatRequiredIntervalInSeconds = config.HeartbeatRequiredIntervalInSeconds > 0
+ ? config.HeartbeatRequiredIntervalInSeconds
+ : (ushort)15;
- HeartbeatString = string.IsNullOrEmpty(config.HeartbeatStringToMatch)
- ? "heartbeat"
- : config.HeartbeatStringToMatch;
+ HeartbeatString = string.IsNullOrEmpty(config.HeartbeatStringToMatch)
+ ? "heartbeat"
+ : config.HeartbeatStringToMatch;
- BufferSize = config.Control.TcpSshProperties.BufferSize > 2000
- ? config.Control.TcpSshProperties.BufferSize
- : 2000;
+ BufferSize = config.Control.TcpSshProperties.BufferSize > 2000
+ ? config.Control.TcpSshProperties.BufferSize
+ : 2000;
- ReceiveQueueSize = config.ReceiveQueueSize > 20
- ? config.ReceiveQueueSize
- : 20;
+ ReceiveQueueSize = config.ReceiveQueueSize > 20
+ ? config.ReceiveQueueSize
+ : 20;
- MessageQueue = new CrestronQueue(ReceiveQueueSize);
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, "Exception initializing client with key: {0}\rException: {1}", Key, ex);
- }
+ MessageQueue = new CrestronQueue(ReceiveQueueSize);
+ }
+ catch (Exception ex)
+ {
+ Debug.Console(0, this, "Exception initializing client with key: {0}\rException: {1}", Key, ex);
}
+ }
- #endregion
+ #endregion
- ///
- /// Handles closing this up when the program shuts down
- ///
- void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ ///
+ /// Handles closing this up when the program shuts down
+ ///
+ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ {
+ if (programEventType == eProgramStatusEventType.Stopping || programEventType == eProgramStatusEventType.Paused)
{
- if (programEventType == eProgramStatusEventType.Stopping || programEventType == eProgramStatusEventType.Paused)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing _client connection");
- ProgramIsStopping = true;
- Disconnect();
- }
-
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing _client connection");
+ ProgramIsStopping = true;
+ Disconnect();
}
- ///
- /// Deactivate the client
- ///
- ///
- public override bool Deactivate()
+ }
+
+ ///
+ /// Deactivate the client
+ ///
+ ///
+ public override bool Deactivate()
+ {
+ if (_client != null)
{
- if (_client != null)
- {
- _client.SocketStatusChange -= this.Client_SocketStatusChange;
- DisconnectClient();
- }
- return true;
+ _client.SocketStatusChange -= this.Client_SocketStatusChange;
+ DisconnectClient();
}
+ return true;
+ }
- ///
- /// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name.
- ///
- public void Connect()
- {
- ConnectionCount++;
- Debug.Console(2, this, "Attempting connect Count:{0}", ConnectionCount);
+ ///
+ /// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name.
+ ///
+ public void Connect()
+ {
+ ConnectionCount++;
+ Debug.Console(2, this, "Attempting connect Count:{0}", ConnectionCount);
- if (IsConnected)
+ if (IsConnected)
+ {
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already connected. Ignoring.");
+ return;
+ }
+ if (IsTryingToConnect)
+ {
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already trying to connect. Ignoring.");
+ return;
+ }
+ try
+ {
+ IsTryingToConnect = true;
+ if (RetryTimer != null)
+ {
+ RetryTimer.Stop();
+ RetryTimer = null;
+ }
+ if (string.IsNullOrEmpty(Hostname))
{
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already connected. Ignoring.");
+ Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No address set");
return;
}
- if (IsTryingToConnect)
+ if (Port < 1 || Port > 65535)
{
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already trying to connect. Ignoring.");
+ Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: Invalid port");
return;
}
- try
+ if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
{
- IsTryingToConnect = true;
- if (RetryTimer != null)
- {
- RetryTimer.Stop();
- RetryTimer = null;
- }
- if (string.IsNullOrEmpty(Hostname))
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No address set");
- return;
- }
- if (Port < 1 || Port > 65535)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: Invalid port");
- return;
- }
- if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No Shared Key set");
- return;
- }
+ Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No Shared Key set");
+ return;
+ }
- // clean up previous client
- if (_client != null)
- {
- Disconnect();
- }
- DisconnectCalledByUser = false;
+ // clean up previous client
+ if (_client != null)
+ {
+ Disconnect();
+ }
+ DisconnectCalledByUser = false;
- _client = new SecureTCPClient(Hostname, Port, BufferSize);
- _client.SocketStatusChange += Client_SocketStatusChange;
- if (HeartbeatEnabled)
- _client.SocketSendOrReceiveTimeOutInMs = (HeartbeatInterval * 5);
- _client.AddressClientConnectedTo = Hostname;
- _client.PortNumber = Port;
- // SecureClient = c;
+ _client = new SecureTCPClient(Hostname, Port, BufferSize);
+ _client.SocketStatusChange += Client_SocketStatusChange;
+ if (HeartbeatEnabled)
+ _client.SocketSendOrReceiveTimeOutInMs = (HeartbeatInterval * 5);
+ _client.AddressClientConnectedTo = Hostname;
+ _client.PortNumber = Port;
+ // SecureClient = c;
- //var timeOfConnect = DateTime.Now.ToString("HH:mm:ss.fff");
+ //var timeOfConnect = DateTime.Now.ToString("HH:mm:ss.fff");
- ConnectFailTimer = new CTimer(o =>
+ ConnectFailTimer = new CTimer(o =>
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Connect attempt has not finished after 30sec Count:{0}", ConnectionCount);
+ if (IsTryingToConnect)
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Connect attempt has not finished after 30sec Count:{0}", ConnectionCount);
- if (IsTryingToConnect)
- {
- IsTryingToConnect = false;
-
- //if (ConnectionHasHungCallback != null)
- //{
- // ConnectionHasHungCallback();
- //}
- //SecureClient.DisconnectFromServer();
- //CheckClosedAndTryReconnect();
- }
- }, 30000);
+ IsTryingToConnect = false;
+
+ //if (ConnectionHasHungCallback != null)
+ //{
+ // ConnectionHasHungCallback();
+ //}
+ //SecureClient.DisconnectFromServer();
+ //CheckClosedAndTryReconnect();
+ }
+ }, 30000);
- Debug.Console(2, this, "Making Connection Count:{0}", ConnectionCount);
- _client.ConnectToServerAsync(o =>
+ Debug.Console(2, this, "Making Connection Count:{0}", ConnectionCount);
+ _client.ConnectToServerAsync(o =>
+ {
+ Debug.Console(2, this, "ConnectToServerAsync Count:{0} Ran!", ConnectionCount);
+
+ if (ConnectFailTimer != null)
{
- Debug.Console(2, this, "ConnectToServerAsync Count:{0} Ran!", ConnectionCount);
+ ConnectFailTimer.Stop();
+ }
+ IsTryingToConnect = false;
- if (ConnectFailTimer != null)
- {
- ConnectFailTimer.Stop();
- }
- IsTryingToConnect = false;
+ if (o.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ {
+ Debug.Console(2, this, "_client connected to {0} on port {1}", o.AddressClientConnectedTo, o.LocalPortNumberOfClient);
+ o.ReceiveDataAsync(Receive);
- if (o.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ if (SharedKeyRequired)
{
- Debug.Console(2, this, "_client connected to {0} on port {1}", o.AddressClientConnectedTo, o.LocalPortNumberOfClient);
- o.ReceiveDataAsync(Receive);
-
- if (SharedKeyRequired)
+ WaitingForSharedKeyResponse = true;
+ WaitForSharedKey = new CTimer(timer =>
{
- WaitingForSharedKeyResponse = true;
- WaitForSharedKey = new CTimer(timer =>
- {
-
- Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Shared key exchange timer expired. IsReadyForCommunication={0}", IsReadyForCommunication);
- // Debug.Console(1, this, "Connect attempt failed {0}", c.ClientStatus);
- // This is the only case where we should call DisconectFromServer...Event handeler will trigger the cleanup
- o.DisconnectFromServer();
- //CheckClosedAndTryReconnect();
- //OnClientReadyForcommunications(false); // Should send false event
- }, 15000);
- }
- else
- {
- //CLient connected and shared key is not required so just raise the ready for communication event. if Shared key
- //required this is called by the shared key being negotiated
- if (IsReadyForCommunication == false)
- {
- OnClientReadyForcommunications(true); // Key not required
- }
- }
+
+ Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Shared key exchange timer expired. IsReadyForCommunication={0}", IsReadyForCommunication);
+ // Debug.Console(1, this, "Connect attempt failed {0}", c.ClientStatus);
+ // This is the only case where we should call DisconectFromServer...Event handeler will trigger the cleanup
+ o.DisconnectFromServer();
+ //CheckClosedAndTryReconnect();
+ //OnClientReadyForcommunications(false); // Should send false event
+ }, 15000);
}
else
{
- Debug.Console(1, this, "Connect attempt failed {0}", o.ClientStatus);
- CheckClosedAndTryReconnect();
+ //CLient connected and shared key is not required so just raise the ready for communication event. if Shared key
+ //required this is called by the shared key being negotiated
+ if (IsReadyForCommunication == false)
+ {
+ OnClientReadyForcommunications(true); // Key not required
+ }
}
- });
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Error, "_client connection exception: {0}", ex.Message);
- IsTryingToConnect = false;
- CheckClosedAndTryReconnect();
- }
+ }
+ else
+ {
+ Debug.Console(1, this, "Connect attempt failed {0}", o.ClientStatus);
+ CheckClosedAndTryReconnect();
+ }
+ });
}
-
- ///
- ///
- ///
- public void Disconnect()
+ catch (Exception ex)
{
- this.LogVerbose("Disconnect Called");
+ Debug.Console(0, this, Debug.ErrorLogLevel.Error, "_client connection exception: {0}", ex.Message);
+ IsTryingToConnect = false;
+ CheckClosedAndTryReconnect();
+ }
+ }
- DisconnectCalledByUser = true;
+ ///
+ ///
+ ///
+ public void Disconnect()
+ {
+ this.LogVerbose("Disconnect Called");
- // stop trying reconnects, if we are
- if (RetryTimer != null)
- {
- RetryTimer.Stop();
- RetryTimer = null;
- }
+ DisconnectCalledByUser = true;
- if (_client != null)
- {
- DisconnectClient();
- this.LogDebug("Disconnected");
- }
+ // stop trying reconnects, if we are
+ if (RetryTimer != null)
+ {
+ RetryTimer.Stop();
+ RetryTimer = null;
}
- ///
- /// Does the actual disconnect business
- ///
- public void DisconnectClient()
+ if (_client != null)
{
- if (_client == null) return;
+ DisconnectClient();
+ this.LogDebug("Disconnected");
+ }
+ }
- Debug.Console(1, this, "Disconnecting client");
- if (IsConnected)
- _client.DisconnectFromServer();
+ ///
+ /// Does the actual disconnect business
+ ///
+ public void DisconnectClient()
+ {
+ if (_client == null) return;
- // close up client. ALWAYS use this when disconnecting.
- IsTryingToConnect = false;
+ Debug.Console(1, this, "Disconnecting client");
+ if (IsConnected)
+ _client.DisconnectFromServer();
- Debug.Console(2, this, "Disconnecting _client {0}", DisconnectCalledByUser ? ", Called by user" : "");
- _client.SocketStatusChange -= Client_SocketStatusChange;
- _client.Dispose();
- _client = null;
+ // close up client. ALWAYS use this when disconnecting.
+ IsTryingToConnect = false;
- if (ConnectFailTimer == null) return;
- ConnectFailTimer.Stop();
- ConnectFailTimer.Dispose();
- ConnectFailTimer = null;
- }
-
- #region Methods
+ Debug.Console(2, this, "Disconnecting _client {0}", DisconnectCalledByUser ? ", Called by user" : "");
+ _client.SocketStatusChange -= Client_SocketStatusChange;
+ _client.Dispose();
+ _client = null;
+
+ if (ConnectFailTimer == null) return;
+ ConnectFailTimer.Stop();
+ ConnectFailTimer.Dispose();
+ ConnectFailTimer = null;
+ }
+
+ #region Methods
- ///
- /// Called from Connect failure or Socket Status change if
- /// auto reconnect and socket disconnected (Not disconnected by user)
- ///
- void CheckClosedAndTryReconnect()
+ ///
+ /// Called from Connect failure or Socket Status change if
+ /// auto reconnect and socket disconnected (Not disconnected by user)
+ ///
+ void CheckClosedAndTryReconnect()
+ {
+ if (_client != null)
{
- if (_client != null)
- {
- Debug.Console(2, this, "Cleaning up remotely closed/failed connection.");
- Disconnect();
- }
- if (!DisconnectCalledByUser && AutoReconnect)
+ Debug.Console(2, this, "Cleaning up remotely closed/failed connection.");
+ Disconnect();
+ }
+ if (!DisconnectCalledByUser && AutoReconnect)
+ {
+ var halfInterval = AutoReconnectIntervalMs / 2;
+ var rndTime = new Random().Next(-halfInterval, halfInterval) + AutoReconnectIntervalMs;
+ Debug.Console(2, this, "Attempting reconnect in {0} ms, randomized", rndTime);
+ if (RetryTimer != null)
{
- var halfInterval = AutoReconnectIntervalMs / 2;
- var rndTime = new Random().Next(-halfInterval, halfInterval) + AutoReconnectIntervalMs;
- Debug.Console(2, this, "Attempting reconnect in {0} ms, randomized", rndTime);
- if (RetryTimer != null)
- {
- RetryTimer.Stop();
- RetryTimer = null;
- }
- if (AutoReconnectTriggered != null)
- AutoReconnectTriggered(this, new EventArgs());
- RetryTimer = new CTimer(o => Connect(), rndTime);
+ RetryTimer.Stop();
+ RetryTimer = null;
}
+ if (AutoReconnectTriggered != null)
+ AutoReconnectTriggered(this, new EventArgs());
+ RetryTimer = new CTimer(o => Connect(), rndTime);
}
+ }
- ///
- /// Receive callback
- ///
- ///
- ///
- void Receive(SecureTCPClient client, int numBytes)
+ ///
+ /// Receive callback
+ ///
+ ///
+ ///
+ void Receive(SecureTCPClient client, int numBytes)
+ {
+ if (numBytes > 0)
{
- if (numBytes > 0)
+ string str = string.Empty;
+ var handler = TextReceivedQueueInvoke;
+ try
{
- string str = string.Empty;
- var handler = TextReceivedQueueInvoke;
- try
+ var bytes = client.IncomingDataBuffer.Take(numBytes).ToArray();
+ str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
+ Debug.Console(2, this, "_client Received:\r--------\r{0}\r--------", str);
+ if (!string.IsNullOrEmpty(checkHeartbeat(str)))
{
- var bytes = client.IncomingDataBuffer.Take(numBytes).ToArray();
- str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
- Debug.Console(2, this, "_client Received:\r--------\r{0}\r--------", str);
- if (!string.IsNullOrEmpty(checkHeartbeat(str)))
- {
- if (SharedKeyRequired && str == "SharedKey:")
- {
- Debug.Console(2, this, "Server asking for shared key, sending");
- SendText(SharedKey + "\n");
- }
- else if (SharedKeyRequired && str == "Shared Key Match")
- {
- StopWaitForSharedKeyTimer();
+ if (SharedKeyRequired && str == "SharedKey:")
+ {
+ Debug.Console(2, this, "Server asking for shared key, sending");
+ SendText(SharedKey + "\n");
+ }
+ else if (SharedKeyRequired && str == "Shared Key Match")
+ {
+ StopWaitForSharedKeyTimer();
- Debug.Console(2, this, "Shared key confirmed. Ready for communication");
- OnClientReadyForcommunications(true); // Successful key exchange
- }
- else
+ Debug.Console(2, this, "Shared key confirmed. Ready for communication");
+ OnClientReadyForcommunications(true); // Successful key exchange
+ }
+ else
+ {
+ //var bytesHandler = BytesReceived;
+ //if (bytesHandler != null)
+ // bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
+ var textHandler = TextReceived;
+ if (textHandler != null)
+ textHandler(this, new GenericCommMethodReceiveTextArgs(str));
+ if (handler != null)
{
- //var bytesHandler = BytesReceived;
- //if (bytesHandler != null)
- // bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
- var textHandler = TextReceived;
- if (textHandler != null)
- textHandler(this, new GenericCommMethodReceiveTextArgs(str));
- if (handler != null)
- {
- MessageQueue.TryToEnqueue(new GenericTcpServerCommMethodReceiveTextArgs(str));
- }
+ MessageQueue.TryToEnqueue(new GenericTcpServerCommMethodReceiveTextArgs(str));
}
}
}
- catch (Exception ex)
- {
- Debug.Console(1, this, "Error receiving data: {1}. Error: {0}", ex.Message, str);
- }
- if (client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
- client.ReceiveDataAsync(Receive);
-
- //Check to see if there is a subscription to the TextReceivedQueueInvoke event. If there is start the dequeue thread.
- if (handler != null)
- {
- var gotLock = DequeueLock.TryEnter();
- if (gotLock)
- CrestronInvoke.BeginInvoke((o) => DequeueEvent());
- }
}
- else //JAG added this as I believe the error return is 0 bytes like the server. See help when hover on ReceiveAsync
+ catch (Exception ex)
{
- client.DisconnectFromServer();
+ Debug.Console(1, this, "Error receiving data: {1}. Error: {0}", ex.Message, str);
}
- }
+ if (client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ client.ReceiveDataAsync(Receive);
- ///
- /// This method gets spooled up in its own thread an protected by a CCriticalSection to prevent multiple threads from running concurrently.
- /// It will dequeue items as they are enqueued automatically.
- ///
- void DequeueEvent()
- {
- try
+ //Check to see if there is a subscription to the TextReceivedQueueInvoke event. If there is start the dequeue thread.
+ if (handler != null)
{
- while (true)
- {
- // Pull from Queue and fire an event. Block indefinitely until an item can be removed, similar to a Gather.
- var message = MessageQueue.Dequeue();
- var handler = TextReceivedQueueInvoke;
- if (handler != null)
- {
- handler(this, message);
- }
- }
- }
- catch (Exception e)
- {
- this.LogException(e, "DequeueEvent error");
- }
- // Make sure to leave the CCritical section in case an exception above stops this thread, or we won't be able to restart it.
- if (DequeueLock != null)
- {
- DequeueLock.Leave();
+ var gotLock = DequeueLock.TryEnter();
+ if (gotLock)
+ CrestronInvoke.BeginInvoke((o) => DequeueEvent());
}
}
+ else //JAG added this as I believe the error return is 0 bytes like the server. See help when hover on ReceiveAsync
+ {
+ client.DisconnectFromServer();
+ }
+ }
- void HeartbeatStart()
+ ///
+ /// This method gets spooled up in its own thread an protected by a CCriticalSection to prevent multiple threads from running concurrently.
+ /// It will dequeue items as they are enqueued automatically.
+ ///
+ void DequeueEvent()
+ {
+ try
{
- if (HeartbeatEnabled)
+ while (true)
{
- this.LogVerbose("Starting Heartbeat");
- if (HeartbeatSendTimer == null)
- {
-
- HeartbeatSendTimer = new CTimer(this.SendHeartbeat, null, HeartbeatInterval, HeartbeatInterval);
- }
- if (HeartbeatAckTimer == null)
+ // Pull from Queue and fire an event. Block indefinitely until an item can be removed, similar to a Gather.
+ var message = MessageQueue.Dequeue();
+ var handler = TextReceivedQueueInvoke;
+ if (handler != null)
{
- HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
+ handler(this, message);
}
}
-
}
- void HeartbeatStop()
+ catch (Exception e)
{
+ this.LogException(e, "DequeueEvent error");
+ }
+ // Make sure to leave the CCritical section in case an exception above stops this thread, or we won't be able to restart it.
+ if (DequeueLock != null)
+ {
+ DequeueLock.Leave();
+ }
+ }
- if (HeartbeatSendTimer != null)
+ void HeartbeatStart()
+ {
+ if (HeartbeatEnabled)
+ {
+ this.LogVerbose("Starting Heartbeat");
+ if (HeartbeatSendTimer == null)
{
- Debug.Console(2, this, "Stoping Heartbeat Send");
- HeartbeatSendTimer.Stop();
- HeartbeatSendTimer = null;
+
+ HeartbeatSendTimer = new CTimer(this.SendHeartbeat, null, HeartbeatInterval, HeartbeatInterval);
}
- if (HeartbeatAckTimer != null)
+ if (HeartbeatAckTimer == null)
{
- Debug.Console(2, this, "Stoping Heartbeat Ack");
- HeartbeatAckTimer.Stop();
- HeartbeatAckTimer = null;
+ HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
}
+ }
+
+ }
+ void HeartbeatStop()
+ {
+ if (HeartbeatSendTimer != null)
+ {
+ Debug.Console(2, this, "Stoping Heartbeat Send");
+ HeartbeatSendTimer.Stop();
+ HeartbeatSendTimer = null;
}
- void SendHeartbeat(object notused)
+ if (HeartbeatAckTimer != null)
{
- this.SendText(HeartbeatString);
- Debug.Console(2, this, "Sending Heartbeat");
-
+ Debug.Console(2, this, "Stoping Heartbeat Ack");
+ HeartbeatAckTimer.Stop();
+ HeartbeatAckTimer = null;
}
- //private method to check heartbeat requirements and start or reset timer
- string checkHeartbeat(string received)
+ }
+ void SendHeartbeat(object notused)
+ {
+ this.SendText(HeartbeatString);
+ Debug.Console(2, this, "Sending Heartbeat");
+
+ }
+
+ //private method to check heartbeat requirements and start or reset timer
+ string checkHeartbeat(string received)
+ {
+ try
{
- try
+ if (HeartbeatEnabled)
{
- if (HeartbeatEnabled)
+ if (!string.IsNullOrEmpty(HeartbeatString))
{
- if (!string.IsNullOrEmpty(HeartbeatString))
+ var remainingText = received.Replace(HeartbeatString, "");
+ var noDelimiter = received.Trim(new char[] { '\r', '\n' });
+ if (noDelimiter.Contains(HeartbeatString))
{
- var remainingText = received.Replace(HeartbeatString, "");
- var noDelimiter = received.Trim(new char[] { '\r', '\n' });
- if (noDelimiter.Contains(HeartbeatString))
+ if (HeartbeatAckTimer != null)
+ {
+ HeartbeatAckTimer.Reset(HeartbeatInterval * 2);
+ }
+ else
{
- if (HeartbeatAckTimer != null)
- {
- HeartbeatAckTimer.Reset(HeartbeatInterval * 2);
- }
- else
- {
- HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
- }
- Debug.Console(2, this, "Heartbeat Received: {0}, from Server", HeartbeatString);
- return remainingText;
+ HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
}
+ Debug.Console(2, this, "Heartbeat Received: {0}, from Server", HeartbeatString);
+ return remainingText;
}
}
}
- catch (Exception ex)
- {
- Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
- }
- return received;
}
+ catch (Exception ex)
+ {
+ Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
+ }
+ return received;
+ }
- void HeartbeatAckTimerFail(object o)
+ void HeartbeatAckTimerFail(object o)
+ {
+ try
{
- try
- {
- if (IsConnected)
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "Heartbeat not received from Server...DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE");
- SendText("Heartbeat not received by server, closing connection");
- CheckClosedAndTryReconnect();
- }
-
- }
- catch (Exception ex)
+ if (IsConnected)
{
- ErrorLog.Error("Heartbeat timeout Error on _client: {0}, {1}", Key, ex);
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "Heartbeat not received from Server...DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE");
+ SendText("Heartbeat not received by server, closing connection");
+ CheckClosedAndTryReconnect();
}
+
+ }
+ catch (Exception ex)
+ {
+ ErrorLog.Error("Heartbeat timeout Error on _client: {0}, {1}", Key, ex);
}
+ }
- ///
- ///
- ///
- void StopWaitForSharedKeyTimer()
+ ///
+ ///
+ ///
+ void StopWaitForSharedKeyTimer()
+ {
+ if (WaitForSharedKey != null)
{
- if (WaitForSharedKey != null)
- {
- WaitForSharedKey.Stop();
- WaitForSharedKey = null;
- }
+ WaitForSharedKey.Stop();
+ WaitForSharedKey = null;
}
+ }
- ///
- /// General send method
- ///
- public void SendText(string text)
+ ///
+ /// General send method
+ ///
+ public void SendText(string text)
+ {
+ if (!string.IsNullOrEmpty(text))
{
- if (!string.IsNullOrEmpty(text))
+ try
{
- try
+ var bytes = Encoding.GetEncoding(28591).GetBytes(text);
+ if (_client != null && _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
{
- var bytes = Encoding.GetEncoding(28591).GetBytes(text);
- if (_client != null && _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ _client.SendDataAsync(bytes, bytes.Length, (c, n) =>
{
- _client.SendDataAsync(bytes, bytes.Length, (c, n) =>
+ // HOW IN THE HELL DO WE CATCH AN EXCEPTION IN SENDING?????
+ if (n <= 0)
{
- // HOW IN THE HELL DO WE CATCH AN EXCEPTION IN SENDING?????
- if (n <= 0)
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "[{0}] Sent zero bytes. Was there an error?", this.Key);
- }
- });
- }
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, "Error sending text: {1}. Error: {0}", ex.Message, text);
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "[{0}] Sent zero bytes. Was there an error?", this.Key);
+ }
+ });
}
}
- }
-
- ///
- ///
- ///
- public void SendBytes(byte[] bytes)
- {
- if (bytes.Length > 0)
+ catch (Exception ex)
{
- try
- {
- if (_client != null && _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
- _client.SendData(bytes, bytes.Length);
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, "Error sending bytes. Error: {0}", ex.Message);
- }
+ Debug.Console(0, this, "Error sending text: {1}. Error: {0}", ex.Message, text);
}
}
+ }
- ///
- /// SocketStatusChange Callback
- ///
- ///
- ///
- void Client_SocketStatusChange(SecureTCPClient client, SocketStatus clientSocketStatus)
+ ///
+ ///
+ ///
+ public void SendBytes(byte[] bytes)
+ {
+ if (bytes.Length > 0)
{
- if (ProgramIsStopping)
- {
- ProgramIsStopping = false;
- return;
- }
try
{
- Debug.Console(2, this, "Socket status change: {0} ({1})", client.ClientStatus, (ushort)(client.ClientStatus));
-
- OnConnectionChange();
- // The client could be null or disposed by this time...
- if (_client == null || _client.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- HeartbeatStop();
- OnClientReadyForcommunications(false); // socket has gone low
- CheckClosedAndTryReconnect();
- }
+ if (_client != null && _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ _client.SendData(bytes, bytes.Length);
}
catch (Exception ex)
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Error in socket status change callback. Error: {0}\r\r{1}", ex, ex.InnerException);
+ Debug.Console(0, this, "Error sending bytes. Error: {0}", ex.Message);
}
}
+ }
- ///
- /// Helper for ConnectionChange event
- ///
- void OnConnectionChange()
+ ///
+ /// SocketStatusChange Callback
+ ///
+ ///
+ ///
+ void Client_SocketStatusChange(SecureTCPClient client, SocketStatus clientSocketStatus)
+ {
+ if (ProgramIsStopping)
{
- var handler = ConnectionChange;
- if (handler == null) return;
-
- handler(this, new GenericSocketStatusChageEventArgs(this));
+ ProgramIsStopping = false;
+ return;
}
-
- ///
- /// Helper to fire ClientReadyForCommunications event
- ///
- void OnClientReadyForcommunications(bool isReady)
+ try
{
- IsReadyForCommunication = isReady;
- if (IsReadyForCommunication)
- HeartbeatStart();
+ Debug.Console(2, this, "Socket status change: {0} ({1})", client.ClientStatus, (ushort)(client.ClientStatus));
- var handler = ClientReadyForCommunications;
- if (handler == null) return;
-
- handler(this, new GenericTcpServerClientReadyForcommunicationsEventArgs(IsReadyForCommunication));
+ OnConnectionChange();
+ // The client could be null or disposed by this time...
+ if (_client == null || _client.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
+ {
+ HeartbeatStop();
+ OnClientReadyForcommunications(false); // socket has gone low
+ CheckClosedAndTryReconnect();
+ }
}
- #endregion
+ catch (Exception ex)
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Error in socket status change callback. Error: {0}\r\r{1}", ex, ex.InnerException);
+ }
+ }
+
+ ///
+ /// Helper for ConnectionChange event
+ ///
+ void OnConnectionChange()
+ {
+ var handler = ConnectionChange;
+ if (handler == null) return;
+
+ handler(this, new GenericSocketStatusChageEventArgs(this));
}
+ ///
+ /// Helper to fire ClientReadyForCommunications event
+ ///
+ void OnClientReadyForcommunications(bool isReady)
+ {
+ IsReadyForCommunication = isReady;
+ if (IsReadyForCommunication)
+ HeartbeatStart();
+
+ var handler = ClientReadyForCommunications;
+ if (handler == null) return;
+
+ handler(this, new GenericTcpServerClientReadyForcommunicationsEventArgs(IsReadyForCommunication));
+ }
+ #endregion
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/GenericSecureTcpIpClient_ForServer.cs b/src/PepperDash.Core/Comm/GenericSecureTcpIpClient_ForServer.cs
index 93b195cad..297233b1d 100644
--- a/src/PepperDash.Core/Comm/GenericSecureTcpIpClient_ForServer.cs
+++ b/src/PepperDash.Core/Comm/GenericSecureTcpIpClient_ForServer.cs
@@ -19,891 +19,889 @@ PepperDash Technology Corporation reserves all rights under applicable laws.
using Crestron.SimplSharp.CrestronSockets;
using PepperDash.Core.Logging;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Generic secure TCP/IP client for server
+///
+public class GenericSecureTcpIpClient_ForServer : Device, IAutoReconnect
{
///
- /// Generic secure TCP/IP client for server
+ /// Band aid delegate for choked server
///
- public class GenericSecureTcpIpClient_ForServer : Device, IAutoReconnect
- {
- ///
- /// Band aid delegate for choked server
- ///
- internal delegate void ConnectionHasHungCallbackDelegate();
+ internal delegate void ConnectionHasHungCallbackDelegate();
- #region Events
+ #region Events
- //public event EventHandler BytesReceived;
+ //public event EventHandler BytesReceived;
- ///
- /// Notifies of text received
- ///
- public event EventHandler TextReceived;
+ ///
+ /// Notifies of text received
+ ///
+ public event EventHandler TextReceived;
- ///
- /// Notifies of auto reconnect sequence triggered
- ///
- public event EventHandler AutoReconnectTriggered;
+ ///
+ /// Notifies of auto reconnect sequence triggered
+ ///
+ public event EventHandler AutoReconnectTriggered;
- ///
- /// Event for Receiving text. Once subscribed to this event the receive callback will start a thread that dequeues the messages and invokes the event on a new thread.
- /// It is not recommended to use both the TextReceived event and the TextReceivedQueueInvoke event.
- ///
- public event EventHandler TextReceivedQueueInvoke;
+ ///
+ /// Event for Receiving text. Once subscribed to this event the receive callback will start a thread that dequeues the messages and invokes the event on a new thread.
+ /// It is not recommended to use both the TextReceived event and the TextReceivedQueueInvoke event.
+ ///
+ public event EventHandler TextReceivedQueueInvoke;
- ///
- /// Notifies of socket status change
- ///
- public event EventHandler ConnectionChange;
+ ///
+ /// Notifies of socket status change
+ ///
+ public event EventHandler ConnectionChange;
- ///
- /// This is something of a band-aid callback. If the client times out during the connection process, because the server
- /// is stuck, this will fire. It is intended to be used by the Server class monitor client, to help
- /// keep a watch on the server and reset it if necessary.
- ///
- internal ConnectionHasHungCallbackDelegate ConnectionHasHungCallback;
+ ///
+ /// This is something of a band-aid callback. If the client times out during the connection process, because the server
+ /// is stuck, this will fire. It is intended to be used by the Server class monitor client, to help
+ /// keep a watch on the server and reset it if necessary.
+ ///
+ internal ConnectionHasHungCallbackDelegate ConnectionHasHungCallback;
- ///
- /// For a client with a pre shared key, this will fire after the communication is established and the key exchange is complete. If you require
- /// a key and subscribe to the socket change event and try to send data on a connection the data sent will interfere with the key exchange and disconnect.
- ///
- public event EventHandler ClientReadyForCommunications;
+ ///
+ /// For a client with a pre shared key, this will fire after the communication is established and the key exchange is complete. If you require
+ /// a key and subscribe to the socket change event and try to send data on a connection the data sent will interfere with the key exchange and disconnect.
+ ///
+ public event EventHandler ClientReadyForCommunications;
- #endregion
+ #endregion
- #region Properties & Variables
+ #region Properties & Variables
- ///
- /// Address of server
- ///
- public string Hostname { get; set; }
+ ///
+ /// Address of server
+ ///
+ public string Hostname { get; set; }
- ///
- /// Port on server
- ///
- public int Port { get; set; }
+ ///
+ /// Port on server
+ ///
+ public int Port { get; set; }
- ///
- /// S+ helper
- ///
- public ushort UPort
- {
- get { return Convert.ToUInt16(Port); }
- set { Port = Convert.ToInt32(value); }
- }
+ ///
+ /// S+ helper
+ ///
+ public ushort UPort
+ {
+ get { return Convert.ToUInt16(Port); }
+ set { Port = Convert.ToInt32(value); }
+ }
- ///
- /// Bool to show whether the server requires a preshared key. This is used in the DynamicTCPServer class
- ///
- public bool SharedKeyRequired { get; set; }
+ ///
+ /// Bool to show whether the server requires a preshared key. This is used in the DynamicTCPServer class
+ ///
+ public bool SharedKeyRequired { get; set; }
- ///
- /// S+ helper for requires shared key bool
- ///
- public ushort USharedKeyRequired
+ ///
+ /// S+ helper for requires shared key bool
+ ///
+ public ushort USharedKeyRequired
+ {
+ set
{
- set
- {
- if (value == 1)
- SharedKeyRequired = true;
- else
- SharedKeyRequired = false;
- }
+ if (value == 1)
+ SharedKeyRequired = true;
+ else
+ SharedKeyRequired = false;
}
+ }
- ///
- /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module
- ///
- public string SharedKey { get; set; }
+ ///
+ /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module
+ ///
+ public string SharedKey { get; set; }
- ///
- /// flag to show the client is waiting for the server to send the shared key
- ///
- private bool WaitingForSharedKeyResponse { get; set; }
+ ///
+ /// flag to show the client is waiting for the server to send the shared key
+ ///
+ private bool WaitingForSharedKeyResponse { get; set; }
- ///
- /// Defaults to 2000
- ///
- public int BufferSize { get; set; }
+ ///
+ /// Defaults to 2000
+ ///
+ public int BufferSize { get; set; }
- ///
- /// Semaphore on connect method
- ///
- bool IsTryingToConnect;
+ ///
+ /// Semaphore on connect method
+ ///
+ bool IsTryingToConnect;
- ///
- /// Bool showing if socket is connected
- ///
- public bool IsConnected
+ ///
+ /// Bool showing if socket is connected
+ ///
+ public bool IsConnected
+ {
+ get
{
- get
- {
- if (Client != null)
- return Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED;
- else
- return false;
- }
+ if (Client != null)
+ return Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED;
+ else
+ return false;
}
+ }
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsConnected
- {
- get { return (ushort)(IsConnected ? 1 : 0); }
- }
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsConnected
+ {
+ get { return (ushort)(IsConnected ? 1 : 0); }
+ }
- ///
- /// Bool showing if socket is ready for communication after shared key exchange
- ///
- public bool IsReadyForCommunication { get; set; }
+ ///
+ /// Bool showing if socket is ready for communication after shared key exchange
+ ///
+ public bool IsReadyForCommunication { get; set; }
- ///
- /// S+ helper for IsReadyForCommunication
- ///
- public ushort UIsReadyForCommunication
- {
- get { return (ushort)(IsReadyForCommunication ? 1 : 0); }
- }
+ ///
+ /// S+ helper for IsReadyForCommunication
+ ///
+ public ushort UIsReadyForCommunication
+ {
+ get { return (ushort)(IsReadyForCommunication ? 1 : 0); }
+ }
- ///
- /// Client socket status Read only
- ///
- public SocketStatus ClientStatus
+ ///
+ /// Client socket status Read only
+ ///
+ public SocketStatus ClientStatus
+ {
+ get
{
- get
- {
- if (Client != null)
- return Client.ClientStatus;
- else
- return SocketStatus.SOCKET_STATUS_NO_CONNECT;
- }
+ if (Client != null)
+ return Client.ClientStatus;
+ else
+ return SocketStatus.SOCKET_STATUS_NO_CONNECT;
}
+ }
- ///
- /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
- /// and IsConnected would be true when this == 2.
- ///
- public ushort UStatus
- {
- get { return (ushort)ClientStatus; }
- }
+ ///
+ /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
+ /// and IsConnected would be true when this == 2.
+ ///
+ public ushort UStatus
+ {
+ get { return (ushort)ClientStatus; }
+ }
- ///
- /// Status text shows the message associated with socket status
- ///
- public string ClientStatusText { get { return ClientStatus.ToString(); } }
-
- ///
- /// bool to track if auto reconnect should be set on the socket
- ///
- public bool AutoReconnect { get; set; }
-
- ///
- /// S+ helper for AutoReconnect
- ///
- public ushort UAutoReconnect
- {
- get { return (ushort)(AutoReconnect ? 1 : 0); }
- set { AutoReconnect = value == 1; }
- }
- ///
- /// Milliseconds to wait before attempting to reconnect. Defaults to 5000
- ///
- public int AutoReconnectIntervalMs { get; set; }
-
- ///
- /// Flag Set only when the disconnect method is called.
- ///
- bool DisconnectCalledByUser;
-
- ///
- /// private Timer for auto reconnect
- ///
- CTimer RetryTimer;
-
-
- ///
- ///
- ///
- public bool HeartbeatEnabled { get; set; }
- ///
- ///
- ///
- public ushort UHeartbeatEnabled
- {
- get { return (ushort)(HeartbeatEnabled ? 1 : 0); }
- set { HeartbeatEnabled = value == 1; }
- }
+ ///
+ /// Status text shows the message associated with socket status
+ ///
+ public string ClientStatusText { get { return ClientStatus.ToString(); } }
- ///
- ///
- ///
- public string HeartbeatString { get; set; }
- //public int HeartbeatInterval = 50000;
+ ///
+ /// bool to track if auto reconnect should be set on the socket
+ ///
+ public bool AutoReconnect { get; set; }
- ///
- /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+
- ///
- public int HeartbeatInterval { get; set; }
+ ///
+ /// S+ helper for AutoReconnect
+ ///
+ public ushort UAutoReconnect
+ {
+ get { return (ushort)(AutoReconnect ? 1 : 0); }
+ set { AutoReconnect = value == 1; }
+ }
+ ///
+ /// Milliseconds to wait before attempting to reconnect. Defaults to 5000
+ ///
+ public int AutoReconnectIntervalMs { get; set; }
- ///
- /// Simpl+ Heartbeat Analog value in seconds
- ///
- public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatInterval = (value * 1000); } }
+ ///
+ /// Flag Set only when the disconnect method is called.
+ ///
+ bool DisconnectCalledByUser;
- CTimer HeartbeatSendTimer;
- CTimer HeartbeatAckTimer;
- ///
- /// Used to force disconnection on a dead connect attempt
- ///
- CTimer ConnectFailTimer;
- CTimer WaitForSharedKey;
- private int ConnectionCount;
- ///
- /// Internal secure client
- ///
- SecureTCPClient Client;
+ ///
+ /// private Timer for auto reconnect
+ ///
+ CTimer RetryTimer;
- bool ProgramIsStopping;
- ///
- /// Queue lock
- ///
- CCriticalSection DequeueLock = new CCriticalSection();
+ ///
+ ///
+ ///
+ public bool HeartbeatEnabled { get; set; }
+ ///
+ ///
+ ///
+ public ushort UHeartbeatEnabled
+ {
+ get { return (ushort)(HeartbeatEnabled ? 1 : 0); }
+ set { HeartbeatEnabled = value == 1; }
+ }
- ///
- /// Receive Queue size. Defaults to 20. Will set to 20 if QueueSize property is less than 20. Use constructor or set queue size property before
- /// calling initialize.
- ///
- public int ReceiveQueueSize { get; set; }
+ ///
+ ///
+ ///
+ public string HeartbeatString { get; set; }
+ //public int HeartbeatInterval = 50000;
- ///
- /// Queue to temporarily store received messages with the source IP and Port info. Defaults to size 20. Use constructor or set queue size property before
- /// calling initialize.
- ///
- private CrestronQueue MessageQueue;
+ ///
+ /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+
+ ///
+ public int HeartbeatInterval { get; set; }
+ ///
+ /// Simpl+ Heartbeat Analog value in seconds
+ ///
+ public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatInterval = (value * 1000); } }
- #endregion
+ CTimer HeartbeatSendTimer;
+ CTimer HeartbeatAckTimer;
+ ///
+ /// Used to force disconnection on a dead connect attempt
+ ///
+ CTimer ConnectFailTimer;
+ CTimer WaitForSharedKey;
+ private int ConnectionCount;
+ ///
+ /// Internal secure client
+ ///
+ SecureTCPClient Client;
- #region Constructors
-
- ///
- /// Constructor
- ///
- ///
- ///
- ///
- ///
- public GenericSecureTcpIpClient_ForServer(string key, string address, int port, int bufferSize)
- : base(key)
- {
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- Hostname = address;
- Port = port;
- BufferSize = bufferSize;
- AutoReconnectIntervalMs = 5000;
-
- }
+ bool ProgramIsStopping;
- ///
- /// Constructor for S+
- ///
- public GenericSecureTcpIpClient_ForServer()
- : base("Uninitialized Secure Tcp Client For Server")
- {
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- AutoReconnectIntervalMs = 5000;
- BufferSize = 2000;
- }
+ ///
+ /// Queue lock
+ ///
+ CCriticalSection DequeueLock = new CCriticalSection();
- ///
- /// Contstructor that sets all properties by calling the initialize method with a config object.
- ///
- ///
- ///
- public GenericSecureTcpIpClient_ForServer(string key, TcpClientConfigObject clientConfigObject)
- : base(key)
- {
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- Initialize(clientConfigObject);
- }
+ ///
+ /// Receive Queue size. Defaults to 20. Will set to 20 if QueueSize property is less than 20. Use constructor or set queue size property before
+ /// calling initialize.
+ ///
+ public int ReceiveQueueSize { get; set; }
- #endregion
+ ///
+ /// Queue to temporarily store received messages with the source IP and Port info. Defaults to size 20. Use constructor or set queue size property before
+ /// calling initialize.
+ ///
+ private CrestronQueue MessageQueue;
- #region Methods
- ///
- /// Just to help S+ set the key
- ///
- public void Initialize(string key)
- {
- Key = key;
- }
+ #endregion
- ///
- /// Initialize called by the constructor that accepts a client config object. Can be called later to reset properties of client.
- ///
- ///
- public void Initialize(TcpClientConfigObject clientConfigObject)
- {
- try
- {
- if (clientConfigObject != null)
- {
- var TcpSshProperties = clientConfigObject.Control.TcpSshProperties;
- Hostname = TcpSshProperties.Address;
- AutoReconnect = TcpSshProperties.AutoReconnect;
- AutoReconnectIntervalMs = TcpSshProperties.AutoReconnectIntervalMs > 1000 ?
- TcpSshProperties.AutoReconnectIntervalMs : 5000;
- SharedKey = clientConfigObject.SharedKey;
- SharedKeyRequired = clientConfigObject.SharedKeyRequired;
- HeartbeatEnabled = clientConfigObject.HeartbeatRequired;
- HeartbeatRequiredIntervalInSeconds = clientConfigObject.HeartbeatRequiredIntervalInSeconds > 0 ?
- clientConfigObject.HeartbeatRequiredIntervalInSeconds : (ushort)15;
- HeartbeatString = string.IsNullOrEmpty(clientConfigObject.HeartbeatStringToMatch) ? "heartbeat" : clientConfigObject.HeartbeatStringToMatch;
- Port = TcpSshProperties.Port;
- BufferSize = TcpSshProperties.BufferSize > 2000 ? TcpSshProperties.BufferSize : 2000;
- ReceiveQueueSize = clientConfigObject.ReceiveQueueSize > 20 ? clientConfigObject.ReceiveQueueSize : 20;
- MessageQueue = new CrestronQueue(ReceiveQueueSize);
- }
- else
- {
- ErrorLog.Error("Could not initialize client with key: {0}", Key);
- }
- }
- catch
+ #region Constructors
+
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
+ ///
+ ///
+ public GenericSecureTcpIpClient_ForServer(string key, string address, int port, int bufferSize)
+ : base(key)
+ {
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ Hostname = address;
+ Port = port;
+ BufferSize = bufferSize;
+ AutoReconnectIntervalMs = 5000;
+
+ }
+
+ ///
+ /// Constructor for S+
+ ///
+ public GenericSecureTcpIpClient_ForServer()
+ : base("Uninitialized Secure Tcp Client For Server")
+ {
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ AutoReconnectIntervalMs = 5000;
+ BufferSize = 2000;
+ }
+
+ ///
+ /// Contstructor that sets all properties by calling the initialize method with a config object.
+ ///
+ ///
+ ///
+ public GenericSecureTcpIpClient_ForServer(string key, TcpClientConfigObject clientConfigObject)
+ : base(key)
+ {
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ Initialize(clientConfigObject);
+ }
+
+ #endregion
+
+ #region Methods
+
+ ///
+ /// Just to help S+ set the key
+ ///
+ public void Initialize(string key)
+ {
+ Key = key;
+ }
+
+ ///
+ /// Initialize called by the constructor that accepts a client config object. Can be called later to reset properties of client.
+ ///
+ ///
+ public void Initialize(TcpClientConfigObject clientConfigObject)
+ {
+ try
+ {
+ if (clientConfigObject != null)
+ {
+ var TcpSshProperties = clientConfigObject.Control.TcpSshProperties;
+ Hostname = TcpSshProperties.Address;
+ AutoReconnect = TcpSshProperties.AutoReconnect;
+ AutoReconnectIntervalMs = TcpSshProperties.AutoReconnectIntervalMs > 1000 ?
+ TcpSshProperties.AutoReconnectIntervalMs : 5000;
+ SharedKey = clientConfigObject.SharedKey;
+ SharedKeyRequired = clientConfigObject.SharedKeyRequired;
+ HeartbeatEnabled = clientConfigObject.HeartbeatRequired;
+ HeartbeatRequiredIntervalInSeconds = clientConfigObject.HeartbeatRequiredIntervalInSeconds > 0 ?
+ clientConfigObject.HeartbeatRequiredIntervalInSeconds : (ushort)15;
+ HeartbeatString = string.IsNullOrEmpty(clientConfigObject.HeartbeatStringToMatch) ? "heartbeat" : clientConfigObject.HeartbeatStringToMatch;
+ Port = TcpSshProperties.Port;
+ BufferSize = TcpSshProperties.BufferSize > 2000 ? TcpSshProperties.BufferSize : 2000;
+ ReceiveQueueSize = clientConfigObject.ReceiveQueueSize > 20 ? clientConfigObject.ReceiveQueueSize : 20;
+ MessageQueue = new CrestronQueue(ReceiveQueueSize);
+ }
+ else
{
ErrorLog.Error("Could not initialize client with key: {0}", Key);
}
}
-
- ///
- /// Handles closing this up when the program shuts down
- ///
- void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ catch
{
- if (programEventType == eProgramStatusEventType.Stopping || programEventType == eProgramStatusEventType.Paused)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing Client connection");
- ProgramIsStopping = true;
- Disconnect();
- }
-
+ ErrorLog.Error("Could not initialize client with key: {0}", Key);
}
+ }
- ///
- /// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name.
- ///
- public void Connect()
+ ///
+ /// Handles closing this up when the program shuts down
+ ///
+ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ {
+ if (programEventType == eProgramStatusEventType.Stopping || programEventType == eProgramStatusEventType.Paused)
{
- ConnectionCount++;
- Debug.Console(2, this, "Attempting connect Count:{0}", ConnectionCount);
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing Client connection");
+ ProgramIsStopping = true;
+ Disconnect();
+ }
+ }
- if (IsConnected)
+ ///
+ /// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name.
+ ///
+ public void Connect()
+ {
+ ConnectionCount++;
+ Debug.Console(2, this, "Attempting connect Count:{0}", ConnectionCount);
+
+
+ if (IsConnected)
+ {
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already connected. Ignoring.");
+ return;
+ }
+ if (IsTryingToConnect)
+ {
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already trying to connect. Ignoring.");
+ return;
+ }
+ try
+ {
+ IsTryingToConnect = true;
+ if (RetryTimer != null)
{
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already connected. Ignoring.");
+ RetryTimer.Stop();
+ RetryTimer = null;
+ }
+ if (string.IsNullOrEmpty(Hostname))
+ {
+ Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No address set");
return;
}
- if (IsTryingToConnect)
+ if (Port < 1 || Port > 65535)
{
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already trying to connect. Ignoring.");
+ Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: Invalid port");
return;
}
- try
+ if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
{
- IsTryingToConnect = true;
- if (RetryTimer != null)
- {
- RetryTimer.Stop();
- RetryTimer = null;
- }
- if (string.IsNullOrEmpty(Hostname))
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No address set");
- return;
- }
- if (Port < 1 || Port > 65535)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: Invalid port");
- return;
- }
- if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No Shared Key set");
- return;
- }
+ Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No Shared Key set");
+ return;
+ }
- // clean up previous client
- if (Client != null)
- {
- Cleanup();
- }
- DisconnectCalledByUser = false;
+ // clean up previous client
+ if (Client != null)
+ {
+ Cleanup();
+ }
+ DisconnectCalledByUser = false;
- Client = new SecureTCPClient(Hostname, Port, BufferSize);
- Client.SocketStatusChange += Client_SocketStatusChange;
- if (HeartbeatEnabled)
- Client.SocketSendOrReceiveTimeOutInMs = (HeartbeatInterval * 5);
- Client.AddressClientConnectedTo = Hostname;
- Client.PortNumber = Port;
- // SecureClient = c;
+ Client = new SecureTCPClient(Hostname, Port, BufferSize);
+ Client.SocketStatusChange += Client_SocketStatusChange;
+ if (HeartbeatEnabled)
+ Client.SocketSendOrReceiveTimeOutInMs = (HeartbeatInterval * 5);
+ Client.AddressClientConnectedTo = Hostname;
+ Client.PortNumber = Port;
+ // SecureClient = c;
- //var timeOfConnect = DateTime.Now.ToString("HH:mm:ss.fff");
+ //var timeOfConnect = DateTime.Now.ToString("HH:mm:ss.fff");
- ConnectFailTimer = new CTimer(o =>
+ ConnectFailTimer = new CTimer(o =>
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Connect attempt has not finished after 30sec Count:{0}", ConnectionCount);
+ if (IsTryingToConnect)
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Connect attempt has not finished after 30sec Count:{0}", ConnectionCount);
- if (IsTryingToConnect)
- {
- IsTryingToConnect = false;
-
- //if (ConnectionHasHungCallback != null)
- //{
- // ConnectionHasHungCallback();
- //}
- //SecureClient.DisconnectFromServer();
- //CheckClosedAndTryReconnect();
- }
- }, 30000);
+ IsTryingToConnect = false;
+
+ //if (ConnectionHasHungCallback != null)
+ //{
+ // ConnectionHasHungCallback();
+ //}
+ //SecureClient.DisconnectFromServer();
+ //CheckClosedAndTryReconnect();
+ }
+ }, 30000);
- Debug.Console(2, this, "Making Connection Count:{0}", ConnectionCount);
- Client.ConnectToServerAsync(o =>
+ Debug.Console(2, this, "Making Connection Count:{0}", ConnectionCount);
+ Client.ConnectToServerAsync(o =>
+ {
+ Debug.Console(2, this, "ConnectToServerAsync Count:{0} Ran!", ConnectionCount);
+
+ if (ConnectFailTimer != null)
{
- Debug.Console(2, this, "ConnectToServerAsync Count:{0} Ran!", ConnectionCount);
+ ConnectFailTimer.Stop();
+ }
+ IsTryingToConnect = false;
- if (ConnectFailTimer != null)
- {
- ConnectFailTimer.Stop();
- }
- IsTryingToConnect = false;
+ if (o.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ {
+ Debug.Console(2, this, "Client connected to {0} on port {1}", o.AddressClientConnectedTo, o.LocalPortNumberOfClient);
+ o.ReceiveDataAsync(Receive);
- if (o.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ if (SharedKeyRequired)
{
- Debug.Console(2, this, "Client connected to {0} on port {1}", o.AddressClientConnectedTo, o.LocalPortNumberOfClient);
- o.ReceiveDataAsync(Receive);
-
- if (SharedKeyRequired)
+ WaitingForSharedKeyResponse = true;
+ WaitForSharedKey = new CTimer(timer =>
{
- WaitingForSharedKeyResponse = true;
- WaitForSharedKey = new CTimer(timer =>
- {
-
- Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Shared key exchange timer expired. IsReadyForCommunication={0}", IsReadyForCommunication);
- // Debug.Console(1, this, "Connect attempt failed {0}", c.ClientStatus);
- // This is the only case where we should call DisconectFromServer...Event handeler will trigger the cleanup
- o.DisconnectFromServer();
- //CheckClosedAndTryReconnect();
- //OnClientReadyForcommunications(false); // Should send false event
- }, 15000);
- }
- else
- {
- //CLient connected and shared key is not required so just raise the ready for communication event. if Shared key
- //required this is called by the shared key being negotiated
- if (IsReadyForCommunication == false)
- {
- OnClientReadyForcommunications(true); // Key not required
- }
- }
+
+ Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Shared key exchange timer expired. IsReadyForCommunication={0}", IsReadyForCommunication);
+ // Debug.Console(1, this, "Connect attempt failed {0}", c.ClientStatus);
+ // This is the only case where we should call DisconectFromServer...Event handeler will trigger the cleanup
+ o.DisconnectFromServer();
+ //CheckClosedAndTryReconnect();
+ //OnClientReadyForcommunications(false); // Should send false event
+ }, 15000);
}
else
{
- Debug.Console(1, this, "Connect attempt failed {0}", o.ClientStatus);
- CheckClosedAndTryReconnect();
+ //CLient connected and shared key is not required so just raise the ready for communication event. if Shared key
+ //required this is called by the shared key being negotiated
+ if (IsReadyForCommunication == false)
+ {
+ OnClientReadyForcommunications(true); // Key not required
+ }
}
- });
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Client connection exception: {0}", ex.Message);
- IsTryingToConnect = false;
- CheckClosedAndTryReconnect();
- }
+ }
+ else
+ {
+ Debug.Console(1, this, "Connect attempt failed {0}", o.ClientStatus);
+ CheckClosedAndTryReconnect();
+ }
+ });
}
-
- ///
- ///
- ///
- public void Disconnect()
+ catch (Exception ex)
{
- this.LogVerbose("Disconnect Called");
+ Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Client connection exception: {0}", ex.Message);
+ IsTryingToConnect = false;
+ CheckClosedAndTryReconnect();
+ }
+ }
- DisconnectCalledByUser = true;
- if (IsConnected)
- {
- Client.DisconnectFromServer();
+ ///
+ ///
+ ///
+ public void Disconnect()
+ {
+ this.LogVerbose("Disconnect Called");
- }
- if (RetryTimer != null)
- {
- RetryTimer.Stop();
- RetryTimer = null;
- }
- Cleanup();
- }
+ DisconnectCalledByUser = true;
+ if (IsConnected)
+ {
+ Client.DisconnectFromServer();
- ///
- /// Internal call to close up client. ALWAYS use this when disconnecting.
- ///
- void Cleanup()
+ }
+ if (RetryTimer != null)
{
- IsTryingToConnect = false;
+ RetryTimer.Stop();
+ RetryTimer = null;
+ }
+ Cleanup();
+ }
- if (Client != null)
- {
- //SecureClient.DisconnectFromServer();
- Debug.Console(2, this, "Disconnecting Client {0}", DisconnectCalledByUser ? ", Called by user" : "");
- Client.SocketStatusChange -= Client_SocketStatusChange;
- Client.Dispose();
- Client = null;
- }
- if (ConnectFailTimer != null)
- {
- ConnectFailTimer.Stop();
- ConnectFailTimer.Dispose();
- ConnectFailTimer = null;
- }
+ ///
+ /// Internal call to close up client. ALWAYS use this when disconnecting.
+ ///
+ void Cleanup()
+ {
+ IsTryingToConnect = false;
+
+ if (Client != null)
+ {
+ //SecureClient.DisconnectFromServer();
+ Debug.Console(2, this, "Disconnecting Client {0}", DisconnectCalledByUser ? ", Called by user" : "");
+ Client.SocketStatusChange -= Client_SocketStatusChange;
+ Client.Dispose();
+ Client = null;
+ }
+ if (ConnectFailTimer != null)
+ {
+ ConnectFailTimer.Stop();
+ ConnectFailTimer.Dispose();
+ ConnectFailTimer = null;
}
+ }
- /// ff
- /// Called from Connect failure or Socket Status change if
- /// auto reconnect and socket disconnected (Not disconnected by user)
- ///
- void CheckClosedAndTryReconnect()
+ /// ff
+ /// Called from Connect failure or Socket Status change if
+ /// auto reconnect and socket disconnected (Not disconnected by user)
+ ///
+ void CheckClosedAndTryReconnect()
+ {
+ if (Client != null)
{
- if (Client != null)
- {
- Debug.Console(2, this, "Cleaning up remotely closed/failed connection.");
- Cleanup();
- }
- if (!DisconnectCalledByUser && AutoReconnect)
+ Debug.Console(2, this, "Cleaning up remotely closed/failed connection.");
+ Cleanup();
+ }
+ if (!DisconnectCalledByUser && AutoReconnect)
+ {
+ var halfInterval = AutoReconnectIntervalMs / 2;
+ var rndTime = new Random().Next(-halfInterval, halfInterval) + AutoReconnectIntervalMs;
+ Debug.Console(2, this, "Attempting reconnect in {0} ms, randomized", rndTime);
+ if (RetryTimer != null)
{
- var halfInterval = AutoReconnectIntervalMs / 2;
- var rndTime = new Random().Next(-halfInterval, halfInterval) + AutoReconnectIntervalMs;
- Debug.Console(2, this, "Attempting reconnect in {0} ms, randomized", rndTime);
- if (RetryTimer != null)
- {
- RetryTimer.Stop();
- RetryTimer = null;
- }
- if(AutoReconnectTriggered != null)
- AutoReconnectTriggered(this, new EventArgs());
- RetryTimer = new CTimer(o => Connect(), rndTime);
+ RetryTimer.Stop();
+ RetryTimer = null;
}
+ if(AutoReconnectTriggered != null)
+ AutoReconnectTriggered(this, new EventArgs());
+ RetryTimer = new CTimer(o => Connect(), rndTime);
}
+ }
- ///
- /// Receive callback
- ///
- ///
- ///
- void Receive(SecureTCPClient client, int numBytes)
+ ///
+ /// Receive callback
+ ///
+ ///
+ ///
+ void Receive(SecureTCPClient client, int numBytes)
+ {
+ if (numBytes > 0)
{
- if (numBytes > 0)
+ string str = string.Empty;
+ var handler = TextReceivedQueueInvoke;
+ try
{
- string str = string.Empty;
- var handler = TextReceivedQueueInvoke;
- try
+ var bytes = client.IncomingDataBuffer.Take(numBytes).ToArray();
+ str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
+ Debug.Console(2, this, "Client Received:\r--------\r{0}\r--------", str);
+ if (!string.IsNullOrEmpty(checkHeartbeat(str)))
{
- var bytes = client.IncomingDataBuffer.Take(numBytes).ToArray();
- str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
- Debug.Console(2, this, "Client Received:\r--------\r{0}\r--------", str);
- if (!string.IsNullOrEmpty(checkHeartbeat(str)))
- {
- if (SharedKeyRequired && str == "SharedKey:")
- {
- Debug.Console(2, this, "Server asking for shared key, sending");
- SendText(SharedKey + "\n");
- }
- else if (SharedKeyRequired && str == "Shared Key Match")
- {
- StopWaitForSharedKeyTimer();
+ if (SharedKeyRequired && str == "SharedKey:")
+ {
+ Debug.Console(2, this, "Server asking for shared key, sending");
+ SendText(SharedKey + "\n");
+ }
+ else if (SharedKeyRequired && str == "Shared Key Match")
+ {
+ StopWaitForSharedKeyTimer();
- Debug.Console(2, this, "Shared key confirmed. Ready for communication");
- OnClientReadyForcommunications(true); // Successful key exchange
- }
- else
+ Debug.Console(2, this, "Shared key confirmed. Ready for communication");
+ OnClientReadyForcommunications(true); // Successful key exchange
+ }
+ else
+ {
+ //var bytesHandler = BytesReceived;
+ //if (bytesHandler != null)
+ // bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
+ var textHandler = TextReceived;
+ if (textHandler != null)
+ textHandler(this, new GenericTcpServerCommMethodReceiveTextArgs(str));
+ if (handler != null)
{
- //var bytesHandler = BytesReceived;
- //if (bytesHandler != null)
- // bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
- var textHandler = TextReceived;
- if (textHandler != null)
- textHandler(this, new GenericTcpServerCommMethodReceiveTextArgs(str));
- if (handler != null)
- {
- MessageQueue.TryToEnqueue(new GenericTcpServerCommMethodReceiveTextArgs(str));
- }
+ MessageQueue.TryToEnqueue(new GenericTcpServerCommMethodReceiveTextArgs(str));
}
}
}
- catch (Exception ex)
- {
- Debug.Console(1, this, "Error receiving data: {1}. Error: {0}", ex.Message, str);
- }
- if (client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
- client.ReceiveDataAsync(Receive);
-
- //Check to see if there is a subscription to the TextReceivedQueueInvoke event. If there is start the dequeue thread.
- if (handler != null)
- {
- var gotLock = DequeueLock.TryEnter();
- if (gotLock)
- CrestronInvoke.BeginInvoke((o) => DequeueEvent());
- }
}
- else //JAG added this as I believe the error return is 0 bytes like the server. See help when hover on ReceiveAsync
+ catch (Exception ex)
{
- client.DisconnectFromServer();
+ Debug.Console(1, this, "Error receiving data: {1}. Error: {0}", ex.Message, str);
}
- }
+ if (client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ client.ReceiveDataAsync(Receive);
- ///
- /// This method gets spooled up in its own thread an protected by a CCriticalSection to prevent multiple threads from running concurrently.
- /// It will dequeue items as they are enqueued automatically.
- ///
- void DequeueEvent()
- {
- try
- {
- while (true)
- {
- // Pull from Queue and fire an event. Block indefinitely until an item can be removed, similar to a Gather.
- var message = MessageQueue.Dequeue();
- var handler = TextReceivedQueueInvoke;
- if (handler != null)
- {
- handler(this, message);
- }
- }
- }
- catch (Exception e)
- {
- this.LogException(e, "DequeueEvent error");
- }
- // Make sure to leave the CCritical section in case an exception above stops this thread, or we won't be able to restart it.
- if (DequeueLock != null)
+ //Check to see if there is a subscription to the TextReceivedQueueInvoke event. If there is start the dequeue thread.
+ if (handler != null)
{
- DequeueLock.Leave();
+ var gotLock = DequeueLock.TryEnter();
+ if (gotLock)
+ CrestronInvoke.BeginInvoke((o) => DequeueEvent());
}
}
+ else //JAG added this as I believe the error return is 0 bytes like the server. See help when hover on ReceiveAsync
+ {
+ client.DisconnectFromServer();
+ }
+ }
- void HeartbeatStart()
+ ///
+ /// This method gets spooled up in its own thread an protected by a CCriticalSection to prevent multiple threads from running concurrently.
+ /// It will dequeue items as they are enqueued automatically.
+ ///
+ void DequeueEvent()
+ {
+ try
{
- if (HeartbeatEnabled)
+ while (true)
{
- Debug.Console(2, this, "Starting Heartbeat");
- if (HeartbeatSendTimer == null)
- {
-
- HeartbeatSendTimer = new CTimer(this.SendHeartbeat, null, HeartbeatInterval, HeartbeatInterval);
- }
- if (HeartbeatAckTimer == null)
+ // Pull from Queue and fire an event. Block indefinitely until an item can be removed, similar to a Gather.
+ var message = MessageQueue.Dequeue();
+ var handler = TextReceivedQueueInvoke;
+ if (handler != null)
{
- HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
+ handler(this, message);
}
}
-
}
- void HeartbeatStop()
+ catch (Exception e)
+ {
+ this.LogException(e, "DequeueEvent error");
+ }
+ // Make sure to leave the CCritical section in case an exception above stops this thread, or we won't be able to restart it.
+ if (DequeueLock != null)
{
+ DequeueLock.Leave();
+ }
+ }
- if (HeartbeatSendTimer != null)
+ void HeartbeatStart()
+ {
+ if (HeartbeatEnabled)
+ {
+ Debug.Console(2, this, "Starting Heartbeat");
+ if (HeartbeatSendTimer == null)
{
- Debug.Console(2, this, "Stoping Heartbeat Send");
- HeartbeatSendTimer.Stop();
- HeartbeatSendTimer = null;
+
+ HeartbeatSendTimer = new CTimer(this.SendHeartbeat, null, HeartbeatInterval, HeartbeatInterval);
}
- if (HeartbeatAckTimer != null)
+ if (HeartbeatAckTimer == null)
{
- Debug.Console(2, this, "Stoping Heartbeat Ack");
- HeartbeatAckTimer.Stop();
- HeartbeatAckTimer = null;
+ HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
}
+ }
+ }
+ void HeartbeatStop()
+ {
+
+ if (HeartbeatSendTimer != null)
+ {
+ Debug.Console(2, this, "Stoping Heartbeat Send");
+ HeartbeatSendTimer.Stop();
+ HeartbeatSendTimer = null;
}
- void SendHeartbeat(object notused)
+ if (HeartbeatAckTimer != null)
{
- this.SendText(HeartbeatString);
- Debug.Console(2, this, "Sending Heartbeat");
-
+ Debug.Console(2, this, "Stoping Heartbeat Ack");
+ HeartbeatAckTimer.Stop();
+ HeartbeatAckTimer = null;
}
- //private method to check heartbeat requirements and start or reset timer
- string checkHeartbeat(string received)
+ }
+ void SendHeartbeat(object notused)
+ {
+ this.SendText(HeartbeatString);
+ Debug.Console(2, this, "Sending Heartbeat");
+
+ }
+
+ //private method to check heartbeat requirements and start or reset timer
+ string checkHeartbeat(string received)
+ {
+ try
{
- try
+ if (HeartbeatEnabled)
{
- if (HeartbeatEnabled)
+ if (!string.IsNullOrEmpty(HeartbeatString))
{
- if (!string.IsNullOrEmpty(HeartbeatString))
+ var remainingText = received.Replace(HeartbeatString, "");
+ var noDelimiter = received.Trim(new char[] { '\r', '\n' });
+ if (noDelimiter.Contains(HeartbeatString))
{
- var remainingText = received.Replace(HeartbeatString, "");
- var noDelimiter = received.Trim(new char[] { '\r', '\n' });
- if (noDelimiter.Contains(HeartbeatString))
+ if (HeartbeatAckTimer != null)
{
- if (HeartbeatAckTimer != null)
- {
- HeartbeatAckTimer.Reset(HeartbeatInterval * 2);
- }
- else
- {
- HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
- }
- Debug.Console(2, this, "Heartbeat Received: {0}, from Server", HeartbeatString);
- return remainingText;
+ HeartbeatAckTimer.Reset(HeartbeatInterval * 2);
}
+ else
+ {
+ HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
+ }
+ Debug.Console(2, this, "Heartbeat Received: {0}, from Server", HeartbeatString);
+ return remainingText;
}
}
}
- catch (Exception ex)
- {
- Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
- }
- return received;
}
+ catch (Exception ex)
+ {
+ Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
+ }
+ return received;
+ }
- void HeartbeatAckTimerFail(object o)
+ void HeartbeatAckTimerFail(object o)
+ {
+ try
{
- try
- {
- if (IsConnected)
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "Heartbeat not received from Server...DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE");
- SendText("Heartbeat not received by server, closing connection");
- CheckClosedAndTryReconnect();
- }
-
- }
- catch (Exception ex)
+ if (IsConnected)
{
- ErrorLog.Error("Heartbeat timeout Error on Client: {0}, {1}", Key, ex);
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "Heartbeat not received from Server...DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE");
+ SendText("Heartbeat not received by server, closing connection");
+ CheckClosedAndTryReconnect();
}
+
}
+ catch (Exception ex)
+ {
+ ErrorLog.Error("Heartbeat timeout Error on Client: {0}, {1}", Key, ex);
+ }
+ }
- ///
- ///
- ///
- void StopWaitForSharedKeyTimer()
+ ///
+ ///
+ ///
+ void StopWaitForSharedKeyTimer()
+ {
+ if (WaitForSharedKey != null)
{
- if (WaitForSharedKey != null)
- {
- WaitForSharedKey.Stop();
- WaitForSharedKey = null;
- }
+ WaitForSharedKey.Stop();
+ WaitForSharedKey = null;
}
+ }
- ///
- /// General send method
- ///
- public void SendText(string text)
+ ///
+ /// General send method
+ ///
+ public void SendText(string text)
+ {
+ if (!string.IsNullOrEmpty(text))
{
- if (!string.IsNullOrEmpty(text))
+ try
{
- try
+ var bytes = Encoding.GetEncoding(28591).GetBytes(text);
+ if (Client != null && Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
{
- var bytes = Encoding.GetEncoding(28591).GetBytes(text);
- if (Client != null && Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ Client.SendDataAsync(bytes, bytes.Length, (c, n) =>
{
- Client.SendDataAsync(bytes, bytes.Length, (c, n) =>
+ // HOW IN THE HELL DO WE CATCH AN EXCEPTION IN SENDING?????
+ if (n <= 0)
{
- // HOW IN THE HELL DO WE CATCH AN EXCEPTION IN SENDING?????
- if (n <= 0)
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "[{0}] Sent zero bytes. Was there an error?", this.Key);
- }
- });
- }
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, "Error sending text: {1}. Error: {0}", ex.Message, text);
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "[{0}] Sent zero bytes. Was there an error?", this.Key);
+ }
+ });
}
}
- }
-
- ///
- ///
- ///
- public void SendBytes(byte[] bytes)
- {
- if (bytes.Length > 0)
+ catch (Exception ex)
{
- try
- {
- if (Client != null && Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
- Client.SendData(bytes, bytes.Length);
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, "Error sending bytes. Error: {0}", ex.Message);
- }
+ Debug.Console(0, this, "Error sending text: {1}. Error: {0}", ex.Message, text);
}
}
+ }
- ///
- /// SocketStatusChange Callback
- ///
- ///
- ///
- void Client_SocketStatusChange(SecureTCPClient client, SocketStatus clientSocketStatus)
+ ///
+ ///
+ ///
+ public void SendBytes(byte[] bytes)
+ {
+ if (bytes.Length > 0)
{
- if (ProgramIsStopping)
- {
- ProgramIsStopping = false;
- return;
- }
try
{
- Debug.Console(2, this, "Socket status change: {0} ({1})", client.ClientStatus, (ushort)(client.ClientStatus));
-
- OnConnectionChange();
- // The client could be null or disposed by this time...
- if (Client == null || Client.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- HeartbeatStop();
- OnClientReadyForcommunications(false); // socket has gone low
- CheckClosedAndTryReconnect();
- }
+ if (Client != null && Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ Client.SendData(bytes, bytes.Length);
}
catch (Exception ex)
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Error in socket status change callback. Error: {0}\r\r{1}", ex, ex.InnerException);
+ Debug.Console(0, this, "Error sending bytes. Error: {0}", ex.Message);
}
}
+ }
- ///
- /// Helper for ConnectionChange event
- ///
- void OnConnectionChange()
+ ///
+ /// SocketStatusChange Callback
+ ///
+ ///
+ ///
+ void Client_SocketStatusChange(SecureTCPClient client, SocketStatus clientSocketStatus)
+ {
+ if (ProgramIsStopping)
{
- var handler = ConnectionChange;
- if (handler != null)
- ConnectionChange(this, new GenericTcpServerSocketStatusChangeEventArgs(this, Client.ClientStatus));
+ ProgramIsStopping = false;
+ return;
}
+ try
+ {
+ Debug.Console(2, this, "Socket status change: {0} ({1})", client.ClientStatus, (ushort)(client.ClientStatus));
- ///
- /// Helper to fire ClientReadyForCommunications event
- ///
- void OnClientReadyForcommunications(bool isReady)
+ OnConnectionChange();
+ // The client could be null or disposed by this time...
+ if (Client == null || Client.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
+ {
+ HeartbeatStop();
+ OnClientReadyForcommunications(false); // socket has gone low
+ CheckClosedAndTryReconnect();
+ }
+ }
+ catch (Exception ex)
{
- IsReadyForCommunication = isReady;
- if (this.IsReadyForCommunication) { HeartbeatStart(); }
- var handler = ClientReadyForCommunications;
- if (handler != null)
- handler(this, new GenericTcpServerClientReadyForcommunicationsEventArgs(IsReadyForCommunication));
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Error in socket status change callback. Error: {0}\r\r{1}", ex, ex.InnerException);
}
- #endregion
}
+ ///
+ /// Helper for ConnectionChange event
+ ///
+ void OnConnectionChange()
+ {
+ var handler = ConnectionChange;
+ if (handler != null)
+ ConnectionChange(this, new GenericTcpServerSocketStatusChangeEventArgs(this, Client.ClientStatus));
+ }
+
+ ///
+ /// Helper to fire ClientReadyForCommunications event
+ ///
+ void OnClientReadyForcommunications(bool isReady)
+ {
+ IsReadyForCommunication = isReady;
+ if (this.IsReadyForCommunication) { HeartbeatStart(); }
+ var handler = ClientReadyForCommunications;
+ if (handler != null)
+ handler(this, new GenericTcpServerClientReadyForcommunicationsEventArgs(IsReadyForCommunication));
+ }
+ #endregion
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/GenericSecureTcpIpServer.cs b/src/PepperDash.Core/Comm/GenericSecureTcpIpServer.cs
index e0da068f9..7804369c8 100644
--- a/src/PepperDash.Core/Comm/GenericSecureTcpIpServer.cs
+++ b/src/PepperDash.Core/Comm/GenericSecureTcpIpServer.cs
@@ -17,403 +17,403 @@ PepperDash Technology Corporation reserves all rights under applicable laws.
using Crestron.SimplSharp.CrestronSockets;
using PepperDash.Core.Logging;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Generic secure TCP/IP server
+///
+public class GenericSecureTcpIpServer : Device
{
+ #region Events
///
- /// Generic secure TCP/IP server
+ /// Event for Receiving text
///
- public class GenericSecureTcpIpServer : Device
- {
- #region Events
- ///
- /// Event for Receiving text
- ///
- public event EventHandler TextReceived;
-
- ///
- /// Event for Receiving text. Once subscribed to this event the receive callback will start a thread that dequeues the messages and invokes the event on a new thread.
- /// It is not recommended to use both the TextReceived event and the TextReceivedQueueInvoke event.
- ///
- public event EventHandler TextReceivedQueueInvoke;
-
- ///
- /// Event for client connection socket status change
- ///
- public event EventHandler ClientConnectionChange;
-
- ///
- /// Event for Server State Change
- ///
- public event EventHandler ServerStateChange;
-
- ///
- /// For a server with a pre shared key, this will fire after the communication is established and the key exchange is complete. If no shared key, this will fire
- /// after connection is successful. Use this event to know when the client is ready for communication to avoid stepping on shared key.
- ///
- public event EventHandler ServerClientReadyForCommunications;
-
- ///
- /// A band aid event to notify user that the server has choked.
- ///
- public ServerHasChokedCallbackDelegate ServerHasChoked { get; set; }
-
- ///
- ///
- ///
- public delegate void ServerHasChokedCallbackDelegate();
-
- #endregion
-
- #region Properties/Variables
-
- ///
- /// Server listen lock
- ///
- CCriticalSection ServerCCSection = new CCriticalSection();
-
- ///
- /// Queue lock
- ///
- CCriticalSection DequeueLock = new CCriticalSection();
-
- ///
- /// Receive Queue size. Defaults to 20. Will set to 20 if QueueSize property is less than 20. Use constructor or set queue size property before
- /// calling initialize.
- ///
- public int ReceiveQueueSize { get; set; }
-
- ///
- /// Queue to temporarily store received messages with the source IP and Port info. Defaults to size 20. Use constructor or set queue size property before
- /// calling initialize.
- ///
- private CrestronQueue MessageQueue;
-
- ///
- /// A bandaid client that monitors whether the server is reachable
- ///
- GenericSecureTcpIpClient_ForServer MonitorClient;
-
- ///
- /// Timer to operate the bandaid monitor client in a loop.
- ///
- CTimer MonitorClientTimer;
-
- ///
- ///
- ///
- int MonitorClientFailureCount;
-
- ///
- /// 3 by default
- ///
- public int MonitorClientMaxFailureCount { get; set; }
-
- ///
- /// Text representation of the Socket Status enum values for the server
- ///
- public string Status
- {
- get
- {
- if (SecureServer != null)
- return SecureServer.State.ToString();
- return ServerState.SERVER_NOT_LISTENING.ToString();
+ public event EventHandler TextReceived;
- }
+ ///
+ /// Event for Receiving text. Once subscribed to this event the receive callback will start a thread that dequeues the messages and invokes the event on a new thread.
+ /// It is not recommended to use both the TextReceived event and the TextReceivedQueueInvoke event.
+ ///
+ public event EventHandler TextReceivedQueueInvoke;
- }
+ ///
+ /// Event for client connection socket status change
+ ///
+ public event EventHandler ClientConnectionChange;
- ///
- /// Bool showing if socket is connected
- ///
- public bool IsConnected
- {
- get
- {
- if (SecureServer != null)
- return (SecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED;
- return false;
+ ///
+ /// Event for Server State Change
+ ///
+ public event EventHandler ServerStateChange;
- //return (Secure ? SecureServer != null : UnsecureServer != null) &&
- //(Secure ? (SecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED :
- // (UnsecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED);
- }
- }
+ ///
+ /// For a server with a pre shared key, this will fire after the communication is established and the key exchange is complete. If no shared key, this will fire
+ /// after connection is successful. Use this event to know when the client is ready for communication to avoid stepping on shared key.
+ ///
+ public event EventHandler ServerClientReadyForCommunications;
+
+ ///
+ /// A band aid event to notify user that the server has choked.
+ ///
+ public ServerHasChokedCallbackDelegate ServerHasChoked { get; set; }
+
+ ///
+ ///
+ ///
+ public delegate void ServerHasChokedCallbackDelegate();
+
+ #endregion
+
+ #region Properties/Variables
+
+ ///
+ /// Server listen lock
+ ///
+ CCriticalSection ServerCCSection = new CCriticalSection();
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsConnected
+ ///
+ /// Queue lock
+ ///
+ CCriticalSection DequeueLock = new CCriticalSection();
+
+ ///
+ /// Receive Queue size. Defaults to 20. Will set to 20 if QueueSize property is less than 20. Use constructor or set queue size property before
+ /// calling initialize.
+ ///
+ public int ReceiveQueueSize { get; set; }
+
+ ///
+ /// Queue to temporarily store received messages with the source IP and Port info. Defaults to size 20. Use constructor or set queue size property before
+ /// calling initialize.
+ ///
+ private CrestronQueue MessageQueue;
+
+ ///
+ /// A bandaid client that monitors whether the server is reachable
+ ///
+ GenericSecureTcpIpClient_ForServer MonitorClient;
+
+ ///
+ /// Timer to operate the bandaid monitor client in a loop.
+ ///
+ CTimer MonitorClientTimer;
+
+ ///
+ ///
+ ///
+ int MonitorClientFailureCount;
+
+ ///
+ /// 3 by default
+ ///
+ public int MonitorClientMaxFailureCount { get; set; }
+
+ ///
+ /// Text representation of the Socket Status enum values for the server
+ ///
+ public string Status
+ {
+ get
{
- get { return (ushort)(IsConnected ? 1 : 0); }
+ if (SecureServer != null)
+ return SecureServer.State.ToString();
+ return ServerState.SERVER_NOT_LISTENING.ToString();
+
}
- ///
- /// Bool showing if socket is connected
- ///
- public bool IsListening
+ }
+
+ ///
+ /// Bool showing if socket is connected
+ ///
+ public bool IsConnected
+ {
+ get
{
- get
- {
- if (SecureServer != null)
- return (SecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING;
- else
- return false;
- //return (Secure ? SecureServer != null : UnsecureServer != null) &&
- //(Secure ? (SecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING :
- // (UnsecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING);
- }
+ if (SecureServer != null)
+ return (SecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED;
+ return false;
+
+ //return (Secure ? SecureServer != null : UnsecureServer != null) &&
+ //(Secure ? (SecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED :
+ // (UnsecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED);
}
+ }
+
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsConnected
+ {
+ get { return (ushort)(IsConnected ? 1 : 0); }
+ }
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsListening
+ ///
+ /// Bool showing if socket is connected
+ ///
+ public bool IsListening
+ {
+ get
{
- get { return (ushort)(IsListening ? 1 : 0); }
+ if (SecureServer != null)
+ return (SecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING;
+ else
+ return false;
+ //return (Secure ? SecureServer != null : UnsecureServer != null) &&
+ //(Secure ? (SecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING :
+ // (UnsecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING);
}
- ///
- /// Max number of clients this server will allow for connection. Crestron max is 64. This number should be less than 65
- ///
- public ushort MaxClients { get; set; } // should be set by parameter in SIMPL+ in the MAIN method, Should not ever need to be configurable
- ///
- /// Number of clients currently connected.
- ///
- public ushort NumberOfClientsConnected
+ }
+
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsListening
+ {
+ get { return (ushort)(IsListening ? 1 : 0); }
+ }
+ ///
+ /// Max number of clients this server will allow for connection. Crestron max is 64. This number should be less than 65
+ ///
+ public ushort MaxClients { get; set; } // should be set by parameter in SIMPL+ in the MAIN method, Should not ever need to be configurable
+ ///
+ /// Number of clients currently connected.
+ ///
+ public ushort NumberOfClientsConnected
+ {
+ get
{
- get
- {
- if (SecureServer != null)
- return (ushort)SecureServer.NumberOfClientsConnected;
- return 0;
- }
+ if (SecureServer != null)
+ return (ushort)SecureServer.NumberOfClientsConnected;
+ return 0;
}
+ }
+
+ ///
+ /// Port Server should listen on
+ ///
+ public int Port { get; set; }
+
+ ///
+ /// S+ helper for Port
+ ///
+ public ushort UPort
+ {
+ get { return Convert.ToUInt16(Port); }
+ set { Port = Convert.ToInt32(value); }
+ }
- ///
- /// Port Server should listen on
- ///
- public int Port { get; set; }
+ ///
+ /// Bool to show whether the server requires a preshared key. Must be set the same in the client, and if true shared keys must be identical on server/client
+ ///
+ public bool SharedKeyRequired { get; set; }
- ///
- /// S+ helper for Port
- ///
- public ushort UPort
+ ///
+ /// S+ helper for requires shared key bool
+ ///
+ public ushort USharedKeyRequired
+ {
+ set
{
- get { return Convert.ToUInt16(Port); }
- set { Port = Convert.ToInt32(value); }
+ if (value == 1)
+ SharedKeyRequired = true;
+ else
+ SharedKeyRequired = false;
}
+ }
- ///
- /// Bool to show whether the server requires a preshared key. Must be set the same in the client, and if true shared keys must be identical on server/client
- ///
- public bool SharedKeyRequired { get; set; }
+ ///
+ /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module.
+ /// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called
+ ///
+ public string SharedKey { get; set; }
- ///
- /// S+ helper for requires shared key bool
- ///
- public ushort USharedKeyRequired
- {
- set
- {
- if (value == 1)
- SharedKeyRequired = true;
- else
- SharedKeyRequired = false;
- }
- }
+ ///
+ /// Heartbeat Required bool sets whether server disconnects client if heartbeat is not received
+ ///
+ public bool HeartbeatRequired { get; set; }
- ///
- /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module.
- /// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called
- ///
- public string SharedKey { get; set; }
-
- ///
- /// Heartbeat Required bool sets whether server disconnects client if heartbeat is not received
- ///
- public bool HeartbeatRequired { get; set; }
-
- ///
- /// S+ Helper for Heartbeat Required
- ///
- public ushort UHeartbeatRequired
+ ///
+ /// S+ Helper for Heartbeat Required
+ ///
+ public ushort UHeartbeatRequired
+ {
+ set
{
- set
- {
- if (value == 1)
- HeartbeatRequired = true;
- else
- HeartbeatRequired = false;
- }
+ if (value == 1)
+ HeartbeatRequired = true;
+ else
+ HeartbeatRequired = false;
}
+ }
- ///
- /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+
- ///
- public int HeartbeatRequiredIntervalMs { get; set; }
+ ///
+ /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+
+ ///
+ public int HeartbeatRequiredIntervalMs { get; set; }
- ///
- /// Simpl+ Heartbeat Analog value in seconds
- ///
- public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } }
+ ///
+ /// Simpl+ Heartbeat Analog value in seconds
+ ///
+ public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } }
- ///
- /// String to Match for heartbeat. If null or empty any string will reset heartbeat timer
- ///
- public string HeartbeatStringToMatch { get; set; }
+ ///
+ /// String to Match for heartbeat. If null or empty any string will reset heartbeat timer
+ ///
+ public string HeartbeatStringToMatch { get; set; }
- //private timers for Heartbeats per client
- Dictionary HeartbeatTimerDictionary = new Dictionary();
+ //private timers for Heartbeats per client
+ Dictionary HeartbeatTimerDictionary = new Dictionary();
- //flags to show the secure server is waiting for client at index to send the shared key
- List WaitingForSharedKey = new List();
+ //flags to show the secure server is waiting for client at index to send the shared key
+ List WaitingForSharedKey = new List();
- List ClientReadyAfterKeyExchange = new List();
+ List ClientReadyAfterKeyExchange = new List();
- ///
- /// The connected client indexes
- ///
- public List ConnectedClientsIndexes = new List();
+ ///
+ /// The connected client indexes
+ ///
+ public List ConnectedClientsIndexes = new List();
- ///
- /// Defaults to 2000
- ///
- public int BufferSize { get; set; }
+ ///
+ /// Defaults to 2000
+ ///
+ public int BufferSize { get; set; }
- ///
- /// Private flag to note that the server has stopped intentionally
- ///
- private bool ServerStopped { get; set; }
+ ///
+ /// Private flag to note that the server has stopped intentionally
+ ///
+ private bool ServerStopped { get; set; }
- //Servers
- SecureTCPServer SecureServer;
+ //Servers
+ SecureTCPServer SecureServer;
- ///
- ///
- ///
- bool ProgramIsStopping;
+ ///
+ ///
+ ///
+ bool ProgramIsStopping;
- #endregion
+ #endregion
- #region Constructors
- ///
- /// constructor S+ Does not accept a key. Use initialze with key to set the debug key on this device. If using with + make sure to set all properties manually.
- ///
- public GenericSecureTcpIpServer()
- : base("Uninitialized Secure TCP Server")
- {
- HeartbeatRequiredIntervalInSeconds = 15;
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- BufferSize = 2000;
- MonitorClientMaxFailureCount = 3;
- }
+ #region Constructors
+ ///
+ /// constructor S+ Does not accept a key. Use initialze with key to set the debug key on this device. If using with + make sure to set all properties manually.
+ ///
+ public GenericSecureTcpIpServer()
+ : base("Uninitialized Secure TCP Server")
+ {
+ HeartbeatRequiredIntervalInSeconds = 15;
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ BufferSize = 2000;
+ MonitorClientMaxFailureCount = 3;
+ }
- ///
- /// constructor with debug key set at instantiation. Make sure to set all properties before listening.
- ///
- ///
- public GenericSecureTcpIpServer(string key)
- : base("Uninitialized Secure TCP Server")
- {
- HeartbeatRequiredIntervalInSeconds = 15;
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- BufferSize = 2000;
- MonitorClientMaxFailureCount = 3;
- Key = key;
- }
+ ///
+ /// constructor with debug key set at instantiation. Make sure to set all properties before listening.
+ ///
+ ///
+ public GenericSecureTcpIpServer(string key)
+ : base("Uninitialized Secure TCP Server")
+ {
+ HeartbeatRequiredIntervalInSeconds = 15;
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ BufferSize = 2000;
+ MonitorClientMaxFailureCount = 3;
+ Key = key;
+ }
- ///
- /// Contstructor that sets all properties by calling the initialize method with a config object. This does set Queue size.
- ///
- ///
- public GenericSecureTcpIpServer(TcpServerConfigObject serverConfigObject)
- : base("Uninitialized Secure TCP Server")
- {
- HeartbeatRequiredIntervalInSeconds = 15;
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- BufferSize = 2000;
- MonitorClientMaxFailureCount = 3;
- Initialize(serverConfigObject);
- }
- #endregion
+ ///
+ /// Contstructor that sets all properties by calling the initialize method with a config object. This does set Queue size.
+ ///
+ ///
+ public GenericSecureTcpIpServer(TcpServerConfigObject serverConfigObject)
+ : base("Uninitialized Secure TCP Server")
+ {
+ HeartbeatRequiredIntervalInSeconds = 15;
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ BufferSize = 2000;
+ MonitorClientMaxFailureCount = 3;
+ Initialize(serverConfigObject);
+ }
+ #endregion
- #region Methods - Server Actions
- ///
- /// Disconnects all clients and stops the server
- ///
- public void KillServer()
+ #region Methods - Server Actions
+ ///
+ /// Disconnects all clients and stops the server
+ ///
+ public void KillServer()
+ {
+ ServerStopped = true;
+ if (MonitorClient != null)
{
- ServerStopped = true;
- if (MonitorClient != null)
- {
- MonitorClient.Disconnect();
- }
- DisconnectAllClientsForShutdown();
- StopListening();
+ MonitorClient.Disconnect();
}
+ DisconnectAllClientsForShutdown();
+ StopListening();
+ }
- ///
- /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+
- ///
- ///
- public void Initialize(string key)
- {
- Key = key;
- }
+ ///
+ /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+
+ ///
+ ///
+ public void Initialize(string key)
+ {
+ Key = key;
+ }
- ///
- /// Initialze the server
- ///
- ///
- public void Initialize(TcpServerConfigObject serverConfigObject)
+ ///
+ /// Initialze the server
+ ///
+ ///
+ public void Initialize(TcpServerConfigObject serverConfigObject)
+ {
+ try
{
- try
+ if (serverConfigObject != null || string.IsNullOrEmpty(serverConfigObject.Key))
{
- if (serverConfigObject != null || string.IsNullOrEmpty(serverConfigObject.Key))
- {
- Key = serverConfigObject.Key;
- MaxClients = serverConfigObject.MaxClients;
- Port = serverConfigObject.Port;
- SharedKeyRequired = serverConfigObject.SharedKeyRequired;
- SharedKey = serverConfigObject.SharedKey;
- HeartbeatRequired = serverConfigObject.HeartbeatRequired;
- HeartbeatRequiredIntervalInSeconds = serverConfigObject.HeartbeatRequiredIntervalInSeconds;
- HeartbeatStringToMatch = serverConfigObject.HeartbeatStringToMatch;
- BufferSize = serverConfigObject.BufferSize;
- ReceiveQueueSize = serverConfigObject.ReceiveQueueSize > 20 ? serverConfigObject.ReceiveQueueSize : 20;
- MessageQueue = new CrestronQueue(ReceiveQueueSize);
- }
- else
- {
- ErrorLog.Error("Could not initialize server with key: {0}", serverConfigObject.Key);
- }
+ Key = serverConfigObject.Key;
+ MaxClients = serverConfigObject.MaxClients;
+ Port = serverConfigObject.Port;
+ SharedKeyRequired = serverConfigObject.SharedKeyRequired;
+ SharedKey = serverConfigObject.SharedKey;
+ HeartbeatRequired = serverConfigObject.HeartbeatRequired;
+ HeartbeatRequiredIntervalInSeconds = serverConfigObject.HeartbeatRequiredIntervalInSeconds;
+ HeartbeatStringToMatch = serverConfigObject.HeartbeatStringToMatch;
+ BufferSize = serverConfigObject.BufferSize;
+ ReceiveQueueSize = serverConfigObject.ReceiveQueueSize > 20 ? serverConfigObject.ReceiveQueueSize : 20;
+ MessageQueue = new CrestronQueue(ReceiveQueueSize);
}
- catch
+ else
{
ErrorLog.Error("Could not initialize server with key: {0}", serverConfigObject.Key);
}
}
+ catch
+ {
+ ErrorLog.Error("Could not initialize server with key: {0}", serverConfigObject.Key);
+ }
+ }
- ///
- /// Start listening on the specified port
- ///
- public void Listen()
+ ///
+ /// Start listening on the specified port
+ ///
+ public void Listen()
+ {
+ ServerCCSection.Enter();
+ try
{
- ServerCCSection.Enter();
- try
+ if (Port < 1 || Port > 65535)
{
- if (Port < 1 || Port > 65535)
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Server '{0}': Invalid port", Key);
- ErrorLog.Warn(string.Format("Server '{0}': Invalid port", Key));
- return;
- }
- if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Server '{0}': No Shared Key set", Key);
- ErrorLog.Warn(string.Format("Server '{0}': No Shared Key set", Key));
- return;
- }
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Server '{0}': Invalid port", Key);
+ ErrorLog.Warn(string.Format("Server '{0}': Invalid port", Key));
+ return;
+ }
+ if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Server '{0}': No Shared Key set", Key);
+ ErrorLog.Warn(string.Format("Server '{0}': No Shared Key set", Key));
+ return;
+ }
if (SecureServer == null)
@@ -444,19 +444,19 @@ public void Listen()
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Secure Server Status: {0}, Socket Status: {1}", SecureServer.State, SecureServer.ServerSocketStatus);
ServerCCSection.Leave();
- }
- catch (Exception ex)
- {
- ServerCCSection.Leave();
- ErrorLog.Error("{1} Error with Dynamic Server: {0}", ex.ToString(), Key);
- }
}
-
- ///
- /// Stop Listeneing
- ///
- public void StopListening()
+ catch (Exception ex)
{
+ ServerCCSection.Leave();
+ ErrorLog.Error("{1} Error with Dynamic Server: {0}", ex.ToString(), Key);
+ }
+ }
+
+ ///
+ /// Stop Listeneing
+ ///
+ public void StopListening()
+ {
try
{
Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Stopping Listener");
@@ -472,144 +472,129 @@ public void StopListening()
{
Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error stopping server. Error: {0}", ex);
}
- }
+ }
- ///
- /// Disconnects Client
- ///
- ///
- public void DisconnectClient(uint client)
+ ///
+ /// Disconnects Client
+ ///
+ ///
+ public void DisconnectClient(uint client)
+ {
+ try
{
- try
- {
- SecureServer.Disconnect(client);
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected client index: {0}", client);
- }
- catch (Exception ex)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Disconnecting client index: {0}. Error: {1}", client, ex);
- }
+ SecureServer.Disconnect(client);
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected client index: {0}", client);
}
- ///
- /// Disconnect All Clients
- ///
- public void DisconnectAllClientsForShutdown()
+ catch (Exception ex)
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Disconnecting All Clients");
- if (SecureServer != null)
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Disconnecting client index: {0}. Error: {1}", client, ex);
+ }
+ }
+ ///
+ /// Disconnect All Clients
+ ///
+ public void DisconnectAllClientsForShutdown()
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Disconnecting All Clients");
+ if (SecureServer != null)
+ {
+ SecureServer.SocketStatusChange -= SecureServer_SocketStatusChange;
+ foreach (var index in ConnectedClientsIndexes.ToList()) // copy it here so that it iterates properly
{
- SecureServer.SocketStatusChange -= SecureServer_SocketStatusChange;
- foreach (var index in ConnectedClientsIndexes.ToList()) // copy it here so that it iterates properly
+ var i = index;
+ if (!SecureServer.ClientConnected(index))
+ continue;
+ try
{
- var i = index;
- if (!SecureServer.ClientConnected(index))
- continue;
- try
- {
- SecureServer.Disconnect(i);
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected client index: {0}", i);
- }
- catch (Exception ex)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Disconnecting client index: {0}. Error: {1}", i, ex);
- }
+ SecureServer.Disconnect(i);
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected client index: {0}", i);
+ }
+ catch (Exception ex)
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Disconnecting client index: {0}. Error: {1}", i, ex);
}
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Server Status: {0}", SecureServer.ServerSocketStatus);
}
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Server Status: {0}", SecureServer.ServerSocketStatus);
+ }
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected All Clients");
- ConnectedClientsIndexes.Clear();
-
- if (!ProgramIsStopping)
- {
- OnConnectionChange();
- OnServerStateChange(SecureServer.State); //State shows both listening and connected
- }
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected All Clients");
+ ConnectedClientsIndexes.Clear();
- // var o = new { };
+ if (!ProgramIsStopping)
+ {
+ OnConnectionChange();
+ OnServerStateChange(SecureServer.State); //State shows both listening and connected
}
- ///
- /// Broadcast text from server to all connected clients
- ///
- ///
- public void BroadcastText(string text)
+ // var o = new { };
+ }
+
+ ///
+ /// Broadcast text from server to all connected clients
+ ///
+ ///
+ public void BroadcastText(string text)
+ {
+ CCriticalSection CCBroadcast = new CCriticalSection();
+ CCBroadcast.Enter();
+ try
{
- CCriticalSection CCBroadcast = new CCriticalSection();
- CCBroadcast.Enter();
- try
+ if (ConnectedClientsIndexes.Count > 0)
{
- if (ConnectedClientsIndexes.Count > 0)
+ byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
+ foreach (uint i in ConnectedClientsIndexes)
{
- byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
- foreach (uint i in ConnectedClientsIndexes)
+ if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(i)))
{
- if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(i)))
- {
- SocketErrorCodes error = SecureServer.SendDataAsync(i, b, b.Length, (x, y, z) => { });
- if (error != SocketErrorCodes.SOCKET_OK && error != SocketErrorCodes.SOCKET_OPERATION_PENDING)
- this.LogVerbose("{error}", error);
- }
+ SocketErrorCodes error = SecureServer.SendDataAsync(i, b, b.Length, (x, y, z) => { });
+ if (error != SocketErrorCodes.SOCKET_OK && error != SocketErrorCodes.SOCKET_OPERATION_PENDING)
+ this.LogVerbose("{error}", error);
}
}
- CCBroadcast.Leave();
- }
- catch (Exception ex)
- {
- CCBroadcast.Leave();
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Broadcasting messages from server. Error: {0}", ex.Message);
}
+ CCBroadcast.Leave();
+ }
+ catch (Exception ex)
+ {
+ CCBroadcast.Leave();
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Broadcasting messages from server. Error: {0}", ex.Message);
}
+ }
- ///
- /// Not sure this is useful in library, maybe Pro??
- ///
- ///
- ///
- public void SendTextToClient(string text, uint clientIndex)
+ ///
+ /// Not sure this is useful in library, maybe Pro??
+ ///
+ ///
+ ///
+ public void SendTextToClient(string text, uint clientIndex)
+ {
+ try
{
- try
- {
- byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
- if (SecureServer != null && SecureServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(clientIndex)))
- SecureServer.SendDataAsync(clientIndex, b, b.Length, (x, y, z) => { });
- }
- }
- catch (Exception ex)
+ byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
+ if (SecureServer != null && SecureServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
{
- Debug.Console(2, this, "Error sending text to client. Text: {1}. Error: {0}", ex.Message, text);
+ if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(clientIndex)))
+ SecureServer.SendDataAsync(clientIndex, b, b.Length, (x, y, z) => { });
}
}
+ catch (Exception ex)
+ {
+ Debug.Console(2, this, "Error sending text to client. Text: {1}. Error: {0}", ex.Message, text);
+ }
+ }
- //private method to check heartbeat requirements and start or reset timer
- string checkHeartbeat(uint clientIndex, string received)
+ //private method to check heartbeat requirements and start or reset timer
+ string checkHeartbeat(uint clientIndex, string received)
+ {
+ try
{
- try
+ if (HeartbeatRequired)
{
- if (HeartbeatRequired)
+ if (!string.IsNullOrEmpty(HeartbeatStringToMatch))
{
- if (!string.IsNullOrEmpty(HeartbeatStringToMatch))
- {
- var remainingText = received.Replace(HeartbeatStringToMatch, "");
- var noDelimiter = received.Trim(new char[] { '\r', '\n' });
- if (noDelimiter.Contains(HeartbeatStringToMatch))
- {
- if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
- HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs);
- else
- {
- CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
- HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
- }
- Debug.Console(1, this, "Heartbeat Received: {0}, from client index: {1}", HeartbeatStringToMatch, clientIndex);
- // Return Heartbeat
- SendTextToClient(HeartbeatStringToMatch, clientIndex);
- return remainingText;
- }
- }
- else
+ var remainingText = received.Replace(HeartbeatStringToMatch, "");
+ var noDelimiter = received.Trim(new char[] { '\r', '\n' });
+ if (noDelimiter.Contains(HeartbeatStringToMatch))
{
if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs);
@@ -618,179 +603,194 @@ string checkHeartbeat(uint clientIndex, string received)
CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
}
- Debug.Console(1, this, "Heartbeat Received: {0}, from client index: {1}", received, clientIndex);
+ Debug.Console(1, this, "Heartbeat Received: {0}, from client index: {1}", HeartbeatStringToMatch, clientIndex);
+ // Return Heartbeat
+ SendTextToClient(HeartbeatStringToMatch, clientIndex);
+ return remainingText;
}
}
+ else
+ {
+ if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
+ HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs);
+ else
+ {
+ CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
+ HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
+ }
+ Debug.Console(1, this, "Heartbeat Received: {0}, from client index: {1}", received, clientIndex);
+ }
}
- catch (Exception ex)
- {
- Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
- }
- return received;
}
+ catch (Exception ex)
+ {
+ Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
+ }
+ return received;
+ }
- ///
- /// Get the IP Address for the client at the specifed index
- ///
- ///
- ///
- public string GetClientIPAddress(uint clientIndex)
+ ///
+ /// Get the IP Address for the client at the specifed index
+ ///
+ ///
+ ///
+ public string GetClientIPAddress(uint clientIndex)
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress Index: {0}", clientIndex);
+ if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(clientIndex)))
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress Index: {0}", clientIndex);
- if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(clientIndex)))
- {
- var ipa = this.SecureServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex);
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress IPAddreess: {0}", ipa);
- return ipa;
+ var ipa = this.SecureServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex);
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress IPAddreess: {0}", ipa);
+ return ipa;
- }
- else
- {
- return "";
- }
}
+ else
+ {
+ return "";
+ }
+ }
- #endregion
+ #endregion
- #region Methods - HeartbeatTimer Callback
+ #region Methods - HeartbeatTimer Callback
- void HeartbeatTimer_CallbackFunction(object o)
+ void HeartbeatTimer_CallbackFunction(object o)
+ {
+ uint clientIndex = 99999;
+ string address = string.Empty;
+ try
{
- uint clientIndex = 99999;
- string address = string.Empty;
- try
- {
- clientIndex = (uint)o;
- address = SecureServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex);
+ clientIndex = (uint)o;
+ address = SecureServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex);
- Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Heartbeat not received for Client index {2} IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE {1}",
- address, string.IsNullOrEmpty(HeartbeatStringToMatch) ? "" : ("HeartbeatStringToMatch: " + HeartbeatStringToMatch), clientIndex);
+ Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Heartbeat not received for Client index {2} IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE {1}",
+ address, string.IsNullOrEmpty(HeartbeatStringToMatch) ? "" : ("HeartbeatStringToMatch: " + HeartbeatStringToMatch), clientIndex);
- if (SecureServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
- SendTextToClient("Heartbeat not received by server, closing connection", clientIndex);
+ if (SecureServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
+ SendTextToClient("Heartbeat not received by server, closing connection", clientIndex);
- var discoResult = SecureServer.Disconnect(clientIndex);
- //Debug.Console(1, this, "{0}", discoResult);
+ var discoResult = SecureServer.Disconnect(clientIndex);
+ //Debug.Console(1, this, "{0}", discoResult);
- if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
- {
- HeartbeatTimerDictionary[clientIndex].Stop();
- HeartbeatTimerDictionary[clientIndex].Dispose();
- HeartbeatTimerDictionary.Remove(clientIndex);
- }
- }
- catch (Exception ex)
+ if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
{
- ErrorLog.Error("{3}: Heartbeat timeout Error on Client Index: {0}, at address: {1}, error: {2}", clientIndex, address, ex.Message, Key);
+ HeartbeatTimerDictionary[clientIndex].Stop();
+ HeartbeatTimerDictionary[clientIndex].Dispose();
+ HeartbeatTimerDictionary.Remove(clientIndex);
}
}
+ catch (Exception ex)
+ {
+ ErrorLog.Error("{3}: Heartbeat timeout Error on Client Index: {0}, at address: {1}, error: {2}", clientIndex, address, ex.Message, Key);
+ }
+ }
- #endregion
+ #endregion
- #region Methods - Socket Status Changed Callbacks
- ///
- /// Secure Server Socket Status Changed Callback
- ///
- ///
- ///
- ///
- void SecureServer_SocketStatusChange(SecureTCPServer server, uint clientIndex, SocketStatus serverSocketStatus)
+ #region Methods - Socket Status Changed Callbacks
+ ///
+ /// Secure Server Socket Status Changed Callback
+ ///
+ ///
+ ///
+ ///
+ void SecureServer_SocketStatusChange(SecureTCPServer server, uint clientIndex, SocketStatus serverSocketStatus)
+ {
+ try
{
- try
- {
- // Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "SecureServerSocketStatusChange Index:{0} status:{1} Port:{2} IP:{3}", clientIndex, serverSocketStatus, this.SecureServer.GetPortNumberServerAcceptedConnectionFromForSpecificClient(clientIndex), this.SecureServer.GetLocalAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
- if (serverSocketStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
- {
+ // Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "SecureServerSocketStatusChange Index:{0} status:{1} Port:{2} IP:{3}", clientIndex, serverSocketStatus, this.SecureServer.GetPortNumberServerAcceptedConnectionFromForSpecificClient(clientIndex), this.SecureServer.GetLocalAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
+ if (serverSocketStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
+ {
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "SecureServerSocketStatusChange ConnectedCLients: {0} ServerState: {1} Port: {2}", SecureServer.NumberOfClientsConnected, SecureServer.State, SecureServer.PortNumber);
-
- if (ConnectedClientsIndexes.Contains(clientIndex))
- ConnectedClientsIndexes.Remove(clientIndex);
- if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex))
- {
- HeartbeatTimerDictionary[clientIndex].Stop();
- HeartbeatTimerDictionary[clientIndex].Dispose();
- HeartbeatTimerDictionary.Remove(clientIndex);
- }
- if (ClientReadyAfterKeyExchange.Contains(clientIndex))
- ClientReadyAfterKeyExchange.Remove(clientIndex);
+
+ if (ConnectedClientsIndexes.Contains(clientIndex))
+ ConnectedClientsIndexes.Remove(clientIndex);
+ if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex))
+ {
+ HeartbeatTimerDictionary[clientIndex].Stop();
+ HeartbeatTimerDictionary[clientIndex].Dispose();
+ HeartbeatTimerDictionary.Remove(clientIndex);
+ }
+ if (ClientReadyAfterKeyExchange.Contains(clientIndex))
+ ClientReadyAfterKeyExchange.Remove(clientIndex);
if (WaitingForSharedKey.Contains(clientIndex))
WaitingForSharedKey.Remove(clientIndex);
if (SecureServer.MaxNumberOfClientSupported > SecureServer.NumberOfClientsConnected)
{
Listen();
}
- }
}
- catch (Exception ex)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error in Socket Status Change Callback. Error: {0}", ex);
- }
- //Use a thread for this event so that the server state updates to listening while this event is processed. Listening must be added to the server state
- //after every client connection so that the server can check and see if it is at max clients. Due to this the event fires and server listening enum bit flag
- //is not set. Putting in a thread allows the state to update before this event processes so that the subscribers to this event get accurate isListening in the event.
- CrestronInvoke.BeginInvoke(o => onConnectionChange(clientIndex, server.GetServerSocketStatusForSpecificClient(clientIndex)), null);
}
+ catch (Exception ex)
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error in Socket Status Change Callback. Error: {0}", ex);
+ }
+ //Use a thread for this event so that the server state updates to listening while this event is processed. Listening must be added to the server state
+ //after every client connection so that the server can check and see if it is at max clients. Due to this the event fires and server listening enum bit flag
+ //is not set. Putting in a thread allows the state to update before this event processes so that the subscribers to this event get accurate isListening in the event.
+ CrestronInvoke.BeginInvoke(o => onConnectionChange(clientIndex, server.GetServerSocketStatusForSpecificClient(clientIndex)), null);
+ }
- #endregion
+ #endregion
- #region Methods Connected Callbacks
- ///
- /// Secure TCP Client Connected to Secure Server Callback
- ///
- ///
- ///
- void SecureConnectCallback(SecureTCPServer server, uint clientIndex)
+ #region Methods Connected Callbacks
+ ///
+ /// Secure TCP Client Connected to Secure Server Callback
+ ///
+ ///
+ ///
+ void SecureConnectCallback(SecureTCPServer server, uint clientIndex)
+ {
+ try
{
- try
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "ConnectCallback: IPAddress: {0}. Index: {1}. Status: {2}",
+ server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex),
+ clientIndex, server.GetServerSocketStatusForSpecificClient(clientIndex));
+ if (clientIndex != 0)
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "ConnectCallback: IPAddress: {0}. Index: {1}. Status: {2}",
- server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex),
- clientIndex, server.GetServerSocketStatusForSpecificClient(clientIndex));
- if (clientIndex != 0)
+ if (server.ClientConnected(clientIndex))
{
- if (server.ClientConnected(clientIndex))
- {
- if (!ConnectedClientsIndexes.Contains(clientIndex))
- {
- ConnectedClientsIndexes.Add(clientIndex);
- }
- if (SharedKeyRequired)
- {
- if (!WaitingForSharedKey.Contains(clientIndex))
- {
- WaitingForSharedKey.Add(clientIndex);
- }
- byte[] b = Encoding.GetEncoding(28591).GetBytes("SharedKey:");
- server.SendDataAsync(clientIndex, b, b.Length, (x, y, z) => { });
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Sent Shared Key Request to client at {0}", server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
- }
- else
+ if (!ConnectedClientsIndexes.Contains(clientIndex))
+ {
+ ConnectedClientsIndexes.Add(clientIndex);
+ }
+ if (SharedKeyRequired)
+ {
+ if (!WaitingForSharedKey.Contains(clientIndex))
{
- OnServerClientReadyForCommunications(clientIndex);
+ WaitingForSharedKey.Add(clientIndex);
}
- if (HeartbeatRequired)
+ byte[] b = Encoding.GetEncoding(28591).GetBytes("SharedKey:");
+ server.SendDataAsync(clientIndex, b, b.Length, (x, y, z) => { });
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Sent Shared Key Request to client at {0}", server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
+ }
+ else
+ {
+ OnServerClientReadyForCommunications(clientIndex);
+ }
+ if (HeartbeatRequired)
+ {
+ if (!HeartbeatTimerDictionary.ContainsKey(clientIndex))
{
- if (!HeartbeatTimerDictionary.ContainsKey(clientIndex))
- {
- HeartbeatTimerDictionary.Add(clientIndex, new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs));
- }
+ HeartbeatTimerDictionary.Add(clientIndex, new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs));
}
-
- server.ReceiveDataAsync(clientIndex, SecureReceivedDataAsyncCallback);
}
- }
- else
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Client attempt faulty.");
+
+ server.ReceiveDataAsync(clientIndex, SecureReceivedDataAsyncCallback);
}
}
- catch (Exception ex)
+ else
{
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error in Socket Status Connect Callback. Error: {0}", ex);
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Client attempt faulty.");
}
+ }
+ catch (Exception ex)
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error in Socket Status Connect Callback. Error: {0}", ex);
+ }
// Rearm the listner
SocketErrorCodes status = server.WaitForConnectionAsync(IPAddress.Any, SecureConnectCallback);
@@ -806,279 +806,278 @@ void SecureConnectCallback(SecureTCPServer server, uint clientIndex)
}
}
- #endregion
+ #endregion
- #region Methods - Send/Receive Callbacks
- ///
- /// Secure Received Data Async Callback
- ///
- ///
- ///
- ///
- void SecureReceivedDataAsyncCallback(SecureTCPServer mySecureTCPServer, uint clientIndex, int numberOfBytesReceived)
+ #region Methods - Send/Receive Callbacks
+ ///
+ /// Secure Received Data Async Callback
+ ///
+ ///
+ ///
+ ///
+ void SecureReceivedDataAsyncCallback(SecureTCPServer mySecureTCPServer, uint clientIndex, int numberOfBytesReceived)
+ {
+ if (numberOfBytesReceived > 0)
{
- if (numberOfBytesReceived > 0)
- {
- string received = "Nothing";
- var handler = TextReceivedQueueInvoke;
- try
+ string received = "Nothing";
+ var handler = TextReceivedQueueInvoke;
+ try
+ {
+ byte[] bytes = mySecureTCPServer.GetIncomingDataBufferForSpecificClient(clientIndex);
+ received = System.Text.Encoding.GetEncoding(28591).GetString(bytes, 0, numberOfBytesReceived);
+ if (WaitingForSharedKey.Contains(clientIndex))
{
- byte[] bytes = mySecureTCPServer.GetIncomingDataBufferForSpecificClient(clientIndex);
- received = System.Text.Encoding.GetEncoding(28591).GetString(bytes, 0, numberOfBytesReceived);
- if (WaitingForSharedKey.Contains(clientIndex))
+ received = received.Replace("\r", "");
+ received = received.Replace("\n", "");
+ if (received != SharedKey)
{
- received = received.Replace("\r", "");
- received = received.Replace("\n", "");
- if (received != SharedKey)
- {
- byte[] b = Encoding.GetEncoding(28591).GetBytes("Shared key did not match server. Disconnecting");
- Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Client at index {0} Shared key did not match the server, disconnecting client. Key: {1}", clientIndex, received);
- mySecureTCPServer.SendData(clientIndex, b, b.Length);
- mySecureTCPServer.Disconnect(clientIndex);
-
- return;
- }
-
- WaitingForSharedKey.Remove(clientIndex);
- byte[] success = Encoding.GetEncoding(28591).GetBytes("Shared Key Match");
- mySecureTCPServer.SendDataAsync(clientIndex, success, success.Length, null);
- OnServerClientReadyForCommunications(clientIndex);
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Client with index {0} provided the shared key and successfully connected to the server", clientIndex);
+ byte[] b = Encoding.GetEncoding(28591).GetBytes("Shared key did not match server. Disconnecting");
+ Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Client at index {0} Shared key did not match the server, disconnecting client. Key: {1}", clientIndex, received);
+ mySecureTCPServer.SendData(clientIndex, b, b.Length);
+ mySecureTCPServer.Disconnect(clientIndex);
+
+ return;
}
- else if (!string.IsNullOrEmpty(checkHeartbeat(clientIndex, received)))
- {
- onTextReceived(received, clientIndex);
- if (handler != null)
- {
- MessageQueue.TryToEnqueue(new GenericTcpServerCommMethodReceiveTextArgs(received, clientIndex));
- }
- }
- }
- catch (Exception ex)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Receiving data: {0}. Error: {1}", received, ex);
- }
- if (mySecureTCPServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
- mySecureTCPServer.ReceiveDataAsync(clientIndex, SecureReceivedDataAsyncCallback);
- //Check to see if there is a subscription to the TextReceivedQueueInvoke event. If there is start the dequeue thread.
- if (handler != null)
- {
- var gotLock = DequeueLock.TryEnter();
- if (gotLock)
- CrestronInvoke.BeginInvoke((o) => DequeueEvent());
+ WaitingForSharedKey.Remove(clientIndex);
+ byte[] success = Encoding.GetEncoding(28591).GetBytes("Shared Key Match");
+ mySecureTCPServer.SendDataAsync(clientIndex, success, success.Length, null);
+ OnServerClientReadyForCommunications(clientIndex);
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Client with index {0} provided the shared key and successfully connected to the server", clientIndex);
}
- }
- else
- {
- mySecureTCPServer.Disconnect(clientIndex);
- }
- }
-
- ///
- /// This method gets spooled up in its own thread an protected by a CCriticalSection to prevent multiple threads from running concurrently.
- /// It will dequeue items as they are enqueued automatically.
- ///
- void DequeueEvent()
- {
- try
- {
- while (true)
+ else if (!string.IsNullOrEmpty(checkHeartbeat(clientIndex, received)))
{
- // Pull from Queue and fire an event. Block indefinitely until an item can be removed, similar to a Gather.
- var message = MessageQueue.Dequeue();
- var handler = TextReceivedQueueInvoke;
+ onTextReceived(received, clientIndex);
if (handler != null)
{
- handler(this, message);
+ MessageQueue.TryToEnqueue(new GenericTcpServerCommMethodReceiveTextArgs(received, clientIndex));
}
}
}
- catch (Exception e)
+ catch (Exception ex)
{
- this.LogException(e, "DequeueEvent error");
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Receiving data: {0}. Error: {1}", received, ex);
}
- // Make sure to leave the CCritical section in case an exception above stops this thread, or we won't be able to restart it.
- if (DequeueLock != null)
+ if (mySecureTCPServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
+ mySecureTCPServer.ReceiveDataAsync(clientIndex, SecureReceivedDataAsyncCallback);
+
+ //Check to see if there is a subscription to the TextReceivedQueueInvoke event. If there is start the dequeue thread.
+ if (handler != null)
{
- DequeueLock.Leave();
+ var gotLock = DequeueLock.TryEnter();
+ if (gotLock)
+ CrestronInvoke.BeginInvoke((o) => DequeueEvent());
}
}
+ else
+ {
+ mySecureTCPServer.Disconnect(clientIndex);
+ }
+ }
- #endregion
-
- #region Methods - EventHelpers/Callbacks
-
- //Private Helper method to call the Connection Change Event
- void onConnectionChange(uint clientIndex, SocketStatus clientStatus)
+ ///
+ /// This method gets spooled up in its own thread an protected by a CCriticalSection to prevent multiple threads from running concurrently.
+ /// It will dequeue items as they are enqueued automatically.
+ ///
+ void DequeueEvent()
+ {
+ try
{
- if (clientIndex != 0) //0 is error not valid client change
+ while (true)
{
- var handler = ClientConnectionChange;
+ // Pull from Queue and fire an event. Block indefinitely until an item can be removed, similar to a Gather.
+ var message = MessageQueue.Dequeue();
+ var handler = TextReceivedQueueInvoke;
if (handler != null)
{
- handler(this, new GenericTcpServerSocketStatusChangeEventArgs(SecureServer, clientIndex, clientStatus));
+ handler(this, message);
}
}
}
+ catch (Exception e)
+ {
+ this.LogException(e, "DequeueEvent error");
+ }
+ // Make sure to leave the CCritical section in case an exception above stops this thread, or we won't be able to restart it.
+ if (DequeueLock != null)
+ {
+ DequeueLock.Leave();
+ }
+ }
+
+ #endregion
- //Private Helper method to call the Connection Change Event
- void OnConnectionChange()
+ #region Methods - EventHelpers/Callbacks
+
+ //Private Helper method to call the Connection Change Event
+ void onConnectionChange(uint clientIndex, SocketStatus clientStatus)
+ {
+ if (clientIndex != 0) //0 is error not valid client change
{
- if (ProgramIsStopping)
- {
- return;
- }
var handler = ClientConnectionChange;
if (handler != null)
{
- handler(this, new GenericTcpServerSocketStatusChangeEventArgs());
+ handler(this, new GenericTcpServerSocketStatusChangeEventArgs(SecureServer, clientIndex, clientStatus));
}
}
+ }
- //Private Helper Method to call the Text Received Event
- void onTextReceived(string text, uint clientIndex)
+ //Private Helper method to call the Connection Change Event
+ void OnConnectionChange()
+ {
+ if (ProgramIsStopping)
{
- var handler = TextReceived;
- if (handler != null)
- handler(this, new GenericTcpServerCommMethodReceiveTextArgs(text, clientIndex));
+ return;
}
-
- //Private Helper Method to call the Server State Change Event
- void OnServerStateChange(ServerState state)
+ var handler = ClientConnectionChange;
+ if (handler != null)
{
- if (ProgramIsStopping)
- {
- return;
- }
- var handler = ServerStateChange;
- if (handler != null)
- {
- handler(this, new GenericTcpServerStateChangedEventArgs(state));
- }
+ handler(this, new GenericTcpServerSocketStatusChangeEventArgs());
}
+ }
+
+ //Private Helper Method to call the Text Received Event
+ void onTextReceived(string text, uint clientIndex)
+ {
+ var handler = TextReceived;
+ if (handler != null)
+ handler(this, new GenericTcpServerCommMethodReceiveTextArgs(text, clientIndex));
+ }
- ///
- /// Private Event Handler method to handle the closing of connections when the program stops
- ///
- ///
- void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ //Private Helper Method to call the Server State Change Event
+ void OnServerStateChange(ServerState state)
+ {
+ if (ProgramIsStopping)
{
- if (programEventType == eProgramStatusEventType.Stopping)
- {
- ProgramIsStopping = true;
- // kill bandaid things
- if (MonitorClientTimer != null)
- MonitorClientTimer.Stop();
- if (MonitorClient != null)
- MonitorClient.Disconnect();
-
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing server");
- KillServer();
- }
+ return;
}
-
- //Private event handler method to raise the event that the server is ready to send data after a successful client shared key negotiation
- void OnServerClientReadyForCommunications(uint clientIndex)
+ var handler = ServerStateChange;
+ if (handler != null)
{
- ClientReadyAfterKeyExchange.Add(clientIndex);
- var handler = ServerClientReadyForCommunications;
- if (handler != null)
- handler(this, new GenericTcpServerSocketStatusChangeEventArgs(
- this, clientIndex, SecureServer.GetServerSocketStatusForSpecificClient(clientIndex)));
+ handler(this, new GenericTcpServerStateChangedEventArgs(state));
}
- #endregion
+ }
- #region Monitor Client
- ///
- /// Starts the monitor client cycle. Timed wait, then call RunMonitorClient
- ///
- void StartMonitorClient()
+ ///
+ /// Private Event Handler method to handle the closing of connections when the program stops
+ ///
+ ///
+ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ {
+ if (programEventType == eProgramStatusEventType.Stopping)
{
+ ProgramIsStopping = true;
+ // kill bandaid things
if (MonitorClientTimer != null)
- {
- return;
- }
- MonitorClientTimer = new CTimer(o => RunMonitorClient(), 60000);
+ MonitorClientTimer.Stop();
+ if (MonitorClient != null)
+ MonitorClient.Disconnect();
+
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing server");
+ KillServer();
}
+ }
+
+ //Private event handler method to raise the event that the server is ready to send data after a successful client shared key negotiation
+ void OnServerClientReadyForCommunications(uint clientIndex)
+ {
+ ClientReadyAfterKeyExchange.Add(clientIndex);
+ var handler = ServerClientReadyForCommunications;
+ if (handler != null)
+ handler(this, new GenericTcpServerSocketStatusChangeEventArgs(
+ this, clientIndex, SecureServer.GetServerSocketStatusForSpecificClient(clientIndex)));
+ }
+ #endregion
- ///
- ///
- ///
- void RunMonitorClient()
+ #region Monitor Client
+ ///
+ /// Starts the monitor client cycle. Timed wait, then call RunMonitorClient
+ ///
+ void StartMonitorClient()
+ {
+ if (MonitorClientTimer != null)
{
- MonitorClient = new GenericSecureTcpIpClient_ForServer(Key + "-MONITOR", "127.0.0.1", Port, 2000);
- MonitorClient.SharedKeyRequired = this.SharedKeyRequired;
- MonitorClient.SharedKey = this.SharedKey;
- MonitorClient.ConnectionHasHungCallback = MonitorClientHasHungCallback;
- //MonitorClient.ConnectionChange += MonitorClient_ConnectionChange;
- MonitorClient.ClientReadyForCommunications += MonitorClient_IsReadyForComm;
+ return;
+ }
+ MonitorClientTimer = new CTimer(o => RunMonitorClient(), 60000);
+ }
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Starting monitor check");
+ ///
+ ///
+ ///
+ void RunMonitorClient()
+ {
+ MonitorClient = new GenericSecureTcpIpClient_ForServer(Key + "-MONITOR", "127.0.0.1", Port, 2000);
+ MonitorClient.SharedKeyRequired = this.SharedKeyRequired;
+ MonitorClient.SharedKey = this.SharedKey;
+ MonitorClient.ConnectionHasHungCallback = MonitorClientHasHungCallback;
+ //MonitorClient.ConnectionChange += MonitorClient_ConnectionChange;
+ MonitorClient.ClientReadyForCommunications += MonitorClient_IsReadyForComm;
- MonitorClient.Connect();
- // From here MonitorCLient either connects or hangs, MonitorClient will call back
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Starting monitor check");
- }
+ MonitorClient.Connect();
+ // From here MonitorCLient either connects or hangs, MonitorClient will call back
- ///
- ///
- ///
- void StopMonitorClient()
- {
- if (MonitorClient == null)
- return;
+ }
- MonitorClient.ClientReadyForCommunications -= MonitorClient_IsReadyForComm;
- MonitorClient.Disconnect();
- MonitorClient = null;
- }
+ ///
+ ///
+ ///
+ void StopMonitorClient()
+ {
+ if (MonitorClient == null)
+ return;
- ///
- /// On monitor connect, restart the operation
- ///
- void MonitorClient_IsReadyForComm(object sender, GenericTcpServerClientReadyForcommunicationsEventArgs args)
- {
- if (args.IsReady)
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Monitor client connection success. Disconnecting in 2s");
- MonitorClientTimer.Stop();
- MonitorClientTimer = null;
- MonitorClientFailureCount = 0;
- CrestronEnvironment.Sleep(2000);
- StopMonitorClient();
- StartMonitorClient();
- }
- }
+ MonitorClient.ClientReadyForCommunications -= MonitorClient_IsReadyForComm;
+ MonitorClient.Disconnect();
+ MonitorClient = null;
+ }
- ///
- /// If the client hangs, add to counter and maybe fire the choke event
- ///
- void MonitorClientHasHungCallback()
+ ///
+ /// On monitor connect, restart the operation
+ ///
+ void MonitorClient_IsReadyForComm(object sender, GenericTcpServerClientReadyForcommunicationsEventArgs args)
+ {
+ if (args.IsReady)
{
- MonitorClientFailureCount++;
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Monitor client connection success. Disconnecting in 2s");
MonitorClientTimer.Stop();
MonitorClientTimer = null;
+ MonitorClientFailureCount = 0;
+ CrestronEnvironment.Sleep(2000);
StopMonitorClient();
- if (MonitorClientFailureCount < MonitorClientMaxFailureCount)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Warning, "Monitor client connection has hung {0} time{1}, maximum {2}",
- MonitorClientFailureCount, MonitorClientFailureCount > 1 ? "s" : "", MonitorClientMaxFailureCount);
- StartMonitorClient();
- }
- else
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error,
- "\r***************************\rMonitor client connection has hung a maximum of {0} times. \r***************************",
- MonitorClientMaxFailureCount);
+ StartMonitorClient();
+ }
+ }
- var handler = ServerHasChoked;
- if (handler != null)
- handler();
- // Some external thing is in charge here. Expected reset of program
- }
+ ///
+ /// If the client hangs, add to counter and maybe fire the choke event
+ ///
+ void MonitorClientHasHungCallback()
+ {
+ MonitorClientFailureCount++;
+ MonitorClientTimer.Stop();
+ MonitorClientTimer = null;
+ StopMonitorClient();
+ if (MonitorClientFailureCount < MonitorClientMaxFailureCount)
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Warning, "Monitor client connection has hung {0} time{1}, maximum {2}",
+ MonitorClientFailureCount, MonitorClientFailureCount > 1 ? "s" : "", MonitorClientMaxFailureCount);
+ StartMonitorClient();
+ }
+ else
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error,
+ "\r***************************\rMonitor client connection has hung a maximum of {0} times. \r***************************",
+ MonitorClientMaxFailureCount);
+
+ var handler = ServerHasChoked;
+ if (handler != null)
+ handler();
+ // Some external thing is in charge here. Expected reset of program
}
- #endregion
}
+ #endregion
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/GenericSshClient.cs b/src/PepperDash.Core/Comm/GenericSshClient.cs
index fa5b95bb5..2030c5f97 100644
--- a/src/PepperDash.Core/Comm/GenericSshClient.cs
+++ b/src/PepperDash.Core/Comm/GenericSshClient.cs
@@ -8,145 +8,145 @@
using Renci.SshNet;
using Renci.SshNet.Common;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+///
+///
+public class GenericSshClient : Device, ISocketStatusWithStreamDebugging, IAutoReconnect
{
+ private const string SPlusKey = "Uninitialized SshClient";
///
- ///
+ /// Object to enable stream debugging
+ ///
+ public CommunicationStreamDebugging StreamDebugging { get; private set; }
+
+ ///
+ /// Event that fires when data is received. Delivers args with byte array
+ ///
+ public event EventHandler BytesReceived;
+
+ ///
+ /// Event that fires when data is received. Delivered as text.
+ ///
+ public event EventHandler TextReceived;
+
+ ///
+ /// Event when the connection status changes.
+ ///
+ public event EventHandler ConnectionChange;
+
+ /////
+ /////
+ /////
+ //public event GenericSocketStatusChangeEventDelegate SocketStatusChange;
+
+ ///
+ /// Address of server
+ ///
+ public string Hostname { get; set; }
+
+ ///
+ /// Port on server
+ ///
+ public int Port { get; set; }
+
+ ///
+ /// Username for server
///
- public class GenericSshClient : Device, ISocketStatusWithStreamDebugging, IAutoReconnect
+ public string Username { get; set; }
+
+ ///
+ /// And... Password for server. That was worth documenting!
+ ///
+ public string Password { get; set; }
+
+ ///
+ /// True when the server is connected - when status == 2.
+ ///
+ public bool IsConnected
{
- private const string SPlusKey = "Uninitialized SshClient";
- ///
- /// Object to enable stream debugging
- ///
- public CommunicationStreamDebugging StreamDebugging { get; private set; }
-
- ///
- /// Event that fires when data is received. Delivers args with byte array
- ///
- public event EventHandler BytesReceived;
-
- ///
- /// Event that fires when data is received. Delivered as text.
- ///
- public event EventHandler TextReceived;
-
- ///
- /// Event when the connection status changes.
- ///
- public event EventHandler ConnectionChange;
-
- /////
- /////
- /////
- //public event GenericSocketStatusChangeEventDelegate SocketStatusChange;
-
- ///
- /// Address of server
- ///
- public string Hostname { get; set; }
-
- ///
- /// Port on server
- ///
- public int Port { get; set; }
-
- ///
- /// Username for server
- ///
- public string Username { get; set; }
-
- ///
- /// And... Password for server. That was worth documenting!
- ///
- public string Password { get; set; }
-
- ///
- /// True when the server is connected - when status == 2.
- ///
- public bool IsConnected
- {
- // returns false if no client or not connected
- get { return Client != null && ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
- }
+ // returns false if no client or not connected
+ get { return Client != null && ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
+ }
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsConnected
- {
- get { return (ushort)(IsConnected ? 1 : 0); }
- }
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsConnected
+ {
+ get { return (ushort)(IsConnected ? 1 : 0); }
+ }
- ///
- ///
- ///
- public SocketStatus ClientStatus
+ ///
+ ///
+ ///
+ public SocketStatus ClientStatus
+ {
+ get { return _ClientStatus; }
+ private set
{
- get { return _ClientStatus; }
- private set
- {
- if (_ClientStatus == value)
- return;
- _ClientStatus = value;
- OnConnectionChange();
- }
+ if (_ClientStatus == value)
+ return;
+ _ClientStatus = value;
+ OnConnectionChange();
}
- SocketStatus _ClientStatus;
+ }
+ SocketStatus _ClientStatus;
- ///
- /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
- /// and IsConnected with be true when this == 2.
- ///
- public ushort UStatus
- {
- get { return (ushort)_ClientStatus; }
- }
+ ///
+ /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
+ /// and IsConnected with be true when this == 2.
+ ///
+ public ushort UStatus
+ {
+ get { return (ushort)_ClientStatus; }
+ }
- ///
- /// Determines whether client will attempt reconnection on failure. Default is true
- ///
- public bool AutoReconnect { get; set; }
+ ///
+ /// Determines whether client will attempt reconnection on failure. Default is true
+ ///
+ public bool AutoReconnect { get; set; }
- ///
- /// Will be set and unset by connect and disconnect only
- ///
- public bool ConnectEnabled { get; private set; }
+ ///
+ /// Will be set and unset by connect and disconnect only
+ ///
+ public bool ConnectEnabled { get; private set; }
- ///
- /// S+ helper for AutoReconnect
- ///
- public ushort UAutoReconnect
- {
- get { return (ushort)(AutoReconnect ? 1 : 0); }
- set { AutoReconnect = value == 1; }
- }
+ ///
+ /// S+ helper for AutoReconnect
+ ///
+ public ushort UAutoReconnect
+ {
+ get { return (ushort)(AutoReconnect ? 1 : 0); }
+ set { AutoReconnect = value == 1; }
+ }
- ///
- /// Millisecond value, determines the timeout period in between reconnect attempts.
- /// Set to 5000 by default
- ///
- public int AutoReconnectIntervalMs { get; set; }
+ ///
+ /// Millisecond value, determines the timeout period in between reconnect attempts.
+ /// Set to 5000 by default
+ ///
+ public int AutoReconnectIntervalMs { get; set; }
- SshClient Client;
+ SshClient Client;
- ShellStream TheStream;
+ ShellStream TheStream;
- CTimer ReconnectTimer;
+ CTimer ReconnectTimer;
- //Lock object to prevent simulatneous connect/disconnect operations
- //private CCriticalSection connectLock = new CCriticalSection();
- private SemaphoreSlim connectLock = new SemaphoreSlim(1);
+ //Lock object to prevent simulatneous connect/disconnect operations
+ //private CCriticalSection connectLock = new CCriticalSection();
+ private SemaphoreSlim connectLock = new SemaphoreSlim(1);
- private bool DisconnectLogged = false;
+ private bool DisconnectLogged = false;
- ///
- /// Typical constructor.
- ///
- public GenericSshClient(string key, string hostname, int port, string username, string password) :
- base(key)
- {
- StreamDebugging = new CommunicationStreamDebugging(key);
+ ///
+ /// Typical constructor.
+ ///
+ public GenericSshClient(string key, string hostname, int port, string username, string password) :
+ base(key)
+ {
+ StreamDebugging = new CommunicationStreamDebugging(key);
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
Key = key;
Hostname = hostname;
@@ -155,12 +155,12 @@ public GenericSshClient(string key, string hostname, int port, string username,
Password = password;
AutoReconnectIntervalMs = 5000;
- ReconnectTimer = new CTimer(o =>
+ ReconnectTimer = new CTimer(o =>
{
- if (ConnectEnabled)
- {
- Connect();
- }
+ if (ConnectEnabled)
+ {
+ Connect();
+ }
}, System.Threading.Timeout.Infinite);
}
@@ -173,13 +173,13 @@ public GenericSshClient()
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
AutoReconnectIntervalMs = 5000;
- ReconnectTimer = new CTimer(o =>
+ ReconnectTimer = new CTimer(o =>
+ {
+ if (ConnectEnabled)
{
- if (ConnectEnabled)
- {
- Connect();
- }
- }, System.Threading.Timeout.Infinite);
+ Connect();
+ }
+ }, System.Threading.Timeout.Infinite);
}
///
@@ -192,137 +192,137 @@ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType progr
if (Client != null)
{
this.LogDebug("Program stopping. Closing connection");
- Disconnect();
- }
+ Disconnect();
}
}
+ }
+
+ ///
+ /// Connect to the server, using the provided properties.
+ ///
+ public void Connect()
+ {
+ // Don't go unless everything is here
+ if (string.IsNullOrEmpty(Hostname) || Port < 1 || Port > 65535
+ || Username == null || Password == null)
+ {
+ this.LogError("Connect failed. Check hostname, port, username and password are set or not null");
+ return;
+ }
+
+ ConnectEnabled = true;
- ///
- /// Connect to the server, using the provided properties.
- ///
- public void Connect()
+ try
{
- // Don't go unless everything is here
- if (string.IsNullOrEmpty(Hostname) || Port < 1 || Port > 65535
- || Username == null || Password == null)
+ connectLock.Wait();
+ if (IsConnected)
{
- this.LogError("Connect failed. Check hostname, port, username and password are set or not null");
- return;
+ this.LogDebug("Connection already connected. Exiting Connect");
}
-
- ConnectEnabled = true;
-
- try
+ else
{
- connectLock.Wait();
- if (IsConnected)
- {
- this.LogDebug("Connection already connected. Exiting Connect");
- }
- else
- {
- this.LogDebug("Attempting connect");
+ this.LogDebug("Attempting connect");
- // Cancel reconnect if running.
+ // Cancel reconnect if running.
if (ReconnectTimer != null)
{
ReconnectTimer.Stop();
}
- // Cleanup the old client if it already exists
- if (Client != null)
+ // Cleanup the old client if it already exists
+ if (Client != null)
+ {
+ this.LogDebug("Cleaning up disconnected client");
+ KillClient(SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY);
+ }
+
+ // This handles both password and keyboard-interactive (like on OS-X, 'nixes)
+ KeyboardInteractiveAuthenticationMethod kauth = new KeyboardInteractiveAuthenticationMethod(Username);
+ kauth.AuthenticationPrompt += new EventHandler(kauth_AuthenticationPrompt);
+ PasswordAuthenticationMethod pauth = new PasswordAuthenticationMethod(Username, Password);
+
+ this.LogDebug("Creating new SshClient");
+ ConnectionInfo connectionInfo = new ConnectionInfo(Hostname, Port, Username, pauth, kauth);
+ Client = new SshClient(connectionInfo);
+ Client.ErrorOccurred += Client_ErrorOccurred;
+
+ //Attempt to connect
+ ClientStatus = SocketStatus.SOCKET_STATUS_WAITING;
+ try
+ {
+ Client.Connect();
+ TheStream = Client.CreateShellStream("PDTShell", 0, 0, 0, 0, 65534);
+ if (TheStream.DataAvailable)
{
- this.LogDebug("Cleaning up disconnected client");
- KillClient(SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY);
+ // empty the buffer if there is data
+ string str = TheStream.Read();
}
+ TheStream.DataReceived += Stream_DataReceived;
+ this.LogInformation("Connected");
+ ClientStatus = SocketStatus.SOCKET_STATUS_CONNECTED;
+ DisconnectLogged = false;
+ }
+ catch (SshConnectionException e)
+ {
+ var ie = e.InnerException; // The details are inside!!
+ var errorLogLevel = DisconnectLogged == true ? Debug.ErrorLogLevel.None : Debug.ErrorLogLevel.Error;
- // This handles both password and keyboard-interactive (like on OS-X, 'nixes)
- KeyboardInteractiveAuthenticationMethod kauth = new KeyboardInteractiveAuthenticationMethod(Username);
- kauth.AuthenticationPrompt += new EventHandler(kauth_AuthenticationPrompt);
- PasswordAuthenticationMethod pauth = new PasswordAuthenticationMethod(Username, Password);
-
- this.LogDebug("Creating new SshClient");
- ConnectionInfo connectionInfo = new ConnectionInfo(Hostname, Port, Username, pauth, kauth);
- Client = new SshClient(connectionInfo);
- Client.ErrorOccurred += Client_ErrorOccurred;
+ if (ie is SocketException)
+ {
+ this.LogException(ie, "CONNECTION failure: Cannot reach host");
+ }
- //Attempt to connect
- ClientStatus = SocketStatus.SOCKET_STATUS_WAITING;
- try
+ if (ie is System.Net.Sockets.SocketException socketException)
{
- Client.Connect();
- TheStream = Client.CreateShellStream("PDTShell", 0, 0, 0, 0, 65534);
- if (TheStream.DataAvailable)
- {
- // empty the buffer if there is data
- string str = TheStream.Read();
- }
- TheStream.DataReceived += Stream_DataReceived;
- this.LogInformation("Connected");
- ClientStatus = SocketStatus.SOCKET_STATUS_CONNECTED;
- DisconnectLogged = false;
+ this.LogException(ie, "Connection failure: Cannot reach {host} on {port}",
+ Hostname, Port);
}
- catch (SshConnectionException e)
+ if (ie is SshAuthenticationException)
{
- var ie = e.InnerException; // The details are inside!!
- var errorLogLevel = DisconnectLogged == true ? Debug.ErrorLogLevel.None : Debug.ErrorLogLevel.Error;
-
- if (ie is SocketException)
- {
- this.LogException(ie, "CONNECTION failure: Cannot reach host");
- }
-
- if (ie is System.Net.Sockets.SocketException socketException)
- {
- this.LogException(ie, "Connection failure: Cannot reach {host} on {port}",
- Hostname, Port);
- }
- if (ie is SshAuthenticationException)
- {
- this.LogException(ie, "Authentication failure for username {userName}", Username);
- }
- else
- this.LogException(ie, "Error on connect");
-
- DisconnectLogged = true;
- KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- if (AutoReconnect)
- {
- this.LogDebug("Checking autoreconnect: {autoReconnect}, {autoReconnectInterval}ms", AutoReconnect, AutoReconnectIntervalMs);
- ReconnectTimer.Reset(AutoReconnectIntervalMs);
- }
+ this.LogException(ie, "Authentication failure for username {userName}", Username);
}
- catch(SshOperationTimeoutException ex)
+ else
+ this.LogException(ie, "Error on connect");
+
+ DisconnectLogged = true;
+ KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
+ if (AutoReconnect)
{
- this.LogWarning("Connection attempt timed out: {message}", ex.Message);
-
- DisconnectLogged = true;
- KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- if (AutoReconnect)
- {
- this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
- ReconnectTimer.Reset(AutoReconnectIntervalMs);
- }
+ this.LogDebug("Checking autoreconnect: {autoReconnect}, {autoReconnectInterval}ms", AutoReconnect, AutoReconnectIntervalMs);
+ ReconnectTimer.Reset(AutoReconnectIntervalMs);
}
- catch (Exception e)
+ }
+ catch(SshOperationTimeoutException ex)
+ {
+ this.LogWarning("Connection attempt timed out: {message}", ex.Message);
+
+ DisconnectLogged = true;
+ KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
+ if (AutoReconnect)
{
- var errorLogLevel = DisconnectLogged == true ? Debug.ErrorLogLevel.None : Debug.ErrorLogLevel.Error;
- this.LogException(e, "Unhandled exception on connect");
- DisconnectLogged = true;
- KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- if (AutoReconnect)
- {
- this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
- ReconnectTimer.Reset(AutoReconnectIntervalMs);
- }
+ this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
+ ReconnectTimer.Reset(AutoReconnectIntervalMs);
+ }
+ }
+ catch (Exception e)
+ {
+ var errorLogLevel = DisconnectLogged == true ? Debug.ErrorLogLevel.None : Debug.ErrorLogLevel.Error;
+ this.LogException(e, "Unhandled exception on connect");
+ DisconnectLogged = true;
+ KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
+ if (AutoReconnect)
+ {
+ this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
+ ReconnectTimer.Reset(AutoReconnectIntervalMs);
}
}
- }
- finally
- {
- connectLock.Release();
}
}
+ finally
+ {
+ connectLock.Release();
+ }
+ }
///
/// Disconnect the clients and put away it's resources.
@@ -337,54 +337,54 @@ public void Disconnect()
// ReconnectTimer = null;
}
- KillClient(SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY);
- }
+ KillClient(SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY);
+ }
- ///
- /// Kills the stream, cleans up the client and sets it to null
- ///
- private void KillClient(SocketStatus status)
- {
- KillStream();
+ ///
+ /// Kills the stream, cleans up the client and sets it to null
+ ///
+ private void KillClient(SocketStatus status)
+ {
+ KillStream();
- try
- {
- if (Client != null)
- {
- Client.ErrorOccurred -= Client_ErrorOccurred;
- Client.Disconnect();
- Client.Dispose();
- Client = null;
- ClientStatus = status;
- this.LogDebug("Disconnected");
- }
- }
- catch (Exception ex)
+ try
+ {
+ if (Client != null)
{
- this.LogException(ex,"Exception in Kill Client");
+ Client.ErrorOccurred -= Client_ErrorOccurred;
+ Client.Disconnect();
+ Client.Dispose();
+ Client = null;
+ ClientStatus = status;
+ this.LogDebug("Disconnected");
}
}
+ catch (Exception ex)
+ {
+ this.LogException(ex,"Exception in Kill Client");
+ }
+ }
- ///
- /// Kills the stream
- ///
+ ///
+ /// Kills the stream
+ ///
void KillStream()
{
- try
- {
- if (TheStream != null)
- {
- TheStream.DataReceived -= Stream_DataReceived;
- TheStream.Close();
- TheStream.Dispose();
- TheStream = null;
- this.LogDebug("Disconnected stream");
- }
- }
- catch (Exception ex)
+ try
+ {
+ if (TheStream != null)
{
- this.LogException(ex, "Exception in Kill Stream:{0}");
+ TheStream.DataReceived -= Stream_DataReceived;
+ TheStream.Close();
+ TheStream.Dispose();
+ TheStream = null;
+ this.LogDebug("Disconnected stream");
}
+ }
+ catch (Exception ex)
+ {
+ this.LogException(ex, "Exception in Kill Stream:{0}");
+ }
}
///
@@ -402,32 +402,32 @@ void kauth_AuthenticationPrompt(object sender, AuthenticationPromptEventArgs e)
///
void Stream_DataReceived(object sender, ShellDataEventArgs e)
{
- if (((ShellStream)sender).Length <= 0L)
- {
- return;
- }
- var response = ((ShellStream)sender).Read();
-
+ if (((ShellStream)sender).Length <= 0L)
+ {
+ return;
+ }
+ var response = ((ShellStream)sender).Read();
+
var bytesHandler = BytesReceived;
-
+
if (bytesHandler != null)
{
- var bytes = Encoding.UTF8.GetBytes(response);
+ var bytes = Encoding.UTF8.GetBytes(response);
if (StreamDebugging.RxStreamDebuggingIsEnabled)
{
this.LogInformation("Received {1} bytes: '{0}'", ComTextHelper.GetEscapedText(bytes), bytes.Length);
}
- bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
+ bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
}
var textHandler = TextReceived;
if (textHandler != null)
{
- if (StreamDebugging.RxStreamDebuggingIsEnabled)
- this.LogInformation("Received: '{0}'", ComTextHelper.GetDebugText(response));
+ if (StreamDebugging.RxStreamDebuggingIsEnabled)
+ this.LogInformation("Received: '{0}'", ComTextHelper.GetDebugText(response));
- textHandler(this, new GenericCommMethodReceiveTextArgs(response));
- }
+ textHandler(this, new GenericCommMethodReceiveTextArgs(response));
+ }
}
@@ -438,39 +438,39 @@ void Stream_DataReceived(object sender, ShellDataEventArgs e)
///
void Client_ErrorOccurred(object sender, ExceptionEventArgs e)
{
- CrestronInvoke.BeginInvoke(o =>
+ CrestronInvoke.BeginInvoke(o =>
+ {
+ if (e.Exception is SshConnectionException || e.Exception is System.Net.Sockets.SocketException)
+ this.LogError("Disconnected by remote");
+ else
+ this.LogException(e.Exception, "Unhandled SSH client error");
+ try
{
- if (e.Exception is SshConnectionException || e.Exception is System.Net.Sockets.SocketException)
- this.LogError("Disconnected by remote");
- else
- this.LogException(e.Exception, "Unhandled SSH client error");
- try
- {
- connectLock.Wait();
- KillClient(SocketStatus.SOCKET_STATUS_BROKEN_REMOTELY);
- }
- finally
- {
- connectLock.Release();
- }
- if (AutoReconnect && ConnectEnabled)
- {
- this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
- ReconnectTimer.Reset(AutoReconnectIntervalMs);
- }
- });
- }
+ connectLock.Wait();
+ KillClient(SocketStatus.SOCKET_STATUS_BROKEN_REMOTELY);
+ }
+ finally
+ {
+ connectLock.Release();
+ }
+ if (AutoReconnect && ConnectEnabled)
+ {
+ this.LogDebug("Checking autoreconnect: {0}, {1}ms", AutoReconnect, AutoReconnectIntervalMs);
+ ReconnectTimer.Reset(AutoReconnectIntervalMs);
+ }
+ });
+ }
- ///
- /// Helper for ConnectionChange event
- ///
- void OnConnectionChange()
- {
- if (ConnectionChange != null)
- ConnectionChange(this, new GenericSocketStatusChageEventArgs(this));
- }
+ ///
+ /// Helper for ConnectionChange event
+ ///
+ void OnConnectionChange()
+ {
+ if (ConnectionChange != null)
+ ConnectionChange(this, new GenericSocketStatusChageEventArgs(this));
+ }
- #region IBasicCommunication Members
+ #region IBasicCommunication Members
///
/// Sends text to the server
@@ -497,52 +497,52 @@ public void SendText(string text)
}
}
catch (ObjectDisposedException)
- {
- this.LogError("ObjectDisposedException sending '{message}'. Restarting connection...", text.Trim());
+ {
+ this.LogError("ObjectDisposedException sending '{message}'. Restarting connection...", text.Trim());
- KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- ReconnectTimer.Reset();
+ KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
+ ReconnectTimer.Reset();
}
catch (Exception ex)
{
- this.LogException(ex, "Exception sending text: '{message}'", text);
+ this.LogException(ex, "Exception sending text: '{message}'", text);
}
}
- ///
- /// Sends Bytes to the server
- ///
- ///
+ ///
+ /// Sends Bytes to the server
+ ///
+ ///
public void SendBytes(byte[] bytes)
{
- try
+ try
+ {
+ if (Client != null && TheStream != null && IsConnected)
{
- if (Client != null && TheStream != null && IsConnected)
- {
- if (StreamDebugging.TxStreamDebuggingIsEnabled)
- this.LogInformation("Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
+ if (StreamDebugging.TxStreamDebuggingIsEnabled)
+ this.LogInformation("Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
- TheStream.Write(bytes, 0, bytes.Length);
- TheStream.Flush();
- }
- else
- {
- this.LogDebug("Client is null or disconnected. Cannot Send Bytes");
- }
+ TheStream.Write(bytes, 0, bytes.Length);
+ TheStream.Flush();
}
- catch (ObjectDisposedException ex)
+ else
{
- this.LogException(ex, "ObjectDisposedException sending {message}", ComTextHelper.GetEscapedText(bytes));
-
- KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
- ReconnectTimer.Reset();
+ this.LogDebug("Client is null or disconnected. Cannot Send Bytes");
}
- catch (Exception ex)
- {
- this.LogException(ex, "Exception sending {message}", ComTextHelper.GetEscapedText(bytes));
- }
+ }
+ catch (ObjectDisposedException ex)
+ {
+ this.LogException(ex, "ObjectDisposedException sending {message}", ComTextHelper.GetEscapedText(bytes));
+
+ KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
+ ReconnectTimer.Reset();
+ }
+ catch (Exception ex)
+ {
+ this.LogException(ex, "Exception sending {message}", ComTextHelper.GetEscapedText(bytes));
+ }
}
- #endregion
+#endregion
}
@@ -553,40 +553,39 @@ public void SendBytes(byte[] bytes)
///
public class SshConnectionChangeEventArgs : EventArgs
{
- ///
- /// Connection State
- ///
+ ///
+ /// Connection State
+ ///
public bool IsConnected { get; private set; }
- ///
- /// Connection Status represented as a ushort
- ///
+ ///
+ /// Connection Status represented as a ushort
+ ///
public ushort UIsConnected { get { return (ushort)(Client.IsConnected ? 1 : 0); } }
- ///
- /// The client
- ///
+ ///
+ /// The client
+ ///
public GenericSshClient Client { get; private set; }
- ///
- /// Socket Status as represented by
- ///
+ ///
+ /// Socket Status as represented by
+ ///
public ushort Status { get { return Client.UStatus; } }
- ///
- /// S+ Constructor
- ///
- public SshConnectionChangeEventArgs() { }
+ ///
+ /// S+ Constructor
+ ///
+ public SshConnectionChangeEventArgs() { }
- ///
- /// EventArgs class
- ///
- /// Connection State
- /// The Client
+ ///
+ /// EventArgs class
+ ///
+ /// Connection State
+ /// The Client
public SshConnectionChangeEventArgs(bool isConnected, GenericSshClient client)
- {
- IsConnected = isConnected;
- Client = client;
- }
+ {
+ IsConnected = isConnected;
+ Client = client;
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/GenericTcpIpClient.cs b/src/PepperDash.Core/Comm/GenericTcpIpClient.cs
index 9529aa29a..ee0df8de0 100644
--- a/src/PepperDash.Core/Comm/GenericTcpIpClient.cs
+++ b/src/PepperDash.Core/Comm/GenericTcpIpClient.cs
@@ -6,18 +6,18 @@
using Crestron.SimplSharp.CrestronSockets;
using Newtonsoft.Json;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// A class to handle basic TCP/IP communications with a server
+///
+ public class GenericTcpIpClient : Device, ISocketStatusWithStreamDebugging, IAutoReconnect
{
+ private const string SplusKey = "Uninitialized TcpIpClient";
///
- /// A class to handle basic TCP/IP communications with a server
+ /// Object to enable stream debugging
///
- public class GenericTcpIpClient : Device, ISocketStatusWithStreamDebugging, IAutoReconnect
- {
- private const string SplusKey = "Uninitialized TcpIpClient";
- ///
- /// Object to enable stream debugging
- ///
- public CommunicationStreamDebugging StreamDebugging { get; private set; }
+ public CommunicationStreamDebugging StreamDebugging { get; private set; }
///
/// Fires when data is received from the server and returns it as a Byte array
@@ -38,11 +38,11 @@ public class GenericTcpIpClient : Device, ISocketStatusWithStreamDebugging, IAut
private string _hostname;
- ///
- /// Address of server
- ///
- public string Hostname
- {
+ ///
+ /// Address of server
+ ///
+ public string Hostname
+ {
get
{
return _hostname;
@@ -58,25 +58,25 @@ public string Hostname
}
}
- ///
- /// Port on server
- ///
- public int Port { get; set; }
+ ///
+ /// Port on server
+ ///
+ public int Port { get; set; }
- ///
- /// Another damn S+ helper because S+ seems to treat large port nums as signed ints
- /// which screws up things
- ///
- public ushort UPort
- {
- get { return Convert.ToUInt16(Port); }
- set { Port = Convert.ToInt32(value); }
- }
+ ///
+ /// Another damn S+ helper because S+ seems to treat large port nums as signed ints
+ /// which screws up things
+ ///
+ public ushort UPort
+ {
+ get { return Convert.ToUInt16(Port); }
+ set { Port = Convert.ToInt32(value); }
+ }
- ///
- /// Defaults to 2000
- ///
- public int BufferSize { get; set; }
+ ///
+ /// Defaults to 2000
+ ///
+ public int BufferSize { get; set; }
///
/// The actual client class
@@ -87,47 +87,47 @@ public ushort UPort
/// Bool showing if socket is connected
///
public bool IsConnected
- {
- get { return _client != null && _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
- }
-
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsConnected
- {
- get { return (ushort)(IsConnected ? 1 : 0); }
- }
+ {
+ get { return _client != null && _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
+ }
+
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsConnected
+ {
+ get { return (ushort)(IsConnected ? 1 : 0); }
+ }
///
/// _client socket status Read only
///
public SocketStatus ClientStatus
- {
- get
- {
- return _client == null ? SocketStatus.SOCKET_STATUS_NO_CONNECT : _client.ClientStatus;
- }
- }
-
- ///
- /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
- /// and IsConnected would be true when this == 2.
- ///
- public ushort UStatus
+ {
+ get
{
- get { return (ushort)ClientStatus; }
- }
+ return _client == null ? SocketStatus.SOCKET_STATUS_NO_CONNECT : _client.ClientStatus;
+ }
+ }
+
+ ///
+ /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
+ /// and IsConnected would be true when this == 2.
+ ///
+ public ushort UStatus
+ {
+ get { return (ushort)ClientStatus; }
+ }
///
- /// Status text shows the message associated with socket status
+ /// Status text shows the message associated with socket status
///
public string ClientStatusText { get { return ClientStatus.ToString(); } }
///
/// Ushort representation of client status
///
- [Obsolete]
+ [Obsolete]
public ushort UClientStatus { get { return (ushort)ClientStatus; } }
///
@@ -140,14 +140,14 @@ public ushort UStatus
///
public bool AutoReconnect { get; set; }
- ///
- /// S+ helper for AutoReconnect
- ///
- public ushort UAutoReconnect
- {
- get { return (ushort)(AutoReconnect ? 1 : 0); }
- set { AutoReconnect = value == 1; }
- }
+ ///
+ /// S+ helper for AutoReconnect
+ ///
+ public ushort UAutoReconnect
+ {
+ get { return (ushort)(AutoReconnect ? 1 : 0); }
+ set { AutoReconnect = value == 1; }
+ }
///
/// Milliseconds to wait before attempting to reconnect. Defaults to 5000
@@ -167,283 +167,283 @@ public bool Connected
get { return _client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
}
- //Lock object to prevent simulatneous connect/disconnect operations
- private CCriticalSection connectLock = new CCriticalSection();
+ //Lock object to prevent simulatneous connect/disconnect operations
+ private CCriticalSection connectLock = new CCriticalSection();
- // private Timer for auto reconnect
+ // private Timer for auto reconnect
private CTimer RetryTimer;
- ///
- /// Constructor
- ///
- /// unique string to differentiate between instances
- ///
- ///
- ///
+ ///
+ /// Constructor
+ ///
+ /// unique string to differentiate between instances
+ ///
+ ///
+ ///
public GenericTcpIpClient(string key, string address, int port, int bufferSize)
: base(key)
{
- StreamDebugging = new CommunicationStreamDebugging(key);
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- AutoReconnectIntervalMs = 5000;
- Hostname = address;
- Port = port;
- BufferSize = bufferSize;
-
- RetryTimer = new CTimer(o =>
- {
- Reconnect();
- }, Timeout.Infinite);
- }
-
- ///
- /// Constructor
- ///
- ///
- public GenericTcpIpClient(string key)
- : base(key)
+ StreamDebugging = new CommunicationStreamDebugging(key);
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ AutoReconnectIntervalMs = 5000;
+ Hostname = address;
+ Port = port;
+ BufferSize = bufferSize;
+
+ RetryTimer = new CTimer(o =>
{
- StreamDebugging = new CommunicationStreamDebugging(key);
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- AutoReconnectIntervalMs = 5000;
- BufferSize = 2000;
+ Reconnect();
+ }, Timeout.Infinite);
+ }
- RetryTimer = new CTimer(o =>
- {
- Reconnect();
- }, Timeout.Infinite);
- }
+ ///
+ /// Constructor
+ ///
+ ///
+ public GenericTcpIpClient(string key)
+ : base(key)
+ {
+ StreamDebugging = new CommunicationStreamDebugging(key);
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ AutoReconnectIntervalMs = 5000;
+ BufferSize = 2000;
- ///
- /// Default constructor for S+
- ///
- public GenericTcpIpClient()
- : base(SplusKey)
+ RetryTimer = new CTimer(o =>
{
- StreamDebugging = new CommunicationStreamDebugging(SplusKey);
+ Reconnect();
+ }, Timeout.Infinite);
+ }
+
+ ///
+ /// Default constructor for S+
+ ///
+ public GenericTcpIpClient()
+ : base(SplusKey)
+ {
+ StreamDebugging = new CommunicationStreamDebugging(SplusKey);
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
AutoReconnectIntervalMs = 5000;
- BufferSize = 2000;
+ BufferSize = 2000;
- RetryTimer = new CTimer(o =>
- {
- Reconnect();
- }, Timeout.Infinite);
+ RetryTimer = new CTimer(o =>
+ {
+ Reconnect();
+ }, Timeout.Infinite);
}
- ///
- /// Just to help S+ set the key
- ///
- public void Initialize(string key)
- {
- Key = key;
- }
+ ///
+ /// Just to help S+ set the key
+ ///
+ public void Initialize(string key)
+ {
+ Key = key;
+ }
- ///
- /// Handles closing this up when the program shuts down
- ///
- void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ ///
+ /// Handles closing this up when the program shuts down
+ ///
+ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ {
+ if (programEventType == eProgramStatusEventType.Stopping)
{
- if (programEventType == eProgramStatusEventType.Stopping)
- {
- Debug.Console(1, this, "Program stopping. Closing connection");
- Deactivate();
- }
+ Debug.Console(1, this, "Program stopping. Closing connection");
+ Deactivate();
}
+ }
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
public override bool Deactivate()
{
- RetryTimer.Stop();
- RetryTimer.Dispose();
- if (_client != null)
- {
- _client.SocketStatusChange -= this.Client_SocketStatusChange;
- DisconnectClient();
- }
+ RetryTimer.Stop();
+ RetryTimer.Dispose();
+ if (_client != null)
+ {
+ _client.SocketStatusChange -= this.Client_SocketStatusChange;
+ DisconnectClient();
+ }
return true;
}
- ///
- /// Attempts to connect to the server
- ///
+ ///
+ /// Attempts to connect to the server
+ ///
public void Connect()
{
- if (string.IsNullOrEmpty(Hostname))
+ if (string.IsNullOrEmpty(Hostname))
+ {
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': No address set", Key);
+ return;
+ }
+ if (Port < 1 || Port > 65535)
+ {
{
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': No address set", Key);
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': Invalid port", Key);
return;
}
- if (Port < 1 || Port > 65535)
- {
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': Invalid port", Key);
- return;
- }
- }
+ }
- try
+ try
+ {
+ connectLock.Enter();
+ if (IsConnected)
{
- connectLock.Enter();
- if (IsConnected)
- {
- Debug.Console(1, this, "Connection already connected. Exiting Connect()");
- }
- else
- {
- //Stop retry timer if running
- RetryTimer.Stop();
- _client = new TCPClient(Hostname, Port, BufferSize);
- _client.SocketStatusChange -= Client_SocketStatusChange;
- _client.SocketStatusChange += Client_SocketStatusChange;
- DisconnectCalledByUser = false;
- _client.ConnectToServerAsync(ConnectToServerCallback);
- }
+ Debug.Console(1, this, "Connection already connected. Exiting Connect()");
}
- finally
+ else
{
- connectLock.Leave();
+ //Stop retry timer if running
+ RetryTimer.Stop();
+ _client = new TCPClient(Hostname, Port, BufferSize);
+ _client.SocketStatusChange -= Client_SocketStatusChange;
+ _client.SocketStatusChange += Client_SocketStatusChange;
+ DisconnectCalledByUser = false;
+ _client.ConnectToServerAsync(ConnectToServerCallback);
}
+ }
+ finally
+ {
+ connectLock.Leave();
+ }
}
- private void Reconnect()
+ private void Reconnect()
+ {
+ if (_client == null)
{
- if (_client == null)
- {
- return;
- }
- try
+ return;
+ }
+ try
+ {
+ connectLock.Enter();
+ if (IsConnected || DisconnectCalledByUser == true)
{
- connectLock.Enter();
- if (IsConnected || DisconnectCalledByUser == true)
- {
- Debug.Console(1, this, "Reconnect no longer needed. Exiting Reconnect()");
- }
- else
- {
- Debug.Console(1, this, "Attempting reconnect now");
- _client.ConnectToServerAsync(ConnectToServerCallback);
- }
+ Debug.Console(1, this, "Reconnect no longer needed. Exiting Reconnect()");
}
- finally
+ else
{
- connectLock.Leave();
+ Debug.Console(1, this, "Attempting reconnect now");
+ _client.ConnectToServerAsync(ConnectToServerCallback);
}
}
+ finally
+ {
+ connectLock.Leave();
+ }
+ }
- ///
- /// Attempts to disconnect the client
- ///
+ ///
+ /// Attempts to disconnect the client
+ ///
public void Disconnect()
{
- try
- {
- connectLock.Enter();
- DisconnectCalledByUser = true;
+ try
+ {
+ connectLock.Enter();
+ DisconnectCalledByUser = true;
- // Stop trying reconnects, if we are
- RetryTimer.Stop();
- DisconnectClient();
- }
- finally
- {
- connectLock.Leave();
- }
+ // Stop trying reconnects, if we are
+ RetryTimer.Stop();
+ DisconnectClient();
+ }
+ finally
+ {
+ connectLock.Leave();
+ }
}
- ///
- /// Does the actual disconnect business
- ///
- public void DisconnectClient()
+ ///
+ /// Does the actual disconnect business
+ ///
+ public void DisconnectClient()
+ {
+ if (_client != null)
{
- if (_client != null)
- {
- Debug.Console(1, this, "Disconnecting client");
- if (IsConnected)
- _client.DisconnectFromServer();
- }
+ Debug.Console(1, this, "Disconnecting client");
+ if (IsConnected)
+ _client.DisconnectFromServer();
}
+ }
- ///
- /// Callback method for connection attempt
- ///
- ///
+ ///
+ /// Callback method for connection attempt
+ ///
+ ///
void ConnectToServerCallback(TCPClient c)
{
- if (c.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- Debug.Console(0, this, "Server connection result: {0}", c.ClientStatus);
- WaitAndTryReconnect();
- }
- else
- {
- Debug.Console(1, this, "Server connection result: {0}", c.ClientStatus);
- }
+ if (c.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
+ {
+ Debug.Console(0, this, "Server connection result: {0}", c.ClientStatus);
+ WaitAndTryReconnect();
+ }
+ else
+ {
+ Debug.Console(1, this, "Server connection result: {0}", c.ClientStatus);
+ }
}
- ///
- /// Disconnects, waits and attemtps to connect again
- ///
+ ///
+ /// Disconnects, waits and attemtps to connect again
+ ///
void WaitAndTryReconnect()
{
- CrestronInvoke.BeginInvoke(o =>
+ CrestronInvoke.BeginInvoke(o =>
+ {
+ try
{
- try
- {
- connectLock.Enter();
- if (!IsConnected && AutoReconnect && !DisconnectCalledByUser && _client != null)
- {
- DisconnectClient();
- Debug.Console(1, this, "Attempting reconnect, status={0}", _client.ClientStatus);
- RetryTimer.Reset(AutoReconnectIntervalMs);
- }
- }
- finally
+ connectLock.Enter();
+ if (!IsConnected && AutoReconnect && !DisconnectCalledByUser && _client != null)
{
- connectLock.Leave();
+ DisconnectClient();
+ Debug.Console(1, this, "Attempting reconnect, status={0}", _client.ClientStatus);
+ RetryTimer.Reset(AutoReconnectIntervalMs);
}
- });
+ }
+ finally
+ {
+ connectLock.Leave();
+ }
+ });
}
- ///
- /// Recieves incoming data
- ///
- ///
- ///
+ ///
+ /// Recieves incoming data
+ ///
+ ///
+ ///
void Receive(TCPClient client, int numBytes)
{
- if (client != null)
+ if (client != null)
+ {
+ if (numBytes > 0)
{
- if (numBytes > 0)
+ var bytes = client.IncomingDataBuffer.Take(numBytes).ToArray();
+ var bytesHandler = BytesReceived;
+ if (bytesHandler != null)
{
- var bytes = client.IncomingDataBuffer.Take(numBytes).ToArray();
- var bytesHandler = BytesReceived;
- if (bytesHandler != null)
+ if (StreamDebugging.RxStreamDebuggingIsEnabled)
{
- if (StreamDebugging.RxStreamDebuggingIsEnabled)
- {
- Debug.Console(0, this, "Received {1} bytes: '{0}'", ComTextHelper.GetEscapedText(bytes), bytes.Length);
- }
- bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
+ Debug.Console(0, this, "Received {1} bytes: '{0}'", ComTextHelper.GetEscapedText(bytes), bytes.Length);
}
- var textHandler = TextReceived;
- if (textHandler != null)
- {
- var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
+ bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
+ }
+ var textHandler = TextReceived;
+ if (textHandler != null)
+ {
+ var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
- if (StreamDebugging.RxStreamDebuggingIsEnabled)
- {
- Debug.Console(0, this, "Received {1} characters of text: '{0}'", ComTextHelper.GetDebugText(str), str.Length);
- }
+ if (StreamDebugging.RxStreamDebuggingIsEnabled)
+ {
+ Debug.Console(0, this, "Received {1} characters of text: '{0}'", ComTextHelper.GetDebugText(str), str.Length);
+ }
- textHandler(this, new GenericCommMethodReceiveTextArgs(str));
- }
- }
- client.ReceiveDataAsync(Receive);
+ textHandler(this, new GenericCommMethodReceiveTextArgs(str));
+ }
}
+ client.ReceiveDataAsync(Receive);
+ }
}
///
@@ -453,9 +453,9 @@ public void SendText(string text)
{
var bytes = Encoding.GetEncoding(28591).GetBytes(text);
// Check debug level before processing byte array
- if (StreamDebugging.TxStreamDebuggingIsEnabled)
- Debug.Console(0, this, "Sending {0} characters of text: '{1}'", text.Length, ComTextHelper.GetDebugText(text));
- if (_client != null)
+ if (StreamDebugging.TxStreamDebuggingIsEnabled)
+ Debug.Console(0, this, "Sending {0} characters of text: '{1}'", text.Length, ComTextHelper.GetDebugText(text));
+ if (_client != null)
_client.SendData(bytes, bytes.Length);
}
@@ -472,35 +472,35 @@ public void SendEscapedText(string text)
SendText(unescapedText);
}
- ///
- /// Sends Bytes to the server
- ///
- ///
+ ///
+ /// Sends Bytes to the server
+ ///
+ ///
public void SendBytes(byte[] bytes)
{
- if (StreamDebugging.TxStreamDebuggingIsEnabled)
- Debug.Console(0, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
- if (_client != null)
+ if (StreamDebugging.TxStreamDebuggingIsEnabled)
+ Debug.Console(0, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
+ if (_client != null)
_client.SendData(bytes, bytes.Length);
}
- ///
- /// Socket Status Change Handler
- ///
- ///
- ///
+ ///
+ /// Socket Status Change Handler
+ ///
+ ///
+ ///
void Client_SocketStatusChange(TCPClient client, SocketStatus clientSocketStatus)
{
- if (clientSocketStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- Debug.Console(0, this, "Socket status change {0} ({1})", clientSocketStatus, ClientStatusText);
- WaitAndTryReconnect();
- }
- else
- {
- Debug.Console(1, this, "Socket status change {0} ({1})", clientSocketStatus, ClientStatusText);
+ if (clientSocketStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
+ {
+ Debug.Console(0, this, "Socket status change {0} ({1})", clientSocketStatus, ClientStatusText);
+ WaitAndTryReconnect();
+ }
+ else
+ {
+ Debug.Console(1, this, "Socket status change {0} ({1})", clientSocketStatus, ClientStatusText);
_client.ReceiveDataAsync(Receive);
- }
+ }
var handler = ConnectionChange;
if (handler != null)
@@ -508,30 +508,30 @@ void Client_SocketStatusChange(TCPClient client, SocketStatus clientSocketStatus
}
}
- ///
- /// Configuration properties for TCP/SSH Connections
- ///
+///
+/// Configuration properties for TCP/SSH Connections
+///
public class TcpSshPropertiesConfig
{
- ///
- /// Address to connect to
- ///
+ ///
+ /// Address to connect to
+ ///
[JsonProperty(Required = Required.Always)]
public string Address { get; set; }
- ///
- /// Port to connect to
- ///
+ ///
+ /// Port to connect to
+ ///
[JsonProperty(Required = Required.Always)]
public int Port { get; set; }
- ///
- /// Username credential
- ///
+ ///
+ /// Username credential
+ ///
public string Username { get; set; }
- ///
- /// Passord credential
- ///
+ ///
+ /// Passord credential
+ ///
public string Password { get; set; }
///
@@ -549,18 +549,16 @@ public class TcpSshPropertiesConfig
///
public int AutoReconnectIntervalMs { get; set; }
- ///
- /// Default constructor
- ///
+ ///
+ /// Default constructor
+ ///
public TcpSshPropertiesConfig()
{
BufferSize = 32768;
AutoReconnect = true;
AutoReconnectIntervalMs = 5000;
- Username = "";
- Password = "";
+ Username = "";
+ Password = "";
}
}
-
-}
diff --git a/src/PepperDash.Core/Comm/GenericTcpIpClient_ForServer.cs b/src/PepperDash.Core/Comm/GenericTcpIpClient_ForServer.cs
index 03a278279..a1a0887f3 100644
--- a/src/PepperDash.Core/Comm/GenericTcpIpClient_ForServer.cs
+++ b/src/PepperDash.Core/Comm/GenericTcpIpClient_ForServer.cs
@@ -19,757 +19,755 @@ PepperDash Technology Corporation reserves all rights under applicable laws.
using Crestron.SimplSharp.CrestronSockets;
using PepperDash.Core.Logging;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Generic TCP/IP client for server
+///
+public class GenericTcpIpClient_ForServer : Device, IAutoReconnect
{
///
- /// Generic TCP/IP client for server
+ /// Band aid delegate for choked server
///
- public class GenericTcpIpClient_ForServer : Device, IAutoReconnect
- {
- ///
- /// Band aid delegate for choked server
- ///
- internal delegate void ConnectionHasHungCallbackDelegate();
+ internal delegate void ConnectionHasHungCallbackDelegate();
- #region Events
+ #region Events
- //public event EventHandler BytesReceived;
+ //public event EventHandler BytesReceived;
- ///
- /// Notifies of text received
- ///
- public event EventHandler TextReceived;
+ ///
+ /// Notifies of text received
+ ///
+ public event EventHandler TextReceived;
- ///
- /// Notifies of socket status change
- ///
- public event EventHandler ConnectionChange;
+ ///
+ /// Notifies of socket status change
+ ///
+ public event EventHandler ConnectionChange;
- ///
- /// This is something of a band-aid callback. If the client times out during the connection process, because the server
- /// is stuck, this will fire. It is intended to be used by the Server class monitor client, to help
- /// keep a watch on the server and reset it if necessary.
- ///
- internal ConnectionHasHungCallbackDelegate ConnectionHasHungCallback;
+ ///
+ /// This is something of a band-aid callback. If the client times out during the connection process, because the server
+ /// is stuck, this will fire. It is intended to be used by the Server class monitor client, to help
+ /// keep a watch on the server and reset it if necessary.
+ ///
+ internal ConnectionHasHungCallbackDelegate ConnectionHasHungCallback;
- ///
- /// For a client with a pre shared key, this will fire after the communication is established and the key exchange is complete. If you require
- /// a key and subscribe to the socket change event and try to send data on a connection the data sent will interfere with the key exchange and disconnect.
- ///
- public event EventHandler ClientReadyForCommunications;
+ ///
+ /// For a client with a pre shared key, this will fire after the communication is established and the key exchange is complete. If you require
+ /// a key and subscribe to the socket change event and try to send data on a connection the data sent will interfere with the key exchange and disconnect.
+ ///
+ public event EventHandler ClientReadyForCommunications;
- #endregion
+ #endregion
- #region Properties & Variables
+ #region Properties & Variables
- ///
- /// Address of server
- ///
- public string Hostname { get; set; }
+ ///
+ /// Address of server
+ ///
+ public string Hostname { get; set; }
- ///
- /// Port on server
- ///
- public int Port { get; set; }
+ ///
+ /// Port on server
+ ///
+ public int Port { get; set; }
- ///
- /// S+ helper
- ///
- public ushort UPort
- {
- get { return Convert.ToUInt16(Port); }
- set { Port = Convert.ToInt32(value); }
- }
+ ///
+ /// S+ helper
+ ///
+ public ushort UPort
+ {
+ get { return Convert.ToUInt16(Port); }
+ set { Port = Convert.ToInt32(value); }
+ }
- ///
- /// Bool to show whether the server requires a preshared key. This is used in the DynamicTCPServer class
- ///
- public bool SharedKeyRequired { get; set; }
+ ///
+ /// Bool to show whether the server requires a preshared key. This is used in the DynamicTCPServer class
+ ///
+ public bool SharedKeyRequired { get; set; }
- ///
- /// S+ helper for requires shared key bool
- ///
- public ushort USharedKeyRequired
+ ///
+ /// S+ helper for requires shared key bool
+ ///
+ public ushort USharedKeyRequired
+ {
+ set
{
- set
- {
- if (value == 1)
- SharedKeyRequired = true;
- else
- SharedKeyRequired = false;
- }
+ if (value == 1)
+ SharedKeyRequired = true;
+ else
+ SharedKeyRequired = false;
}
+ }
- ///
- /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module
- ///
- public string SharedKey { get; set; }
-
- ///
- /// flag to show the client is waiting for the server to send the shared key
- ///
- private bool WaitingForSharedKeyResponse { get; set; }
-
- ///
- /// Defaults to 2000
- ///
- public int BufferSize { get; set; }
-
- ///
- /// Semaphore on connect method
- ///
- bool IsTryingToConnect;
-
- ///
- /// Bool showing if socket is connected
- ///
- public bool IsConnected
- {
- get
- {
- if (Client != null)
- return Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED;
- else
- return false;
- }
- }
+ ///
+ /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module
+ ///
+ public string SharedKey { get; set; }
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsConnected
- {
- get { return (ushort)(IsConnected ? 1 : 0); }
- }
+ ///
+ /// flag to show the client is waiting for the server to send the shared key
+ ///
+ private bool WaitingForSharedKeyResponse { get; set; }
- ///
- /// Bool showing if socket is ready for communication after shared key exchange
- ///
- public bool IsReadyForCommunication { get; set; }
+ ///
+ /// Defaults to 2000
+ ///
+ public int BufferSize { get; set; }
- ///
- /// S+ helper for IsReadyForCommunication
- ///
- public ushort UIsReadyForCommunication
- {
- get { return (ushort)(IsReadyForCommunication ? 1 : 0); }
- }
+ ///
+ /// Semaphore on connect method
+ ///
+ bool IsTryingToConnect;
- ///
- /// Client socket status Read only
- ///
- public SocketStatus ClientStatus
+ ///
+ /// Bool showing if socket is connected
+ ///
+ public bool IsConnected
+ {
+ get
{
- get
- {
- if (Client != null)
- return Client.ClientStatus;
- else
- return SocketStatus.SOCKET_STATUS_NO_CONNECT;
- }
+ if (Client != null)
+ return Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED;
+ else
+ return false;
}
+ }
- ///
- /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
- /// and IsConnected would be true when this == 2.
- ///
- public ushort UStatus
- {
- get { return (ushort)ClientStatus; }
- }
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsConnected
+ {
+ get { return (ushort)(IsConnected ? 1 : 0); }
+ }
- ///
- /// Status text shows the message associated with socket status
- ///
- public string ClientStatusText { get { return ClientStatus.ToString(); } }
+ ///
+ /// Bool showing if socket is ready for communication after shared key exchange
+ ///
+ public bool IsReadyForCommunication { get; set; }
- ///
- /// bool to track if auto reconnect should be set on the socket
- ///
- public bool AutoReconnect { get; set; }
+ ///
+ /// S+ helper for IsReadyForCommunication
+ ///
+ public ushort UIsReadyForCommunication
+ {
+ get { return (ushort)(IsReadyForCommunication ? 1 : 0); }
+ }
- ///
- /// S+ helper for AutoReconnect
- ///
- public ushort UAutoReconnect
- {
- get { return (ushort)(AutoReconnect ? 1 : 0); }
- set { AutoReconnect = value == 1; }
- }
- ///
- /// Milliseconds to wait before attempting to reconnect. Defaults to 5000
- ///
- public int AutoReconnectIntervalMs { get; set; }
-
- ///
- /// Flag Set only when the disconnect method is called.
- ///
- bool DisconnectCalledByUser;
-
- ///
- /// private Timer for auto reconnect
- ///
- CTimer RetryTimer;
-
-
- ///
- ///
- ///
- public bool HeartbeatEnabled { get; set; }
-
- ///
- ///
- ///
- public ushort UHeartbeatEnabled
+ ///
+ /// Client socket status Read only
+ ///
+ public SocketStatus ClientStatus
+ {
+ get
{
- get { return (ushort)(HeartbeatEnabled ? 1 : 0); }
- set { HeartbeatEnabled = value == 1; }
+ if (Client != null)
+ return Client.ClientStatus;
+ else
+ return SocketStatus.SOCKET_STATUS_NO_CONNECT;
}
+ }
- ///
- ///
- ///
- public string HeartbeatString = "heartbeat";
-
- ///
- ///
- ///
- public int HeartbeatInterval = 50000;
-
- CTimer HeartbeatSendTimer;
- CTimer HeartbeatAckTimer;
- ///
- /// Used to force disconnection on a dead connect attempt
- ///
- CTimer ConnectFailTimer;
- CTimer WaitForSharedKey;
- private int ConnectionCount;
- ///
- /// Internal secure client
- ///
- TCPClient Client;
-
- bool ProgramIsStopping;
-
- #endregion
-
- #region Constructors
-
- ///
- /// Constructor
- ///
- ///
- ///
- ///
- ///
- public GenericTcpIpClient_ForServer(string key, string address, int port, int bufferSize)
- : base(key)
- {
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- Hostname = address;
- Port = port;
- BufferSize = bufferSize;
- AutoReconnectIntervalMs = 5000;
+ ///
+ /// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
+ /// and IsConnected would be true when this == 2.
+ ///
+ public ushort UStatus
+ {
+ get { return (ushort)ClientStatus; }
+ }
- }
+ ///
+ /// Status text shows the message associated with socket status
+ ///
+ public string ClientStatusText { get { return ClientStatus.ToString(); } }
+
+ ///
+ /// bool to track if auto reconnect should be set on the socket
+ ///
+ public bool AutoReconnect { get; set; }
+
+ ///
+ /// S+ helper for AutoReconnect
+ ///
+ public ushort UAutoReconnect
+ {
+ get { return (ushort)(AutoReconnect ? 1 : 0); }
+ set { AutoReconnect = value == 1; }
+ }
+ ///
+ /// Milliseconds to wait before attempting to reconnect. Defaults to 5000
+ ///
+ public int AutoReconnectIntervalMs { get; set; }
+
+ ///
+ /// Flag Set only when the disconnect method is called.
+ ///
+ bool DisconnectCalledByUser;
- ///
- /// Constructor for S+
- ///
- public GenericTcpIpClient_ForServer()
- : base("Uninitialized DynamicTcpClient")
+ ///
+ /// private Timer for auto reconnect
+ ///
+ CTimer RetryTimer;
+
+
+ ///
+ ///
+ ///
+ public bool HeartbeatEnabled { get; set; }
+
+ ///
+ ///
+ ///
+ public ushort UHeartbeatEnabled
+ {
+ get { return (ushort)(HeartbeatEnabled ? 1 : 0); }
+ set { HeartbeatEnabled = value == 1; }
+ }
+
+ ///
+ ///
+ ///
+ public string HeartbeatString = "heartbeat";
+
+ ///
+ ///
+ ///
+ public int HeartbeatInterval = 50000;
+
+ CTimer HeartbeatSendTimer;
+ CTimer HeartbeatAckTimer;
+ ///
+ /// Used to force disconnection on a dead connect attempt
+ ///
+ CTimer ConnectFailTimer;
+ CTimer WaitForSharedKey;
+ private int ConnectionCount;
+ ///
+ /// Internal secure client
+ ///
+ TCPClient Client;
+
+ bool ProgramIsStopping;
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
+ ///
+ ///
+ public GenericTcpIpClient_ForServer(string key, string address, int port, int bufferSize)
+ : base(key)
+ {
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ Hostname = address;
+ Port = port;
+ BufferSize = bufferSize;
+ AutoReconnectIntervalMs = 5000;
+
+ }
+
+ ///
+ /// Constructor for S+
+ ///
+ public GenericTcpIpClient_ForServer()
+ : base("Uninitialized DynamicTcpClient")
+ {
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ AutoReconnectIntervalMs = 5000;
+ BufferSize = 2000;
+ }
+ #endregion
+
+ #region Methods
+
+ ///
+ /// Just to help S+ set the key
+ ///
+ public void Initialize(string key)
+ {
+ Key = key;
+ }
+
+ ///
+ /// Handles closing this up when the program shuts down
+ ///
+ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ {
+ if (programEventType == eProgramStatusEventType.Stopping || programEventType == eProgramStatusEventType.Paused)
{
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- AutoReconnectIntervalMs = 5000;
- BufferSize = 2000;
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing Client connection");
+ ProgramIsStopping = true;
+ Disconnect();
}
- #endregion
- #region Methods
+ }
+
+ ///
+ /// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name.
+ ///
+ public void Connect()
+ {
+ ConnectionCount++;
+ Debug.Console(2, this, "Attempting connect Count:{0}", ConnectionCount);
+
- ///
- /// Just to help S+ set the key
- ///
- public void Initialize(string key)
+ if (IsConnected)
{
- Key = key;
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already connected. Ignoring.");
+ return;
}
-
- ///
- /// Handles closing this up when the program shuts down
- ///
- void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ if (IsTryingToConnect)
{
- if (programEventType == eProgramStatusEventType.Stopping || programEventType == eProgramStatusEventType.Paused)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing Client connection");
- ProgramIsStopping = true;
- Disconnect();
- }
-
+ Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already trying to connect. Ignoring.");
+ return;
}
-
- ///
- /// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name.
- ///
- public void Connect()
+ try
{
- ConnectionCount++;
- Debug.Console(2, this, "Attempting connect Count:{0}", ConnectionCount);
-
-
- if (IsConnected)
+ IsTryingToConnect = true;
+ if (RetryTimer != null)
+ {
+ RetryTimer.Stop();
+ RetryTimer = null;
+ }
+ if (string.IsNullOrEmpty(Hostname))
{
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already connected. Ignoring.");
+ Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No address set");
return;
}
- if (IsTryingToConnect)
+ if (Port < 1 || Port > 65535)
{
- Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Already trying to connect. Ignoring.");
+ Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: Invalid port");
return;
}
- try
+ if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
{
- IsTryingToConnect = true;
- if (RetryTimer != null)
- {
- RetryTimer.Stop();
- RetryTimer = null;
- }
- if (string.IsNullOrEmpty(Hostname))
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No address set");
- return;
- }
- if (Port < 1 || Port > 65535)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: Invalid port");
- return;
- }
- if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No Shared Key set");
- return;
- }
+ Debug.Console(0, this, Debug.ErrorLogLevel.Warning, "DynamicTcpClient: No Shared Key set");
+ return;
+ }
- // clean up previous client
- if (Client != null)
- {
- Cleanup();
- }
- DisconnectCalledByUser = false;
+ // clean up previous client
+ if (Client != null)
+ {
+ Cleanup();
+ }
+ DisconnectCalledByUser = false;
- Client = new TCPClient(Hostname, Port, BufferSize);
- Client.SocketStatusChange += Client_SocketStatusChange;
- if(HeartbeatEnabled)
- Client.SocketSendOrReceiveTimeOutInMs = (HeartbeatInterval * 5);
- Client.AddressClientConnectedTo = Hostname;
- Client.PortNumber = Port;
- // SecureClient = c;
+ Client = new TCPClient(Hostname, Port, BufferSize);
+ Client.SocketStatusChange += Client_SocketStatusChange;
+ if(HeartbeatEnabled)
+ Client.SocketSendOrReceiveTimeOutInMs = (HeartbeatInterval * 5);
+ Client.AddressClientConnectedTo = Hostname;
+ Client.PortNumber = Port;
+ // SecureClient = c;
- //var timeOfConnect = DateTime.Now.ToString("HH:mm:ss.fff");
+ //var timeOfConnect = DateTime.Now.ToString("HH:mm:ss.fff");
- ConnectFailTimer = new CTimer(o =>
+ ConnectFailTimer = new CTimer(o =>
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Connect attempt has not finished after 30sec Count:{0}", ConnectionCount);
+ if (IsTryingToConnect)
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Connect attempt has not finished after 30sec Count:{0}", ConnectionCount);
- if (IsTryingToConnect)
- {
- IsTryingToConnect = false;
-
- //if (ConnectionHasHungCallback != null)
- //{
- // ConnectionHasHungCallback();
- //}
- //SecureClient.DisconnectFromServer();
- //CheckClosedAndTryReconnect();
- }
- }, 30000);
+ IsTryingToConnect = false;
- Debug.Console(2, this, "Making Connection Count:{0}", ConnectionCount);
- Client.ConnectToServerAsync(o =>
+ //if (ConnectionHasHungCallback != null)
+ //{
+ // ConnectionHasHungCallback();
+ //}
+ //SecureClient.DisconnectFromServer();
+ //CheckClosedAndTryReconnect();
+ }
+ }, 30000);
+
+ Debug.Console(2, this, "Making Connection Count:{0}", ConnectionCount);
+ Client.ConnectToServerAsync(o =>
+ {
+ Debug.Console(2, this, "ConnectToServerAsync Count:{0} Ran!", ConnectionCount);
+
+ if (ConnectFailTimer != null)
{
- Debug.Console(2, this, "ConnectToServerAsync Count:{0} Ran!", ConnectionCount);
+ ConnectFailTimer.Stop();
+ }
+ IsTryingToConnect = false;
- if (ConnectFailTimer != null)
- {
- ConnectFailTimer.Stop();
- }
- IsTryingToConnect = false;
+ if (o.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ {
+ Debug.Console(2, this, "Client connected to {0} on port {1}", o.AddressClientConnectedTo, o.LocalPortNumberOfClient);
+ o.ReceiveDataAsync(Receive);
- if (o.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ if (SharedKeyRequired)
{
- Debug.Console(2, this, "Client connected to {0} on port {1}", o.AddressClientConnectedTo, o.LocalPortNumberOfClient);
- o.ReceiveDataAsync(Receive);
-
- if (SharedKeyRequired)
- {
- WaitingForSharedKeyResponse = true;
- WaitForSharedKey = new CTimer(timer =>
- {
-
- Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Shared key exchange timer expired. IsReadyForCommunication={0}", IsReadyForCommunication);
- // Debug.Console(1, this, "Connect attempt failed {0}", c.ClientStatus);
- // This is the only case where we should call DisconectFromServer...Event handeler will trigger the cleanup
- o.DisconnectFromServer();
- //CheckClosedAndTryReconnect();
- //OnClientReadyForcommunications(false); // Should send false event
- }, 15000);
- }
- else
+ WaitingForSharedKeyResponse = true;
+ WaitForSharedKey = new CTimer(timer =>
{
- //CLient connected and shared key is not required so just raise the ready for communication event. if Shared key
- //required this is called by the shared key being negotiated
- if (IsReadyForCommunication == false)
- {
- OnClientReadyForcommunications(true); // Key not required
- }
- }
+
+ Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Shared key exchange timer expired. IsReadyForCommunication={0}", IsReadyForCommunication);
+ // Debug.Console(1, this, "Connect attempt failed {0}", c.ClientStatus);
+ // This is the only case where we should call DisconectFromServer...Event handeler will trigger the cleanup
+ o.DisconnectFromServer();
+ //CheckClosedAndTryReconnect();
+ //OnClientReadyForcommunications(false); // Should send false event
+ }, 15000);
}
else
{
- Debug.Console(1, this, "Connect attempt failed {0}", o.ClientStatus);
- CheckClosedAndTryReconnect();
+ //CLient connected and shared key is not required so just raise the ready for communication event. if Shared key
+ //required this is called by the shared key being negotiated
+ if (IsReadyForCommunication == false)
+ {
+ OnClientReadyForcommunications(true); // Key not required
+ }
}
- });
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Client connection exception: {0}", ex.Message);
- IsTryingToConnect = false;
- CheckClosedAndTryReconnect();
- }
+ }
+ else
+ {
+ Debug.Console(1, this, "Connect attempt failed {0}", o.ClientStatus);
+ CheckClosedAndTryReconnect();
+ }
+ });
+ }
+ catch (Exception ex)
+ {
+ Debug.Console(0, this, Debug.ErrorLogLevel.Error, "Client connection exception: {0}", ex.Message);
+ IsTryingToConnect = false;
+ CheckClosedAndTryReconnect();
}
+ }
+
+ ///
+ ///
+ ///
+ public void Disconnect()
+ {
+ this.LogVerbose("Disconnect Called");
- ///
- ///
- ///
- public void Disconnect()
+ DisconnectCalledByUser = true;
+ if (IsConnected)
{
- this.LogVerbose("Disconnect Called");
+ Client.DisconnectFromServer();
- DisconnectCalledByUser = true;
- if (IsConnected)
- {
- Client.DisconnectFromServer();
+ }
+ if (RetryTimer != null)
+ {
+ RetryTimer.Stop();
+ RetryTimer = null;
+ }
+ Cleanup();
+ }
- }
+ ///
+ /// Internal call to close up client. ALWAYS use this when disconnecting.
+ ///
+ void Cleanup()
+ {
+ IsTryingToConnect = false;
+
+ if (Client != null)
+ {
+ //SecureClient.DisconnectFromServer();
+ Debug.Console(2, this, "Disconnecting Client {0}", DisconnectCalledByUser ? ", Called by user" : "");
+ Client.SocketStatusChange -= Client_SocketStatusChange;
+ Client.Dispose();
+ Client = null;
+ }
+ if (ConnectFailTimer != null)
+ {
+ ConnectFailTimer.Stop();
+ ConnectFailTimer.Dispose();
+ ConnectFailTimer = null;
+ }
+ }
+
+
+ /// ff
+ /// Called from Connect failure or Socket Status change if
+ /// auto reconnect and socket disconnected (Not disconnected by user)
+ ///
+ void CheckClosedAndTryReconnect()
+ {
+ if (Client != null)
+ {
+ Debug.Console(2, this, "Cleaning up remotely closed/failed connection.");
+ Cleanup();
+ }
+ if (!DisconnectCalledByUser && AutoReconnect)
+ {
+ var halfInterval = AutoReconnectIntervalMs / 2;
+ var rndTime = new Random().Next(-halfInterval, halfInterval) + AutoReconnectIntervalMs;
+ Debug.Console(2, this, "Attempting reconnect in {0} ms, randomized", rndTime);
if (RetryTimer != null)
{
RetryTimer.Stop();
RetryTimer = null;
}
- Cleanup();
+ RetryTimer = new CTimer(o => Connect(), rndTime);
}
+ }
- ///
- /// Internal call to close up client. ALWAYS use this when disconnecting.
- ///
- void Cleanup()
+ ///
+ /// Receive callback
+ ///
+ ///
+ ///
+ void Receive(TCPClient client, int numBytes)
+ {
+ if (numBytes > 0)
{
- IsTryingToConnect = false;
+ string str = string.Empty;
- if (Client != null)
+ try
{
- //SecureClient.DisconnectFromServer();
- Debug.Console(2, this, "Disconnecting Client {0}", DisconnectCalledByUser ? ", Called by user" : "");
- Client.SocketStatusChange -= Client_SocketStatusChange;
- Client.Dispose();
- Client = null;
+ var bytes = client.IncomingDataBuffer.Take(numBytes).ToArray();
+ str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
+ Debug.Console(2, this, "Client Received:\r--------\r{0}\r--------", str);
+ if (!string.IsNullOrEmpty(checkHeartbeat(str)))
+ {
+ if (SharedKeyRequired && str == "SharedKey:")
+ {
+ Debug.Console(2, this, "Server asking for shared key, sending");
+ SendText(SharedKey + "\n");
+ }
+ else if (SharedKeyRequired && str == "Shared Key Match")
+ {
+ StopWaitForSharedKeyTimer();
+ Debug.Console(2, this, "Shared key confirmed. Ready for communication");
+ OnClientReadyForcommunications(true); // Successful key exchange
+ }
+ else
+ {
+ //var bytesHandler = BytesReceived;
+ //if (bytesHandler != null)
+ // bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
+ var textHandler = TextReceived;
+ if (textHandler != null)
+ textHandler(this, new GenericTcpServerCommMethodReceiveTextArgs(str));
+ }
+ }
}
- if (ConnectFailTimer != null)
+ catch (Exception ex)
{
- ConnectFailTimer.Stop();
- ConnectFailTimer.Dispose();
- ConnectFailTimer = null;
+ Debug.Console(1, this, "Error receiving data: {1}. Error: {0}", ex.Message, str);
}
}
+ if (client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ client.ReceiveDataAsync(Receive);
+ }
-
- /// ff
- /// Called from Connect failure or Socket Status change if
- /// auto reconnect and socket disconnected (Not disconnected by user)
- ///
- void CheckClosedAndTryReconnect()
+ void HeartbeatStart()
+ {
+ if (HeartbeatEnabled)
{
- if (Client != null)
+ Debug.Console(2, this, "Starting Heartbeat");
+ if (HeartbeatSendTimer == null)
{
- Debug.Console(2, this, "Cleaning up remotely closed/failed connection.");
- Cleanup();
+
+ HeartbeatSendTimer = new CTimer(this.SendHeartbeat, null, HeartbeatInterval, HeartbeatInterval);
}
- if (!DisconnectCalledByUser && AutoReconnect)
+ if (HeartbeatAckTimer == null)
{
- var halfInterval = AutoReconnectIntervalMs / 2;
- var rndTime = new Random().Next(-halfInterval, halfInterval) + AutoReconnectIntervalMs;
- Debug.Console(2, this, "Attempting reconnect in {0} ms, randomized", rndTime);
- if (RetryTimer != null)
- {
- RetryTimer.Stop();
- RetryTimer = null;
- }
- RetryTimer = new CTimer(o => Connect(), rndTime);
+ HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
}
}
- ///
- /// Receive callback
- ///
- ///
- ///
- void Receive(TCPClient client, int numBytes)
+ }
+ void HeartbeatStop()
+ {
+
+ if (HeartbeatSendTimer != null)
{
- if (numBytes > 0)
- {
- string str = string.Empty;
+ Debug.Console(2, this, "Stoping Heartbeat Send");
+ HeartbeatSendTimer.Stop();
+ HeartbeatSendTimer = null;
+ }
+ if (HeartbeatAckTimer != null)
+ {
+ Debug.Console(2, this, "Stoping Heartbeat Ack");
+ HeartbeatAckTimer.Stop();
+ HeartbeatAckTimer = null;
+ }
+
+ }
+ void SendHeartbeat(object notused)
+ {
+ this.SendText(HeartbeatString);
+ Debug.Console(2, this, "Sending Heartbeat");
- try
+ }
+
+ //private method to check heartbeat requirements and start or reset timer
+ string checkHeartbeat(string received)
+ {
+ try
+ {
+ if (HeartbeatEnabled)
+ {
+ if (!string.IsNullOrEmpty(HeartbeatString))
{
- var bytes = client.IncomingDataBuffer.Take(numBytes).ToArray();
- str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
- Debug.Console(2, this, "Client Received:\r--------\r{0}\r--------", str);
- if (!string.IsNullOrEmpty(checkHeartbeat(str)))
+ var remainingText = received.Replace(HeartbeatString, "");
+ var noDelimiter = received.Trim(new char[] { '\r', '\n' });
+ if (noDelimiter.Contains(HeartbeatString))
{
- if (SharedKeyRequired && str == "SharedKey:")
- {
- Debug.Console(2, this, "Server asking for shared key, sending");
- SendText(SharedKey + "\n");
- }
- else if (SharedKeyRequired && str == "Shared Key Match")
+ if (HeartbeatAckTimer != null)
{
- StopWaitForSharedKeyTimer();
- Debug.Console(2, this, "Shared key confirmed. Ready for communication");
- OnClientReadyForcommunications(true); // Successful key exchange
+ HeartbeatAckTimer.Reset(HeartbeatInterval * 2);
}
else
{
- //var bytesHandler = BytesReceived;
- //if (bytesHandler != null)
- // bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
- var textHandler = TextReceived;
- if (textHandler != null)
- textHandler(this, new GenericTcpServerCommMethodReceiveTextArgs(str));
+ HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
}
+ Debug.Console(2, this, "Heartbeat Received: {0}, from Server", HeartbeatString);
+ return remainingText;
}
- }
- catch (Exception ex)
- {
- Debug.Console(1, this, "Error receiving data: {1}. Error: {0}", ex.Message, str);
- }
+ }
}
- if (client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
- client.ReceiveDataAsync(Receive);
}
-
- void HeartbeatStart()
+ catch (Exception ex)
{
- if (HeartbeatEnabled)
- {
- Debug.Console(2, this, "Starting Heartbeat");
- if (HeartbeatSendTimer == null)
- {
+ Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
+ }
+ return received;
+ }
- HeartbeatSendTimer = new CTimer(this.SendHeartbeat, null, HeartbeatInterval, HeartbeatInterval);
- }
- if (HeartbeatAckTimer == null)
- {
- HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
- }
- }
- }
- void HeartbeatStop()
+
+ void HeartbeatAckTimerFail(object o)
+ {
+ try
{
- if (HeartbeatSendTimer != null)
- {
- Debug.Console(2, this, "Stoping Heartbeat Send");
- HeartbeatSendTimer.Stop();
- HeartbeatSendTimer = null;
- }
- if (HeartbeatAckTimer != null)
+ if (IsConnected)
{
- Debug.Console(2, this, "Stoping Heartbeat Ack");
- HeartbeatAckTimer.Stop();
- HeartbeatAckTimer = null;
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "Heartbeat not received from Server...DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE");
+ SendText("Heartbeat not received by server, closing connection");
+ CheckClosedAndTryReconnect();
}
}
- void SendHeartbeat(object notused)
+ catch (Exception ex)
{
- this.SendText(HeartbeatString);
- Debug.Console(2, this, "Sending Heartbeat");
+ ErrorLog.Error("Heartbeat timeout Error on Client: {0}, {1}", Key, ex);
+ }
+ }
+ ///
+ ///
+ ///
+ void StopWaitForSharedKeyTimer()
+ {
+ if (WaitForSharedKey != null)
+ {
+ WaitForSharedKey.Stop();
+ WaitForSharedKey = null;
}
+ }
- //private method to check heartbeat requirements and start or reset timer
- string checkHeartbeat(string received)
+ ///
+ /// General send method
+ ///
+ public void SendText(string text)
+ {
+ if (!string.IsNullOrEmpty(text))
{
try
{
- if (HeartbeatEnabled)
+ var bytes = Encoding.GetEncoding(28591).GetBytes(text);
+ if (Client != null && Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
{
- if (!string.IsNullOrEmpty(HeartbeatString))
+ Client.SendDataAsync(bytes, bytes.Length, (c, n) =>
{
- var remainingText = received.Replace(HeartbeatString, "");
- var noDelimiter = received.Trim(new char[] { '\r', '\n' });
- if (noDelimiter.Contains(HeartbeatString))
+ // HOW IN THE HELL DO WE CATCH AN EXCEPTION IN SENDING?????
+ if (n <= 0)
{
- if (HeartbeatAckTimer != null)
- {
- HeartbeatAckTimer.Reset(HeartbeatInterval * 2);
- }
- else
- {
- HeartbeatAckTimer = new CTimer(HeartbeatAckTimerFail, null, (HeartbeatInterval * 2), (HeartbeatInterval * 2));
- }
- Debug.Console(2, this, "Heartbeat Received: {0}, from Server", HeartbeatString);
- return remainingText;
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "[{0}] Sent zero bytes. Was there an error?", this.Key);
}
- }
+ });
}
}
catch (Exception ex)
{
- Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
+ Debug.Console(0, this, "Error sending text: {1}. Error: {0}", ex.Message, text);
}
- return received;
}
+ }
-
-
- void HeartbeatAckTimerFail(object o)
+ ///
+ ///
+ ///
+ public void SendBytes(byte[] bytes)
+ {
+ if (bytes.Length > 0)
{
try
{
-
- if (IsConnected)
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "Heartbeat not received from Server...DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE");
- SendText("Heartbeat not received by server, closing connection");
- CheckClosedAndTryReconnect();
- }
-
+ if (Client != null && Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
+ Client.SendData(bytes, bytes.Length);
}
catch (Exception ex)
{
- ErrorLog.Error("Heartbeat timeout Error on Client: {0}, {1}", Key, ex);
+ Debug.Console(0, this, "Error sending bytes. Error: {0}", ex.Message);
}
}
+ }
- ///
- ///
- ///
- void StopWaitForSharedKeyTimer()
+ ///
+ /// SocketStatusChange Callback
+ ///
+ ///
+ ///
+ void Client_SocketStatusChange(TCPClient client, SocketStatus clientSocketStatus)
+ {
+ if (ProgramIsStopping)
{
- if (WaitForSharedKey != null)
- {
- WaitForSharedKey.Stop();
- WaitForSharedKey = null;
- }
+ ProgramIsStopping = false;
+ return;
}
-
- ///
- /// General send method
- ///
- public void SendText(string text)
+ try
{
- if (!string.IsNullOrEmpty(text))
- {
- try
- {
- var bytes = Encoding.GetEncoding(28591).GetBytes(text);
- if (Client != null && Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- Client.SendDataAsync(bytes, bytes.Length, (c, n) =>
- {
- // HOW IN THE HELL DO WE CATCH AN EXCEPTION IN SENDING?????
- if (n <= 0)
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "[{0}] Sent zero bytes. Was there an error?", this.Key);
- }
- });
- }
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, "Error sending text: {1}. Error: {0}", ex.Message, text);
- }
- }
- }
+ Debug.Console(2, this, "Socket status change: {0} ({1})", client.ClientStatus, (ushort)(client.ClientStatus));
- ///
- ///
- ///
- public void SendBytes(byte[] bytes)
- {
- if (bytes.Length > 0)
+ OnConnectionChange();
+
+ // The client could be null or disposed by this time...
+ if (Client == null || Client.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
{
- try
- {
- if (Client != null && Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED)
- Client.SendData(bytes, bytes.Length);
- }
- catch (Exception ex)
- {
- Debug.Console(0, this, "Error sending bytes. Error: {0}", ex.Message);
- }
+ HeartbeatStop();
+ OnClientReadyForcommunications(false); // socket has gone low
+ CheckClosedAndTryReconnect();
}
}
-
- ///
- /// SocketStatusChange Callback
- ///
- ///
- ///
- void Client_SocketStatusChange(TCPClient client, SocketStatus clientSocketStatus)
+ catch (Exception ex)
{
- if (ProgramIsStopping)
- {
- ProgramIsStopping = false;
- return;
- }
- try
- {
- Debug.Console(2, this, "Socket status change: {0} ({1})", client.ClientStatus, (ushort)(client.ClientStatus));
-
- OnConnectionChange();
-
- // The client could be null or disposed by this time...
- if (Client == null || Client.ClientStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- HeartbeatStop();
- OnClientReadyForcommunications(false); // socket has gone low
- CheckClosedAndTryReconnect();
- }
- }
- catch (Exception ex)
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Error in socket status change callback. Error: {0}\r\r{1}", ex, ex.InnerException);
- }
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Error in socket status change callback. Error: {0}\r\r{1}", ex, ex.InnerException);
}
+ }
- ///
- /// Helper for ConnectionChange event
- ///
- void OnConnectionChange()
- {
- var handler = ConnectionChange;
- if (handler != null)
- ConnectionChange(this, new GenericTcpServerSocketStatusChangeEventArgs(this, Client.ClientStatus));
- }
+ ///
+ /// Helper for ConnectionChange event
+ ///
+ void OnConnectionChange()
+ {
+ var handler = ConnectionChange;
+ if (handler != null)
+ ConnectionChange(this, new GenericTcpServerSocketStatusChangeEventArgs(this, Client.ClientStatus));
+ }
- ///
- /// Helper to fire ClientReadyForCommunications event
- ///
- void OnClientReadyForcommunications(bool isReady)
- {
- IsReadyForCommunication = isReady;
- if (this.IsReadyForCommunication) { HeartbeatStart(); }
- var handler = ClientReadyForCommunications;
- if (handler != null)
- handler(this, new GenericTcpServerClientReadyForcommunicationsEventArgs(IsReadyForCommunication));
- }
- #endregion
+ ///
+ /// Helper to fire ClientReadyForCommunications event
+ ///
+ void OnClientReadyForcommunications(bool isReady)
+ {
+ IsReadyForCommunication = isReady;
+ if (this.IsReadyForCommunication) { HeartbeatStart(); }
+ var handler = ClientReadyForCommunications;
+ if (handler != null)
+ handler(this, new GenericTcpServerClientReadyForcommunicationsEventArgs(IsReadyForCommunication));
}
-
-}
\ No newline at end of file
+ #endregion
+}
diff --git a/src/PepperDash.Core/Comm/GenericTcpIpServer.cs b/src/PepperDash.Core/Comm/GenericTcpIpServer.cs
index 6aa5e6b50..3dce88953 100644
--- a/src/PepperDash.Core/Comm/GenericTcpIpServer.cs
+++ b/src/PepperDash.Core/Comm/GenericTcpIpServer.cs
@@ -17,578 +17,563 @@ PepperDash Technology Corporation reserves all rights under applicable laws.
using Crestron.SimplSharp.CrestronSockets;
using PepperDash.Core.Logging;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Generic TCP/IP server device
+///
+public class GenericTcpIpServer : Device
{
+ #region Events
///
- /// Generic TCP/IP server device
+ /// Event for Receiving text
///
- public class GenericTcpIpServer : Device
- {
- #region Events
- ///
- /// Event for Receiving text
- ///
- public event EventHandler TextReceived;
+ public event EventHandler TextReceived;
- ///
- /// Event for client connection socket status change
- ///
- public event EventHandler ClientConnectionChange;
+ ///
+ /// Event for client connection socket status change
+ ///
+ public event EventHandler ClientConnectionChange;
- ///
- /// Event for Server State Change
- ///
- public event EventHandler ServerStateChange;
+ ///
+ /// Event for Server State Change
+ ///
+ public event EventHandler ServerStateChange;
- ///
- /// For a server with a pre shared key, this will fire after the communication is established and the key exchange is complete. If no shared key, this will fire
- /// after connection is successful. Use this event to know when the client is ready for communication to avoid stepping on shared key.
- ///
- public event EventHandler ServerClientReadyForCommunications;
+ ///
+ /// For a server with a pre shared key, this will fire after the communication is established and the key exchange is complete. If no shared key, this will fire
+ /// after connection is successful. Use this event to know when the client is ready for communication to avoid stepping on shared key.
+ ///
+ public event EventHandler ServerClientReadyForCommunications;
- ///
- /// A band aid event to notify user that the server has choked.
- ///
- public ServerHasChokedCallbackDelegate ServerHasChoked { get; set; }
+ ///
+ /// A band aid event to notify user that the server has choked.
+ ///
+ public ServerHasChokedCallbackDelegate ServerHasChoked { get; set; }
- ///
- ///
- ///
- public delegate void ServerHasChokedCallbackDelegate();
+ ///
+ ///
+ ///
+ public delegate void ServerHasChokedCallbackDelegate();
- #endregion
+ #endregion
- #region Properties/Variables
+ #region Properties/Variables
- ///
- ///
- ///
- CCriticalSection ServerCCSection = new CCriticalSection();
+ ///
+ ///
+ ///
+ CCriticalSection ServerCCSection = new CCriticalSection();
- ///
- /// A bandaid client that monitors whether the server is reachable
- ///
- GenericTcpIpClient_ForServer MonitorClient;
+ ///
+ /// A bandaid client that monitors whether the server is reachable
+ ///
+ GenericTcpIpClient_ForServer MonitorClient;
- ///
- /// Timer to operate the bandaid monitor client in a loop.
- ///
- CTimer MonitorClientTimer;
+ ///
+ /// Timer to operate the bandaid monitor client in a loop.
+ ///
+ CTimer MonitorClientTimer;
- ///
- ///
- ///
- int MonitorClientFailureCount;
+ ///
+ ///
+ ///
+ int MonitorClientFailureCount;
- ///
- /// 3 by default
- ///
- public int MonitorClientMaxFailureCount { get; set; }
+ ///
+ /// 3 by default
+ ///
+ public int MonitorClientMaxFailureCount { get; set; }
- ///
- /// Text representation of the Socket Status enum values for the server
- ///
- public string Status
+ ///
+ /// Text representation of the Socket Status enum values for the server
+ ///
+ public string Status
+ {
+ get
{
- get
- {
- if (myTcpServer != null)
- return myTcpServer.State.ToString();
- return ServerState.SERVER_NOT_LISTENING.ToString();
-
- }
+ if (myTcpServer != null)
+ return myTcpServer.State.ToString();
+ return ServerState.SERVER_NOT_LISTENING.ToString();
}
- ///
- /// Bool showing if socket is connected
- ///
- public bool IsConnected
+ }
+
+ ///
+ /// Bool showing if socket is connected
+ ///
+ public bool IsConnected
+ {
+ get
{
- get
- {
- if (myTcpServer != null)
- return (myTcpServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED;
- return false;
+ if (myTcpServer != null)
+ return (myTcpServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED;
+ return false;
- //return (Secure ? SecureServer != null : UnsecureServer != null) &&
- //(Secure ? (SecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED :
- // (UnsecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED);
- }
+ //return (Secure ? SecureServer != null : UnsecureServer != null) &&
+ //(Secure ? (SecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED :
+ // (UnsecureServer.State & ServerState.SERVER_CONNECTED) == ServerState.SERVER_CONNECTED);
}
+ }
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsConnected
- {
- get { return (ushort)(IsConnected ? 1 : 0); }
- }
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsConnected
+ {
+ get { return (ushort)(IsConnected ? 1 : 0); }
+ }
- ///
- /// Bool showing if socket is connected
- ///
- public bool IsListening
+ ///
+ /// Bool showing if socket is connected
+ ///
+ public bool IsListening
+ {
+ get
{
- get
- {
- if (myTcpServer != null)
- return (myTcpServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING;
- else
- return false;
- //return (Secure ? SecureServer != null : UnsecureServer != null) &&
- //(Secure ? (SecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING :
- // (UnsecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING);
- }
+ if (myTcpServer != null)
+ return (myTcpServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING;
+ else
+ return false;
+ //return (Secure ? SecureServer != null : UnsecureServer != null) &&
+ //(Secure ? (SecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING :
+ // (UnsecureServer.State & ServerState.SERVER_LISTENING) == ServerState.SERVER_LISTENING);
}
+ }
- ///
- /// S+ helper for IsConnected
- ///
- public ushort UIsListening
- {
- get { return (ushort)(IsListening ? 1 : 0); }
- }
+ ///
+ /// S+ helper for IsConnected
+ ///
+ public ushort UIsListening
+ {
+ get { return (ushort)(IsListening ? 1 : 0); }
+ }
- ///
- /// The maximum number of clients.
- /// Should be set by parameter in SIMPL+ in the MAIN method, Should not ever need to be configurable
- ///
- public ushort MaxClients { get; set; }
+ ///
+ /// The maximum number of clients.
+ /// Should be set by parameter in SIMPL+ in the MAIN method, Should not ever need to be configurable
+ ///
+ public ushort MaxClients { get; set; }
- ///
- /// Number of clients currently connected.
- ///
- public ushort NumberOfClientsConnected
+ ///
+ /// Number of clients currently connected.
+ ///
+ public ushort NumberOfClientsConnected
+ {
+ get
{
- get
- {
- if (myTcpServer != null)
- return (ushort)myTcpServer.NumberOfClientsConnected;
- return 0;
- }
+ if (myTcpServer != null)
+ return (ushort)myTcpServer.NumberOfClientsConnected;
+ return 0;
}
+ }
- ///
- /// Port Server should listen on
- ///
- public int Port { get; set; }
+ ///
+ /// Port Server should listen on
+ ///
+ public int Port { get; set; }
- ///
- /// S+ helper for Port
- ///
- public ushort UPort
- {
- get { return Convert.ToUInt16(Port); }
- set { Port = Convert.ToInt32(value); }
- }
+ ///
+ /// S+ helper for Port
+ ///
+ public ushort UPort
+ {
+ get { return Convert.ToUInt16(Port); }
+ set { Port = Convert.ToInt32(value); }
+ }
- ///
- /// Bool to show whether the server requires a preshared key. Must be set the same in the client, and if true shared keys must be identical on server/client
- ///
- public bool SharedKeyRequired { get; set; }
+ ///
+ /// Bool to show whether the server requires a preshared key. Must be set the same in the client, and if true shared keys must be identical on server/client
+ ///
+ public bool SharedKeyRequired { get; set; }
- ///
- /// S+ helper for requires shared key bool
- ///
- public ushort USharedKeyRequired
+ ///
+ /// S+ helper for requires shared key bool
+ ///
+ public ushort USharedKeyRequired
+ {
+ set
{
- set
- {
- if (value == 1)
- SharedKeyRequired = true;
- else
- SharedKeyRequired = false;
- }
+ if (value == 1)
+ SharedKeyRequired = true;
+ else
+ SharedKeyRequired = false;
}
+ }
- ///
- /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module.
- /// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called
- ///
- public string SharedKey { get; set; }
+ ///
+ /// SharedKey is sent for varification to the server. Shared key can be any text (255 char limit in SIMPL+ Module), but must match the Shared Key on the Server module.
+ /// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called
+ ///
+ public string SharedKey { get; set; }
- ///
- /// Heartbeat Required bool sets whether server disconnects client if heartbeat is not received
- ///
- public bool HeartbeatRequired { get; set; }
+ ///
+ /// Heartbeat Required bool sets whether server disconnects client if heartbeat is not received
+ ///
+ public bool HeartbeatRequired { get; set; }
- ///
- /// S+ Helper for Heartbeat Required
- ///
- public ushort UHeartbeatRequired
+ ///
+ /// S+ Helper for Heartbeat Required
+ ///
+ public ushort UHeartbeatRequired
+ {
+ set
{
- set
- {
- if (value == 1)
- HeartbeatRequired = true;
- else
- HeartbeatRequired = false;
- }
+ if (value == 1)
+ HeartbeatRequired = true;
+ else
+ HeartbeatRequired = false;
}
+ }
- ///
- /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+
- ///
- public int HeartbeatRequiredIntervalMs { get; set; }
+ ///
+ /// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+
+ ///
+ public int HeartbeatRequiredIntervalMs { get; set; }
- ///
- /// Simpl+ Heartbeat Analog value in seconds
- ///
- public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } }
+ ///
+ /// Simpl+ Heartbeat Analog value in seconds
+ ///
+ public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } }
- ///
- /// String to Match for heartbeat. If null or empty any string will reset heartbeat timer
- ///
- public string HeartbeatStringToMatch { get; set; }
+ ///
+ /// String to Match for heartbeat. If null or empty any string will reset heartbeat timer
+ ///
+ public string HeartbeatStringToMatch { get; set; }
+
+ //private timers for Heartbeats per client
+ Dictionary HeartbeatTimerDictionary = new Dictionary();
- //private timers for Heartbeats per client
- Dictionary HeartbeatTimerDictionary = new Dictionary();
+ //flags to show the secure server is waiting for client at index to send the shared key
+ List WaitingForSharedKey = new List();
+
+ List ClientReadyAfterKeyExchange = new List();
+
+ ///
+ /// The connected client indexes
+ ///
+ public List ConnectedClientsIndexes = new List();
- //flags to show the secure server is waiting for client at index to send the shared key
- List WaitingForSharedKey = new List();
+ ///
+ /// Defaults to 2000
+ ///
+ public int BufferSize { get; set; }
- List ClientReadyAfterKeyExchange = new List();
+ ///
+ /// Private flag to note that the server has stopped intentionally
+ ///
+ private bool ServerStopped { get; set; }
- ///
- /// The connected client indexes
- ///
- public List ConnectedClientsIndexes = new List();
+ //Servers
+ TCPServer myTcpServer;
- ///
- /// Defaults to 2000
- ///
- public int BufferSize { get; set; }
+ ///
+ ///
+ ///
+ bool ProgramIsStopping;
- ///
- /// Private flag to note that the server has stopped intentionally
- ///
- private bool ServerStopped { get; set; }
+ #endregion
- //Servers
- TCPServer myTcpServer;
+ #region Constructors
+ ///
+ /// constructor S+ Does not accept a key. Use initialze with key to set the debug key on this device. If using with + make sure to set all properties manually.
+ ///
+ public GenericTcpIpServer()
+ : base("Uninitialized Dynamic TCP Server")
+ {
+ HeartbeatRequiredIntervalInSeconds = 15;
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ BufferSize = 2000;
+ MonitorClientMaxFailureCount = 3;
+ }
- ///
- ///
- ///
- bool ProgramIsStopping;
+ ///
+ /// constructor with debug key set at instantiation. Make sure to set all properties before listening.
+ ///
+ ///
+ public GenericTcpIpServer(string key)
+ : base("Uninitialized Dynamic TCP Server")
+ {
+ HeartbeatRequiredIntervalInSeconds = 15;
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ BufferSize = 2000;
+ MonitorClientMaxFailureCount = 3;
+ Key = key;
+ }
- #endregion
+ ///
+ /// Contstructor that sets all properties by calling the initialize method with a config object.
+ ///
+ ///
+ public GenericTcpIpServer(TcpServerConfigObject serverConfigObject)
+ : base("Uninitialized Dynamic TCP Server")
+ {
+ HeartbeatRequiredIntervalInSeconds = 15;
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ BufferSize = 2000;
+ MonitorClientMaxFailureCount = 3;
+ Initialize(serverConfigObject);
+ }
+ #endregion
- #region Constructors
- ///
- /// constructor S+ Does not accept a key. Use initialze with key to set the debug key on this device. If using with + make sure to set all properties manually.
- ///
- public GenericTcpIpServer()
- : base("Uninitialized Dynamic TCP Server")
+ #region Methods - Server Actions
+ ///
+ /// Disconnects all clients and stops the server
+ ///
+ public void KillServer()
+ {
+ ServerStopped = true;
+ if (MonitorClient != null)
{
- HeartbeatRequiredIntervalInSeconds = 15;
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- BufferSize = 2000;
- MonitorClientMaxFailureCount = 3;
+ MonitorClient.Disconnect();
}
+ DisconnectAllClientsForShutdown();
+ StopListening();
+ }
- ///
- /// constructor with debug key set at instantiation. Make sure to set all properties before listening.
- ///
- ///
- public GenericTcpIpServer(string key)
- : base("Uninitialized Dynamic TCP Server")
- {
- HeartbeatRequiredIntervalInSeconds = 15;
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- BufferSize = 2000;
- MonitorClientMaxFailureCount = 3;
- Key = key;
- }
+ ///
+ /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+
+ ///
+ ///
+ public void Initialize(string key)
+ {
+ Key = key;
+ }
- ///
- /// Contstructor that sets all properties by calling the initialize method with a config object.
- ///
- ///
- public GenericTcpIpServer(TcpServerConfigObject serverConfigObject)
- : base("Uninitialized Dynamic TCP Server")
+ ///
+ /// Initialze with server configuration object
+ ///
+ ///
+ public void Initialize(TcpServerConfigObject serverConfigObject)
+ {
+ try
{
- HeartbeatRequiredIntervalInSeconds = 15;
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- BufferSize = 2000;
- MonitorClientMaxFailureCount = 3;
- Initialize(serverConfigObject);
- }
- #endregion
+ if (serverConfigObject != null || string.IsNullOrEmpty(serverConfigObject.Key))
+ {
+ Key = serverConfigObject.Key;
+ MaxClients = serverConfigObject.MaxClients;
+ Port = serverConfigObject.Port;
+ SharedKeyRequired = serverConfigObject.SharedKeyRequired;
+ SharedKey = serverConfigObject.SharedKey;
+ HeartbeatRequired = serverConfigObject.HeartbeatRequired;
+ HeartbeatRequiredIntervalInSeconds = serverConfigObject.HeartbeatRequiredIntervalInSeconds;
+ HeartbeatStringToMatch = serverConfigObject.HeartbeatStringToMatch;
+ BufferSize = serverConfigObject.BufferSize;
- #region Methods - Server Actions
- ///
- /// Disconnects all clients and stops the server
- ///
- public void KillServer()
- {
- ServerStopped = true;
- if (MonitorClient != null)
+ }
+ else
{
- MonitorClient.Disconnect();
+ ErrorLog.Error("Could not initialize server with key: {0}", serverConfigObject.Key);
}
- DisconnectAllClientsForShutdown();
- StopListening();
}
-
- ///
- /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+
- ///
- ///
- public void Initialize(string key)
+ catch
{
- Key = key;
+ ErrorLog.Error("Could not initialize server with key: {0}", serverConfigObject.Key);
}
+ }
- ///
- /// Initialze with server configuration object
- ///
- ///
- public void Initialize(TcpServerConfigObject serverConfigObject)
+ ///
+ /// Start listening on the specified port
+ ///
+ public void Listen()
+ {
+ ServerCCSection.Enter();
+ try
{
- try
+ if (Port < 1 || Port > 65535)
{
- if (serverConfigObject != null || string.IsNullOrEmpty(serverConfigObject.Key))
- {
- Key = serverConfigObject.Key;
- MaxClients = serverConfigObject.MaxClients;
- Port = serverConfigObject.Port;
- SharedKeyRequired = serverConfigObject.SharedKeyRequired;
- SharedKey = serverConfigObject.SharedKey;
- HeartbeatRequired = serverConfigObject.HeartbeatRequired;
- HeartbeatRequiredIntervalInSeconds = serverConfigObject.HeartbeatRequiredIntervalInSeconds;
- HeartbeatStringToMatch = serverConfigObject.HeartbeatStringToMatch;
- BufferSize = serverConfigObject.BufferSize;
-
- }
- else
- {
- ErrorLog.Error("Could not initialize server with key: {0}", serverConfigObject.Key);
- }
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Server '{0}': Invalid port", Key);
+ ErrorLog.Warn(string.Format("Server '{0}': Invalid port", Key));
+ return;
}
- catch
+ if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
{
- ErrorLog.Error("Could not initialize server with key: {0}", serverConfigObject.Key);
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Server '{0}': No Shared Key set", Key);
+ ErrorLog.Warn(string.Format("Server '{0}': No Shared Key set", Key));
+ return;
}
- }
+ if (IsListening)
+ return;
- ///
- /// Start listening on the specified port
- ///
- public void Listen()
- {
- ServerCCSection.Enter();
- try
+ if (myTcpServer == null)
{
- if (Port < 1 || Port > 65535)
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Server '{0}': Invalid port", Key);
- ErrorLog.Warn(string.Format("Server '{0}': Invalid port", Key));
- return;
- }
- if (string.IsNullOrEmpty(SharedKey) && SharedKeyRequired)
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Server '{0}': No Shared Key set", Key);
- ErrorLog.Warn(string.Format("Server '{0}': No Shared Key set", Key));
- return;
- }
- if (IsListening)
- return;
-
- if (myTcpServer == null)
- {
- myTcpServer = new TCPServer(Port, MaxClients);
- if(HeartbeatRequired)
- myTcpServer.SocketSendOrReceiveTimeOutInMs = (this.HeartbeatRequiredIntervalMs * 5);
-
+ myTcpServer = new TCPServer(Port, MaxClients);
+ if(HeartbeatRequired)
+ myTcpServer.SocketSendOrReceiveTimeOutInMs = (this.HeartbeatRequiredIntervalMs * 5);
+
// myTcpServer.HandshakeTimeout = 30;
- }
- else
- {
- KillServer();
- myTcpServer.PortNumber = Port;
- }
+ }
+ else
+ {
+ KillServer();
+ myTcpServer.PortNumber = Port;
+ }
- myTcpServer.SocketStatusChange -= TcpServer_SocketStatusChange;
- myTcpServer.SocketStatusChange += TcpServer_SocketStatusChange;
+ myTcpServer.SocketStatusChange -= TcpServer_SocketStatusChange;
+ myTcpServer.SocketStatusChange += TcpServer_SocketStatusChange;
- ServerStopped = false;
- myTcpServer.WaitForConnectionAsync(IPAddress.Any, TcpConnectCallback);
- OnServerStateChange(myTcpServer.State);
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "TCP Server Status: {0}, Socket Status: {1}", myTcpServer.State, myTcpServer.ServerSocketStatus);
+ ServerStopped = false;
+ myTcpServer.WaitForConnectionAsync(IPAddress.Any, TcpConnectCallback);
+ OnServerStateChange(myTcpServer.State);
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "TCP Server Status: {0}, Socket Status: {1}", myTcpServer.State, myTcpServer.ServerSocketStatus);
- // StartMonitorClient();
+ // StartMonitorClient();
- ServerCCSection.Leave();
- }
- catch (Exception ex)
- {
- ServerCCSection.Leave();
- ErrorLog.Error("{1} Error with Dynamic Server: {0}", ex.ToString(), Key);
- }
+ ServerCCSection.Leave();
}
+ catch (Exception ex)
+ {
+ ServerCCSection.Leave();
+ ErrorLog.Error("{1} Error with Dynamic Server: {0}", ex.ToString(), Key);
+ }
+ }
- ///
- /// Stop Listening
- ///
- public void StopListening()
+ ///
+ /// Stop Listening
+ ///
+ public void StopListening()
+ {
+ try
{
- try
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Stopping Listener");
+ if (myTcpServer != null)
{
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Stopping Listener");
- if (myTcpServer != null)
- {
- myTcpServer.Stop();
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Server State: {0}", myTcpServer.State);
+ myTcpServer.Stop();
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Server State: {0}", myTcpServer.State);
OnServerStateChange(myTcpServer.State);
- }
- ServerStopped = true;
- }
- catch (Exception ex)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error stopping server. Error: {0}", ex);
}
+ ServerStopped = true;
+ }
+ catch (Exception ex)
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error stopping server. Error: {0}", ex);
}
+ }
- ///
- /// Disconnects Client
- ///
- ///
- public void DisconnectClient(uint client)
+ ///
+ /// Disconnects Client
+ ///
+ ///
+ public void DisconnectClient(uint client)
+ {
+ try
{
- try
- {
- myTcpServer.Disconnect(client);
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected client index: {0}", client);
- }
- catch (Exception ex)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Disconnecting client index: {0}. Error: {1}", client, ex);
- }
+ myTcpServer.Disconnect(client);
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected client index: {0}", client);
}
- ///
- /// Disconnect All Clients
- ///
- public void DisconnectAllClientsForShutdown()
+ catch (Exception ex)
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Disconnecting All Clients");
- if (myTcpServer != null)
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Disconnecting client index: {0}. Error: {1}", client, ex);
+ }
+ }
+ ///
+ /// Disconnect All Clients
+ ///
+ public void DisconnectAllClientsForShutdown()
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Disconnecting All Clients");
+ if (myTcpServer != null)
+ {
+ myTcpServer.SocketStatusChange -= TcpServer_SocketStatusChange;
+ foreach (var index in ConnectedClientsIndexes.ToList()) // copy it here so that it iterates properly
{
- myTcpServer.SocketStatusChange -= TcpServer_SocketStatusChange;
- foreach (var index in ConnectedClientsIndexes.ToList()) // copy it here so that it iterates properly
+ var i = index;
+ if (!myTcpServer.ClientConnected(index))
+ continue;
+ try
{
- var i = index;
- if (!myTcpServer.ClientConnected(index))
- continue;
- try
- {
- myTcpServer.Disconnect(i);
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected client index: {0}", i);
- }
- catch (Exception ex)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Disconnecting client index: {0}. Error: {1}", i, ex);
- }
+ myTcpServer.Disconnect(i);
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected client index: {0}", i);
+ }
+ catch (Exception ex)
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Disconnecting client index: {0}. Error: {1}", i, ex);
}
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Server Status: {0}", myTcpServer.ServerSocketStatus);
}
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Server Status: {0}", myTcpServer.ServerSocketStatus);
+ }
- Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected All Clients");
- ConnectedClientsIndexes.Clear();
-
- if (!ProgramIsStopping)
- {
- OnConnectionChange();
- OnServerStateChange(myTcpServer.State); //State shows both listening and connected
- }
+ Debug.Console(2, this, Debug.ErrorLogLevel.Notice, "Disconnected All Clients");
+ ConnectedClientsIndexes.Clear();
- // var o = new { };
+ if (!ProgramIsStopping)
+ {
+ OnConnectionChange();
+ OnServerStateChange(myTcpServer.State); //State shows both listening and connected
}
- ///
- /// Broadcast text from server to all connected clients
- ///
- ///
- public void BroadcastText(string text)
+ // var o = new { };
+ }
+
+ ///
+ /// Broadcast text from server to all connected clients
+ ///
+ ///
+ public void BroadcastText(string text)
+ {
+ CCriticalSection CCBroadcast = new CCriticalSection();
+ CCBroadcast.Enter();
+ try
{
- CCriticalSection CCBroadcast = new CCriticalSection();
- CCBroadcast.Enter();
- try
+ if (ConnectedClientsIndexes.Count > 0)
{
- if (ConnectedClientsIndexes.Count > 0)
+ byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
+ foreach (uint i in ConnectedClientsIndexes)
{
- byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
- foreach (uint i in ConnectedClientsIndexes)
+ if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(i)))
{
- if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(i)))
- {
- SocketErrorCodes error = myTcpServer.SendDataAsync(i, b, b.Length, (x, y, z) => { });
- if (error != SocketErrorCodes.SOCKET_OK && error != SocketErrorCodes.SOCKET_OPERATION_PENDING)
- this.LogError("{error}",error.ToString());
- }
+ SocketErrorCodes error = myTcpServer.SendDataAsync(i, b, b.Length, (x, y, z) => { });
+ if (error != SocketErrorCodes.SOCKET_OK && error != SocketErrorCodes.SOCKET_OPERATION_PENDING)
+ this.LogError("{error}",error.ToString());
}
}
- CCBroadcast.Leave();
- }
- catch (Exception ex)
- {
- CCBroadcast.Leave();
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Broadcasting messages from server. Error: {0}", ex.Message);
}
+ CCBroadcast.Leave();
+ }
+ catch (Exception ex)
+ {
+ CCBroadcast.Leave();
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error Broadcasting messages from server. Error: {0}", ex.Message);
}
+ }
- ///
- /// Not sure this is useful in library, maybe Pro??
- ///
- ///
- ///
- public void SendTextToClient(string text, uint clientIndex)
+ ///
+ /// Not sure this is useful in library, maybe Pro??
+ ///
+ ///
+ ///
+ public void SendTextToClient(string text, uint clientIndex)
+ {
+ try
{
- try
+ byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
+ if (myTcpServer != null && myTcpServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
{
- byte[] b = Encoding.GetEncoding(28591).GetBytes(text);
- if (myTcpServer != null && myTcpServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
- {
- if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(clientIndex)))
- myTcpServer.SendDataAsync(clientIndex, b, b.Length, (x, y, z) => { });
- }
- }
- catch (Exception ex)
- {
- Debug.Console(2, this, "Error sending text to client. Text: {1}. Error: {0}", ex.Message, text);
+ if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(clientIndex)))
+ myTcpServer.SendDataAsync(clientIndex, b, b.Length, (x, y, z) => { });
}
}
+ catch (Exception ex)
+ {
+ Debug.Console(2, this, "Error sending text to client. Text: {1}. Error: {0}", ex.Message, text);
+ }
+ }
- //private method to check heartbeat requirements and start or reset timer
- string checkHeartbeat(uint clientIndex, string received)
+ //private method to check heartbeat requirements and start or reset timer
+ string checkHeartbeat(uint clientIndex, string received)
+ {
+ try
{
- try
+ if (HeartbeatRequired)
{
- if (HeartbeatRequired)
+ if (!string.IsNullOrEmpty(HeartbeatStringToMatch))
{
- if (!string.IsNullOrEmpty(HeartbeatStringToMatch))
- {
- var remainingText = received.Replace(HeartbeatStringToMatch, "");
- var noDelimiter = received.Trim(new char[] { '\r', '\n' });
- if (noDelimiter.Contains(HeartbeatStringToMatch))
- {
- if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
- HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs);
- else
- {
- CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
- HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
- }
- Debug.Console(1, this, "Heartbeat Received: {0}, from client index: {1}", HeartbeatStringToMatch, clientIndex);
- // Return Heartbeat
- SendTextToClient(HeartbeatStringToMatch, clientIndex);
- return remainingText;
- }
- }
- else
+ var remainingText = received.Replace(HeartbeatStringToMatch, "");
+ var noDelimiter = received.Trim(new char[] { '\r', '\n' });
+ if (noDelimiter.Contains(HeartbeatStringToMatch))
{
if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs);
@@ -597,197 +582,212 @@ string checkHeartbeat(uint clientIndex, string received)
CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
}
- Debug.Console(1, this, "Heartbeat Received: {0}, from client index: {1}", received, clientIndex);
+ Debug.Console(1, this, "Heartbeat Received: {0}, from client index: {1}", HeartbeatStringToMatch, clientIndex);
+ // Return Heartbeat
+ SendTextToClient(HeartbeatStringToMatch, clientIndex);
+ return remainingText;
}
}
+ else
+ {
+ if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
+ HeartbeatTimerDictionary[clientIndex].Reset(HeartbeatRequiredIntervalMs);
+ else
+ {
+ CTimer HeartbeatTimer = new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs);
+ HeartbeatTimerDictionary.Add(clientIndex, HeartbeatTimer);
+ }
+ Debug.Console(1, this, "Heartbeat Received: {0}, from client index: {1}", received, clientIndex);
+ }
}
- catch (Exception ex)
- {
- Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
- }
- return received;
}
+ catch (Exception ex)
+ {
+ Debug.Console(1, this, "Error checking heartbeat: {0}", ex.Message);
+ }
+ return received;
+ }
- ///
- /// Gets the IP address based on the client index
- ///
- ///
- /// IP address of the client
- public string GetClientIPAddress(uint clientIndex)
+ ///
+ /// Gets the IP address based on the client index
+ ///
+ ///
+ /// IP address of the client
+ public string GetClientIPAddress(uint clientIndex)
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress Index: {0}", clientIndex);
+ if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(clientIndex)))
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress Index: {0}", clientIndex);
- if (!SharedKeyRequired || (SharedKeyRequired && ClientReadyAfterKeyExchange.Contains(clientIndex)))
- {
- var ipa = this.myTcpServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex);
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress IPAddreess: {0}", ipa);
- return ipa;
+ var ipa = this.myTcpServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex);
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress IPAddreess: {0}", ipa);
+ return ipa;
- }
- else
- {
- return "";
- }
}
+ else
+ {
+ return "";
+ }
+ }
- #endregion
+ #endregion
- #region Methods - HeartbeatTimer Callback
+ #region Methods - HeartbeatTimer Callback
- void HeartbeatTimer_CallbackFunction(object o)
+ void HeartbeatTimer_CallbackFunction(object o)
+ {
+ uint clientIndex = 99999;
+ string address = string.Empty;
+ try
{
- uint clientIndex = 99999;
- string address = string.Empty;
- try
- {
- clientIndex = (uint)o;
- address = myTcpServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex);
+ clientIndex = (uint)o;
+ address = myTcpServer.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex);
- Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Heartbeat not received for Client index {2} IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE {1}",
- address, string.IsNullOrEmpty(HeartbeatStringToMatch) ? "" : ("HeartbeatStringToMatch: " + HeartbeatStringToMatch), clientIndex);
+ Debug.Console(1, this, Debug.ErrorLogLevel.Warning, "Heartbeat not received for Client index {2} IP: {0}, DISCONNECTING BECAUSE HEARTBEAT REQUIRED IS TRUE {1}",
+ address, string.IsNullOrEmpty(HeartbeatStringToMatch) ? "" : ("HeartbeatStringToMatch: " + HeartbeatStringToMatch), clientIndex);
- if (myTcpServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
- SendTextToClient("Heartbeat not received by server, closing connection", clientIndex);
+ if (myTcpServer.GetServerSocketStatusForSpecificClient(clientIndex) == SocketStatus.SOCKET_STATUS_CONNECTED)
+ SendTextToClient("Heartbeat not received by server, closing connection", clientIndex);
- var discoResult = myTcpServer.Disconnect(clientIndex);
- //Debug.Console(1, this, "{0}", discoResult);
+ var discoResult = myTcpServer.Disconnect(clientIndex);
+ //Debug.Console(1, this, "{0}", discoResult);
- if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
- {
- HeartbeatTimerDictionary[clientIndex].Stop();
- HeartbeatTimerDictionary[clientIndex].Dispose();
- HeartbeatTimerDictionary.Remove(clientIndex);
- }
- }
- catch (Exception ex)
+ if (HeartbeatTimerDictionary.ContainsKey(clientIndex))
{
- ErrorLog.Error("{3}: Heartbeat timeout Error on Client Index: {0}, at address: {1}, error: {2}", clientIndex, address, ex.Message, Key);
+ HeartbeatTimerDictionary[clientIndex].Stop();
+ HeartbeatTimerDictionary[clientIndex].Dispose();
+ HeartbeatTimerDictionary.Remove(clientIndex);
}
}
+ catch (Exception ex)
+ {
+ ErrorLog.Error("{3}: Heartbeat timeout Error on Client Index: {0}, at address: {1}, error: {2}", clientIndex, address, ex.Message, Key);
+ }
+ }
- #endregion
+ #endregion
- #region Methods - Socket Status Changed Callbacks
- ///
- /// Secure Server Socket Status Changed Callback
- ///
- ///
- ///
- ///
- void TcpServer_SocketStatusChange(TCPServer server, uint clientIndex, SocketStatus serverSocketStatus)
+ #region Methods - Socket Status Changed Callbacks
+ ///
+ /// Secure Server Socket Status Changed Callback
+ ///
+ ///
+ ///
+ ///
+ void TcpServer_SocketStatusChange(TCPServer server, uint clientIndex, SocketStatus serverSocketStatus)
+ {
+ try
{
- try
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "SecureServerSocketStatusChange Index:{0} status:{1} Port:{2} IP:{3}", clientIndex, serverSocketStatus, this.myTcpServer.GetPortNumberServerAcceptedConnectionFromForSpecificClient(clientIndex), this.myTcpServer.GetLocalAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
- if (serverSocketStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "SecureServerSocketStatusChange Index:{0} status:{1} Port:{2} IP:{3}", clientIndex, serverSocketStatus, this.myTcpServer.GetPortNumberServerAcceptedConnectionFromForSpecificClient(clientIndex), this.myTcpServer.GetLocalAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
+ if (serverSocketStatus != SocketStatus.SOCKET_STATUS_CONNECTED)
+ {
+ if (ConnectedClientsIndexes.Contains(clientIndex))
+ ConnectedClientsIndexes.Remove(clientIndex);
+ if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex))
{
- if (ConnectedClientsIndexes.Contains(clientIndex))
- ConnectedClientsIndexes.Remove(clientIndex);
- if (HeartbeatRequired && HeartbeatTimerDictionary.ContainsKey(clientIndex))
- {
- HeartbeatTimerDictionary[clientIndex].Stop();
- HeartbeatTimerDictionary[clientIndex].Dispose();
- HeartbeatTimerDictionary.Remove(clientIndex);
- }
- if (ClientReadyAfterKeyExchange.Contains(clientIndex))
- ClientReadyAfterKeyExchange.Remove(clientIndex);
+ HeartbeatTimerDictionary[clientIndex].Stop();
+ HeartbeatTimerDictionary[clientIndex].Dispose();
+ HeartbeatTimerDictionary.Remove(clientIndex);
+ }
+ if (ClientReadyAfterKeyExchange.Contains(clientIndex))
+ ClientReadyAfterKeyExchange.Remove(clientIndex);
if (WaitingForSharedKey.Contains(clientIndex))
WaitingForSharedKey.Remove(clientIndex);
- }
- }
- catch (Exception ex)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error in Socket Status Change Callback. Error: {0}", ex);
}
- onConnectionChange(clientIndex, server.GetServerSocketStatusForSpecificClient(clientIndex));
}
+ catch (Exception ex)
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error in Socket Status Change Callback. Error: {0}", ex);
+ }
+ onConnectionChange(clientIndex, server.GetServerSocketStatusForSpecificClient(clientIndex));
+ }
- #endregion
+ #endregion
- #region Methods Connected Callbacks
- ///
- /// Secure TCP Client Connected to Secure Server Callback
- ///
- ///
- ///
- void TcpConnectCallback(TCPServer server, uint clientIndex)
+ #region Methods Connected Callbacks
+ ///
+ /// Secure TCP Client Connected to Secure Server Callback
+ ///
+ ///
+ ///
+ void TcpConnectCallback(TCPServer server, uint clientIndex)
+ {
+ try
{
- try
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "ConnectCallback: IPAddress: {0}. Index: {1}. Status: {2}",
+ server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex),
+ clientIndex, server.GetServerSocketStatusForSpecificClient(clientIndex));
+ if (clientIndex != 0)
{
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "ConnectCallback: IPAddress: {0}. Index: {1}. Status: {2}",
- server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex),
- clientIndex, server.GetServerSocketStatusForSpecificClient(clientIndex));
- if (clientIndex != 0)
+ if (server.ClientConnected(clientIndex))
{
- if (server.ClientConnected(clientIndex))
- {
- if (!ConnectedClientsIndexes.Contains(clientIndex))
- {
- ConnectedClientsIndexes.Add(clientIndex);
- }
- if (SharedKeyRequired)
- {
- if (!WaitingForSharedKey.Contains(clientIndex))
- {
- WaitingForSharedKey.Add(clientIndex);
- }
- byte[] b = Encoding.GetEncoding(28591).GetBytes("SharedKey:");
- server.SendDataAsync(clientIndex, b, b.Length, (x, y, z) => { });
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Sent Shared Key Request to client at {0}", server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
- }
- else
- {
- OnServerClientReadyForCommunications(clientIndex);
- }
- if (HeartbeatRequired)
+ if (!ConnectedClientsIndexes.Contains(clientIndex))
+ {
+ ConnectedClientsIndexes.Add(clientIndex);
+ }
+ if (SharedKeyRequired)
+ {
+ if (!WaitingForSharedKey.Contains(clientIndex))
{
- if (!HeartbeatTimerDictionary.ContainsKey(clientIndex))
- {
- HeartbeatTimerDictionary.Add(clientIndex, new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs));
- }
+ WaitingForSharedKey.Add(clientIndex);
}
-
- server.ReceiveDataAsync(clientIndex, TcpServerReceivedDataAsyncCallback);
+ byte[] b = Encoding.GetEncoding(28591).GetBytes("SharedKey:");
+ server.SendDataAsync(clientIndex, b, b.Length, (x, y, z) => { });
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Sent Shared Key Request to client at {0}", server.GetAddressServerAcceptedConnectionFromForSpecificClient(clientIndex));
}
- }
- else
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Client attempt faulty.");
- if (!ServerStopped)
+ else
{
- server.WaitForConnectionAsync(IPAddress.Any, TcpConnectCallback);
- return;
+ OnServerClientReadyForCommunications(clientIndex);
}
+ if (HeartbeatRequired)
+ {
+ if (!HeartbeatTimerDictionary.ContainsKey(clientIndex))
+ {
+ HeartbeatTimerDictionary.Add(clientIndex, new CTimer(HeartbeatTimer_CallbackFunction, clientIndex, HeartbeatRequiredIntervalMs));
+ }
+ }
+
+ server.ReceiveDataAsync(clientIndex, TcpServerReceivedDataAsyncCallback);
}
}
- catch (Exception ex)
+ else
{
- Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error in Socket Status Connect Callback. Error: {0}", ex);
+ Debug.Console(1, this, Debug.ErrorLogLevel.Error, "Client attempt faulty.");
+ if (!ServerStopped)
+ {
+ server.WaitForConnectionAsync(IPAddress.Any, TcpConnectCallback);
+ return;
+ }
}
- //Debug.Console(1, this, Debug.ErrorLogLevel, "((((((Server State bitfield={0}; maxclient={1}; ServerStopped={2}))))))",
- // server.State,
- // MaxClients,
- // ServerStopped);
- if ((server.State & ServerState.SERVER_LISTENING) != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped)
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Waiting for next connection");
- server.WaitForConnectionAsync(IPAddress.Any, TcpConnectCallback);
+ }
+ catch (Exception ex)
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error, "Error in Socket Status Connect Callback. Error: {0}", ex);
+ }
+ //Debug.Console(1, this, Debug.ErrorLogLevel, "((((((Server State bitfield={0}; maxclient={1}; ServerStopped={2}))))))",
+ // server.State,
+ // MaxClients,
+ // ServerStopped);
+ if ((server.State & ServerState.SERVER_LISTENING) != ServerState.SERVER_LISTENING && MaxClients > 1 && !ServerStopped)
+ {
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Waiting for next connection");
+ server.WaitForConnectionAsync(IPAddress.Any, TcpConnectCallback);
- }
}
+ }
- #endregion
+ #endregion
- #region Methods - Send/Receive Callbacks
- ///
- /// Secure Received Data Async Callback
- ///
- ///
- ///
- ///
- void TcpServerReceivedDataAsyncCallback(TCPServer myTCPServer, uint clientIndex, int numberOfBytesReceived)
- {
+ #region Methods - Send/Receive Callbacks
+ ///
+ /// Secure Received Data Async Callback
+ ///
+ ///
+ ///
+ ///
+ void TcpServerReceivedDataAsyncCallback(TCPServer myTCPServer, uint clientIndex, int numberOfBytesReceived)
+ {
if (numberOfBytesReceived > 0)
{
string received = "Nothing";
@@ -831,181 +831,180 @@ void TcpServerReceivedDataAsyncCallback(TCPServer myTCPServer, uint clientIndex,
myTCPServer.Disconnect();
}
- }
-
- #endregion
+ }
- #region Methods - EventHelpers/Callbacks
+ #endregion
- //Private Helper method to call the Connection Change Event
- void onConnectionChange(uint clientIndex, SocketStatus clientStatus)
- {
- if (clientIndex != 0) //0 is error not valid client change
- {
- var handler = ClientConnectionChange;
- if (handler != null)
- {
- handler(this, new GenericTcpServerSocketStatusChangeEventArgs(myTcpServer, clientIndex, clientStatus));
- }
- }
- }
+ #region Methods - EventHelpers/Callbacks
- //Private Helper method to call the Connection Change Event
- void OnConnectionChange()
+ //Private Helper method to call the Connection Change Event
+ void onConnectionChange(uint clientIndex, SocketStatus clientStatus)
+ {
+ if (clientIndex != 0) //0 is error not valid client change
{
- if (ProgramIsStopping)
- {
- return;
- }
var handler = ClientConnectionChange;
if (handler != null)
{
- handler(this, new GenericTcpServerSocketStatusChangeEventArgs());
+ handler(this, new GenericTcpServerSocketStatusChangeEventArgs(myTcpServer, clientIndex, clientStatus));
}
}
+ }
- //Private Helper Method to call the Text Received Event
- void onTextReceived(string text, uint clientIndex)
+ //Private Helper method to call the Connection Change Event
+ void OnConnectionChange()
+ {
+ if (ProgramIsStopping)
{
- var handler = TextReceived;
- if (handler != null)
- handler(this, new GenericTcpServerCommMethodReceiveTextArgs(text, clientIndex));
+ return;
}
-
- //Private Helper Method to call the Server State Change Event
- void OnServerStateChange(ServerState state)
+ var handler = ClientConnectionChange;
+ if (handler != null)
{
- if (ProgramIsStopping)
- {
- return;
- }
- var handler = ServerStateChange;
- if (handler != null)
- {
- handler(this, new GenericTcpServerStateChangedEventArgs(state));
- }
+ handler(this, new GenericTcpServerSocketStatusChangeEventArgs());
}
+ }
+
+ //Private Helper Method to call the Text Received Event
+ void onTextReceived(string text, uint clientIndex)
+ {
+ var handler = TextReceived;
+ if (handler != null)
+ handler(this, new GenericTcpServerCommMethodReceiveTextArgs(text, clientIndex));
+ }
- ///
- /// Private Event Handler method to handle the closing of connections when the program stops
- ///
- ///
- void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ //Private Helper Method to call the Server State Change Event
+ void OnServerStateChange(ServerState state)
+ {
+ if (ProgramIsStopping)
{
- if (programEventType == eProgramStatusEventType.Stopping)
- {
- ProgramIsStopping = true;
- // kill bandaid things
- if (MonitorClientTimer != null)
- MonitorClientTimer.Stop();
- if (MonitorClient != null)
- MonitorClient.Disconnect();
-
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing server");
- KillServer();
- }
+ return;
}
-
- //Private event handler method to raise the event that the server is ready to send data after a successful client shared key negotiation
- void OnServerClientReadyForCommunications(uint clientIndex)
+ var handler = ServerStateChange;
+ if (handler != null)
{
- ClientReadyAfterKeyExchange.Add(clientIndex);
- var handler = ServerClientReadyForCommunications;
- if (handler != null)
- handler(this, new GenericTcpServerSocketStatusChangeEventArgs(
- this, clientIndex, myTcpServer.GetServerSocketStatusForSpecificClient(clientIndex)));
+ handler(this, new GenericTcpServerStateChangedEventArgs(state));
}
- #endregion
+ }
- #region Monitor Client
- ///
- /// Starts the monitor client cycle. Timed wait, then call RunMonitorClient
- ///
- void StartMonitorClient()
+ ///
+ /// Private Event Handler method to handle the closing of connections when the program stops
+ ///
+ ///
+ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ {
+ if (programEventType == eProgramStatusEventType.Stopping)
{
+ ProgramIsStopping = true;
+ // kill bandaid things
if (MonitorClientTimer != null)
- {
- return;
- }
- MonitorClientTimer = new CTimer(o => RunMonitorClient(), 60000);
+ MonitorClientTimer.Stop();
+ if (MonitorClient != null)
+ MonitorClient.Disconnect();
+
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Program stopping. Closing server");
+ KillServer();
}
+ }
- ///
- ///
- ///
- void RunMonitorClient()
+ //Private event handler method to raise the event that the server is ready to send data after a successful client shared key negotiation
+ void OnServerClientReadyForCommunications(uint clientIndex)
+ {
+ ClientReadyAfterKeyExchange.Add(clientIndex);
+ var handler = ServerClientReadyForCommunications;
+ if (handler != null)
+ handler(this, new GenericTcpServerSocketStatusChangeEventArgs(
+ this, clientIndex, myTcpServer.GetServerSocketStatusForSpecificClient(clientIndex)));
+ }
+ #endregion
+
+ #region Monitor Client
+ ///
+ /// Starts the monitor client cycle. Timed wait, then call RunMonitorClient
+ ///
+ void StartMonitorClient()
+ {
+ if (MonitorClientTimer != null)
{
- MonitorClient = new GenericTcpIpClient_ForServer(Key + "-MONITOR", "127.0.0.1", Port, 2000);
- MonitorClient.SharedKeyRequired = this.SharedKeyRequired;
- MonitorClient.SharedKey = this.SharedKey;
- MonitorClient.ConnectionHasHungCallback = MonitorClientHasHungCallback;
- //MonitorClient.ConnectionChange += MonitorClient_ConnectionChange;
- MonitorClient.ClientReadyForCommunications += MonitorClient_IsReadyForComm;
+ return;
+ }
+ MonitorClientTimer = new CTimer(o => RunMonitorClient(), 60000);
+ }
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Starting monitor check");
+ ///
+ ///
+ ///
+ void RunMonitorClient()
+ {
+ MonitorClient = new GenericTcpIpClient_ForServer(Key + "-MONITOR", "127.0.0.1", Port, 2000);
+ MonitorClient.SharedKeyRequired = this.SharedKeyRequired;
+ MonitorClient.SharedKey = this.SharedKey;
+ MonitorClient.ConnectionHasHungCallback = MonitorClientHasHungCallback;
+ //MonitorClient.ConnectionChange += MonitorClient_ConnectionChange;
+ MonitorClient.ClientReadyForCommunications += MonitorClient_IsReadyForComm;
- MonitorClient.Connect();
- // From here MonitorCLient either connects or hangs, MonitorClient will call back
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Starting monitor check");
- }
+ MonitorClient.Connect();
+ // From here MonitorCLient either connects or hangs, MonitorClient will call back
- ///
- ///
- ///
- void StopMonitorClient()
- {
- if (MonitorClient == null)
- return;
+ }
- MonitorClient.ClientReadyForCommunications -= MonitorClient_IsReadyForComm;
- MonitorClient.Disconnect();
- MonitorClient = null;
- }
+ ///
+ ///
+ ///
+ void StopMonitorClient()
+ {
+ if (MonitorClient == null)
+ return;
- ///
- /// On monitor connect, restart the operation
- ///
- void MonitorClient_IsReadyForComm(object sender, GenericTcpServerClientReadyForcommunicationsEventArgs args)
- {
- if (args.IsReady)
- {
- Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Monitor client connection success. Disconnecting in 2s");
- MonitorClientTimer.Stop();
- MonitorClientTimer = null;
- MonitorClientFailureCount = 0;
- CrestronEnvironment.Sleep(2000);
- StopMonitorClient();
- StartMonitorClient();
- }
- }
+ MonitorClient.ClientReadyForCommunications -= MonitorClient_IsReadyForComm;
+ MonitorClient.Disconnect();
+ MonitorClient = null;
+ }
- ///
- /// If the client hangs, add to counter and maybe fire the choke event
- ///
- void MonitorClientHasHungCallback()
+ ///
+ /// On monitor connect, restart the operation
+ ///
+ void MonitorClient_IsReadyForComm(object sender, GenericTcpServerClientReadyForcommunicationsEventArgs args)
+ {
+ if (args.IsReady)
{
- MonitorClientFailureCount++;
+ Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "Monitor client connection success. Disconnecting in 2s");
MonitorClientTimer.Stop();
MonitorClientTimer = null;
+ MonitorClientFailureCount = 0;
+ CrestronEnvironment.Sleep(2000);
StopMonitorClient();
- if (MonitorClientFailureCount < MonitorClientMaxFailureCount)
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Warning, "Monitor client connection has hung {0} time{1}, maximum {2}",
- MonitorClientFailureCount, MonitorClientFailureCount > 1 ? "s" : "", MonitorClientMaxFailureCount);
- StartMonitorClient();
- }
- else
- {
- Debug.Console(2, this, Debug.ErrorLogLevel.Error,
- "\r***************************\rMonitor client connection has hung a maximum of {0} times.\r***************************",
- MonitorClientMaxFailureCount);
-
- var handler = ServerHasChoked;
- if (handler != null)
- handler();
- // Some external thing is in charge here. Expected reset of program
- }
+ StartMonitorClient();
+ }
+ }
+
+ ///
+ /// If the client hangs, add to counter and maybe fire the choke event
+ ///
+ void MonitorClientHasHungCallback()
+ {
+ MonitorClientFailureCount++;
+ MonitorClientTimer.Stop();
+ MonitorClientTimer = null;
+ StopMonitorClient();
+ if (MonitorClientFailureCount < MonitorClientMaxFailureCount)
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Warning, "Monitor client connection has hung {0} time{1}, maximum {2}",
+ MonitorClientFailureCount, MonitorClientFailureCount > 1 ? "s" : "", MonitorClientMaxFailureCount);
+ StartMonitorClient();
+ }
+ else
+ {
+ Debug.Console(2, this, Debug.ErrorLogLevel.Error,
+ "\r***************************\rMonitor client connection has hung a maximum of {0} times.\r***************************",
+ MonitorClientMaxFailureCount);
+
+ var handler = ServerHasChoked;
+ if (handler != null)
+ handler();
+ // Some external thing is in charge here. Expected reset of program
}
- #endregion
}
+ #endregion
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/GenericUdpServer.cs b/src/PepperDash.Core/Comm/GenericUdpServer.cs
index a5a68c45e..377b9cbe5 100644
--- a/src/PepperDash.Core/Comm/GenericUdpServer.cs
+++ b/src/PepperDash.Core/Comm/GenericUdpServer.cs
@@ -8,347 +8,347 @@
using Newtonsoft.Json;
using PepperDash.Core.Logging;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Generic UDP Server device
+///
+public class GenericUdpServer : Device, ISocketStatusWithStreamDebugging
{
+ private const string SplusKey = "Uninitialized Udp Server";
///
- /// Generic UDP Server device
+ /// Object to enable stream debugging
+ ///
+ public CommunicationStreamDebugging StreamDebugging { get; private set; }
+ ///
+ ///
+ ///
+ public event EventHandler BytesReceived;
+
+ ///
+ ///
+ ///
+ public event EventHandler TextReceived;
+
+ ///
+ /// This event will fire when a message is dequeued that includes the source IP and Port info if needed to determine the source of the received data.
///
- public class GenericUdpServer : Device, ISocketStatusWithStreamDebugging
- {
- private const string SplusKey = "Uninitialized Udp Server";
- ///
- /// Object to enable stream debugging
- ///
- public CommunicationStreamDebugging StreamDebugging { get; private set; }
- ///
- ///
- ///
- public event EventHandler BytesReceived;
-
- ///
- ///
- ///
- public event EventHandler TextReceived;
-
- ///
- /// This event will fire when a message is dequeued that includes the source IP and Port info if needed to determine the source of the received data.
- ///
public event EventHandler DataRecievedExtra;
- ///
- ///
- ///
- public event EventHandler ConnectionChange;
+ ///
+ ///
+ ///
+ public event EventHandler ConnectionChange;
- ///
- ///
- ///
- public event EventHandler UpdateConnectionStatus;
+ ///
+ ///
+ ///
+ public event EventHandler UpdateConnectionStatus;
- ///
- ///
- ///
- public SocketStatus ClientStatus
+ ///
+ ///
+ ///
+ public SocketStatus ClientStatus
+ {
+ get
{
- get
- {
- return Server.ServerStatus;
- }
+ return Server.ServerStatus;
}
+ }
- ///
- ///
- ///
- public ushort UStatus
- {
- get { return (ushort)Server.ServerStatus; }
- }
+ ///
+ ///
+ ///
+ public ushort UStatus
+ {
+ get { return (ushort)Server.ServerStatus; }
+ }
- ///
- /// Address of server
- ///
- public string Hostname { get; set; }
+ ///
+ /// Address of server
+ ///
+ public string Hostname { get; set; }
- ///
- /// Port on server
- ///
- public int Port { get; set; }
+ ///
+ /// Port on server
+ ///
+ public int Port { get; set; }
- ///
- /// Another damn S+ helper because S+ seems to treat large port nums as signed ints
- /// which screws up things
- ///
- public ushort UPort
- {
- get { return Convert.ToUInt16(Port); }
- set { Port = Convert.ToInt32(value); }
- }
+ ///
+ /// Another damn S+ helper because S+ seems to treat large port nums as signed ints
+ /// which screws up things
+ ///
+ public ushort UPort
+ {
+ get { return Convert.ToUInt16(Port); }
+ set { Port = Convert.ToInt32(value); }
+ }
- ///
- /// Indicates that the UDP Server is enabled
- ///
- public bool IsConnected
- {
- get;
- private set;
- }
+ ///
+ /// Indicates that the UDP Server is enabled
+ ///
+ public bool IsConnected
+ {
+ get;
+ private set;
+ }
- ///
- /// Numeric value indicating
- ///
- public ushort UIsConnected
- {
- get { return IsConnected ? (ushort)1 : (ushort)0; }
- }
+ ///
+ /// Numeric value indicating
+ ///
+ public ushort UIsConnected
+ {
+ get { return IsConnected ? (ushort)1 : (ushort)0; }
+ }
- ///
- /// Defaults to 2000
- ///
- public int BufferSize { get; set; }
-
- ///
- /// The server
- ///
- public UDPServer Server { get; private set; }
-
- ///
- /// Constructor for S+. Make sure to set key, address, port, and buffersize using init method
- ///
- public GenericUdpServer()
- : base(SplusKey)
- {
- StreamDebugging = new CommunicationStreamDebugging(SplusKey);
- BufferSize = 5000;
+ ///
+ /// Defaults to 2000
+ ///
+ public int BufferSize { get; set; }
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler);
- }
-
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public GenericUdpServer(string key, string address, int port, int buffefSize)
- : base(key)
- {
- StreamDebugging = new CommunicationStreamDebugging(key);
- Hostname = address;
- Port = port;
- BufferSize = buffefSize;
+ ///
+ /// The server
+ ///
+ public UDPServer Server { get; private set; }
- CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
- CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler);
- }
+ ///
+ /// Constructor for S+. Make sure to set key, address, port, and buffersize using init method
+ ///
+ public GenericUdpServer()
+ : base(SplusKey)
+ {
+ StreamDebugging = new CommunicationStreamDebugging(SplusKey);
+ BufferSize = 5000;
- ///
- /// Call from S+ to initialize values
- ///
- ///
- ///
- ///
- public void Initialize(string key, string address, ushort port)
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public GenericUdpServer(string key, string address, int port, int buffefSize)
+ : base(key)
+ {
+ StreamDebugging = new CommunicationStreamDebugging(key);
+ Hostname = address;
+ Port = port;
+ BufferSize = buffefSize;
+
+ CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
+ CrestronEnvironment.EthernetEventHandler += new EthernetEventHandler(CrestronEnvironment_EthernetEventHandler);
+ }
+
+ ///
+ /// Call from S+ to initialize values
+ ///
+ ///
+ ///
+ ///
+ public void Initialize(string key, string address, ushort port)
+ {
+ Key = key;
+ Hostname = address;
+ UPort = port;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ void CrestronEnvironment_EthernetEventHandler(EthernetEventArgs ethernetEventArgs)
+ {
+ // Re-enable the server if the link comes back up and the status should be connected
+ if (ethernetEventArgs.EthernetEventType == eEthernetEventType.LinkUp
+ && IsConnected)
{
- Key = key;
- Hostname = address;
- UPort = port;
+ Connect();
}
+ }
- ///
- ///
- ///
- ///
- void CrestronEnvironment_EthernetEventHandler(EthernetEventArgs ethernetEventArgs)
+ ///
+ ///
+ ///
+ ///
+ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ {
+ if (programEventType != eProgramStatusEventType.Stopping)
+ return;
+
+ Debug.Console(1, this, "Program stopping. Disabling Server");
+ Disconnect();
+ }
+
+ ///
+ /// Enables the UDP Server
+ ///
+ public void Connect()
+ {
+ if (Server == null)
{
- // Re-enable the server if the link comes back up and the status should be connected
- if (ethernetEventArgs.EthernetEventType == eEthernetEventType.LinkUp
- && IsConnected)
- {
- Connect();
- }
+ Server = new UDPServer();
}
- ///
- ///
- ///
- ///
- void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ if (string.IsNullOrEmpty(Hostname))
{
- if (programEventType != eProgramStatusEventType.Stopping)
- return;
-
- Debug.Console(1, this, "Program stopping. Disabling Server");
- Disconnect();
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericUdpServer '{0}': No address set", Key);
+ return;
}
-
- ///
- /// Enables the UDP Server
- ///
- public void Connect()
+ if (Port < 1 || Port > 65535)
{
- if (Server == null)
{
- Server = new UDPServer();
- }
-
- if (string.IsNullOrEmpty(Hostname))
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericUdpServer '{0}': No address set", Key);
+ Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericUdpServer '{0}': Invalid port", Key);
return;
}
- if (Port < 1 || Port > 65535)
- {
- {
- Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericUdpServer '{0}': Invalid port", Key);
- return;
- }
- }
+ }
- var status = Server.EnableUDPServer(Hostname, Port);
+ var status = Server.EnableUDPServer(Hostname, Port);
- Debug.Console(2, this, "SocketErrorCode: {0}", status);
- if (status == SocketErrorCodes.SOCKET_OK)
- IsConnected = true;
+ Debug.Console(2, this, "SocketErrorCode: {0}", status);
+ if (status == SocketErrorCodes.SOCKET_OK)
+ IsConnected = true;
- var handler = UpdateConnectionStatus;
- if (handler != null)
- handler(this, new GenericUdpConnectedEventArgs(UIsConnected));
+ var handler = UpdateConnectionStatus;
+ if (handler != null)
+ handler(this, new GenericUdpConnectedEventArgs(UIsConnected));
- // Start receiving data
- Server.ReceiveDataAsync(Receive);
- }
+ // Start receiving data
+ Server.ReceiveDataAsync(Receive);
+ }
- ///
- /// Disabled the UDP Server
- ///
- public void Disconnect()
- {
- if(Server != null)
- Server.DisableUDPServer();
+ ///
+ /// Disabled the UDP Server
+ ///
+ public void Disconnect()
+ {
+ if(Server != null)
+ Server.DisableUDPServer();
- IsConnected = false;
+ IsConnected = false;
- var handler = UpdateConnectionStatus;
- if (handler != null)
- handler(this, new GenericUdpConnectedEventArgs(UIsConnected));
- }
+ var handler = UpdateConnectionStatus;
+ if (handler != null)
+ handler(this, new GenericUdpConnectedEventArgs(UIsConnected));
+ }
- ///
- /// Recursive method to receive data
- ///
- ///
- ///
- void Receive(UDPServer server, int numBytes)
- {
- Debug.Console(2, this, "Received {0} bytes", numBytes);
+ ///
+ /// Recursive method to receive data
+ ///
+ ///
+ ///
+ void Receive(UDPServer server, int numBytes)
+ {
+ Debug.Console(2, this, "Received {0} bytes", numBytes);
- try
- {
- if (numBytes <= 0)
- return;
+ try
+ {
+ if (numBytes <= 0)
+ return;
- var sourceIp = Server.IPAddressLastMessageReceivedFrom;
- var sourcePort = Server.IPPortLastMessageReceivedFrom;
- var bytes = server.IncomingDataBuffer.Take(numBytes).ToArray();
- var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
+ var sourceIp = Server.IPAddressLastMessageReceivedFrom;
+ var sourcePort = Server.IPPortLastMessageReceivedFrom;
+ var bytes = server.IncomingDataBuffer.Take(numBytes).ToArray();
+ var str = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
- var dataRecivedExtra = DataRecievedExtra;
- if (dataRecivedExtra != null)
- dataRecivedExtra(this, new GenericUdpReceiveTextExtraArgs(str, sourceIp, sourcePort, bytes));
+ var dataRecivedExtra = DataRecievedExtra;
+ if (dataRecivedExtra != null)
+ dataRecivedExtra(this, new GenericUdpReceiveTextExtraArgs(str, sourceIp, sourcePort, bytes));
- Debug.Console(2, this, "Bytes: {0}", bytes.ToString());
- var bytesHandler = BytesReceived;
- if (bytesHandler != null)
- {
- if (StreamDebugging.RxStreamDebuggingIsEnabled)
- {
- Debug.Console(0, this, "Received {1} bytes: '{0}'", ComTextHelper.GetEscapedText(bytes), bytes.Length);
- }
- bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
- }
- var textHandler = TextReceived;
- if (textHandler != null)
+ Debug.Console(2, this, "Bytes: {0}", bytes.ToString());
+ var bytesHandler = BytesReceived;
+ if (bytesHandler != null)
+ {
+ if (StreamDebugging.RxStreamDebuggingIsEnabled)
{
- if (StreamDebugging.RxStreamDebuggingIsEnabled)
- Debug.Console(0, this, "Received {1} characters of text: '{0}'", ComTextHelper.GetDebugText(str), str.Length);
- textHandler(this, new GenericCommMethodReceiveTextArgs(str));
+ Debug.Console(0, this, "Received {1} bytes: '{0}'", ComTextHelper.GetEscapedText(bytes), bytes.Length);
}
+ bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
}
- catch (Exception ex)
- {
- this.LogException(ex, "GenericUdpServer Receive error");
- }
- finally
+ var textHandler = TextReceived;
+ if (textHandler != null)
{
- server.ReceiveDataAsync(Receive);
+ if (StreamDebugging.RxStreamDebuggingIsEnabled)
+ Debug.Console(0, this, "Received {1} characters of text: '{0}'", ComTextHelper.GetDebugText(str), str.Length);
+ textHandler(this, new GenericCommMethodReceiveTextArgs(str));
}
}
-
- ///
- /// General send method
- ///
- ///
- public void SendText(string text)
+ catch (Exception ex)
{
- var bytes = Encoding.GetEncoding(28591).GetBytes(text);
-
- if (IsConnected && Server != null)
- {
- if (StreamDebugging.TxStreamDebuggingIsEnabled)
- Debug.Console(0, this, "Sending {0} characters of text: '{1}'", text.Length, ComTextHelper.GetDebugText(text));
-
- Server.SendData(bytes, bytes.Length);
- }
+ this.LogException(ex, "GenericUdpServer Receive error");
+ }
+ finally
+ {
+ server.ReceiveDataAsync(Receive);
}
+ }
- ///
- ///
- ///
- ///
- public void SendBytes(byte[] bytes)
+ ///
+ /// General send method
+ ///
+ ///
+ public void SendText(string text)
+ {
+ var bytes = Encoding.GetEncoding(28591).GetBytes(text);
+
+ if (IsConnected && Server != null)
{
if (StreamDebugging.TxStreamDebuggingIsEnabled)
- Debug.Console(0, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
+ Debug.Console(0, this, "Sending {0} characters of text: '{1}'", text.Length, ComTextHelper.GetDebugText(text));
- if (IsConnected && Server != null)
- Server.SendData(bytes, bytes.Length);
+ Server.SendData(bytes, bytes.Length);
}
-
}
///
///
///
+ ///
+ public void SendBytes(byte[] bytes)
+ {
+ if (StreamDebugging.TxStreamDebuggingIsEnabled)
+ Debug.Console(0, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
+
+ if (IsConnected && Server != null)
+ Server.SendData(bytes, bytes.Length);
+ }
+
+}
+
+///
+///
+///
public class GenericUdpReceiveTextExtraArgs : EventArgs
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Text { get; private set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string IpAddress { get; private set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int Port { get; private set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public byte[] Bytes { get; private set; }
- ///
- ///
- ///
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
public GenericUdpReceiveTextExtraArgs(string text, string ipAddress, int port, byte[] bytes)
{
Text = text;
@@ -363,34 +363,33 @@ public GenericUdpReceiveTextExtraArgs(string text, string ipAddress, int port, b
public GenericUdpReceiveTextExtraArgs() { }
}
+///
+///
+///
+public class UdpServerPropertiesConfig
+{
///
///
///
- public class UdpServerPropertiesConfig
+ [JsonProperty(Required = Required.Always)]
+ public string Address { get; set; }
+
+ ///
+ ///
+ ///
+ [JsonProperty(Required = Required.Always)]
+ public int Port { get; set; }
+
+ ///
+ /// Defaults to 32768
+ ///
+ public int BufferSize { get; set; }
+
+ ///
+ ///
+ ///
+ public UdpServerPropertiesConfig()
{
- ///
- ///
- ///
- [JsonProperty(Required = Required.Always)]
- public string Address { get; set; }
-
- ///
- ///
- ///
- [JsonProperty(Required = Required.Always)]
- public int Port { get; set; }
-
- ///
- /// Defaults to 32768
- ///
- public int BufferSize { get; set; }
-
- ///
- ///
- ///
- public UdpServerPropertiesConfig()
- {
- BufferSize = 32768;
- }
+ BufferSize = 32768;
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/TcpClientConfigObject.cs b/src/PepperDash.Core/Comm/TcpClientConfigObject.cs
index c3b3bcec6..a43829385 100644
--- a/src/PepperDash.Core/Comm/TcpClientConfigObject.cs
+++ b/src/PepperDash.Core/Comm/TcpClientConfigObject.cs
@@ -1,59 +1,58 @@
using Newtonsoft.Json;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Client config object for TCP client with server that inherits from TcpSshPropertiesConfig and adds properties for shared key and heartbeat
+///
+public class TcpClientConfigObject
{
///
- /// Client config object for TCP client with server that inherits from TcpSshPropertiesConfig and adds properties for shared key and heartbeat
- ///
- public class TcpClientConfigObject
- {
- ///
- /// TcpSsh Properties
- ///
- [JsonProperty("control")]
- public ControlPropertiesConfig Control { get; set; }
-
- ///
- /// Bool value for secure. Currently not implemented in TCP sockets as they are not dynamic
- ///
- [JsonProperty("secure")]
- public bool Secure { get; set; }
-
- ///
- /// Require a shared key that both server and client negotiate. If negotiation fails server disconnects the client
- ///
- [JsonProperty("sharedKeyRequired")]
- public bool SharedKeyRequired { get; set; }
-
- ///
- /// The shared key that must match on the server and client
- ///
- [JsonProperty("sharedKey")]
- public string SharedKey { get; set; }
-
- ///
- /// Require a heartbeat on the client/server connection that will cause the server/client to disconnect if the heartbeat is not received.
- /// heartbeats do not raise received events.
- ///
- [JsonProperty("heartbeatRequired")]
- public bool HeartbeatRequired { get; set; }
-
- ///
- /// The interval in seconds for the heartbeat from the client. If not received client is disconnected
- ///
- [JsonProperty("heartbeatRequiredIntervalInSeconds")]
- public ushort HeartbeatRequiredIntervalInSeconds { get; set; }
-
- ///
- /// HeartbeatString that will be checked against the message received. defaults to heartbeat if no string is provided.
- ///
- [JsonProperty("heartbeatStringToMatch")]
- public string HeartbeatStringToMatch { get; set; }
-
- ///
- /// Receive Queue size must be greater than 20 or defaults to 20
- ///
- [JsonProperty("receiveQueueSize")]
- public int ReceiveQueueSize { get; set; }
- }
+ /// TcpSsh Properties
+ ///
+ [JsonProperty("control")]
+ public ControlPropertiesConfig Control { get; set; }
+
+ ///
+ /// Bool value for secure. Currently not implemented in TCP sockets as they are not dynamic
+ ///
+ [JsonProperty("secure")]
+ public bool Secure { get; set; }
+
+ ///
+ /// Require a shared key that both server and client negotiate. If negotiation fails server disconnects the client
+ ///
+ [JsonProperty("sharedKeyRequired")]
+ public bool SharedKeyRequired { get; set; }
+
+ ///
+ /// The shared key that must match on the server and client
+ ///
+ [JsonProperty("sharedKey")]
+ public string SharedKey { get; set; }
+
+ ///
+ /// Require a heartbeat on the client/server connection that will cause the server/client to disconnect if the heartbeat is not received.
+ /// heartbeats do not raise received events.
+ ///
+ [JsonProperty("heartbeatRequired")]
+ public bool HeartbeatRequired { get; set; }
+
+ ///
+ /// The interval in seconds for the heartbeat from the client. If not received client is disconnected
+ ///
+ [JsonProperty("heartbeatRequiredIntervalInSeconds")]
+ public ushort HeartbeatRequiredIntervalInSeconds { get; set; }
+
+ ///
+ /// HeartbeatString that will be checked against the message received. defaults to heartbeat if no string is provided.
+ ///
+ [JsonProperty("heartbeatStringToMatch")]
+ public string HeartbeatStringToMatch { get; set; }
+
+ ///
+ /// Receive Queue size must be greater than 20 or defaults to 20
+ ///
+ [JsonProperty("receiveQueueSize")]
+ public int ReceiveQueueSize { get; set; }
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/TcpServerConfigObject.cs b/src/PepperDash.Core/Comm/TcpServerConfigObject.cs
index 043cf58d6..b60f486f6 100644
--- a/src/PepperDash.Core/Comm/TcpServerConfigObject.cs
+++ b/src/PepperDash.Core/Comm/TcpServerConfigObject.cs
@@ -4,57 +4,56 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Tcp Server Config object with properties for a tcp server with shared key and heartbeat capabilities
+///
+public class TcpServerConfigObject
{
///
- /// Tcp Server Config object with properties for a tcp server with shared key and heartbeat capabilities
- ///
- public class TcpServerConfigObject
- {
- ///
- /// Uique key
- ///
- public string Key { get; set; }
- ///
- /// Max Clients that the server will allow to connect.
- ///
- public ushort MaxClients { get; set; }
- ///
- /// Bool value for secure. Currently not implemented in TCP sockets as they are not dynamic
- ///
- public bool Secure { get; set; }
- ///
- /// Port for the server to listen on
- ///
- public int Port { get; set; }
- ///
- /// Require a shared key that both server and client negotiate. If negotiation fails server disconnects the client
- ///
- public bool SharedKeyRequired { get; set; }
- ///
- /// The shared key that must match on the server and client
- ///
- public string SharedKey { get; set; }
- ///
- /// Require a heartbeat on the client/server connection that will cause the server/client to disconnect if the heartbeat is not received.
- /// heartbeats do not raise received events.
- ///
- public bool HeartbeatRequired { get; set; }
- ///
- /// The interval in seconds for the heartbeat from the client. If not received client is disconnected
- ///
- public ushort HeartbeatRequiredIntervalInSeconds { get; set; }
- ///
- /// HeartbeatString that will be checked against the message received. defaults to heartbeat if no string is provided.
- ///
- public string HeartbeatStringToMatch { get; set; }
- ///
- /// Client buffer size. See Crestron help. defaults to 2000 if not greater than 2000
- ///
- public int BufferSize { get; set; }
- ///
- /// Receive Queue size must be greater than 20 or defaults to 20
- ///
- public int ReceiveQueueSize { get; set; }
- }
+ /// Uique key
+ ///
+ public string Key { get; set; }
+ ///
+ /// Max Clients that the server will allow to connect.
+ ///
+ public ushort MaxClients { get; set; }
+ ///
+ /// Bool value for secure. Currently not implemented in TCP sockets as they are not dynamic
+ ///
+ public bool Secure { get; set; }
+ ///
+ /// Port for the server to listen on
+ ///
+ public int Port { get; set; }
+ ///
+ /// Require a shared key that both server and client negotiate. If negotiation fails server disconnects the client
+ ///
+ public bool SharedKeyRequired { get; set; }
+ ///
+ /// The shared key that must match on the server and client
+ ///
+ public string SharedKey { get; set; }
+ ///
+ /// Require a heartbeat on the client/server connection that will cause the server/client to disconnect if the heartbeat is not received.
+ /// heartbeats do not raise received events.
+ ///
+ public bool HeartbeatRequired { get; set; }
+ ///
+ /// The interval in seconds for the heartbeat from the client. If not received client is disconnected
+ ///
+ public ushort HeartbeatRequiredIntervalInSeconds { get; set; }
+ ///
+ /// HeartbeatString that will be checked against the message received. defaults to heartbeat if no string is provided.
+ ///
+ public string HeartbeatStringToMatch { get; set; }
+ ///
+ /// Client buffer size. See Crestron help. defaults to 2000 if not greater than 2000
+ ///
+ public int BufferSize { get; set; }
+ ///
+ /// Receive Queue size must be greater than 20 or defaults to 20
+ ///
+ public int ReceiveQueueSize { get; set; }
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Comm/eControlMethods.cs b/src/PepperDash.Core/Comm/eControlMethods.cs
index 28a95b122..bdf6d79e1 100644
--- a/src/PepperDash.Core/Comm/eControlMethods.cs
+++ b/src/PepperDash.Core/Comm/eControlMethods.cs
@@ -4,76 +4,75 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Crestron Control Methods for a comm object
+///
+public enum eControlMethod
{
///
- /// Crestron Control Methods for a comm object
- ///
- public enum eControlMethod
- {
- ///
- ///
- ///
- None = 0,
- ///
- /// RS232/422/485
- ///
- Com,
- ///
- /// Crestron IpId (most Crestron ethernet devices)
- ///
- IpId,
- ///
- /// Crestron IpIdTcp (HD-MD series, etc.)
- ///
- IpidTcp,
- ///
- /// Crestron IR control
- ///
- IR,
- ///
- /// SSH client
- ///
- Ssh,
- ///
- /// TCP/IP client
- ///
- Tcpip,
- ///
- /// Telnet
- ///
- Telnet,
- ///
- /// Crestnet device
- ///
- Cresnet,
- ///
- /// CEC Control, via a DM HDMI port
- ///
- Cec,
- ///
- /// UDP Server
- ///
- Udp,
- ///
- /// HTTP client
- ///
- Http,
- ///
- /// HTTPS client
- ///
- Https,
- ///
- /// Websocket client
- ///
- Ws,
- ///
- /// Secure Websocket client
- ///
- Wss,
- ///
- /// Secure TCP/IP
- ///
- SecureTcpIp
- }
+ ///
+ ///
+ None = 0,
+ ///
+ /// RS232/422/485
+ ///
+ Com,
+ ///
+ /// Crestron IpId (most Crestron ethernet devices)
+ ///
+ IpId,
+ ///
+ /// Crestron IpIdTcp (HD-MD series, etc.)
+ ///
+ IpidTcp,
+ ///
+ /// Crestron IR control
+ ///
+ IR,
+ ///
+ /// SSH client
+ ///
+ Ssh,
+ ///
+ /// TCP/IP client
+ ///
+ Tcpip,
+ ///
+ /// Telnet
+ ///
+ Telnet,
+ ///
+ /// Crestnet device
+ ///
+ Cresnet,
+ ///
+ /// CEC Control, via a DM HDMI port
+ ///
+ Cec,
+ ///
+ /// UDP Server
+ ///
+ Udp,
+ ///
+ /// HTTP client
+ ///
+ Http,
+ ///
+ /// HTTPS client
+ ///
+ Https,
+ ///
+ /// Websocket client
+ ///
+ Ws,
+ ///
+ /// Secure Websocket client
+ ///
+ Wss,
+ ///
+ /// Secure TCP/IP
+ ///
+ SecureTcpIp
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/CommunicationExtras.cs b/src/PepperDash.Core/CommunicationExtras.cs
index 81fd76c5d..f17e1da0a 100644
--- a/src/PepperDash.Core/CommunicationExtras.cs
+++ b/src/PepperDash.Core/CommunicationExtras.cs
@@ -7,74 +7,74 @@
using System.Text.RegularExpressions;
using Newtonsoft.Json;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// An incoming communication stream
+///
+public interface ICommunicationReceiver : IKeyed
{
///
- /// An incoming communication stream
+ /// Notifies of bytes received
///
- public interface ICommunicationReceiver : IKeyed
- {
- ///
- /// Notifies of bytes received
- ///
- event EventHandler BytesReceived;
- ///
- /// Notifies of text received
- ///
- event EventHandler TextReceived;
-
- ///
- /// Indicates connection status
- ///
- [JsonProperty("isConnected")]
- bool IsConnected { get; }
- ///
- /// Connect to the device
- ///
- void Connect();
- ///
- /// Disconnect from the device
- ///
- void Disconnect();
- }
+ event EventHandler BytesReceived;
+ ///
+ /// Notifies of text received
+ ///
+ event EventHandler TextReceived;
+
+ ///
+ /// Indicates connection status
+ ///
+ [JsonProperty("isConnected")]
+ bool IsConnected { get; }
+ ///
+ /// Connect to the device
+ ///
+ void Connect();
+ ///
+ /// Disconnect from the device
+ ///
+ void Disconnect();
+}
///
/// Represents a device that uses basic connection
///
- public interface IBasicCommunication : ICommunicationReceiver
+public interface IBasicCommunication : ICommunicationReceiver
{
- ///
- /// Send text to the device
- ///
- ///
+ ///
+ /// Send text to the device
+ ///
+ ///
void SendText(string text);
- ///
- /// Send bytes to the device
- ///
- ///
+ ///
+ /// Send bytes to the device
+ ///
+ ///
void SendBytes(byte[] bytes);
}
- ///
- /// Represents a device that implements IBasicCommunication and IStreamDebugging
- ///
- public interface IBasicCommunicationWithStreamDebugging : IBasicCommunication, IStreamDebugging
- {
+///
+/// Represents a device that implements IBasicCommunication and IStreamDebugging
+///
+public interface IBasicCommunicationWithStreamDebugging : IBasicCommunication, IStreamDebugging
+{
- }
+}
+///
+/// Represents a device with stream debugging capablities
+///
+public interface IStreamDebugging
+{
///
- /// Represents a device with stream debugging capablities
+ /// Object to enable stream debugging
///
- public interface IStreamDebugging
- {
- ///
- /// Object to enable stream debugging
- ///
- [JsonProperty("streamDebugging")]
- CommunicationStreamDebugging StreamDebugging { get; }
- }
+ [JsonProperty("streamDebugging")]
+ CommunicationStreamDebugging StreamDebugging { get; }
+}
///
/// For IBasicCommunication classes that have SocketStatus. GenericSshClient,
@@ -82,41 +82,41 @@ public interface IStreamDebugging
///
public interface ISocketStatus : IBasicCommunication
{
- ///
- /// Notifies of socket status changes
- ///
+ ///
+ /// Notifies of socket status changes
+ ///
event EventHandler ConnectionChange;
- ///
- /// The current socket status of the client
- ///
- [JsonProperty("clientStatus")]
- [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
- SocketStatus ClientStatus { get; }
- }
-
///
- /// Describes a device that implements ISocketStatus and IStreamDebugging
+ /// The current socket status of the client
///
- public interface ISocketStatusWithStreamDebugging : ISocketStatus, IStreamDebugging
- {
+ [JsonProperty("clientStatus")]
+ [JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
+ SocketStatus ClientStatus { get; }
+ }
- }
+///
+/// Describes a device that implements ISocketStatus and IStreamDebugging
+///
+public interface ISocketStatusWithStreamDebugging : ISocketStatus, IStreamDebugging
+{
- ///
- /// Describes a device that can automatically attempt to reconnect
- ///
+}
+
+///
+/// Describes a device that can automatically attempt to reconnect
+///
public interface IAutoReconnect
{
- ///
- /// Enable automatic recconnect
- ///
- [JsonProperty("autoReconnect")]
+ ///
+ /// Enable automatic recconnect
+ ///
+ [JsonProperty("autoReconnect")]
bool AutoReconnect { get; set; }
- ///
- /// Interval in ms to attempt automatic recconnections
- ///
- [JsonProperty("autoReconnectIntervalMs")]
+ ///
+ /// Interval in ms to attempt automatic recconnections
+ ///
+ [JsonProperty("autoReconnectIntervalMs")]
int AutoReconnectIntervalMs { get; set; }
}
@@ -125,14 +125,14 @@ public interface IAutoReconnect
///
public enum eGenericCommMethodStatusChangeType
{
- ///
- /// Connected
- ///
+ ///
+ /// Connected
+ ///
Connected,
- ///
- /// Disconnected
- ///
- Disconnected
+ ///
+ /// Disconnected
+ ///
+ Disconnected
}
///
@@ -147,15 +147,15 @@ public enum eGenericCommMethodStatusChangeType
///
public class GenericCommMethodReceiveBytesArgs : EventArgs
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public byte[] Bytes { get; private set; }
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
public GenericCommMethodReceiveBytesArgs(byte[] bytes)
{
Bytes = bytes;
@@ -172,33 +172,33 @@ public GenericCommMethodReceiveBytesArgs() { }
///
public class GenericCommMethodReceiveTextArgs : EventArgs
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Text { get; private set; }
- ///
- ///
- ///
- public string Delimiter { get; private set; }
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ public string Delimiter { get; private set; }
+ ///
+ ///
+ ///
+ ///
public GenericCommMethodReceiveTextArgs(string text)
{
Text = text;
}
- ///
- ///
- ///
- ///
- ///
- public GenericCommMethodReceiveTextArgs(string text, string delimiter)
- :this(text)
- {
- Delimiter = delimiter;
- }
+ ///
+ ///
+ ///
+ ///
+ ///
+ public GenericCommMethodReceiveTextArgs(string text, string delimiter)
+ :this(text)
+ {
+ Delimiter = delimiter;
+ }
///
/// S+ Constructor
@@ -213,35 +213,34 @@ public GenericCommMethodReceiveTextArgs() { }
///
public class ComTextHelper
{
- ///
- /// Gets escaped text for a byte array
- ///
- ///
- ///
+ ///
+ /// Gets escaped text for a byte array
+ ///
+ ///
+ ///
public static string GetEscapedText(byte[] bytes)
{
return String.Concat(bytes.Select(b => string.Format(@"[{0:X2}]", (int)b)).ToArray());
}
- ///
- /// Gets escaped text for a string
- ///
- ///
- ///
+ ///
+ /// Gets escaped text for a string
+ ///
+ ///
+ ///
public static string GetEscapedText(string text)
{
var bytes = Encoding.GetEncoding(28591).GetBytes(text);
return String.Concat(bytes.Select(b => string.Format(@"[{0:X2}]", (int)b)).ToArray());
}
- ///
- /// Gets debug text for a string
- ///
- ///
- ///
- public static string GetDebugText(string text)
- {
- return Regex.Replace(text, @"[^\u0020-\u007E]", a => GetEscapedText(a.Value));
- }
- }
-}
\ No newline at end of file
+ ///
+ /// Gets debug text for a string
+ ///
+ ///
+ ///
+ public static string GetDebugText(string text)
+ {
+ return Regex.Replace(text, @"[^\u0020-\u007E]", a => GetEscapedText(a.Value));
+ }
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/Config/PortalConfigReader.cs b/src/PepperDash.Core/Config/PortalConfigReader.cs
index 43e9ea1e4..3094e5df0 100644
--- a/src/PepperDash.Core/Config/PortalConfigReader.cs
+++ b/src/PepperDash.Core/Config/PortalConfigReader.cs
@@ -7,11 +7,11 @@
using PepperDash.Core;
using Serilog.Events;
-namespace PepperDash.Core.Config
-{
- ///
- /// Reads a Portal formatted config file
- ///
+namespace PepperDash.Core.Config;
+
+///
+/// Reads a Portal formatted config file
+///
public class PortalConfigReader
{
///
@@ -100,31 +100,31 @@ public static JObject MergeConfigs(JObject doubleConfig)
Merge(template["destinationLists"], system["destinationLists"], "destinationLists"));
- if (system["cameraLists"] == null)
- merged.Add("cameraLists", template["cameraLists"]);
- else
- merged.Add("cameraLists", Merge(template["cameraLists"], system["cameraLists"], "cameraLists"));
+ if (system["cameraLists"] == null)
+ merged.Add("cameraLists", template["cameraLists"]);
+ else
+ merged.Add("cameraLists", Merge(template["cameraLists"], system["cameraLists"], "cameraLists"));
- if (system["audioControlPointLists"] == null)
- merged.Add("audioControlPointLists", template["audioControlPointLists"]);
- else
- merged.Add("audioControlPointLists",
- Merge(template["audioControlPointLists"], system["audioControlPointLists"], "audioControlPointLists"));
+ if (system["audioControlPointLists"] == null)
+ merged.Add("audioControlPointLists", template["audioControlPointLists"]);
+ else
+ merged.Add("audioControlPointLists",
+ Merge(template["audioControlPointLists"], system["audioControlPointLists"], "audioControlPointLists"));
- // Template tie lines take precedence. Config tool doesn't do them at system
- // level anyway...
- if (template["tieLines"] != null)
+ // Template tie lines take precedence. Config tool doesn't do them at system
+ // level anyway...
+ if (template["tieLines"] != null)
merged.Add("tieLines", template["tieLines"]);
else if (system["tieLines"] != null)
merged.Add("tieLines", system["tieLines"]);
else
merged.Add("tieLines", new JArray());
- if (template["joinMaps"] != null)
- merged.Add("joinMaps", template["joinMaps"]);
- else
- merged.Add("joinMaps", new JObject());
+ if (template["joinMaps"] != null)
+ merged.Add("joinMaps", template["joinMaps"]);
+ else
+ merged.Add("joinMaps", new JObject());
if (system["global"] != null)
merged.Add("global", Merge(template["global"], system["global"], "global"));
@@ -147,26 +147,26 @@ static JArray MergeArraysOnTopLevelProperty(JArray a1, JArray a2, string propert
return a1;
else if (a1 != null)
{
- if (a2[0]["key"] == null) // If the first item in the system array has no key, overwrite the template array
- { // with the system array
- return a2;
- }
- else // The arrays are keyed, merge them by key
+ if (a2[0]["key"] == null) // If the first item in the system array has no key, overwrite the template array
+ { // with the system array
+ return a2;
+ }
+ else // The arrays are keyed, merge them by key
+ {
+ for (int i = 0; i < a1.Count(); i++)
{
- for (int i = 0; i < a1.Count(); i++)
+ var a1Dev = a1[i];
+ // Try to get a system device and if found, merge it onto template
+ var a2Match = a2.FirstOrDefault(t => t[propertyName].Equals(a1Dev[propertyName]));// t.Value("uid") == tmplDev.Value("uid"));
+ if (a2Match != null)
{
- var a1Dev = a1[i];
- // Try to get a system device and if found, merge it onto template
- var a2Match = a2.FirstOrDefault(t => t[propertyName].Equals(a1Dev[propertyName]));// t.Value("uid") == tmplDev.Value("uid"));
- if (a2Match != null)
- {
- var mergedItem = Merge(a1Dev, a2Match, string.Format("{0}[{1}].", path, i));// Merge(JObject.FromObject(a1Dev), JObject.FromObject(a2Match));
- result.Add(mergedItem);
- }
- else
- result.Add(a1Dev);
+ var mergedItem = Merge(a1Dev, a2Match, string.Format("{0}[{1}].", path, i));// Merge(JObject.FromObject(a1Dev), JObject.FromObject(a2Match));
+ result.Add(mergedItem);
}
+ else
+ result.Add(a1Dev);
}
+ }
}
return result;
}
@@ -183,9 +183,9 @@ static JObject Merge(JToken t1, JToken t2, string path)
///
/// Merge o2 onto o1
///
- ///
- ///
- ///
+ ///
+ ///
+ ///
static JObject Merge(JObject o1, JObject o2, string path)
{
foreach (var o2Prop in o2)
@@ -231,5 +231,4 @@ static JObject Merge(JObject o1, JObject o2, string path)
}
return o1;
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/Conversion/Convert.cs b/src/PepperDash.Core/Conversion/Convert.cs
index 2bafdcb06..13ef72636 100644
--- a/src/PepperDash.Core/Conversion/Convert.cs
+++ b/src/PepperDash.Core/Conversion/Convert.cs
@@ -4,19 +4,18 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+public class EncodingHelper
{
- public class EncodingHelper
+ public static string ConvertUtf8ToAscii(string utf8String)
{
- public static string ConvertUtf8ToAscii(string utf8String)
- {
- return Encoding.ASCII.GetString(Encoding.UTF8.GetBytes(utf8String), 0, utf8String.Length);
- }
-
- public static string ConvertUtf8ToUtf16(string utf8String)
- {
- return Encoding.Unicode.GetString(Encoding.UTF8.GetBytes(utf8String), 0, utf8String.Length);
- }
+ return Encoding.ASCII.GetString(Encoding.UTF8.GetBytes(utf8String), 0, utf8String.Length);
+ }
+ public static string ConvertUtf8ToUtf16(string utf8String)
+ {
+ return Encoding.Unicode.GetString(Encoding.UTF8.GetBytes(utf8String), 0, utf8String.Length);
}
+
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/CoreInterfaces.cs b/src/PepperDash.Core/CoreInterfaces.cs
index 6e0b639e9..b66890c8d 100644
--- a/src/PepperDash.Core/CoreInterfaces.cs
+++ b/src/PepperDash.Core/CoreInterfaces.cs
@@ -6,30 +6,28 @@
using Newtonsoft.Json;
using Serilog;
-namespace PepperDash.Core
-{
- ///
- /// Unique key interface to require a unique key for the class
- ///
+namespace PepperDash.Core;
+
+///
+/// Unique key interface to require a unique key for the class
+///
public interface IKeyed
{
- ///
- /// Unique Key
- ///
- [JsonProperty("key")]
+ ///
+ /// Gets the unique key associated with the object.
+ ///
+ [JsonProperty("key")]
string Key { get; }
- }
+}
- ///
- /// Named Keyed device interface. Forces the device to have a Unique Key and a name.
- ///
+///
+/// Named Keyed device interface. Forces the device to have a Unique Key and a name.
+///
public interface IKeyName : IKeyed
- {
- ///
- /// Isn't it obvious :)
- ///
- [JsonProperty("name")]
+{
+ ///
+ /// Gets the name associated with the current object.
+ ///
+ [JsonProperty("name")]
string Name { get; }
- }
-
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Device.cs b/src/PepperDash.Core/Device.cs
index ef9f6111b..8ea632655 100644
--- a/src/PepperDash.Core/Device.cs
+++ b/src/PepperDash.Core/Device.cs
@@ -2,8 +2,8 @@
using System.Collections.Generic;
using Serilog.Events;
-namespace PepperDash.Core
-{
+namespace PepperDash.Core;
+
//*********************************************************************************************************
///
/// The core event and status-bearing class that most if not all device and connectors can derive from.
@@ -178,15 +178,14 @@ public void OnFalse(object o, Action a)
if (o is bool && !(bool)o) a();
}
- ///
- /// Returns a string representation of the object, including its key and name.
- ///
- /// The returned string is formatted as "{Key} - {Name}". If the Name property is
- /// null or empty, "---" is used in place of the name.
- /// A string that represents the object, containing the key and name in the format "{Key} - {Name}".
+ ///
+ /// Returns a string representation of the object, including its key and name.
+ ///
+ /// The returned string is formatted as "{Key} - {Name}". If the Name property is
+ /// null or empty, "---" is used in place of the name.
+ /// A string that represents the object, containing the key and name in the format "{Key} - {Name}".
public override string ToString()
{
return string.Format("{0} - {1}", Key, string.IsNullOrEmpty(Name) ? "---" : Name);
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/EthernetHelper.cs b/src/PepperDash.Core/EthernetHelper.cs
index 884298860..67c337bd2 100644
--- a/src/PepperDash.Core/EthernetHelper.cs
+++ b/src/PepperDash.Core/EthernetHelper.cs
@@ -2,11 +2,11 @@
using Newtonsoft.Json;
using Serilog.Events;
-namespace PepperDash.Core
-{
- ///
- /// Class to help with accessing values from the CrestronEthernetHelper class
- ///
+namespace PepperDash.Core;
+
+///
+/// Class to help with accessing values from the CrestronEthernetHelper class
+///
public class EthernetHelper
{
///
@@ -113,5 +113,4 @@ public string DefaultGateway
CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_ROUTER, 0);
}
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/EventArgs.cs b/src/PepperDash.Core/EventArgs.cs
index 29ef13a84..adbfb5c8c 100644
--- a/src/PepperDash.Core/EventArgs.cs
+++ b/src/PepperDash.Core/EventArgs.cs
@@ -4,8 +4,8 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core
-{
+namespace PepperDash.Core;
+
///
/// Bool change event args
///
@@ -168,5 +168,4 @@ public StringChangeEventArgs(string stringValue, ushort type, ushort index)
Type = type;
Index = index;
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/GenericRESTfulCommunications/Constants.cs b/src/PepperDash.Core/GenericRESTfulCommunications/Constants.cs
index 1b78c33f1..d8a09e4e4 100644
--- a/src/PepperDash.Core/GenericRESTfulCommunications/Constants.cs
+++ b/src/PepperDash.Core/GenericRESTfulCommunications/Constants.cs
@@ -4,13 +4,13 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.GenericRESTfulCommunications
-{
+namespace PepperDash.Core.GenericRESTfulCommunications;
+
///
/// Constants
///
- public class GenericRESTfulConstants
- {
+public class GenericRESTfulConstants
+{
///
/// Generic boolean change
///
@@ -35,5 +35,4 @@ public class GenericRESTfulConstants
/// Error string change
///
public const ushort ErrorStringChange = 203;
- }
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/GenericRESTfulCommunications/GenericRESTfulClient.cs b/src/PepperDash.Core/GenericRESTfulCommunications/GenericRESTfulClient.cs
index bd33e13cb..16a2ee04a 100644
--- a/src/PepperDash.Core/GenericRESTfulCommunications/GenericRESTfulClient.cs
+++ b/src/PepperDash.Core/GenericRESTfulCommunications/GenericRESTfulClient.cs
@@ -6,8 +6,8 @@
using Crestron.SimplSharp.Net.Http;
using Crestron.SimplSharp.Net.Https;
-namespace PepperDash.Core.GenericRESTfulCommunications
-{
+namespace PepperDash.Core.GenericRESTfulCommunications;
+
///
/// Generic RESTful communication class
///
@@ -42,7 +42,7 @@ public GenericRESTfulClient()
///
///
///
- ///
+ ///
public void SubmitRequest(string url, ushort port, ushort requestType, string contentType, string username, string password)
{
if (url.StartsWith("https:", StringComparison.OrdinalIgnoreCase))
@@ -65,7 +65,7 @@ public void SubmitRequest(string url, ushort port, ushort requestType, string co
///
///
///
- ///
+ ///
///
///
private void SubmitRequestHttp(string url, ushort port, ushort requestType, string contentType, string username, string password)
@@ -123,7 +123,7 @@ private void SubmitRequestHttp(string url, ushort port, ushort requestType, stri
///
///
///
- ///
+ ///
///
///
private void SubmitRequestHttps(string url, ushort port, ushort requestType, string contentType, string username, string password)
@@ -252,5 +252,4 @@ protected void OnStringChange(string value, ushort index, ushort type)
StringChange(this, args);
}
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonStandardObjects/EventArgs and Constants.cs b/src/PepperDash.Core/JsonStandardObjects/EventArgs and Constants.cs
index ed02ccb06..a41345dc6 100644
--- a/src/PepperDash.Core/JsonStandardObjects/EventArgs and Constants.cs
+++ b/src/PepperDash.Core/JsonStandardObjects/EventArgs and Constants.cs
@@ -4,8 +4,8 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.JsonStandardObjects
-{
+namespace PepperDash.Core.JsonStandardObjects;
+
///
/// Constants for simpl modules
///
@@ -73,5 +73,4 @@ public DeviceChangeEventArgs(DeviceConfig device, ushort type, ushort index)
Type = type;
Index = index;
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonStandardObjects/JsonToSimplDevice.cs b/src/PepperDash.Core/JsonStandardObjects/JsonToSimplDevice.cs
index 3abfd36a1..591cbd5c0 100644
--- a/src/PepperDash.Core/JsonStandardObjects/JsonToSimplDevice.cs
+++ b/src/PepperDash.Core/JsonStandardObjects/JsonToSimplDevice.cs
@@ -4,8 +4,8 @@
using PepperDash.Core.JsonToSimpl;
using Serilog.Events;
-namespace PepperDash.Core.JsonStandardObjects
-{
+namespace PepperDash.Core.JsonStandardObjects;
+
///
/// Device class
///
@@ -179,5 +179,4 @@ protected void OnObjectChange(DeviceConfig device, ushort index, ushort type)
}
#endregion EventHandler Helpers
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonStandardObjects/JsonToSimplDeviceConfig.cs b/src/PepperDash.Core/JsonStandardObjects/JsonToSimplDeviceConfig.cs
index fa23d87ee..6f1f74c46 100644
--- a/src/PepperDash.Core/JsonStandardObjects/JsonToSimplDeviceConfig.cs
+++ b/src/PepperDash.Core/JsonStandardObjects/JsonToSimplDeviceConfig.cs
@@ -4,8 +4,8 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.JsonStandardObjects
-{
+namespace PepperDash.Core.JsonStandardObjects;
+
/*
Convert JSON snippt to C#: http://json2csharp.com/#
@@ -52,55 +52,55 @@ namespace PepperDash.Core.JsonStandardObjects
///
public class ComParamsConfig
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int baudRate { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int dataBits { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int stopBits { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string parity { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string protocol { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string hardwareHandshake { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string softwareHandshake { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int pacing { get; set; }
// convert properties for simpl
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplBaudRate { get { return Convert.ToUInt16(baudRate); } }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplDataBits { get { return Convert.ToUInt16(dataBits); } }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplStopBits { get { return Convert.ToUInt16(stopBits); } }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplPacing { get { return Convert.ToUInt16(pacing); } }
///
@@ -117,43 +117,43 @@ public ComParamsConfig()
///
public class TcpSshPropertiesConfig
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string address { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int port { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string username { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string password { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public bool autoReconnect { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int autoReconnectIntervalMs { get; set; }
// convert properties for simpl
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplPort { get { return Convert.ToUInt16(port); } }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplAutoReconnect { get { return (ushort)(autoReconnect ? 1 : 0); } }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplAutoReconnectIntervalMs { get { return Convert.ToUInt16(autoReconnectIntervalMs); } }
///
@@ -170,31 +170,31 @@ public TcpSshPropertiesConfig()
///
public class ControlConfig
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string method { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string controlPortDevKey { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int controlPortNumber { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ComParamsConfig comParams { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public TcpSshPropertiesConfig tcpSshProperties { get; set; }
// convert properties for simpl
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplControlPortNumber { get { return Convert.ToUInt16(controlPortNumber); } }
///
@@ -212,27 +212,27 @@ public ControlConfig()
///
public class PropertiesConfig
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int deviceId { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public bool enabled { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ControlConfig control { get; set; }
// convert properties for simpl
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplDeviceId { get { return Convert.ToUInt16(deviceId); } }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort simplEnabled { get { return (ushort)(enabled ? 1 : 0); } }
///
@@ -249,9 +249,8 @@ public PropertiesConfig()
///
public class RootObject
{
- ///
- /// The collection of devices
- ///
+ ///
+ /// The collection of devices
+ ///
public List devices { get; set; }
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonToSimpl/Constants.cs b/src/PepperDash.Core/JsonToSimpl/Constants.cs
index d87b50c20..9b8d08ff5 100644
--- a/src/PepperDash.Core/JsonToSimpl/Constants.cs
+++ b/src/PepperDash.Core/JsonToSimpl/Constants.cs
@@ -4,78 +4,78 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.JsonToSimpl
-{
+namespace PepperDash.Core.JsonToSimpl;
+
///
/// Constants for Simpl modules
///
public class JsonToSimplConstants
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort BoolValueChange = 1;
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort JsonIsValidBoolChange = 2;
- ///
- /// Reports the if the device is 3-series compatible
- ///
- public const ushort ProgramCompatibility3SeriesChange = 3;
+ ///
+ /// Reports the if the device is 3-series compatible
+ ///
+ public const ushort ProgramCompatibility3SeriesChange = 3;
- ///
- /// Reports the if the device is 4-series compatible
- ///
- public const ushort ProgramCompatibility4SeriesChange = 4;
+ ///
+ /// Reports the if the device is 4-series compatible
+ ///
+ public const ushort ProgramCompatibility4SeriesChange = 4;
- ///
- /// Reports the device platform enum value
- ///
- public const ushort DevicePlatformValueChange = 5;
+ ///
+ /// Reports the device platform enum value
+ ///
+ public const ushort DevicePlatformValueChange = 5;
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort UshortValueChange = 101;
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort StringValueChange = 201;
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort FullPathToArrayChange = 202;
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort ActualFilePathChange = 203;
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort FilenameResolvedChange = 204;
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort FilePathResolvedChange = 205;
- ///
- /// Reports the root directory change
- ///
- public const ushort RootDirectoryChange = 206;
+ ///
+ /// Reports the root directory change
+ ///
+ public const ushort RootDirectoryChange = 206;
- ///
- /// Reports the room ID change
- ///
- public const ushort RoomIdChange = 207;
+ ///
+ /// Reports the room ID change
+ ///
+ public const ushort RoomIdChange = 207;
- ///
- /// Reports the room name change
- ///
- public const ushort RoomNameChange = 208;
+ ///
+ /// Reports the room name change
+ ///
+ public const ushort RoomNameChange = 208;
}
///
@@ -88,33 +88,33 @@ public class JsonToSimplConstants
///
public class SPlusValueWrapper
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public SPlusType ValueType { get; private set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort Index { get; private set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort BoolUShortValue { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string StringValue { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public SPlusValueWrapper() {}
- ///
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
+ ///
public SPlusValueWrapper(SPlusType type, ushort index)
{
ValueType = type;
@@ -127,17 +127,16 @@ public SPlusValueWrapper(SPlusType type, ushort index)
///
public enum SPlusType
{
- ///
- /// Digital
- ///
+ ///
+ /// Digital
+ ///
Digital,
- ///
- /// Analog
- ///
- Analog,
- ///
- /// String
- ///
- String
- }
-}
\ No newline at end of file
+ ///
+ /// Analog
+ ///
+ Analog,
+ ///
+ /// String
+ ///
+ String
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonToSimpl/Global.cs b/src/PepperDash.Core/JsonToSimpl/Global.cs
index 8392fa614..9a30853e0 100644
--- a/src/PepperDash.Core/JsonToSimpl/Global.cs
+++ b/src/PepperDash.Core/JsonToSimpl/Global.cs
@@ -7,11 +7,11 @@
//using PepperDash.Core;
-namespace PepperDash.Core.JsonToSimpl
-{
- ///
- /// The global class to manage all the instances of JsonToSimplMaster
- ///
+namespace PepperDash.Core.JsonToSimpl;
+
+///
+/// The global class to manage all the instances of JsonToSimplMaster
+///
public class J2SGlobal
{
static List Masters = new List();
@@ -22,7 +22,7 @@ public class J2SGlobal
/// master, this will fail
///
/// New master to add
- ///
+ ///
public static void AddMaster(JsonToSimplMaster master)
{
if (master == null)
@@ -56,5 +56,4 @@ public static JsonToSimplMaster GetMasterByFile(string file)
{
return Masters.FirstOrDefault(m => m.UniqueID.Equals(file, StringComparison.OrdinalIgnoreCase));
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonToSimpl/JsonToSimplArrayLookupChild.cs b/src/PepperDash.Core/JsonToSimpl/JsonToSimplArrayLookupChild.cs
index c94dad295..bd5ad8aed 100644
--- a/src/PepperDash.Core/JsonToSimpl/JsonToSimplArrayLookupChild.cs
+++ b/src/PepperDash.Core/JsonToSimpl/JsonToSimplArrayLookupChild.cs
@@ -3,20 +3,20 @@
using Newtonsoft.Json.Linq;
using Serilog.Events;
-namespace PepperDash.Core.JsonToSimpl
-{
- ///
- /// Used to interact with an array of values with the S+ modules
- ///
+namespace PepperDash.Core.JsonToSimpl;
+
+///
+/// Used to interact with an array of values with the S+ modules
+///
public class JsonToSimplArrayLookupChild : JsonToSimplChildObjectBase
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string SearchPropertyName { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string SearchPropertyValue { get; set; }
int ArrayIndex;
@@ -76,9 +76,9 @@ protected override string GetFullPath(string path)
PathSuffix == null ? "" : PathSuffix);
}
- ///
- /// Process all values
- ///
+ ///
+ /// Process all values
+ ///
public override void ProcessAll()
{
if (FindInArray())
@@ -158,5 +158,4 @@ bool FindInArray()
return false;
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonToSimpl/JsonToSimplChildObjectBase.cs b/src/PepperDash.Core/JsonToSimpl/JsonToSimplChildObjectBase.cs
index 5aa67c966..7ebb6f27d 100644
--- a/src/PepperDash.Core/JsonToSimpl/JsonToSimplChildObjectBase.cs
+++ b/src/PepperDash.Core/JsonToSimpl/JsonToSimplChildObjectBase.cs
@@ -3,29 +3,29 @@
using System.Linq;
using Newtonsoft.Json.Linq;
-namespace PepperDash.Core.JsonToSimpl
-{
- ///
- /// Base class for JSON objects
- ///
+namespace PepperDash.Core.JsonToSimpl;
+
+///
+/// Base class for JSON objects
+///
public abstract class JsonToSimplChildObjectBase : IKeyed
{
- ///
- /// Notifies of bool change
- ///
+ ///
+ /// Notifies of bool change
+ ///
public event EventHandler BoolChange;
- ///
- /// Notifies of ushort change
- ///
+ ///
+ /// Notifies of ushort change
+ ///
public event EventHandler UShortChange;
- ///
- /// Notifies of string change
- ///
+ ///
+ /// Notifies of string change
+ ///
public event EventHandler StringChange;
- ///
- /// Delegate to get all values
- ///
+ ///
+ /// Delegate to get all values
+ ///
public SPlusValuesDelegate GetAllValuesDelegate { get; set; }
///
@@ -33,9 +33,9 @@ public abstract class JsonToSimplChildObjectBase : IKeyed
///
public SPlusValuesDelegate SetAllPathsDelegate { get; set; }
- ///
- /// Unique identifier for instance
- ///
+ ///
+ /// Unique identifier for instance
+ ///
public string Key { get; protected set; }
///
@@ -49,33 +49,33 @@ public abstract class JsonToSimplChildObjectBase : IKeyed
///
public string PathSuffix { get; protected set; }
- ///
- /// Indicates if the instance is linked to an object
- ///
+ ///
+ /// Indicates if the instance is linked to an object
+ ///
public bool LinkedToObject { get; protected set; }
- ///
- /// Reference to Master instance
- ///
+ ///
+ /// Reference to Master instance
+ ///
protected JsonToSimplMaster Master;
- ///
- /// Paths to boolean values in JSON structure
- ///
- protected Dictionary BoolPaths = new Dictionary();
- ///
- /// Paths to numeric values in JSON structure
- ///
+ ///
+ /// Paths to boolean values in JSON structure
+ ///
+ protected Dictionary BoolPaths = new Dictionary();
+ ///
+ /// Paths to numeric values in JSON structure
+ ///
protected Dictionary UshortPaths = new Dictionary();
- ///
- /// Paths to string values in JSON structure
- ///
+ ///
+ /// Paths to string values in JSON structure
+ ///
protected Dictionary StringPaths = new Dictionary();
///
/// Call this before doing anything else
///
- ///
+ ///
///
///
///
@@ -92,10 +92,10 @@ public void Initialize(string masterUniqueId, string key, string pathPrefix, str
Debug.Console(1, "JSON Child [{0}] cannot link to master {1}", key, masterUniqueId);
}
- ///
- /// Sets the path prefix for the object
- ///
- ///
+ ///
+ /// Sets the path prefix for the object
+ ///
+ ///
public void SetPathPrefix(string pathPrefix)
{
PathPrefix = pathPrefix;
@@ -170,18 +170,18 @@ void ProcessBoolPath(ushort index)
}
// Processes the path to a ushort, converting to ushort if able, twos complement if necessary, firing off UshrtChange event
- void ProcessUshortPath(ushort index) {
- string response;
- if (Process(UshortPaths[index], out response)) {
- ushort val;
- try { val = Convert.ToInt32(response) < 0 ? (ushort)(Convert.ToInt16(response) + 65536) : Convert.ToUInt16(response); }
- catch { val = 0; }
-
- OnUShortChange(val, index, JsonToSimplConstants.UshortValueChange);
- }
- else { }
- // OnUShortChange(0, index, JsonToSimplConstants.UshortValueChange);
+ void ProcessUshortPath(ushort index) {
+ string response;
+ if (Process(UshortPaths[index], out response)) {
+ ushort val;
+ try { val = Convert.ToInt32(response) < 0 ? (ushort)(Convert.ToInt16(response) + 65536) : Convert.ToUInt16(response); }
+ catch { val = 0; }
+
+ OnUShortChange(val, index, JsonToSimplConstants.UshortValueChange);
}
+ else { }
+ // OnUShortChange(0, index, JsonToSimplConstants.UshortValueChange);
+ }
// Processes the path to a string property and fires of a StringChange event.
void ProcessStringPath(ushort index)
@@ -272,54 +272,54 @@ public void UpdateInputsForMaster()
GetAllValuesDelegate();
}
- ///
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
+ ///
public void USetBoolValue(ushort key, ushort theValue)
{
SetBoolValue(key, theValue == 1);
}
- ///
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
+ ///
public void SetBoolValue(ushort key, bool theValue)
{
if (BoolPaths.ContainsKey(key))
SetValueOnMaster(BoolPaths[key], new JValue(theValue));
}
- ///
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
+ ///
public void SetUShortValue(ushort key, ushort theValue)
{
if (UshortPaths.ContainsKey(key))
SetValueOnMaster(UshortPaths[key], new JValue(theValue));
}
- ///
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
+ ///
public void SetStringValue(ushort key, string theValue)
{
if (StringPaths.ContainsKey(key))
SetValueOnMaster(StringPaths[key], new JValue(theValue));
}
- ///
- ///
- ///
- ///
- ///
+ ///
+ ///
+ ///
+ ///
+ ///
public void SetValueOnMaster(string keyPath, JValue valueToSave)
{
var path = GetFullPath(keyPath);
@@ -349,12 +349,12 @@ protected virtual string GetFullPath(string path)
// Helpers for events
//******************************************************************************************
- ///
- /// Event helper
- ///
- ///
- ///
- ///
+ ///
+ /// Event helper
+ ///
+ ///
+ ///
+ ///
protected void OnBoolChange(bool state, ushort index, ushort type)
{
var handler = BoolChange;
@@ -367,12 +367,12 @@ protected void OnBoolChange(bool state, ushort index, ushort type)
}
//******************************************************************************************
- ///
- /// Event helper
- ///
- ///
- ///
- ///
+ ///
+ /// Event helper
+ ///
+ ///
+ ///
+ ///
protected void OnUShortChange(ushort state, ushort index, ushort type)
{
var handler = UShortChange;
@@ -384,12 +384,12 @@ protected void OnUShortChange(ushort state, ushort index, ushort type)
}
}
- ///
- /// Event helper
- ///
- ///
- ///
- ///
+ ///
+ /// Event helper
+ ///
+ ///
+ ///
+ ///
protected void OnStringChange(string value, ushort index, ushort type)
{
var handler = StringChange;
@@ -400,5 +400,4 @@ protected void OnStringChange(string value, ushort index, ushort type)
StringChange(this, args);
}
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonToSimpl/JsonToSimplFileMaster.cs b/src/PepperDash.Core/JsonToSimpl/JsonToSimplFileMaster.cs
index 411fbdc52..83c92e80d 100644
--- a/src/PepperDash.Core/JsonToSimpl/JsonToSimplFileMaster.cs
+++ b/src/PepperDash.Core/JsonToSimpl/JsonToSimplFileMaster.cs
@@ -7,281 +7,280 @@
using Crestron.SimplSharp.CrestronIO;
using Newtonsoft.Json.Linq;
-namespace PepperDash.Core.JsonToSimpl
+namespace PepperDash.Core.JsonToSimpl;
+
+///
+/// Represents a JSON file that can be read and written to
+///
+public class JsonToSimplFileMaster : JsonToSimplMaster
{
///
- /// Represents a JSON file that can be read and written to
+ /// Sets the filepath as well as registers this with the Global.Masters list
+ ///
+ public string Filepath { get; private set; }
+
+ ///
+ /// Filepath to the actual file that will be read (Portal or local)
+ ///
+ public string ActualFilePath { get; private set; }
+
+ ///
+ ///
///
- public class JsonToSimplFileMaster : JsonToSimplMaster
+ public string Filename { get; private set; }
+ ///
+ ///
+ ///
+ public string FilePathName { get; private set; }
+
+ /*****************************************************************************************/
+ /** Privates **/
+
+
+ // The JSON file in JObject form
+ // For gathering the incoming data
+ object StringBuilderLock = new object();
+ // To prevent multiple same-file access
+ static object FileLock = new object();
+
+ /*****************************************************************************************/
+
+ ///
+ /// SIMPL+ default constructor.
+ ///
+ public JsonToSimplFileMaster()
{
- ///
- /// Sets the filepath as well as registers this with the Global.Masters list
- ///
- public string Filepath { get; private set; }
-
- ///
- /// Filepath to the actual file that will be read (Portal or local)
- ///
- public string ActualFilePath { get; private set; }
-
- ///
- ///
- ///
- public string Filename { get; private set; }
- ///
- ///
- ///
- public string FilePathName { get; private set; }
-
- /*****************************************************************************************/
- /** Privates **/
-
-
- // The JSON file in JObject form
- // For gathering the incoming data
- object StringBuilderLock = new object();
- // To prevent multiple same-file access
- static object FileLock = new object();
-
- /*****************************************************************************************/
-
- ///
- /// SIMPL+ default constructor.
- ///
- public JsonToSimplFileMaster()
- {
- }
+ }
- ///
- /// Read, evaluate and udpate status
- ///
- public void EvaluateFile(string filepath)
+ ///
+ /// Read, evaluate and udpate status
+ ///
+ public void EvaluateFile(string filepath)
+ {
+ try
{
- try
- {
- OnBoolChange(false, 0, JsonToSimplConstants.JsonIsValidBoolChange);
+ OnBoolChange(false, 0, JsonToSimplConstants.JsonIsValidBoolChange);
- var dirSeparator = Path.DirectorySeparatorChar;
- var dirSeparatorAlt = Path.AltDirectorySeparatorChar;
+ var dirSeparator = Path.DirectorySeparatorChar;
+ var dirSeparatorAlt = Path.AltDirectorySeparatorChar;
- var series = CrestronEnvironment.ProgramCompatibility;
+ var series = CrestronEnvironment.ProgramCompatibility;
- var is3Series = (eCrestronSeries.Series3 == (series & eCrestronSeries.Series3));
- OnBoolChange(is3Series, 0,
- JsonToSimplConstants.ProgramCompatibility3SeriesChange);
+ var is3Series = (eCrestronSeries.Series3 == (series & eCrestronSeries.Series3));
+ OnBoolChange(is3Series, 0,
+ JsonToSimplConstants.ProgramCompatibility3SeriesChange);
- var is4Series = (eCrestronSeries.Series4 == (series & eCrestronSeries.Series4));
- OnBoolChange(is4Series, 0,
- JsonToSimplConstants.ProgramCompatibility4SeriesChange);
+ var is4Series = (eCrestronSeries.Series4 == (series & eCrestronSeries.Series4));
+ OnBoolChange(is4Series, 0,
+ JsonToSimplConstants.ProgramCompatibility4SeriesChange);
- var isServer = CrestronEnvironment.DevicePlatform == eDevicePlatform.Server;
- OnBoolChange(isServer, 0,
- JsonToSimplConstants.DevicePlatformValueChange);
+ var isServer = CrestronEnvironment.DevicePlatform == eDevicePlatform.Server;
+ OnBoolChange(isServer, 0,
+ JsonToSimplConstants.DevicePlatformValueChange);
- // get the roomID
- var roomId = Crestron.SimplSharp.InitialParametersClass.RoomId;
- if (!string.IsNullOrEmpty(roomId))
- {
- OnStringChange(roomId, 0, JsonToSimplConstants.RoomIdChange);
- }
+ // get the roomID
+ var roomId = Crestron.SimplSharp.InitialParametersClass.RoomId;
+ if (!string.IsNullOrEmpty(roomId))
+ {
+ OnStringChange(roomId, 0, JsonToSimplConstants.RoomIdChange);
+ }
- // get the roomName
- var roomName = Crestron.SimplSharp.InitialParametersClass.RoomName;
- if (!string.IsNullOrEmpty(roomName))
- {
- OnStringChange(roomName, 0, JsonToSimplConstants.RoomNameChange);
- }
+ // get the roomName
+ var roomName = Crestron.SimplSharp.InitialParametersClass.RoomName;
+ if (!string.IsNullOrEmpty(roomName))
+ {
+ OnStringChange(roomName, 0, JsonToSimplConstants.RoomNameChange);
+ }
- var rootDirectory = Directory.GetApplicationRootDirectory();
- OnStringChange(rootDirectory, 0, JsonToSimplConstants.RootDirectoryChange);
-
- var splusPath = string.Empty;
- if (Regex.IsMatch(filepath, @"user", RegexOptions.IgnoreCase))
- {
- if (is4Series)
- splusPath = Regex.Replace(filepath, "user", "user", RegexOptions.IgnoreCase);
- else if (isServer)
- splusPath = Regex.Replace(filepath, "user", "User", RegexOptions.IgnoreCase);
- else
- splusPath = filepath;
- }
+ var rootDirectory = Directory.GetApplicationRootDirectory();
+ OnStringChange(rootDirectory, 0, JsonToSimplConstants.RootDirectoryChange);
+
+ var splusPath = string.Empty;
+ if (Regex.IsMatch(filepath, @"user", RegexOptions.IgnoreCase))
+ {
+ if (is4Series)
+ splusPath = Regex.Replace(filepath, "user", "user", RegexOptions.IgnoreCase);
+ else if (isServer)
+ splusPath = Regex.Replace(filepath, "user", "User", RegexOptions.IgnoreCase);
+ else
+ splusPath = filepath;
+ }
+
+ filepath = splusPath.Replace(dirSeparatorAlt, dirSeparator);
+
+ Filepath = string.Format("{1}{0}{2}", dirSeparator, rootDirectory,
+ filepath.TrimStart(dirSeparator, dirSeparatorAlt));
+
+ OnStringChange(string.Format("Attempting to evaluate {0}", Filepath), 0, JsonToSimplConstants.StringValueChange);
- filepath = splusPath.Replace(dirSeparatorAlt, dirSeparator);
-
- Filepath = string.Format("{1}{0}{2}", dirSeparator, rootDirectory,
- filepath.TrimStart(dirSeparator, dirSeparatorAlt));
-
- OnStringChange(string.Format("Attempting to evaluate {0}", Filepath), 0, JsonToSimplConstants.StringValueChange);
+ if (string.IsNullOrEmpty(Filepath))
+ {
+ OnStringChange(string.Format("Cannot evaluate file. JSON file path not set"), 0, JsonToSimplConstants.StringValueChange);
+ CrestronConsole.PrintLine("Cannot evaluate file. JSON file path not set");
+ return;
+ }
+
+ // get file directory and name to search
+ var fileDirectory = Path.GetDirectoryName(Filepath);
+ var fileName = Path.GetFileName(Filepath);
+
+ OnStringChange(string.Format("Checking '{0}' for '{1}'", fileDirectory, fileName), 0, JsonToSimplConstants.StringValueChange);
+ Debug.Console(1, "Checking '{0}' for '{1}'", fileDirectory, fileName);
- if (string.IsNullOrEmpty(Filepath))
+ if (Directory.Exists(fileDirectory))
+ {
+ // get the directory info
+ var directoryInfo = new DirectoryInfo(fileDirectory);
+
+ // get the file to be read
+ var actualFile = directoryInfo.GetFiles(fileName).FirstOrDefault();
+ if (actualFile == null)
{
- OnStringChange(string.Format("Cannot evaluate file. JSON file path not set"), 0, JsonToSimplConstants.StringValueChange);
- CrestronConsole.PrintLine("Cannot evaluate file. JSON file path not set");
+ var msg = string.Format("JSON file not found: {0}", Filepath);
+ OnStringChange(msg, 0, JsonToSimplConstants.StringValueChange);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
return;
}
- // get file directory and name to search
- var fileDirectory = Path.GetDirectoryName(Filepath);
- var fileName = Path.GetFileName(Filepath);
+ // \xSE\xR\PDT000-Template_Main_Config-Combined_DSP_v00.02.json
+ // \USER\PDT000-Template_Main_Config-Combined_DSP_v00.02.json
+ ActualFilePath = actualFile.FullName;
+ OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange);
+ OnStringChange(string.Format("Actual JSON file is {0}", ActualFilePath), 0, JsonToSimplConstants.StringValueChange);
+ Debug.Console(1, "Actual JSON file is {0}", ActualFilePath);
- OnStringChange(string.Format("Checking '{0}' for '{1}'", fileDirectory, fileName), 0, JsonToSimplConstants.StringValueChange);
- Debug.Console(1, "Checking '{0}' for '{1}'", fileDirectory, fileName);
+ Filename = actualFile.Name;
+ OnStringChange(Filename, 0, JsonToSimplConstants.FilenameResolvedChange);
+ OnStringChange(string.Format("JSON Filename is {0}", Filename), 0, JsonToSimplConstants.StringValueChange);
+ Debug.Console(1, "JSON Filename is {0}", Filename);
- if (Directory.Exists(fileDirectory))
- {
- // get the directory info
- var directoryInfo = new DirectoryInfo(fileDirectory);
-
- // get the file to be read
- var actualFile = directoryInfo.GetFiles(fileName).FirstOrDefault();
- if (actualFile == null)
- {
- var msg = string.Format("JSON file not found: {0}", Filepath);
- OnStringChange(msg, 0, JsonToSimplConstants.StringValueChange);
- CrestronConsole.PrintLine(msg);
- ErrorLog.Error(msg);
- return;
- }
-
- // \xSE\xR\PDT000-Template_Main_Config-Combined_DSP_v00.02.json
- // \USER\PDT000-Template_Main_Config-Combined_DSP_v00.02.json
- ActualFilePath = actualFile.FullName;
- OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange);
- OnStringChange(string.Format("Actual JSON file is {0}", ActualFilePath), 0, JsonToSimplConstants.StringValueChange);
- Debug.Console(1, "Actual JSON file is {0}", ActualFilePath);
-
- Filename = actualFile.Name;
- OnStringChange(Filename, 0, JsonToSimplConstants.FilenameResolvedChange);
- OnStringChange(string.Format("JSON Filename is {0}", Filename), 0, JsonToSimplConstants.StringValueChange);
- Debug.Console(1, "JSON Filename is {0}", Filename);
-
-
- FilePathName = string.Format(@"{0}{1}", actualFile.DirectoryName, dirSeparator);
- OnStringChange(string.Format(@"{0}", actualFile.DirectoryName), 0, JsonToSimplConstants.FilePathResolvedChange);
- OnStringChange(string.Format(@"JSON File Path is {0}", actualFile.DirectoryName), 0, JsonToSimplConstants.StringValueChange);
- Debug.Console(1, "JSON File Path is {0}", FilePathName);
-
- var json = File.ReadToEnd(ActualFilePath, System.Text.Encoding.ASCII);
-
- JsonObject = JObject.Parse(json);
- foreach (var child in Children)
- child.ProcessAll();
-
- OnBoolChange(true, 0, JsonToSimplConstants.JsonIsValidBoolChange);
- }
- else
- {
- OnStringChange(string.Format("'{0}' not found", fileDirectory), 0, JsonToSimplConstants.StringValueChange);
- Debug.Console(1, "'{0}' not found", fileDirectory);
- }
+
+ FilePathName = string.Format(@"{0}{1}", actualFile.DirectoryName, dirSeparator);
+ OnStringChange(string.Format(@"{0}", actualFile.DirectoryName), 0, JsonToSimplConstants.FilePathResolvedChange);
+ OnStringChange(string.Format(@"JSON File Path is {0}", actualFile.DirectoryName), 0, JsonToSimplConstants.StringValueChange);
+ Debug.Console(1, "JSON File Path is {0}", FilePathName);
+
+ var json = File.ReadToEnd(ActualFilePath, System.Text.Encoding.ASCII);
+
+ JsonObject = JObject.Parse(json);
+ foreach (var child in Children)
+ child.ProcessAll();
+
+ OnBoolChange(true, 0, JsonToSimplConstants.JsonIsValidBoolChange);
}
- catch (Exception e)
+ else
{
- var msg = string.Format("EvaluateFile Exception: Message\r{0}", e.Message);
- OnStringChange(msg, 0, JsonToSimplConstants.StringValueChange);
- CrestronConsole.PrintLine(msg);
- ErrorLog.Error(msg);
-
- var stackTrace = string.Format("EvaluateFile: Stack Trace\r{0}", e.StackTrace);
- OnStringChange(stackTrace, 0, JsonToSimplConstants.StringValueChange);
- CrestronConsole.PrintLine(stackTrace);
- ErrorLog.Error(stackTrace);
+ OnStringChange(string.Format("'{0}' not found", fileDirectory), 0, JsonToSimplConstants.StringValueChange);
+ Debug.Console(1, "'{0}' not found", fileDirectory);
}
}
+ catch (Exception e)
+ {
+ var msg = string.Format("EvaluateFile Exception: Message\r{0}", e.Message);
+ OnStringChange(msg, 0, JsonToSimplConstants.StringValueChange);
+ CrestronConsole.PrintLine(msg);
+ ErrorLog.Error(msg);
+
+ var stackTrace = string.Format("EvaluateFile: Stack Trace\r{0}", e.StackTrace);
+ OnStringChange(stackTrace, 0, JsonToSimplConstants.StringValueChange);
+ CrestronConsole.PrintLine(stackTrace);
+ ErrorLog.Error(stackTrace);
+ }
+ }
- ///
- /// Sets the debug level
- ///
- ///
- public void setDebugLevel(uint level)
+ ///
+ /// Sets the debug level
+ ///
+ ///
+ public void setDebugLevel(uint level)
+ {
+ Debug.SetDebugLevel(level);
+ }
+
+ ///
+ /// Saves the values to the file
+ ///
+ public override void Save()
+ {
+ // this code is duplicated in the other masters!!!!!!!!!!!!!
+ UnsavedValues = new Dictionary();
+ // Make each child update their values into master object
+ foreach (var child in Children)
{
- Debug.SetDebugLevel(level);
+ Debug.Console(1, "Master [{0}] checking child [{1}] for updates to save", UniqueID, child.Key);
+ child.UpdateInputsForMaster();
}
- ///
- /// Saves the values to the file
- ///
- public override void Save()
+ if (UnsavedValues == null || UnsavedValues.Count == 0)
{
- // this code is duplicated in the other masters!!!!!!!!!!!!!
- UnsavedValues = new Dictionary();
- // Make each child update their values into master object
- foreach (var child in Children)
- {
- Debug.Console(1, "Master [{0}] checking child [{1}] for updates to save", UniqueID, child.Key);
- child.UpdateInputsForMaster();
- }
-
- if (UnsavedValues == null || UnsavedValues.Count == 0)
+ Debug.Console(1, "Master [{0}] No updated values to save. Skipping", UniqueID);
+ return;
+ }
+ lock (FileLock)
+ {
+ Debug.Console(1, "Saving");
+ foreach (var path in UnsavedValues.Keys)
{
- Debug.Console(1, "Master [{0}] No updated values to save. Skipping", UniqueID);
- return;
+ var tokenToReplace = JsonObject.SelectToken(path);
+ if (tokenToReplace != null)
+ {// It's found
+ tokenToReplace.Replace(UnsavedValues[path]);
+ Debug.Console(1, "JSON Master[{0}] Updating '{1}'", UniqueID, path);
+ }
+ else // No token. Let's make one
+ {
+ //http://stackoverflow.com/questions/17455052/how-to-set-the-value-of-a-json-path-using-json-net
+ Debug.Console(1, "JSON Master[{0}] Cannot write value onto missing property: '{1}'", UniqueID, path);
+
+ // JContainer jpart = JsonObject;
+ // // walk down the path and find where it goes
+ //#warning Does not handle arrays.
+ // foreach (var part in path.Split('.'))
+ // {
+
+ // var openPos = part.IndexOf('[');
+ // if (openPos > -1)
+ // {
+ // openPos++; // move to number
+ // var closePos = part.IndexOf(']');
+ // var arrayName = part.Substring(0, openPos - 1); // get the name
+ // var index = Convert.ToInt32(part.Substring(openPos, closePos - openPos));
+
+ // // Check if the array itself exists and add the item if so
+ // if (jpart[arrayName] != null)
+ // {
+ // var arrayObj = jpart[arrayName] as JArray;
+ // var item = arrayObj[index];
+ // if (item == null)
+ // arrayObj.Add(new JObject());
+ // }
+
+ // Debug.Console(0, "IGNORING MISSING ARRAY VALUE FOR NOW");
+ // continue;
+ // }
+ // // Build the
+ // if (jpart[part] == null)
+ // jpart.Add(new JProperty(part, new JObject()));
+ // jpart = jpart[part] as JContainer;
+ // }
+ // jpart.Replace(UnsavedValues[path]);
+ }
}
- lock (FileLock)
+ using (StreamWriter sw = new StreamWriter(ActualFilePath))
{
- Debug.Console(1, "Saving");
- foreach (var path in UnsavedValues.Keys)
+ try
{
- var tokenToReplace = JsonObject.SelectToken(path);
- if (tokenToReplace != null)
- {// It's found
- tokenToReplace.Replace(UnsavedValues[path]);
- Debug.Console(1, "JSON Master[{0}] Updating '{1}'", UniqueID, path);
- }
- else // No token. Let's make one
- {
- //http://stackoverflow.com/questions/17455052/how-to-set-the-value-of-a-json-path-using-json-net
- Debug.Console(1, "JSON Master[{0}] Cannot write value onto missing property: '{1}'", UniqueID, path);
-
- // JContainer jpart = JsonObject;
- // // walk down the path and find where it goes
- //#warning Does not handle arrays.
- // foreach (var part in path.Split('.'))
- // {
-
- // var openPos = part.IndexOf('[');
- // if (openPos > -1)
- // {
- // openPos++; // move to number
- // var closePos = part.IndexOf(']');
- // var arrayName = part.Substring(0, openPos - 1); // get the name
- // var index = Convert.ToInt32(part.Substring(openPos, closePos - openPos));
-
- // // Check if the array itself exists and add the item if so
- // if (jpart[arrayName] != null)
- // {
- // var arrayObj = jpart[arrayName] as JArray;
- // var item = arrayObj[index];
- // if (item == null)
- // arrayObj.Add(new JObject());
- // }
-
- // Debug.Console(0, "IGNORING MISSING ARRAY VALUE FOR NOW");
- // continue;
- // }
- // // Build the
- // if (jpart[part] == null)
- // jpart.Add(new JProperty(part, new JObject()));
- // jpart = jpart[part] as JContainer;
- // }
- // jpart.Replace(UnsavedValues[path]);
- }
+ sw.Write(JsonObject.ToString());
+ sw.Flush();
}
- using (StreamWriter sw = new StreamWriter(ActualFilePath))
+ catch (Exception e)
{
- try
- {
- sw.Write(JsonObject.ToString());
- sw.Flush();
- }
- catch (Exception e)
- {
- string err = string.Format("Error writing JSON file:\r{0}", e);
- Debug.Console(0, err);
- ErrorLog.Warn(err);
- return;
- }
+ string err = string.Format("Error writing JSON file:\r{0}", e);
+ Debug.Console(0, err);
+ ErrorLog.Warn(err);
+ return;
}
}
}
diff --git a/src/PepperDash.Core/JsonToSimpl/JsonToSimplFixedPathObject.cs b/src/PepperDash.Core/JsonToSimpl/JsonToSimplFixedPathObject.cs
index 3e69ed9db..6338e3090 100644
--- a/src/PepperDash.Core/JsonToSimpl/JsonToSimplFixedPathObject.cs
+++ b/src/PepperDash.Core/JsonToSimpl/JsonToSimplFixedPathObject.cs
@@ -1,18 +1,17 @@
-namespace PepperDash.Core.JsonToSimpl
-{
- ///
- ///
- ///
+namespace PepperDash.Core.JsonToSimpl;
+
+///
+///
+///
public class JsonToSimplFixedPathObject : JsonToSimplChildObjectBase
{
- ///
- /// Constructor
- ///
+ ///
+ /// Constructor
+ ///
public JsonToSimplFixedPathObject()
{
this.LinkedToObject = true;
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonToSimpl/JsonToSimplGenericMaster.cs b/src/PepperDash.Core/JsonToSimpl/JsonToSimplGenericMaster.cs
index e0f42f8e0..3399e0793 100644
--- a/src/PepperDash.Core/JsonToSimpl/JsonToSimplGenericMaster.cs
+++ b/src/PepperDash.Core/JsonToSimpl/JsonToSimplGenericMaster.cs
@@ -3,35 +3,35 @@
using Crestron.SimplSharp;
using Newtonsoft.Json.Linq;
-namespace PepperDash.Core.JsonToSimpl
-{
- ///
- /// Generic Master
- ///
+namespace PepperDash.Core.JsonToSimpl;
+
+///
+/// Generic Master
+///
public class JsonToSimplGenericMaster : JsonToSimplMaster
- {
+{
/*****************************************************************************************/
/** Privates **/
-
+
// The JSON file in JObject form
// For gathering the incoming data
object StringBuilderLock = new object();
// To prevent multiple same-file access
static object WriteLock = new object();
- ///
- /// Callback action for saving
- ///
+ ///
+ /// Callback action for saving
+ ///
public Action SaveCallback { get; set; }
/*****************************************************************************************/
///
- /// SIMPL+ default constructor.
- ///
+ /// SIMPL+ default constructor.
+ ///
public JsonToSimplGenericMaster()
- {
+ {
}
///
@@ -78,7 +78,7 @@ public void SetJsonWithoutEvaluating(string json)
public override void Save()
{
// this code is duplicated in the other masters!!!!!!!!!!!!!
- UnsavedValues = new Dictionary();
+ UnsavedValues = new Dictionary();
// Make each child update their values into master object
foreach (var child in Children)
{
@@ -114,5 +114,4 @@ public override void Save()
else
Debug.Console(0, this, "WARNING: No save callback defined.");
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/JsonToSimpl/JsonToSimplMaster.cs b/src/PepperDash.Core/JsonToSimpl/JsonToSimplMaster.cs
index 2f872e41d..928d4e777 100644
--- a/src/PepperDash.Core/JsonToSimpl/JsonToSimplMaster.cs
+++ b/src/PepperDash.Core/JsonToSimpl/JsonToSimplMaster.cs
@@ -2,33 +2,32 @@
using System.Collections.Generic;
using System.IO;
using Crestron.SimplSharp;
-using Crestron.SimplSharp.CrestronIO;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
-namespace PepperDash.Core.JsonToSimpl
-{
- ///
- /// Abstract base class for JsonToSimpl interactions
- ///
+namespace PepperDash.Core.JsonToSimpl;
+
+///
+/// Abstract base class for JsonToSimpl interactions
+///
public abstract class JsonToSimplMaster : IKeyed
{
- ///
- /// Notifies of bool change
- ///
+ ///
+ /// Notifies of bool change
+ ///
public event EventHandler BoolChange;
- ///
- /// Notifies of ushort change
- ///
+ ///
+ /// Notifies of ushort change
+ ///
public event EventHandler UshrtChange;
- ///
- /// Notifies of string change
- ///
+ ///
+ /// Notifies of string change
+ ///
public event EventHandler StringChange;
- ///
- /// A collection of associated child modules
- ///
+ ///
+ /// A collection of associated child modules
+ ///
protected List Children = new List();
/*****************************************************************************************/
@@ -38,9 +37,9 @@ public abstract class JsonToSimplMaster : IKeyed
///
public string Key { get { return UniqueID; } }
- ///
- /// A unique ID
- ///
+ ///
+ /// A unique ID
+ ///
public string UniqueID { get; protected set; }
///
@@ -83,9 +82,9 @@ public ushort UDebug
}
}
- ///
- ///
- ///
+ ///
+ ///
+ ///
public JObject JsonObject { get; protected set; }
/*****************************************************************************************/
@@ -142,9 +141,9 @@ public void AddUnsavedValue(string path, JValue value)
//Debug.Console(0, "Master[{0}] Unsaved size={1}", UniqueID, UnsavedValues.Count);
}
- ///
- /// Saves the file
- ///
+ ///
+ /// Saves the file
+ ///
public abstract void Save();
@@ -153,18 +152,14 @@ public void AddUnsavedValue(string path, JValue value)
///
public static class JsonFixes
{
- ///
- /// Deserializes a string into a JObject
- ///
- ///
- ///
+ ///
+ /// Deserializes a string into a JObject
+ ///
+ ///
+ ///
public static JObject ParseObject(string json)
{
- #if NET6_0
- using (var reader = new JsonTextReader(new System.IO.StringReader(json)))
-#else
- using (var reader = new JsonTextReader(new Crestron.SimplSharp.CrestronIO.StringReader(json)))
-#endif
+ using (var reader = new JsonTextReader(new StringReader(json)))
{
var startDepth = reader.Depth;
var obj = JObject.Load(reader);
@@ -174,18 +169,15 @@ public static JObject ParseObject(string json)
}
}
- ///
- /// Deserializes a string into a JArray
- ///
- ///
- ///
+ ///
+ /// Deserializes a string into a JArray
+ ///
+ ///
+ ///
public static JArray ParseArray(string json)
{
- #if NET6_0
- using (var reader = new JsonTextReader(new System.IO.StringReader(json)))
-#else
- using (var reader = new JsonTextReader(new Crestron.SimplSharp.CrestronIO.StringReader(json)))
-#endif
+
+ using (var reader = new JsonTextReader(new StringReader(json)))
{
var startDepth = reader.Depth;
var obj = JArray.Load(reader);
@@ -228,12 +220,12 @@ protected void OnUshrtChange(ushort state, ushort index, ushort type)
}
}
- ///
- /// Helper event
- ///
- ///
- ///
- ///
+ ///
+ /// Helper event
+ ///
+ ///
+ ///
+ ///
protected void OnStringChange(string value, ushort index, ushort type)
{
if (StringChange != null)
@@ -244,4 +236,3 @@ protected void OnStringChange(string value, ushort index, ushort type)
}
}
}
-}
diff --git a/src/PepperDash.Core/JsonToSimpl/JsonToSimplPortalFileMaster.cs b/src/PepperDash.Core/JsonToSimpl/JsonToSimplPortalFileMaster.cs
index c170a9a17..30c66dd21 100644
--- a/src/PepperDash.Core/JsonToSimpl/JsonToSimplPortalFileMaster.cs
+++ b/src/PepperDash.Core/JsonToSimpl/JsonToSimplPortalFileMaster.cs
@@ -6,22 +6,22 @@
using Newtonsoft.Json.Linq;
using PepperDash.Core.Config;
-namespace PepperDash.Core.JsonToSimpl
+namespace PepperDash.Core.JsonToSimpl;
+
+///
+/// Portal File Master
+///
+public class JsonToSimplPortalFileMaster : JsonToSimplMaster
{
- ///
- /// Portal File Master
- ///
- public class JsonToSimplPortalFileMaster : JsonToSimplMaster
- {
///
/// Sets the filepath as well as registers this with the Global.Masters list
///
public string PortalFilepath { get; private set; }
- ///
- /// File path of the actual file being read (Portal or local)
- ///
- public string ActualFilePath { get; private set; }
+ ///
+ /// File path of the actual file being read (Portal or local)
+ ///
+ public string ActualFilePath { get; private set; }
/*****************************************************************************************/
/** Privates **/
@@ -33,10 +33,10 @@ public class JsonToSimplPortalFileMaster : JsonToSimplMaster
/*****************************************************************************************/
///
- /// SIMPL+ default constructor.
- ///
+ /// SIMPL+ default constructor.
+ ///
public JsonToSimplPortalFileMaster()
- {
+ {
}
///
@@ -64,7 +64,7 @@ public void EvaluateFile(string portalFilepath)
if (actualLocalFile != null)
{
ActualFilePath = actualLocalFile.FullName;
- OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange);
+ OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange);
}
// If the local file does not exist, then read the portal file xyz.json
// and create the local.
@@ -78,7 +78,7 @@ public void EvaluateFile(string portalFilepath)
// got the portal file, hand off to the merge / save method
PortalConfigReader.ReadAndMergeFileIfNecessary(actualPortalFile.FullName, newLocalPath);
ActualFilePath = newLocalPath;
- OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange);
+ OnStringChange(ActualFilePath, 0, JsonToSimplConstants.ActualFilePathChange);
}
else
{
@@ -188,4 +188,3 @@ public override void Save()
}
}
}
-}
diff --git a/src/PepperDash.Core/Logging/CrestronEnricher.cs b/src/PepperDash.Core/Logging/CrestronEnricher.cs
index 902ce8d57..1f8799258 100644
--- a/src/PepperDash.Core/Logging/CrestronEnricher.cs
+++ b/src/PepperDash.Core/Logging/CrestronEnricher.cs
@@ -7,31 +7,30 @@
using System.Text;
using System.Threading.Tasks;
-namespace PepperDash.Core.Logging
+namespace PepperDash.Core.Logging;
+
+public class CrestronEnricher : ILogEventEnricher
{
- public class CrestronEnricher : ILogEventEnricher
- {
- static readonly string _appName;
+ static readonly string _appName;
- static CrestronEnricher()
+ static CrestronEnricher()
+ {
+ switch (CrestronEnvironment.DevicePlatform)
{
- switch (CrestronEnvironment.DevicePlatform)
- {
- case eDevicePlatform.Appliance:
- _appName = $"App {InitialParametersClass.ApplicationNumber}";
- break;
- case eDevicePlatform.Server:
- _appName = $"{InitialParametersClass.RoomId}";
- break;
- }
+ case eDevicePlatform.Appliance:
+ _appName = $"App {InitialParametersClass.ApplicationNumber}";
+ break;
+ case eDevicePlatform.Server:
+ _appName = $"{InitialParametersClass.RoomId}";
+ break;
}
-
+ }
+
- public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
- {
- var property = propertyFactory.CreateProperty("App", _appName);
+ public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
+ {
+ var property = propertyFactory.CreateProperty("App", _appName);
- logEvent.AddOrUpdateProperty(property);
- }
+ logEvent.AddOrUpdateProperty(property);
}
}
diff --git a/src/PepperDash.Core/Logging/Debug.cs b/src/PepperDash.Core/Logging/Debug.cs
index 38dfa0348..592a401fe 100644
--- a/src/PepperDash.Core/Logging/Debug.cs
+++ b/src/PepperDash.Core/Logging/Debug.cs
@@ -1,4 +1,8 @@
-using Crestron.SimplSharp;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using Crestron.SimplSharp;
using Crestron.SimplSharp.CrestronDataStore;
using Crestron.SimplSharp.CrestronIO;
using Crestron.SimplSharp.CrestronLogger;
@@ -11,112 +15,111 @@
using Serilog.Formatting.Compact;
using Serilog.Formatting.Json;
using Serilog.Templates;
-using System;
-using System.Collections.Generic;
-using System.Reflection;
-using System.Text.RegularExpressions;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Contains debug commands for use in various situations
+///
+public static class Debug
{
- ///
- /// Contains debug commands for use in various situations
- ///
- public static class Debug
- {
- private static readonly string LevelStoreKey = "ConsoleDebugLevel";
- private static readonly string WebSocketLevelStoreKey = "WebsocketDebugLevel";
- private static readonly string ErrorLogLevelStoreKey = "ErrorLogDebugLevel";
- private static readonly string FileLevelStoreKey = "FileDebugLevel";
+ private static readonly string LevelStoreKey = "ConsoleDebugLevel";
+ private static readonly string WebSocketLevelStoreKey = "WebsocketDebugLevel";
+ private static readonly string ErrorLogLevelStoreKey = "ErrorLogDebugLevel";
+ private static readonly string FileLevelStoreKey = "FileDebugLevel";
+ private static readonly string DoNotLoadOnNextBootKey = "DoNotLoadOnNextBoot";
- private static readonly Dictionary _logLevels = new Dictionary()
- {
- {0, LogEventLevel.Information },
- {3, LogEventLevel.Warning },
- {4, LogEventLevel.Error },
- {5, LogEventLevel.Fatal },
- {1, LogEventLevel.Debug },
- {2, LogEventLevel.Verbose },
- };
+ private static readonly Dictionary _logLevels = new Dictionary()
+ {
+ {0, LogEventLevel.Information },
+ {3, LogEventLevel.Warning },
+ {4, LogEventLevel.Error },
+ {5, LogEventLevel.Fatal },
+ {1, LogEventLevel.Debug },
+ {2, LogEventLevel.Verbose },
+ };
- private static ILogger _logger;
+ private static ILogger _logger;
- private static readonly LoggingLevelSwitch _consoleLoggingLevelSwitch;
+ private static readonly LoggingLevelSwitch _consoleLoggingLevelSwitch;
- private static readonly LoggingLevelSwitch _websocketLoggingLevelSwitch;
+ private static readonly LoggingLevelSwitch _websocketLoggingLevelSwitch;
- private static readonly LoggingLevelSwitch _errorLogLevelSwitch;
+ private static readonly LoggingLevelSwitch _errorLogLevelSwitch;
- private static readonly LoggingLevelSwitch _fileLevelSwitch;
+ private static readonly LoggingLevelSwitch _fileLevelSwitch;
- public static LogEventLevel WebsocketMinimumLogLevel
- {
- get { return _websocketLoggingLevelSwitch.MinimumLevel; }
- }
+ public static LogEventLevel WebsocketMinimumLogLevel
+ {
+ get { return _websocketLoggingLevelSwitch.MinimumLevel; }
+ }
- private static readonly DebugWebsocketSink _websocketSink;
+ private static readonly DebugWebsocketSink _websocketSink;
- public static DebugWebsocketSink WebsocketSink
- {
- get { return _websocketSink; }
- }
+ public static DebugWebsocketSink WebsocketSink
+ {
+ get { return _websocketSink; }
+ }
- ///
- /// Describes the folder location where a given program stores it's debug level memory. By default, the
- /// file written will be named appNdebug where N is 1-10.
- ///
- public static string OldFilePathPrefix = @"\nvram\debug\";
+ ///
+ /// Describes the folder location where a given program stores it's debug level memory. By default, the
+ /// file written will be named appNdebug where N is 1-10.
+ ///
+ public static string OldFilePathPrefix = @"\nvram\debug\";
- ///
- /// Describes the new folder location where a given program stores it's debug level memory. By default, the
- /// file written will be named appNdebug where N is 1-10.
- ///
- public static string NewFilePathPrefix = @"\user\debug\";
+ ///
+ /// Describes the new folder location where a given program stores it's debug level memory. By default, the
+ /// file written will be named appNdebug where N is 1-10.
+ ///
+ public static string NewFilePathPrefix = @"\user\debug\";
- ///
- /// The name of the file containing the current debug settings.
- ///
- public static string FileName = string.Format(@"app{0}Debug.json", InitialParametersClass.ApplicationNumber);
+ ///
+ /// The name of the file containing the current debug settings.
+ ///
+ public static string FileName = string.Format(@"app{0}Debug.json", InitialParametersClass.ApplicationNumber);
- ///
- /// Debug level to set for a given program.
- ///
- public static int Level { get; private set; }
+ ///
+ /// Debug level to set for a given program.
+ ///
+ public static int Level { get; private set; }
- ///
- /// When this is true, the configuration file will NOT be loaded until triggered by either a console command or a signal
- ///
- public static bool DoNotLoadConfigOnNextBoot { get; private set; }
+ ///
+ /// When this is true, the configuration file will NOT be loaded until triggered by either a console command or a signal
+ ///
+ public static bool DoNotLoadConfigOnNextBoot { get; private set; }
- private static DebugContextCollection _contexts;
+ private static DebugContextCollection _contexts;
- private const int SaveTimeoutMs = 30000;
+ private const int SaveTimeoutMs = 30000;
- public static bool IsRunningOnAppliance = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance;
+ public static bool IsRunningOnAppliance = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance;
- ///
- /// Version for the currently loaded PepperDashCore dll
- ///
- public static string PepperDashCoreVersion { get; private set; }
+ ///
+ /// Version for the currently loaded PepperDashCore dll
+ ///
+ public static string PepperDashCoreVersion { get; private set; }
- private static CTimer _saveTimer;
+ private static CTimer _saveTimer;
- ///
- /// When true, the IncludedExcludedKeys dict will contain keys to include.
- /// When false (default), IncludedExcludedKeys will contain keys to exclude.
- ///
- private static bool _excludeAllMode;
+ ///
+ /// When true, the IncludedExcludedKeys dict will contain keys to include.
+ /// When false (default), IncludedExcludedKeys will contain keys to exclude.
+ ///
+ private static bool _excludeAllMode;
- //static bool ExcludeNoKeyMessages;
+ //static bool ExcludeNoKeyMessages;
- private static readonly Dictionary IncludedExcludedKeys;
+ private static readonly Dictionary IncludedExcludedKeys;
- private static readonly LoggerConfiguration _defaultLoggerConfiguration;
+ private static readonly LoggerConfiguration _defaultLoggerConfiguration;
- private static LoggerConfiguration _loggerConfiguration;
+ private static LoggerConfiguration _loggerConfiguration;
- public static LoggerConfiguration LoggerConfiguration => _loggerConfiguration;
+ public static LoggerConfiguration LoggerConfiguration => _loggerConfiguration;
- static Debug()
+ static Debug()
+ {
+ try
{
CrestronDataStoreStatic.InitCrestronDataStore();
@@ -128,7 +131,7 @@ static Debug()
var defaultFileLogLevel = GetStoredLogEventLevel(FileLevelStoreKey);
- _consoleLoggingLevelSwitch = new LoggingLevelSwitch(initialMinimumLevel: defaultConsoleLevel);
+ _consoleLoggingLevelSwitch = new LoggingLevelSwitch(initialMinimumLevel: defaultConsoleLevel);
_websocketLoggingLevelSwitch = new LoggingLevelSwitch(initialMinimumLevel: defaultWebsocketLevel);
@@ -144,7 +147,7 @@ static Debug()
CrestronConsole.PrintLine($"Saving log files to {logFilePath}");
- var errorLogTemplate = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance
+ var errorLogTemplate = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance
? "{@t:fff}ms [{@l:u4}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}"
: "[{@t:yyyy-MM-dd HH:mm:ss.fff}][{@l:u4}][{App}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}";
@@ -155,28 +158,13 @@ static Debug()
.WriteTo.Sink(new DebugConsoleSink(new ExpressionTemplate("[{@t:yyyy-MM-dd HH:mm:ss.fff}][{@l:u4}][{App}]{#if Key is not null}[{Key}]{#end} {@m}{#if @x is not null}\r\n{@x}{#end}")), levelSwitch: _consoleLoggingLevelSwitch)
.WriteTo.Sink(_websocketSink, levelSwitch: _websocketLoggingLevelSwitch)
.WriteTo.Sink(new DebugErrorLogSink(new ExpressionTemplate(errorLogTemplate)), levelSwitch: _errorLogLevelSwitch)
- .WriteTo.File(new RenderedCompactJsonFormatter(), logFilePath,
+ .WriteTo.File(new RenderedCompactJsonFormatter(), logFilePath,
rollingInterval: RollingInterval.Day,
restrictedToMinimumLevel: LogEventLevel.Debug,
retainedFileCountLimit: CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance ? 30 : 60,
levelSwitch: _fileLevelSwitch
);
- try
- {
- if (InitialParametersClass.NumberOfRemovableDrives > 0)
- {
- CrestronConsole.PrintLine("{0} RM Drive(s) Present. Initializing CrestronLogger", InitialParametersClass.NumberOfRemovableDrives);
- _defaultLoggerConfiguration.WriteTo.Sink(new DebugCrestronLoggerSink());
- }
- else
- CrestronConsole.PrintLine("No RM Drive(s) Present. Not using Crestron Logger");
- }
- catch (Exception e)
- {
- CrestronConsole.PrintLine("Initializing of CrestronLogger failed: {0}", e);
- }
-
// Instantiate the root logger
_loggerConfiguration = _defaultLoggerConfiguration;
@@ -193,38 +181,34 @@ static Debug()
CrestronConsole.PrintLine(msg);
- LogMessage(LogEventLevel.Information,msg);
+ LogMessage(LogEventLevel.Information, msg);
+
+ IncludedExcludedKeys = new Dictionary();
- IncludedExcludedKeys = new Dictionary();
-
if (CrestronEnvironment.RuntimeEnvironment == eRuntimeEnvironment.SimplSharpPro)
{
// Add command to console
- CrestronConsole.AddNewConsoleCommand(SetDoNotLoadOnNextBootFromConsole, "donotloadonnextboot",
+ CrestronConsole.AddNewConsoleCommand(SetDoNotLoadOnNextBootFromConsole, "donotloadonnextboot",
"donotloadonnextboot:P [true/false]: Should the application load on next boot", ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(SetDebugFromConsole, "appdebug",
"appdebug:P [0-5]: Sets the application's console debug message level",
ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(ShowDebugLog, "appdebuglog",
- "appdebuglog:P [all] Use \"all\" for full log.",
+ "appdebuglog:P [all] Use \"all\" for full log.",
ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(s => CrestronLogger.Clear(false), "appdebugclear",
- "appdebugclear:P Clears the current custom log",
+ "appdebugclear:P Clears the current custom log",
ConsoleAccessLevelEnum.AccessOperator);
- CrestronConsole.AddNewConsoleCommand(SetDebugFilterFromConsole, "appdebugfilter",
- "appdebugfilter [params]", ConsoleAccessLevelEnum.AccessOperator);
+ CrestronConsole.AddNewConsoleCommand(SetDebugFilterFromConsole, "appdebugfilter",
+ "appdebugfilter [params]", ConsoleAccessLevelEnum.AccessOperator);
}
CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler;
- LoadMemory();
+ DoNotLoadConfigOnNextBoot = GetDoNotLoadOnNextBoot();
- var context = _contexts.GetOrCreateItem("DEFAULT");
- Level = context.Level;
- DoNotLoadConfigOnNextBoot = context.DoNotLoadOnNextBoot;
-
- if(DoNotLoadConfigOnNextBoot)
+ if (DoNotLoadConfigOnNextBoot)
CrestronConsole.PrintLine(string.Format("Program {0} will not load config after next boot. Use console command go:{0} to load the config manually", InitialParametersClass.ApplicationNumber));
_consoleLoggingLevelSwitch.MinimumLevelChanged += (sender, args) =>
@@ -232,726 +216,749 @@ static Debug()
LogMessage(LogEventLevel.Information, "Console debug level set to {minimumLevel}", _consoleLoggingLevelSwitch.MinimumLevel);
};
}
-
- public static void UpdateLoggerConfiguration(LoggerConfiguration config)
+ catch (Exception ex)
{
- _loggerConfiguration = config;
-
- _logger = config.CreateLogger();
+ LogError(ex, "Exception in Debug static constructor: {message}", ex.Message);
}
+ }
- public static void ResetLoggerConfiguration()
- {
- _loggerConfiguration = _defaultLoggerConfiguration;
+ private static bool GetDoNotLoadOnNextBoot()
+ {
+ var err = CrestronDataStoreStatic.GetLocalBoolValue(DoNotLoadOnNextBootKey, out var doNotLoad);
- _logger = _loggerConfiguration.CreateLogger();
+ if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ {
+ LogError("Error retrieving DoNotLoadOnNextBoot value: {err}", err);
+ doNotLoad = false;
}
- private static LogEventLevel GetStoredLogEventLevel(string levelStoreKey)
- {
- try
- {
- var result = CrestronDataStoreStatic.GetLocalIntValue(levelStoreKey, out int logLevel);
+ return doNotLoad;
+ }
- if (result != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
- {
- CrestronConsole.Print($"Unable to retrieve stored log level for {levelStoreKey}.\r\nError: {result}.\r\nSetting level to {LogEventLevel.Information}\r\n");
- return LogEventLevel.Information;
- }
+ public static void UpdateLoggerConfiguration(LoggerConfiguration config)
+ {
+ _loggerConfiguration = config;
- if(logLevel < 0 || logLevel > 5)
- {
- CrestronConsole.PrintLine($"Stored Log level not valid for {levelStoreKey}: {logLevel}. Setting level to {LogEventLevel.Information}");
- return LogEventLevel.Information;
- }
+ _logger = config.CreateLogger();
+ }
+
+ public static void ResetLoggerConfiguration()
+ {
+ _loggerConfiguration = _defaultLoggerConfiguration;
+
+ _logger = _loggerConfiguration.CreateLogger();
+ }
- return (LogEventLevel)logLevel;
- } catch (Exception ex)
+ private static LogEventLevel GetStoredLogEventLevel(string levelStoreKey)
+ {
+ try
+ {
+ var result = CrestronDataStoreStatic.GetLocalIntValue(levelStoreKey, out int logLevel);
+
+ if (result != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
{
- CrestronConsole.PrintLine($"Exception retrieving log level for {levelStoreKey}: {ex.Message}");
+ CrestronConsole.Print($"Unable to retrieve stored log level for {levelStoreKey}.\r\nError: {result}.\r\nSetting level to {LogEventLevel.Information}\r\n");
return LogEventLevel.Information;
}
- }
-
- private static void GetVersion()
- {
- var assembly = Assembly.GetExecutingAssembly();
- var ver =
- assembly
- .GetCustomAttributes(typeof (AssemblyInformationalVersionAttribute), false);
- if (ver != null && ver.Length > 0)
+ if (logLevel < 0 || logLevel > 5)
{
- if (ver[0] is AssemblyInformationalVersionAttribute verAttribute)
- {
- PepperDashCoreVersion = verAttribute.InformationalVersion;
- }
+ CrestronConsole.PrintLine($"Stored Log level not valid for {levelStoreKey}: {logLevel}. Setting level to {LogEventLevel.Information}");
+ return LogEventLevel.Information;
}
- else
+
+ return (LogEventLevel)logLevel;
+ }
+ catch (Exception ex)
+ {
+ CrestronConsole.PrintLine($"Exception retrieving log level for {levelStoreKey}: {ex.Message}");
+ return LogEventLevel.Information;
+ }
+ }
+
+ private static void GetVersion()
+ {
+ var assembly = Assembly.GetExecutingAssembly();
+ var ver =
+ assembly
+ .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false);
+
+ if (ver != null && ver.Length > 0)
+ {
+ if (ver[0] is AssemblyInformationalVersionAttribute verAttribute)
{
- var version = assembly.GetName().Version;
- PepperDashCoreVersion = version.ToString();
+ PepperDashCoreVersion = verAttribute.InformationalVersion;
}
}
+ else
+ {
+ var version = assembly.GetName().Version;
+ PepperDashCoreVersion = version.ToString();
+ }
+ }
- ///
- /// Used to save memory when shutting down
- ///
- ///
- static void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ ///
+ /// Used to save memory when shutting down
+ ///
+ ///
+ static void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ {
+
+ if (programEventType == eProgramStatusEventType.Stopping)
{
+ Log.CloseAndFlush();
- if (programEventType == eProgramStatusEventType.Stopping)
+ if (_saveTimer != null)
{
- Log.CloseAndFlush();
-
- if (_saveTimer != null)
- {
- _saveTimer.Stop();
- _saveTimer = null;
- }
- LogMessage(LogEventLevel.Information, "Saving debug settings");
- SaveMemory();
+ _saveTimer.Stop();
+ _saveTimer = null;
}
+ LogMessage(LogEventLevel.Information, "Saving debug settings");
+ SaveMemory();
}
+ }
- ///
- /// Callback for console command
- ///
- ///
- public static void SetDebugFromConsole(string levelString)
+ ///
+ /// Callback for console command
+ ///
+ ///
+ public static void SetDebugFromConsole(string levelString)
+ {
+ try
{
- try
+ if (levelString.Trim() == "?")
{
- if (levelString.Trim() == "?")
- {
- CrestronConsole.ConsoleCommandResponse(
- $@"Used to set the minimum level of debug messages to be printed to the console:
-{_logLevels[0]} = 0
-{_logLevels[1]} = 1
-{_logLevels[2]} = 2
-{_logLevels[3]} = 3
-{_logLevels[4]} = 4
-{_logLevels[5]} = 5");
- return;
- }
-
- if (string.IsNullOrEmpty(levelString.Trim()))
- {
- CrestronConsole.ConsoleCommandResponse("AppDebug level = {0}", _consoleLoggingLevelSwitch.MinimumLevel);
- return;
- }
+ CrestronConsole.ConsoleCommandResponse(
+ "Used to set the minimum level of debug messages to be printed to the console:\r\n" +
+ $"{_logLevels[0]} = 0\r\n" +
+ $"{_logLevels[1]} = 1\r\n" +
+ $"{_logLevels[2]} = 2\r\n" +
+ $"{_logLevels[3]} = 3\r\n" +
+ $"{_logLevels[4]} = 4\r\n" +
+ $"{_logLevels[5]} = 5");
+ return;
+ }
- if(int.TryParse(levelString, out var levelInt))
- {
- if(levelInt < 0 || levelInt > 5)
- {
- CrestronConsole.ConsoleCommandResponse($"Error: Unable to parse {levelString} to valid log level. If using a number, value must be between 0-5");
- return;
- }
- SetDebugLevel((uint) levelInt);
- return;
- }
+ if (string.IsNullOrEmpty(levelString.Trim()))
+ {
+ CrestronConsole.ConsoleCommandResponse("AppDebug level = {0}", _consoleLoggingLevelSwitch.MinimumLevel);
+ return;
+ }
- if(Enum.TryParse(levelString, out var levelEnum))
+ if (int.TryParse(levelString, out var levelInt))
+ {
+ if (levelInt < 0 || levelInt > 5)
{
- SetDebugLevel(levelEnum);
+ CrestronConsole.ConsoleCommandResponse($"Error: Unable to parse {levelString} to valid log level. If using a number, value must be between 0-5");
return;
}
+ SetDebugLevel((uint)levelInt);
+ return;
+ }
- CrestronConsole.ConsoleCommandResponse($"Error: Unable to parse {levelString} to valid log level");
- }
- catch
+ if (Enum.TryParse(levelString, out var levelEnum))
{
- CrestronConsole.ConsoleCommandResponse("Usage: appdebug:P [0-5]");
+ SetDebugLevel(levelEnum);
+ return;
}
- }
- ///
- /// Sets the debug level
- ///
- /// Valid values 0-5
- public static void SetDebugLevel(uint level)
+ CrestronConsole.ConsoleCommandResponse($"Error: Unable to parse {levelString} to valid log level");
+ }
+ catch
{
- if(!_logLevels.TryGetValue(level, out var logLevel))
- {
- logLevel = LogEventLevel.Information;
+ CrestronConsole.ConsoleCommandResponse("Usage: appdebug:P [0-5]");
+ }
+ }
- CrestronConsole.ConsoleCommandResponse($"{level} not valid. Setting level to {logLevel}");
+ ///
+ /// Sets the debug level
+ ///
+ /// Valid values 0-5
+ public static void SetDebugLevel(uint level)
+ {
+ if (!_logLevels.TryGetValue(level, out var logLevel))
+ {
+ logLevel = LogEventLevel.Information;
- SetDebugLevel(logLevel);
- }
+ CrestronConsole.ConsoleCommandResponse($"{level} not valid. Setting level to {logLevel}");
SetDebugLevel(logLevel);
}
- public static void SetDebugLevel(LogEventLevel level)
- {
- _consoleLoggingLevelSwitch.MinimumLevel = level;
+ SetDebugLevel(logLevel);
+ }
- CrestronConsole.ConsoleCommandResponse("[Application {0}], Debug level set to {1}\r\n",
- InitialParametersClass.ApplicationNumber, _consoleLoggingLevelSwitch.MinimumLevel);
+ public static void SetDebugLevel(LogEventLevel level)
+ {
+ _consoleLoggingLevelSwitch.MinimumLevel = level;
- CrestronConsole.ConsoleCommandResponse($"Storing level {level}:{(int) level}");
+ CrestronConsole.ConsoleCommandResponse("[Application {0}], Debug level set to {1}\r\n",
+ InitialParametersClass.ApplicationNumber, _consoleLoggingLevelSwitch.MinimumLevel);
- var err = CrestronDataStoreStatic.SetLocalIntValue(LevelStoreKey, (int) level);
+ CrestronConsole.ConsoleCommandResponse($"Storing level {level}:{(int)level}");
- CrestronConsole.ConsoleCommandResponse($"Store result: {err}:{(int)level}");
+ var err = CrestronDataStoreStatic.SetLocalIntValue(LevelStoreKey, (int)level);
- if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
- CrestronConsole.PrintLine($"Error saving console debug level setting: {err}");
- }
+ CrestronConsole.ConsoleCommandResponse($"Store result: {err}:{(int)level}");
- public static void SetWebSocketMinimumDebugLevel(LogEventLevel level)
- {
- _websocketLoggingLevelSwitch.MinimumLevel = level;
+ if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ CrestronConsole.PrintLine($"Error saving console debug level setting: {err}");
+ }
- var err = CrestronDataStoreStatic.SetLocalUintValue(WebSocketLevelStoreKey, (uint) level);
+ public static void SetWebSocketMinimumDebugLevel(LogEventLevel level)
+ {
+ _websocketLoggingLevelSwitch.MinimumLevel = level;
- if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
- LogMessage(LogEventLevel.Information, "Error saving websocket debug level setting: {erro}", err);
+ var err = CrestronDataStoreStatic.SetLocalUintValue(WebSocketLevelStoreKey, (uint)level);
- LogMessage(LogEventLevel.Information, "Websocket debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel);
- }
+ if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ LogMessage(LogEventLevel.Information, "Error saving websocket debug level setting: {erro}", err);
- public static void SetErrorLogMinimumDebugLevel(LogEventLevel level)
- {
- _errorLogLevelSwitch.MinimumLevel = level;
+ LogMessage(LogEventLevel.Information, "Websocket debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel);
+ }
- var err = CrestronDataStoreStatic.SetLocalUintValue(ErrorLogLevelStoreKey, (uint)level);
+ public static void SetErrorLogMinimumDebugLevel(LogEventLevel level)
+ {
+ _errorLogLevelSwitch.MinimumLevel = level;
- if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
- LogMessage(LogEventLevel.Information, "Error saving Error Log debug level setting: {error}", err);
+ var err = CrestronDataStoreStatic.SetLocalUintValue(ErrorLogLevelStoreKey, (uint)level);
- LogMessage(LogEventLevel.Information, "Error log debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel);
- }
+ if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ LogMessage(LogEventLevel.Information, "Error saving Error Log debug level setting: {error}", err);
- public static void SetFileMinimumDebugLevel(LogEventLevel level)
- {
- _errorLogLevelSwitch.MinimumLevel = level;
+ LogMessage(LogEventLevel.Information, "Error log debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel);
+ }
- var err = CrestronDataStoreStatic.SetLocalUintValue(ErrorLogLevelStoreKey, (uint)level);
+ public static void SetFileMinimumDebugLevel(LogEventLevel level)
+ {
+ _errorLogLevelSwitch.MinimumLevel = level;
+
+ var err = CrestronDataStoreStatic.SetLocalUintValue(ErrorLogLevelStoreKey, (uint)level);
- if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
- LogMessage(LogEventLevel.Information, "Error saving File debug level setting: {error}", err);
+ if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ LogMessage(LogEventLevel.Information, "Error saving File debug level setting: {error}", err);
+
+ LogMessage(LogEventLevel.Information, "File debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel);
+ }
+
+ ///
+ /// Callback for console command
+ ///
+ ///
+ public static void SetDoNotLoadOnNextBootFromConsole(string stateString)
+ {
+ try
+ {
+ if (string.IsNullOrEmpty(stateString.Trim()))
+ {
+ CrestronConsole.ConsoleCommandResponse("DoNotLoadOnNextBoot = {0}", DoNotLoadConfigOnNextBoot);
+ return;
+ }
- LogMessage(LogEventLevel.Information, "File debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel);
+ SetDoNotLoadConfigOnNextBoot(bool.Parse(stateString));
}
+ catch
+ {
+ CrestronConsole.ConsoleCommandResponse("Usage: donotloadonnextboot:P [true/false]");
+ }
+ }
- ///
- /// Callback for console command
- ///
- ///
- public static void SetDoNotLoadOnNextBootFromConsole(string stateString)
+ ///
+ /// Callback for console command
+ ///
+ ///
+ public static void SetDebugFilterFromConsole(string items)
+ {
+ var str = items.Trim();
+ if (str == "?")
{
- try
+ CrestronConsole.ConsoleCommandResponse("Usage:\r APPDEBUGFILTER key1 key2 key3....\r " +
+ "+all: at beginning puts filter into 'default include' mode\r" +
+ " All keys that follow will be excluded from output.\r" +
+ "-all: at beginning puts filter into 'default exclude all' mode.\r" +
+ " All keys that follow will be the only keys that are shown\r" +
+ "+nokey: Enables messages with no key (default)\r" +
+ "-nokey: Disables messages with no key.\r" +
+ "(nokey settings are independent of all other settings)");
+ return;
+ }
+ var keys = Regex.Split(str, @"\s*");
+ foreach (var keyToken in keys)
+ {
+ var lkey = keyToken.ToLower();
+ if (lkey == "+all")
+ {
+ IncludedExcludedKeys.Clear();
+ _excludeAllMode = false;
+ }
+ else if (lkey == "-all")
+ {
+ IncludedExcludedKeys.Clear();
+ _excludeAllMode = true;
+ }
+ //else if (lkey == "+nokey")
+ //{
+ // ExcludeNoKeyMessages = false;
+ //}
+ //else if (lkey == "-nokey")
+ //{
+ // ExcludeNoKeyMessages = true;
+ //}
+ else
{
- if (string.IsNullOrEmpty(stateString.Trim()))
+ string key;
+ if (lkey.StartsWith("-"))
{
- CrestronConsole.ConsoleCommandResponse("DoNotLoadOnNextBoot = {0}", DoNotLoadConfigOnNextBoot);
- return;
+ key = lkey.Substring(1);
+ // if in exclude all mode, we need to remove this from the inclusions
+ if (_excludeAllMode)
+ {
+ if (IncludedExcludedKeys.ContainsKey(key))
+ IncludedExcludedKeys.Remove(key);
+ }
+ // otherwise include all mode, add to the exclusions
+ else
+ {
+ IncludedExcludedKeys[key] = new object();
+ }
}
+ else if (lkey.StartsWith("+"))
+ {
+ key = lkey.Substring(1);
+ // if in exclude all mode, we need to add this as inclusion
+ if (_excludeAllMode)
+ {
- SetDoNotLoadConfigOnNextBoot(bool.Parse(stateString));
- }
- catch
- {
- CrestronConsole.ConsoleCommandResponse("Usage: donotloadonnextboot:P [true/false]");
+ IncludedExcludedKeys[key] = new object();
+ }
+ // otherwise include all mode, remove this from exclusions
+ else
+ {
+ if (IncludedExcludedKeys.ContainsKey(key))
+ IncludedExcludedKeys.Remove(key);
+ }
+ }
}
}
-
- ///
- /// Callback for console command
- ///
- ///
- public static void SetDebugFilterFromConsole(string items)
- {
- var str = items.Trim();
- if (str == "?")
- {
- CrestronConsole.ConsoleCommandResponse("Usage:\r APPDEBUGFILTER key1 key2 key3....\r " +
- "+all: at beginning puts filter into 'default include' mode\r" +
- " All keys that follow will be excluded from output.\r" +
- "-all: at beginning puts filter into 'default exclude all' mode.\r" +
- " All keys that follow will be the only keys that are shown\r" +
- "+nokey: Enables messages with no key (default)\r" +
- "-nokey: Disables messages with no key.\r" +
- "(nokey settings are independent of all other settings)");
- return;
- }
- var keys = Regex.Split(str, @"\s*");
- foreach (var keyToken in keys)
- {
- var lkey = keyToken.ToLower();
- if (lkey == "+all")
- {
- IncludedExcludedKeys.Clear();
- _excludeAllMode = false;
- }
- else if (lkey == "-all")
- {
- IncludedExcludedKeys.Clear();
- _excludeAllMode = true;
- }
- //else if (lkey == "+nokey")
- //{
- // ExcludeNoKeyMessages = false;
- //}
- //else if (lkey == "-nokey")
- //{
- // ExcludeNoKeyMessages = true;
- //}
- else
- {
- string key;
- if (lkey.StartsWith("-"))
- {
- key = lkey.Substring(1);
- // if in exclude all mode, we need to remove this from the inclusions
- if (_excludeAllMode)
- {
- if (IncludedExcludedKeys.ContainsKey(key))
- IncludedExcludedKeys.Remove(key);
- }
- // otherwise include all mode, add to the exclusions
- else
- {
- IncludedExcludedKeys[key] = new object();
- }
- }
- else if (lkey.StartsWith("+"))
- {
- key = lkey.Substring(1);
- // if in exclude all mode, we need to add this as inclusion
- if (_excludeAllMode)
- {
-
- IncludedExcludedKeys[key] = new object();
- }
- // otherwise include all mode, remove this from exclusions
- else
- {
- if (IncludedExcludedKeys.ContainsKey(key))
- IncludedExcludedKeys.Remove(key);
- }
- }
- }
- }
- }
+ }
- ///
- /// sets the settings for a device or creates a new entry
- ///
- ///
- ///
- ///
- public static void SetDeviceDebugSettings(string deviceKey, object settings)
- {
- _contexts.SetDebugSettingsForKey(deviceKey, settings);
- SaveMemoryOnTimeout();
- }
+ ///
+ /// sets the settings for a device or creates a new entry
+ ///
+ ///
+ ///
+ ///
+ public static void SetDeviceDebugSettings(string deviceKey, object settings)
+ {
+ _contexts.SetDebugSettingsForKey(deviceKey, settings);
+ SaveMemoryOnTimeout();
+ }
- ///
- /// Gets the device settings for a device by key or returns null
- ///
- ///
- ///
- public static object GetDeviceDebugSettingsForKey(string deviceKey)
- {
- return _contexts.GetDebugSettingsForKey(deviceKey);
- }
+ ///
+ /// Gets the device settings for a device by key or returns null
+ ///
+ ///
+ ///
+ public static object GetDeviceDebugSettingsForKey(string deviceKey)
+ {
+ return _contexts.GetDebugSettingsForKey(deviceKey);
+ }
- ///
- /// Sets the flag to prevent application starting on next boot
- ///
- ///
- public static void SetDoNotLoadConfigOnNextBoot(bool state)
- {
- DoNotLoadConfigOnNextBoot = state;
- _contexts.GetOrCreateItem("DEFAULT").DoNotLoadOnNextBoot = state;
- SaveMemoryOnTimeout();
+ ///
+ /// Sets the flag to prevent application starting on next boot
+ ///
+ ///
+ public static void SetDoNotLoadConfigOnNextBoot(bool state)
+ {
+ DoNotLoadConfigOnNextBoot = state;
- CrestronConsole.ConsoleCommandResponse("[Application {0}], Do Not Load Config on Next Boot set to {1}",
- InitialParametersClass.ApplicationNumber, DoNotLoadConfigOnNextBoot);
- }
+ var err = CrestronDataStoreStatic.SetLocalBoolValue(DoNotLoadOnNextBootKey, state);
- ///
- ///
- ///
- public static void ShowDebugLog(string s)
- {
- var loglist = CrestronLogger.PrintTheLog(s.ToLower() == "all");
- foreach (var l in loglist)
- CrestronConsole.ConsoleCommandResponse(l + CrestronEnvironment.NewLine);
- }
+ if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
+ LogError("Error saving console debug level setting: {err}", err);
- ///
- /// Log an Exception as an Error
- ///
- /// Exception to log
- /// Message template
- /// Optional IKeyed device. If provided, the Key of the device will be added to the log message
- /// Args to put into message template
- public static void LogMessage(Exception ex, string message, IKeyed device = null, params object[] args)
- {
- using (LogContext.PushProperty("Key", device?.Key))
- {
- _logger.Error(ex, message, args);
- }
- }
+ LogInformation("Do Not Load Config on Next Boot set to {state}", DoNotLoadConfigOnNextBoot);
+ }
- ///
- /// Log a message
- ///
- /// Level to log at
- /// Message template
- /// Optional IKeyed device. If provided, the Key of the device will be added to the log message
- /// Args to put into message template
- public static void LogMessage(LogEventLevel level, string message, IKeyed device = null, params object[] args)
- {
- using (LogContext.PushProperty("Key", device?.Key))
- {
- _logger.Write(level, message, args);
- }
- }
+ ///
+ ///
+ ///
+ public static void ShowDebugLog(string s)
+ {
+ var loglist = CrestronLogger.PrintTheLog(s.ToLower() == "all");
+ foreach (var l in loglist)
+ CrestronConsole.ConsoleCommandResponse(l + CrestronEnvironment.NewLine);
+ }
- public static void LogMessage(LogEventLevel level, string message, params object[] args)
+ ///
+ /// Log an Exception as an Error
+ ///
+ /// Exception to log
+ /// Message template
+ /// Optional IKeyed device. If provided, the Key of the device will be added to the log message
+ /// Args to put into message template
+ public static void LogMessage(Exception ex, string message, IKeyed device = null, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", device?.Key))
{
- _logger.Write(level, message, args);
+ _logger.Error(ex, message, args);
}
+ }
- public static void LogMessage(LogEventLevel level, Exception ex, string message, params object[] args)
+ ///
+ /// Log a message
+ ///
+ /// Level to log at
+ /// Message template
+ /// Optional IKeyed device. If provided, the Key of the device will be added to the log message
+ /// Args to put into message template
+ public static void LogMessage(LogEventLevel level, string message, IKeyed device = null, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", device?.Key))
{
- _logger.Write(level, ex, message, args);
+ _logger.Write(level, message, args);
}
+ }
- public static void LogMessage(LogEventLevel level, IKeyed keyed, string message, params object[] args)
- {
- LogMessage(level, message, keyed, args);
- }
+ public static void LogMessage(LogEventLevel level, string message, params object[] args)
+ {
+ _logger.Write(level, message, args);
+ }
- public static void LogMessage(LogEventLevel level, Exception ex, IKeyed device, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", device?.Key))
- {
- _logger.Write(level, ex, message, args);
- }
- }
+ public static void LogMessage(LogEventLevel level, Exception ex, string message, params object[] args)
+ {
+ _logger.Write(level, ex, message, args);
+ }
- #region Explicit methods for logging levels
- public static void LogVerbose(IKeyed keyed, string message, params object[] args)
- {
- using(LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Verbose, message, args);
- }
- }
+ public static void LogMessage(LogEventLevel level, IKeyed keyed, string message, params object[] args)
+ {
+ LogMessage(level, message, keyed, args);
+ }
- public static void LogVerbose(Exception ex, IKeyed keyed, string message, params object[] args)
+ public static void LogMessage(LogEventLevel level, Exception ex, IKeyed device, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", device?.Key))
{
- using(LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Verbose, ex, message, args);
- }
+ _logger.Write(level, ex, message, args);
}
+ }
- public static void LogVerbose(string message, params object[] args)
+ #region Explicit methods for logging levels
+ public static void LogVerbose(IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
_logger.Write(LogEventLevel.Verbose, message, args);
}
+ }
- public static void LogVerbose(Exception ex, string message, params object[] args)
+ public static void LogVerbose(Exception ex, IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
- _logger.Write(LogEventLevel.Verbose, ex, null, message, args);
+ _logger.Write(LogEventLevel.Verbose, ex, message, args);
}
+ }
- public static void LogDebug(IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Debug, message, args);
- }
- }
+ public static void LogVerbose(string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Verbose, message, args);
+ }
- public static void LogDebug(Exception ex, IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Debug, ex, message, args);
- }
- }
+ public static void LogVerbose(Exception ex, string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Verbose, ex, null, message, args);
+ }
- public static void LogDebug(string message, params object[] args)
+ public static void LogDebug(IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
_logger.Write(LogEventLevel.Debug, message, args);
}
+ }
- public static void LogDebug(Exception ex, string message, params object[] args)
+ public static void LogDebug(Exception ex, IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
- _logger.Write(LogEventLevel.Debug, ex, null, message, args);
+ _logger.Write(LogEventLevel.Debug, ex, message, args);
}
+ }
- public static void LogInformation(IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Information, message, args);
- }
- }
+ public static void LogDebug(string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Debug, message, args);
+ }
- public static void LogInformation(Exception ex, IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Information, ex, message, args);
- }
- }
+ public static void LogDebug(Exception ex, string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Debug, ex, null, message, args);
+ }
- public static void LogInformation(string message, params object[] args)
+ public static void LogInformation(IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
_logger.Write(LogEventLevel.Information, message, args);
}
+ }
- public static void LogInformation(Exception ex, string message, params object[] args)
+ public static void LogInformation(Exception ex, IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
- _logger.Write(LogEventLevel.Information, ex, null, message, args);
+ _logger.Write(LogEventLevel.Information, ex, message, args);
}
+ }
- public static void LogWarning(IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Warning, message, args);
- }
- }
+ public static void LogInformation(string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Information, message, args);
+ }
- public static void LogWarning(Exception ex, IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Warning, ex, message, args);
- }
- }
+ public static void LogInformation(Exception ex, string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Information, ex, null, message, args);
+ }
- public static void LogWarning(string message, params object[] args)
+ public static void LogWarning(IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
_logger.Write(LogEventLevel.Warning, message, args);
}
+ }
- public static void LogWarning(Exception ex, string message, params object[] args)
+ public static void LogWarning(Exception ex, IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
- _logger.Write(LogEventLevel.Warning, ex, null, message, args);
+ _logger.Write(LogEventLevel.Warning, ex, message, args);
}
+ }
- public static void LogError(IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Error, message, args);
- }
- }
+ public static void LogWarning(string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Warning, message, args);
+ }
- public static void LogError(Exception ex, IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Error, ex, message, args);
- }
- }
+ public static void LogWarning(Exception ex, string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Warning, ex, null, message, args);
+ }
- public static void LogError(string message, params object[] args)
+ public static void LogError(IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
_logger.Write(LogEventLevel.Error, message, args);
}
+ }
- public static void LogError(Exception ex, string message, params object[] args)
+ public static void LogError(Exception ex, IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
- _logger.Write(LogEventLevel.Error, ex, null, message, args);
+ _logger.Write(LogEventLevel.Error, ex, message, args);
}
+ }
- public static void LogFatal(IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Fatal, message, args);
- }
- }
+ public static void LogError(string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Error, message, args);
+ }
- public static void LogFatal(Exception ex, IKeyed keyed, string message, params object[] args)
- {
- using (LogContext.PushProperty("Key", keyed?.Key))
- {
- _logger.Write(LogEventLevel.Fatal, ex, message, args);
- }
- }
+ public static void LogError(Exception ex, string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Error, ex, null, message, args);
+ }
- public static void LogFatal(string message, params object[] args)
+ public static void LogFatal(IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
_logger.Write(LogEventLevel.Fatal, message, args);
}
+ }
- public static void LogFatal(Exception ex, string message, params object[] args)
+ public static void LogFatal(Exception ex, IKeyed keyed, string message, params object[] args)
+ {
+ using (LogContext.PushProperty("Key", keyed?.Key))
{
- _logger.Write(LogEventLevel.Fatal, ex, null, message, args);
+ _logger.Write(LogEventLevel.Fatal, ex, message, args);
}
+ }
- #endregion
+ public static void LogFatal(string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Fatal, message, args);
+ }
+ public static void LogFatal(Exception ex, string message, params object[] args)
+ {
+ _logger.Write(LogEventLevel.Fatal, ex, null, message, args);
+ }
- private static void LogMessage(uint level, string format, params object[] items)
- {
- if (!_logLevels.ContainsKey(level)) return;
+ #endregion
- var logLevel = _logLevels[level];
-
- LogMessage(logLevel, format, items);
- }
- private static void LogMessage(uint level, IKeyed keyed, string format, params object[] items)
- {
- if (!_logLevels.ContainsKey(level)) return;
+ private static void LogMessage(uint level, string format, params object[] items)
+ {
+ if (!_logLevels.ContainsKey(level)) return;
- var logLevel = _logLevels[level];
+ var logLevel = _logLevels[level];
- LogMessage(logLevel, keyed, format, items);
- }
+ LogMessage(logLevel, format, items);
+ }
+ private static void LogMessage(uint level, IKeyed keyed, string format, params object[] items)
+ {
+ if (!_logLevels.ContainsKey(level)) return;
- ///
- /// Prints message to console if current debug level is equal to or higher than the level of this message.
- /// Uses CrestronConsole.PrintLine.
- ///
- ///
- /// Console format string
- /// Object parameters
- [Obsolete("Use LogMessage methods. Will be removed in 2.2.0 and later versions")]
- public static void Console(uint level, string format, params object[] items)
- {
+ var logLevel = _logLevels[level];
- LogMessage(level, format, items);
+ LogMessage(logLevel, keyed, format, items);
+ }
- //if (IsRunningOnAppliance)
- //{
- // CrestronConsole.PrintLine("[{0}]App {1} Lvl {2}:{3}", DateTime.Now.ToString("HH:mm:ss.fff"),
- // InitialParametersClass.ApplicationNumber,
- // level,
- // string.Format(format, items));
- //}
- }
- ///
- /// Logs to Console when at-level, and all messages to error log, including device key
- ///
- [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
- public static void Console(uint level, IKeyed dev, string format, params object[] items)
- {
- LogMessage(level, dev, format, items);
+ ///
+ /// Prints message to console if current debug level is equal to or higher than the level of this message.
+ /// Uses CrestronConsole.PrintLine.
+ ///
+ ///
+ /// Console format string
+ /// Object parameters
+ [Obsolete("Use LogMessage methods. Will be removed in 2.2.0 and later versions")]
+ public static void Console(uint level, string format, params object[] items)
+ {
- //if (Level >= level)
- // Console(level, "[{0}] {1}", dev.Key, message);
- }
+ LogMessage(level, format, items);
- ///
- /// Prints message to console if current debug level is equal to or higher than the level of this message. Always sends message to Error Log.
- /// Uses CrestronConsole.PrintLine.
- ///
- [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
- public static void Console(uint level, IKeyed dev, ErrorLogLevel errorLogLevel,
- string format, params object[] items)
- {
- LogMessage(level, dev, format, items);
- }
+ //if (IsRunningOnAppliance)
+ //{
+ // CrestronConsole.PrintLine("[{0}]App {1} Lvl {2}:{3}", DateTime.Now.ToString("HH:mm:ss.fff"),
+ // InitialParametersClass.ApplicationNumber,
+ // level,
+ // string.Format(format, items));
+ //}
+ }
- ///
- /// Logs to Console when at-level, and all messages to error log
- ///
- [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
- public static void Console(uint level, ErrorLogLevel errorLogLevel,
- string format, params object[] items)
- {
- LogMessage(level, format, items);
- }
+ ///
+ /// Logs to Console when at-level, and all messages to error log, including device key
+ ///
+ [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
+ public static void Console(uint level, IKeyed dev, string format, params object[] items)
+ {
+ LogMessage(level, dev, format, items);
- ///
- /// Logs to both console and the custom user log (not the built-in error log). If appdebug level is set at
- /// or above the level provided, then the output will be written to both console and the log. Otherwise
- /// it will only be written to the log.
- ///
- [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
- public static void ConsoleWithLog(uint level, string format, params object[] items)
- {
- LogMessage(level, format, items);
+ //if (Level >= level)
+ // Console(level, "[{0}] {1}", dev.Key, message);
+ }
- // var str = string.Format(format, items);
- //if (Level >= level)
- // CrestronConsole.PrintLine("App {0}:{1}", InitialParametersClass.ApplicationNumber, str);
- // CrestronLogger.WriteToLog(str, level);
- }
+ ///
+ /// Prints message to console if current debug level is equal to or higher than the level of this message. Always sends message to Error Log.
+ /// Uses CrestronConsole.PrintLine.
+ ///
+ [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
+ public static void Console(uint level, IKeyed dev, ErrorLogLevel errorLogLevel,
+ string format, params object[] items)
+ {
+ LogMessage(level, dev, format, items);
+ }
- ///
- /// Logs to both console and the custom user log (not the built-in error log). If appdebug level is set at
- /// or above the level provided, then the output will be written to both console and the log. Otherwise
- /// it will only be written to the log.
- ///
- [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
- public static void ConsoleWithLog(uint level, IKeyed dev, string format, params object[] items)
- {
- LogMessage(level, dev, format, items);
+ ///
+ /// Logs to Console when at-level, and all messages to error log
+ ///
+ [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
+ public static void Console(uint level, ErrorLogLevel errorLogLevel,
+ string format, params object[] items)
+ {
+ LogMessage(level, format, items);
+ }
- // var str = string.Format(format, items);
- // CrestronLogger.WriteToLog(string.Format("[{0}] {1}", dev.Key, str), level);
- }
+ ///
+ /// Logs to both console and the custom user log (not the built-in error log). If appdebug level is set at
+ /// or above the level provided, then the output will be written to both console and the log. Otherwise
+ /// it will only be written to the log.
+ ///
+ [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
+ public static void ConsoleWithLog(uint level, string format, params object[] items)
+ {
+ LogMessage(level, format, items);
- ///
- /// Prints to log and error log
- ///
- ///
- ///
- [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
- public static void LogError(ErrorLogLevel errorLogLevel, string str)
- {
- switch (errorLogLevel)
- {
- case ErrorLogLevel.Error:
- LogMessage(LogEventLevel.Error, str);
- break;
- case ErrorLogLevel.Warning:
- LogMessage(LogEventLevel.Warning, str);
- break;
- case ErrorLogLevel.Notice:
- LogMessage(LogEventLevel.Information, str);
- break;
- }
- }
+ // var str = string.Format(format, items);
+ //if (Level >= level)
+ // CrestronConsole.PrintLine("App {0}:{1}", InitialParametersClass.ApplicationNumber, str);
+ // CrestronLogger.WriteToLog(str, level);
+ }
- ///
- /// Writes the memory object after timeout
- ///
- static void SaveMemoryOnTimeout()
+ ///
+ /// Logs to both console and the custom user log (not the built-in error log). If appdebug level is set at
+ /// or above the level provided, then the output will be written to both console and the log. Otherwise
+ /// it will only be written to the log.
+ ///
+ [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
+ public static void ConsoleWithLog(uint level, IKeyed dev, string format, params object[] items)
+ {
+ LogMessage(level, dev, format, items);
+
+ // var str = string.Format(format, items);
+ // CrestronLogger.WriteToLog(string.Format("[{0}] {1}", dev.Key, str), level);
+ }
+
+ ///
+ /// Prints to log and error log
+ ///
+ ///
+ ///
+ [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
+ public static void LogError(ErrorLogLevel errorLogLevel, string str)
+ {
+ switch (errorLogLevel)
{
- Console(0, "Saving debug settings");
- if (_saveTimer == null)
- _saveTimer = new CTimer(o =>
- {
- _saveTimer = null;
- SaveMemory();
- }, SaveTimeoutMs);
- else
- _saveTimer.Reset(SaveTimeoutMs);
+ case ErrorLogLevel.Error:
+ LogMessage(LogEventLevel.Error, str);
+ break;
+ case ErrorLogLevel.Warning:
+ LogMessage(LogEventLevel.Warning, str);
+ break;
+ case ErrorLogLevel.Notice:
+ LogMessage(LogEventLevel.Information, str);
+ break;
}
+ }
- ///
- /// Writes the memory - use SaveMemoryOnTimeout
- ///
- static void SaveMemory()
- {
- //var dir = @"\NVRAM\debug";
- //if (!Directory.Exists(dir))
- // Directory.Create(dir);
+ ///
+ /// Writes the memory object after timeout
+ ///
+ static void SaveMemoryOnTimeout()
+ {
+ Console(0, "Saving debug settings");
+ if (_saveTimer == null)
+ _saveTimer = new CTimer(o =>
+ {
+ _saveTimer = null;
+ SaveMemory();
+ }, SaveTimeoutMs);
+ else
+ _saveTimer.Reset(SaveTimeoutMs);
+ }
+
+ ///
+ /// Writes the memory - use SaveMemoryOnTimeout
+ ///
+ static void SaveMemory()
+ {
+ //var dir = @"\NVRAM\debug";
+ //if (!Directory.Exists(dir))
+ // Directory.Create(dir);
+ try
+ {
var fileName = GetMemoryFileName();
LogMessage(LogEventLevel.Information, "Loading debug settings file from {fileName}", fileName);
@@ -963,66 +970,72 @@ static void SaveMemory()
sw.Flush();
}
}
+ catch (Exception ex)
+ {
+ ErrorLog.Error("Exception saving debug settings: {message}", ex);
+ CrestronConsole.PrintLine("Exception saving debug settings: {message}", ex.Message);
+ return;
+ }
+ }
- ///
- ///
- ///
- static void LoadMemory()
+ ///
+ ///
+ ///
+ static void LoadMemory()
+ {
+ var file = GetMemoryFileName();
+ if (File.Exists(file))
{
- var file = GetMemoryFileName();
- if (File.Exists(file))
+ using (var sr = new StreamReader(file))
{
- using (var sr = new StreamReader(file))
- {
- var json = sr.ReadToEnd();
- _contexts = JsonConvert.DeserializeObject(json);
+ var json = sr.ReadToEnd();
+ _contexts = JsonConvert.DeserializeObject(json);
- if (_contexts != null)
- {
- LogMessage(LogEventLevel.Debug, "Debug memory restored from file");
- return;
- }
+ if (_contexts != null)
+ {
+ LogMessage(LogEventLevel.Debug, "Debug memory restored from file");
+ return;
}
}
-
- _contexts = new DebugContextCollection();
}
- ///
- /// Helper to get the file path for this app's debug memory
- ///
- static string GetMemoryFileName()
- {
- if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
- {
- // CheckForMigration();
- return string.Format(@"\user\debugSettings\program{0}", InitialParametersClass.ApplicationNumber);
- }
+ _contexts = new DebugContextCollection();
+ }
- return string.Format("{0}{1}user{1}debugSettings{1}{2}.json",Directory.GetApplicationRootDirectory(), Path.DirectorySeparatorChar, InitialParametersClass.RoomId);
+ ///
+ /// Helper to get the file path for this app's debug memory
+ ///
+ static string GetMemoryFileName()
+ {
+ if (CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance)
+ {
+ // CheckForMigration();
+ return string.Format(@"\user\debugSettings\program{0}", InitialParametersClass.ApplicationNumber);
}
+ return string.Format("{0}{1}user{1}debugSettings{1}{2}.json", Directory.GetApplicationRootDirectory(), Path.DirectorySeparatorChar, InitialParametersClass.RoomId);
+ }
+
+ ///
+ /// Error level to for message to be logged at
+ ///
+ public enum ErrorLogLevel
+ {
///
- /// Error level to for message to be logged at
+ /// Error
///
- public enum ErrorLogLevel
- {
- ///
- /// Error
- ///
- Error,
- ///
- /// Warning
- ///
- Warning,
- ///
- /// Notice
- ///
- Notice,
- ///
- /// None
- ///
- None,
- }
+ Error,
+ ///
+ /// Warning
+ ///
+ Warning,
+ ///
+ /// Notice
+ ///
+ Notice,
+ ///
+ /// None
+ ///
+ None,
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Logging/DebugConsoleSink.cs b/src/PepperDash.Core/Logging/DebugConsoleSink.cs
index a6c7f8935..5e32a8a51 100644
--- a/src/PepperDash.Core/Logging/DebugConsoleSink.cs
+++ b/src/PepperDash.Core/Logging/DebugConsoleSink.cs
@@ -9,47 +9,45 @@
using System.Text;
-namespace PepperDash.Core
-{
- public class DebugConsoleSink : ILogEventSink
- {
- private readonly ITextFormatter _textFormatter;
-
- public void Emit(LogEvent logEvent)
- {
- if (!Debug.IsRunningOnAppliance) return;
+namespace PepperDash.Core;
- /*string message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}]{logEvent.RenderMessage()}";
+public class DebugConsoleSink : ILogEventSink
+{
+ private readonly ITextFormatter _textFormatter;
- if(logEvent.Properties.TryGetValue("Key",out var value) && value is ScalarValue sv && sv.Value is string rawValue)
- {
- message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}][{rawValue,3}]: {logEvent.RenderMessage()}";
- }*/
+ public void Emit(LogEvent logEvent)
+ {
+ if (!Debug.IsRunningOnAppliance) return;
- var buffer = new StringWriter(new StringBuilder(256));
+ /*string message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}]{logEvent.RenderMessage()}";
- _textFormatter.Format(logEvent, buffer);
+ if(logEvent.Properties.TryGetValue("Key",out var value) && value is ScalarValue sv && sv.Value is string rawValue)
+ {
+ message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}][{rawValue,3}]: {logEvent.RenderMessage()}";
+ }*/
- var message = buffer.ToString();
+ var buffer = new StringWriter(new StringBuilder(256));
- CrestronConsole.PrintLine(message);
- }
+ _textFormatter.Format(logEvent, buffer);
- public DebugConsoleSink(ITextFormatter formatProvider )
- {
- _textFormatter = formatProvider ?? new JsonFormatter();
- }
+ var message = buffer.ToString();
+ CrestronConsole.PrintLine(message);
}
- public static class DebugConsoleSinkExtensions
+ public DebugConsoleSink(ITextFormatter formatProvider )
{
- public static LoggerConfiguration DebugConsoleSink(
- this LoggerSinkConfiguration loggerConfiguration,
- ITextFormatter formatProvider = null)
- {
- return loggerConfiguration.Sink(new DebugConsoleSink(formatProvider));
- }
+ _textFormatter = formatProvider ?? new JsonFormatter();
}
}
+
+public static class DebugConsoleSinkExtensions
+{
+ public static LoggerConfiguration DebugConsoleSink(
+ this LoggerSinkConfiguration loggerConfiguration,
+ ITextFormatter formatProvider = null)
+ {
+ return loggerConfiguration.Sink(new DebugConsoleSink(formatProvider));
+ }
+}
diff --git a/src/PepperDash.Core/Logging/DebugContext.cs b/src/PepperDash.Core/Logging/DebugContext.cs
index 54c874144..8b8d5f2c6 100644
--- a/src/PepperDash.Core/Logging/DebugContext.cs
+++ b/src/PepperDash.Core/Logging/DebugContext.cs
@@ -6,276 +6,275 @@
using Newtonsoft.Json;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Represents a debugging context
+///
+public class DebugContext
{
///
- /// Represents a debugging context
+ /// Describes the folder location where a given program stores it's debug level memory. By default, the
+ /// file written will be named appNdebug where N is 1-10.
///
- public class DebugContext
- {
- ///
- /// Describes the folder location where a given program stores it's debug level memory. By default, the
- /// file written will be named appNdebug where N is 1-10.
- ///
- public string Key { get; private set; }
+ public string Key { get; private set; }
- /////
- ///// The name of the file containing the current debug settings.
- /////
- //string FileName = string.Format(@"\nvram\debug\app{0}Debug.json", InitialParametersClass.ApplicationNumber);
+ /////
+ ///// The name of the file containing the current debug settings.
+ /////
+ //string FileName = string.Format(@"\nvram\debug\app{0}Debug.json", InitialParametersClass.ApplicationNumber);
- DebugContextSaveData SaveData;
+ DebugContextSaveData SaveData;
- int SaveTimeoutMs = 30000;
+ int SaveTimeoutMs = 30000;
- CTimer SaveTimer;
+ CTimer SaveTimer;
- static List Contexts = new List();
+ static List Contexts = new List();
- ///
- /// Creates or gets a debug context
- ///
- ///
- ///
- public static DebugContext GetDebugContext(string key)
+ ///
+ /// Creates or gets a debug context
+ ///
+ ///
+ ///
+ public static DebugContext GetDebugContext(string key)
+ {
+ var context = Contexts.FirstOrDefault(c => c.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
+ if (context == null)
{
- var context = Contexts.FirstOrDefault(c => c.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
- if (context == null)
- {
- context = new DebugContext(key);
- Contexts.Add(context);
- }
- return context;
+ context = new DebugContext(key);
+ Contexts.Add(context);
}
+ return context;
+ }
- ///
- /// Do not use. For S+ access.
- ///
- public DebugContext() { }
+ ///
+ /// Do not use. For S+ access.
+ ///
+ public DebugContext() { }
- DebugContext(string key)
+ DebugContext(string key)
+ {
+ Key = key;
+ if (CrestronEnvironment.RuntimeEnvironment == eRuntimeEnvironment.SimplSharpPro)
{
- Key = key;
- if (CrestronEnvironment.RuntimeEnvironment == eRuntimeEnvironment.SimplSharpPro)
- {
- // Add command to console
- CrestronConsole.AddNewConsoleCommand(SetDebugFromConsole, "appdebug",
- "appdebug:P [0-2]: Sets the application's console debug message level",
- ConsoleAccessLevelEnum.AccessOperator);
- }
+ // Add command to console
+ CrestronConsole.AddNewConsoleCommand(SetDebugFromConsole, "appdebug",
+ "appdebug:P [0-2]: Sets the application's console debug message level",
+ ConsoleAccessLevelEnum.AccessOperator);
+ }
- CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler;
+ CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler;
- LoadMemory();
- }
+ LoadMemory();
+ }
- ///
- /// Used to save memory when shutting down
- ///
- ///
- void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ ///
+ /// Used to save memory when shutting down
+ ///
+ ///
+ void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
+ {
+ if (programEventType == eProgramStatusEventType.Stopping)
{
- if (programEventType == eProgramStatusEventType.Stopping)
+ if (SaveTimer != null)
{
- if (SaveTimer != null)
- {
- SaveTimer.Stop();
- SaveTimer = null;
- }
- Console(0, "Saving debug settings");
- SaveMemory();
+ SaveTimer.Stop();
+ SaveTimer = null;
}
+ Console(0, "Saving debug settings");
+ SaveMemory();
}
+ }
- ///
- /// Callback for console command
- ///
- ///
- public void SetDebugFromConsole(string levelString)
+ ///
+ /// Callback for console command
+ ///
+ ///
+ public void SetDebugFromConsole(string levelString)
+ {
+ try
{
- try
+ if (string.IsNullOrEmpty(levelString.Trim()))
{
- if (string.IsNullOrEmpty(levelString.Trim()))
- {
- CrestronConsole.ConsoleCommandResponse("AppDebug level = {0}", SaveData.Level);
- return;
- }
-
- SetDebugLevel(Convert.ToInt32(levelString));
+ CrestronConsole.ConsoleCommandResponse("AppDebug level = {0}", SaveData.Level);
+ return;
}
- catch
- {
- CrestronConsole.PrintLine("Usage: appdebug:P [0-2]");
- }
- }
- ///
- /// Sets the debug level
- ///
- /// Valid values 0 (no debug), 1 (critical), 2 (all messages)
- public void SetDebugLevel(int level)
- {
- if (level <= 2)
- {
- SaveData.Level = level;
- SaveMemoryOnTimeout();
-
- CrestronConsole.PrintLine("[Application {0}], Debug level set to {1}",
- InitialParametersClass.ApplicationNumber, SaveData.Level);
- }
+ SetDebugLevel(Convert.ToInt32(levelString));
}
-
- ///
- /// Prints message to console if current debug level is equal to or higher than the level of this message.
- /// Uses CrestronConsole.PrintLine.
- ///
- ///
- /// Console format string
- /// Object parameters
- public void Console(uint level, string format, params object[] items)
+ catch
{
- if (SaveData.Level >= level)
- CrestronConsole.PrintLine("App {0}:{1}", InitialParametersClass.ApplicationNumber,
- string.Format(format, items));
+ CrestronConsole.PrintLine("Usage: appdebug:P [0-2]");
}
+ }
- ///
- /// Appends a device Key to the beginning of a message
- ///
- public void Console(uint level, IKeyed dev, string format, params object[] items)
+ ///
+ /// Sets the debug level
+ ///
+ /// Valid values 0 (no debug), 1 (critical), 2 (all messages)
+ public void SetDebugLevel(int level)
+ {
+ if (level <= 2)
{
- if (SaveData.Level >= level)
- Console(level, "[{0}] {1}", dev.Key, string.Format(format, items));
- }
+ SaveData.Level = level;
+ SaveMemoryOnTimeout();
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public void Console(uint level, IKeyed dev, Debug.ErrorLogLevel errorLogLevel,
- string format, params object[] items)
- {
- if (SaveData.Level >= level)
- {
- var str = string.Format("[{0}] {1}", dev.Key, string.Format(format, items));
- Console(level, str);
- LogError(errorLogLevel, str);
- }
+ CrestronConsole.PrintLine("[Application {0}], Debug level set to {1}",
+ InitialParametersClass.ApplicationNumber, SaveData.Level);
}
+ }
+
+ ///
+ /// Prints message to console if current debug level is equal to or higher than the level of this message.
+ /// Uses CrestronConsole.PrintLine.
+ ///
+ ///
+ /// Console format string
+ /// Object parameters
+ public void Console(uint level, string format, params object[] items)
+ {
+ if (SaveData.Level >= level)
+ CrestronConsole.PrintLine("App {0}:{1}", InitialParametersClass.ApplicationNumber,
+ string.Format(format, items));
+ }
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public void Console(uint level, Debug.ErrorLogLevel errorLogLevel,
- string format, params object[] items)
+ ///
+ /// Appends a device Key to the beginning of a message
+ ///
+ public void Console(uint level, IKeyed dev, string format, params object[] items)
+ {
+ if (SaveData.Level >= level)
+ Console(level, "[{0}] {1}", dev.Key, string.Format(format, items));
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void Console(uint level, IKeyed dev, Debug.ErrorLogLevel errorLogLevel,
+ string format, params object[] items)
+ {
+ if (SaveData.Level >= level)
{
- if (SaveData.Level >= level)
- {
- var str = string.Format(format, items);
- Console(level, str);
- LogError(errorLogLevel, str);
- }
+ var str = string.Format("[{0}] {1}", dev.Key, string.Format(format, items));
+ Console(level, str);
+ LogError(errorLogLevel, str);
}
+ }
- ///
- ///
- ///
- ///
- ///
- public void LogError(Debug.ErrorLogLevel errorLogLevel, string str)
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void Console(uint level, Debug.ErrorLogLevel errorLogLevel,
+ string format, params object[] items)
+ {
+ if (SaveData.Level >= level)
{
- string msg = string.Format("App {0}:{1}", InitialParametersClass.ApplicationNumber, str);
- switch (errorLogLevel)
- {
- case Debug.ErrorLogLevel.Error:
- ErrorLog.Error(msg);
- break;
- case Debug.ErrorLogLevel.Warning:
- ErrorLog.Warn(msg);
- break;
- case Debug.ErrorLogLevel.Notice:
- ErrorLog.Notice(msg);
- break;
- }
+ var str = string.Format(format, items);
+ Console(level, str);
+ LogError(errorLogLevel, str);
}
+ }
- ///
- /// Writes the memory object after timeout
- ///
- void SaveMemoryOnTimeout()
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void LogError(Debug.ErrorLogLevel errorLogLevel, string str)
+ {
+ string msg = string.Format("App {0}:{1}", InitialParametersClass.ApplicationNumber, str);
+ switch (errorLogLevel)
{
- if (SaveTimer == null)
- SaveTimer = new CTimer(o =>
- {
- SaveTimer = null;
- SaveMemory();
- }, SaveTimeoutMs);
- else
- SaveTimer.Reset(SaveTimeoutMs);
+ case Debug.ErrorLogLevel.Error:
+ ErrorLog.Error(msg);
+ break;
+ case Debug.ErrorLogLevel.Warning:
+ ErrorLog.Warn(msg);
+ break;
+ case Debug.ErrorLogLevel.Notice:
+ ErrorLog.Notice(msg);
+ break;
}
+ }
- ///
- /// Writes the memory - use SaveMemoryOnTimeout
- ///
- void SaveMemory()
- {
- using (StreamWriter sw = new StreamWriter(GetMemoryFileName()))
+ ///
+ /// Writes the memory object after timeout
+ ///
+ void SaveMemoryOnTimeout()
+ {
+ if (SaveTimer == null)
+ SaveTimer = new CTimer(o =>
{
- var json = JsonConvert.SerializeObject(SaveData);
- sw.Write(json);
- sw.Flush();
- }
+ SaveTimer = null;
+ SaveMemory();
+ }, SaveTimeoutMs);
+ else
+ SaveTimer.Reset(SaveTimeoutMs);
+ }
+
+ ///
+ /// Writes the memory - use SaveMemoryOnTimeout
+ ///
+ void SaveMemory()
+ {
+ using (StreamWriter sw = new StreamWriter(GetMemoryFileName()))
+ {
+ var json = JsonConvert.SerializeObject(SaveData);
+ sw.Write(json);
+ sw.Flush();
}
+ }
- ///
- ///
- ///
- void LoadMemory()
+ ///
+ ///
+ ///
+ void LoadMemory()
+ {
+ var file = GetMemoryFileName();
+ if (File.Exists(file))
{
- var file = GetMemoryFileName();
- if (File.Exists(file))
+ using (StreamReader sr = new StreamReader(file))
{
- using (StreamReader sr = new StreamReader(file))
+ var data = JsonConvert.DeserializeObject(sr.ReadToEnd());
+ if (data != null)
{
- var data = JsonConvert.DeserializeObject(sr.ReadToEnd());
- if (data != null)
- {
- SaveData = data;
- Debug.Console(1, "Debug memory restored from file");
- return;
- }
- else
- SaveData = new DebugContextSaveData();
+ SaveData = data;
+ Debug.Console(1, "Debug memory restored from file");
+ return;
}
+ else
+ SaveData = new DebugContextSaveData();
}
}
-
- ///
- /// Helper to get the file path for this app's debug memory
- ///
- string GetMemoryFileName()
- {
- return string.Format(@"\NVRAM\debugSettings\program{0}-{1}", InitialParametersClass.ApplicationNumber, Key);
- }
}
///
- ///
+ /// Helper to get the file path for this app's debug memory
///
- public class DebugContextSaveData
+ string GetMemoryFileName()
{
- ///
- ///
- ///
- public int Level { get; set; }
+ return string.Format(@"\NVRAM\debugSettings\program{0}-{1}", InitialParametersClass.ApplicationNumber, Key);
}
+}
+
+///
+///
+///
+public class DebugContextSaveData
+{
+ ///
+ ///
+ ///
+ public int Level { get; set; }
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Logging/DebugCrestronLoggerSink.cs b/src/PepperDash.Core/Logging/DebugCrestronLoggerSink.cs
index 0814453b6..a2e82ec8d 100644
--- a/src/PepperDash.Core/Logging/DebugCrestronLoggerSink.cs
+++ b/src/PepperDash.Core/Logging/DebugCrestronLoggerSink.cs
@@ -3,27 +3,26 @@
using Serilog.Core;
using Serilog.Events;
-namespace PepperDash.Core.Logging
+namespace PepperDash.Core.Logging;
+
+public class DebugCrestronLoggerSink : ILogEventSink
{
- public class DebugCrestronLoggerSink : ILogEventSink
+ public void Emit(LogEvent logEvent)
{
- public void Emit(LogEvent logEvent)
- {
- if (!Debug.IsRunningOnAppliance) return;
-
- string message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}]{logEvent.RenderMessage()}";
+ if (!Debug.IsRunningOnAppliance) return;
- if (logEvent.Properties.TryGetValue("Key", out var value) && value is ScalarValue sv && sv.Value is string rawValue)
- {
- message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}][{rawValue}]: {logEvent.RenderMessage()}";
- }
-
- CrestronLogger.WriteToLog(message, (uint)logEvent.Level);
- }
+ string message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}]{logEvent.RenderMessage()}";
- public DebugCrestronLoggerSink()
+ if (logEvent.Properties.TryGetValue("Key", out var value) && value is ScalarValue sv && sv.Value is string rawValue)
{
- CrestronLogger.Initialize(1, LoggerModeEnum.RM);
+ message = $"[{logEvent.Timestamp}][{logEvent.Level}][App {InitialParametersClass.ApplicationNumber}][{rawValue}]: {logEvent.RenderMessage()}";
}
+
+ CrestronLogger.WriteToLog(message, (uint)logEvent.Level);
+ }
+
+ public DebugCrestronLoggerSink()
+ {
+ CrestronLogger.Initialize(1, LoggerModeEnum.RM);
}
}
diff --git a/src/PepperDash.Core/Logging/DebugErrorLogSink.cs b/src/PepperDash.Core/Logging/DebugErrorLogSink.cs
index 3885982b0..3c2e67615 100644
--- a/src/PepperDash.Core/Logging/DebugErrorLogSink.cs
+++ b/src/PepperDash.Core/Logging/DebugErrorLogSink.cs
@@ -9,57 +9,56 @@
using System.Text;
using System.Threading.Tasks;
-namespace PepperDash.Core.Logging
+namespace PepperDash.Core.Logging;
+
+public class DebugErrorLogSink : ILogEventSink
{
- public class DebugErrorLogSink : ILogEventSink
+ private ITextFormatter _formatter;
+
+ private Dictionary> _errorLogMap = new Dictionary>
{
- private ITextFormatter _formatter;
+ { LogEventLevel.Verbose, (msg) => ErrorLog.Notice(msg) },
+ {LogEventLevel.Debug, (msg) => ErrorLog.Notice(msg) },
+ {LogEventLevel.Information, (msg) => ErrorLog.Notice(msg) },
+ {LogEventLevel.Warning, (msg) => ErrorLog.Warn(msg) },
+ {LogEventLevel.Error, (msg) => ErrorLog.Error(msg) },
+ {LogEventLevel.Fatal, (msg) => ErrorLog.Error(msg) }
+ };
+ public void Emit(LogEvent logEvent)
+ {
+ string message;
- private Dictionary> _errorLogMap = new Dictionary>
- {
- { LogEventLevel.Verbose, (msg) => ErrorLog.Notice(msg) },
- {LogEventLevel.Debug, (msg) => ErrorLog.Notice(msg) },
- {LogEventLevel.Information, (msg) => ErrorLog.Notice(msg) },
- {LogEventLevel.Warning, (msg) => ErrorLog.Warn(msg) },
- {LogEventLevel.Error, (msg) => ErrorLog.Error(msg) },
- {LogEventLevel.Fatal, (msg) => ErrorLog.Error(msg) }
- };
- public void Emit(LogEvent logEvent)
+ if (_formatter == null)
{
- string message;
+ var programId = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance
+ ? $"App {InitialParametersClass.ApplicationNumber}"
+ : $"Room {InitialParametersClass.RoomId}";
- if (_formatter == null)
- {
- var programId = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance
- ? $"App {InitialParametersClass.ApplicationNumber}"
- : $"Room {InitialParametersClass.RoomId}";
-
- message = $"[{logEvent.Timestamp}][{logEvent.Level}][{programId}]{logEvent.RenderMessage()}";
+ message = $"[{logEvent.Timestamp}][{logEvent.Level}][{programId}]{logEvent.RenderMessage()}";
- if (logEvent.Properties.TryGetValue("Key", out var value) && value is ScalarValue sv && sv.Value is string rawValue)
- {
- message = $"[{logEvent.Timestamp}][{logEvent.Level}][{programId}][{rawValue}]: {logEvent.RenderMessage()}";
- }
- } else
+ if (logEvent.Properties.TryGetValue("Key", out var value) && value is ScalarValue sv && sv.Value is string rawValue)
{
- var buffer = new StringWriter(new StringBuilder(256));
-
- _formatter.Format(logEvent, buffer);
-
- message = buffer.ToString();
+ message = $"[{logEvent.Timestamp}][{logEvent.Level}][{programId}][{rawValue}]: {logEvent.RenderMessage()}";
}
+ } else
+ {
+ var buffer = new StringWriter(new StringBuilder(256));
- if(!_errorLogMap.TryGetValue(logEvent.Level, out var handler))
- {
- return;
- }
+ _formatter.Format(logEvent, buffer);
- handler(message);
+ message = buffer.ToString();
}
- public DebugErrorLogSink(ITextFormatter formatter = null)
+ if(!_errorLogMap.TryGetValue(logEvent.Level, out var handler))
{
- _formatter = formatter;
+ return;
}
+
+ handler(message);
+ }
+
+ public DebugErrorLogSink(ITextFormatter formatter = null)
+ {
+ _formatter = formatter;
}
}
diff --git a/src/PepperDash.Core/Logging/DebugExtensions.cs b/src/PepperDash.Core/Logging/DebugExtensions.cs
index a8b7bd555..05d36276d 100644
--- a/src/PepperDash.Core/Logging/DebugExtensions.cs
+++ b/src/PepperDash.Core/Logging/DebugExtensions.cs
@@ -2,73 +2,72 @@
using System;
using Log = PepperDash.Core.Debug;
-namespace PepperDash.Core.Logging
+namespace PepperDash.Core.Logging;
+
+public static class DebugExtensions
{
- public static class DebugExtensions
+ public static void LogException(this IKeyed device, Exception ex, string message, params object[] args)
{
- public static void LogException(this IKeyed device, Exception ex, string message, params object[] args)
- {
- Log.LogMessage(ex, message, device, args);
- }
+ Log.LogMessage(ex, message, device, args);
+ }
- public static void LogVerbose(this IKeyed device, Exception ex, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Verbose, ex, message, device, args);
- }
+ public static void LogVerbose(this IKeyed device, Exception ex, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Verbose, ex, message, device, args);
+ }
- public static void LogVerbose(this IKeyed device, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Verbose, device, message, args);
- }
+ public static void LogVerbose(this IKeyed device, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Verbose, device, message, args);
+ }
- public static void LogDebug(this IKeyed device, Exception ex, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Debug, ex, message, device, args);
- }
+ public static void LogDebug(this IKeyed device, Exception ex, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Debug, ex, message, device, args);
+ }
- public static void LogDebug(this IKeyed device, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Debug, device, message, args);
- }
+ public static void LogDebug(this IKeyed device, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Debug, device, message, args);
+ }
- public static void LogInformation(this IKeyed device, Exception ex, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Information, ex, message, device, args);
- }
+ public static void LogInformation(this IKeyed device, Exception ex, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Information, ex, message, device, args);
+ }
- public static void LogInformation(this IKeyed device, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Information, device, message, args);
- }
+ public static void LogInformation(this IKeyed device, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Information, device, message, args);
+ }
- public static void LogWarning(this IKeyed device, Exception ex, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Warning, ex, message, device, args);
- }
+ public static void LogWarning(this IKeyed device, Exception ex, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Warning, ex, message, device, args);
+ }
- public static void LogWarning(this IKeyed device, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Warning, device, message, args);
- }
+ public static void LogWarning(this IKeyed device, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Warning, device, message, args);
+ }
- public static void LogError(this IKeyed device, Exception ex, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Error, ex, message, device, args);
- }
+ public static void LogError(this IKeyed device, Exception ex, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Error, ex, message, device, args);
+ }
- public static void LogError(this IKeyed device, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Error, device, message, args);
- }
+ public static void LogError(this IKeyed device, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Error, device, message, args);
+ }
- public static void LogFatal(this IKeyed device, Exception ex, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Fatal, ex, message, device, args);
- }
+ public static void LogFatal(this IKeyed device, Exception ex, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Fatal, ex, message, device, args);
+ }
- public static void LogFatal(this IKeyed device, string message, params object[] args)
- {
- Log.LogMessage(LogEventLevel.Fatal, device, message, args);
- }
+ public static void LogFatal(this IKeyed device, string message, params object[] args)
+ {
+ Log.LogMessage(LogEventLevel.Fatal, device, message, args);
}
}
diff --git a/src/PepperDash.Core/Logging/DebugMemory.cs b/src/PepperDash.Core/Logging/DebugMemory.cs
index a5737af98..7eb586938 100644
--- a/src/PepperDash.Core/Logging/DebugMemory.cs
+++ b/src/PepperDash.Core/Logging/DebugMemory.cs
@@ -2,25 +2,25 @@
using Crestron.SimplSharp;
using Newtonsoft.Json;
-namespace PepperDash.Core.Logging
-{
- ///
- /// Class to persist current Debug settings across program restarts
- ///
+namespace PepperDash.Core.Logging;
+
+///
+/// Class to persist current Debug settings across program restarts
+///
public class DebugContextCollection
{
- ///
- /// To prevent threading issues with the DeviceDebugSettings collection
- ///
- private readonly CCriticalSection _deviceDebugSettingsLock;
+ ///
+ /// To prevent threading issues with the DeviceDebugSettings collection
+ ///
+ private readonly CCriticalSection _deviceDebugSettingsLock;
[JsonProperty("items")] private readonly Dictionary _items;
- ///
- /// Collection of the debug settings for each device where the dictionary key is the device key
- ///
- [JsonProperty("deviceDebugSettings")]
- private Dictionary DeviceDebugSettings { get; set; }
+ ///
+ /// Collection of the debug settings for each device where the dictionary key is the device key
+ ///
+ [JsonProperty("deviceDebugSettings")]
+ private Dictionary DeviceDebugSettings { get; set; }
///
@@ -28,8 +28,8 @@ public class DebugContextCollection
///
public DebugContextCollection()
{
- _deviceDebugSettingsLock = new CCriticalSection();
- DeviceDebugSettings = new Dictionary();
+ _deviceDebugSettingsLock = new CCriticalSection();
+ DeviceDebugSettings = new Dictionary();
_items = new Dictionary();
}
@@ -59,40 +59,40 @@ public DebugContextItem GetOrCreateItem(string contextKey)
}
- ///
- /// sets the settings for a device or creates a new entry
- ///
- ///
- ///
- ///
- public void SetDebugSettingsForKey(string deviceKey, object settings)
+ ///
+ /// sets the settings for a device or creates a new entry
+ ///
+ ///
+ ///
+ ///
+ public void SetDebugSettingsForKey(string deviceKey, object settings)
+ {
+ try
{
- try
- {
- _deviceDebugSettingsLock.Enter();
+ _deviceDebugSettingsLock.Enter();
- if (DeviceDebugSettings.ContainsKey(deviceKey))
- {
- DeviceDebugSettings[deviceKey] = settings;
- }
- else
- DeviceDebugSettings.Add(deviceKey, settings);
- }
- finally
+ if (DeviceDebugSettings.ContainsKey(deviceKey))
{
- _deviceDebugSettingsLock.Leave();
+ DeviceDebugSettings[deviceKey] = settings;
}
+ else
+ DeviceDebugSettings.Add(deviceKey, settings);
}
-
- ///
- /// Gets the device settings for a device by key or returns null
- ///
- ///
- ///
- public object GetDebugSettingsForKey(string deviceKey)
+ finally
{
- return DeviceDebugSettings[deviceKey];
+ _deviceDebugSettingsLock.Leave();
}
+ }
+
+ ///
+ /// Gets the device settings for a device by key or returns null
+ ///
+ ///
+ ///
+ public object GetDebugSettingsForKey(string deviceKey)
+ {
+ return DeviceDebugSettings[deviceKey];
+ }
}
///
@@ -100,16 +100,15 @@ public object GetDebugSettingsForKey(string deviceKey)
///
public class DebugContextItem
{
- ///
- /// The level of debug messages to print
- ///
+ ///
+ /// The level of debug messages to print
+ ///
[JsonProperty("level")]
public int Level { get; set; }
- ///
- /// Property to tell the program not to intitialize when it boots, if desired
- ///
- [JsonProperty("doNotLoadOnNextBoot")]
- public bool DoNotLoadOnNextBoot { get; set; }
- }
-}
\ No newline at end of file
+ ///
+ /// Property to tell the program not to intitialize when it boots, if desired
+ ///
+ [JsonProperty("doNotLoadOnNextBoot")]
+ public bool DoNotLoadOnNextBoot { get; set; }
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/Logging/DebugWebsocketSink.cs b/src/PepperDash.Core/Logging/DebugWebsocketSink.cs
index d818977e6..d80d1c7b1 100644
--- a/src/PepperDash.Core/Logging/DebugWebsocketSink.cs
+++ b/src/PepperDash.Core/Logging/DebugWebsocketSink.cs
@@ -1,271 +1,332 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using Crestron.SimplSharp;
+using Org.BouncyCastle.Asn1.X509;
using Serilog;
+using Serilog.Configuration;
using Serilog.Core;
using Serilog.Events;
-using Serilog.Configuration;
-using WebSocketSharp.Server;
-using Crestron.SimplSharp;
-using WebSocketSharp;
-using System.Security.Authentication;
-using WebSocketSharp.Net;
-using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2;
-using System.IO;
-using Org.BouncyCastle.Asn1.X509;
using Serilog.Formatting;
-using Newtonsoft.Json.Linq;
using Serilog.Formatting.Json;
+using System;
+using System.IO;
+using System.Security.Authentication;
+using WebSocketSharp;
+using WebSocketSharp.Server;
+using X509Certificate2 = System.Security.Cryptography.X509Certificates.X509Certificate2;
+
+namespace PepperDash.Core;
-namespace PepperDash.Core
+///
+/// Provides a WebSocket-based logging sink for debugging purposes, allowing log events to be broadcast to connected
+/// WebSocket clients.
+///
+/// This class implements the interface and is designed to send
+/// formatted log events to WebSocket clients connected to a secure WebSocket server. The server is hosted locally
+/// and uses a self-signed certificate for SSL/TLS encryption.
+public class DebugWebsocketSink : ILogEventSink, IKeyed
{
- public class DebugWebsocketSink : ILogEventSink
+ private HttpServer _httpsServer;
+
+ private readonly string _path = "/debug/join/";
+ private const string _certificateName = "selfCres";
+ private const string _certificatePassword = "cres12345";
+
+ ///
+ /// Gets the port number on which the HTTPS server is currently running.
+ ///
+ public int Port
+ { get
+ {
+
+ if(_httpsServer == null) return 0;
+ return _httpsServer.Port;
+ }
+ }
+
+ ///
+ /// Gets the WebSocket URL for the current server instance.
+ ///
+ /// The URL is dynamically constructed based on the server's current IP address, port,
+ /// and WebSocket path.
+ public string Url
{
- private HttpServer _httpsServer;
-
- private string _path = "/debug/join/";
- private const string _certificateName = "selfCres";
- private const string _certificatePassword = "cres12345";
-
- public int Port
- { get
- {
-
- if(_httpsServer == null) return 0;
- return _httpsServer.Port;
- }
+ get
+ {
+ if (_httpsServer == null) return "";
+ return $"wss://{CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0)}:{_httpsServer.Port}{_httpsServer.WebSocketServices[_path].Path}";
}
+ }
+
+ ///
+ /// Gets a value indicating whether the HTTPS server is currently listening for incoming connections.
+ ///
+ public bool IsRunning { get => _httpsServer?.IsListening ?? false; }
+
+ ///
+ public string Key => "DebugWebsocketSink";
+
+ private readonly ITextFormatter _textFormatter;
+
+ ///
+ /// Initializes a new instance of the class with the specified text formatter.
+ ///
+ /// This constructor initializes the WebSocket sink and ensures that a certificate is
+ /// available for secure communication. If the required certificate does not exist, it will be created
+ /// automatically. Additionally, the sink is configured to stop the server when the program is
+ /// stopping.
+ /// The text formatter used to format log messages. If null, a default JSON formatter is used.
+ public DebugWebsocketSink(ITextFormatter formatProvider)
+ {
- public string Url
+ _textFormatter = formatProvider ?? new JsonFormatter();
+
+ if (!File.Exists($"\\user\\{_certificateName}.pfx"))
+ CreateCert();
+
+ CrestronEnvironment.ProgramStatusEventHandler += type =>
{
- get
+ if (type == eProgramStatusEventType.Stopping)
{
- if (_httpsServer == null) return "";
- return $"wss://{CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0)}:{_httpsServer.Port}{_httpsServer.WebSocketServices[_path].Path}";
+ StopServer();
}
- }
-
- public bool IsRunning { get => _httpsServer?.IsListening ?? false; }
-
+ };
+ }
- private readonly ITextFormatter _textFormatter;
+ private static void CreateCert()
+ {
+ try
+ {
+ var utility = new BouncyCertificate();
+
+ var ipAddress = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0);
+ var hostName = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_HOSTNAME, 0);
+ var domainName = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_DOMAIN_NAME, 0);
- public DebugWebsocketSink(ITextFormatter formatProvider)
- {
+ CrestronConsole.PrintLine(string.Format("DomainName: {0} | HostName: {1} | {1}.{0}@{2}", domainName, hostName, ipAddress));
- _textFormatter = formatProvider ?? new JsonFormatter();
+ var certificate = utility.CreateSelfSignedCertificate(string.Format("CN={0}.{1}", hostName, domainName), [string.Format("{0}.{1}", hostName, domainName), ipAddress], [KeyPurposeID.id_kp_serverAuth, KeyPurposeID.id_kp_clientAuth]);
- if (!File.Exists($"\\user\\{_certificateName}.pfx"))
- CreateCert(null);
+ //Crestron fails to let us do this...perhaps it should be done through their Dll's but haven't tested
- CrestronEnvironment.ProgramStatusEventHandler += type =>
- {
- if (type == eProgramStatusEventType.Stopping)
- {
- StopServer();
- }
- };
+ var separator = Path.DirectorySeparatorChar;
+
+ utility.CertificatePassword = _certificatePassword;
+ utility.WriteCertificate(certificate, @$"{separator}user{separator}", _certificateName);
}
-
- private void CreateCert(string[] args)
+ catch (Exception ex)
{
- try
- {
- //Debug.Console(0,"CreateCert Creating Utility");
- CrestronConsole.PrintLine("CreateCert Creating Utility");
- //var utility = new CertificateUtility();
- var utility = new BouncyCertificate();
- //Debug.Console(0, "CreateCert Calling CreateCert");
- CrestronConsole.PrintLine("CreateCert Calling CreateCert");
- //utility.CreateCert();
- var ipAddress = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_CURRENT_IP_ADDRESS, 0);
- var hostName = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_HOSTNAME, 0);
- var domainName = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_DOMAIN_NAME, 0);
-
- //Debug.Console(0, "DomainName: {0} | HostName: {1} | {1}.{0}@{2}", domainName, hostName, ipAddress);
- CrestronConsole.PrintLine(string.Format("DomainName: {0} | HostName: {1} | {1}.{0}@{2}", domainName, hostName, ipAddress));
-
- var certificate = utility.CreateSelfSignedCertificate(string.Format("CN={0}.{1}", hostName, domainName), new[] { string.Format("{0}.{1}", hostName, domainName), ipAddress }, new[] { KeyPurposeID.id_kp_serverAuth, KeyPurposeID.id_kp_clientAuth });
- //Crestron fails to let us do this...perhaps it should be done through their Dll's but haven't tested
- //Debug.Print($"CreateCert Storing Certificate To My.LocalMachine");
- //utility.AddCertToStore(certificate, StoreName.My, StoreLocation.LocalMachine);
- //Debug.Console(0, "CreateCert Saving Cert to \\user\\");
- CrestronConsole.PrintLine("CreateCert Saving Cert to \\user\\");
- utility.CertificatePassword = _certificatePassword;
- utility.WriteCertificate(certificate, @"\user\", _certificateName);
- //Debug.Console(0, "CreateCert Ending CreateCert");
- CrestronConsole.PrintLine("CreateCert Ending CreateCert");
- }
- catch (Exception ex)
- {
- //Debug.Console(0, "WSS CreateCert Failed\r\n{0}\r\n{1}", ex.Message, ex.StackTrace);
- CrestronConsole.PrintLine(string.Format("WSS CreateCert Failed\r\n{0}\r\n{1}", ex.Message, ex.StackTrace));
- }
+ //Debug.Console(0, "WSS CreateCert Failed\r\n{0}\r\n{1}", ex.Message, ex.StackTrace);
+ CrestronConsole.PrintLine("WSS CreateCert Failed\r\n{0}\r\n{1}", ex.Message, ex.StackTrace);
}
+ }
- public void Emit(LogEvent logEvent)
- {
- if (_httpsServer == null || !_httpsServer.IsListening) return;
-
- var sw = new StringWriter();
- _textFormatter.Format(logEvent, sw);
+ ///
+ /// Sends a log event to all connected WebSocket clients.
+ ///
+ /// The log event is formatted using the configured text formatter and then broadcasted
+ /// to all clients connected to the WebSocket server. If the WebSocket server is not initialized or not
+ /// listening, the method exits without performing any action.
+ /// The log event to be formatted and broadcasted. Cannot be null.
+ public void Emit(LogEvent logEvent)
+ {
+ if (_httpsServer == null || !_httpsServer.IsListening) return;
- _httpsServer.WebSocketServices.Broadcast(sw.ToString());
+ var sw = new StringWriter();
+ _textFormatter.Format(logEvent, sw);
- }
+ _httpsServer.WebSocketServices[_path].Sessions.Broadcast(sw.ToString());
+ }
- public void StartServerAndSetPort(int port)
- {
- Debug.Console(0, "Starting Websocket Server on port: {0}", port);
+ ///
+ /// Starts the WebSocket server on the specified port and configures it with the appropriate certificate.
+ ///
+ /// This method initializes the WebSocket server and binds it to the specified port. It
+ /// also applies the server's certificate for secure communication. Ensure that the port is not already in use
+ /// and that the certificate file is accessible.
+ /// The port number on which the WebSocket server will listen. Must be a valid, non-negative port number.
+ public void StartServerAndSetPort(int port)
+ {
+ Debug.Console(0, "Starting Websocket Server on port: {0}", port);
- Start(port, $"\\user\\{_certificateName}.pfx", _certificatePassword);
- }
+ Start(port, $"\\user\\{_certificateName}.pfx", _certificatePassword);
+ }
- private void Start(int port, string certPath = "", string certPassword = "")
+ private void Start(int port, string certPath = "", string certPassword = "")
+ {
+ try
{
- try
- {
- _httpsServer = new HttpServer(port, true);
+ _httpsServer = new HttpServer(port, true);
+ if (!string.IsNullOrWhiteSpace(certPath))
+ {
+ Debug.Console(0, "Assigning SSL Configuration");
+
+ _httpsServer.SslConfiguration.ServerCertificate = new X509Certificate2(certPath, certPassword);
+ _httpsServer.SslConfiguration.ClientCertificateRequired = false;
+ _httpsServer.SslConfiguration.CheckCertificateRevocation = false;
+ _httpsServer.SslConfiguration.EnabledSslProtocols = SslProtocols.Tls12;
+ //this is just to test, you might want to actually validate
+ _httpsServer.SslConfiguration.ClientCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
+ {
+ Debug.Console(0, "HTTPS ClientCerticateValidation Callback triggered");
+ return true;
+ };
+ }
+ Debug.Console(0, "Adding Debug Client Service");
+ _httpsServer.AddWebSocketService(_path);
+ Debug.Console(0, "Assigning Log Info");
+ _httpsServer.Log.Level = LogLevel.Trace;
+ _httpsServer.Log.Output = (d, s) =>
+ {
+ uint level;
- if (!string.IsNullOrWhiteSpace(certPath))
+ switch(d.Level)
{
- Debug.Console(0, "Assigning SSL Configuration");
- _httpsServer.SslConfiguration = new ServerSslConfiguration(new X509Certificate2(certPath, certPassword))
- {
- ClientCertificateRequired = false,
- CheckCertificateRevocation = false,
- EnabledSslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls,
- //this is just to test, you might want to actually validate
- ClientCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
- {
- Debug.Console(0, "HTTPS ClientCerticateValidation Callback triggered");
- return true;
- }
- };
+ case WebSocketSharp.LogLevel.Fatal:
+ level = 3;
+ break;
+ case WebSocketSharp.LogLevel.Error:
+ level = 2;
+ break;
+ case WebSocketSharp.LogLevel.Warn:
+ level = 1;
+ break;
+ case WebSocketSharp.LogLevel.Info:
+ level = 0;
+ break;
+ case WebSocketSharp.LogLevel.Debug:
+ level = 4;
+ break;
+ case WebSocketSharp.LogLevel.Trace:
+ level = 5;
+ break;
+ default:
+ level = 4;
+ break;
}
- Debug.Console(0, "Adding Debug Client Service");
- _httpsServer.AddWebSocketService(_path);
- Debug.Console(0, "Assigning Log Info");
- _httpsServer.Log.Level = LogLevel.Trace;
- _httpsServer.Log.Output = (d, s) =>
- {
- uint level;
+
+ Debug.Console(level, "{1} {0}\rCaller:{2}\rMessage:{3}\rs:{4}", d.Level.ToString(), d.Date.ToString(), d.Caller.ToString(), d.Message, s);
+ };
+ Debug.Console(0, "Starting");
- switch(d.Level)
- {
- case WebSocketSharp.LogLevel.Fatal:
- level = 3;
- break;
- case WebSocketSharp.LogLevel.Error:
- level = 2;
- break;
- case WebSocketSharp.LogLevel.Warn:
- level = 1;
- break;
- case WebSocketSharp.LogLevel.Info:
- level = 0;
- break;
- case WebSocketSharp.LogLevel.Debug:
- level = 4;
- break;
- case WebSocketSharp.LogLevel.Trace:
- level = 5;
- break;
- default:
- level = 4;
- break;
- }
-
- Debug.Console(level, "{1} {0}\rCaller:{2}\rMessage:{3}\rs:{4}", d.Level.ToString(), d.Date.ToString(), d.Caller.ToString(), d.Message, s);
- };
- Debug.Console(0, "Starting");
-
- _httpsServer.Start();
- Debug.Console(0, "Ready");
- }
- catch (Exception ex)
- {
- Debug.Console(0, "WebSocket Failed to start {0}", ex.Message);
- }
+ _httpsServer.Start();
+ Debug.Console(0, "Ready");
}
-
- public void StopServer()
+ catch (Exception ex)
{
- Debug.Console(0, "Stopping Websocket Server");
- _httpsServer?.Stop();
-
- _httpsServer = null;
+ Debug.Console(0, "WebSocket Failed to start {0}", ex.Message);
}
}
- public static class DebugWebsocketSinkExtensions
+ ///
+ /// Stops the WebSocket server if it is currently running.
+ ///
+ /// This method halts the WebSocket server and releases any associated resources. After
+ /// calling this method, the server will no longer accept or process incoming connections.
+ public void StopServer()
{
- public static LoggerConfiguration DebugWebsocketSink(
- this LoggerSinkConfiguration loggerConfiguration,
- ITextFormatter formatProvider = null)
- {
- return loggerConfiguration.Sink(new DebugWebsocketSink(formatProvider));
- }
+ Debug.Console(0, "Stopping Websocket Server");
+ _httpsServer?.Stop();
+
+ _httpsServer = null;
}
+}
- public class DebugClient : WebSocketBehavior
+///
+/// Configures the logger to write log events to a debug WebSocket sink.
+///
+/// This extension method allows you to direct log events to a WebSocket sink for debugging
+/// purposes.
+public static class DebugWebsocketSinkExtensions
+{
+ ///
+ /// Configures a logger to write log events to a debug WebSocket sink.
+ ///
+ /// This method adds a sink that writes log events to a WebSocket for debugging purposes.
+ /// It is typically used during development to stream log events in real-time.
+ /// The logger sink configuration to apply the WebSocket sink to.
+ /// An optional text formatter to format the log events. If not provided, a default formatter will be used.
+ /// A object that can be used to further configure the logger.
+ public static LoggerConfiguration DebugWebsocketSink(
+ this LoggerSinkConfiguration loggerConfiguration,
+ ITextFormatter formatProvider = null)
{
- private DateTime _connectionTime;
+ return loggerConfiguration.Sink(new DebugWebsocketSink(formatProvider));
+ }
+}
+
+///
+/// Represents a WebSocket client for debugging purposes, providing connection lifecycle management and message
+/// handling functionality.
+///
+/// The class extends to handle
+/// WebSocket connections, including events for opening, closing, receiving messages, and errors. It tracks the
+/// duration of the connection and logs relevant events for debugging.
+public class DebugClient : WebSocketBehavior
+{
+ private DateTime _connectionTime;
- public TimeSpan ConnectedDuration
+ ///
+ /// Gets the duration of time the WebSocket connection has been active.
+ ///
+ public TimeSpan ConnectedDuration
+ {
+ get
{
- get
+ if (Context.WebSocket.IsAlive)
{
- if (Context.WebSocket.IsAlive)
- {
- return DateTime.Now - _connectionTime;
- }
- else
- {
- return new TimeSpan(0);
- }
+ return DateTime.Now - _connectionTime;
+ }
+ else
+ {
+ return new TimeSpan(0);
}
}
+ }
- public DebugClient()
- {
- Debug.Console(0, "DebugClient Created");
- }
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// This constructor creates a new instance and logs its
+ /// creation using the method with a debug level of 0.
+ public DebugClient()
+ {
+ Debug.Console(0, "DebugClient Created");
+ }
- protected override void OnOpen()
- {
- base.OnOpen();
+ ///
+ protected override void OnOpen()
+ {
+ base.OnOpen();
- var url = Context.WebSocket.Url;
- Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WebSocket Connection from: {0}", url);
+ var url = Context.WebSocket.Url;
+ Debug.Console(0, Debug.ErrorLogLevel.Notice, "New WebSocket Connection from: {0}", url);
- _connectionTime = DateTime.Now;
- }
+ _connectionTime = DateTime.Now;
+ }
- protected override void OnMessage(MessageEventArgs e)
- {
- base.OnMessage(e);
+ ///
+ protected override void OnMessage(MessageEventArgs e)
+ {
+ base.OnMessage(e);
- Debug.Console(0, "WebSocket UiClient Message: {0}", e.Data);
- }
+ Debug.Console(0, "WebSocket UiClient Message: {0}", e.Data);
+ }
- protected override void OnClose(CloseEventArgs e)
- {
- base.OnClose(e);
+ ///
+ protected override void OnClose(CloseEventArgs e)
+ {
+ base.OnClose(e);
- Debug.Console(0, Debug.ErrorLogLevel.Notice, "WebSocket UiClient Closing: {0} reason: {1}", e.Code, e.Reason);
+ Debug.Console(0, Debug.ErrorLogLevel.Notice, "WebSocket UiClient Closing: {0} reason: {1}", e.Code, e.Reason);
- }
+ }
- protected override void OnError(WebSocketSharp.ErrorEventArgs e)
- {
- base.OnError(e);
+ ///
+ protected override void OnError(WebSocketSharp.ErrorEventArgs e)
+ {
+ base.OnError(e);
- Debug.Console(2, Debug.ErrorLogLevel.Notice, "WebSocket UiClient Error: {0} message: {1}", e.Exception, e.Message);
- }
+ Debug.Console(2, Debug.ErrorLogLevel.Notice, "WebSocket UiClient Error: {0} message: {1}", e.Exception, e.Message);
}
}
diff --git a/src/PepperDash.Core/Network/DiscoveryThings.cs b/src/PepperDash.Core/Network/DiscoveryThings.cs
index 973c03a4e..c01613b74 100644
--- a/src/PepperDash.Core/Network/DiscoveryThings.cs
+++ b/src/PepperDash.Core/Network/DiscoveryThings.cs
@@ -4,19 +4,17 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core
-{
+namespace PepperDash.Core;
+
+///
+/// Not in use
+///
+ public static class NetworkComm
+ {
///
/// Not in use
///
- public static class NetworkComm
- {
- ///
- /// Not in use
- ///
static NetworkComm()
{
}
- }
-
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/PasswordManagement/Config.cs b/src/PepperDash.Core/PasswordManagement/Config.cs
index 22aa48816..a5f071a4a 100644
--- a/src/PepperDash.Core/PasswordManagement/Config.cs
+++ b/src/PepperDash.Core/PasswordManagement/Config.cs
@@ -4,8 +4,8 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.PasswordManagement
-{
+namespace PepperDash.Core.PasswordManagement;
+
///
/// JSON password configuration
///
@@ -22,5 +22,4 @@ public PasswordConfig()
{
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/PasswordManagement/Constants.cs b/src/PepperDash.Core/PasswordManagement/Constants.cs
index 65a1bf45a..d4cf1e0bb 100644
--- a/src/PepperDash.Core/PasswordManagement/Constants.cs
+++ b/src/PepperDash.Core/PasswordManagement/Constants.cs
@@ -4,8 +4,8 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.PasswordManagement
-{
+namespace PepperDash.Core.PasswordManagement;
+
///
/// Constants
///
@@ -53,5 +53,4 @@ public class PasswordManagementConstants
/// Generic string value change constant
///
public const ushort StringValueChange = 201;
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/PasswordManagement/PasswordClient.cs b/src/PepperDash.Core/PasswordManagement/PasswordClient.cs
index 225a563c1..27d71e956 100644
--- a/src/PepperDash.Core/PasswordManagement/PasswordClient.cs
+++ b/src/PepperDash.Core/PasswordManagement/PasswordClient.cs
@@ -1,10 +1,10 @@
using System;
-namespace PepperDash.Core.PasswordManagement
-{
- ///
- /// A class to allow user interaction with the PasswordManager
- ///
+namespace PepperDash.Core.PasswordManagement;
+
+///
+/// A class to allow user interaction with the PasswordManager
+///
public class PasswordClient
{
///
@@ -183,5 +183,4 @@ protected void PasswordManager_PasswordChange(object sender, StringChangeEventAr
GetPasswordByIndex(args.Index);
}
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/PasswordManagement/PasswordManager.cs b/src/PepperDash.Core/PasswordManagement/PasswordManager.cs
index d15ac1e1b..da44e0592 100644
--- a/src/PepperDash.Core/PasswordManagement/PasswordManager.cs
+++ b/src/PepperDash.Core/PasswordManagement/PasswordManager.cs
@@ -2,11 +2,11 @@
using System.Collections.Generic;
using Crestron.SimplSharp;
-namespace PepperDash.Core.PasswordManagement
-{
- ///
- /// Allows passwords to be stored and managed
- ///
+namespace PepperDash.Core.PasswordManagement;
+
+///
+/// Allows passwords to be stored and managed
+///
public class PasswordManager
{
///
@@ -190,7 +190,7 @@ protected void OnBoolChange(bool state, ushort index, ushort type)
///
/// Protected ushort change event handler
///
- ///
+ ///
///
///
protected void OnUshrtChange(ushort value, ushort index, ushort type)
@@ -237,5 +237,4 @@ protected void OnPasswordChange(string value, ushort index, ushort type)
PasswordChange(this, args);
}
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/PepperDash.Core.csproj b/src/PepperDash.Core/PepperDash.Core.csproj
index daa5c6da4..b8745b2ee 100644
--- a/src/PepperDash.Core/PepperDash.Core.csproj
+++ b/src/PepperDash.Core/PepperDash.Core.csproj
@@ -5,7 +5,7 @@
PepperDash.Core
PepperDashCore
- net472
+ net8
true
en
bin\$(Configuration)\
@@ -35,22 +35,18 @@
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/PepperDash.Core/SystemInfo/EventArgs and Constants.cs b/src/PepperDash.Core/SystemInfo/EventArgs and Constants.cs
index cc71e3038..46d990721 100644
--- a/src/PepperDash.Core/SystemInfo/EventArgs and Constants.cs
+++ b/src/PepperDash.Core/SystemInfo/EventArgs and Constants.cs
@@ -4,68 +4,68 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.SystemInfo
-{
+namespace PepperDash.Core.SystemInfo;
+
///
/// Constants
///
public class SystemInfoConstants
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort BoolValueChange = 1;
///
///
///
- public const ushort CompleteBoolChange = 2;
+ public const ushort CompleteBoolChange = 2;
///
///
///
- public const ushort BusyBoolChange = 3;
-
- ///
- ///
- ///
+ public const ushort BusyBoolChange = 3;
+
+ ///
+ ///
+ ///
public const ushort UshortValueChange = 101;
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort StringValueChange = 201;
///
///
///
- public const ushort ConsoleResponseChange = 202;
+ public const ushort ConsoleResponseChange = 202;
///
///
///
- public const ushort ProcessorUptimeChange = 203;
+ public const ushort ProcessorUptimeChange = 203;
///
///
///
- public const ushort ProgramUptimeChange = 204;
+ public const ushort ProgramUptimeChange = 204;
- ///
- ///
- ///
+ ///
+ ///
+ ///
public const ushort ObjectChange = 301;
///
///
///
- public const ushort ProcessorConfigChange = 302;
+ public const ushort ProcessorConfigChange = 302;
///
///
///
- public const ushort EthernetConfigChange = 303;
+ public const ushort EthernetConfigChange = 303;
///
///
///
- public const ushort ControlSubnetConfigChange = 304;
+ public const ushort ControlSubnetConfigChange = 304;
///
///
///
- public const ushort ProgramConfigChange = 305;
+ public const ushort ProgramConfigChange = 305;
}
///
@@ -73,18 +73,18 @@ public class SystemInfoConstants
///
public class ProcessorChangeEventArgs : EventArgs
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ProcessorInfo Processor { get; set; }
///
///
///
- public ushort Type { get; set; }
+ public ushort Type { get; set; }
///
///
///
- public ushort Index { get; set; }
+ public ushort Index { get; set; }
///
/// Constructor
@@ -119,18 +119,18 @@ public ProcessorChangeEventArgs(ProcessorInfo processor, ushort type, ushort ind
///
public class EthernetChangeEventArgs : EventArgs
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public EthernetInfo Adapter { get; set; }
///
///
///
- public ushort Type { get; set; }
+ public ushort Type { get; set; }
///
///
///
- public ushort Index { get; set; }
+ public ushort Index { get; set; }
///
/// Constructor
@@ -143,7 +143,7 @@ public EthernetChangeEventArgs()
///
/// Constructor overload
///
- ///
+ ///
///
public EthernetChangeEventArgs(EthernetInfo ethernet, ushort type)
{
@@ -154,9 +154,9 @@ public EthernetChangeEventArgs(EthernetInfo ethernet, ushort type)
///
/// Constructor overload
///
- ///
+ ///
///
- ///
+ ///
public EthernetChangeEventArgs(EthernetInfo ethernet, ushort type, ushort index)
{
Adapter = ethernet;
@@ -170,18 +170,18 @@ public EthernetChangeEventArgs(EthernetInfo ethernet, ushort type, ushort index)
///
public class ControlSubnetChangeEventArgs : EventArgs
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ControlSubnetInfo Adapter { get; set; }
///
///
///
- public ushort Type { get; set; }
+ public ushort Type { get; set; }
///
///
///
- public ushort Index { get; set; }
+ public ushort Index { get; set; }
///
/// Constructor
@@ -216,18 +216,18 @@ public ControlSubnetChangeEventArgs(ControlSubnetInfo controlSubnet, ushort type
///
public class ProgramChangeEventArgs : EventArgs
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ProgramInfo Program { get; set; }
///
///
///
- public ushort Type { get; set; }
+ public ushort Type { get; set; }
///
///
///
- public ushort Index { get; set; }
+ public ushort Index { get; set; }
///
/// Constructor
@@ -240,7 +240,7 @@ public ProgramChangeEventArgs()
///
/// Constructor overload
///
- ///
+ ///
///
public ProgramChangeEventArgs(ProgramInfo program, ushort type)
{
@@ -251,14 +251,13 @@ public ProgramChangeEventArgs(ProgramInfo program, ushort type)
///
/// Constructor overload
///
- ///
+ ///
///
- ///
+ ///
public ProgramChangeEventArgs(ProgramInfo program, ushort type, ushort index)
{
Program = program;
Type = type;
Index = index;
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/SystemInfo/SystemInfoConfig.cs b/src/PepperDash.Core/SystemInfo/SystemInfoConfig.cs
index 8dc3acaf2..950abecb4 100644
--- a/src/PepperDash.Core/SystemInfo/SystemInfoConfig.cs
+++ b/src/PepperDash.Core/SystemInfo/SystemInfoConfig.cs
@@ -4,52 +4,52 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.SystemInfo
-{
+namespace PepperDash.Core.SystemInfo;
+
///
/// Processor info class
///
public class ProcessorInfo
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Model { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string SerialNumber { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Firmware { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string FirmwareDate { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string OsVersion { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string RuntimeEnvironment { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string DevicePlatform { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string ModuleDirectory { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string LocalTimeZone { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string ProgramIdTag { get; set; }
///
@@ -66,45 +66,45 @@ public ProcessorInfo()
///
public class EthernetInfo
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort DhcpIsOn { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Hostname { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string MacAddress { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string IpAddress { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Subnet { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Gateway { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Dns1 { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Dns2 { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Dns3 { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Domain { get; set; }
///
@@ -121,29 +121,29 @@ public EthernetInfo()
///
public class ControlSubnetInfo
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort Enabled { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public ushort IsInAutomaticMode { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string MacAddress { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string IpAddress { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Subnet { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string RouterPrefix { get; set; }
///
@@ -160,37 +160,37 @@ public ControlSubnetInfo()
///
public class ProgramInfo
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Name { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Header { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string System { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string ProgramIdTag { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string CompileTime { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Database { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Environment { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string Programmer { get; set; }
///
@@ -200,5 +200,4 @@ public ProgramInfo()
{
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/SystemInfo/SystemInfoToSimpl.cs b/src/PepperDash.Core/SystemInfo/SystemInfoToSimpl.cs
index 6677b9efd..be24be57a 100644
--- a/src/PepperDash.Core/SystemInfo/SystemInfoToSimpl.cs
+++ b/src/PepperDash.Core/SystemInfo/SystemInfoToSimpl.cs
@@ -4,37 +4,37 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.SystemInfo
-{
+namespace PepperDash.Core.SystemInfo;
+
///
/// System Info class
///
public class SystemInfoToSimpl
{
- ///
- /// Notifies of bool change
- ///
+ ///
+ /// Notifies of bool change
+ ///
public event EventHandler BoolChange;
- ///
- /// Notifies of string change
- ///
+ ///
+ /// Notifies of string change
+ ///
public event EventHandler StringChange;
- ///
- /// Notifies of processor change
- ///
+ ///
+ /// Notifies of processor change
+ ///
public event EventHandler ProcessorChange;
- ///
- /// Notifies of ethernet change
- ///
+ ///
+ /// Notifies of ethernet change
+ ///
public event EventHandler EthernetChange;
- ///
- /// Notifies of control subnet change
- ///
+ ///
+ /// Notifies of control subnet change
+ ///
public event EventHandler ControlSubnetChange;
- ///
- /// Notifies of program change
- ///
+ ///
+ /// Notifies of program change
+ ///
public event EventHandler ProgramChange;
///
@@ -327,10 +327,10 @@ public void SendConsoleCommand(string cmd)
///
/// private method to parse console messages
///
- ///
+ ///
///
- ///
- ///
+ ///
+ ///
///
private string ParseConsoleResponse(string data, string line, string dataStart, string dataEnd)
{
@@ -458,5 +458,4 @@ protected void OnProgramChange(ProgramInfo program, ushort index, ushort type)
ProgramChange(this, args);
}
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/Web/BouncyCertificate.cs b/src/PepperDash.Core/Web/BouncyCertificate.cs
index bf8b0f4c0..148b6eb1d 100644
--- a/src/PepperDash.Core/Web/BouncyCertificate.cs
+++ b/src/PepperDash.Core/Web/BouncyCertificate.cs
@@ -20,337 +20,336 @@
using BigInteger = Org.BouncyCastle.Math.BigInteger;
using X509Certificate = Org.BouncyCastle.X509.X509Certificate;
-namespace PepperDash.Core
+namespace PepperDash.Core;
+
+///
+/// Taken From https://github.com/rlipscombe/bouncy-castle-csharp/
+///
+internal class BouncyCertificate
{
- ///
- /// Taken From https://github.com/rlipscombe/bouncy-castle-csharp/
- ///
- internal class BouncyCertificate
+ public string CertificatePassword { get; set; } = "password";
+ public X509Certificate2 LoadCertificate(string issuerFileName, string password)
{
- public string CertificatePassword { get; set; } = "password";
- public X509Certificate2 LoadCertificate(string issuerFileName, string password)
- {
- // We need to pass 'Exportable', otherwise we can't get the private key.
- var issuerCertificate = new X509Certificate2(issuerFileName, password, X509KeyStorageFlags.Exportable);
- return issuerCertificate;
- }
+ // We need to pass 'Exportable', otherwise we can't get the private key.
+ var issuerCertificate = new X509Certificate2(issuerFileName, password, X509KeyStorageFlags.Exportable);
+ return issuerCertificate;
+ }
- public X509Certificate2 IssueCertificate(string subjectName, X509Certificate2 issuerCertificate, string[] subjectAlternativeNames, KeyPurposeID[] usages)
- {
- // It's self-signed, so these are the same.
- var issuerName = issuerCertificate.Subject;
+ public X509Certificate2 IssueCertificate(string subjectName, X509Certificate2 issuerCertificate, string[] subjectAlternativeNames, KeyPurposeID[] usages)
+ {
+ // It's self-signed, so these are the same.
+ var issuerName = issuerCertificate.Subject;
- var random = GetSecureRandom();
- var subjectKeyPair = GenerateKeyPair(random, 2048);
+ var random = GetSecureRandom();
+ var subjectKeyPair = GenerateKeyPair(random, 2048);
- var issuerKeyPair = DotNetUtilities.GetKeyPair(issuerCertificate.PrivateKey);
+ var issuerKeyPair = DotNetUtilities.GetKeyPair(issuerCertificate.PrivateKey);
- var serialNumber = GenerateSerialNumber(random);
- var issuerSerialNumber = new BigInteger(issuerCertificate.GetSerialNumber());
+ var serialNumber = GenerateSerialNumber(random);
+ var issuerSerialNumber = new BigInteger(issuerCertificate.GetSerialNumber());
- const bool isCertificateAuthority = false;
- var certificate = GenerateCertificate(random, subjectName, subjectKeyPair, serialNumber,
- subjectAlternativeNames, issuerName, issuerKeyPair,
- issuerSerialNumber, isCertificateAuthority,
- usages);
- return ConvertCertificate(certificate, subjectKeyPair, random);
- }
+ const bool isCertificateAuthority = false;
+ var certificate = GenerateCertificate(random, subjectName, subjectKeyPair, serialNumber,
+ subjectAlternativeNames, issuerName, issuerKeyPair,
+ issuerSerialNumber, isCertificateAuthority,
+ usages);
+ return ConvertCertificate(certificate, subjectKeyPair, random);
+ }
- public X509Certificate2 CreateCertificateAuthorityCertificate(string subjectName, string[] subjectAlternativeNames, KeyPurposeID[] usages)
- {
- // It's self-signed, so these are the same.
- var issuerName = subjectName;
+ public X509Certificate2 CreateCertificateAuthorityCertificate(string subjectName, string[] subjectAlternativeNames, KeyPurposeID[] usages)
+ {
+ // It's self-signed, so these are the same.
+ var issuerName = subjectName;
- var random = GetSecureRandom();
- var subjectKeyPair = GenerateKeyPair(random, 2048);
+ var random = GetSecureRandom();
+ var subjectKeyPair = GenerateKeyPair(random, 2048);
- // It's self-signed, so these are the same.
- var issuerKeyPair = subjectKeyPair;
+ // It's self-signed, so these are the same.
+ var issuerKeyPair = subjectKeyPair;
- var serialNumber = GenerateSerialNumber(random);
- var issuerSerialNumber = serialNumber; // Self-signed, so it's the same serial number.
+ var serialNumber = GenerateSerialNumber(random);
+ var issuerSerialNumber = serialNumber; // Self-signed, so it's the same serial number.
- const bool isCertificateAuthority = true;
- var certificate = GenerateCertificate(random, subjectName, subjectKeyPair, serialNumber,
- subjectAlternativeNames, issuerName, issuerKeyPair,
- issuerSerialNumber, isCertificateAuthority,
- usages);
- return ConvertCertificate(certificate, subjectKeyPair, random);
- }
+ const bool isCertificateAuthority = true;
+ var certificate = GenerateCertificate(random, subjectName, subjectKeyPair, serialNumber,
+ subjectAlternativeNames, issuerName, issuerKeyPair,
+ issuerSerialNumber, isCertificateAuthority,
+ usages);
+ return ConvertCertificate(certificate, subjectKeyPair, random);
+ }
- public X509Certificate2 CreateSelfSignedCertificate(string subjectName, string[] subjectAlternativeNames, KeyPurposeID[] usages)
- {
- // It's self-signed, so these are the same.
- var issuerName = subjectName;
+ public X509Certificate2 CreateSelfSignedCertificate(string subjectName, string[] subjectAlternativeNames, KeyPurposeID[] usages)
+ {
+ // It's self-signed, so these are the same.
+ var issuerName = subjectName;
- var random = GetSecureRandom();
- var subjectKeyPair = GenerateKeyPair(random, 2048);
+ var random = GetSecureRandom();
+ var subjectKeyPair = GenerateKeyPair(random, 2048);
- // It's self-signed, so these are the same.
- var issuerKeyPair = subjectKeyPair;
+ // It's self-signed, so these are the same.
+ var issuerKeyPair = subjectKeyPair;
- var serialNumber = GenerateSerialNumber(random);
- var issuerSerialNumber = serialNumber; // Self-signed, so it's the same serial number.
+ var serialNumber = GenerateSerialNumber(random);
+ var issuerSerialNumber = serialNumber; // Self-signed, so it's the same serial number.
- const bool isCertificateAuthority = false;
- var certificate = GenerateCertificate(random, subjectName, subjectKeyPair, serialNumber,
- subjectAlternativeNames, issuerName, issuerKeyPair,
- issuerSerialNumber, isCertificateAuthority,
- usages);
- return ConvertCertificate(certificate, subjectKeyPair, random);
- }
+ const bool isCertificateAuthority = false;
+ var certificate = GenerateCertificate(random, subjectName, subjectKeyPair, serialNumber,
+ subjectAlternativeNames, issuerName, issuerKeyPair,
+ issuerSerialNumber, isCertificateAuthority,
+ usages);
+ return ConvertCertificate(certificate, subjectKeyPair, random);
+ }
- private SecureRandom GetSecureRandom()
- {
- // Since we're on Windows, we'll use the CryptoAPI one (on the assumption
- // that it might have access to better sources of entropy than the built-in
- // Bouncy Castle ones):
- var randomGenerator = new CryptoApiRandomGenerator();
- var random = new SecureRandom(randomGenerator);
- return random;
- }
+ private SecureRandom GetSecureRandom()
+ {
+ // Since we're on Windows, we'll use the CryptoAPI one (on the assumption
+ // that it might have access to better sources of entropy than the built-in
+ // Bouncy Castle ones):
+ var randomGenerator = new CryptoApiRandomGenerator();
+ var random = new SecureRandom(randomGenerator);
+ return random;
+ }
- private X509Certificate GenerateCertificate(SecureRandom random,
- string subjectName,
- AsymmetricCipherKeyPair subjectKeyPair,
- BigInteger subjectSerialNumber,
- string[] subjectAlternativeNames,
- string issuerName,
- AsymmetricCipherKeyPair issuerKeyPair,
- BigInteger issuerSerialNumber,
- bool isCertificateAuthority,
- KeyPurposeID[] usages)
- {
- var certificateGenerator = new X509V3CertificateGenerator();
+ private X509Certificate GenerateCertificate(SecureRandom random,
+ string subjectName,
+ AsymmetricCipherKeyPair subjectKeyPair,
+ BigInteger subjectSerialNumber,
+ string[] subjectAlternativeNames,
+ string issuerName,
+ AsymmetricCipherKeyPair issuerKeyPair,
+ BigInteger issuerSerialNumber,
+ bool isCertificateAuthority,
+ KeyPurposeID[] usages)
+ {
+ var certificateGenerator = new X509V3CertificateGenerator();
- certificateGenerator.SetSerialNumber(subjectSerialNumber);
+ certificateGenerator.SetSerialNumber(subjectSerialNumber);
- var issuerDN = new X509Name(issuerName);
- certificateGenerator.SetIssuerDN(issuerDN);
+ var issuerDN = new X509Name(issuerName);
+ certificateGenerator.SetIssuerDN(issuerDN);
- // Note: The subject can be omitted if you specify a subject alternative name (SAN).
- var subjectDN = new X509Name(subjectName);
- certificateGenerator.SetSubjectDN(subjectDN);
+ // Note: The subject can be omitted if you specify a subject alternative name (SAN).
+ var subjectDN = new X509Name(subjectName);
+ certificateGenerator.SetSubjectDN(subjectDN);
- // Our certificate needs valid from/to values.
- var notBefore = DateTime.UtcNow.Date;
- var notAfter = notBefore.AddYears(2);
+ // Our certificate needs valid from/to values.
+ var notBefore = DateTime.UtcNow.Date;
+ var notAfter = notBefore.AddYears(2);
- certificateGenerator.SetNotBefore(notBefore);
- certificateGenerator.SetNotAfter(notAfter);
+ certificateGenerator.SetNotBefore(notBefore);
+ certificateGenerator.SetNotAfter(notAfter);
- // The subject's public key goes in the certificate.
- certificateGenerator.SetPublicKey(subjectKeyPair.Public);
+ // The subject's public key goes in the certificate.
+ certificateGenerator.SetPublicKey(subjectKeyPair.Public);
- AddAuthorityKeyIdentifier(certificateGenerator, issuerDN, issuerKeyPair, issuerSerialNumber);
- AddSubjectKeyIdentifier(certificateGenerator, subjectKeyPair);
- //AddBasicConstraints(certificateGenerator, isCertificateAuthority);
+ AddAuthorityKeyIdentifier(certificateGenerator, issuerDN, issuerKeyPair, issuerSerialNumber);
+ AddSubjectKeyIdentifier(certificateGenerator, subjectKeyPair);
+ //AddBasicConstraints(certificateGenerator, isCertificateAuthority);
- if (usages != null && usages.Any())
- AddExtendedKeyUsage(certificateGenerator, usages);
+ if (usages != null && usages.Any())
+ AddExtendedKeyUsage(certificateGenerator, usages);
- if (subjectAlternativeNames != null && subjectAlternativeNames.Any())
- AddSubjectAlternativeNames(certificateGenerator, subjectAlternativeNames);
+ if (subjectAlternativeNames != null && subjectAlternativeNames.Any())
+ AddSubjectAlternativeNames(certificateGenerator, subjectAlternativeNames);
- // Set the signature algorithm. This is used to generate the thumbprint which is then signed
- // with the issuer's private key. We'll use SHA-256, which is (currently) considered fairly strong.
- const string signatureAlgorithm = "SHA256WithRSA";
+ // Set the signature algorithm. This is used to generate the thumbprint which is then signed
+ // with the issuer's private key. We'll use SHA-256, which is (currently) considered fairly strong.
+ const string signatureAlgorithm = "SHA256WithRSA";
- // The certificate is signed with the issuer's private key.
- ISignatureFactory signatureFactory = new Asn1SignatureFactory(signatureAlgorithm, issuerKeyPair.Private, random);
- var certificate = certificateGenerator.Generate(signatureFactory);
- return certificate;
- }
+ // The certificate is signed with the issuer's private key.
+ ISignatureFactory signatureFactory = new Asn1SignatureFactory(signatureAlgorithm, issuerKeyPair.Private, random);
+ var certificate = certificateGenerator.Generate(signatureFactory);
+ return certificate;
+ }
- ///
- /// The certificate needs a serial number. This is used for revocation,
- /// and usually should be an incrementing index (which makes it easier to revoke a range of certificates).
- /// Since we don't have anywhere to store the incrementing index, we can just use a random number.
- ///
- ///
- ///
- private BigInteger GenerateSerialNumber(SecureRandom random)
- {
- var serialNumber =
- BigIntegers.CreateRandomInRange(
- BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random);
- return serialNumber;
- }
+ ///
+ /// The certificate needs a serial number. This is used for revocation,
+ /// and usually should be an incrementing index (which makes it easier to revoke a range of certificates).
+ /// Since we don't have anywhere to store the incrementing index, we can just use a random number.
+ ///
+ ///
+ ///
+ private BigInteger GenerateSerialNumber(SecureRandom random)
+ {
+ var serialNumber =
+ BigIntegers.CreateRandomInRange(
+ BigInteger.One, BigInteger.ValueOf(Int64.MaxValue), random);
+ return serialNumber;
+ }
- ///
- /// Generate a key pair.
- ///
- /// The random number generator.
- /// The key length in bits. For RSA, 2048 bits should be considered the minimum acceptable these days.
- ///
- private AsymmetricCipherKeyPair GenerateKeyPair(SecureRandom random, int strength)
- {
- var keyGenerationParameters = new KeyGenerationParameters(random, strength);
+ ///
+ /// Generate a key pair.
+ ///
+ /// The random number generator.
+ /// The key length in bits. For RSA, 2048 bits should be considered the minimum acceptable these days.
+ ///
+ private AsymmetricCipherKeyPair GenerateKeyPair(SecureRandom random, int strength)
+ {
+ var keyGenerationParameters = new KeyGenerationParameters(random, strength);
- var keyPairGenerator = new RsaKeyPairGenerator();
- keyPairGenerator.Init(keyGenerationParameters);
- var subjectKeyPair = keyPairGenerator.GenerateKeyPair();
- return subjectKeyPair;
- }
+ var keyPairGenerator = new RsaKeyPairGenerator();
+ keyPairGenerator.Init(keyGenerationParameters);
+ var subjectKeyPair = keyPairGenerator.GenerateKeyPair();
+ return subjectKeyPair;
+ }
- ///
- /// Add the Authority Key Identifier. According to http://www.alvestrand.no/objectid/2.5.29.35.html, this
- /// identifies the public key to be used to verify the signature on this certificate.
- /// In a certificate chain, this corresponds to the "Subject Key Identifier" on the *issuer* certificate.
- /// The Bouncy Castle documentation, at http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation,
- /// shows how to create this from the issuing certificate. Since we're creating a self-signed certificate, we have to do this slightly differently.
- ///
- ///
- ///
- ///
- ///
- private void AddAuthorityKeyIdentifier(X509V3CertificateGenerator certificateGenerator,
- X509Name issuerDN,
- AsymmetricCipherKeyPair issuerKeyPair,
- BigInteger issuerSerialNumber)
- {
- var authorityKeyIdentifierExtension =
- new AuthorityKeyIdentifier(
- SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(issuerKeyPair.Public),
- new GeneralNames(new GeneralName(issuerDN)),
- issuerSerialNumber);
- certificateGenerator.AddExtension(
- X509Extensions.AuthorityKeyIdentifier.Id, false, authorityKeyIdentifierExtension);
- }
+ ///
+ /// Add the Authority Key Identifier. According to http://www.alvestrand.no/objectid/2.5.29.35.html, this
+ /// identifies the public key to be used to verify the signature on this certificate.
+ /// In a certificate chain, this corresponds to the "Subject Key Identifier" on the *issuer* certificate.
+ /// The Bouncy Castle documentation, at http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation,
+ /// shows how to create this from the issuing certificate. Since we're creating a self-signed certificate, we have to do this slightly differently.
+ ///
+ ///
+ ///
+ ///
+ ///
+ private void AddAuthorityKeyIdentifier(X509V3CertificateGenerator certificateGenerator,
+ X509Name issuerDN,
+ AsymmetricCipherKeyPair issuerKeyPair,
+ BigInteger issuerSerialNumber)
+ {
+ var authorityKeyIdentifierExtension =
+ new AuthorityKeyIdentifier(
+ SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(issuerKeyPair.Public),
+ new GeneralNames(new GeneralName(issuerDN)),
+ issuerSerialNumber);
+ certificateGenerator.AddExtension(
+ X509Extensions.AuthorityKeyIdentifier.Id, false, authorityKeyIdentifierExtension);
+ }
- ///
- /// Add the "Subject Alternative Names" extension. Note that you have to repeat
- /// the value from the "Subject Name" property.
- ///
- ///
- ///
- private void AddSubjectAlternativeNames(X509V3CertificateGenerator certificateGenerator,
- IEnumerable subjectAlternativeNames)
- {
- var subjectAlternativeNamesExtension =
- new DerSequence(
- subjectAlternativeNames.Select(name => new GeneralName(GeneralName.DnsName, name))
- .ToArray());
- certificateGenerator.AddExtension(
- X509Extensions.SubjectAlternativeName.Id, false, subjectAlternativeNamesExtension);
- }
+ ///
+ /// Add the "Subject Alternative Names" extension. Note that you have to repeat
+ /// the value from the "Subject Name" property.
+ ///
+ ///
+ ///
+ private void AddSubjectAlternativeNames(X509V3CertificateGenerator certificateGenerator,
+ IEnumerable subjectAlternativeNames)
+ {
+ var subjectAlternativeNamesExtension =
+ new DerSequence(
+ subjectAlternativeNames.Select(name => new GeneralName(GeneralName.DnsName, name))
+ .ToArray());
+ certificateGenerator.AddExtension(
+ X509Extensions.SubjectAlternativeName.Id, false, subjectAlternativeNamesExtension);
+ }
- ///
- /// Add the "Extended Key Usage" extension, specifying (for example) "server authentication".
- ///
- ///
- ///
- private void AddExtendedKeyUsage(X509V3CertificateGenerator certificateGenerator, KeyPurposeID[] usages)
- {
- certificateGenerator.AddExtension(
- X509Extensions.ExtendedKeyUsage.Id, false, new ExtendedKeyUsage(usages));
- }
+ ///
+ /// Add the "Extended Key Usage" extension, specifying (for example) "server authentication".
+ ///
+ ///
+ ///
+ private void AddExtendedKeyUsage(X509V3CertificateGenerator certificateGenerator, KeyPurposeID[] usages)
+ {
+ certificateGenerator.AddExtension(
+ X509Extensions.ExtendedKeyUsage.Id, false, new ExtendedKeyUsage(usages));
+ }
- ///
- /// Add the "Basic Constraints" extension.
- ///
- ///
- ///
- private void AddBasicConstraints(X509V3CertificateGenerator certificateGenerator,
- bool isCertificateAuthority)
- {
- certificateGenerator.AddExtension(
- X509Extensions.BasicConstraints.Id, true, new BasicConstraints(isCertificateAuthority));
- }
+ ///
+ /// Add the "Basic Constraints" extension.
+ ///
+ ///
+ ///
+ private void AddBasicConstraints(X509V3CertificateGenerator certificateGenerator,
+ bool isCertificateAuthority)
+ {
+ certificateGenerator.AddExtension(
+ X509Extensions.BasicConstraints.Id, true, new BasicConstraints(isCertificateAuthority));
+ }
- ///
- /// Add the Subject Key Identifier.
- ///
- ///
- ///
- private void AddSubjectKeyIdentifier(X509V3CertificateGenerator certificateGenerator,
- AsymmetricCipherKeyPair subjectKeyPair)
- {
- var subjectKeyIdentifierExtension =
- new SubjectKeyIdentifier(
- SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(subjectKeyPair.Public));
- certificateGenerator.AddExtension(
- X509Extensions.SubjectKeyIdentifier.Id, false, subjectKeyIdentifierExtension);
- }
+ ///
+ /// Add the Subject Key Identifier.
+ ///
+ ///
+ ///
+ private void AddSubjectKeyIdentifier(X509V3CertificateGenerator certificateGenerator,
+ AsymmetricCipherKeyPair subjectKeyPair)
+ {
+ var subjectKeyIdentifierExtension =
+ new SubjectKeyIdentifier(
+ SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(subjectKeyPair.Public));
+ certificateGenerator.AddExtension(
+ X509Extensions.SubjectKeyIdentifier.Id, false, subjectKeyIdentifierExtension);
+ }
- private X509Certificate2 ConvertCertificate(X509Certificate certificate,
- AsymmetricCipherKeyPair subjectKeyPair,
- SecureRandom random)
- {
- // Now to convert the Bouncy Castle certificate to a .NET certificate.
- // See http://web.archive.org/web/20100504192226/http://www.fkollmann.de/v2/post/Creating-certificates-using-BouncyCastle.aspx
- // ...but, basically, we create a PKCS12 store (a .PFX file) in memory, and add the public and private key to that.
- var store = new Pkcs12StoreBuilder().Build();
+ private X509Certificate2 ConvertCertificate(X509Certificate certificate,
+ AsymmetricCipherKeyPair subjectKeyPair,
+ SecureRandom random)
+ {
+ // Now to convert the Bouncy Castle certificate to a .NET certificate.
+ // See http://web.archive.org/web/20100504192226/http://www.fkollmann.de/v2/post/Creating-certificates-using-BouncyCastle.aspx
+ // ...but, basically, we create a PKCS12 store (a .PFX file) in memory, and add the public and private key to that.
+ var store = new Pkcs12StoreBuilder().Build();
- // What Bouncy Castle calls "alias" is the same as what Windows terms the "friendly name".
- string friendlyName = certificate.SubjectDN.ToString();
+ // What Bouncy Castle calls "alias" is the same as what Windows terms the "friendly name".
+ string friendlyName = certificate.SubjectDN.ToString();
- // Add the certificate.
- var certificateEntry = new X509CertificateEntry(certificate);
- store.SetCertificateEntry(friendlyName, certificateEntry);
+ // Add the certificate.
+ var certificateEntry = new X509CertificateEntry(certificate);
+ store.SetCertificateEntry(friendlyName, certificateEntry);
- // Add the private key.
- store.SetKeyEntry(friendlyName, new AsymmetricKeyEntry(subjectKeyPair.Private), new[] { certificateEntry });
+ // Add the private key.
+ store.SetKeyEntry(friendlyName, new AsymmetricKeyEntry(subjectKeyPair.Private), new[] { certificateEntry });
- // Convert it to an X509Certificate2 object by saving/loading it from a MemoryStream.
- // It needs a password. Since we'll remove this later, it doesn't particularly matter what we use.
+ // Convert it to an X509Certificate2 object by saving/loading it from a MemoryStream.
+ // It needs a password. Since we'll remove this later, it doesn't particularly matter what we use.
- var stream = new MemoryStream();
- store.Save(stream, CertificatePassword.ToCharArray(), random);
+ var stream = new MemoryStream();
+ store.Save(stream, CertificatePassword.ToCharArray(), random);
- var convertedCertificate =
- new X509Certificate2(stream.ToArray(),
- CertificatePassword,
- X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
- return convertedCertificate;
- }
+ var convertedCertificate =
+ new X509Certificate2(stream.ToArray(),
+ CertificatePassword,
+ X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
+ return convertedCertificate;
+ }
- public void WriteCertificate(X509Certificate2 certificate, string outputDirectory, string certName)
+ public void WriteCertificate(X509Certificate2 certificate, string outputDirectory, string certName)
+ {
+ // This password is the one attached to the PFX file. Use 'null' for no password.
+ // Create PFX (PKCS #12) with private key
+ try
{
- // This password is the one attached to the PFX file. Use 'null' for no password.
- // Create PFX (PKCS #12) with private key
- try
- {
- var pfx = certificate.Export(X509ContentType.Pfx, CertificatePassword);
- File.WriteAllBytes(string.Format("{0}.pfx", Path.Combine(outputDirectory, certName)), pfx);
- }
- catch (Exception ex)
- {
- CrestronConsole.PrintLine(string.Format("Failed to write x509 cert pfx\r\n{0}", ex.Message));
- }
- // Create Base 64 encoded CER (public key only)
- using (var writer = new StreamWriter($"{Path.Combine(outputDirectory, certName)}.cer", false))
- {
- try
- {
- var contents = string.Format("-----BEGIN CERTIFICATE-----\r\n{0}\r\n-----END CERTIFICATE-----", Convert.ToBase64String(certificate.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks));
- writer.Write(contents);
- }
- catch (Exception ex)
- {
- CrestronConsole.PrintLine(string.Format("Failed to write x509 cert cer\r\n{0}", ex.Message));
- }
- }
+ var pfx = certificate.Export(X509ContentType.Pfx, CertificatePassword);
+ File.WriteAllBytes(string.Format("{0}.pfx", Path.Combine(outputDirectory, certName)), pfx);
}
- public bool AddCertToStore(X509Certificate2 cert, System.Security.Cryptography.X509Certificates.StoreName st, System.Security.Cryptography.X509Certificates.StoreLocation sl)
+ catch (Exception ex)
+ {
+ CrestronConsole.PrintLine(string.Format("Failed to write x509 cert pfx\r\n{0}", ex.Message));
+ }
+ // Create Base 64 encoded CER (public key only)
+ using (var writer = new StreamWriter($"{Path.Combine(outputDirectory, certName)}.cer", false))
{
- bool bRet = false;
-
try
{
- var store = new System.Security.Cryptography.X509Certificates.X509Store(st, sl);
- store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadWrite);
- store.Add(cert);
-
- store.Close();
- bRet = true;
+ var contents = string.Format("-----BEGIN CERTIFICATE-----\r\n{0}\r\n-----END CERTIFICATE-----", Convert.ToBase64String(certificate.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks));
+ writer.Write(contents);
}
catch (Exception ex)
{
- CrestronConsole.PrintLine(string.Format("AddCertToStore Failed\r\n{0}\r\n{1}", ex.Message, ex.StackTrace));
+ CrestronConsole.PrintLine(string.Format("Failed to write x509 cert cer\r\n{0}", ex.Message));
}
+ }
+ }
+ public bool AddCertToStore(X509Certificate2 cert, System.Security.Cryptography.X509Certificates.StoreName st, System.Security.Cryptography.X509Certificates.StoreLocation sl)
+ {
+ bool bRet = false;
- return bRet;
+ try
+ {
+ var store = new System.Security.Cryptography.X509Certificates.X509Store(st, sl);
+ store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadWrite);
+ store.Add(cert);
+
+ store.Close();
+ bRet = true;
}
+ catch (Exception ex)
+ {
+ CrestronConsole.PrintLine(string.Format("AddCertToStore Failed\r\n{0}\r\n{1}", ex.Message, ex.StackTrace));
+ }
+
+ return bRet;
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/Web/RequestHandlers/DefaultRequestHandler.cs b/src/PepperDash.Core/Web/RequestHandlers/DefaultRequestHandler.cs
index ca19cf2fb..2fee0a622 100644
--- a/src/PepperDash.Core/Web/RequestHandlers/DefaultRequestHandler.cs
+++ b/src/PepperDash.Core/Web/RequestHandlers/DefaultRequestHandler.cs
@@ -1,7 +1,7 @@
using Crestron.SimplSharp.WebScripting;
-namespace PepperDash.Core.Web.RequestHandlers
-{
+namespace PepperDash.Core.Web.RequestHandlers;
+
///
/// Web API default request handler
///
@@ -13,5 +13,4 @@ public class DefaultRequestHandler : WebApiBaseRequestHandler
public DefaultRequestHandler()
: base(true)
{ }
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestAsyncHandler.cs b/src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestAsyncHandler.cs
index b11700319..e8b3e85b5 100644
--- a/src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestAsyncHandler.cs
+++ b/src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestAsyncHandler.cs
@@ -3,161 +3,160 @@
using System.Collections.Generic;
using System.Threading.Tasks;
-namespace PepperDash.Core.Web.RequestHandlers
+namespace PepperDash.Core.Web.RequestHandlers;
+
+public abstract class WebApiBaseRequestAsyncHandler:IHttpCwsHandler
{
- public abstract class WebApiBaseRequestAsyncHandler:IHttpCwsHandler
+ private readonly Dictionary> _handlers;
+ protected readonly bool EnableCors;
+
+ ///
+ /// Constructor
+ ///
+ protected WebApiBaseRequestAsyncHandler(bool enableCors)
{
- private readonly Dictionary> _handlers;
- protected readonly bool EnableCors;
+ EnableCors = enableCors;
- ///
- /// Constructor
- ///
- protected WebApiBaseRequestAsyncHandler(bool enableCors)
+ _handlers = new Dictionary>
{
- EnableCors = enableCors;
-
- _handlers = new Dictionary>
- {
- {"CONNECT", HandleConnect},
- {"DELETE", HandleDelete},
- {"GET", HandleGet},
- {"HEAD", HandleHead},
- {"OPTIONS", HandleOptions},
- {"PATCH", HandlePatch},
- {"POST", HandlePost},
- {"PUT", HandlePut},
- {"TRACE", HandleTrace}
- };
- }
+ {"CONNECT", HandleConnect},
+ {"DELETE", HandleDelete},
+ {"GET", HandleGet},
+ {"HEAD", HandleHead},
+ {"OPTIONS", HandleOptions},
+ {"PATCH", HandlePatch},
+ {"POST", HandlePost},
+ {"PUT", HandlePut},
+ {"TRACE", HandleTrace}
+ };
+ }
- ///
- /// Constructor
- ///
- protected WebApiBaseRequestAsyncHandler()
- : this(false)
- {
- }
+ ///
+ /// Constructor
+ ///
+ protected WebApiBaseRequestAsyncHandler()
+ : this(false)
+ {
+ }
- ///
- /// Handles CONNECT method requests
- ///
- ///
- protected virtual async Task HandleConnect(HttpCwsContext context)
- {
- context.Response.StatusCode = 501;
- context.Response.StatusDescription = "Not Implemented";
- context.Response.End();
- }
+ ///
+ /// Handles CONNECT method requests
+ ///
+ ///
+ protected virtual async Task HandleConnect(HttpCwsContext context)
+ {
+ context.Response.StatusCode = 501;
+ context.Response.StatusDescription = "Not Implemented";
+ context.Response.End();
+ }
- ///
- /// Handles DELETE method requests
- ///
- ///
- protected virtual async Task HandleDelete(HttpCwsContext context)
- {
- context.Response.StatusCode = 501;
- context.Response.StatusDescription = "Not Implemented";
- context.Response.End();
- }
+ ///
+ /// Handles DELETE method requests
+ ///
+ ///
+ protected virtual async Task HandleDelete(HttpCwsContext context)
+ {
+ context.Response.StatusCode = 501;
+ context.Response.StatusDescription = "Not Implemented";
+ context.Response.End();
+ }
- ///
- /// Handles GET method requests
- ///
- ///
- protected virtual async Task HandleGet(HttpCwsContext context)
- {
- context.Response.StatusCode = 501;
- context.Response.StatusDescription = "Not Implemented";
- context.Response.End();
- }
+ ///
+ /// Handles GET method requests
+ ///
+ ///
+ protected virtual async Task HandleGet(HttpCwsContext context)
+ {
+ context.Response.StatusCode = 501;
+ context.Response.StatusDescription = "Not Implemented";
+ context.Response.End();
+ }
- ///
- /// Handles HEAD method requests
- ///
- ///
- protected virtual async Task HandleHead(HttpCwsContext context)
- {
- context.Response.StatusCode = 501;
- context.Response.StatusDescription = "Not Implemented";
- context.Response.End();
- }
+ ///
+ /// Handles HEAD method requests
+ ///
+ ///
+ protected virtual async Task HandleHead(HttpCwsContext context)
+ {
+ context.Response.StatusCode = 501;
+ context.Response.StatusDescription = "Not Implemented";
+ context.Response.End();
+ }
- ///
- /// Handles OPTIONS method requests
- ///
- ///
- protected virtual async Task HandleOptions(HttpCwsContext context)
- {
- context.Response.StatusCode = 501;
- context.Response.StatusDescription = "Not Implemented";
- context.Response.End();
- }
+ ///
+ /// Handles OPTIONS method requests
+ ///
+ ///
+ protected virtual async Task HandleOptions(HttpCwsContext context)
+ {
+ context.Response.StatusCode = 501;
+ context.Response.StatusDescription = "Not Implemented";
+ context.Response.End();
+ }
- ///
- /// Handles PATCH method requests
- ///
- ///
- protected virtual async Task HandlePatch(HttpCwsContext context)
- {
- context.Response.StatusCode = 501;
- context.Response.StatusDescription = "Not Implemented";
- context.Response.End();
- }
+ ///
+ /// Handles PATCH method requests
+ ///
+ ///
+ protected virtual async Task HandlePatch(HttpCwsContext context)
+ {
+ context.Response.StatusCode = 501;
+ context.Response.StatusDescription = "Not Implemented";
+ context.Response.End();
+ }
- ///
- /// Handles POST method requests
- ///
- ///
- protected virtual async Task HandlePost(HttpCwsContext context)
- {
- context.Response.StatusCode = 501;
- context.Response.StatusDescription = "Not Implemented";
- context.Response.End();
- }
+ ///
+ /// Handles POST method requests
+ ///
+ ///
+ protected virtual async Task HandlePost(HttpCwsContext context)
+ {
+ context.Response.StatusCode = 501;
+ context.Response.StatusDescription = "Not Implemented";
+ context.Response.End();
+ }
- ///
- /// Handles PUT method requests
- ///
- ///
- protected virtual async Task HandlePut(HttpCwsContext context)
- {
- context.Response.StatusCode = 501;
- context.Response.StatusDescription = "Not Implemented";
- context.Response.End();
- }
+ ///
+ /// Handles PUT method requests
+ ///
+ ///
+ protected virtual async Task HandlePut(HttpCwsContext context)
+ {
+ context.Response.StatusCode = 501;
+ context.Response.StatusDescription = "Not Implemented";
+ context.Response.End();
+ }
- ///
- /// Handles TRACE method requests
- ///
- ///
- protected virtual async Task HandleTrace(HttpCwsContext context)
+ ///
+ /// Handles TRACE method requests
+ ///
+ ///
+ protected virtual async Task HandleTrace(HttpCwsContext context)
+ {
+ context.Response.StatusCode = 501;
+ context.Response.StatusDescription = "Not Implemented";
+ context.Response.End();
+ }
+
+ ///
+ /// Process request
+ ///
+ ///
+ public void ProcessRequest(HttpCwsContext context)
+ {
+ if (!_handlers.TryGetValue(context.Request.HttpMethod, out Func handler))
{
- context.Response.StatusCode = 501;
- context.Response.StatusDescription = "Not Implemented";
- context.Response.End();
+ return;
}
- ///
- /// Process request
- ///
- ///
- public void ProcessRequest(HttpCwsContext context)
+ if (EnableCors)
{
- if (!_handlers.TryGetValue(context.Request.HttpMethod, out Func handler))
- {
- return;
- }
-
- if (EnableCors)
- {
- context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
- context.Response.Headers.Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
- }
+ context.Response.Headers.Add("Access-Control-Allow-Origin", "*");
+ context.Response.Headers.Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
+ }
- var handlerTask = handler(context);
+ var handlerTask = handler(context);
- handlerTask.GetAwaiter().GetResult();
- }
+ handlerTask.GetAwaiter().GetResult();
}
}
diff --git a/src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestHandler.cs b/src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestHandler.cs
index 99e4aa93c..22d368a5b 100644
--- a/src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestHandler.cs
+++ b/src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestHandler.cs
@@ -2,8 +2,8 @@
using System.Collections.Generic;
using Crestron.SimplSharp.WebScripting;
-namespace PepperDash.Core.Web.RequestHandlers
-{
+namespace PepperDash.Core.Web.RequestHandlers;
+
///
/// CWS Base Handler, implements IHttpCwsHandler
///
@@ -161,5 +161,4 @@ public void ProcessRequest(HttpCwsContext context)
handler(context);
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/Web/WebApiServer.cs b/src/PepperDash.Core/Web/WebApiServer.cs
index cf45b361d..dd6ed8d76 100644
--- a/src/PepperDash.Core/Web/WebApiServer.cs
+++ b/src/PepperDash.Core/Web/WebApiServer.cs
@@ -7,8 +7,8 @@
using Newtonsoft.Json.Linq;
using PepperDash.Core.Web.RequestHandlers;
-namespace PepperDash.Core.Web
-{
+namespace PepperDash.Core.Web;
+
///
/// Web API server
///
@@ -280,5 +280,4 @@ public void ReceivedRequestEventHandler(object sender, HttpCwsRequestEventArgs a
Debug.Console(DebugVerbose, this, "ReceivedRequestEventHandler Exception InnerException: {0}", ex.InnerException);
}
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/WebApi/Presets/Preset.cs b/src/PepperDash.Core/WebApi/Presets/Preset.cs
index bdbc5820f..444d054f0 100644
--- a/src/PepperDash.Core/WebApi/Presets/Preset.cs
+++ b/src/PepperDash.Core/WebApi/Presets/Preset.cs
@@ -1,45 +1,45 @@
using System;
-namespace PepperDash.Core.WebApi.Presets
-{
- ///
- /// Represents a preset
- ///
+namespace PepperDash.Core.WebApi.Presets;
+
+///
+/// Represents a preset
+///
public class Preset
{
- ///
- /// ID of preset
- ///
+ ///
+ /// ID of preset
+ ///
public int Id { get; set; }
- ///
- /// User ID
- ///
+ ///
+ /// User ID
+ ///
public int UserId { get; set; }
- ///
- /// Room Type ID
- ///
+ ///
+ /// Room Type ID
+ ///
public int RoomTypeId { get; set; }
- ///
- /// Preset Name
- ///
+ ///
+ /// Preset Name
+ ///
public string PresetName { get; set; }
- ///
- /// Preset Number
- ///
+ ///
+ /// Preset Number
+ ///
public int PresetNumber { get; set; }
- ///
- /// Preset Data
- ///
+ ///
+ /// Preset Data
+ ///
public string Data { get; set; }
- ///
- /// Constructor
- ///
+ ///
+ /// Constructor
+ ///
public Preset()
{
PresetName = "";
@@ -53,35 +53,34 @@ public Preset()
///
public class PresetReceivedEventArgs : EventArgs
{
- ///
- /// True when the preset is found
- ///
- public bool LookupSuccess { get; private set; }
-
- ///
- /// S+ helper
- ///
- public ushort ULookupSuccess { get { return (ushort)(LookupSuccess ? 1 : 0); } }
+ ///
+ /// True when the preset is found
+ ///
+ public bool LookupSuccess { get; private set; }
+
+ ///
+ /// S+ helper
+ ///
+ public ushort ULookupSuccess { get { return (ushort)(LookupSuccess ? 1 : 0); } }
- ///
- /// The preset
- ///
- public Preset Preset { get; private set; }
+ ///
+ /// The preset
+ ///
+ public Preset Preset { get; private set; }
///
/// For Simpl+
///
public PresetReceivedEventArgs() { }
- ///
- /// Constructor
- ///
- ///
- ///
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
public PresetReceivedEventArgs(Preset preset, bool success)
{
- LookupSuccess = success;
+ LookupSuccess = success;
Preset = preset;
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/WebApi/Presets/User.cs b/src/PepperDash.Core/WebApi/Presets/User.cs
index c82824f60..ccab189e1 100644
--- a/src/PepperDash.Core/WebApi/Presets/User.cs
+++ b/src/PepperDash.Core/WebApi/Presets/User.cs
@@ -4,31 +4,31 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Core.WebApi.Presets
-{
+namespace PepperDash.Core.WebApi.Presets;
+
///
///
///
public class User
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int Id { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string ExternalId { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string FirstName { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public string LastName { get; set; }
}
@@ -38,19 +38,19 @@ public class User
///
public class UserReceivedEventArgs : EventArgs
{
- ///
- /// True when user is found
- ///
- public bool LookupSuccess { get; private set; }
+ ///
+ /// True when user is found
+ ///
+ public bool LookupSuccess { get; private set; }
- ///
- /// For stupid S+
- ///
- public ushort ULookupSuccess { get { return (ushort)(LookupSuccess ? 1 : 0); } }
+ ///
+ /// For stupid S+
+ ///
+ public ushort ULookupSuccess { get { return (ushort)(LookupSuccess ? 1 : 0); } }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public User User { get; private set; }
///
@@ -58,14 +58,14 @@ public class UserReceivedEventArgs : EventArgs
///
public UserReceivedEventArgs() { }
- ///
- /// Constructor
- ///
- ///
- ///
+ ///
+ /// Constructor
+ ///
+ ///
+ ///
public UserReceivedEventArgs(User user, bool success)
{
- LookupSuccess = success;
+ LookupSuccess = success;
User = user;
}
}
@@ -75,19 +75,18 @@ public UserReceivedEventArgs(User user, bool success)
///
public class UserAndRoomMessage
{
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int UserId { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int RoomTypeId { get; set; }
- ///
- ///
- ///
+ ///
+ ///
+ ///
public int PresetNumber { get; set; }
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Core/WebApi/Presets/WebApiPasscodeClient.cs b/src/PepperDash.Core/WebApi/Presets/WebApiPasscodeClient.cs
index 0a9317bf7..7525a27f4 100644
--- a/src/PepperDash.Core/WebApi/Presets/WebApiPasscodeClient.cs
+++ b/src/PepperDash.Core/WebApi/Presets/WebApiPasscodeClient.cs
@@ -8,26 +8,26 @@
using PepperDash.Core.JsonToSimpl;
-namespace PepperDash.Core.WebApi.Presets
-{
- ///
- /// Passcode client for the WebApi
- ///
+namespace PepperDash.Core.WebApi.Presets;
+
+///
+/// Passcode client for the WebApi
+///
public class WebApiPasscodeClient : IKeyed
{
- ///
- /// Notifies when user received
- ///
+ ///
+ /// Notifies when user received
+ ///
public event EventHandler UserReceived;
- ///
- /// Notifies when Preset received
- ///
+ ///
+ /// Notifies when Preset received
+ ///
public event EventHandler PresetReceived;
- ///
- /// Unique identifier for this instance
- ///
+ ///
+ /// Unique identifier for this instance
+ ///
public string Key { get; private set; }
//string JsonMasterKey;
@@ -54,13 +54,13 @@ public WebApiPasscodeClient()
{
}
- ///
- /// Initializes the instance
- ///
- ///
- ///
- ///
- ///
+ ///
+ /// Initializes the instance
+ ///
+ ///
+ ///
+ ///
+ ///
public void Initialize(string key, string jsonMasterKey, string urlBase, string defaultPresetJsonFilePath)
{
Key = key;
@@ -73,41 +73,41 @@ public void Initialize(string key, string jsonMasterKey, string urlBase, string
J2SMaster.Initialize(jsonMasterKey);
}
- ///
- /// Gets the user for a passcode
- ///
- ///
+ ///
+ /// Gets the user for a passcode
+ ///
+ ///
public void GetUserForPasscode(string passcode)
{
- // Bullshit duplicate code here... These two cases should be the same
- // except for https/http and the certificate ignores
- if (!UrlBase.StartsWith("https"))
- return;
- var req = new HttpsClientRequest();
- req.Url = new UrlParser(UrlBase + "/api/users/dopin");
- req.RequestType = Crestron.SimplSharp.Net.Https.RequestType.Post;
- req.Header.AddHeader(new HttpsHeader("Content-Type", "application/json"));
- req.Header.AddHeader(new HttpsHeader("Accept", "application/json"));
- var jo = new JObject();
- jo.Add("pin", passcode);
- req.ContentString = jo.ToString();
+ // Bullshit duplicate code here... These two cases should be the same
+ // except for https/http and the certificate ignores
+ if (!UrlBase.StartsWith("https"))
+ return;
+ var req = new HttpsClientRequest();
+ req.Url = new UrlParser(UrlBase + "/api/users/dopin");
+ req.RequestType = Crestron.SimplSharp.Net.Https.RequestType.Post;
+ req.Header.AddHeader(new HttpsHeader("Content-Type", "application/json"));
+ req.Header.AddHeader(new HttpsHeader("Accept", "application/json"));
+ var jo = new JObject();
+ jo.Add("pin", passcode);
+ req.ContentString = jo.ToString();
- var client = new HttpsClient();
- client.HostVerification = false;
- client.PeerVerification = false;
- var resp = client.Dispatch(req);
- var handler = UserReceived;
- if (resp.Code == 200)
- {
- //CrestronConsole.PrintLine("Received: {0}", resp.ContentString);
- var user = JsonConvert.DeserializeObject(resp.ContentString);
- CurrentUser = user;
- if (handler != null)
- UserReceived(this, new UserReceivedEventArgs(user, true));
- }
- else
- if (handler != null)
- UserReceived(this, new UserReceivedEventArgs(null, false));
+ var client = new HttpsClient();
+ client.HostVerification = false;
+ client.PeerVerification = false;
+ var resp = client.Dispatch(req);
+ var handler = UserReceived;
+ if (resp.Code == 200)
+ {
+ //CrestronConsole.PrintLine("Received: {0}", resp.ContentString);
+ var user = JsonConvert.DeserializeObject(resp.ContentString);
+ CurrentUser = user;
+ if (handler != null)
+ UserReceived(this, new UserReceivedEventArgs(user, true));
+ }
+ else
+ if (handler != null)
+ UserReceived(this, new UserReceivedEventArgs(null, false));
}
///
@@ -130,57 +130,57 @@ public void GetPresetForThisUser(int roomTypeId, int presetNumber)
PresetNumber = presetNumber
};
- var handler = PresetReceived;
+ var handler = PresetReceived;
try
{
- if (!UrlBase.StartsWith("https"))
- return;
- var req = new HttpsClientRequest();
- req.Url = new UrlParser(UrlBase + "/api/presets/userandroom");
- req.RequestType = Crestron.SimplSharp.Net.Https.RequestType.Post;
- req.Header.AddHeader(new HttpsHeader("Content-Type", "application/json"));
- req.Header.AddHeader(new HttpsHeader("Accept", "application/json"));
- req.ContentString = JsonConvert.SerializeObject(msg);
-
- var client = new HttpsClient();
- client.HostVerification = false;
- client.PeerVerification = false;
-
- // ask for the preset
- var resp = client.Dispatch(req);
- if (resp.Code == 200) // got it
- {
- //Debug.Console(1, this, "Received: {0}", resp.ContentString);
- var preset = JsonConvert.DeserializeObject(resp.ContentString);
- CurrentPreset = preset;
-
- //if there's no preset data, load the template
- if (preset.Data == null || preset.Data.Trim() == string.Empty || JObject.Parse(preset.Data).Count == 0)
- {
- //Debug.Console(1, this, "Loaded preset has no data. Loading default template.");
- LoadDefaultPresetData();
- return;
- }
-
- J2SMaster.LoadWithJson(preset.Data);
- if (handler != null)
- PresetReceived(this, new PresetReceivedEventArgs(preset, true));
- }
- else // no existing preset
+ if (!UrlBase.StartsWith("https"))
+ return;
+ var req = new HttpsClientRequest();
+ req.Url = new UrlParser(UrlBase + "/api/presets/userandroom");
+ req.RequestType = Crestron.SimplSharp.Net.Https.RequestType.Post;
+ req.Header.AddHeader(new HttpsHeader("Content-Type", "application/json"));
+ req.Header.AddHeader(new HttpsHeader("Accept", "application/json"));
+ req.ContentString = JsonConvert.SerializeObject(msg);
+
+ var client = new HttpsClient();
+ client.HostVerification = false;
+ client.PeerVerification = false;
+
+ // ask for the preset
+ var resp = client.Dispatch(req);
+ if (resp.Code == 200) // got it
+ {
+ //Debug.Console(1, this, "Received: {0}", resp.ContentString);
+ var preset = JsonConvert.DeserializeObject(resp.ContentString);
+ CurrentPreset = preset;
+
+ //if there's no preset data, load the template
+ if (preset.Data == null || preset.Data.Trim() == string.Empty || JObject.Parse(preset.Data).Count == 0)
{
- CurrentPreset = new Preset();
+ //Debug.Console(1, this, "Loaded preset has no data. Loading default template.");
LoadDefaultPresetData();
- if (handler != null)
- PresetReceived(this, new PresetReceivedEventArgs(null, false));
+ return;
}
+
+ J2SMaster.LoadWithJson(preset.Data);
+ if (handler != null)
+ PresetReceived(this, new PresetReceivedEventArgs(preset, true));
+ }
+ else // no existing preset
+ {
+ CurrentPreset = new Preset();
+ LoadDefaultPresetData();
+ if (handler != null)
+ PresetReceived(this, new PresetReceivedEventArgs(null, false));
+ }
}
catch (HttpException e)
{
var resp = e.Response;
Debug.Console(1, this, "No preset received (code {0}). Loading default template", resp.Code);
LoadDefaultPresetData();
- if (handler != null)
- PresetReceived(this, new PresetReceivedEventArgs(null, false));
+ if (handler != null)
+ PresetReceived(this, new PresetReceivedEventArgs(null, false));
}
}
@@ -236,8 +236,8 @@ void SaveCallback(string json)
{
CurrentPreset.Data = json;
- if (!UrlBase.StartsWith("https"))
- return;
+ if (!UrlBase.StartsWith("https"))
+ return;
var req = new HttpsClientRequest();
req.RequestType = Crestron.SimplSharp.Net.Https.RequestType.Post;
req.Url = new UrlParser(string.Format("{0}/api/presets/addorchange", UrlBase));
@@ -246,8 +246,8 @@ void SaveCallback(string json)
req.ContentString = JsonConvert.SerializeObject(CurrentPreset);
var client = new HttpsClient();
- client.HostVerification = false;
- client.PeerVerification = false;
+ client.HostVerification = false;
+ client.PeerVerification = false;
try
{
var resp = client.Dispatch(req);
@@ -270,4 +270,3 @@ void SaveCallback(string json)
}
}
}
-}
diff --git a/src/PepperDash.Core/XSigUtility/Serialization/IXSigSerialization.cs b/src/PepperDash.Core/XSigUtility/Serialization/IXSigSerialization.cs
index 8303731e2..b1dcae6b7 100644
--- a/src/PepperDash.Core/XSigUtility/Serialization/IXSigSerialization.cs
+++ b/src/PepperDash.Core/XSigUtility/Serialization/IXSigSerialization.cs
@@ -1,25 +1,24 @@
using System.Collections.Generic;
using PepperDash.Core.Intersystem.Tokens;
-namespace PepperDash.Core.Intersystem.Serialization
+namespace PepperDash.Core.Intersystem.Serialization;
+
+///
+/// Interface to determine XSig serialization for an object.
+///
+public interface IXSigSerialization
{
///
- /// Interface to determine XSig serialization for an object.
+ /// Serialize the sig data
///
- public interface IXSigSerialization
- {
- ///
- /// Serialize the sig data
- ///
- ///
- IEnumerable Serialize();
+ ///
+ IEnumerable Serialize();
- ///
- /// Deserialize the sig data
- ///
- ///
- ///
- ///
- T Deserialize(IEnumerable tokens) where T : class, IXSigSerialization;
- }
+ ///
+ /// Deserialize the sig data
+ ///
+ ///
+ ///
+ ///
+ T Deserialize(IEnumerable tokens) where T : class, IXSigSerialization;
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/XSigUtility/Serialization/XSigSerializationException.cs b/src/PepperDash.Core/XSigUtility/Serialization/XSigSerializationException.cs
index 8f3fc047d..4db0e9703 100644
--- a/src/PepperDash.Core/XSigUtility/Serialization/XSigSerializationException.cs
+++ b/src/PepperDash.Core/XSigUtility/Serialization/XSigSerializationException.cs
@@ -1,28 +1,27 @@
using System;
-namespace PepperDash.Core.Intersystem.Serialization
+namespace PepperDash.Core.Intersystem.Serialization;
+
+///
+/// Class to handle this specific exception type
+///
+public class XSigSerializationException : Exception
{
///
- /// Class to handle this specific exception type
+ /// default constructor
///
- public class XSigSerializationException : Exception
- {
- ///
- /// default constructor
- ///
- public XSigSerializationException() { }
+ public XSigSerializationException() { }
- ///
- /// constructor with message
- ///
- ///
- public XSigSerializationException(string message) : base(message) { }
+ ///
+ /// constructor with message
+ ///
+ ///
+ public XSigSerializationException(string message) : base(message) { }
- ///
- /// constructor with message and innner exception
- ///
- ///
- ///
- public XSigSerializationException(string message, Exception inner) : base(message, inner) { }
- }
+ ///
+ /// constructor with message and innner exception
+ ///
+ ///
+ ///
+ public XSigSerializationException(string message, Exception inner) : base(message, inner) { }
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/XSigUtility/Tokens/XSigAnalogToken.cs b/src/PepperDash.Core/XSigUtility/Tokens/XSigAnalogToken.cs
index 58473362a..b5cb2e68f 100644
--- a/src/PepperDash.Core/XSigUtility/Tokens/XSigAnalogToken.cs
+++ b/src/PepperDash.Core/XSigUtility/Tokens/XSigAnalogToken.cs
@@ -1,88 +1,87 @@
using System;
-namespace PepperDash.Core.Intersystem.Tokens
+namespace PepperDash.Core.Intersystem.Tokens;
+
+///
+/// Represents an XSigAnalogToken
+///
+public sealed class XSigAnalogToken : XSigToken, IFormattable
{
+ private readonly ushort _value;
+
///
- /// Represents an XSigAnalogToken
+ /// Constructor
///
- public sealed class XSigAnalogToken : XSigToken, IFormattable
+ ///
+ ///
+ public XSigAnalogToken(int index, ushort value)
+ : base(index)
{
- private readonly ushort _value;
+ // 10-bits available for analog encoded data
+ if (index >= 1024 || index < 0)
+ throw new ArgumentOutOfRangeException("index");
- ///
- /// Constructor
- ///
- ///
- ///
- public XSigAnalogToken(int index, ushort value)
- : base(index)
- {
- // 10-bits available for analog encoded data
- if (index >= 1024 || index < 0)
- throw new ArgumentOutOfRangeException("index");
-
- _value = value;
- }
+ _value = value;
+ }
- ///
- ///
- ///
- public ushort Value
- {
- get { return _value; }
- }
+ ///
+ ///
+ ///
+ public ushort Value
+ {
+ get { return _value; }
+ }
- ///
- ///
- ///
- public override XSigTokenType TokenType
- {
- get { return XSigTokenType.Analog; }
- }
+ ///
+ ///
+ ///
+ public override XSigTokenType TokenType
+ {
+ get { return XSigTokenType.Analog; }
+ }
- ///
- ///
- ///
- ///
- public override byte[] GetBytes()
- {
- return new[] {
- (byte)(0xC0 | ((Value & 0xC000) >> 10) | (Index - 1 >> 7)),
- (byte)((Index - 1) & 0x7F),
- (byte)((Value & 0x3F80) >> 7),
- (byte)(Value & 0x7F)
- };
- }
+ ///
+ ///
+ ///
+ ///
+ public override byte[] GetBytes()
+ {
+ return new[] {
+ (byte)(0xC0 | ((Value & 0xC000) >> 10) | (Index - 1 >> 7)),
+ (byte)((Index - 1) & 0x7F),
+ (byte)((Value & 0x3F80) >> 7),
+ (byte)(Value & 0x7F)
+ };
+ }
- ///
- ///
- ///
- ///
- ///
- public override XSigToken GetTokenWithOffset(int offset)
- {
- if (offset == 0) return this;
- return new XSigAnalogToken(Index + offset, Value);
- }
+ ///
+ ///
+ ///
+ ///
+ ///
+ public override XSigToken GetTokenWithOffset(int offset)
+ {
+ if (offset == 0) return this;
+ return new XSigAnalogToken(Index + offset, Value);
+ }
- ///
- ///
- ///
- ///
- public override string ToString()
- {
- return Index + " = 0x" + Value.ToString("X4");
- }
+ ///
+ ///
+ ///
+ ///
+ public override string ToString()
+ {
+ return Index + " = 0x" + Value.ToString("X4");
+ }
- ///
- ///
- ///
- ///
- ///
- ///
- public string ToString(string format, IFormatProvider formatProvider)
- {
- return Value.ToString(format, formatProvider);
- }
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public string ToString(string format, IFormatProvider formatProvider)
+ {
+ return Value.ToString(format, formatProvider);
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/XSigUtility/Tokens/XSigDigitalToken.cs b/src/PepperDash.Core/XSigUtility/Tokens/XSigDigitalToken.cs
index 70ccc852e..a82d0eb2d 100644
--- a/src/PepperDash.Core/XSigUtility/Tokens/XSigDigitalToken.cs
+++ b/src/PepperDash.Core/XSigUtility/Tokens/XSigDigitalToken.cs
@@ -1,85 +1,84 @@
using System;
-namespace PepperDash.Core.Intersystem.Tokens
+namespace PepperDash.Core.Intersystem.Tokens;
+
+///
+/// Represents an XSigDigitalToken
+///
+public sealed class XSigDigitalToken : XSigToken
{
+ private readonly bool _value;
+
///
- /// Represents an XSigDigitalToken
+ ///
///
- public sealed class XSigDigitalToken : XSigToken
+ ///
+ ///
+ public XSigDigitalToken(int index, bool value)
+ : base(index)
{
- private readonly bool _value;
+ // 12-bits available for digital encoded data
+ if (index >= 4096 || index < 0)
+ throw new ArgumentOutOfRangeException("index");
- ///
- ///
- ///
- ///
- ///
- public XSigDigitalToken(int index, bool value)
- : base(index)
- {
- // 12-bits available for digital encoded data
- if (index >= 4096 || index < 0)
- throw new ArgumentOutOfRangeException("index");
-
- _value = value;
- }
+ _value = value;
+ }
- ///
- ///
- ///
- public bool Value
- {
- get { return _value; }
- }
+ ///
+ ///
+ ///
+ public bool Value
+ {
+ get { return _value; }
+ }
- ///
- ///
- ///
- public override XSigTokenType TokenType
- {
- get { return XSigTokenType.Digital; }
- }
+ ///
+ ///
+ ///
+ public override XSigTokenType TokenType
+ {
+ get { return XSigTokenType.Digital; }
+ }
- ///
- ///
- ///
- ///
- public override byte[] GetBytes()
- {
- return new[] {
- (byte)(0x80 | (Value ? 0 : 0x20) | ((Index - 1) >> 7)),
- (byte)((Index - 1) & 0x7F)
- };
- }
+ ///
+ ///
+ ///
+ ///
+ public override byte[] GetBytes()
+ {
+ return new[] {
+ (byte)(0x80 | (Value ? 0 : 0x20) | ((Index - 1) >> 7)),
+ (byte)((Index - 1) & 0x7F)
+ };
+ }
- ///
- ///
- ///
- ///
- ///
- public override XSigToken GetTokenWithOffset(int offset)
- {
- if (offset == 0) return this;
- return new XSigDigitalToken(Index + offset, Value);
- }
+ ///
+ ///
+ ///
+ ///
+ ///
+ public override XSigToken GetTokenWithOffset(int offset)
+ {
+ if (offset == 0) return this;
+ return new XSigDigitalToken(Index + offset, Value);
+ }
- ///
- ///
- ///
- ///
- public override string ToString()
- {
- return Index + " = " + (Value ? "High" : "Low");
- }
+ ///
+ ///
+ ///
+ ///
+ public override string ToString()
+ {
+ return Index + " = " + (Value ? "High" : "Low");
+ }
- ///
- ///
- ///
- ///
- ///
- public string ToString(IFormatProvider formatProvider)
- {
- return Value.ToString(formatProvider);
- }
+ ///
+ ///
+ ///
+ ///
+ ///
+ public string ToString(IFormatProvider formatProvider)
+ {
+ return Value.ToString(formatProvider);
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/XSigUtility/Tokens/XSigSerialToken.cs b/src/PepperDash.Core/XSigUtility/Tokens/XSigSerialToken.cs
index 25ee3fd00..3b6a3f5f3 100644
--- a/src/PepperDash.Core/XSigUtility/Tokens/XSigSerialToken.cs
+++ b/src/PepperDash.Core/XSigUtility/Tokens/XSigSerialToken.cs
@@ -1,81 +1,80 @@
using System;
using System.Text;
-namespace PepperDash.Core.Intersystem.Tokens
+namespace PepperDash.Core.Intersystem.Tokens;
+
+///
+/// Represents an XSigSerialToken
+///
+public sealed class XSigSerialToken : XSigToken
{
+ private readonly string _value;
+
///
- /// Represents an XSigSerialToken
+ /// Constructor
///
- public sealed class XSigSerialToken : XSigToken
+ ///
+ ///
+ public XSigSerialToken(int index, string value)
+ : base(index)
{
- private readonly string _value;
-
- ///
- /// Constructor
- ///
- ///
- ///
- public XSigSerialToken(int index, string value)
- : base(index)
- {
- // 10-bits available for serial encoded data
- if (index >= 1024 || index < 0)
- throw new ArgumentOutOfRangeException("index");
+ // 10-bits available for serial encoded data
+ if (index >= 1024 || index < 0)
+ throw new ArgumentOutOfRangeException("index");
- _value = value;
- }
+ _value = value;
+ }
- ///
- ///
- ///
- public string Value
- {
- get { return _value; }
- }
+ ///
+ ///
+ ///
+ public string Value
+ {
+ get { return _value; }
+ }
- ///
- ///
- ///
- public override XSigTokenType TokenType
- {
- get { return XSigTokenType.Serial; }
- }
+ ///
+ ///
+ ///
+ public override XSigTokenType TokenType
+ {
+ get { return XSigTokenType.Serial; }
+ }
- ///
- ///
- ///
- ///
- public override byte[] GetBytes()
- {
- var serialBytes = String.IsNullOrEmpty(Value) ? new byte[0] : Encoding.GetEncoding(28591).GetBytes(Value);
-
- var xsig = new byte[serialBytes.Length + 3];
- xsig[0] = (byte)(0xC8 | (Index - 1 >> 7));
- xsig[1] = (byte)((Index - 1) & 0x7F);
- xsig[xsig.Length - 1] = 0xFF;
+ ///
+ ///
+ ///
+ ///
+ public override byte[] GetBytes()
+ {
+ var serialBytes = String.IsNullOrEmpty(Value) ? new byte[0] : Encoding.GetEncoding(28591).GetBytes(Value);
+
+ var xsig = new byte[serialBytes.Length + 3];
+ xsig[0] = (byte)(0xC8 | (Index - 1 >> 7));
+ xsig[1] = (byte)((Index - 1) & 0x7F);
+ xsig[xsig.Length - 1] = 0xFF;
- Buffer.BlockCopy(serialBytes, 0, xsig, 2, serialBytes.Length);
- return xsig;
- }
+ Buffer.BlockCopy(serialBytes, 0, xsig, 2, serialBytes.Length);
+ return xsig;
+ }
- ///
- ///
- ///
- ///
- ///
- public override XSigToken GetTokenWithOffset(int offset)
- {
- if (offset == 0) return this;
- return new XSigSerialToken(Index + offset, Value);
- }
+ ///
+ ///
+ ///
+ ///
+ ///
+ public override XSigToken GetTokenWithOffset(int offset)
+ {
+ if (offset == 0) return this;
+ return new XSigSerialToken(Index + offset, Value);
+ }
- ///
- ///
- ///
- ///
- public override string ToString()
- {
- return Index + " = \"" + Value + "\"";
- }
+ ///
+ ///
+ ///
+ ///
+ public override string ToString()
+ {
+ return Index + " = \"" + Value + "\"";
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/XSigUtility/Tokens/XSigToken.cs b/src/PepperDash.Core/XSigUtility/Tokens/XSigToken.cs
index 4c00a2ed8..cd706bd4d 100644
--- a/src/PepperDash.Core/XSigUtility/Tokens/XSigToken.cs
+++ b/src/PepperDash.Core/XSigUtility/Tokens/XSigToken.cs
@@ -1,45 +1,44 @@
-namespace PepperDash.Core.Intersystem.Tokens
+namespace PepperDash.Core.Intersystem.Tokens;
+
+///
+/// Represents the base class for all XSig datatypes.
+///
+public abstract class XSigToken
{
+ private readonly int _index;
+
///
- /// Represents the base class for all XSig datatypes.
+ /// Constructs an XSigToken with the specified index.
///
- public abstract class XSigToken
+ /// Index for the data.
+ protected XSigToken(int index)
{
- private readonly int _index;
-
- ///
- /// Constructs an XSigToken with the specified index.
- ///
- /// Index for the data.
- protected XSigToken(int index)
- {
- _index = index;
- }
+ _index = index;
+ }
- ///
- /// XSig 1-based index.
- ///
- public int Index
- {
- get { return _index; }
- }
+ ///
+ /// XSig 1-based index.
+ ///
+ public int Index
+ {
+ get { return _index; }
+ }
- ///
- /// XSigToken type.
- ///
- public abstract XSigTokenType TokenType { get; }
+ ///
+ /// XSigToken type.
+ ///
+ public abstract XSigTokenType TokenType { get; }
- ///
- /// Generates the XSig bytes for the corresponding token.
- ///
- /// XSig byte array.
- public abstract byte[] GetBytes();
+ ///
+ /// Generates the XSig bytes for the corresponding token.
+ ///
+ /// XSig byte array.
+ public abstract byte[] GetBytes();
- ///
- /// Returns a new token if necessary with an updated index based on the specified offset.
- ///
- /// Offset to adjust the index with.
- /// XSigToken
- public abstract XSigToken GetTokenWithOffset(int offset);
- }
+ ///
+ /// Returns a new token if necessary with an updated index based on the specified offset.
+ ///
+ /// Offset to adjust the index with.
+ /// XSigToken
+ public abstract XSigToken GetTokenWithOffset(int offset);
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/XSigUtility/Tokens/XSigTokenType.cs b/src/PepperDash.Core/XSigUtility/Tokens/XSigTokenType.cs
index 26d6c1238..60641b4f1 100644
--- a/src/PepperDash.Core/XSigUtility/Tokens/XSigTokenType.cs
+++ b/src/PepperDash.Core/XSigUtility/Tokens/XSigTokenType.cs
@@ -1,23 +1,22 @@
-namespace PepperDash.Core.Intersystem.Tokens
+namespace PepperDash.Core.Intersystem.Tokens;
+
+///
+/// XSig token types.
+///
+public enum XSigTokenType
{
///
- /// XSig token types.
+ /// Digital signal datatype.
///
- public enum XSigTokenType
- {
- ///
- /// Digital signal datatype.
- ///
- Digital,
+ Digital,
- ///
- /// Analog signal datatype.
- ///
- Analog,
+ ///
+ /// Analog signal datatype.
+ ///
+ Analog,
- ///
- /// Serial signal datatype.
- ///
- Serial
- }
+ ///
+ /// Serial signal datatype.
+ ///
+ Serial
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/XSigUtility/XSigHelpers.cs b/src/PepperDash.Core/XSigUtility/XSigHelpers.cs
index 4ea6f6349..4f970be29 100644
--- a/src/PepperDash.Core/XSigUtility/XSigHelpers.cs
+++ b/src/PepperDash.Core/XSigUtility/XSigHelpers.cs
@@ -18,222 +18,221 @@ 0aaaaaaa 0aaaaaaa
11111111 <- denotes end of data
*/
-namespace PepperDash.Core.Intersystem
+namespace PepperDash.Core.Intersystem;
+
+///
+/// Helper methods for creating XSig byte sequences compatible with the Intersystem Communications (ISC) symbol.
+///
+///
+/// Indexing is not from the start of each signal type but rather from the beginning of the first defined signal
+/// the Intersystem Communications (ISC) symbol.
+///
+public static class XSigHelpers
{
///
- /// Helper methods for creating XSig byte sequences compatible with the Intersystem Communications (ISC) symbol.
+ /// Forces all outputs to 0.
///
- ///
- /// Indexing is not from the start of each signal type but rather from the beginning of the first defined signal
- /// the Intersystem Communications (ISC) symbol.
- ///
- public static class XSigHelpers
+ /// Bytes in XSig format for clear outputs trigger.
+ public static byte[] ClearOutputs()
{
- ///
- /// Forces all outputs to 0.
- ///
- /// Bytes in XSig format for clear outputs trigger.
- public static byte[] ClearOutputs()
- {
- return new byte[] { 0xFC };
- }
+ return new byte[] { 0xFC };
+ }
- ///
- /// Evaluate all inputs and re-transmit any digital, analog, and permanent serail signals not set to 0.
- ///
- /// Bytes in XSig format for send status trigger.
- public static byte[] SendStatus()
- {
- return new byte[] { 0xFD };
- }
+ ///
+ /// Evaluate all inputs and re-transmit any digital, analog, and permanent serail signals not set to 0.
+ ///
+ /// Bytes in XSig format for send status trigger.
+ public static byte[] SendStatus()
+ {
+ return new byte[] { 0xFD };
+ }
- ///
- /// Get bytes for an IXSigStateResolver object.
- ///
- /// XSig state resolver.
- /// Bytes in XSig format for each token within the state representation.
- public static byte[] GetBytes(IXSigSerialization xSigSerialization)
- {
- return GetBytes(xSigSerialization, 0);
- }
+ ///
+ /// Get bytes for an IXSigStateResolver object.
+ ///
+ /// XSig state resolver.
+ /// Bytes in XSig format for each token within the state representation.
+ public static byte[] GetBytes(IXSigSerialization xSigSerialization)
+ {
+ return GetBytes(xSigSerialization, 0);
+ }
- ///
- /// Get bytes for an IXSigStateResolver object, with a specified offset.
- ///
- /// XSig state resolver.
- /// Offset to which the data will be aligned.
- /// Bytes in XSig format for each token within the state representation.
- public static byte[] GetBytes(IXSigSerialization xSigSerialization, int offset)
+ ///
+ /// Get bytes for an IXSigStateResolver object, with a specified offset.
+ ///
+ /// XSig state resolver.
+ /// Offset to which the data will be aligned.
+ /// Bytes in XSig format for each token within the state representation.
+ public static byte[] GetBytes(IXSigSerialization xSigSerialization, int offset)
+ {
+ var tokens = xSigSerialization.Serialize();
+ if (tokens == null) return new byte[0];
+ using (var memoryStream = new MemoryStream())
{
- var tokens = xSigSerialization.Serialize();
- if (tokens == null) return new byte[0];
- using (var memoryStream = new MemoryStream())
- {
- using (var tokenWriter = new XSigTokenStreamWriter(memoryStream))
- tokenWriter.WriteXSigData(xSigSerialization, offset);
-
- return memoryStream.ToArray();
- }
- }
+ using (var tokenWriter = new XSigTokenStreamWriter(memoryStream))
+ tokenWriter.WriteXSigData(xSigSerialization, offset);
- ///
- /// Get bytes for a single digital signal.
- ///
- /// 1-based digital index
- /// Digital data to be encoded
- /// Bytes in XSig format for digtial information.
- public static byte[] GetBytes(int index, bool value)
- {
- return GetBytes(index, 0, value);
+ return memoryStream.ToArray();
}
+ }
- ///
- /// Get bytes for a single digital signal.
- ///
- /// 1-based digital index
- /// Index offset.
- /// Digital data to be encoded
- /// Bytes in XSig format for digtial information.
- public static byte[] GetBytes(int index, int offset, bool value)
- {
- return new XSigDigitalToken(index + offset, value).GetBytes();
- }
+ ///
+ /// Get bytes for a single digital signal.
+ ///
+ /// 1-based digital index
+ /// Digital data to be encoded
+ /// Bytes in XSig format for digtial information.
+ public static byte[] GetBytes(int index, bool value)
+ {
+ return GetBytes(index, 0, value);
+ }
- ///
- /// Get byte sequence for multiple digital signals.
- ///
- /// Starting index of the sequence.
- /// Digital signal value array.
- /// Byte sequence in XSig format for digital signal information.
- public static byte[] GetBytes(int startIndex, bool[] values)
- {
- return GetBytes(startIndex, 0, values);
- }
+ ///
+ /// Get bytes for a single digital signal.
+ ///
+ /// 1-based digital index
+ /// Index offset.
+ /// Digital data to be encoded
+ /// Bytes in XSig format for digtial information.
+ public static byte[] GetBytes(int index, int offset, bool value)
+ {
+ return new XSigDigitalToken(index + offset, value).GetBytes();
+ }
- ///
- /// Get byte sequence for multiple digital signals.
- ///
- /// Starting index of the sequence.
- /// Index offset.
- /// Digital signal value array.
- /// Byte sequence in XSig format for digital signal information.
- public static byte[] GetBytes(int startIndex, int offset, bool[] values)
- {
- // Digital XSig data is 2 bytes per value
- const int fixedLength = 2;
- var bytes = new byte[values.Length * fixedLength];
- for (var i = 0; i < values.Length; i++)
- Buffer.BlockCopy(GetBytes(startIndex++, offset, values[i]), 0, bytes, i * fixedLength, fixedLength);
+ ///
+ /// Get byte sequence for multiple digital signals.
+ ///
+ /// Starting index of the sequence.
+ /// Digital signal value array.
+ /// Byte sequence in XSig format for digital signal information.
+ public static byte[] GetBytes(int startIndex, bool[] values)
+ {
+ return GetBytes(startIndex, 0, values);
+ }
- return bytes;
- }
+ ///
+ /// Get byte sequence for multiple digital signals.
+ ///
+ /// Starting index of the sequence.
+ /// Index offset.
+ /// Digital signal value array.
+ /// Byte sequence in XSig format for digital signal information.
+ public static byte[] GetBytes(int startIndex, int offset, bool[] values)
+ {
+ // Digital XSig data is 2 bytes per value
+ const int fixedLength = 2;
+ var bytes = new byte[values.Length * fixedLength];
+ for (var i = 0; i < values.Length; i++)
+ Buffer.BlockCopy(GetBytes(startIndex++, offset, values[i]), 0, bytes, i * fixedLength, fixedLength);
- ///
- /// Get bytes for a single analog signal.
- ///
- /// 1-based analog index
- /// Analog data to be encoded
- /// Bytes in XSig format for analog signal information.
- public static byte[] GetBytes(int index, ushort value)
- {
- return GetBytes(index, 0, value);
- }
+ return bytes;
+ }
- ///
- /// Get bytes for a single analog signal.
- ///
- /// 1-based analog index
- /// Index offset.
- /// Analog data to be encoded
- /// Bytes in XSig format for analog signal information.
- public static byte[] GetBytes(int index, int offset, ushort value)
- {
- return new XSigAnalogToken(index + offset, value).GetBytes();
- }
+ ///
+ /// Get bytes for a single analog signal.
+ ///
+ /// 1-based analog index
+ /// Analog data to be encoded
+ /// Bytes in XSig format for analog signal information.
+ public static byte[] GetBytes(int index, ushort value)
+ {
+ return GetBytes(index, 0, value);
+ }
- ///
- /// Get byte sequence for multiple analog signals.
- ///
- /// Starting index of the sequence.
- /// Analog signal value array.
- /// Byte sequence in XSig format for analog signal information.
- public static byte[] GetBytes(int startIndex, ushort[] values)
- {
- return GetBytes(startIndex, 0, values);
- }
+ ///
+ /// Get bytes for a single analog signal.
+ ///
+ /// 1-based analog index
+ /// Index offset.
+ /// Analog data to be encoded
+ /// Bytes in XSig format for analog signal information.
+ public static byte[] GetBytes(int index, int offset, ushort value)
+ {
+ return new XSigAnalogToken(index + offset, value).GetBytes();
+ }
- ///
- /// Get byte sequence for multiple analog signals.
- ///
- /// Starting index of the sequence.
- /// Index offset.
- /// Analog signal value array.
- /// Byte sequence in XSig format for analog signal information.
- public static byte[] GetBytes(int startIndex, int offset, ushort[] values)
- {
- // Analog XSig data is 4 bytes per value
- const int fixedLength = 4;
- var bytes = new byte[values.Length * fixedLength];
- for (var i = 0; i < values.Length; i++)
- Buffer.BlockCopy(GetBytes(startIndex++, offset, values[i]), 0, bytes, i * fixedLength, fixedLength);
+ ///
+ /// Get byte sequence for multiple analog signals.
+ ///
+ /// Starting index of the sequence.
+ /// Analog signal value array.
+ /// Byte sequence in XSig format for analog signal information.
+ public static byte[] GetBytes(int startIndex, ushort[] values)
+ {
+ return GetBytes(startIndex, 0, values);
+ }
- return bytes;
- }
+ ///
+ /// Get byte sequence for multiple analog signals.
+ ///
+ /// Starting index of the sequence.
+ /// Index offset.
+ /// Analog signal value array.
+ /// Byte sequence in XSig format for analog signal information.
+ public static byte[] GetBytes(int startIndex, int offset, ushort[] values)
+ {
+ // Analog XSig data is 4 bytes per value
+ const int fixedLength = 4;
+ var bytes = new byte[values.Length * fixedLength];
+ for (var i = 0; i < values.Length; i++)
+ Buffer.BlockCopy(GetBytes(startIndex++, offset, values[i]), 0, bytes, i * fixedLength, fixedLength);
- ///
- /// Get bytes for a single serial signal.
- ///
- /// 1-based serial index
- /// Serial data to be encoded
- /// Bytes in XSig format for serial signal information.
- public static byte[] GetBytes(int index, string value)
- {
- return GetBytes(index, 0, value);
- }
+ return bytes;
+ }
- ///
- /// Get bytes for a single serial signal.
- ///
- /// 1-based serial index
- /// Index offset.
- /// Serial data to be encoded
- /// Bytes in XSig format for serial signal information.
- public static byte[] GetBytes(int index, int offset, string value)
- {
- return new XSigSerialToken(index + offset, value).GetBytes();
- }
+ ///
+ /// Get bytes for a single serial signal.
+ ///
+ /// 1-based serial index
+ /// Serial data to be encoded
+ /// Bytes in XSig format for serial signal information.
+ public static byte[] GetBytes(int index, string value)
+ {
+ return GetBytes(index, 0, value);
+ }
- ///
- /// Get byte sequence for multiple serial signals.
- ///
- /// Starting index of the sequence.
- /// Serial signal value array.
- /// Byte sequence in XSig format for serial signal information.
- public static byte[] GetBytes(int startIndex, string[] values)
- {
- return GetBytes(startIndex, 0, values);
- }
+ ///
+ /// Get bytes for a single serial signal.
+ ///
+ /// 1-based serial index
+ /// Index offset.
+ /// Serial data to be encoded
+ /// Bytes in XSig format for serial signal information.
+ public static byte[] GetBytes(int index, int offset, string value)
+ {
+ return new XSigSerialToken(index + offset, value).GetBytes();
+ }
- ///
- /// Get byte sequence for multiple serial signals.
- ///
- /// Starting index of the sequence.
- /// Index offset.
- /// Serial signal value array.
- /// Byte sequence in XSig format for serial signal information.
- public static byte[] GetBytes(int startIndex, int offset, string[] values)
+ ///
+ /// Get byte sequence for multiple serial signals.
+ ///
+ /// Starting index of the sequence.
+ /// Serial signal value array.
+ /// Byte sequence in XSig format for serial signal information.
+ public static byte[] GetBytes(int startIndex, string[] values)
+ {
+ return GetBytes(startIndex, 0, values);
+ }
+
+ ///
+ /// Get byte sequence for multiple serial signals.
+ ///
+ /// Starting index of the sequence.
+ /// Index offset.
+ /// Serial signal value array.
+ /// Byte sequence in XSig format for serial signal information.
+ public static byte[] GetBytes(int startIndex, int offset, string[] values)
+ {
+ // Serial XSig data is not fixed-length like the other formats
+ var dstOffset = 0;
+ var bytes = new byte[values.Sum(v => v.Length + 3)];
+ for (var i = 0; i < values.Length; i++)
{
- // Serial XSig data is not fixed-length like the other formats
- var dstOffset = 0;
- var bytes = new byte[values.Sum(v => v.Length + 3)];
- for (var i = 0; i < values.Length; i++)
- {
- var data = GetBytes(startIndex++, offset, values[i]);
- Buffer.BlockCopy(data, 0, bytes, dstOffset, data.Length);
- dstOffset += data.Length;
- }
-
- return bytes;
+ var data = GetBytes(startIndex++, offset, values[i]);
+ Buffer.BlockCopy(data, 0, bytes, dstOffset, data.Length);
+ dstOffset += data.Length;
}
+
+ return bytes;
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/XSigUtility/XSigTokenStreamReader.cs b/src/PepperDash.Core/XSigUtility/XSigTokenStreamReader.cs
index 9d70d02e4..3c2229601 100644
--- a/src/PepperDash.Core/XSigUtility/XSigTokenStreamReader.cs
+++ b/src/PepperDash.Core/XSigUtility/XSigTokenStreamReader.cs
@@ -4,144 +4,143 @@
using PepperDash.Core.Intersystem.Serialization;
using PepperDash.Core.Intersystem.Tokens;
-namespace PepperDash.Core.Intersystem
+namespace PepperDash.Core.Intersystem;
+
+///
+/// XSigToken stream reader.
+///
+public sealed class XSigTokenStreamReader : IDisposable
{
+ private readonly Stream _stream;
+ private readonly bool _leaveOpen;
+
+ ///
///
- /// XSigToken stream reader.
+ /// XSigToken stream reader constructor.
///
- public sealed class XSigTokenStreamReader : IDisposable
- {
- private readonly Stream _stream;
- private readonly bool _leaveOpen;
-
- ///
- ///
- /// XSigToken stream reader constructor.
- ///
- /// Input stream to read from.
- /// Stream is null.
- /// Stream cannot be read from.
- public XSigTokenStreamReader(Stream stream)
- : this(stream, false) { }
-
- ///
- /// XSigToken stream reader constructor.
- ///
- /// Input stream to read from.
- /// Determines whether to leave the stream open or not.
- /// Stream is null.
- /// Stream cannot be read from.
- public XSigTokenStreamReader(Stream stream, bool leaveOpen)
- {
- if (stream == null)
- throw new ArgumentNullException("stream");
- if (!stream.CanRead)
- throw new ArgumentException("The specified stream cannot be read from.");
+ /// Input stream to read from.
+ /// Stream is null.
+ /// Stream cannot be read from.
+ public XSigTokenStreamReader(Stream stream)
+ : this(stream, false) { }
- _stream = stream;
- _leaveOpen = leaveOpen;
- }
+ ///
+ /// XSigToken stream reader constructor.
+ ///
+ /// Input stream to read from.
+ /// Determines whether to leave the stream open or not.
+ /// Stream is null.
+ /// Stream cannot be read from.
+ public XSigTokenStreamReader(Stream stream, bool leaveOpen)
+ {
+ if (stream == null)
+ throw new ArgumentNullException("stream");
+ if (!stream.CanRead)
+ throw new ArgumentException("The specified stream cannot be read from.");
- ///
- /// Reads a 16-bit unsigned integer from the specified stream using Big Endian byte order.
- ///
- /// Input stream
- /// Result
- /// True if successful, otherwise false.
- public static bool TryReadUInt16BE(Stream stream, out ushort value)
- {
- value = 0;
- if (stream.Length < 2)
- return false;
-
- var buffer = new byte[2];
- stream.Read(buffer, 0, 2);
- value = (ushort)((buffer[0] << 8) | buffer[1]);
- return true;
- }
+ _stream = stream;
+ _leaveOpen = leaveOpen;
+ }
- ///
- /// Read XSig token from the stream.
- ///
- /// XSigToken
- /// Offset is less than 0.
- public XSigToken ReadXSigToken()
- {
- ushort prefix;
- if (!TryReadUInt16BE(_stream, out prefix))
- return null;
+ ///
+ /// Reads a 16-bit unsigned integer from the specified stream using Big Endian byte order.
+ ///
+ /// Input stream
+ /// Result
+ /// True if successful, otherwise false.
+ public static bool TryReadUInt16BE(Stream stream, out ushort value)
+ {
+ value = 0;
+ if (stream.Length < 2)
+ return false;
+
+ var buffer = new byte[2];
+ stream.Read(buffer, 0, 2);
+ value = (ushort)((buffer[0] << 8) | buffer[1]);
+ return true;
+ }
- if ((prefix & 0xF880) == 0xC800) // Serial data
- {
- var index = ((prefix & 0x0700) >> 1) | (prefix & 0x7F);
- var n = 0;
- const int maxSerialDataLength = 252;
- var chars = new char[maxSerialDataLength];
- int ch;
- while ((ch = _stream.ReadByte()) != 0xFF)
- {
- if (ch == -1) // Reached end of stream without end of data marker
- return null;
-
- chars[n++] = (char)ch;
- }
-
- return new XSigSerialToken((ushort)(index + 1), new string(chars, 0, n));
- }
+ ///
+ /// Read XSig token from the stream.
+ ///
+ /// XSigToken
+ /// Offset is less than 0.
+ public XSigToken ReadXSigToken()
+ {
+ ushort prefix;
+ if (!TryReadUInt16BE(_stream, out prefix))
+ return null;
- if ((prefix & 0xC880) == 0xC000) // Analog data
+ if ((prefix & 0xF880) == 0xC800) // Serial data
+ {
+ var index = ((prefix & 0x0700) >> 1) | (prefix & 0x7F);
+ var n = 0;
+ const int maxSerialDataLength = 252;
+ var chars = new char[maxSerialDataLength];
+ int ch;
+ while ((ch = _stream.ReadByte()) != 0xFF)
{
- ushort data;
- if (!TryReadUInt16BE(_stream, out data))
+ if (ch == -1) // Reached end of stream without end of data marker
return null;
-
- var index = ((prefix & 0x0700) >> 1) | (prefix & 0x7F);
- var value = ((prefix & 0x3000) << 2) | ((data & 0x7F00) >> 1) | (data & 0x7F);
- return new XSigAnalogToken((ushort)(index + 1), (ushort)value);
- }
-
- if ((prefix & 0xC080) == 0x8000) // Digital data
- {
- var index = ((prefix & 0x1F00) >> 1) | (prefix & 0x7F);
- var value = (prefix & 0x2000) == 0;
- return new XSigDigitalToken((ushort)(index + 1), value);
+
+ chars[n++] = (char)ch;
}
- return null;
+ return new XSigSerialToken((ushort)(index + 1), new string(chars, 0, n));
}
- ///
- /// Reads all available XSig tokens from the stream.
- ///
- /// XSigToken collection.
- public IEnumerable ReadAllXSigTokens()
+ if ((prefix & 0xC880) == 0xC000) // Analog data
{
- var tokens = new List();
- XSigToken token;
- while ((token = ReadXSigToken()) != null)
- tokens.Add(token);
+ ushort data;
+ if (!TryReadUInt16BE(_stream, out data))
+ return null;
- return tokens;
+ var index = ((prefix & 0x0700) >> 1) | (prefix & 0x7F);
+ var value = ((prefix & 0x3000) << 2) | ((data & 0x7F00) >> 1) | (data & 0x7F);
+ return new XSigAnalogToken((ushort)(index + 1), (ushort)value);
}
- ///
- /// Attempts to deserialize all XSig data within the stream from the current position.
- ///
- /// Type to deserialize the information to.
- /// Deserialized object.
- public T DeserializeStream()
- where T : class, IXSigSerialization, new()
+ if ((prefix & 0xC080) == 0x8000) // Digital data
{
- return new T().Deserialize(ReadAllXSigTokens());
+ var index = ((prefix & 0x1F00) >> 1) | (prefix & 0x7F);
+ var value = (prefix & 0x2000) == 0;
+ return new XSigDigitalToken((ushort)(index + 1), value);
}
- ///
- /// Disposes of the internal stream if specified to not leave open.
- ///
- public void Dispose()
- {
- if (!_leaveOpen)
- _stream.Dispose();
- }
+ return null;
+ }
+
+ ///
+ /// Reads all available XSig tokens from the stream.
+ ///
+ /// XSigToken collection.
+ public IEnumerable ReadAllXSigTokens()
+ {
+ var tokens = new List();
+ XSigToken token;
+ while ((token = ReadXSigToken()) != null)
+ tokens.Add(token);
+
+ return tokens;
+ }
+
+ ///
+ /// Attempts to deserialize all XSig data within the stream from the current position.
+ ///
+ /// Type to deserialize the information to.
+ /// Deserialized object.
+ public T DeserializeStream()
+ where T : class, IXSigSerialization, new()
+ {
+ return new T().Deserialize(ReadAllXSigTokens());
+ }
+
+ ///
+ /// Disposes of the internal stream if specified to not leave open.
+ ///
+ public void Dispose()
+ {
+ if (!_leaveOpen)
+ _stream.Dispose();
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Core/XSigUtility/XSigTokenStreamWriter.cs b/src/PepperDash.Core/XSigUtility/XSigTokenStreamWriter.cs
index 934f2c293..da973acd1 100644
--- a/src/PepperDash.Core/XSigUtility/XSigTokenStreamWriter.cs
+++ b/src/PepperDash.Core/XSigUtility/XSigTokenStreamWriter.cs
@@ -5,132 +5,131 @@
using PepperDash.Core.Intersystem.Serialization;
using PepperDash.Core.Intersystem.Tokens;
-namespace PepperDash.Core.Intersystem
+namespace PepperDash.Core.Intersystem;
+
+///
+/// XSigToken stream writer.
+///
+public sealed class XSigTokenStreamWriter : IDisposable
{
+ private readonly Stream _stream;
+ private readonly bool _leaveOpen;
+
+ ///
///
- /// XSigToken stream writer.
+ /// XSigToken stream writer constructor.
///
- public sealed class XSigTokenStreamWriter : IDisposable
- {
- private readonly Stream _stream;
- private readonly bool _leaveOpen;
+ /// Input stream to write to.
+ /// Stream is null.
+ /// Stream cannot be written to.
+ public XSigTokenStreamWriter(Stream stream)
+ : this(stream, false) { }
- ///
- ///
- /// XSigToken stream writer constructor.
- ///
- /// Input stream to write to.
- /// Stream is null.
- /// Stream cannot be written to.
- public XSigTokenStreamWriter(Stream stream)
- : this(stream, false) { }
+ ///
+ /// XSigToken stream writer constructor.
+ ///
+ /// Input stream to write to.
+ /// Determines whether to leave the stream open or not.
+ /// Stream is null.
+ /// Stream cannot be written to.
+ public XSigTokenStreamWriter(Stream stream, bool leaveOpen)
+ {
+ if (stream == null)
+ throw new ArgumentNullException("stream");
+ if (!stream.CanWrite)
+ throw new ArgumentException("The specified stream cannot be written to.");
- ///
- /// XSigToken stream writer constructor.
- ///
- /// Input stream to write to.
- /// Determines whether to leave the stream open or not.
- /// Stream is null.
- /// Stream cannot be written to.
- public XSigTokenStreamWriter(Stream stream, bool leaveOpen)
- {
- if (stream == null)
- throw new ArgumentNullException("stream");
- if (!stream.CanWrite)
- throw new ArgumentException("The specified stream cannot be written to.");
+ _stream = stream;
+ _leaveOpen = leaveOpen;
+ }
- _stream = stream;
- _leaveOpen = leaveOpen;
- }
+ ///
+ /// Write XSig data gathered from an IXSigStateResolver to the stream.
+ ///
+ /// IXSigStateResolver object.
+ public void WriteXSigData(IXSigSerialization xSigSerialization)
+ {
+ WriteXSigData(xSigSerialization, 0);
+ }
- ///
- /// Write XSig data gathered from an IXSigStateResolver to the stream.
- ///
- /// IXSigStateResolver object.
- public void WriteXSigData(IXSigSerialization xSigSerialization)
- {
- WriteXSigData(xSigSerialization, 0);
- }
+ ///
+ /// Write XSig data gathered from an IXSigStateResolver to the stream.
+ ///
+ /// IXSigStateResolver object.
+ /// Index offset for each XSigToken.
+ public void WriteXSigData(IXSigSerialization xSigSerialization, int offset)
+ {
+ if (xSigSerialization == null)
+ throw new ArgumentNullException("xSigSerialization");
- ///
- /// Write XSig data gathered from an IXSigStateResolver to the stream.
- ///
- /// IXSigStateResolver object.
- /// Index offset for each XSigToken.
- public void WriteXSigData(IXSigSerialization xSigSerialization, int offset)
- {
- if (xSigSerialization == null)
- throw new ArgumentNullException("xSigSerialization");
+ var tokens = xSigSerialization.Serialize();
+ WriteXSigData(tokens, offset);
+ }
- var tokens = xSigSerialization.Serialize();
- WriteXSigData(tokens, offset);
- }
+ ///
+ /// Write XSigToken to the stream.
+ ///
+ /// XSigToken object.
+ public void WriteXSigData(XSigToken token)
+ {
+ WriteXSigData(token, 0);
+ }
- ///
- /// Write XSigToken to the stream.
- ///
- /// XSigToken object.
- public void WriteXSigData(XSigToken token)
- {
- WriteXSigData(token, 0);
- }
+ ///
+ /// Write XSigToken to the stream.
+ ///
+ /// XSigToken object.
+ /// Index offset for each XSigToken.
+ public void WriteXSigData(XSigToken token, int offset)
+ {
+ WriteXSigData(new[] { token }, offset);
+ }
- ///
- /// Write XSigToken to the stream.
- ///
- /// XSigToken object.
- /// Index offset for each XSigToken.
- public void WriteXSigData(XSigToken token, int offset)
- {
- WriteXSigData(new[] { token }, offset);
- }
+ ///
+ /// Writes an array of XSigTokens to the stream.
+ ///
+ /// XSigToken objects.
+ public void WriteXSigData(XSigToken[] tokens)
+ {
+ WriteXSigData(tokens.AsEnumerable());
+ }
- ///
- /// Writes an array of XSigTokens to the stream.
- ///
- /// XSigToken objects.
- public void WriteXSigData(XSigToken[] tokens)
- {
- WriteXSigData(tokens.AsEnumerable());
- }
+ ///
+ /// Write an enumerable collection of XSigTokens to the stream.
+ ///
+ /// XSigToken objects.
+ public void WriteXSigData(IEnumerable tokens)
+ {
+ WriteXSigData(tokens, 0);
+ }
- ///
- /// Write an enumerable collection of XSigTokens to the stream.
- ///
- /// XSigToken objects.
- public void WriteXSigData(IEnumerable tokens)
- {
- WriteXSigData(tokens, 0);
- }
+ ///
+ /// Write an enumerable collection of XSigTokens to the stream.
+ ///
+ /// XSigToken objects.
+ /// Index offset for each XSigToken.
+ public void WriteXSigData(IEnumerable tokens, int offset)
+ {
+ if (offset < 0)
+ throw new ArgumentOutOfRangeException("offset", "Offset must be greater than or equal to 0.");
- ///
- /// Write an enumerable collection of XSigTokens to the stream.
- ///
- /// XSigToken objects.
- /// Index offset for each XSigToken.
- public void WriteXSigData(IEnumerable tokens, int offset)
+ if (tokens != null)
{
- if (offset < 0)
- throw new ArgumentOutOfRangeException("offset", "Offset must be greater than or equal to 0.");
-
- if (tokens != null)
+ foreach (var token in tokens)
{
- foreach (var token in tokens)
- {
- if (token == null) continue;
- var bytes = token.GetTokenWithOffset(offset).GetBytes();
- _stream.Write(bytes, 0, bytes.Length);
- }
+ if (token == null) continue;
+ var bytes = token.GetTokenWithOffset(offset).GetBytes();
+ _stream.Write(bytes, 0, bytes.Length);
}
}
+ }
- ///
- /// Disposes of the internal stream if specified to not leave open.
- ///
- public void Dispose()
- {
- if (!_leaveOpen)
- _stream.Dispose();
- }
+ ///
+ /// Disposes of the internal stream if specified to not leave open.
+ ///
+ public void Dispose()
+ {
+ if (!_leaveOpen)
+ _stream.Dispose();
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs b/src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs
index c1590704a..627ecf205 100644
--- a/src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs
@@ -16,410 +16,408 @@
//using PepperDash.Essentials.Devices.Common.Cameras;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+///
+/// Base class for bridge API variants
+///
+public abstract class BridgeApi : EssentialsDevice
{
- ///
- /// Base class for bridge API variants
- ///
- public abstract class BridgeApi : EssentialsDevice
+ protected BridgeApi(string key) :
+ base(key)
{
- protected BridgeApi(string key) :
- base(key)
- {
- }
}
+}
- ///
- /// Bridge API using EISC
- ///
- public class EiscApiAdvanced : BridgeApi, ICommunicationMonitor
- {
- public EiscApiPropertiesConfig PropertiesConfig { get; private set; }
+///
+/// Bridge API using EISC
+///
+public class EiscApiAdvanced : BridgeApi, ICommunicationMonitor
+{
+ public EiscApiPropertiesConfig PropertiesConfig { get; private set; }
- public Dictionary JoinMaps { get; private set; }
+ public Dictionary JoinMaps { get; private set; }
- public BasicTriList Eisc { get; private set; }
+ public BasicTriList Eisc { get; private set; }
- public EiscApiAdvanced(DeviceConfig dc, BasicTriList eisc) :
- base(dc.Key)
- {
- JoinMaps = new Dictionary();
+ public EiscApiAdvanced(DeviceConfig dc, BasicTriList eisc) :
+ base(dc.Key)
+ {
+ JoinMaps = new Dictionary();
- PropertiesConfig = dc.Properties.ToObject();
- //PropertiesConfig = JsonConvert.DeserializeObject(dc.Properties.ToString());
+ PropertiesConfig = dc.Properties.ToObject();
+ //PropertiesConfig = JsonConvert.DeserializeObject(dc.Properties.ToString());
- Eisc = eisc;
+ Eisc = eisc;
- Eisc.SigChange += Eisc_SigChange;
+ Eisc.SigChange += Eisc_SigChange;
- CommunicationMonitor = new CrestronGenericBaseCommunicationMonitor(this, Eisc, 120000, 300000);
+ CommunicationMonitor = new CrestronGenericBaseCommunicationMonitor(this, Eisc, 120000, 300000);
- AddPostActivationAction(LinkDevices);
- AddPostActivationAction(LinkRooms);
- AddPostActivationAction(RegisterEisc);
- }
+ AddPostActivationAction(LinkDevices);
+ AddPostActivationAction(LinkRooms);
+ AddPostActivationAction(RegisterEisc);
+ }
- public override bool CustomActivate()
- {
- CommunicationMonitor.Start();
- return base.CustomActivate();
- }
+ public override bool CustomActivate()
+ {
+ CommunicationMonitor.Start();
+ return base.CustomActivate();
+ }
- public override bool Deactivate()
+ public override bool Deactivate()
+ {
+ CommunicationMonitor.Stop();
+ return base.Deactivate();
+ }
+
+ private void LinkDevices()
+ {
+ Debug.LogMessage(LogEventLevel.Debug, this, "Linking Devices...");
+
+ if (PropertiesConfig.Devices == null)
{
- CommunicationMonitor.Stop();
- return base.Deactivate();
+ Debug.LogMessage(LogEventLevel.Debug, this, "No devices linked to this bridge");
+ return;
}
- private void LinkDevices()
+ foreach (var d in PropertiesConfig.Devices)
{
- Debug.LogMessage(LogEventLevel.Debug, this, "Linking Devices...");
+ var device = DeviceManager.GetDeviceForKey(d.DeviceKey);
- if (PropertiesConfig.Devices == null)
+ if (device == null)
{
- Debug.LogMessage(LogEventLevel.Debug, this, "No devices linked to this bridge");
- return;
+ continue;
}
- foreach (var d in PropertiesConfig.Devices)
- {
- var device = DeviceManager.GetDeviceForKey(d.DeviceKey);
+ Debug.LogMessage(LogEventLevel.Debug, this, "Linking Device: '{0}'", device.Key);
- if (device == null)
- {
- continue;
- }
-
- Debug.LogMessage(LogEventLevel.Debug, this, "Linking Device: '{0}'", device.Key);
+ if (device is IBridgeAdvanced bridge)
+ {
+ bridge.LinkToApi(Eisc, d.JoinStart, d.JoinMapKey, this);
+ continue;
+ }
- if (device is IBridgeAdvanced bridge)
- {
- bridge.LinkToApi(Eisc, d.JoinStart, d.JoinMapKey, this);
- continue;
- }
+ Debug.LogMessage(LogEventLevel.Information, this,
+ "{0} is not compatible with this bridge type. Please use 'eiscapi' instead, or updae the device.",
+ device.Key);
+ }
+ }
- Debug.LogMessage(LogEventLevel.Information, this,
- "{0} is not compatible with this bridge type. Please use 'eiscapi' instead, or updae the device.",
- device.Key);
- }
+ private void RegisterEisc()
+ {
+ if (Eisc.Registered)
+ {
+ return;
}
- private void RegisterEisc()
+ var registerResult = Eisc.Register();
+
+ if (registerResult != eDeviceRegistrationUnRegistrationResponse.Success)
{
- if (Eisc.Registered)
- {
- return;
- }
+ Debug.LogMessage(LogEventLevel.Verbose, this, "Registration result: {0}", registerResult);
+ return;
+ }
- var registerResult = Eisc.Register();
+ Debug.LogMessage(LogEventLevel.Debug, this, "EISC registration successful");
+ }
- if (registerResult != eDeviceRegistrationUnRegistrationResponse.Success)
- {
- Debug.LogMessage(LogEventLevel.Verbose, this, "Registration result: {0}", registerResult);
- return;
- }
+ public void LinkRooms()
+ {
+ Debug.LogMessage(LogEventLevel.Debug, this, "Linking Rooms...");
- Debug.LogMessage(LogEventLevel.Debug, this, "EISC registration successful");
+ if (PropertiesConfig.Rooms == null)
+ {
+ Debug.LogMessage(LogEventLevel.Debug, this, "No rooms linked to this bridge.");
+ return;
}
- public void LinkRooms()
+ foreach (var room in PropertiesConfig.Rooms)
{
- Debug.LogMessage(LogEventLevel.Debug, this, "Linking Rooms...");
+ var rm = DeviceManager.GetDeviceForKey(room.RoomKey) as IBridgeAdvanced;
- if (PropertiesConfig.Rooms == null)
+ if (rm == null)
{
- Debug.LogMessage(LogEventLevel.Debug, this, "No rooms linked to this bridge.");
- return;
+ Debug.LogMessage(LogEventLevel.Debug, this,
+ "Room {0} does not implement IBridgeAdvanced. Skipping...", room.RoomKey);
+ continue;
}
- foreach (var room in PropertiesConfig.Rooms)
- {
- var rm = DeviceManager.GetDeviceForKey(room.RoomKey) as IBridgeAdvanced;
-
- if (rm == null)
- {
- Debug.LogMessage(LogEventLevel.Debug, this,
- "Room {0} does not implement IBridgeAdvanced. Skipping...", room.RoomKey);
- continue;
- }
-
- rm.LinkToApi(Eisc, room.JoinStart, room.JoinMapKey, this);
- }
+ rm.LinkToApi(Eisc, room.JoinStart, room.JoinMapKey, this);
}
+ }
- ///
- /// Adds a join map
- ///
- ///
- ///
- public void AddJoinMap(string deviceKey, JoinMapBaseAdvanced joinMap)
+ ///
+ /// Adds a join map
+ ///
+ ///
+ ///
+ public void AddJoinMap(string deviceKey, JoinMapBaseAdvanced joinMap)
+ {
+ if (!JoinMaps.ContainsKey(deviceKey))
{
- if (!JoinMaps.ContainsKey(deviceKey))
- {
- JoinMaps.Add(deviceKey, joinMap);
- }
- else
- {
- Debug.LogMessage(LogEventLevel.Verbose, this, "Unable to add join map with key '{0}'. Key already exists in JoinMaps dictionary", deviceKey);
- }
+ JoinMaps.Add(deviceKey, joinMap);
}
-
- ///
- /// Prints all the join maps on this bridge
- ///
- public virtual void PrintJoinMaps()
+ else
{
- CrestronConsole.ConsoleCommandResponse("Join Maps for EISC IPID: {0}\r\n", Eisc.ID.ToString("X"));
-
- foreach (var joinMap in JoinMaps)
- {
- CrestronConsole.ConsoleCommandResponse("Join map for device '{0}':", joinMap.Key);
- joinMap.Value.PrintJoinMapInfo();
- }
+ Debug.LogMessage(LogEventLevel.Verbose, this, "Unable to add join map with key '{0}'. Key already exists in JoinMaps dictionary", deviceKey);
}
- ///
- /// Generates markdown for all join maps on this bridge
- ///
- public virtual void MarkdownForBridge(string bridgeKey)
- {
- Debug.LogMessage(LogEventLevel.Information, this, "Writing Joinmaps to files for EISC IPID: {0}", Eisc.ID.ToString("X"));
+ }
- foreach (var joinMap in JoinMaps)
- {
- Debug.LogMessage(LogEventLevel.Information, "Generating markdown for device '{0}':", joinMap.Key);
- joinMap.Value.MarkdownJoinMapInfo(joinMap.Key, bridgeKey);
- }
+ ///
+ /// Prints all the join maps on this bridge
+ ///
+ public virtual void PrintJoinMaps()
+ {
+ CrestronConsole.ConsoleCommandResponse("Join Maps for EISC IPID: {0}\r\n", Eisc.ID.ToString("X"));
+
+ foreach (var joinMap in JoinMaps)
+ {
+ CrestronConsole.ConsoleCommandResponse("Join map for device '{0}':", joinMap.Key);
+ joinMap.Value.PrintJoinMapInfo();
}
+ }
+ ///
+ /// Generates markdown for all join maps on this bridge
+ ///
+ public virtual void MarkdownForBridge(string bridgeKey)
+ {
+ Debug.LogMessage(LogEventLevel.Information, this, "Writing Joinmaps to files for EISC IPID: {0}", Eisc.ID.ToString("X"));
- ///
- /// Prints the join map for a device by key
- ///
- ///
- public void PrintJoinMapForDevice(string deviceKey)
+ foreach (var joinMap in JoinMaps)
{
- var joinMap = JoinMaps[deviceKey];
+ Debug.LogMessage(LogEventLevel.Information, "Generating markdown for device '{0}':", joinMap.Key);
+ joinMap.Value.MarkdownJoinMapInfo(joinMap.Key, bridgeKey);
+ }
+ }
- if (joinMap == null)
- {
- Debug.LogMessage(LogEventLevel.Information, this, "Unable to find joinMap for device with key: '{0}'", deviceKey);
- return;
- }
+ ///
+ /// Prints the join map for a device by key
+ ///
+ ///
+ public void PrintJoinMapForDevice(string deviceKey)
+ {
+ var joinMap = JoinMaps[deviceKey];
- Debug.LogMessage(LogEventLevel.Information, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
- joinMap.PrintJoinMapInfo();
- }
- ///
- /// Prints the join map for a device by key
- ///
- ///
- public void MarkdownJoinMapForDevice(string deviceKey, string bridgeKey)
+ if (joinMap == null)
{
- var joinMap = JoinMaps[deviceKey];
+ Debug.LogMessage(LogEventLevel.Information, this, "Unable to find joinMap for device with key: '{0}'", deviceKey);
+ return;
+ }
- if (joinMap == null)
- {
- Debug.LogMessage(LogEventLevel.Information, this, "Unable to find joinMap for device with key: '{0}'", deviceKey);
- return;
- }
+ Debug.LogMessage(LogEventLevel.Information, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
+ joinMap.PrintJoinMapInfo();
+ }
+ ///
+ /// Prints the join map for a device by key
+ ///
+ ///
+ public void MarkdownJoinMapForDevice(string deviceKey, string bridgeKey)
+ {
+ var joinMap = JoinMaps[deviceKey];
- Debug.LogMessage(LogEventLevel.Information, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
- joinMap.MarkdownJoinMapInfo(deviceKey, bridgeKey);
+ if (joinMap == null)
+ {
+ Debug.LogMessage(LogEventLevel.Information, this, "Unable to find joinMap for device with key: '{0}'", deviceKey);
+ return;
}
- ///
- /// Used for debugging to trigger an action based on a join number and type
- ///
- ///
- ///
- ///
- public void ExecuteJoinAction(uint join, string type, object state)
+ Debug.LogMessage(LogEventLevel.Information, "Join map for device '{0}' on EISC '{1}':", deviceKey, Key);
+ joinMap.MarkdownJoinMapInfo(deviceKey, bridgeKey);
+ }
+
+ ///
+ /// Used for debugging to trigger an action based on a join number and type
+ ///
+ ///
+ ///
+ ///
+ public void ExecuteJoinAction(uint join, string type, object state)
+ {
+ try
{
- try
+ switch (type.ToLower())
{
- switch (type.ToLower())
- {
- case "digital":
- {
- var uo = Eisc.BooleanOutput[join].UserObject as Action;
- if (uo != null)
- {
- Debug.LogMessage(LogEventLevel.Verbose, this, "Executing Action: {0}", uo.ToString());
- uo(Convert.ToBoolean(state));
- }
- else
- Debug.LogMessage(LogEventLevel.Verbose, this, "User Action is null. Nothing to Execute");
- break;
- }
- case "analog":
+ case "digital":
+ {
+ var uo = Eisc.BooleanOutput[join].UserObject as Action;
+ if (uo != null)
{
- var uo = Eisc.BooleanOutput[join].UserObject as Action;
- if (uo != null)
- {
- Debug.LogMessage(LogEventLevel.Verbose, this, "Executing Action: {0}", uo.ToString());
- uo(Convert.ToUInt16(state));
- }
- else
- Debug.LogMessage(LogEventLevel.Verbose, this, "User Action is null. Nothing to Execute"); break;
+ Debug.LogMessage(LogEventLevel.Verbose, this, "Executing Action: {0}", uo.ToString());
+ uo(Convert.ToBoolean(state));
}
- case "serial":
+ else
+ Debug.LogMessage(LogEventLevel.Verbose, this, "User Action is null. Nothing to Execute");
+ break;
+ }
+ case "analog":
+ {
+ var uo = Eisc.BooleanOutput[join].UserObject as Action;
+ if (uo != null)
{
- var uo = Eisc.BooleanOutput[join].UserObject as Action;
- if (uo != null)
- {
- Debug.LogMessage(LogEventLevel.Verbose, this, "Executing Action: {0}", uo.ToString());
- uo(Convert.ToString(state));
- }
- else
- Debug.LogMessage(LogEventLevel.Verbose, this, "User Action is null. Nothing to Execute");
- break;
+ Debug.LogMessage(LogEventLevel.Verbose, this, "Executing Action: {0}", uo.ToString());
+ uo(Convert.ToUInt16(state));
}
- default:
+ else
+ Debug.LogMessage(LogEventLevel.Verbose, this, "User Action is null. Nothing to Execute"); break;
+ }
+ case "serial":
+ {
+ var uo = Eisc.BooleanOutput[join].UserObject as Action;
+ if (uo != null)
{
- Debug.LogMessage(LogEventLevel.Verbose, "Unknown join type. Use digital/serial/analog");
- break;
+ Debug.LogMessage(LogEventLevel.Verbose, this, "Executing Action: {0}", uo.ToString());
+ uo(Convert.ToString(state));
}
- }
- }
- catch (Exception e)
- {
- Debug.LogMessage(LogEventLevel.Debug, this, "Error: {0}", e);
+ else
+ Debug.LogMessage(LogEventLevel.Verbose, this, "User Action is null. Nothing to Execute");
+ break;
+ }
+ default:
+ {
+ Debug.LogMessage(LogEventLevel.Verbose, "Unknown join type. Use digital/serial/analog");
+ break;
+ }
}
-
}
-
- ///
- /// Handles incoming sig changes
- ///
- ///
- ///
- protected void Eisc_SigChange(object currentDevice, SigEventArgs args)
+ catch (Exception e)
{
- try
- {
- Debug.LogMessage(LogEventLevel.Verbose, this, "EiscApiAdvanced change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue);
- var uo = args.Sig.UserObject;
-
- if (uo == null) return;
-
- Debug.LogMessage(LogEventLevel.Debug, this, "Executing Action: {0}", uo.ToString());
- if (uo is Action)
- (uo as Action)(args.Sig.BoolValue);
- else if (uo is Action)
- (uo as Action)(args.Sig.UShortValue);
- else if (uo is Action)
- (uo as Action)(args.Sig.StringValue);
- }
- catch (Exception e)
- {
- Debug.LogMessage(LogEventLevel.Verbose, this, "Error in Eisc_SigChange handler: {0}", e);
- }
+ Debug.LogMessage(LogEventLevel.Debug, this, "Error: {0}", e);
}
- #region Implementation of ICommunicationMonitor
-
- public StatusMonitorBase CommunicationMonitor { get; private set; }
-
- #endregion
}
- public class EiscApiPropertiesConfig
+ ///
+ /// Handles incoming sig changes
+ ///
+ ///
+ ///
+ protected void Eisc_SigChange(object currentDevice, SigEventArgs args)
{
- [JsonProperty("control")]
- public EssentialsControlPropertiesConfig Control { get; set; }
+ try
+ {
+ Debug.LogMessage(LogEventLevel.Verbose, this, "EiscApiAdvanced change: {0} {1}={2}", args.Sig.Type, args.Sig.Number, args.Sig.StringValue);
+ var uo = args.Sig.UserObject;
+
+ if (uo == null) return;
+
+ Debug.LogMessage(LogEventLevel.Debug, this, "Executing Action: {0}", uo.ToString());
+ if (uo is Action)
+ (uo as Action)(args.Sig.BoolValue);
+ else if (uo is Action)
+ (uo as Action)(args.Sig.UShortValue);
+ else if (uo is Action)
+ (uo as Action)(args.Sig.StringValue);
+ }
+ catch (Exception e)
+ {
+ Debug.LogMessage(LogEventLevel.Verbose, this, "Error in Eisc_SigChange handler: {0}", e);
+ }
+ }
- [JsonProperty("devices")]
- public List Devices { get; set; }
+ #region Implementation of ICommunicationMonitor
- [JsonProperty("rooms")]
- public List Rooms { get; set; }
+ public StatusMonitorBase CommunicationMonitor { get; private set; }
+ #endregion
+}
- public class ApiDevicePropertiesConfig
- {
- [JsonProperty("deviceKey")]
- public string DeviceKey { get; set; }
+public class EiscApiPropertiesConfig
+{
+ [JsonProperty("control")]
+ public EssentialsControlPropertiesConfig Control { get; set; }
- [JsonProperty("joinStart")]
- public uint JoinStart { get; set; }
+ [JsonProperty("devices")]
+ public List Devices { get; set; }
- [JsonProperty("joinMapKey")]
- public string JoinMapKey { get; set; }
- }
+ [JsonProperty("rooms")]
+ public List Rooms { get; set; }
- public class ApiRoomPropertiesConfig
- {
- [JsonProperty("roomKey")]
- public string RoomKey { get; set; }
- [JsonProperty("joinStart")]
- public uint JoinStart { get; set; }
+ public class ApiDevicePropertiesConfig
+ {
+ [JsonProperty("deviceKey")]
+ public string DeviceKey { get; set; }
- [JsonProperty("joinMapKey")]
- public string JoinMapKey { get; set; }
- }
+ [JsonProperty("joinStart")]
+ public uint JoinStart { get; set; }
+ [JsonProperty("joinMapKey")]
+ public string JoinMapKey { get; set; }
}
- public class EiscApiAdvancedFactory : EssentialsDeviceFactory
+ public class ApiRoomPropertiesConfig
{
- public EiscApiAdvancedFactory()
- {
- TypeNames = new List { "eiscapiadv", "eiscapiadvanced", "eiscapiadvancedserver", "eiscapiadvancedclient", "vceiscapiadv", "vceiscapiadvanced" };
- }
+ [JsonProperty("roomKey")]
+ public string RoomKey { get; set; }
- public override EssentialsDevice BuildDevice(DeviceConfig dc)
- {
- Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new EiscApiAdvanced Device");
+ [JsonProperty("joinStart")]
+ public uint JoinStart { get; set; }
- var controlProperties = CommFactory.GetControlPropertiesConfig(dc);
+ [JsonProperty("joinMapKey")]
+ public string JoinMapKey { get; set; }
+ }
- BasicTriList eisc;
+}
- switch (dc.Type.ToLower())
- {
- case "eiscapiadv":
- case "eiscapiadvanced":
- {
- eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(controlProperties.IpIdInt,
- controlProperties.TcpSshProperties.Address, Global.ControlSystem);
- break;
- }
- case "eiscapiadvancedserver":
- {
- eisc = new EISCServer(controlProperties.IpIdInt, Global.ControlSystem);
- break;
- }
- case "eiscapiadvancedclient":
- {
- eisc = new EISCClient(controlProperties.IpIdInt, controlProperties.TcpSshProperties.Address, Global.ControlSystem);
- break;
- }
- case "vceiscapiadv":
- case "vceiscapiadvanced":
+public class EiscApiAdvancedFactory : EssentialsDeviceFactory
+{
+ public EiscApiAdvancedFactory()
+ {
+ TypeNames = new List { "eiscapiadv", "eiscapiadvanced", "eiscapiadvancedserver", "eiscapiadvancedclient", "vceiscapiadv", "vceiscapiadvanced" };
+ }
+
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+ Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new EiscApiAdvanced Device");
+
+ var controlProperties = CommFactory.GetControlPropertiesConfig(dc);
+
+ BasicTriList eisc;
+
+ switch (dc.Type.ToLower())
+ {
+ case "eiscapiadv":
+ case "eiscapiadvanced":
+ {
+ eisc = new ThreeSeriesTcpIpEthernetIntersystemCommunications(controlProperties.IpIdInt,
+ controlProperties.TcpSshProperties.Address, Global.ControlSystem);
+ break;
+ }
+ case "eiscapiadvancedserver":
+ {
+ eisc = new EISCServer(controlProperties.IpIdInt, Global.ControlSystem);
+ break;
+ }
+ case "eiscapiadvancedclient":
+ {
+ eisc = new EISCClient(controlProperties.IpIdInt, controlProperties.TcpSshProperties.Address, Global.ControlSystem);
+ break;
+ }
+ case "vceiscapiadv":
+ case "vceiscapiadvanced":
+ {
+ if (string.IsNullOrEmpty(controlProperties.RoomId))
{
- if (string.IsNullOrEmpty(controlProperties.RoomId))
- {
- Debug.LogMessage(LogEventLevel.Information, "Unable to build VC-4 EISC Client for device {0}. Room ID is missing or empty", dc.Key);
- eisc = null;
- break;
- }
- eisc = new VirtualControlEISCClient(controlProperties.IpIdInt, controlProperties.RoomId,
- Global.ControlSystem);
+ Debug.LogMessage(LogEventLevel.Information, "Unable to build VC-4 EISC Client for device {0}. Room ID is missing or empty", dc.Key);
+ eisc = null;
break;
}
- default:
- eisc = null;
+ eisc = new VirtualControlEISCClient(controlProperties.IpIdInt, controlProperties.RoomId,
+ Global.ControlSystem);
break;
- }
-
- if (eisc == null)
- {
- return null;
- }
+ }
+ default:
+ eisc = null;
+ break;
+ }
- return new EiscApiAdvanced(dc, eisc);
+ if (eisc == null)
+ {
+ return null;
}
- }
+ return new EiscApiAdvanced(dc, eisc);
+ }
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs b/src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs
index 0254cd0d7..3a3ceff20 100644
--- a/src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs
@@ -3,64 +3,62 @@
//using PepperDash.Essentials.Devices.Common.Cameras;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+///
+/// Helper methods for bridges
+///
+public static class BridgeHelper
{
- ///
- /// Helper methods for bridges
- ///
- public static class BridgeHelper
+ public static void PrintJoinMap(string command)
{
- public static void PrintJoinMap(string command)
- {
- var targets = command.Split(' ');
+ var targets = command.Split(' ');
- var bridgeKey = targets[0].Trim();
+ var bridgeKey = targets[0].Trim();
- if (!(DeviceManager.GetDeviceForKey(bridgeKey) is EiscApiAdvanced bridge))
- {
- Debug.LogMessage(LogEventLevel.Information, "Unable to find advanced bridge with key: '{0}'", bridgeKey);
- return;
- }
+ if (!(DeviceManager.GetDeviceForKey(bridgeKey) is EiscApiAdvanced bridge))
+ {
+ Debug.LogMessage(LogEventLevel.Information, "Unable to find advanced bridge with key: '{0}'", bridgeKey);
+ return;
+ }
- if (targets.Length > 1)
- {
- var deviceKey = targets[1].Trim();
+ if (targets.Length > 1)
+ {
+ var deviceKey = targets[1].Trim();
- if (string.IsNullOrEmpty(deviceKey)) return;
- bridge.PrintJoinMapForDevice(deviceKey);
- }
- else
- {
- bridge.PrintJoinMaps();
- }
+ if (string.IsNullOrEmpty(deviceKey)) return;
+ bridge.PrintJoinMapForDevice(deviceKey);
}
- public static void JoinmapMarkdown(string command)
+ else
{
- var targets = command.Split(' ');
+ bridge.PrintJoinMaps();
+ }
+ }
+ public static void JoinmapMarkdown(string command)
+ {
+ var targets = command.Split(' ');
- var bridgeKey = targets[0].Trim();
+ var bridgeKey = targets[0].Trim();
- var bridge = DeviceManager.GetDeviceForKey(bridgeKey) as EiscApiAdvanced;
+ var bridge = DeviceManager.GetDeviceForKey(bridgeKey) as EiscApiAdvanced;
- if (bridge == null)
- {
- Debug.LogMessage(LogEventLevel.Information, "Unable to find advanced bridge with key: '{0}'", bridgeKey);
- return;
- }
+ if (bridge == null)
+ {
+ Debug.LogMessage(LogEventLevel.Information, "Unable to find advanced bridge with key: '{0}'", bridgeKey);
+ return;
+ }
- if (targets.Length > 1)
- {
- var deviceKey = targets[1].Trim();
+ if (targets.Length > 1)
+ {
+ var deviceKey = targets[1].Trim();
- if (string.IsNullOrEmpty(deviceKey)) return;
- bridge.MarkdownJoinMapForDevice(deviceKey, bridgeKey);
- }
- else
- {
- bridge.MarkdownForBridge(bridgeKey);
+ if (string.IsNullOrEmpty(deviceKey)) return;
+ bridge.MarkdownJoinMapForDevice(deviceKey, bridgeKey);
+ }
+ else
+ {
+ bridge.MarkdownForBridge(bridgeKey);
- }
}
}
-
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/IBridge.cs b/src/PepperDash.Essentials.Core/Bridges/IBridge.cs
index 0c6b44ed8..87b4bd351 100644
--- a/src/PepperDash.Essentials.Core/Bridges/IBridge.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/IBridge.cs
@@ -1,12 +1,11 @@
using Crestron.SimplSharpPro.DeviceSupport;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+///
+/// Defines a device that uses JoinMapBaseAdvanced for its join map
+///
+public interface IBridgeAdvanced
{
- ///
- /// Defines a device that uses JoinMapBaseAdvanced for its join map
- ///
- public interface IBridgeAdvanced
- {
- void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge);
- }
+ void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge);
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/AirMediaControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/AirMediaControllerJoinMap.cs
index c46df18cc..33fca20eb 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/AirMediaControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/AirMediaControllerJoinMap.cs
@@ -1,71 +1,70 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
-{
- public class AirMediaControllerJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+namespace PepperDash.Essentials.Core.Bridges;
- [JoinName("IsInSession")]
- public JoinDataComplete IsInSession = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media In Sharing Session", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+public class AirMediaControllerJoinMap : JoinMapBaseAdvanced
+{
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("HdmiVideoSync")]
- public JoinDataComplete HdmiVideoSync = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Has HDMI Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IsInSession")]
+ public JoinDataComplete IsInSession = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media In Sharing Session", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("AutomaticInputRoutingEnabled")]
- public JoinDataComplete AutomaticInputRoutingEnabled = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Automatic Input Routing Enable(d)", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("HdmiVideoSync")]
+ public JoinDataComplete HdmiVideoSync = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Has HDMI Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("VideoOut")]
- public JoinDataComplete VideoOut = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Video Route Select / Feedback", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("AutomaticInputRoutingEnabled")]
+ public JoinDataComplete AutomaticInputRoutingEnabled = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Automatic Input Routing Enable(d)", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ErrorFB")]
- public JoinDataComplete ErrorFB = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Error Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("VideoOut")]
+ public JoinDataComplete VideoOut = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Video Route Select / Feedback", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- [JoinName("NumberOfUsersConnectedFB")]
- public JoinDataComplete NumberOfUsersConnectedFB = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Number of Users Connected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("ErrorFB")]
+ public JoinDataComplete ErrorFB = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Error Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
- [JoinName("LoginCode")]
- public JoinDataComplete LoginCode = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Login Code Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("NumberOfUsersConnectedFB")]
+ public JoinDataComplete NumberOfUsersConnectedFB = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Number of Users Connected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Device Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("LoginCode")]
+ public JoinDataComplete LoginCode = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Login Code Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- [JoinName("ConnectionAddressFB")]
- public JoinDataComplete ConnectionAddressFB = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media IP Address", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Device Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("HostnameFB")]
- public JoinDataComplete HostnameFB = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Hostname", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("ConnectionAddressFB")]
+ public JoinDataComplete ConnectionAddressFB = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media IP Address", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("SerialNumberFeedback")]
- public JoinDataComplete SerialNumberFeedback = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Air Media Serial Number", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public AirMediaControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(AirMediaControllerJoinMap))
- {
- }
+ [JoinName("HostnameFB")]
+ public JoinDataComplete HostnameFB = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Hostname", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected AirMediaControllerJoinMap(uint joinStart, Type type) : base(joinStart, type){}
+ [JoinName("SerialNumberFeedback")]
+ public JoinDataComplete SerialNumberFeedback = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Air Media Serial Number", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public AirMediaControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(AirMediaControllerJoinMap))
+ {
}
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected AirMediaControllerJoinMap(uint joinStart, Type type) : base(joinStart, type){}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/AppleTvJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/AppleTvJoinMap.cs
index 7a9dfa744..3b3eaa062 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/AppleTvJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/AppleTvJoinMap.cs
@@ -1,53 +1,52 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class AppleTvJoinMap : JoinMapBaseAdvanced
{
- public class AppleTvJoinMap : JoinMapBaseAdvanced
+ [JoinName("UpArrow")]
+ public JoinDataComplete UpArrow = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "AppleTv Nav Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DnArrow")]
+ public JoinDataComplete DnArrow = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "AppleTv Nav Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("LeftArrow")]
+ public JoinDataComplete LeftArrow = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "AppleTv Nav Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("RightArrow")]
+ public JoinDataComplete RightArrow = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "AppleTv Nav Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Menu")]
+ public JoinDataComplete Menu = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "AppleTv Menu", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Select")]
+ public JoinDataComplete Select = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "AppleTv Select", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("PlayPause")]
+ public JoinDataComplete PlayPause = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "AppleTv Play/Pause", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public AppleTvJoinMap(uint joinStart)
+ : base(joinStart, typeof(AppleTvJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ public AppleTvJoinMap(uint joinStart, Type type) : base(joinStart, type)
{
- [JoinName("UpArrow")]
- public JoinDataComplete UpArrow = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "AppleTv Nav Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("DnArrow")]
- public JoinDataComplete DnArrow = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "AppleTv Nav Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("LeftArrow")]
- public JoinDataComplete LeftArrow = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "AppleTv Nav Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("RightArrow")]
- public JoinDataComplete RightArrow = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "AppleTv Nav Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Menu")]
- public JoinDataComplete Menu = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "AppleTv Menu", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Select")]
- public JoinDataComplete Select = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "AppleTv Select", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("PlayPause")]
- public JoinDataComplete PlayPause = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "AppleTv Play/Pause", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public AppleTvJoinMap(uint joinStart)
- : base(joinStart, typeof(AppleTvJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- public AppleTvJoinMap(uint joinStart, Type type) : base(joinStart, type)
- {
- }
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/C2nRthsControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/C2nRthsControllerJoinMap.cs
index dd141c8e9..17f8f4db7 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/C2nRthsControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/C2nRthsControllerJoinMap.cs
@@ -1,45 +1,44 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class C2nRthsControllerJoinMap : JoinMapBaseAdvanced
{
- public class C2nRthsControllerJoinMap : JoinMapBaseAdvanced
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Temp Sensor Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("TemperatureFormat")]
+ public JoinDataComplete TemperatureFormat = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Temp Sensor Unit Format", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Temperature")]
+ public JoinDataComplete Temperature = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Temp Sensor Temperature Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("Humidity")]
+ public JoinDataComplete Humidity = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Temp Sensor Humidity Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Temp Sensor Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public C2nRthsControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(C2nRthsControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected C2nRthsControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
{
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Temp Sensor Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("TemperatureFormat")]
- public JoinDataComplete TemperatureFormat = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Temp Sensor Unit Format", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Temperature")]
- public JoinDataComplete Temperature = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Temp Sensor Temperature Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Humidity")]
- public JoinDataComplete Humidity = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Temp Sensor Humidity Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Temp Sensor Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public C2nRthsControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(C2nRthsControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected C2nRthsControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
- {
- }
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/CameraControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/CameraControllerJoinMap.cs
index 5c07b4a72..0cb011fa1 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/CameraControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/CameraControllerJoinMap.cs
@@ -1,69 +1,68 @@
using System;
-namespace PepperDash.Essentials.Core.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 { Description = "Tilt Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("TiltDown")]
- public JoinDataComplete TiltDown = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 }, new JoinMetadata { Description = "Tilt Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PanLeft")]
- public JoinDataComplete PanLeft = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 }, new JoinMetadata { Description = "Pan Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PanRight")]
- public JoinDataComplete PanRight = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 }, new JoinMetadata { Description = "Pan Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ZoomIn")]
- public JoinDataComplete ZoomIn = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 }, new JoinMetadata { Description = "Zoom In", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ZoomOut")]
- public JoinDataComplete ZoomOut = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 }, new JoinMetadata { Description = "Zoom Out", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+namespace PepperDash.Essentials.Core.Bridges;
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 }, new JoinMetadata { Description = "Is Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PowerOn")]
- public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 }, new JoinMetadata { Description = "Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PowerOff")]
- public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 }, new JoinMetadata { Description = "Power Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+///
+/// Join map for CameraBase devices
+///
+public class CameraControllerJoinMap : JoinMapBaseAdvanced
+{
+ [JoinName("TiltUp")]
+ public JoinDataComplete TiltUp = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 }, new JoinMetadata { Description = "Tilt Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("TiltDown")]
+ public JoinDataComplete TiltDown = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 }, new JoinMetadata { Description = "Tilt Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PanLeft")]
+ public JoinDataComplete PanLeft = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 }, new JoinMetadata { Description = "Pan Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PanRight")]
+ public JoinDataComplete PanRight = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 }, new JoinMetadata { Description = "Pan Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ZoomIn")]
+ public JoinDataComplete ZoomIn = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 }, new JoinMetadata { Description = "Zoom In", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ZoomOut")]
+ public JoinDataComplete ZoomOut = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 }, new JoinMetadata { Description = "Zoom Out", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("NumberOfPresets")]
- public JoinDataComplete NumberOfPresets = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 }, new JoinMetadata { Description = "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 { Description = "Preset Recall Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PresetLabelStart")]
- public JoinDataComplete PresetLabelStart = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 20 }, new JoinMetadata { Description = "Preset Label Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
- [JoinName("PresetSaveStart")]
- public JoinDataComplete PresetSaveStart = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 20 }, new JoinMetadata { Description = "Preset Save Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 }, new JoinMetadata { Description = "Is Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PowerOn")]
+ public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 }, new JoinMetadata { Description = "Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PowerOff")]
+ public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 }, new JoinMetadata { Description = "Power Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("CameraModeAuto")]
- public JoinDataComplete CameraModeAuto = new JoinDataComplete(new JoinData { JoinNumber = 51, JoinSpan = 1 }, new JoinMetadata { Description = "Camera Mode Auto", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("CameraModeManual")]
- public JoinDataComplete CameraModeManual = new JoinDataComplete(new JoinData { JoinNumber = 52, JoinSpan = 1 }, new JoinMetadata { Description = "Camera Mode Manual", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("CameraModeOff")]
- public JoinDataComplete CameraModeOff = new JoinDataComplete(new JoinData { JoinNumber = 53, JoinSpan = 1 }, new JoinMetadata { Description = "Camera Mode Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("NumberOfPresets")]
+ public JoinDataComplete NumberOfPresets = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 }, new JoinMetadata { Description = "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 { Description = "Preset Recall Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PresetLabelStart")]
+ public JoinDataComplete PresetLabelStart = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 20 }, new JoinMetadata { Description = "Preset Label Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("PresetSaveStart")]
+ public JoinDataComplete PresetSaveStart = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 20 }, new JoinMetadata { Description = "Preset Save Start", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("SupportsCameraModeAuto")]
- public JoinDataComplete SupportsCameraModeAuto = new JoinDataComplete(new JoinData { JoinNumber = 55, JoinSpan = 1 }, new JoinMetadata { Description = "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 { Description = "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 { Description = "Supports Presets", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("CameraModeAuto")]
+ public JoinDataComplete CameraModeAuto = new JoinDataComplete(new JoinData { JoinNumber = 51, JoinSpan = 1 }, new JoinMetadata { Description = "Camera Mode Auto", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("CameraModeManual")]
+ public JoinDataComplete CameraModeManual = new JoinDataComplete(new JoinData { JoinNumber = 52, JoinSpan = 1 }, new JoinMetadata { Description = "Camera Mode Manual", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("CameraModeOff")]
+ public JoinDataComplete CameraModeOff = new JoinDataComplete(new JoinData { JoinNumber = 53, JoinSpan = 1 }, new JoinMetadata { Description = "Camera Mode Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public CameraControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(CameraControllerJoinMap))
- {
- }
+ [JoinName("SupportsCameraModeAuto")]
+ public JoinDataComplete SupportsCameraModeAuto = new JoinDataComplete(new JoinData { JoinNumber = 55, JoinSpan = 1 }, new JoinMetadata { Description = "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 { Description = "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 { Description = "Supports Presets", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected CameraControllerJoinMap(uint joinStart, Type type) : base(joinStart, type){}
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public CameraControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(CameraControllerJoinMap))
+ {
}
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected CameraControllerJoinMap(uint joinStart, Type type) : base(joinStart, type){}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/CenOdtOccupancySensorBaseJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/CenOdtOccupancySensorBaseJoinMap.cs
index e306bf85f..b585916bb 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/CenOdtOccupancySensorBaseJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/CenOdtOccupancySensorBaseJoinMap.cs
@@ -1,198 +1,196 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
-{
- public class CenOdtOccupancySensorBaseJoinMap : JoinMapBaseAdvanced
- {
- #region Digitals
+namespace PepperDash.Essentials.Core.Bridges;
- [JoinName("Online")]
- public JoinDataComplete Online = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+public class CenOdtOccupancySensorBaseJoinMap : JoinMapBaseAdvanced
+{
+ #region Digitals
- [JoinName("ForceOccupied")]
- public JoinDataComplete ForceOccupied = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Force Occupied", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Online")]
+ public JoinDataComplete Online = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ForceVacant")]
- public JoinDataComplete ForceVacant = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Force Vacant", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ForceOccupied")]
+ public JoinDataComplete ForceOccupied = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Force Occupied", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("EnableRawStates")]
- public JoinDataComplete EnableRawStates = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Enable Raw States", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ForceVacant")]
+ public JoinDataComplete ForceVacant = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Force Vacant", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RoomOccupiedFeedback")]
- public JoinDataComplete RoomOccupiedFeedback = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Room Occupied Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnableRawStates")]
+ public JoinDataComplete EnableRawStates = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Enable Raw States", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("GraceOccupancyDetectedFeedback")]
- public JoinDataComplete GraceOccupancyDetectedFeedback = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Grace Occupancy Detected Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("RoomOccupiedFeedback")]
+ public JoinDataComplete RoomOccupiedFeedback = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Room Occupied Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RoomVacantFeedback")]
- public JoinDataComplete RoomVacantFeedback = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Room Vacant Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("GraceOccupancyDetectedFeedback")]
+ public JoinDataComplete GraceOccupancyDetectedFeedback = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Grace Occupancy Detected Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RawOccupancyFeedback")]
- public JoinDataComplete RawOccupancyFeedback = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Raw Occupancy Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("RoomVacantFeedback")]
+ public JoinDataComplete RoomVacantFeedback = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Room Vacant Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RawOccupancyPirFeedback")]
- public JoinDataComplete RawOccupancyPirFeedback = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "Raw Occupancy Pir Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("RawOccupancyFeedback")]
+ public JoinDataComplete RawOccupancyFeedback = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Raw Occupancy Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RawOccupancyUsFeedback")]
- public JoinDataComplete RawOccupancyUsFeedback = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "Raw Occupancy Us Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("RawOccupancyPirFeedback")]
+ public JoinDataComplete RawOccupancyPirFeedback = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "Raw Occupancy Pir Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("IdentityModeOn")]
- public JoinDataComplete IdentityMode = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "Enable Identity Mode", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("RawOccupancyUsFeedback")]
+ public JoinDataComplete RawOccupancyUsFeedback = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "Raw Occupancy Us Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("IdentityModeFeedback")]
- public JoinDataComplete IdentityModeFeedback = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "Identity Mode Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IdentityModeOn")]
+ public JoinDataComplete IdentityMode = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "Enable Identity Mode", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("EnableLedFlash")]
- public JoinDataComplete EnableLedFlash = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Enable Led Flash", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IdentityModeFeedback")]
+ public JoinDataComplete IdentityModeFeedback = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "Identity Mode Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DisableLedFlash")]
- public JoinDataComplete DisableLedFlash = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "Disable Led Flash", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnableLedFlash")]
+ public JoinDataComplete EnableLedFlash = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Enable Led Flash", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("EnableShortTimeout")]
- public JoinDataComplete EnableShortTimeout = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "Enable Short Timeout", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DisableLedFlash")]
+ public JoinDataComplete DisableLedFlash = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "Disable Led Flash", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DisableShortTimeout")]
- public JoinDataComplete DisableShortTimeout = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "Disable Short Timeout", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnableShortTimeout")]
+ public JoinDataComplete EnableShortTimeout = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "Enable Short Timeout", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("OrWhenVacated")]
- public JoinDataComplete OrWhenVacated = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
- new JoinMetadata { Description = "Or When Vacated", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DisableShortTimeout")]
+ public JoinDataComplete DisableShortTimeout = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "Disable Short Timeout", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("AndWhenVacated")]
- public JoinDataComplete AndWhenVacated = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
- new JoinMetadata { Description = "AndWhenVacated", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("OrWhenVacated")]
+ public JoinDataComplete OrWhenVacated = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata { Description = "Or When Vacated", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("EnableUsA")]
- public JoinDataComplete EnableUsA = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
- new JoinMetadata { Description = "Enable Us A", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("AndWhenVacated")]
+ public JoinDataComplete AndWhenVacated = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
+ new JoinMetadata { Description = "AndWhenVacated", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DisableUsA")]
- public JoinDataComplete DisableUsA = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
- new JoinMetadata { Description = "Disable Us A", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnableUsA")]
+ public JoinDataComplete EnableUsA = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
+ new JoinMetadata { Description = "Enable Us A", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("EnableUsB")]
- public JoinDataComplete EnableUsB = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
- new JoinMetadata { Description = "Enable Us B", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DisableUsA")]
+ public JoinDataComplete DisableUsA = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
+ new JoinMetadata { Description = "Disable Us A", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DisableUsB")]
- public JoinDataComplete DisableUsB = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
- new JoinMetadata { Description = "Disable Us B", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnableUsB")]
+ public JoinDataComplete EnableUsB = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
+ new JoinMetadata { Description = "Enable Us B", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("EnablePir")]
- public JoinDataComplete EnablePir = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
- new JoinMetadata { Description = "Enable Pir", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DisableUsB")]
+ public JoinDataComplete DisableUsB = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
+ new JoinMetadata { Description = "Disable Us B", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DisablePir")]
- public JoinDataComplete DisablePir = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
- new JoinMetadata { Description = "Disable Pir", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnablePir")]
+ public JoinDataComplete EnablePir = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
+ new JoinMetadata { Description = "Enable Pir", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("IncrementUsInOccupiedState")]
- public JoinDataComplete IncrementUsInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
- new JoinMetadata { Description = "Increment Us In OccupiedState", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DisablePir")]
+ public JoinDataComplete DisablePir = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
+ new JoinMetadata { Description = "Disable Pir", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DecrementUsInOccupiedState")]
- public JoinDataComplete DecrementUsInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
- new JoinMetadata { Description = "Dencrement Us In Occupied State", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IncrementUsInOccupiedState")]
+ public JoinDataComplete IncrementUsInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
+ new JoinMetadata { Description = "Increment Us In OccupiedState", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("IncrementUsInVacantState")]
- public JoinDataComplete IncrementUsInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
- new JoinMetadata { Description = "Increment Us In VacantState", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DecrementUsInOccupiedState")]
+ public JoinDataComplete DecrementUsInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
+ new JoinMetadata { Description = "Dencrement Us In Occupied State", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DecrementUsInVacantState")]
- public JoinDataComplete DecrementUsInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
- new JoinMetadata { Description = "Decrement Us In VacantState", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IncrementUsInVacantState")]
+ public JoinDataComplete IncrementUsInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
+ new JoinMetadata { Description = "Increment Us In VacantState", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("IncrementPirInOccupiedState")]
- public JoinDataComplete IncrementPirInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
- new JoinMetadata { Description = "Increment Pir In Occupied State", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DecrementUsInVacantState")]
+ public JoinDataComplete DecrementUsInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
+ new JoinMetadata { Description = "Decrement Us In VacantState", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DecrementPirInOccupiedState")]
- public JoinDataComplete DecrementPirInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
- new JoinMetadata { Description = "Decrement Pir In OccupiedState", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IncrementPirInOccupiedState")]
+ public JoinDataComplete IncrementPirInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
+ new JoinMetadata { Description = "Increment Pir In Occupied State", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("IncrementPirInVacantState")]
- public JoinDataComplete IncrementPirInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
- new JoinMetadata { Description = "Increment Pir In Vacant State", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DecrementPirInOccupiedState")]
+ public JoinDataComplete DecrementPirInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
+ new JoinMetadata { Description = "Decrement Pir In OccupiedState", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DecrementPirInVacantState")]
- public JoinDataComplete DecrementPirInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
- new JoinMetadata { Description = "Decrement Pir In Vacant State", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IncrementPirInVacantState")]
+ public JoinDataComplete IncrementPirInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
+ new JoinMetadata { Description = "Increment Pir In Vacant State", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- #endregion
+ [JoinName("DecrementPirInVacantState")]
+ public JoinDataComplete DecrementPirInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
+ new JoinMetadata { Description = "Decrement Pir In Vacant State", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- #region Analog
+ #endregion
- [JoinName("Timeout")]
- public JoinDataComplete Timeout = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Timeout", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ #region Analog
- [JoinName("TimeoutLocalFeedback")]
- public JoinDataComplete TimeoutLocalFeedback = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Timeout Local Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("Timeout")]
+ public JoinDataComplete Timeout = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Timeout", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- [JoinName("InternalPhotoSensorValue")]
- public JoinDataComplete InternalPhotoSensorValue = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Internal PhotoSensor Value", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("TimeoutLocalFeedback")]
+ public JoinDataComplete TimeoutLocalFeedback = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Timeout Local Feedback", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
- [JoinName("UsSensitivityInOccupiedState")]
- public JoinDataComplete UsSensitivityInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Us Sensitivity In Occupied State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("InternalPhotoSensorValue")]
+ public JoinDataComplete InternalPhotoSensorValue = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Internal PhotoSensor Value", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- [JoinName("UsSensitivityInVacantState")]
- public JoinDataComplete UsSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "Us Sensitivity In Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("UsSensitivityInOccupiedState")]
+ public JoinDataComplete UsSensitivityInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Us Sensitivity In Occupied State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
- [JoinName("PirSensitivityInOccupiedState")]
- public JoinDataComplete PirSensitivityInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "Pir Sensitivity In Occupied State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("UsSensitivityInVacantState")]
+ public JoinDataComplete UsSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "Us Sensitivity In Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
- [JoinName("PirSensitivityInVacantState")]
- public JoinDataComplete PirSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "Pir Sensitivity In Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("PirSensitivityInOccupiedState")]
+ public JoinDataComplete PirSensitivityInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "Pir Sensitivity In Occupied State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
- #endregion
+ [JoinName("PirSensitivityInVacantState")]
+ public JoinDataComplete PirSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "Pir Sensitivity In Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
- #region Serial
+ #endregion
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ #region Serial
- #endregion
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public CenOdtOccupancySensorBaseJoinMap(uint joinStart)
- : this(joinStart, typeof(CenOdtOccupancySensorBaseJoinMap))
- {
- }
+ #endregion
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected CenOdtOccupancySensorBaseJoinMap(uint joinStart, Type type) : base(joinStart, type)
- {
- }
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public CenOdtOccupancySensorBaseJoinMap(uint joinStart)
+ : this(joinStart, typeof(CenOdtOccupancySensorBaseJoinMap))
+ {
}
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected CenOdtOccupancySensorBaseJoinMap(uint joinStart, Type type) : base(joinStart, type)
+ {
+ }
}
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DisplayControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DisplayControllerJoinMap.cs
index 8e51c952c..2ab95b8e6 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DisplayControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DisplayControllerJoinMap.cs
@@ -1,85 +1,84 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class DisplayControllerJoinMap : JoinMapBaseAdvanced
{
- public class DisplayControllerJoinMap : JoinMapBaseAdvanced
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("PowerOff")]
+ public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Power Off", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("PowerOn")]
+ public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("IsTwoWayDisplay")]
+ public JoinDataComplete IsTwoWayDisplay = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Is Two Way Display", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VolumeUp")]
+ public JoinDataComplete VolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Volume Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VolumeLevel")]
+ public JoinDataComplete VolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Volume Level", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("VolumeDown")]
+ public JoinDataComplete VolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "Volume Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VolumeMute")]
+ public JoinDataComplete VolumeMute = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "Volume Mute", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VolumeMuteOn")]
+ public JoinDataComplete VolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "Volume Mute On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VolumeMuteOff")]
+ public JoinDataComplete VolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
+ new JoinMetadata { Description = "Volume Mute Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("InputSelectOffset")]
+ public JoinDataComplete InputSelectOffset = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 10 },
+ new JoinMetadata { Description = "Input Select", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("InputNamesOffset")]
+ public JoinDataComplete InputNamesOffset = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 10 },
+ new JoinMetadata { Description = "Input Names Offset", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("InputSelect")]
+ public JoinDataComplete InputSelect = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Input Select", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("ButtonVisibilityOffset")]
+ public JoinDataComplete ButtonVisibilityOffset = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 10 },
+ new JoinMetadata { Description = "Button Visibility Offset", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalSerial });
+
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 50, JoinSpan = 1 },
+ new JoinMetadata { Description = "Is Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public DisplayControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(DisplayControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected DisplayControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
{
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("PowerOff")]
- public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Power Off", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("PowerOn")]
- public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("IsTwoWayDisplay")]
- public JoinDataComplete IsTwoWayDisplay = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Is Two Way Display", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VolumeUp")]
- public JoinDataComplete VolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Volume Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VolumeLevel")]
- public JoinDataComplete VolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Volume Level", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("VolumeDown")]
- public JoinDataComplete VolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "Volume Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VolumeMute")]
- public JoinDataComplete VolumeMute = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "Volume Mute", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VolumeMuteOn")]
- public JoinDataComplete VolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "Volume Mute On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VolumeMuteOff")]
- public JoinDataComplete VolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
- new JoinMetadata { Description = "Volume Mute Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("InputSelectOffset")]
- public JoinDataComplete InputSelectOffset = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 10 },
- new JoinMetadata { Description = "Input Select", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("InputNamesOffset")]
- public JoinDataComplete InputNamesOffset = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 10 },
- new JoinMetadata { Description = "Input Names Offset", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("InputSelect")]
- public JoinDataComplete InputSelect = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Input Select", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("ButtonVisibilityOffset")]
- public JoinDataComplete ButtonVisibilityOffset = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 10 },
- new JoinMetadata { Description = "Button Visibility Offset", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalSerial });
-
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 50, JoinSpan = 1 },
- new JoinMetadata { Description = "Is Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public DisplayControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(DisplayControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected DisplayControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
- {
- }
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmBladeChassisControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmBladeChassisControllerJoinMap.cs
index 3a4c42559..3edd12229 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmBladeChassisControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmBladeChassisControllerJoinMap.cs
@@ -1,74 +1,73 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges {
- public class DmBladeChassisControllerJoinMap : JoinMapBaseAdvanced {
-
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "DM Blade Chassis Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VideoSyncStatus")]
- public JoinDataComplete VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Input Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("InputEndpointOnline")]
- public JoinDataComplete InputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Input Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutputEndpointOnline")]
- public JoinDataComplete OutputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Output Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("TxAdvancedIsPresent")]
- public JoinDataComplete TxAdvancedIsPresent = new JoinDataComplete(new JoinData { JoinNumber = 1001, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Tx Advanced Is Present", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutputVideo")]
- public JoinDataComplete OutputVideo = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Output Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("HdcpSupportState")]
- public JoinDataComplete HdcpSupportState = new JoinDataComplete(new JoinData { JoinNumber = 1001, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Input HDCP Support State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("HdcpSupportCapability")]
- public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 1201, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Input HDCP Support Capability", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("InputNames")]
- public JoinDataComplete InputNames = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("OutputNames")]
- public JoinDataComplete OutputNames = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Output Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("OutputCurrentVideoInputNames")]
- public JoinDataComplete OutputCurrentVideoInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2001, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Video Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("InputCurrentResolution")]
- public JoinDataComplete InputCurrentResolution = new JoinDataComplete(new JoinData { JoinNumber = 2401, JoinSpan = 128 },
- new JoinMetadata { Description = "DM Blade Chassis Input Current Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public DmBladeChassisControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(DmBladeChassisControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected DmBladeChassisControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
- {
- }
+namespace PepperDash.Essentials.Core.Bridges;
+public class DmBladeChassisControllerJoinMap : JoinMapBaseAdvanced {
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM Blade Chassis Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VideoSyncStatus")]
+ public JoinDataComplete VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Input Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("InputEndpointOnline")]
+ public JoinDataComplete InputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Input Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutputEndpointOnline")]
+ public JoinDataComplete OutputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Output Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("TxAdvancedIsPresent")]
+ public JoinDataComplete TxAdvancedIsPresent = new JoinDataComplete(new JoinData { JoinNumber = 1001, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Tx Advanced Is Present", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutputVideo")]
+ public JoinDataComplete OutputVideo = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Output Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("HdcpSupportState")]
+ public JoinDataComplete HdcpSupportState = new JoinDataComplete(new JoinData { JoinNumber = 1001, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Input HDCP Support State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("HdcpSupportCapability")]
+ public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 1201, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Input HDCP Support Capability", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("InputNames")]
+ public JoinDataComplete InputNames = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("OutputNames")]
+ public JoinDataComplete OutputNames = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Output Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("OutputCurrentVideoInputNames")]
+ public JoinDataComplete OutputCurrentVideoInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2001, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Video Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("InputCurrentResolution")]
+ public JoinDataComplete InputCurrentResolution = new JoinDataComplete(new JoinData { JoinNumber = 2401, JoinSpan = 128 },
+ new JoinMetadata { Description = "DM Blade Chassis Input Current Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public DmBladeChassisControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(DmBladeChassisControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected DmBladeChassisControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
+ {
}
+
}
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmChassisControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmChassisControllerJoinMap.cs
index 539e8d29d..db3701b33 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmChassisControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmChassisControllerJoinMap.cs
@@ -1,170 +1,169 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class DmChassisControllerJoinMap : JoinMapBaseAdvanced
{
- public class DmChassisControllerJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("EnableAudioBreakaway")]
- public JoinDataComplete EnableAudioBreakaway = new JoinDataComplete(
- new JoinData {JoinNumber = 4, JoinSpan = 1},
- new JoinMetadata
- {
- Description = "DM Chassis enable audio breakaway routing",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
+ [JoinName("EnableAudioBreakaway")]
+ public JoinDataComplete EnableAudioBreakaway = new JoinDataComplete(
+ new JoinData {JoinNumber = 4, JoinSpan = 1},
+ new JoinMetadata
+ {
+ Description = "DM Chassis enable audio breakaway routing",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("EnableUsbBreakaway")]
+ public JoinDataComplete EnableUsbBreakaway = new JoinDataComplete(
+ new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata
+ {
+ Description = "DM Chassis enable USB breakaway routing",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
- [JoinName("EnableUsbBreakaway")]
- public JoinDataComplete EnableUsbBreakaway = new JoinDataComplete(
- new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata
- {
- Description = "DM Chassis enable USB breakaway routing",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM Chassis Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "DM Chassis Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("SystemId")]
- public JoinDataComplete SystemId = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
- new JoinMetadata { Description = "DM Chassis SystemId Get/Set/Trigger/", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalAnalog });
-
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "DM Chassis Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VideoSyncStatus")]
- public JoinDataComplete VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Input Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("InputEndpointOnline")]
- public JoinDataComplete InputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Input Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutputEndpointOnline")]
- public JoinDataComplete OutputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("TxAdvancedIsPresent")]
- public JoinDataComplete TxAdvancedIsPresent = new JoinDataComplete(new JoinData { JoinNumber = 1001, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Tx Advanced Is Present", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutputDisabledByHdcp")]
- public JoinDataComplete OutputDisabledByHdcp = new JoinDataComplete(new JoinData { JoinNumber = 1201, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output Disabled by HDCP", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutputVideo")]
- public JoinDataComplete OutputVideo = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output Video Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("OutputAudio")]
- public JoinDataComplete OutputAudio = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output Audio Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("OutputUsb")]
- public JoinDataComplete OutputUsb = new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output USB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("InputUsb")]
- public JoinDataComplete InputUsb = new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Input Usb Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("HdcpSupportState")]
- public JoinDataComplete HdcpSupportState = new JoinDataComplete(new JoinData { JoinNumber = 1001, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Input HDCP Support State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("HdcpSupportCapability")]
- public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 1201, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Input HDCP Support Capability", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("InputStreamCardState")]
- public JoinDataComplete InputStreamCardState = new JoinDataComplete(new JoinData { JoinNumber = 1501, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Stream Input Start (1), Stop (2), Pause (3) with Feedback", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("OutputStreamCardState")]
- public JoinDataComplete OutputStreamCardState = new JoinDataComplete(new JoinData { JoinNumber = 1601, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Stream Output Start (1), Stop (2), Pause (3) with Feedback", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("NoRouteName")]
- public JoinDataComplete NoRouteName = new JoinDataComplete(new JoinData { JoinNumber = 100, JoinSpan = 1 },
- new JoinMetadata { Description = "DM Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("InputNames")]
- public JoinDataComplete InputNames = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("OutputNames")]
- public JoinDataComplete OutputNames = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("InputVideoNames")] public JoinDataComplete InputVideoNames =
- new JoinDataComplete(new JoinData {JoinNumber = 501, JoinSpan = 200},
- new JoinMetadata
- {
- Description = "DM Chassis Video Input Names",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("InputAudioNames")]
- public JoinDataComplete InputAudioNames =
- new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 200 },
- new JoinMetadata
- {
- Description = "DM Chassis Audio Input Names",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Serial
- });
- [JoinName("OutputVideoNames")]
- public JoinDataComplete OutputVideoNames =
- new JoinDataComplete(new JoinData { JoinNumber = 901, JoinSpan = 200 },
- new JoinMetadata
- {
- Description = "DM Chassis Video Output Names",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Serial
- });
- [JoinName("OutputAudioNames")]
- public JoinDataComplete OutputAudioNames =
- new JoinDataComplete(new JoinData { JoinNumber = 1101, JoinSpan = 200 },
+ [JoinName("SystemId")]
+ public JoinDataComplete SystemId = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM Chassis SystemId Get/Set/Trigger/", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalAnalog });
+
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM Chassis Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VideoSyncStatus")]
+ public JoinDataComplete VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Input Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("InputEndpointOnline")]
+ public JoinDataComplete InputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Input Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutputEndpointOnline")]
+ public JoinDataComplete OutputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("TxAdvancedIsPresent")]
+ public JoinDataComplete TxAdvancedIsPresent = new JoinDataComplete(new JoinData { JoinNumber = 1001, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Tx Advanced Is Present", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutputDisabledByHdcp")]
+ public JoinDataComplete OutputDisabledByHdcp = new JoinDataComplete(new JoinData { JoinNumber = 1201, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output Disabled by HDCP", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutputVideo")]
+ public JoinDataComplete OutputVideo = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output Video Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("OutputAudio")]
+ public JoinDataComplete OutputAudio = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output Audio Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("OutputUsb")]
+ public JoinDataComplete OutputUsb = new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output USB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("InputUsb")]
+ public JoinDataComplete InputUsb = new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Input Usb Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("HdcpSupportState")]
+ public JoinDataComplete HdcpSupportState = new JoinDataComplete(new JoinData { JoinNumber = 1001, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Input HDCP Support State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("HdcpSupportCapability")]
+ public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 1201, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Input HDCP Support Capability", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("InputStreamCardState")]
+ public JoinDataComplete InputStreamCardState = new JoinDataComplete(new JoinData { JoinNumber = 1501, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Stream Input Start (1), Stop (2), Pause (3) with Feedback", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("OutputStreamCardState")]
+ public JoinDataComplete OutputStreamCardState = new JoinDataComplete(new JoinData { JoinNumber = 1601, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Stream Output Start (1), Stop (2), Pause (3) with Feedback", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("NoRouteName")]
+ public JoinDataComplete NoRouteName = new JoinDataComplete(new JoinData { JoinNumber = 100, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("InputNames")]
+ public JoinDataComplete InputNames = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("OutputNames")]
+ public JoinDataComplete OutputNames = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("InputVideoNames")] public JoinDataComplete InputVideoNames =
+ new JoinDataComplete(new JoinData {JoinNumber = 501, JoinSpan = 200},
new JoinMetadata
{
- Description = "DM Chassis Audio Output Names",
+ Description = "DM Chassis Video Input Names",
JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
JoinType = eJoinType.Serial
});
- [JoinName("OutputCurrentVideoInputNames")]
- public JoinDataComplete OutputCurrentVideoInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2001, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Video Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("OutputCurrentAudioInputNames")]
- public JoinDataComplete OutputCurrentAudioInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2201, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Audio Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("InputCurrentResolution")]
- public JoinDataComplete InputCurrentResolution = new JoinDataComplete(new JoinData { JoinNumber = 2401, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Input Current Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public DmChassisControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(DmChassisControllerJoinMap))
+ [JoinName("InputAudioNames")]
+ public JoinDataComplete InputAudioNames =
+ new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 200 },
+ new JoinMetadata
{
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected DmChassisControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
+ Description = "DM Chassis Audio Input Names",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Serial
+ });
+ [JoinName("OutputVideoNames")]
+ public JoinDataComplete OutputVideoNames =
+ new JoinDataComplete(new JoinData { JoinNumber = 901, JoinSpan = 200 },
+ new JoinMetadata
{
- }
+ Description = "DM Chassis Video Output Names",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Serial
+ });
+ [JoinName("OutputAudioNames")]
+ public JoinDataComplete OutputAudioNames =
+ new JoinDataComplete(new JoinData { JoinNumber = 1101, JoinSpan = 200 },
+ new JoinMetadata
+ {
+ Description = "DM Chassis Audio Output Names",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("OutputCurrentVideoInputNames")]
+ public JoinDataComplete OutputCurrentVideoInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2001, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Video Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("OutputCurrentAudioInputNames")]
+ public JoinDataComplete OutputCurrentAudioInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2201, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Audio Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("InputCurrentResolution")]
+ public JoinDataComplete InputCurrentResolution = new JoinDataComplete(new JoinData { JoinNumber = 2401, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Input Current Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public DmChassisControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(DmChassisControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected DmChassisControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
+ {
}
}
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmRmcControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmRmcControllerJoinMap.cs
index bdcc3a696..4ddb9ff41 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmRmcControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmRmcControllerJoinMap.cs
@@ -1,92 +1,91 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class DmRmcControllerJoinMap : JoinMapBaseAdvanced
{
- public class DmRmcControllerJoinMap : JoinMapBaseAdvanced
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VideoMuteOn")]
+ public JoinDataComplete VideoMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC Mute Video", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VideoMuteOff")]
+ public JoinDataComplete VideoMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC UnMute Video", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VideoMuteToggle")]
+ public JoinDataComplete VideoMuteToggle = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC Mute Video Toggle", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("CurrentOutputResolution")]
+ public JoinDataComplete CurrentOutputResolution = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC Current Output Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("EdidManufacturer")]
+ public JoinDataComplete EdidManufacturer = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC EDID Manufacturer", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("EdidName")]
+ public JoinDataComplete EdidName = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC EDID Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("EdidPrefferedTiming")]
+ public JoinDataComplete EdidPrefferedTiming = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC EDID Preferred Timing", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("EdidSerialNumber")]
+ public JoinDataComplete EdidSerialNumber = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC EDID Serial Number", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("AudioVideoSource")]
+ public JoinDataComplete AudioVideoSource = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC Audio Video Source Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("HdcpSupportCapability")]
+ public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC HDCP Support Capability", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("Port1HdcpState")]
+ public JoinDataComplete Port1HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC Port 1 (DM) HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("Port2HdcpState")]
+ public JoinDataComplete Port2HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Port 2 (HDMI) HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("HdmiInputSync")]
+ public JoinDataComplete HdmiInputSync = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM RMC HDMI Input Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("HdcpInputPortCount")]
+ public JoinDataComplete HdcpInputPortCount = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Number of Input Ports that support HDCP", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public DmRmcControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(DmRmcControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected DmRmcControllerJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
{
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VideoMuteOn")]
- public JoinDataComplete VideoMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC Mute Video", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VideoMuteOff")]
- public JoinDataComplete VideoMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC UnMute Video", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VideoMuteToggle")]
- public JoinDataComplete VideoMuteToggle = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC Mute Video Toggle", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("CurrentOutputResolution")]
- public JoinDataComplete CurrentOutputResolution = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC Current Output Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("EdidManufacturer")]
- public JoinDataComplete EdidManufacturer = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC EDID Manufacturer", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("EdidName")]
- public JoinDataComplete EdidName = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC EDID Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("EdidPrefferedTiming")]
- public JoinDataComplete EdidPrefferedTiming = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC EDID Preferred Timing", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("EdidSerialNumber")]
- public JoinDataComplete EdidSerialNumber = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC EDID Serial Number", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("AudioVideoSource")]
- public JoinDataComplete AudioVideoSource = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC Audio Video Source Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("HdcpSupportCapability")]
- public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC HDCP Support Capability", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Port1HdcpState")]
- public JoinDataComplete Port1HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC Port 1 (DM) HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Port2HdcpState")]
- public JoinDataComplete Port2HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Port 2 (HDMI) HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("HdmiInputSync")]
- public JoinDataComplete HdmiInputSync = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "DM RMC HDMI Input Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("HdcpInputPortCount")]
- public JoinDataComplete HdcpInputPortCount = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Number of Input Ports that support HDCP", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
-
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public DmRmcControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(DmRmcControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected DmRmcControllerJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmTxControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmTxControllerJoinMap.cs
index c6f8f89fb..8fb99f330 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmTxControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmTxControllerJoinMap.cs
@@ -1,96 +1,95 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class DmTxControllerJoinMap : JoinMapBaseAdvanced
{
- public class DmTxControllerJoinMap : JoinMapBaseAdvanced
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VideoSyncStatus")]
+ public JoinDataComplete VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("FreeRunEnabled")]
+ public JoinDataComplete FreeRunEnabled = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Enable Free Run Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Input1VideoSyncStatus")]
+ public JoinDataComplete Input1VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Input 1 Video Sync Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Input2VideoSyncStatus")]
+ public JoinDataComplete Input2VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Input 2 Video Sync Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Input3VideoSyncStatus")]
+ public JoinDataComplete Input3VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "Input 3 Video Sync Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("CurrentInputResolution")]
+ public JoinDataComplete CurrentInputResolution = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Current Input Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("VideoInput")]
+ public JoinDataComplete VideoInput = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Video Input Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("AudioInput")]
+ public JoinDataComplete AudioInput = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Audio Input Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("HdcpSupportCapability")]
+ public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX HDCP Support Capability", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("Port1HdcpState")]
+ public JoinDataComplete Port1HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Port 1 HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("Port2HdcpState")]
+ public JoinDataComplete Port2HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Port 2 HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("VgaBrightness")]
+ public JoinDataComplete VgaBrightness = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX VGA Brightness", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("VgaContrast")]
+ public JoinDataComplete VgaContrast = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Online", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("Port3HdcpState")]
+ public JoinDataComplete Port3HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "DM TX Port 3 HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("HdcpInputPortCount")]
+ public JoinDataComplete HdcpInputPortCount = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
+ new JoinMetadata { Description = "Number of Input Ports that support HDCP", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public DmTxControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(DmTxControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected DmTxControllerJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
{
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VideoSyncStatus")]
- public JoinDataComplete VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("FreeRunEnabled")]
- public JoinDataComplete FreeRunEnabled = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Enable Free Run Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Input1VideoSyncStatus")]
- public JoinDataComplete Input1VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Input 1 Video Sync Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Input2VideoSyncStatus")]
- public JoinDataComplete Input2VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Input 2 Video Sync Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Input3VideoSyncStatus")]
- public JoinDataComplete Input3VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "Input 3 Video Sync Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("CurrentInputResolution")]
- public JoinDataComplete CurrentInputResolution = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Current Input Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("VideoInput")]
- public JoinDataComplete VideoInput = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Video Input Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("AudioInput")]
- public JoinDataComplete AudioInput = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Audio Input Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("HdcpSupportCapability")]
- public JoinDataComplete HdcpSupportCapability = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX HDCP Support Capability", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Port1HdcpState")]
- public JoinDataComplete Port1HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Port 1 HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Port2HdcpState")]
- public JoinDataComplete Port2HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Port 2 HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("VgaBrightness")]
- public JoinDataComplete VgaBrightness = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX VGA Brightness", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("VgaContrast")]
- public JoinDataComplete VgaContrast = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Online", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Port3HdcpState")]
- public JoinDataComplete Port3HdcpState = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "DM TX Port 3 HDCP State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("HdcpInputPortCount")]
- public JoinDataComplete HdcpInputPortCount = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
- new JoinMetadata { Description = "Number of Input Ports that support HDCP", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
-
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public DmTxControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(DmTxControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected DmTxControllerJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
index 11509acf4..9ad046912 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
@@ -1,174 +1,173 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class DmpsAudioOutputControllerJoinMap : JoinMapBaseAdvanced
{
- public class DmpsAudioOutputControllerJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("MasterVolumeLevel")]
- public JoinDataComplete MasterVolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Master Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("MasterVolumeLevel")]
+ public JoinDataComplete MasterVolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Master Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MasterVolumeLevelScaled")]
+ public JoinDataComplete MasterVolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Master Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MixerPresetRecall")]
+ public JoinDataComplete MixerPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mixer Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MixerEqPresetRecall")]
+ public JoinDataComplete MixerEqPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mixer Eq Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MasterVolumeMuteOn")]
+ public JoinDataComplete MasterVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Master Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MasterVolumeMuteOff")]
+ public JoinDataComplete MasterVolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Master Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MasterVolumeUp")]
+ public JoinDataComplete MasterVolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Master Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MasterVolumeDown")]
+ public JoinDataComplete MasterVolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Master Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MasterVolumeLevelScaledSend")]
+ public JoinDataComplete MasterVolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Master Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("SourceVolumeLevel")]
+ public JoinDataComplete SourceVolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Source Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("SourceVolumeLevelScaled")]
+ public JoinDataComplete SourceVolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "Source Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("SourceVolumeMuteOn")]
+ public JoinDataComplete SourceVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Source Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("SourceVolumeMuteOff")]
+ public JoinDataComplete SourceVolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "Source Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("SourceVolumeUp")]
+ public JoinDataComplete SourceVolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "Source Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("MasterVolumeLevelScaled")]
- public JoinDataComplete MasterVolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Master Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("SourceVolumeDown")]
+ public JoinDataComplete SourceVolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "Source Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("MixerPresetRecall")]
- public JoinDataComplete MixerPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Mixer Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("SourceVolumeLevelScaledSend")]
+ public JoinDataComplete SourceVolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata { Description = "Source Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("MixerEqPresetRecall")]
- public JoinDataComplete MixerEqPresetRecall = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Mixer Eq Preset Recall Set", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("Codec1VolumeLevel")]
+ public JoinDataComplete Codec1VolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec1 Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- [JoinName("MasterVolumeMuteOn")]
- public JoinDataComplete MasterVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Master Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Codec1VolumeLevelScaled")]
+ public JoinDataComplete Codec1VolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec1 Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- [JoinName("MasterVolumeMuteOff")]
- public JoinDataComplete MasterVolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Master Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Codec1VolumeMuteOn")]
+ public JoinDataComplete Codec1VolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec1 Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("MasterVolumeUp")]
- public JoinDataComplete MasterVolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Master Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Codec1VolumeMuteOff")]
+ public JoinDataComplete Codec1VolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec1 Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("MasterVolumeDown")]
- public JoinDataComplete MasterVolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Master Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Codec1VolumeUp")]
+ public JoinDataComplete Codec1VolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec1 Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("MasterVolumeLevelScaledSend")]
- public JoinDataComplete MasterVolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Master Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Codec1VolumeDown")]
+ public JoinDataComplete Codec1VolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec1 Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("SourceVolumeLevel")]
- public JoinDataComplete SourceVolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Source Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("Codec1VolumeLevelScaledSend")]
+ public JoinDataComplete Codec1VolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec1 Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("SourceVolumeLevelScaled")]
- public JoinDataComplete SourceVolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "Source Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("Codec2VolumeLevel")]
+ public JoinDataComplete Codec2VolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec2 Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- [JoinName("SourceVolumeMuteOn")]
- public JoinDataComplete SourceVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Source Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Codec2VolumeLevelScaled")]
+ public JoinDataComplete Codec2VolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec2 Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- [JoinName("SourceVolumeMuteOff")]
- public JoinDataComplete SourceVolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "Source Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Codec2VolumeMuteOn")]
+ public JoinDataComplete Codec2VolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec2 Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("SourceVolumeUp")]
- public JoinDataComplete SourceVolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "Source Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("SourceVolumeDown")]
- public JoinDataComplete SourceVolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "Source Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("SourceVolumeLevelScaledSend")]
- public JoinDataComplete SourceVolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
- new JoinMetadata { Description = "Source Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec1VolumeLevel")]
- public JoinDataComplete Codec1VolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec1 Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Codec1VolumeLevelScaled")]
- public JoinDataComplete Codec1VolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec1 Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Codec1VolumeMuteOn")]
- public JoinDataComplete Codec1VolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec1 Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec1VolumeMuteOff")]
- public JoinDataComplete Codec1VolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec1 Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec1VolumeUp")]
- public JoinDataComplete Codec1VolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec1 Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec1VolumeDown")]
- public JoinDataComplete Codec1VolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec1 Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec1VolumeLevelScaledSend")]
- public JoinDataComplete Codec1VolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec1 Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec2VolumeLevel")]
- public JoinDataComplete Codec2VolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec2 Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Codec2VolumeLevelScaled")]
- public JoinDataComplete Codec2VolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec2 Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Codec2VolumeMuteOn")]
- public JoinDataComplete Codec2VolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec2 Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec2VolumeMuteOff")]
- public JoinDataComplete Codec2VolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec2 Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec2VolumeUp")]
- public JoinDataComplete Codec2VolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 33, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec2 Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec2VolumeDown")]
- public JoinDataComplete Codec2VolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 34, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec2 Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Codec2VolumeLevelScaledSend")]
- public JoinDataComplete Codec2VolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 35, JoinSpan = 1 },
- new JoinMetadata { Description = "Codec2 Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("MicsMasterVolumeLevel")]
- public JoinDataComplete MicsMasterVolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
- new JoinMetadata { Description = "MicsMaster Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("MicsMasterVolumeLevelScaled")]
- public JoinDataComplete MicsMasterVolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
- new JoinMetadata { Description = "MicsMaster Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("MicsMasterVolumeMuteOn")]
- public JoinDataComplete MicsMasterVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
- new JoinMetadata { Description = "MicsMaster Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("MicsMasterVolumeMuteOff")]
- public JoinDataComplete MicsMasterVolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
- new JoinMetadata { Description = "MicsMaster Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("MicsMasterVolumeUp")]
- public JoinDataComplete MicsMasterVolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
- new JoinMetadata { Description = "MicsMaster Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("MicsMasterVolumeDown")]
- public JoinDataComplete MicsMasterVolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 44, JoinSpan = 1 },
- new JoinMetadata { Description = "MicsMaster Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("MicsMasterVolumeLevelScaledSend")]
- public JoinDataComplete MicsMasterVolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 45, JoinSpan = 1 },
- new JoinMetadata { Description = "Mics Master Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public DmpsAudioOutputControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(DmpsAudioOutputControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected DmpsAudioOutputControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
- {
- }
+ [JoinName("Codec2VolumeMuteOff")]
+ public JoinDataComplete Codec2VolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec2 Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Codec2VolumeUp")]
+ public JoinDataComplete Codec2VolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 33, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec2 Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Codec2VolumeDown")]
+ public JoinDataComplete Codec2VolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 34, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec2 Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Codec2VolumeLevelScaledSend")]
+ public JoinDataComplete Codec2VolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 35, JoinSpan = 1 },
+ new JoinMetadata { Description = "Codec2 Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicsMasterVolumeLevel")]
+ public JoinDataComplete MicsMasterVolumeLevel = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
+ new JoinMetadata { Description = "MicsMaster Volume Signed dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MicsMasterVolumeLevelScaled")]
+ public JoinDataComplete MicsMasterVolumeLevelScaled = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
+ new JoinMetadata { Description = "MicsMaster Volume 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MicsMasterVolumeMuteOn")]
+ public JoinDataComplete MicsMasterVolumeMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
+ new JoinMetadata { Description = "MicsMaster Volume Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicsMasterVolumeMuteOff")]
+ public JoinDataComplete MicsMasterVolumeMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
+ new JoinMetadata { Description = "MicsMaster Volume Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicsMasterVolumeUp")]
+ public JoinDataComplete MicsMasterVolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
+ new JoinMetadata { Description = "MicsMaster Volume Level Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicsMasterVolumeDown")]
+ public JoinDataComplete MicsMasterVolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 44, JoinSpan = 1 },
+ new JoinMetadata { Description = "MicsMaster Volume Level Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicsMasterVolumeLevelScaledSend")]
+ public JoinDataComplete MicsMasterVolumeLevelScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 45, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mics Master Volume Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public DmpsAudioOutputControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(DmpsAudioOutputControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected DmpsAudioOutputControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsMicrophoneControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsMicrophoneControllerJoinMap.cs
index 6922c569d..90efc9648 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsMicrophoneControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsMicrophoneControllerJoinMap.cs
@@ -1,50 +1,49 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class DmpsMicrophoneControllerJoinMap : JoinMapBaseAdvanced
{
- public class DmpsMicrophoneControllerJoinMap : JoinMapBaseAdvanced
+ [JoinName("MicGain")]
+ public JoinDataComplete MicGain = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Gain dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MicGainScaled")]
+ public JoinDataComplete MicGainScaled = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Gain 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("MicMuteOn")]
+ public JoinDataComplete MicMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicMuteOff")]
+ public JoinDataComplete MicMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicGainScaledSend")]
+ public JoinDataComplete MicGainScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Gain Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("MicName")]
+ public JoinDataComplete MicName = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mic Name Get", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public DmpsMicrophoneControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(DmpsMicrophoneControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected DmpsMicrophoneControllerJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
{
- [JoinName("MicGain")]
- public JoinDataComplete MicGain = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Mic Gain dB Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("MicGainScaled")]
- public JoinDataComplete MicGainScaled = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Mic Gain 16bit Scaled Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("MicMuteOn")]
- public JoinDataComplete MicMuteOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Mic Mute On Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("MicMuteOff")]
- public JoinDataComplete MicMuteOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Mic Mute Off Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("MicGainScaledSend")]
- public JoinDataComplete MicGainScaledSend = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Mic Gain Scaled Send Enable/Disable", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("MicName")]
- public JoinDataComplete MicName = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Mic Name Get", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public DmpsMicrophoneControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(DmpsMicrophoneControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected DmpsMicrophoneControllerJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs
index a0d8d7b88..e39e38c61 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs
@@ -1,123 +1,122 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class DmpsRoutingControllerJoinMap : JoinMapBaseAdvanced
{
- public class DmpsRoutingControllerJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("EnableRouting")]
- public JoinDataComplete EnableRouting = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "DMPS Enable Audio and Video Routing", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("SystemPowerOn")]
- public JoinDataComplete SystemPowerOn = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "DMPS System Power On Get/Set", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("SystemPowerOff")]
- public JoinDataComplete SystemPowerOff = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "DMPS System Power Off Get/Set", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("FrontPanelLockOn")]
- public JoinDataComplete FrontPanelLockOn = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "DMPS Front Panel Lock On Get/Set", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("FrontPanelLockOff")]
- public JoinDataComplete FrontPanelLockOff = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
- new JoinMetadata { Description = "DMPS Front Panel Lock Off Get/Set", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VideoSyncStatus")]
- public JoinDataComplete VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Input Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("InputEndpointOnline")]
- public JoinDataComplete InputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Input Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutputEndpointOnline")]
- public JoinDataComplete OutputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutputVideo")]
- public JoinDataComplete OutputVideo = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output Video Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("OutputAudio")]
- public JoinDataComplete OutputAudio = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output Audio Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("InputNames")]
- public JoinDataComplete InputNames = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("OutputNames")]
- public JoinDataComplete OutputNames = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Output Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("InputVideoNames")]
- public JoinDataComplete InputVideoNames =
- new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 32 },
- new JoinMetadata
- {
- Description = "Video Input Name",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("InputAudioNames")]
- public JoinDataComplete InputAudioNames =
- new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 32 },
- new JoinMetadata
- {
- Description = "Audio Input Name",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
- [JoinName("OutputVideoNames")]
- public JoinDataComplete OutputVideoNames =
- new JoinDataComplete(new JoinData { JoinNumber = 901, JoinSpan = 32 },
- new JoinMetadata
- {
- Description = "Video Output Name",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
- [JoinName("OutputAudioNames")]
- public JoinDataComplete OutputAudioNames =
- new JoinDataComplete(new JoinData { JoinNumber = 1101, JoinSpan = 32 },
- new JoinMetadata
- {
- Description = "Audio Output Name",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("OutputCurrentVideoInputNames")]
- public JoinDataComplete OutputCurrentVideoInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2001, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Video Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("OutputCurrentAudioInputNames")]
- public JoinDataComplete OutputCurrentAudioInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2201, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Audio Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("InputCurrentResolution")]
- public JoinDataComplete InputCurrentResolution = new JoinDataComplete(new JoinData { JoinNumber = 2401, JoinSpan = 32 },
- new JoinMetadata { Description = "DM Chassis Input Current Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public DmpsRoutingControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(DmpsRoutingControllerJoinMap))
+ [JoinName("EnableRouting")]
+ public JoinDataComplete EnableRouting = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "DMPS Enable Audio and Video Routing", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("SystemPowerOn")]
+ public JoinDataComplete SystemPowerOn = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "DMPS System Power On Get/Set", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("SystemPowerOff")]
+ public JoinDataComplete SystemPowerOff = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "DMPS System Power Off Get/Set", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("FrontPanelLockOn")]
+ public JoinDataComplete FrontPanelLockOn = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "DMPS Front Panel Lock On Get/Set", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("FrontPanelLockOff")]
+ public JoinDataComplete FrontPanelLockOff = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata { Description = "DMPS Front Panel Lock Off Get/Set", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VideoSyncStatus")]
+ public JoinDataComplete VideoSyncStatus = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Input Video Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("InputEndpointOnline")]
+ public JoinDataComplete InputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Input Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutputEndpointOnline")]
+ public JoinDataComplete OutputEndpointOnline = new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output Endpoint Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutputVideo")]
+ public JoinDataComplete OutputVideo = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output Video Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("OutputAudio")]
+ public JoinDataComplete OutputAudio = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output Audio Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("InputNames")]
+ public JoinDataComplete InputNames = new JoinDataComplete(new JoinData { JoinNumber = 101, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("OutputNames")]
+ public JoinDataComplete OutputNames = new JoinDataComplete(new JoinData { JoinNumber = 301, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Output Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("InputVideoNames")]
+ public JoinDataComplete InputVideoNames =
+ new JoinDataComplete(new JoinData { JoinNumber = 501, JoinSpan = 32 },
+ new JoinMetadata
+ {
+ Description = "Video Input Name",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("InputAudioNames")]
+ public JoinDataComplete InputAudioNames =
+ new JoinDataComplete(new JoinData { JoinNumber = 701, JoinSpan = 32 },
+ new JoinMetadata
+ {
+ Description = "Audio Input Name",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+ [JoinName("OutputVideoNames")]
+ public JoinDataComplete OutputVideoNames =
+ new JoinDataComplete(new JoinData { JoinNumber = 901, JoinSpan = 32 },
+ new JoinMetadata
{
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected DmpsRoutingControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
+ Description = "Video Output Name",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+ [JoinName("OutputAudioNames")]
+ public JoinDataComplete OutputAudioNames =
+ new JoinDataComplete(new JoinData { JoinNumber = 1101, JoinSpan = 32 },
+ new JoinMetadata
{
- }
+ Description = "Audio Output Name",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("OutputCurrentVideoInputNames")]
+ public JoinDataComplete OutputCurrentVideoInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2001, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Video Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("OutputCurrentAudioInputNames")]
+ public JoinDataComplete OutputCurrentAudioInputNames = new JoinDataComplete(new JoinData { JoinNumber = 2201, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Audio Output Currently Routed Video Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("InputCurrentResolution")]
+ public JoinDataComplete InputCurrentResolution = new JoinDataComplete(new JoinData { JoinNumber = 2401, JoinSpan = 32 },
+ new JoinMetadata { Description = "DM Chassis Input Current Resolution", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public DmpsRoutingControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(DmpsRoutingControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected DmpsRoutingControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericIrControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericIrControllerJoinMap.cs
index 388e6ac13..50cb4b7dd 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericIrControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericIrControllerJoinMap.cs
@@ -1,7 +1,7 @@
using PepperDash.Essentials.Core;
-namespace PepperDash.Essentials.Core.Bridges.JoinMaps
-{
+namespace PepperDash.Essentials.Core.Bridges.JoinMaps;
+
public sealed class GenericIrControllerJoinMap : JoinMapBaseAdvanced
{
[JoinName("PLAY")]
@@ -823,5 +823,4 @@ public GenericIrControllerJoinMap(uint joinStart)
: base(joinStart, typeof(GenericIrControllerJoinMap))
{
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericLightingJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericLightingJoinMap.cs
index 2a3015f11..179b4124d 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericLightingJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericLightingJoinMap.cs
@@ -1,49 +1,48 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class GenericLightingJoinMap : JoinMapBaseAdvanced
{
- public class GenericLightingJoinMap : JoinMapBaseAdvanced
+
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Lighting Controller Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("SelectScene")]
+ public JoinDataComplete SelectScene = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Lighting Controller Select Scene By Index", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("SelectSceneDirect")]
+ public JoinDataComplete SelectSceneDirect = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 10 },
+ new JoinMetadata { Description = "Lighting Controller Select Scene", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalSerial });
+
+ [JoinName("ButtonVisibility")]
+ public JoinDataComplete ButtonVisibility = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 10 },
+ new JoinMetadata { Description = "Lighting Controller Button Visibility", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("IntegrationIdSet")]
+ public JoinDataComplete IntegrationIdSet = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Lighting Controller Set Integration Id", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
+
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public GenericLightingJoinMap(uint joinStart)
+ : this(joinStart, typeof(GenericLightingJoinMap))
{
+ }
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Lighting Controller Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("SelectScene")]
- public JoinDataComplete SelectScene = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Lighting Controller Select Scene By Index", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("SelectSceneDirect")]
- public JoinDataComplete SelectSceneDirect = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 10 },
- new JoinMetadata { Description = "Lighting Controller Select Scene", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.DigitalSerial });
-
- [JoinName("ButtonVisibility")]
- public JoinDataComplete ButtonVisibility = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 10 },
- new JoinMetadata { Description = "Lighting Controller Button Visibility", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("IntegrationIdSet")]
- public JoinDataComplete IntegrationIdSet = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Lighting Controller Set Integration Id", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
-
-
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public GenericLightingJoinMap(uint joinStart)
- : this(joinStart, typeof(GenericLightingJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected GenericLightingJoinMap(uint joinStart, Type type) : base(joinStart, type)
- {
- }
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected GenericLightingJoinMap(uint joinStart, Type type) : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs
index 688977679..03aaf041f 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs
@@ -1,31 +1,30 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class GenericRelayControllerJoinMap : JoinMapBaseAdvanced
{
- public class GenericRelayControllerJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("Relay")]
- public JoinDataComplete Relay = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Relay State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Relay")]
+ public JoinDataComplete Relay = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Relay State Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public GenericRelayControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(GenericRelayControllerJoinMap))
- {
- }
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public GenericRelayControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(GenericRelayControllerJoinMap))
+ {
+ }
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected GenericRelayControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
- {
-
- }
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected GenericRelayControllerJoinMap(uint joinStart, Type type) : base(joinStart, type)
+ {
+
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs
index ded7343f6..228cb4f07 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs
@@ -1,184 +1,184 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class GlsOccupancySensorBaseJoinMap : JoinMapBaseAdvanced
{
- public class GlsOccupancySensorBaseJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Is Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Is Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("ForceOccupied")]
+ public JoinDataComplete ForceOccupied = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Set to Occupied", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("ForceVacant")]
+ public JoinDataComplete ForceVacant = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Set to Vacant", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("EnableRawStates")]
+ public JoinDataComplete EnableRawStates = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Enable Raw", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("RoomOccupiedFeedback")]
+ public JoinDataComplete RoomOccupiedFeedback = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Room Is Occupied", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("GraceOccupancyDetectedFeedback")]
+ public JoinDataComplete GraceOccupancyDetectedFeedback = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Grace Occupancy Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("RoomVacantFeedback")]
+ public JoinDataComplete RoomVacantFeedback = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Room Is Vacant", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("RawOccupancyFeedback")]
+ public JoinDataComplete RawOccupancyFeedback = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Raw Occupancy Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("RawOccupancyPirFeedback")]
+ public JoinDataComplete RawOccupancyPirFeedback = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Raw PIR Occupancy Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("RawOccupancyUsFeedback")]
+ public JoinDataComplete RawOccupancyUsFeedback = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Raw US Occupancy Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("EnableLedFlash")]
+ public JoinDataComplete EnableLedFlash = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Enable LED Flash", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DisableLedFlash")]
+ public JoinDataComplete DisableLedFlash = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Disable LED Flash", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("EnableShortTimeout")]
+ public JoinDataComplete EnableShortTimeout = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Enable Short Timeout", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DisableShortTimeout")]
+ public JoinDataComplete DisableShortTimeout = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Disable Short Timeout", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OrWhenVacated")]
+ public JoinDataComplete OrWhenVacated = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Set To Vacant when Either Sensor is Vacant", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ForceOccupied")]
- public JoinDataComplete ForceOccupied = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Set to Occupied", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("AndWhenVacated")]
+ public JoinDataComplete AndWhenVacated = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Set To Vacant when Both Sensors are Vacant", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ForceVacant")]
- public JoinDataComplete ForceVacant = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Set to Vacant", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnableUsA")]
+ public JoinDataComplete EnableUsA = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Enable Ultrasonic Sensor A", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("EnableRawStates")]
- public JoinDataComplete EnableRawStates = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Enable Raw", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DisableUsA")]
+ public JoinDataComplete DisableUsA = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Disable Ultrasonic Sensor A", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RoomOccupiedFeedback")]
- public JoinDataComplete RoomOccupiedFeedback = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Room Is Occupied", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnableUsB")]
+ public JoinDataComplete EnableUsB = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Enable Ultrasonic Sensor B", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("GraceOccupancyDetectedFeedback")]
- public JoinDataComplete GraceOccupancyDetectedFeedback = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Grace Occupancy Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DisableUsB")]
+ public JoinDataComplete DisableUsB = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Disable Ultrasonic Sensor B", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RoomVacantFeedback")]
- public JoinDataComplete RoomVacantFeedback = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Room Is Vacant", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnablePir")]
+ public JoinDataComplete EnablePir = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Enable IR Sensor", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RawOccupancyFeedback")]
- public JoinDataComplete RawOccupancyFeedback = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Raw Occupancy Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DisablePir")]
+ public JoinDataComplete DisablePir = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Disable IR Sensor", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RawOccupancyPirFeedback")]
- public JoinDataComplete RawOccupancyPirFeedback = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Raw PIR Occupancy Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IncrementUsInOccupiedState")]
+ public JoinDataComplete IncrementUsInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Increment US Occupied State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("RawOccupancyUsFeedback")]
- public JoinDataComplete RawOccupancyUsFeedback = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Raw US Occupancy Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DecrementUsInOccupiedState")]
+ public JoinDataComplete DecrementUsInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Decrement US Occupied State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("EnableLedFlash")]
- public JoinDataComplete EnableLedFlash = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Enable LED Flash", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IncrementUsInVacantState")]
+ public JoinDataComplete IncrementUsInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Increment US Vacant State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DisableLedFlash")]
- public JoinDataComplete DisableLedFlash = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Disable LED Flash", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DecrementUsInVacantState")]
+ public JoinDataComplete DecrementUsInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Decrement US Vacant State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("EnableShortTimeout")]
- public JoinDataComplete EnableShortTimeout = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Enable Short Timeout", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IncrementPirInOccupiedState")]
+ public JoinDataComplete IncrementPirInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Increment IR Occupied State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DisableShortTimeout")]
- public JoinDataComplete DisableShortTimeout = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Disable Short Timeout", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DecrementPirInOccupiedState")]
+ public JoinDataComplete DecrementPirInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Decrement IR Occupied State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("OrWhenVacated")]
- public JoinDataComplete OrWhenVacated = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Set To Vacant when Either Sensor is Vacant", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IncrementPirInVacantState")]
+ public JoinDataComplete IncrementPirInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Increment IR Vacant State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("AndWhenVacated")]
- public JoinDataComplete AndWhenVacated = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Set To Vacant when Both Sensors are Vacant", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("EnableUsA")]
- public JoinDataComplete EnableUsA = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Enable Ultrasonic Sensor A", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("DisableUsA")]
- public JoinDataComplete DisableUsA = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Disable Ultrasonic Sensor A", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("EnableUsB")]
- public JoinDataComplete EnableUsB = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Enable Ultrasonic Sensor B", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("DisableUsB")]
- public JoinDataComplete DisableUsB = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Disable Ultrasonic Sensor B", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("EnablePir")]
- public JoinDataComplete EnablePir = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Enable IR Sensor", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("DisablePir")]
- public JoinDataComplete DisablePir = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Disable IR Sensor", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("IncrementUsInOccupiedState")]
- public JoinDataComplete IncrementUsInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Increment US Occupied State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("DecrementUsInOccupiedState")]
- public JoinDataComplete DecrementUsInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Decrement US Occupied State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("IncrementUsInVacantState")]
- public JoinDataComplete IncrementUsInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Increment US Vacant State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("DecrementUsInVacantState")]
- public JoinDataComplete DecrementUsInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Decrement US Vacant State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("IncrementPirInOccupiedState")]
- public JoinDataComplete IncrementPirInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Increment IR Occupied State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("DecrementPirInOccupiedState")]
- public JoinDataComplete DecrementPirInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Decrement IR Occupied State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("IncrementPirInVacantState")]
- public JoinDataComplete IncrementPirInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Increment IR Vacant State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("DecrementPirInVacantState")]
- public JoinDataComplete DecrementPirInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Decrement IR Vacant State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Timeout")]
- public JoinDataComplete Timeout = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Timeout Value", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("TimeoutLocalFeedback")]
- public JoinDataComplete TimeoutLocalFeedback = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Local Timeout Value", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("InternalPhotoSensorValue")]
- public JoinDataComplete InternalPhotoSensorValue = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Internal PhotoSensor Value", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("ExternalPhotoSensorValue")]
- public JoinDataComplete ExternalPhotoSensorValue = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor External PhotoSensor Value", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("UsSensitivityInOccupiedState")]
- public JoinDataComplete UsSensitivityInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Ultrasonic Sensitivity in Occupied State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("UsSensitivityInVacantState")]
- public JoinDataComplete UsSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Ultrasonic Sensitivity in Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("PirSensitivityInOccupiedState")]
- public JoinDataComplete PirSensitivityInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor PIR Sensitivity in Occupied State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("PirSensitivityInVacantState")]
- public JoinDataComplete PirSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor PIR Sensitivity in Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Occ Sensor Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public GlsOccupancySensorBaseJoinMap(uint joinStart)
- : this(joinStart, typeof(GlsOccupancySensorBaseJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected GlsOccupancySensorBaseJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ [JoinName("DecrementPirInVacantState")]
+ public JoinDataComplete DecrementPirInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Decrement IR Vacant State Sensitivity", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Timeout")]
+ public JoinDataComplete Timeout = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Timeout Value", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("TimeoutLocalFeedback")]
+ public JoinDataComplete TimeoutLocalFeedback = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Local Timeout Value", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("InternalPhotoSensorValue")]
+ public JoinDataComplete InternalPhotoSensorValue = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Internal PhotoSensor Value", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("ExternalPhotoSensorValue")]
+ public JoinDataComplete ExternalPhotoSensorValue = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor External PhotoSensor Value", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("UsSensitivityInOccupiedState")]
+ public JoinDataComplete UsSensitivityInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Ultrasonic Sensitivity in Occupied State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("UsSensitivityInVacantState")]
+ public JoinDataComplete UsSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Ultrasonic Sensitivity in Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("PirSensitivityInOccupiedState")]
+ public JoinDataComplete PirSensitivityInOccupiedState = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor PIR Sensitivity in Occupied State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("PirSensitivityInVacantState")]
+ public JoinDataComplete PirSensitivityInVacantState = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor PIR Sensitivity in Vacant State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Occ Sensor Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public GlsOccupancySensorBaseJoinMap(uint joinStart)
+ : this(joinStart, typeof(GlsOccupancySensorBaseJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected GlsOccupancySensorBaseJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
-}
+
+}
+
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsPartitionSensorJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsPartitionSensorJoinMap.cs
index cb0f07b2a..7515c8c28 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsPartitionSensorJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsPartitionSensorJoinMap.cs
@@ -1,157 +1,156 @@
using System;
using PepperDash.Essentials.Core;
-namespace PepperDash.Essentials.Core.Bridges.JoinMaps
+namespace PepperDash.Essentials.Core.Bridges.JoinMaps;
+
+public class GlsPartitionSensorJoinMap : JoinMapBaseAdvanced
{
- public class GlsPartitionSensorJoinMap : JoinMapBaseAdvanced
+
+ #region Digital
+
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 1,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sensor Is Online",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+
+ [JoinName("Enable")]
+ public JoinDataComplete Enable = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 2,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sensor Enable",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("PartitionSensed")]
+ public JoinDataComplete PartitionSensed = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 3,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sensor Partition Sensed",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("PartitionNotSensed")]
+ public JoinDataComplete PartitionNotSensed = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 4,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sensor Partition Not Sensed",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("IncreaseSensitivity")]
+ public JoinDataComplete IncreaseSensitivity = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 6,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sensor Increase Sensitivity",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("DecreaseSensitivity")]
+ public JoinDataComplete DecreaseSensitivity = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 7,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sensor Decrease Sensitivity",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ #endregion
+
+ #region Analog
+
+ [JoinName("Sensitivity")]
+ public JoinDataComplete Sensitivity = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 2,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sensor Sensitivity",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+ #endregion
+
+
+ #region Serial
+
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 1,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sensor Name",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ #endregion
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public GlsPartitionSensorJoinMap(uint joinStart)
+ : this(joinStart, typeof(GlsPartitionSensorJoinMap))
+ {
+
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected GlsPartitionSensorJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
{
- #region Digital
-
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 1,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sensor Is Online",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
-
-
- [JoinName("Enable")]
- public JoinDataComplete Enable = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 2,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sensor Enable",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("PartitionSensed")]
- public JoinDataComplete PartitionSensed = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 3,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sensor Partition Sensed",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("PartitionNotSensed")]
- public JoinDataComplete PartitionNotSensed = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 4,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sensor Partition Not Sensed",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("IncreaseSensitivity")]
- public JoinDataComplete IncreaseSensitivity = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 6,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sensor Increase Sensitivity",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("DecreaseSensitivity")]
- public JoinDataComplete DecreaseSensitivity = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 7,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sensor Decrease Sensitivity",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- #endregion
-
- #region Analog
-
- [JoinName("Sensitivity")]
- public JoinDataComplete Sensitivity = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 2,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sensor Sensitivity",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Analog
- });
-
- #endregion
-
-
- #region Serial
-
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 1,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sensor Name",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- #endregion
-
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public GlsPartitionSensorJoinMap(uint joinStart)
- : this(joinStart, typeof(GlsPartitionSensorJoinMap))
- {
-
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected GlsPartitionSensorJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
-
- }
}
}
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdNxM4kEControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdNxM4kEControllerJoinMap.cs
index e69946ea5..43ed25c9d 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdNxM4kEControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdNxM4kEControllerJoinMap.cs
@@ -1,66 +1,65 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class HdMdNxM4kEControllerJoinMap : JoinMapBaseAdvanced
{
- public class HdMdNxM4kEControllerJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("EnableAutoRoute")]
- public JoinDataComplete EnableAutoRoute = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Enable Automatic Routing on 4x1 Switchers", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnableAutoRoute")]
+ public JoinDataComplete EnableAutoRoute = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Enable Automatic Routing on 4x1 Switchers", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("InputName")]
- public JoinDataComplete InputName = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 8 },
- new JoinMetadata { Description = "Device Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("InputName")]
+ public JoinDataComplete InputName = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 8 },
+ new JoinMetadata { Description = "Device Input Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("InputSync")]
- public JoinDataComplete InputSync = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 8 },
- new JoinMetadata { Description = "Device Input Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("InputSync")]
+ public JoinDataComplete InputSync = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 8 },
+ new JoinMetadata { Description = "Device Input Sync", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("OutputName")]
- public JoinDataComplete OutputName = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 2 },
- new JoinMetadata { Description = "Device Output Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("OutputName")]
+ public JoinDataComplete OutputName = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 2 },
+ new JoinMetadata { Description = "Device Output Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("OutputRoute")]
- public JoinDataComplete OutputRoute = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 2 },
- new JoinMetadata { Description = "Device Output Route Set/Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("OutputRoute")]
+ public JoinDataComplete OutputRoute = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 2 },
+ new JoinMetadata { Description = "Device Output Route Set/Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- [JoinName("OutputRoutedName")]
- public JoinDataComplete OutputRoutedName = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 2 },
- new JoinMetadata { Description = "Device Output Route Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("OutputRoutedName")]
+ public JoinDataComplete OutputRoutedName = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 2 },
+ new JoinMetadata { Description = "Device Output Route Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("EnableInputHdcp")]
- public JoinDataComplete EnableInputHdcp = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 8 },
- new JoinMetadata { Description = "Device Enable Input Hdcp", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("EnableInputHdcp")]
+ public JoinDataComplete EnableInputHdcp = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 8 },
+ new JoinMetadata { Description = "Device Enable Input Hdcp", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DisableInputHdcp")]
- public JoinDataComplete DisableInputHdcp = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 8 },
- new JoinMetadata { Description = "Device Disnable Input Hdcp", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DisableInputHdcp")]
+ public JoinDataComplete DisableInputHdcp = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 8 },
+ new JoinMetadata { Description = "Device Disnable Input Hdcp", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Onlne", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Onlne", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public HdMdNxM4kEControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(HdMdNxM4kEControllerJoinMap))
- {
- }
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public HdMdNxM4kEControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(HdMdNxM4kEControllerJoinMap))
+ {
+ }
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected HdMdNxM4kEControllerJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected HdMdNxM4kEControllerJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs
index 0936f75de..32bc56517 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs
@@ -1,76 +1,75 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class HdMdxxxCEControllerJoinMap : JoinMapBaseAdvanced
{
- public class HdMdxxxCEControllerJoinMap : JoinMapBaseAdvanced
+
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("RemoteEndDetected")]
+ public JoinDataComplete RemoteEndDetected = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Remote End Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("AutoRouteOn")]
+ public JoinDataComplete AutoRouteOn = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Auto Route On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("AutoRouteOff")]
+ public JoinDataComplete AutoRouteOff = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Auto Route Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("PriorityRoutingOn")]
+ public JoinDataComplete PriorityRoutingOn = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Priority Routing On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("PriorityRoutingOff")]
+ public JoinDataComplete PriorityRoutingOff = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Priority Routing Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("InputOnScreenDisplayEnabled")]
+ public JoinDataComplete InputOnScreenDisplayEnabled = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Input OSD Enabled", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("InputOnScreenDisplayDisabled")]
+ public JoinDataComplete InputOnScreenDisplayDisabled = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "Device Input OSD Disabled", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("SyncDetected")]
+ public JoinDataComplete SyncDetected = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 5 },
+ new JoinMetadata { Description = "Device Sync Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VideoSource")]
+ public JoinDataComplete VideoSource = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 5 },
+ new JoinMetadata { Description = "Device Video Source Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("SourceCount")]
+ public JoinDataComplete SourceCount = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 5 },
+ new JoinMetadata { Description = "Device Video Source Count", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("SourceNames")]
+ public JoinDataComplete SourceNames = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 5 },
+ new JoinMetadata { Description = "Device Video Source Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public HdMdxxxCEControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(HdMdxxxCEControllerJoinMap))
{
+ }
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("RemoteEndDetected")]
- public JoinDataComplete RemoteEndDetected = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Remote End Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("AutoRouteOn")]
- public JoinDataComplete AutoRouteOn = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Auto Route On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("AutoRouteOff")]
- public JoinDataComplete AutoRouteOff = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Auto Route Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("PriorityRoutingOn")]
- public JoinDataComplete PriorityRoutingOn = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Priority Routing On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("PriorityRoutingOff")]
- public JoinDataComplete PriorityRoutingOff = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Priority Routing Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("InputOnScreenDisplayEnabled")]
- public JoinDataComplete InputOnScreenDisplayEnabled = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Input OSD Enabled", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("InputOnScreenDisplayDisabled")]
- public JoinDataComplete InputOnScreenDisplayDisabled = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "Device Input OSD Disabled", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("SyncDetected")]
- public JoinDataComplete SyncDetected = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 5 },
- new JoinMetadata { Description = "Device Sync Detected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("VideoSource")]
- public JoinDataComplete VideoSource = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 5 },
- new JoinMetadata { Description = "Device Video Source Set / Get", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("SourceCount")]
- public JoinDataComplete SourceCount = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 5 },
- new JoinMetadata { Description = "Device Video Source Count", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("SourceNames")]
- public JoinDataComplete SourceNames = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 5 },
- new JoinMetadata { Description = "Device Video Source Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public HdMdxxxCEControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(HdMdxxxCEControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected HdMdxxxCEControllerJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected HdMdxxxCEControllerJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdPsXxxControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdPsXxxControllerJoinMap.cs
index 04d75d418..56420b24c 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdPsXxxControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdPsXxxControllerJoinMap.cs
@@ -1,8 +1,8 @@
using System;
using PepperDash.Essentials.Core;
-namespace PepperDash.Essentials.Core.Bridges
-{
+namespace PepperDash.Essentials.Core.Bridges;
+
public class HdPsXxxControllerJoinMap : JoinMapBaseAdvanced
{
@@ -186,5 +186,4 @@ protected HdPsXxxControllerJoinMap(uint joinStart, Type type)
: base(joinStart, type)
{
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/Hrxxx0WirelessRemoteControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/Hrxxx0WirelessRemoteControllerJoinMap.cs
index 23305b201..ca9ef3c61 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/Hrxxx0WirelessRemoteControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/Hrxxx0WirelessRemoteControllerJoinMap.cs
@@ -1,246 +1,245 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class Hrxxx0WirelessRemoteControllerJoinMap : JoinMapBaseAdvanced
{
- public class Hrxxx0WirelessRemoteControllerJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("Power")]
- public JoinDataComplete Power = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Power", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Power")]
+ public JoinDataComplete Power = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Power", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Menu")]
+ public JoinDataComplete Menu = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Menu", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Guide")]
+ public JoinDataComplete Guide = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Guide", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Info")]
+ public JoinDataComplete Info = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Info", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VolumeUp")]
+ public JoinDataComplete VolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "VolumeUp", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("VolumeDown")]
+ public JoinDataComplete VolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "VolumeDown", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadUp")]
+ public JoinDataComplete DialPadUp = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "DialPadUp", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadDown")]
+ public JoinDataComplete DialPadDown = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "DialPadDown", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadLeft")]
+ public JoinDataComplete DialPadLeft = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
+ new JoinMetadata { Description = "DialPadLeft", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadRight")]
+ public JoinDataComplete DialPadRight = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
+ new JoinMetadata { Description = "DialPadRight", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("DialPadSelect")]
+ public JoinDataComplete DialPadSelect = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "DialPadSelect", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("ChannelUp")]
+ public JoinDataComplete ChannelUp = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "ChannelUp", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("ChannelDown")]
+ public JoinDataComplete ChannelDown = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "ChannelDown", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Mute")]
+ public JoinDataComplete Mute = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "Mute", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Menu")]
- public JoinDataComplete Menu = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Menu", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Exit")]
+ public JoinDataComplete Exit = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata { Description = "Exit", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Guide")]
- public JoinDataComplete Guide = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Guide", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Last")]
+ public JoinDataComplete Last = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
+ new JoinMetadata { Description = "Last", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Info")]
- public JoinDataComplete Info = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Info", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Play")]
+ public JoinDataComplete Play = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
+ new JoinMetadata { Description = "Play", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("VolumeUp")]
- public JoinDataComplete VolumeUp = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "VolumeUp", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Pause")]
+ public JoinDataComplete Pause = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
+ new JoinMetadata { Description = "Pause", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("VolumeDown")]
- public JoinDataComplete VolumeDown = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "VolumeDown", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Rewind")]
+ public JoinDataComplete Rewind = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
+ new JoinMetadata { Description = "Rewind", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DialPadUp")]
- public JoinDataComplete DialPadUp = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "DialPadUp", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("FastForward")]
+ public JoinDataComplete FastForward = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
+ new JoinMetadata { Description = "FastForward", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DialPadDown")]
- public JoinDataComplete DialPadDown = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "DialPadDown", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PreviousTrack")]
+ public JoinDataComplete PreviousTrack = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
+ new JoinMetadata { Description = "PreviousTrack", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DialPadLeft")]
- public JoinDataComplete DialPadLeft = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
- new JoinMetadata { Description = "DialPadLeft", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("NextTrack")]
+ public JoinDataComplete NextTrack = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
+ new JoinMetadata { Description = "NextTrack", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DialPadRight")]
- public JoinDataComplete DialPadRight = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
- new JoinMetadata { Description = "DialPadRight", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Stop")]
+ public JoinDataComplete Stop = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
+ new JoinMetadata { Description = "Stop", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("DialPadSelect")]
- public JoinDataComplete DialPadSelect = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "DialPadSelect", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Record")]
+ public JoinDataComplete Record = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
+ new JoinMetadata { Description = "Record", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ChannelUp")]
- public JoinDataComplete ChannelUp = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "ChannelUp", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Dvr")]
+ public JoinDataComplete Dvr = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
+ new JoinMetadata { Description = "Dvr", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ChannelDown")]
- public JoinDataComplete ChannelDown = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "ChannelDown", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad1")]
+ public JoinDataComplete Keypad1 = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Mute")]
- public JoinDataComplete Mute = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "Mute", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad2Abc")]
+ public JoinDataComplete Keypad2 = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad2Abc", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Exit")]
- public JoinDataComplete Exit = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
- new JoinMetadata { Description = "Exit", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad3Def")]
+ public JoinDataComplete Keypad3Def = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad3Def", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Last")]
- public JoinDataComplete Last = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
- new JoinMetadata { Description = "Last", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad4Ghi")]
+ public JoinDataComplete Keypad4Ghi = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad4Ghi", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Play")]
- public JoinDataComplete Play = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
- new JoinMetadata { Description = "Play", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad5Jkl")]
+ public JoinDataComplete Keypad5Jkl = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad5Jkl", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Pause")]
- public JoinDataComplete Pause = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
- new JoinMetadata { Description = "Pause", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad6Mno")]
+ public JoinDataComplete Keypad6Mno = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad6Mno", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Rewind")]
- public JoinDataComplete Rewind = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
- new JoinMetadata { Description = "Rewind", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad7Pqrs")]
+ public JoinDataComplete Keypad7Pqrs = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad7Pqrs", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("FastForward")]
- public JoinDataComplete FastForward = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
- new JoinMetadata { Description = "FastForward", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad8Tuv")]
+ public JoinDataComplete Keypad8Tuv = new JoinDataComplete(new JoinData { JoinNumber = 33, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad8Tuv", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PreviousTrack")]
- public JoinDataComplete PreviousTrack = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
- new JoinMetadata { Description = "PreviousTrack", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad9Wxyz")]
+ public JoinDataComplete Keypad9Wxyz = new JoinDataComplete(new JoinData { JoinNumber = 34, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad9Wxyz", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("NextTrack")]
- public JoinDataComplete NextTrack = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
- new JoinMetadata { Description = "NextTrack", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Keypad0")]
+ public JoinDataComplete Keypad0 = new JoinDataComplete(new JoinData { JoinNumber = 35, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad0", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Stop")]
- public JoinDataComplete Stop = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
- new JoinMetadata { Description = "Stop", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Clear")]
+ public JoinDataComplete Clear = new JoinDataComplete(new JoinData { JoinNumber = 36, JoinSpan = 1 },
+ new JoinMetadata { Description = "Clear", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Record")]
- public JoinDataComplete Record = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
- new JoinMetadata { Description = "Record", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Enter")]
+ public JoinDataComplete Enter = new JoinDataComplete(new JoinData { JoinNumber = 37, JoinSpan = 1 },
+ new JoinMetadata { Description = "Enter", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Dvr")]
- public JoinDataComplete Dvr = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
- new JoinMetadata { Description = "Dvr", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Red")]
+ public JoinDataComplete Red = new JoinDataComplete(new JoinData { JoinNumber = 38, JoinSpan = 1 },
+ new JoinMetadata { Description = "Red", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Keypad1")]
- public JoinDataComplete Keypad1 = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Green")]
+ public JoinDataComplete Green = new JoinDataComplete(new JoinData { JoinNumber = 39, JoinSpan = 1 },
+ new JoinMetadata { Description = "Green", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Keypad2Abc")]
- public JoinDataComplete Keypad2 = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad2Abc", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Yellow")]
+ public JoinDataComplete Yellow = new JoinDataComplete(new JoinData { JoinNumber = 40, JoinSpan = 1 },
+ new JoinMetadata { Description = "Yellow", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Keypad3Def")]
- public JoinDataComplete Keypad3Def = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad3Def", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Blue")]
+ public JoinDataComplete Blue = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
+ new JoinMetadata { Description = "Blue", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Keypad4Ghi")]
- public JoinDataComplete Keypad4Ghi = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad4Ghi", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Custom1")]
+ public JoinDataComplete Custom1 = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
+ new JoinMetadata { Description = "Custom1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Keypad5Jkl")]
- public JoinDataComplete Keypad5Jkl = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad5Jkl", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Custom2")]
+ public JoinDataComplete Custom2 = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
+ new JoinMetadata { Description = "Custom2", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Keypad6Mno")]
- public JoinDataComplete Keypad6Mno = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad6Mno", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Custom3")]
+ public JoinDataComplete Custom3 = new JoinDataComplete(new JoinData { JoinNumber = 44, JoinSpan = 1 },
+ new JoinMetadata { Description = "Custom3", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Keypad7Pqrs")]
- public JoinDataComplete Keypad7Pqrs = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad7Pqrs", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Keypad8Tuv")]
- public JoinDataComplete Keypad8Tuv = new JoinDataComplete(new JoinData { JoinNumber = 33, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad8Tuv", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Keypad9Wxyz")]
- public JoinDataComplete Keypad9Wxyz = new JoinDataComplete(new JoinData { JoinNumber = 34, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad9Wxyz", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Keypad0")]
- public JoinDataComplete Keypad0 = new JoinDataComplete(new JoinData { JoinNumber = 35, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad0", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Clear")]
- public JoinDataComplete Clear = new JoinDataComplete(new JoinData { JoinNumber = 36, JoinSpan = 1 },
- new JoinMetadata { Description = "Clear", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Enter")]
- public JoinDataComplete Enter = new JoinDataComplete(new JoinData { JoinNumber = 37, JoinSpan = 1 },
- new JoinMetadata { Description = "Enter", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Red")]
- public JoinDataComplete Red = new JoinDataComplete(new JoinData { JoinNumber = 38, JoinSpan = 1 },
- new JoinMetadata { Description = "Red", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Green")]
- public JoinDataComplete Green = new JoinDataComplete(new JoinData { JoinNumber = 39, JoinSpan = 1 },
- new JoinMetadata { Description = "Green", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Yellow")]
- public JoinDataComplete Yellow = new JoinDataComplete(new JoinData { JoinNumber = 40, JoinSpan = 1 },
- new JoinMetadata { Description = "Yellow", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Blue")]
- public JoinDataComplete Blue = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
- new JoinMetadata { Description = "Blue", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Custom1")]
- public JoinDataComplete Custom1 = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
- new JoinMetadata { Description = "Custom1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Custom2")]
- public JoinDataComplete Custom2 = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
- new JoinMetadata { Description = "Custom2", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Custom3")]
- public JoinDataComplete Custom3 = new JoinDataComplete(new JoinData { JoinNumber = 44, JoinSpan = 1 },
- new JoinMetadata { Description = "Custom3", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Custom4")]
- public JoinDataComplete Custom4 = new JoinDataComplete(new JoinData { JoinNumber = 45, JoinSpan = 1 },
- new JoinMetadata { Description = "Custom4", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Custom5")]
- public JoinDataComplete Custom5 = new JoinDataComplete(new JoinData { JoinNumber = 46, JoinSpan = 1 },
- new JoinMetadata { Description = "Custom5", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Custom6")]
- public JoinDataComplete Custom6 = new JoinDataComplete(new JoinData { JoinNumber = 47, JoinSpan = 1 },
- new JoinMetadata { Description = "Custom6", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Custom7")]
- public JoinDataComplete Custom7 = new JoinDataComplete(new JoinData { JoinNumber = 48, JoinSpan = 1 },
- new JoinMetadata { Description = "Custom7", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Custom8")]
- public JoinDataComplete Custom8 = new JoinDataComplete(new JoinData { JoinNumber = 49, JoinSpan = 1 },
- new JoinMetadata { Description = "Custom8", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Custom9")]
- public JoinDataComplete Custom9 = new JoinDataComplete(new JoinData { JoinNumber = 50, JoinSpan = 1 },
- new JoinMetadata { Description = "Custom9", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Fav")]
- public JoinDataComplete Fav = new JoinDataComplete(new JoinData { JoinNumber = 51, JoinSpan = 1 },
- new JoinMetadata { Description = "Fav", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Home")]
- public JoinDataComplete Home = new JoinDataComplete(new JoinData { JoinNumber = 52, JoinSpan = 1 },
- new JoinMetadata { Description = "Home", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("BatteryLow")]
- public JoinDataComplete BatteryLow = new JoinDataComplete(new JoinData { JoinNumber = 53, JoinSpan = 1 },
- new JoinMetadata { Description = "BatteryLow", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("BatteryCritical")]
- public JoinDataComplete BatteryCritical = new JoinDataComplete(new JoinData { JoinNumber = 54, JoinSpan = 1 },
- new JoinMetadata { Description = "BatteryCritical", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("BatteryVoltage")]
- public JoinDataComplete BatteryVoltage = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "BatteryVoltage", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public Hrxxx0WirelessRemoteControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(Hrxxx0WirelessRemoteControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected Hrxxx0WirelessRemoteControllerJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ [JoinName("Custom4")]
+ public JoinDataComplete Custom4 = new JoinDataComplete(new JoinData { JoinNumber = 45, JoinSpan = 1 },
+ new JoinMetadata { Description = "Custom4", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom5")]
+ public JoinDataComplete Custom5 = new JoinDataComplete(new JoinData { JoinNumber = 46, JoinSpan = 1 },
+ new JoinMetadata { Description = "Custom5", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom6")]
+ public JoinDataComplete Custom6 = new JoinDataComplete(new JoinData { JoinNumber = 47, JoinSpan = 1 },
+ new JoinMetadata { Description = "Custom6", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom7")]
+ public JoinDataComplete Custom7 = new JoinDataComplete(new JoinData { JoinNumber = 48, JoinSpan = 1 },
+ new JoinMetadata { Description = "Custom7", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom8")]
+ public JoinDataComplete Custom8 = new JoinDataComplete(new JoinData { JoinNumber = 49, JoinSpan = 1 },
+ new JoinMetadata { Description = "Custom8", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Custom9")]
+ public JoinDataComplete Custom9 = new JoinDataComplete(new JoinData { JoinNumber = 50, JoinSpan = 1 },
+ new JoinMetadata { Description = "Custom9", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Fav")]
+ public JoinDataComplete Fav = new JoinDataComplete(new JoinData { JoinNumber = 51, JoinSpan = 1 },
+ new JoinMetadata { Description = "Fav", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Home")]
+ public JoinDataComplete Home = new JoinDataComplete(new JoinData { JoinNumber = 52, JoinSpan = 1 },
+ new JoinMetadata { Description = "Home", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("BatteryLow")]
+ public JoinDataComplete BatteryLow = new JoinDataComplete(new JoinData { JoinNumber = 53, JoinSpan = 1 },
+ new JoinMetadata { Description = "BatteryLow", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("BatteryCritical")]
+ public JoinDataComplete BatteryCritical = new JoinDataComplete(new JoinData { JoinNumber = 54, JoinSpan = 1 },
+ new JoinMetadata { Description = "BatteryCritical", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("BatteryVoltage")]
+ public JoinDataComplete BatteryVoltage = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "BatteryVoltage", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public Hrxxx0WirelessRemoteControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(Hrxxx0WirelessRemoteControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected Hrxxx0WirelessRemoteControllerJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IAnalogInputJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IAnalogInputJoinMap.cs
index eaf70f3a0..80509ecc8 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IAnalogInputJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IAnalogInputJoinMap.cs
@@ -1,34 +1,33 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class IAnalogInputJoinMap : JoinMapBaseAdvanced
{
- public class IAnalogInputJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("InputValue")]
- public JoinDataComplete InputValue = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Input Value", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
- [JoinName("MinimumChange")]
- public JoinDataComplete MinimumChange = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Minimum voltage change required to reflect a change", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("InputValue")]
+ public JoinDataComplete InputValue = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Input Value", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("MinimumChange")]
+ public JoinDataComplete MinimumChange = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Minimum voltage change required to reflect a change", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public IAnalogInputJoinMap(uint joinStart)
- : this(joinStart, typeof(IAnalogInputJoinMap))
- {
- }
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public IAnalogInputJoinMap(uint joinStart)
+ : this(joinStart, typeof(IAnalogInputJoinMap))
+ {
+ }
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected IAnalogInputJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected IAnalogInputJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs
index 0d077284d..1db5b1fff 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs
@@ -1,50 +1,49 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class IBasicCommunicationJoinMap : JoinMapBaseAdvanced
{
- public class IBasicCommunicationJoinMap : JoinMapBaseAdvanced
+ [JoinName("TextReceived")]
+ public JoinDataComplete TextReceived = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Text Received From Remote Device", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("SendText")]
+ public JoinDataComplete SendText = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Text Sent To Remote Device", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("SetPortConfig")]
+ public JoinDataComplete SetPortConfig = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Set Port Config", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("Connect")]
+ public JoinDataComplete Connect = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Connect", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Connected")]
+ public JoinDataComplete Connected = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Connected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Status")]
+ public JoinDataComplete Status = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public IBasicCommunicationJoinMap(uint joinStart)
+ : this(joinStart, typeof(IBasicCommunicationJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected IBasicCommunicationJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
{
- [JoinName("TextReceived")]
- public JoinDataComplete TextReceived = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Text Received From Remote Device", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("SendText")]
- public JoinDataComplete SendText = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Text Sent To Remote Device", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("SetPortConfig")]
- public JoinDataComplete SetPortConfig = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Set Port Config", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("Connect")]
- public JoinDataComplete Connect = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Connect", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Connected")]
- public JoinDataComplete Connected = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Connected", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Status")]
- public JoinDataComplete Status = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public IBasicCommunicationJoinMap(uint joinStart)
- : this(joinStart, typeof(IBasicCommunicationJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected IBasicCommunicationJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalInputJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalInputJoinMap.cs
index aa31ac764..ceed325de 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalInputJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalInputJoinMap.cs
@@ -1,31 +1,30 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class IDigitalInputJoinMap : JoinMapBaseAdvanced
{
- public class IDigitalInputJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("InputState")]
- public JoinDataComplete InputState = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Input State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("InputState")]
+ public JoinDataComplete InputState = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Input State", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public IDigitalInputJoinMap(uint joinStart)
- : this(joinStart, typeof(IDigitalInputJoinMap))
- {
- }
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public IDigitalInputJoinMap(uint joinStart)
+ : this(joinStart, typeof(IDigitalInputJoinMap))
+ {
+ }
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected IDigitalInputJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected IDigitalInputJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalOutputJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalOutputJoinMap.cs
index cbe623980..8abb2b74e 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalOutputJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalOutputJoinMap.cs
@@ -1,31 +1,30 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class IDigitalOutputJoinMap : JoinMapBaseAdvanced
{
- public class IDigitalOutputJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("OutputState")]
- public JoinDataComplete OutputState = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Get / Set state of Digital Input", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("OutputState")]
+ public JoinDataComplete OutputState = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Get / Set state of Digital Input", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public IDigitalOutputJoinMap(uint joinStart)
- : this(joinStart, typeof(IDigitalOutputJoinMap))
- {
- }
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public IDigitalOutputJoinMap(uint joinStart)
+ : this(joinStart, typeof(IDigitalOutputJoinMap))
+ {
+ }
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected IDigitalOutputJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected IDigitalOutputJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IRBlurayBaseJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IRBlurayBaseJoinMap.cs
index 991489e9f..d63a1f523 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IRBlurayBaseJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/IRBlurayBaseJoinMap.cs
@@ -4,219 +4,218 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+///
+/// Join map for IRBlurayBase devices
+///
+public class IRBlurayBaseJoinMap : JoinMapBaseAdvanced
{
- ///
- /// Join map for IRBlurayBase devices
- ///
- public class IRBlurayBaseJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("PowerOn")]
- public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Power On", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PowerOn")]
+ public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Power On", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("PowerOff")]
+ public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Power Off", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("PowerToggle")]
+ public JoinDataComplete PowerToggle = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Power Toggle", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Up")]
+ public JoinDataComplete Up = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Nav Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Down")]
+ public JoinDataComplete Down = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Nav Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Left")]
+ public JoinDataComplete Left = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "Nav Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Right")]
+ public JoinDataComplete Right = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "Nav Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Select")]
+ public JoinDataComplete Select = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "Select", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Menu")]
+ public JoinDataComplete Menu = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
+ new JoinMetadata { Description = "Menu", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Exit")]
+ public JoinDataComplete Exit = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
+ new JoinMetadata { Description = "Exit", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Digit0")]
+ public JoinDataComplete Digit0 = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 0", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Digit1")]
+ public JoinDataComplete Digit1 = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 1", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Digit2")]
+ public JoinDataComplete Digit2 = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 2", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Digit3")]
+ public JoinDataComplete Digit3 = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 3", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Digit4")]
+ public JoinDataComplete Digit4 = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 4", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PowerOff")]
- public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Power Off", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit5")]
+ public JoinDataComplete Digit5 = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 5", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PowerToggle")]
- public JoinDataComplete PowerToggle = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Power Toggle", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit6")]
+ public JoinDataComplete Digit6 = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 6", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Up")]
- public JoinDataComplete Up = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Nav Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit7")]
+ public JoinDataComplete Digit7 = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 7", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Down")]
- public JoinDataComplete Down = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Nav Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit8")]
+ public JoinDataComplete Digit8 = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 8", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Left")]
- public JoinDataComplete Left = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "Nav Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit9")]
+ public JoinDataComplete Digit9 = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
+ new JoinMetadata { Description = "Digit 9", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Right")]
- public JoinDataComplete Right = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "Nav Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("KeypadClear")]
+ public JoinDataComplete KeypadClear = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad Clear", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Select")]
- public JoinDataComplete Select = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "Select", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("KeypadEnter")]
+ public JoinDataComplete KeypadEnter = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad Enter", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Menu")]
- public JoinDataComplete Menu = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
- new JoinMetadata { Description = "Menu", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ChannelUp")]
+ public JoinDataComplete ChannelUp = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Channel Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Exit")]
- public JoinDataComplete Exit = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
- new JoinMetadata { Description = "Exit", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ChannelDown")]
+ public JoinDataComplete ChannelDown = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Channel Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit0")]
- public JoinDataComplete Digit0 = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 0", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("LastChannel")]
+ public JoinDataComplete LastChannel = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
+ new JoinMetadata { Description = "Last Channel", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit1")]
- public JoinDataComplete Digit1 = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 1", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Guide")]
+ public JoinDataComplete Guide = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
+ new JoinMetadata { Description = "Guide", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit2")]
- public JoinDataComplete Digit2 = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 2", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Info")]
+ public JoinDataComplete Info = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
+ new JoinMetadata { Description = "Info", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit3")]
- public JoinDataComplete Digit3 = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 3", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Red")]
+ public JoinDataComplete Red = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
+ new JoinMetadata { Description = "Red", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit4")]
- public JoinDataComplete Digit4 = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 4", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Green")]
+ public JoinDataComplete Green = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
+ new JoinMetadata { Description = "Green", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit5")]
- public JoinDataComplete Digit5 = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 5", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Yellow")]
+ public JoinDataComplete Yellow = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
+ new JoinMetadata { Description = "Yellow", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit6")]
- public JoinDataComplete Digit6 = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 6", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Blue")]
+ public JoinDataComplete Blue = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
+ new JoinMetadata { Description = "Blue", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit7")]
- public JoinDataComplete Digit7 = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 7", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit8")]
- public JoinDataComplete Digit8 = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 8", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Play")]
+ public JoinDataComplete Play = new JoinDataComplete(new JoinData { JoinNumber = 33, JoinSpan = 1 },
+ new JoinMetadata { Description = "Play", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit9")]
- public JoinDataComplete Digit9 = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
- new JoinMetadata { Description = "Digit 9", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Pause")]
+ public JoinDataComplete Pause = new JoinDataComplete(new JoinData { JoinNumber = 34, JoinSpan = 1 },
+ new JoinMetadata { Description = "Pause", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("KeypadClear")]
- public JoinDataComplete KeypadClear = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad Clear", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Stop")]
+ public JoinDataComplete Stop = new JoinDataComplete(new JoinData { JoinNumber = 35, JoinSpan = 1 },
+ new JoinMetadata { Description = "Stop", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("KeypadEnter")]
- public JoinDataComplete KeypadEnter = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad Enter", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("FFwd")]
+ public JoinDataComplete FFwd = new JoinDataComplete(new JoinData { JoinNumber = 36, JoinSpan = 1 },
+ new JoinMetadata { Description = "FFwd", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ChannelUp")]
- public JoinDataComplete ChannelUp = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Channel Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Rewind")]
+ public JoinDataComplete Rewind = new JoinDataComplete(new JoinData { JoinNumber = 37, JoinSpan = 1 },
+ new JoinMetadata { Description = "Rewind", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ChannelDown")]
- public JoinDataComplete ChannelDown = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Channel Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("LastChannel")]
- public JoinDataComplete LastChannel = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
- new JoinMetadata { Description = "Last Channel", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Guide")]
- public JoinDataComplete Guide = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
- new JoinMetadata { Description = "Guide", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Info")]
- public JoinDataComplete Info = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
- new JoinMetadata { Description = "Info", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Red")]
- public JoinDataComplete Red = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
- new JoinMetadata { Description = "Red", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Green")]
- public JoinDataComplete Green = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
- new JoinMetadata { Description = "Green", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Yellow")]
- public JoinDataComplete Yellow = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
- new JoinMetadata { Description = "Yellow", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Blue")]
- public JoinDataComplete Blue = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
- new JoinMetadata { Description = "Blue", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
-
- [JoinName("Play")]
- public JoinDataComplete Play = new JoinDataComplete(new JoinData { JoinNumber = 33, JoinSpan = 1 },
- new JoinMetadata { Description = "Play", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Pause")]
- public JoinDataComplete Pause = new JoinDataComplete(new JoinData { JoinNumber = 34, JoinSpan = 1 },
- new JoinMetadata { Description = "Pause", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Stop")]
- public JoinDataComplete Stop = new JoinDataComplete(new JoinData { JoinNumber = 35, JoinSpan = 1 },
- new JoinMetadata { Description = "Stop", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("FFwd")]
- public JoinDataComplete FFwd = new JoinDataComplete(new JoinData { JoinNumber = 36, JoinSpan = 1 },
- new JoinMetadata { Description = "FFwd", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Rewind")]
- public JoinDataComplete Rewind = new JoinDataComplete(new JoinData { JoinNumber = 37, JoinSpan = 1 },
- new JoinMetadata { Description = "Rewind", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("ChapPlus")]
- public JoinDataComplete ChapPlus = new JoinDataComplete(new JoinData { JoinNumber = 38, JoinSpan = 1 },
- new JoinMetadata { Description = "Chapter Plus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("ChapMinus")]
- public JoinDataComplete ChapMinus = new JoinDataComplete(new JoinData { JoinNumber = 39, JoinSpan = 1 },
- new JoinMetadata { Description = "Chapter Minus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Replay")]
- public JoinDataComplete Replay = new JoinDataComplete(new JoinData { JoinNumber = 40, JoinSpan = 1 },
- new JoinMetadata { Description = "Replay", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Record")]
- public JoinDataComplete Record = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
- new JoinMetadata { Description = "Record", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("HasKeypadAccessoryButton1")]
- public JoinDataComplete HasKeypadAccessoryButton1 = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
- new JoinMetadata { Description = "Has Keypad Accessory Button 1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("HasKeypadAccessoryButton2")]
- public JoinDataComplete HasKeypadAccessoryButton2 = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
- new JoinMetadata { Description = "Has Keypad Accessory Button 2", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("KeypadAccessoryButton1Press")]
- public JoinDataComplete KeypadAccessoryButton1Press = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 2 },
- new JoinMetadata { Description = "Keypad Accessory Button 1 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("KeypadAccessoryButton2Press")]
- public JoinDataComplete KeypadAccessoryButton2Press = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 2 },
- new JoinMetadata { Description = "Keypad Accessory Button 2 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("KeypadAccessoryButton1Label")]
- public JoinDataComplete KeypadAccessoryButton1Label = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("KeypadAccessoryButton2Label")]
- public JoinDataComplete KeypadAccessoryButton2Label = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
- new JoinMetadata { Description = "Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public IRBlurayBaseJoinMap(uint joinStart)
- : this(joinStart, typeof(IRBlurayBaseJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected IRBlurayBaseJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ [JoinName("ChapPlus")]
+ public JoinDataComplete ChapPlus = new JoinDataComplete(new JoinData { JoinNumber = 38, JoinSpan = 1 },
+ new JoinMetadata { Description = "Chapter Plus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("ChapMinus")]
+ public JoinDataComplete ChapMinus = new JoinDataComplete(new JoinData { JoinNumber = 39, JoinSpan = 1 },
+ new JoinMetadata { Description = "Chapter Minus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Replay")]
+ public JoinDataComplete Replay = new JoinDataComplete(new JoinData { JoinNumber = 40, JoinSpan = 1 },
+ new JoinMetadata { Description = "Replay", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Record")]
+ public JoinDataComplete Record = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
+ new JoinMetadata { Description = "Record", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("HasKeypadAccessoryButton1")]
+ public JoinDataComplete HasKeypadAccessoryButton1 = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
+ new JoinMetadata { Description = "Has Keypad Accessory Button 1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("HasKeypadAccessoryButton2")]
+ public JoinDataComplete HasKeypadAccessoryButton2 = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
+ new JoinMetadata { Description = "Has Keypad Accessory Button 2", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("KeypadAccessoryButton1Press")]
+ public JoinDataComplete KeypadAccessoryButton1Press = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 2 },
+ new JoinMetadata { Description = "Keypad Accessory Button 1 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("KeypadAccessoryButton2Press")]
+ public JoinDataComplete KeypadAccessoryButton2Press = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 2 },
+ new JoinMetadata { Description = "Keypad Accessory Button 2 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("KeypadAccessoryButton1Label")]
+ public JoinDataComplete KeypadAccessoryButton1Label = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("KeypadAccessoryButton2Label")]
+ public JoinDataComplete KeypadAccessoryButton2Label = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
+ new JoinMetadata { Description = "Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public IRBlurayBaseJoinMap(uint joinStart)
+ : this(joinStart, typeof(IRBlurayBaseJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected IRBlurayBaseJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/PduJoinMapBase.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/PduJoinMapBase.cs
index 0c2e9ed9b..10bf590d7 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/PduJoinMapBase.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/PduJoinMapBase.cs
@@ -1,60 +1,59 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class PduJoinMapBase : JoinMapBaseAdvanced
{
- public class PduJoinMapBase : JoinMapBaseAdvanced
- {
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "PDU Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("Online")]
- public JoinDataComplete Online = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutletCount")]
- public JoinDataComplete OutletCount = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Number of COntrolled Outlets", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("OutletName")]
- public JoinDataComplete OutletName = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Outlet Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("OutletEnabled")]
- public JoinDataComplete OutletEnabled = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Outlet Enabled", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutletPowerCycle")]
- public JoinDataComplete OutletPowerCycle = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "Outlet Power Cycle", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutletPowerOn")]
- public JoinDataComplete OutletPowerOn = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "Outlet Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("OutletPowerOff")]
- public JoinDataComplete OutletPowerOff = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "Outlet Power Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
-
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public PduJoinMapBase(uint joinStart)
- :base(joinStart, typeof(PduJoinMapBase))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- public PduJoinMapBase(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "PDU Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("Online")]
+ public JoinDataComplete Online = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutletCount")]
+ public JoinDataComplete OutletCount = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Number of COntrolled Outlets", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("OutletName")]
+ public JoinDataComplete OutletName = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("OutletEnabled")]
+ public JoinDataComplete OutletEnabled = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Enabled", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutletPowerCycle")]
+ public JoinDataComplete OutletPowerCycle = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Power Cycle", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutletPowerOn")]
+ public JoinDataComplete OutletPowerOn = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Power On", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("OutletPowerOff")]
+ public JoinDataComplete OutletPowerOff = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "Outlet Power Off", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public PduJoinMapBase(uint joinStart)
+ :base(joinStart, typeof(PduJoinMapBase))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ public PduJoinMapBase(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/SetTopBoxControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/SetTopBoxControllerJoinMap.cs
index ec0ff8d25..0705eb93b 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/SetTopBoxControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/SetTopBoxControllerJoinMap.cs
@@ -1,240 +1,239 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class SetTopBoxControllerJoinMap : JoinMapBaseAdvanced
{
- public class SetTopBoxControllerJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("PowerOn")]
- public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Power On", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("PowerOn")]
+ public JoinDataComplete PowerOn = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Power On", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("PowerOff")]
+ public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Power Off", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("PowerToggle")]
+ public JoinDataComplete PowerToggle = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Power Toggle", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("HasDpad")]
+ public JoinDataComplete HasDpad = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Has DPad", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Up")]
+ public JoinDataComplete Up = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Nav Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Down")]
+ public JoinDataComplete Down = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Nav Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Left")]
+ public JoinDataComplete Left = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Nav Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Right")]
+ public JoinDataComplete Right = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Nav Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Select")]
+ public JoinDataComplete Select = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Select", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Menu")]
+ public JoinDataComplete Menu = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Menu", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Exit")]
+ public JoinDataComplete Exit = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Exit", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("HasNumeric")]
+ public JoinDataComplete HasNumeric = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Has Numeric", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Digit0")]
+ public JoinDataComplete Digit0 = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 0", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Digit1")]
+ public JoinDataComplete Digit1 = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 1", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PowerOff")]
- public JoinDataComplete PowerOff = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Power Off", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit2")]
+ public JoinDataComplete Digit2 = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 2", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("PowerToggle")]
- public JoinDataComplete PowerToggle = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Power Toggle", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit3")]
+ public JoinDataComplete Digit3 = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 3", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("HasDpad")]
- public JoinDataComplete HasDpad = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Has DPad", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit4")]
+ public JoinDataComplete Digit4 = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 4", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Up")]
- public JoinDataComplete Up = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Nav Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit5")]
+ public JoinDataComplete Digit5 = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 5", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Down")]
- public JoinDataComplete Down = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Nav Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit6")]
+ public JoinDataComplete Digit6 = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 6", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Left")]
- public JoinDataComplete Left = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Nav Left", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit7")]
+ public JoinDataComplete Digit7 = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 7", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Right")]
- public JoinDataComplete Right = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Nav Right", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit8")]
+ public JoinDataComplete Digit8 = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 8", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Select")]
- public JoinDataComplete Select = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Select", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Digit9")]
+ public JoinDataComplete Digit9 = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Digit 9", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Menu")]
- public JoinDataComplete Menu = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Menu", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Dash")]
+ public JoinDataComplete Dash = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Dash", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Exit")]
- public JoinDataComplete Exit = new JoinDataComplete(new JoinData { JoinNumber = 10, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Exit", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("KeypadEnter")]
+ public JoinDataComplete KeypadEnter = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Keypad Enter", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("HasNumeric")]
- public JoinDataComplete HasNumeric = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Has Numeric", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ChannelUp")]
+ public JoinDataComplete ChannelUp = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Channel Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit0")]
- public JoinDataComplete Digit0 = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 0", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ChannelDown")]
+ public JoinDataComplete ChannelDown = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Channel Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit1")]
- public JoinDataComplete Digit1 = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 1", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("LastChannel")]
+ public JoinDataComplete LastChannel = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Last Channel", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit2")]
- public JoinDataComplete Digit2 = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 2", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Guide")]
+ public JoinDataComplete Guide = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Guide", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit3")]
- public JoinDataComplete Digit3 = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 3", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Info")]
+ public JoinDataComplete Info = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Info", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit4")]
- public JoinDataComplete Digit4 = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 4", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Red")]
+ public JoinDataComplete Red = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Red", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit5")]
- public JoinDataComplete Digit5 = new JoinDataComplete(new JoinData { JoinNumber = 16, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 5", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Green")]
+ public JoinDataComplete Green = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Green", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit6")]
- public JoinDataComplete Digit6 = new JoinDataComplete(new JoinData { JoinNumber = 17, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 6", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Yellow")]
+ public JoinDataComplete Yellow = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Yellow", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit7")]
- public JoinDataComplete Digit7 = new JoinDataComplete(new JoinData { JoinNumber = 18, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 7", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Blue")]
+ public JoinDataComplete Blue = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Blue", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit8")]
- public JoinDataComplete Digit8 = new JoinDataComplete(new JoinData { JoinNumber = 19, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 8", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("HasDvr")]
+ public JoinDataComplete HasDvr = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Has DVR", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Digit9")]
- public JoinDataComplete Digit9 = new JoinDataComplete(new JoinData { JoinNumber = 20, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Digit 9", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("DvrList")]
+ public JoinDataComplete DvrList = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB DvrList", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Dash")]
- public JoinDataComplete Dash = new JoinDataComplete(new JoinData { JoinNumber = 21, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Dash", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Play")]
+ public JoinDataComplete Play = new JoinDataComplete(new JoinData { JoinNumber = 33, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Play", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("KeypadEnter")]
- public JoinDataComplete KeypadEnter = new JoinDataComplete(new JoinData { JoinNumber = 22, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Keypad Enter", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Pause")]
+ public JoinDataComplete Pause = new JoinDataComplete(new JoinData { JoinNumber = 34, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Pause", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ChannelUp")]
- public JoinDataComplete ChannelUp = new JoinDataComplete(new JoinData { JoinNumber = 23, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Channel Up", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Stop")]
+ public JoinDataComplete Stop = new JoinDataComplete(new JoinData { JoinNumber = 35, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Stop", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ChannelDown")]
- public JoinDataComplete ChannelDown = new JoinDataComplete(new JoinData { JoinNumber = 24, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Channel Down", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("FFwd")]
+ public JoinDataComplete FFwd = new JoinDataComplete(new JoinData { JoinNumber = 36, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB FFwd", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("LastChannel")]
- public JoinDataComplete LastChannel = new JoinDataComplete(new JoinData { JoinNumber = 25, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Last Channel", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Rewind")]
+ public JoinDataComplete Rewind = new JoinDataComplete(new JoinData { JoinNumber = 37, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Rewind", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Guide")]
- public JoinDataComplete Guide = new JoinDataComplete(new JoinData { JoinNumber = 26, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Guide", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ChapPlus")]
+ public JoinDataComplete ChapPlus = new JoinDataComplete(new JoinData { JoinNumber = 38, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Chapter Plus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Info")]
- public JoinDataComplete Info = new JoinDataComplete(new JoinData { JoinNumber = 27, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Info", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ChapMinus")]
+ public JoinDataComplete ChapMinus = new JoinDataComplete(new JoinData { JoinNumber = 39, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Chapter Minus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Red")]
- public JoinDataComplete Red = new JoinDataComplete(new JoinData { JoinNumber = 28, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Red", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Replay")]
+ public JoinDataComplete Replay = new JoinDataComplete(new JoinData { JoinNumber = 40, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Replay", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Green")]
- public JoinDataComplete Green = new JoinDataComplete(new JoinData { JoinNumber = 29, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Green", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("Record")]
+ public JoinDataComplete Record = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Record", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("Yellow")]
- public JoinDataComplete Yellow = new JoinDataComplete(new JoinData { JoinNumber = 30, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Yellow", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Blue")]
- public JoinDataComplete Blue = new JoinDataComplete(new JoinData { JoinNumber = 31, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Blue", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("HasDvr")]
- public JoinDataComplete HasDvr = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Has DVR", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("DvrList")]
- public JoinDataComplete DvrList = new JoinDataComplete(new JoinData { JoinNumber = 32, JoinSpan = 1 },
- new JoinMetadata { Description = "STB DvrList", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Play")]
- public JoinDataComplete Play = new JoinDataComplete(new JoinData { JoinNumber = 33, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Play", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Pause")]
- public JoinDataComplete Pause = new JoinDataComplete(new JoinData { JoinNumber = 34, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Pause", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Stop")]
- public JoinDataComplete Stop = new JoinDataComplete(new JoinData { JoinNumber = 35, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Stop", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("FFwd")]
- public JoinDataComplete FFwd = new JoinDataComplete(new JoinData { JoinNumber = 36, JoinSpan = 1 },
- new JoinMetadata { Description = "STB FFwd", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Rewind")]
- public JoinDataComplete Rewind = new JoinDataComplete(new JoinData { JoinNumber = 37, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Rewind", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("ChapPlus")]
- public JoinDataComplete ChapPlus = new JoinDataComplete(new JoinData { JoinNumber = 38, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Chapter Plus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("ChapMinus")]
- public JoinDataComplete ChapMinus = new JoinDataComplete(new JoinData { JoinNumber = 39, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Chapter Minus", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Replay")]
- public JoinDataComplete Replay = new JoinDataComplete(new JoinData { JoinNumber = 40, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Replay", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Record")]
- public JoinDataComplete Record = new JoinDataComplete(new JoinData { JoinNumber = 41, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Record", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("HasKeypadAccessoryButton1")]
- public JoinDataComplete HasKeypadAccessoryButton1 = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Has Keypad Accessory Button 1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("HasKeypadAccessoryButton2")]
- public JoinDataComplete HasKeypadAccessoryButton2 = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Has Keypad Accessory Button 2", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("KeypadAccessoryButton1Press")]
- public JoinDataComplete KeypadAccessoryButton1Press = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 2 },
- new JoinMetadata { Description = "STB Keypad Accessory Button 1 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("KeypadAccessoryButton2Press")]
- public JoinDataComplete KeypadAccessoryButton2Press = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 2 },
- new JoinMetadata { Description = "STB Keypad Accessory Button 2 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("KeypadAccessoryButton1Label")]
- public JoinDataComplete KeypadAccessoryButton1Label = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("KeypadAccessoryButton2Label")]
- public JoinDataComplete KeypadAccessoryButton2Label = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("LoadPresets")]
- public JoinDataComplete LoadPresets = new JoinDataComplete(new JoinData { JoinNumber = 50, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Load Presets", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("HasPresets")]
- public JoinDataComplete HasPresets = new JoinDataComplete(new JoinData { JoinNumber = 50, JoinSpan = 1 },
- new JoinMetadata { Description = "STB Load Presets", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public SetTopBoxControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(SetTopBoxControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected SetTopBoxControllerJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ [JoinName("HasKeypadAccessoryButton1")]
+ public JoinDataComplete HasKeypadAccessoryButton1 = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Has Keypad Accessory Button 1", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("HasKeypadAccessoryButton2")]
+ public JoinDataComplete HasKeypadAccessoryButton2 = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Has Keypad Accessory Button 2", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("KeypadAccessoryButton1Press")]
+ public JoinDataComplete KeypadAccessoryButton1Press = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 2 },
+ new JoinMetadata { Description = "STB Keypad Accessory Button 1 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("KeypadAccessoryButton2Press")]
+ public JoinDataComplete KeypadAccessoryButton2Press = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 2 },
+ new JoinMetadata { Description = "STB Keypad Accessory Button 2 Press", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("KeypadAccessoryButton1Label")]
+ public JoinDataComplete KeypadAccessoryButton1Label = new JoinDataComplete(new JoinData { JoinNumber = 42, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("KeypadAccessoryButton2Label")]
+ public JoinDataComplete KeypadAccessoryButton2Label = new JoinDataComplete(new JoinData { JoinNumber = 43, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Keypad Accessory Button 1 Label", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("LoadPresets")]
+ public JoinDataComplete LoadPresets = new JoinDataComplete(new JoinData { JoinNumber = 50, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Load Presets", JoinCapabilities = eJoinCapabilities.FromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("HasPresets")]
+ public JoinDataComplete HasPresets = new JoinDataComplete(new JoinData { JoinNumber = 50, JoinSpan = 1 },
+ new JoinMetadata { Description = "STB Load Presets", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public SetTopBoxControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(SetTopBoxControllerJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected SetTopBoxControllerJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/StatusSignControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/StatusSignControllerJoinMap.cs
index ba441ef00..98cd92180 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/StatusSignControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/StatusSignControllerJoinMap.cs
@@ -1,59 +1,58 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class StatusSignControllerJoinMap : JoinMapBaseAdvanced
{
- public class StatusSignControllerJoinMap : JoinMapBaseAdvanced
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Status Sign Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("Name")]
+ public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Status Sign Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+
+ [JoinName("RedControl")]
+ public JoinDataComplete RedControl = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Status Red LED Enable / Disable", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("RedLed")]
+ public JoinDataComplete RedLed = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Status Red LED Intensity", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("GreenControl")]
+ public JoinDataComplete GreenControl = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Status Green LED Enable / Disable", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("GreenLed")]
+ public JoinDataComplete GreenLed = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Status Green LED Intensity", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ [JoinName("BlueControl")]
+ public JoinDataComplete BlueControl = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Status Blue LED Enable / Disable", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+
+ [JoinName("BlueLed")]
+ public JoinDataComplete BlueLed = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Status Blue LED Intensity", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
+
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public StatusSignControllerJoinMap(uint joinStart)
+ : this(joinStart, typeof(StatusSignControllerJoinMap))
{
- [JoinName("IsOnline")]
- public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Status Sign Online", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("Name")]
- public JoinDataComplete Name = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Status Sign Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
-
- [JoinName("RedControl")]
- public JoinDataComplete RedControl = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Status Red LED Enable / Disable", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("RedLed")]
- public JoinDataComplete RedLed = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Status Red LED Intensity", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("GreenControl")]
- public JoinDataComplete GreenControl = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Status Green LED Enable / Disable", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("GreenLed")]
- public JoinDataComplete GreenLed = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Status Green LED Intensity", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- [JoinName("BlueControl")]
- public JoinDataComplete BlueControl = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Status Blue LED Enable / Disable", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
-
- [JoinName("BlueLed")]
- public JoinDataComplete BlueLed = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Status Blue LED Intensity", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Analog });
-
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public StatusSignControllerJoinMap(uint joinStart)
- : this(joinStart, typeof(StatusSignControllerJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected StatusSignControllerJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ }
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected StatusSignControllerJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
+
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/SystemMonitorJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/SystemMonitorJoinMap.cs
index 9adabfce9..6cd482afa 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/SystemMonitorJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/SystemMonitorJoinMap.cs
@@ -1,136 +1,136 @@
using System;
-namespace PepperDash.Essentials.Core.Bridges
+namespace PepperDash.Essentials.Core.Bridges;
+
+public class SystemMonitorJoinMap : JoinMapBaseAdvanced
{
- public class SystemMonitorJoinMap : JoinMapBaseAdvanced
- {
- [JoinName("TimeZone")]
- public JoinDataComplete TimeZone = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Timezone", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
+ [JoinName("TimeZone")]
+ public JoinDataComplete TimeZone = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Timezone", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Analog });
- [JoinName("TimeZoneName")]
- public JoinDataComplete TimeZoneName = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Timezone Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("TimeZoneName")]
+ public JoinDataComplete TimeZoneName = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Timezone Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("IOControllerVersion")]
- public JoinDataComplete IOControllerVersion = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor IO Controller Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("IOControllerVersion")]
+ public JoinDataComplete IOControllerVersion = new JoinDataComplete(new JoinData { JoinNumber = 2, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor IO Controller Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("SnmpAppVersion")]
- public JoinDataComplete SnmpAppVersion = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor SNMP App Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("SnmpAppVersion")]
+ public JoinDataComplete SnmpAppVersion = new JoinDataComplete(new JoinData { JoinNumber = 3, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor SNMP App Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("BACnetAppVersion")]
- public JoinDataComplete BACnetAppVersion = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor BACNet App Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("BACnetAppVersion")]
+ public JoinDataComplete BACnetAppVersion = new JoinDataComplete(new JoinData { JoinNumber = 4, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor BACNet App Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("ControllerVersion")]
- public JoinDataComplete ControllerVersion = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Controller Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("ControllerVersion")]
+ public JoinDataComplete ControllerVersion = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Controller Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("SerialNumber")]
- public JoinDataComplete SerialNumber = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Serial Number", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("SerialNumber")]
+ public JoinDataComplete SerialNumber = new JoinDataComplete(new JoinData { JoinNumber = 6, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Serial Number", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("Model")]
- public JoinDataComplete Model = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Model", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("Model")]
+ public JoinDataComplete Model = new JoinDataComplete(new JoinData { JoinNumber = 7, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Model", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("Uptime")]
- public JoinDataComplete Uptime = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Uptime", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("Uptime")]
+ public JoinDataComplete Uptime = new JoinDataComplete(new JoinData { JoinNumber = 8, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Uptime", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("LastBoot")]
- public JoinDataComplete LastBoot = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Last Boot", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("LastBoot")]
+ public JoinDataComplete LastBoot = new JoinDataComplete(new JoinData { JoinNumber = 9, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Last Boot", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("ProgramOffsetJoin")]
- public JoinDataComplete ProgramOffsetJoin = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 5 },
- new JoinMetadata { Description = "All Program Data is offset between slots by 5 - First Joins Start at 11", JoinCapabilities = eJoinCapabilities.None, JoinType = eJoinType.None });
+ [JoinName("ProgramOffsetJoin")]
+ public JoinDataComplete ProgramOffsetJoin = new JoinDataComplete(new JoinData { JoinNumber = 5, JoinSpan = 5 },
+ new JoinMetadata { Description = "All Program Data is offset between slots by 5 - First Joins Start at 11", JoinCapabilities = eJoinCapabilities.None, JoinType = eJoinType.None });
- [JoinName("ProgramStart")]
- public JoinDataComplete ProgramStart = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Program Start / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ProgramStart")]
+ public JoinDataComplete ProgramStart = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Program Start / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ProgramStop")]
- public JoinDataComplete ProgramStop = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Program Stop / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ProgramStop")]
+ public JoinDataComplete ProgramStop = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Program Stop / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ProgramRegister")]
- public JoinDataComplete ProgramRegister = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Program Register / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ProgramRegister")]
+ public JoinDataComplete ProgramRegister = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Program Register / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ProgramUnregister")]
- public JoinDataComplete ProgramUnregister = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Program UnRegister / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
+ [JoinName("ProgramUnregister")]
+ public JoinDataComplete ProgramUnregister = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Program UnRegister / Fb", JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinType = eJoinType.Digital });
- [JoinName("ProgramName")]
- public JoinDataComplete ProgramName = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Program Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("ProgramName")]
+ public JoinDataComplete ProgramName = new JoinDataComplete(new JoinData { JoinNumber = 11, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Program Name", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("ProgramCompiledTime")]
- public JoinDataComplete ProgramCompiledTime = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Program Compile Time", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("ProgramCompiledTime")]
+ public JoinDataComplete ProgramCompiledTime = new JoinDataComplete(new JoinData { JoinNumber = 12, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Program Compile Time", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("ProgramCrestronDatabaseVersion")]
- public JoinDataComplete ProgramCrestronDatabaseVersion = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Program Database Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("ProgramCrestronDatabaseVersion")]
+ public JoinDataComplete ProgramCrestronDatabaseVersion = new JoinDataComplete(new JoinData { JoinNumber = 13, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Program Database Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("ProgramEnvironmentVersion")]
- public JoinDataComplete ProgramEnvironmentVersion = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Program Environment Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("ProgramEnvironmentVersion")]
+ public JoinDataComplete ProgramEnvironmentVersion = new JoinDataComplete(new JoinData { JoinNumber = 14, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Program Environment Version", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("AggregatedProgramInfo")]
- public JoinDataComplete AggregatedProgramInfo = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Program Aggregate Info Json", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("AggregatedProgramInfo")]
+ public JoinDataComplete AggregatedProgramInfo = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Program Aggregate Info Json", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("EthernetOffsetJoin")]
- public JoinDataComplete EthernetOffsetJoin = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
- new JoinMetadata { Description = "All Ethernet Data is offset between Nics by 5 - First Joins Start at 76", JoinCapabilities = eJoinCapabilities.None, JoinType = eJoinType.None });
+ [JoinName("EthernetOffsetJoin")]
+ public JoinDataComplete EthernetOffsetJoin = new JoinDataComplete(new JoinData { JoinNumber = 15, JoinSpan = 1 },
+ new JoinMetadata { Description = "All Ethernet Data is offset between Nics by 5 - First Joins Start at 76", JoinCapabilities = eJoinCapabilities.None, JoinType = eJoinType.None });
- [JoinName("HostName")]
- public JoinDataComplete HostName = new JoinDataComplete(new JoinData { JoinNumber = 76, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Hostname", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("HostName")]
+ public JoinDataComplete HostName = new JoinDataComplete(new JoinData { JoinNumber = 76, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Hostname", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("CurrentIpAddress")]
- public JoinDataComplete CurrentIpAddress = new JoinDataComplete(new JoinData { JoinNumber = 77, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Current Ip Address", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("CurrentIpAddress")]
+ public JoinDataComplete CurrentIpAddress = new JoinDataComplete(new JoinData { JoinNumber = 77, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Current Ip Address", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("CurrentSubnetMask")]
- public JoinDataComplete CurrentSubnetMask = new JoinDataComplete(new JoinData { JoinNumber = 78, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Current Subnet Mask", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("CurrentSubnetMask")]
+ public JoinDataComplete CurrentSubnetMask = new JoinDataComplete(new JoinData { JoinNumber = 78, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Current Subnet Mask", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("CurrentDefaultGateway")]
- public JoinDataComplete CurrentDefaultGateway = new JoinDataComplete(new JoinData { JoinNumber = 79, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Current Default Gateway", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("CurrentDefaultGateway")]
+ public JoinDataComplete CurrentDefaultGateway = new JoinDataComplete(new JoinData { JoinNumber = 79, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Current Default Gateway", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("StaticIpAddress")]
- public JoinDataComplete StaticIpAddress = new JoinDataComplete(new JoinData { JoinNumber = 80, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Static Ip Address", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("StaticIpAddress")]
+ public JoinDataComplete StaticIpAddress = new JoinDataComplete(new JoinData { JoinNumber = 80, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Static Ip Address", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("StaticSubnetMask")]
- public JoinDataComplete StaticSubnetMask = new JoinDataComplete(new JoinData { JoinNumber = 81, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Static Subnet Mask", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("StaticSubnetMask")]
+ public JoinDataComplete StaticSubnetMask = new JoinDataComplete(new JoinData { JoinNumber = 81, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Static Subnet Mask", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("StaticDefaultGateway")]
- public JoinDataComplete StaticDefaultGateway = new JoinDataComplete(new JoinData { JoinNumber = 82, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Static Default Gateway", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("StaticDefaultGateway")]
+ public JoinDataComplete StaticDefaultGateway = new JoinDataComplete(new JoinData { JoinNumber = 82, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Static Default Gateway", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("Domain")]
- public JoinDataComplete Domain = new JoinDataComplete(new JoinData { JoinNumber = 83, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Domain", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("Domain")]
+ public JoinDataComplete Domain = new JoinDataComplete(new JoinData { JoinNumber = 83, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Domain", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("DnsServer")]
- public JoinDataComplete DnsServer = new JoinDataComplete(new JoinData { JoinNumber = 84, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Dns Server", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("DnsServer")]
+ public JoinDataComplete DnsServer = new JoinDataComplete(new JoinData { JoinNumber = 84, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Dns Server", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("MacAddress")]
- public JoinDataComplete MacAddress = new JoinDataComplete(new JoinData { JoinNumber = 85, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Mac Address", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("MacAddress")]
+ public JoinDataComplete MacAddress = new JoinDataComplete(new JoinData { JoinNumber = 85, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Mac Address", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
- [JoinName("DhcpStatus")]
- public JoinDataComplete DhcpStatus = new JoinDataComplete(new JoinData { JoinNumber = 86, JoinSpan = 1 },
- new JoinMetadata { Description = "Processor Ethernet Dhcp Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
+ [JoinName("DhcpStatus")]
+ public JoinDataComplete DhcpStatus = new JoinDataComplete(new JoinData { JoinNumber = 86, JoinSpan = 1 },
+ new JoinMetadata { Description = "Processor Ethernet Dhcp Status", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Serial });
[JoinName("ProcessorRebot")]
public JoinDataComplete ProcessorReboot = new JoinDataComplete(new JoinData { JoinNumber = 1, JoinSpan = 1 },
@@ -149,23 +149,22 @@ public class SystemMonitorJoinMap : JoinMapBaseAdvanced
new JoinMetadata { Description = "Resets the program", JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinType = eJoinType.Digital });
- ///
- /// Constructor to use when instantiating this Join Map without inheriting from it
- ///
- /// Join this join map will start at
- public SystemMonitorJoinMap(uint joinStart)
- : this(joinStart, typeof(SystemMonitorJoinMap))
- {
- }
-
- ///
- /// Constructor to use when extending this Join map
- ///
- /// Join this join map will start at
- /// Type of the child join map
- protected SystemMonitorJoinMap(uint joinStart, Type type)
- : base(joinStart, type)
- {
- }
+ ///
+ /// Constructor to use when instantiating this Join Map without inheriting from it
+ ///
+ /// Join this join map will start at
+ public SystemMonitorJoinMap(uint joinStart)
+ : this(joinStart, typeof(SystemMonitorJoinMap))
+ {
+ }
+
+ ///
+ /// Constructor to use when extending this Join map
+ ///
+ /// Join this join map will start at
+ /// Type of the child join map
+ protected SystemMonitorJoinMap(uint joinStart, Type type)
+ : base(joinStart, type)
+ {
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs
index 755a586eb..c4526e474 100644
--- a/src/PepperDash.Essentials.Core/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs
+++ b/src/PepperDash.Essentials.Core/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs
@@ -1,7 +1,7 @@
using System;
using PepperDash.Essentials.Core;
-namespace PepperDash.Essentials.Core.Bridges.JoinMaps
-{
+namespace PepperDash.Essentials.Core.Bridges.JoinMaps;
+
public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
{
#region Digital
@@ -20,21 +20,21 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("SendDtmfToSpecificCallIndex")]
- public JoinDataComplete SendDtmfToSpecificCallIndex = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 10,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "If High, will send DTMF tones to the call set by SelectCall analog. If low sends DTMF tones to last connected call.",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("Dtmf1")]
+ [JoinName("SendDtmfToSpecificCallIndex")]
+ public JoinDataComplete SendDtmfToSpecificCallIndex = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 10,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "If High, will send DTMF tones to the call set by SelectCall analog. If low sends DTMF tones to last connected call.",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("Dtmf1")]
public JoinDataComplete Dtmf1 = new JoinDataComplete(
new JoinData
{
@@ -48,7 +48,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("Dtmf2")]
+ [JoinName("Dtmf2")]
public JoinDataComplete Dtmf2 = new JoinDataComplete(
new JoinData
{
@@ -62,7 +62,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("Dtmf3")]
+ [JoinName("Dtmf3")]
public JoinDataComplete Dtmf3 = new JoinDataComplete(
new JoinData
{
@@ -76,7 +76,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("Dtmf4")]
+ [JoinName("Dtmf4")]
public JoinDataComplete Dtmf4 = new JoinDataComplete(
new JoinData
{
@@ -90,7 +90,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("Dtmf5")]
+ [JoinName("Dtmf5")]
public JoinDataComplete Dtmf5 = new JoinDataComplete(
new JoinData
{
@@ -104,7 +104,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("Dtmf6")]
+ [JoinName("Dtmf6")]
public JoinDataComplete Dtmf6 = new JoinDataComplete(
new JoinData
{
@@ -118,7 +118,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("Dtmf7")]
+ [JoinName("Dtmf7")]
public JoinDataComplete Dtmf7 = new JoinDataComplete(
new JoinData
{
@@ -132,7 +132,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("Dtmf8")]
+ [JoinName("Dtmf8")]
public JoinDataComplete Dtmf8 = new JoinDataComplete(
new JoinData
{
@@ -146,7 +146,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("Dtmf9")]
+ [JoinName("Dtmf9")]
public JoinDataComplete Dtmf9 = new JoinDataComplete(
new JoinData
{
@@ -160,7 +160,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("Dtmf0")]
+ [JoinName("Dtmf0")]
public JoinDataComplete Dtmf0 = new JoinDataComplete(
new JoinData
{
@@ -174,7 +174,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("DtmfStar")]
+ [JoinName("DtmfStar")]
public JoinDataComplete DtmfStar = new JoinDataComplete(
new JoinData
{
@@ -188,7 +188,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("DtmfPound")]
+ [JoinName("DtmfPound")]
public JoinDataComplete DtmfPound = new JoinDataComplete(
new JoinData
{
@@ -202,7 +202,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("EndAllCalls")]
+ [JoinName("EndAllCalls")]
public JoinDataComplete EndAllCalls = new JoinDataComplete(
new JoinData
{
@@ -300,7 +300,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("DialPhone")]
+ [JoinName("DialPhone")]
public JoinDataComplete DialPhone = new JoinDataComplete(
new JoinData
{
@@ -328,7 +328,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("HangUpPhone")]
+ [JoinName("HangUpPhone")]
public JoinDataComplete HangUpPhone = new JoinDataComplete(
new JoinData
{
@@ -342,47 +342,47 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("EndCallStart")]
- public JoinDataComplete EndCallStart = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 81,
- JoinSpan = 8
- },
- new JoinMetadata
- {
- Description = "End a specific call by call index. ",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("JoinAllCalls")]
- public JoinDataComplete JoinAllCalls = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 90,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Join all calls",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("JoinCallStart")]
- public JoinDataComplete JoinCallStart = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 91,
- JoinSpan = 8
- },
- new JoinMetadata
- {
- Description = "Join a specific call by call index. ",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
+ [JoinName("EndCallStart")]
+ public JoinDataComplete EndCallStart = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 81,
+ JoinSpan = 8
+ },
+ new JoinMetadata
+ {
+ Description = "End a specific call by call index. ",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("JoinAllCalls")]
+ public JoinDataComplete JoinAllCalls = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 90,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Join all calls",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("JoinCallStart")]
+ public JoinDataComplete JoinCallStart = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 91,
+ JoinSpan = 8
+ },
+ new JoinMetadata
+ {
+ Description = "Join a specific call by call index. ",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
[JoinName("DirectorySearchBusy")]
public JoinDataComplete DirectorySearchBusy = new JoinDataComplete(
@@ -497,47 +497,47 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("DirectoryDisableAutoDialSelectedLine")]
- public JoinDataComplete DirectoryDisableAutoDialSelectedLine = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 107,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Set high to disable automatic dialing of a contact when selected",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("DirectoryDialSelectedContactMethod")]
- public JoinDataComplete DirectoryDialSelectedContactMethod = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 108,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Pulse to dial the selected contact method",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("DirectoryClearSelected")]
- public JoinDataComplete DirectoryClearSelected = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 110,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Clear Selected Entry and String from Search",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
+ [JoinName("DirectoryDisableAutoDialSelectedLine")]
+ public JoinDataComplete DirectoryDisableAutoDialSelectedLine = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 107,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Set high to disable automatic dialing of a contact when selected",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("DirectoryDialSelectedContactMethod")]
+ public JoinDataComplete DirectoryDialSelectedContactMethod = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 108,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Pulse to dial the selected contact method",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("DirectoryClearSelected")]
+ public JoinDataComplete DirectoryClearSelected = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 110,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Clear Selected Entry and String from Search",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
[JoinName("CameraTiltUp")]
@@ -624,47 +624,47 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("CameraFocusNear")]
- public JoinDataComplete CameraFocusNear = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 117,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Camera Focus Near",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("CameraFocusFar")]
- public JoinDataComplete CameraFocusFar = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 118,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Camera Focus Far",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("CameraFocusAuto")]
- public JoinDataComplete CameraFocusAuto = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 119,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Camera Auto Focus Trigger",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
+ [JoinName("CameraFocusNear")]
+ public JoinDataComplete CameraFocusNear = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 117,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Camera Focus Near",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("CameraFocusFar")]
+ public JoinDataComplete CameraFocusFar = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 118,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Camera Focus Far",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("CameraFocusAuto")]
+ public JoinDataComplete CameraFocusAuto = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 119,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Camera Auto Focus Trigger",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
[JoinName("CameraPresetSave")]
public JoinDataComplete CameraPresetSave = new JoinDataComplete(
@@ -792,7 +792,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("DialMeetingStart")]
+ [JoinName("DialMeetingStart")]
public JoinDataComplete DialMeetingStart = new JoinDataComplete(
new JoinData
{
@@ -918,33 +918,33 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("RemoveSelectedRecentCallItem")]
- public JoinDataComplete RemoveSelectedRecentCallItem = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 181,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Pulse to remove the selected recent call item specified by the SelectRecentCallItem analog join",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("DialSelectedRecentCallItem")]
- public JoinDataComplete DialSelectedRecentCallItem = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 182,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Pulse to dial the selected recent call item specified by the SelectRecentCallItem analog join",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
+ [JoinName("RemoveSelectedRecentCallItem")]
+ public JoinDataComplete RemoveSelectedRecentCallItem = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 181,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Pulse to remove the selected recent call item specified by the SelectRecentCallItem analog join",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("DialSelectedRecentCallItem")]
+ public JoinDataComplete DialSelectedRecentCallItem = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 182,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Pulse to dial the selected recent call item specified by the SelectRecentCallItem analog join",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
[JoinName("SourceShareStart")]
public JoinDataComplete SourceShareStart = new JoinDataComplete(
@@ -1016,117 +1016,117 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Digital
});
- [JoinName("HoldAllCalls")]
- public JoinDataComplete HoldAllCalls = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 220,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Holds all calls",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("HoldCallsStart")]
- public JoinDataComplete HoldCallsStart = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 221,
- JoinSpan = 8
- },
- new JoinMetadata
- {
- Description = "Holds Call at specified index. FB reported on Call Status XSIG",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("ResumeCallsStart")]
- public JoinDataComplete ResumeCallsStart = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 231,
- JoinSpan = 8
- },
- new JoinMetadata
- {
- Description = "Resume Call at specified index",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("MultiSiteOptionIsEnabled")]
- public JoinDataComplete MultiSiteOptionIsEnabled = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 301,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Multi site option is enabled FB",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("AutoAnswerEnabled")]
- public JoinDataComplete AutoAnswerEnabled = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 302,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Auto Answer is enabled FB",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
-
- [JoinName("ParticipantAudioMuteToggleStart")]
- public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete(
+ [JoinName("HoldAllCalls")]
+ public JoinDataComplete HoldAllCalls = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 220,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Holds all calls",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("HoldCallsStart")]
+ public JoinDataComplete HoldCallsStart = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 221,
+ JoinSpan = 8
+ },
+ new JoinMetadata
+ {
+ Description = "Holds Call at specified index. FB reported on Call Status XSIG",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("ResumeCallsStart")]
+ public JoinDataComplete ResumeCallsStart = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 231,
+ JoinSpan = 8
+ },
+ new JoinMetadata
+ {
+ Description = "Resume Call at specified index",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("MultiSiteOptionIsEnabled")]
+ public JoinDataComplete MultiSiteOptionIsEnabled = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 301,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Multi site option is enabled FB",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("AutoAnswerEnabled")]
+ public JoinDataComplete AutoAnswerEnabled = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 302,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Auto Answer is enabled FB",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
+
+ [JoinName("ParticipantAudioMuteToggleStart")]
+ public JoinDataComplete ParticipantAudioMuteToggleStart = new JoinDataComplete(
new JoinData
{
JoinNumber = 501,
JoinSpan = 50
},
- new JoinMetadata
- {
- Description = "Toggles the participant's audio mute status",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
+ new JoinMetadata
+ {
+ Description = "Toggles the participant's audio mute status",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
- [JoinName("ParticipantVideoMuteToggleStart")]
- public JoinDataComplete ParticipantVideoMuteToggleStart = new JoinDataComplete(
+ [JoinName("ParticipantVideoMuteToggleStart")]
+ public JoinDataComplete ParticipantVideoMuteToggleStart = new JoinDataComplete(
new JoinData
{
JoinNumber = 801,
JoinSpan = 50
},
- new JoinMetadata
- {
- Description = "Toggles the participant's video mute status",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
+ new JoinMetadata
+ {
+ Description = "Toggles the participant's video mute status",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
- [JoinName("ParticipantPinToggleStart")]
- public JoinDataComplete ParticipantPinToggleStart = new JoinDataComplete(
+ [JoinName("ParticipantPinToggleStart")]
+ public JoinDataComplete ParticipantPinToggleStart = new JoinDataComplete(
new JoinData
{
JoinNumber = 1101,
JoinSpan = 50
},
- new JoinMetadata
- {
- Description = "Toggles the participant's pin status",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Digital
- });
+ new JoinMetadata
+ {
+ Description = "Toggles the participant's pin status",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Digital
+ });
#endregion
@@ -1135,49 +1135,49 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
#region Analog
- // TODO [ ] hotfix/videocodecbase-max-meeting-xsig-set
- [JoinName("MeetingsToDisplay")]
- public JoinDataComplete MeetingsToDisplay = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 40,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Set/FB the number of meetings to display via the bridge xsig; default: 3 meetings.",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Analog
- });
-
- [JoinName("SelectCall")]
- public JoinDataComplete SelectCall = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 24,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Sets the selected Call for DTMF commands. Valid values 1-8",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Analog
- });
-
-
- [JoinName("ConnectedCallCount")]
- public JoinDataComplete ConnectedCallCount = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 25,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Reports the number of currently connected calls",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Analog
- });
+ // TODO [ ] hotfix/videocodecbase-max-meeting-xsig-set
+ [JoinName("MeetingsToDisplay")]
+ public JoinDataComplete MeetingsToDisplay = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 40,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Set/FB the number of meetings to display via the bridge xsig; default: 3 meetings.",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+ [JoinName("SelectCall")]
+ public JoinDataComplete SelectCall = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 24,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Sets the selected Call for DTMF commands. Valid values 1-8",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+
+ [JoinName("ConnectedCallCount")]
+ public JoinDataComplete ConnectedCallCount = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 25,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Reports the number of currently connected calls",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Analog
+ });
[JoinName("MinutesBeforeMeetingStart")]
public JoinDataComplete MinutesBeforeMeetingStart = new JoinDataComplete(
@@ -1207,19 +1207,19 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Analog
});
- [JoinName("CameraCount")]
- public JoinDataComplete CameraCount = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 61,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Reports the number of cameras",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Analog
- });
+ [JoinName("CameraCount")]
+ public JoinDataComplete CameraCount = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 61,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Reports the number of cameras",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Analog
+ });
[JoinName("DirectoryRowCount")]
public JoinDataComplete DirectoryRowCount = new JoinDataComplete(
@@ -1250,47 +1250,47 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
});
- [JoinName("SelectedContactMethodCount")]
- public JoinDataComplete SelectedContactMethodCount = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 102,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Reports the number of contact methods for the selected contact",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Analog
- });
-
- [JoinName("SelectContactMethod")]
- public JoinDataComplete SelectContactMethod = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 103,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Selects a contact method by index",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Analog
- });
-
- [JoinName("DirectorySelectRowFeedback")]
- public JoinDataComplete DirectorySelectRowFeedback = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 104,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Directory Select Row and Feedback",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Analog
- });
+ [JoinName("SelectedContactMethodCount")]
+ public JoinDataComplete SelectedContactMethodCount = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 102,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Reports the number of contact methods for the selected contact",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+ [JoinName("SelectContactMethod")]
+ public JoinDataComplete SelectContactMethod = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 103,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Selects a contact method by index",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+ [JoinName("DirectorySelectRowFeedback")]
+ public JoinDataComplete DirectorySelectRowFeedback = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 104,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Directory Select Row and Feedback",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Analog
+ });
@@ -1308,19 +1308,19 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Analog
});
- [JoinName("FarEndPresetSelect")]
- public JoinDataComplete FarEndPresetSelect = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 122,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Far End Preset Preset Select",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Analog
- });
+ [JoinName("FarEndPresetSelect")]
+ public JoinDataComplete FarEndPresetSelect = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 122,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Far End Preset Preset Select",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Analog
+ });
[JoinName("ParticipantCount")]
public JoinDataComplete ParticipantCount = new JoinDataComplete(
@@ -1364,47 +1364,47 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Analog
});
- [JoinName("SelectRecentCallItem")]
- public JoinDataComplete SelectRecentCallItem = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 180,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Select/FB for Recent Call Item. Valid values 1 - 10",
- JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
- JoinType = eJoinType.Analog
- });
-
- [JoinName("RecentCallOccurrenceType")]
- public JoinDataComplete RecentCallOccurrenceType = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 181,
- JoinSpan = 10
- },
- new JoinMetadata
- {
- Description = "Recent Call Occurrence Type. [0-3] 0 = Unknown, 1 = Placed, 2 = Received, 3 = NoAnswer",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Analog
- });
-
- [JoinName("RecentCallCount")]
- public JoinDataComplete RecentCallCount = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 191,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Recent Call Count",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Analog
- });
+ [JoinName("SelectRecentCallItem")]
+ public JoinDataComplete SelectRecentCallItem = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 180,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Select/FB for Recent Call Item. Valid values 1 - 10",
+ JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+ [JoinName("RecentCallOccurrenceType")]
+ public JoinDataComplete RecentCallOccurrenceType = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 181,
+ JoinSpan = 10
+ },
+ new JoinMetadata
+ {
+ Description = "Recent Call Occurrence Type. [0-3] 0 = Unknown, 1 = Placed, 2 = Received, 3 = NoAnswer",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Analog
+ });
+
+ [JoinName("RecentCallCount")]
+ public JoinDataComplete RecentCallCount = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 191,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Recent Call Count",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Analog
+ });
#endregion
@@ -1426,7 +1426,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Serial
});
- [JoinName("PhoneDialString")]
+ [JoinName("PhoneDialString")]
public JoinDataComplete PhoneDialString = new JoinDataComplete(
new JoinData
{
@@ -1440,7 +1440,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Serial
});
- [JoinName("CurrentCallData")]
+ [JoinName("CurrentCallData")]
public JoinDataComplete CurrentCallData = new JoinDataComplete(
new JoinData
{
@@ -1539,19 +1539,19 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Serial
});
- [JoinName("ContactMethods")]
- public JoinDataComplete ContactMethods = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 103,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Contact Methods - XSig, 10 entries",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
+ [JoinName("ContactMethods")]
+ public JoinDataComplete ContactMethods = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 103,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Contact Methods - XSig, 10 entries",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
[JoinName("CameraPresetNames")]
public JoinDataComplete CameraPresetNames = new JoinDataComplete(
@@ -1567,7 +1567,7 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Serial
});
- [JoinName("CurrentLayoutStringFb")]
+ [JoinName("CurrentLayoutStringFb")]
public JoinDataComplete CurrentLayoutStringFb = new JoinDataComplete(
new JoinData
{
@@ -1581,33 +1581,33 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Serial
});
- [JoinName("AvailableLayoutsFb")]
- public JoinDataComplete AvailableLayoutsFb = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 142,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "xSig of all available layouts",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("SelectLayout")]
- public JoinDataComplete SelectLayout = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 142,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Select Layout by string",
- JoinCapabilities = eJoinCapabilities.FromSIMPL,
- JoinType = eJoinType.Serial
- });
+ [JoinName("AvailableLayoutsFb")]
+ public JoinDataComplete AvailableLayoutsFb = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 142,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "xSig of all available layouts",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("SelectLayout")]
+ public JoinDataComplete SelectLayout = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 142,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Select Layout by string",
+ JoinCapabilities = eJoinCapabilities.FromSIMPL,
+ JoinType = eJoinType.Serial
+ });
@@ -1625,75 +1625,75 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Serial
});
- [JoinName("CameraNamesFb")]
- public JoinDataComplete CameraNamesFb = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 161,
- JoinSpan = 10
- },
- new JoinMetadata
- {
- Description = "Camera Name Fb",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("SelectedRecentCallName")]
- public JoinDataComplete SelectedRecentCallName = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 171,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Selected Recent Call Name",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("SelectedRecentCallNumber")]
- public JoinDataComplete SelectedRecentCallNumber = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 172,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "Selected Recent Call Number",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("RecentCallNamesStart")]
- public JoinDataComplete RecentCallNamesStart = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 181,
- JoinSpan = 10
- },
- new JoinMetadata
- {
- Description = "Recent Call Names",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("RecentCallTimesStart")]
- public JoinDataComplete RecentCallTimesStart = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 191,
- JoinSpan = 10
- },
- new JoinMetadata
- {
- Description = "Recent Calls Times",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
+ [JoinName("CameraNamesFb")]
+ public JoinDataComplete CameraNamesFb = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 161,
+ JoinSpan = 10
+ },
+ new JoinMetadata
+ {
+ Description = "Camera Name Fb",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("SelectedRecentCallName")]
+ public JoinDataComplete SelectedRecentCallName = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 171,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Selected Recent Call Name",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("SelectedRecentCallNumber")]
+ public JoinDataComplete SelectedRecentCallNumber = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 172,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "Selected Recent Call Number",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("RecentCallNamesStart")]
+ public JoinDataComplete RecentCallNamesStart = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 181,
+ JoinSpan = 10
+ },
+ new JoinMetadata
+ {
+ Description = "Recent Call Names",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("RecentCallTimesStart")]
+ public JoinDataComplete RecentCallTimesStart = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 191,
+ JoinSpan = 10
+ },
+ new JoinMetadata
+ {
+ Description = "Recent Calls Times",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
[JoinName("CurrentSource")]
public JoinDataComplete CurrentSource = new JoinDataComplete(
@@ -1723,75 +1723,75 @@ public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
JoinType = eJoinType.Serial
});
- [JoinName("DeviceIpAddresss")]
- public JoinDataComplete DeviceIpAddresss = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 301,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "IP Address of device",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("SipPhoneNumber")]
- public JoinDataComplete SipPhoneNumber = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 302,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "SIP phone number of device",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("E164Alias")]
- public JoinDataComplete E164Alias = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 303,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "E164 alias of device",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("H323Id")]
- public JoinDataComplete H323Id = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 304,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "H323 ID of device",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
-
- [JoinName("SipUri")]
- public JoinDataComplete SipUri = new JoinDataComplete(
- new JoinData
- {
- JoinNumber = 305,
- JoinSpan = 1
- },
- new JoinMetadata
- {
- Description = "SIP URI of device",
- JoinCapabilities = eJoinCapabilities.ToSIMPL,
- JoinType = eJoinType.Serial
- });
+ [JoinName("DeviceIpAddresss")]
+ public JoinDataComplete DeviceIpAddresss = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 301,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "IP Address of device",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("SipPhoneNumber")]
+ public JoinDataComplete SipPhoneNumber = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 302,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "SIP phone number of device",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("E164Alias")]
+ public JoinDataComplete E164Alias = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 303,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "E164 alias of device",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("H323Id")]
+ public JoinDataComplete H323Id = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 304,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "H323 ID of device",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
+
+ [JoinName("SipUri")]
+ public JoinDataComplete SipUri = new JoinDataComplete(
+ new JoinData
+ {
+ JoinNumber = 305,
+ JoinSpan = 1
+ },
+ new JoinMetadata
+ {
+ Description = "SIP URI of device",
+ JoinCapabilities = eJoinCapabilities.ToSIMPL,
+ JoinType = eJoinType.Serial
+ });
[JoinName("DirectoryEntrySelectedName")]
public JoinDataComplete DirectoryEntrySelectedName = new JoinDataComplete(
@@ -1848,4 +1848,3 @@ public VideoCodecControllerJoinMap(uint joinStart, Type type)
{
}
}
-}
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/CecPortController.cs b/src/PepperDash.Essentials.Core/Comm and IR/CecPortController.cs
index 544a682f9..0c053d6b5 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/CecPortController.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/CecPortController.cs
@@ -10,117 +10,116 @@
using PepperDash.Core;
using Serilog.Events;
-namespace PepperDash.Essentials.Core
-{
+namespace PepperDash.Essentials.Core;
+
public class CecPortController : Device, IBasicCommunicationWithStreamDebugging
- {
+{
public CommunicationStreamDebugging StreamDebugging { get; private set; }
- public event EventHandler BytesReceived;
- public event EventHandler TextReceived;
+ public event EventHandler BytesReceived;
+ public event EventHandler TextReceived;
- public bool IsConnected { get { return true; } }
+ public bool IsConnected { get { return true; } }
- ICec Port;
+ ICec Port;
- public CecPortController(string key, Func postActivationFunc,
- EssentialsControlPropertiesConfig config):base(key)
- {
+ public CecPortController(string key, Func postActivationFunc,
+ EssentialsControlPropertiesConfig config):base(key)
+ {
StreamDebugging = new CommunicationStreamDebugging(key);
- AddPostActivationAction(() =>
- {
- Port = postActivationFunc(config);
+ AddPostActivationAction(() =>
+ {
+ Port = postActivationFunc(config);
- Port.StreamCec.CecChange += StreamCec_CecChange;
- });
- }
+ Port.StreamCec.CecChange += StreamCec_CecChange;
+ });
+ }
- public CecPortController(string key, ICec port)
- : base(key)
- {
- Port = port;
+ public CecPortController(string key, ICec port)
+ : base(key)
+ {
+ Port = port;
- Port.StreamCec.CecChange += new CecChangeEventHandler(StreamCec_CecChange);
- }
+ Port.StreamCec.CecChange += new CecChangeEventHandler(StreamCec_CecChange);
+ }
- void StreamCec_CecChange(Cec cecDevice, CecEventArgs args)
- {
- if (args.EventId == CecEventIds.CecMessageReceivedEventId)
- OnDataReceived(cecDevice.Received.StringValue);
- else if (args.EventId == CecEventIds.ErrorFeedbackEventId)
- if(cecDevice.ErrorFeedback.BoolValue)
- Debug.LogMessage(LogEventLevel.Verbose, this, "CEC NAK Error");
- }
+ void StreamCec_CecChange(Cec cecDevice, CecEventArgs args)
+ {
+ if (args.EventId == CecEventIds.CecMessageReceivedEventId)
+ OnDataReceived(cecDevice.Received.StringValue);
+ else if (args.EventId == CecEventIds.ErrorFeedbackEventId)
+ if(cecDevice.ErrorFeedback.BoolValue)
+ Debug.LogMessage(LogEventLevel.Verbose, this, "CEC NAK Error");
+ }
- void OnDataReceived(string s)
- {
+ void OnDataReceived(string s)
+ {
var bytesHandler = BytesReceived;
- if (bytesHandler != null)
- {
- var bytes = Encoding.GetEncoding(28591).GetBytes(s);
+ if (bytesHandler != null)
+ {
+ var bytes = Encoding.GetEncoding(28591).GetBytes(s);
if (StreamDebugging.RxStreamDebuggingIsEnabled)
Debug.LogMessage(LogEventLevel.Information, this, "Received: '{0}'", ComTextHelper.GetEscapedText(bytes));
- bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
- }
- var textHandler = TextReceived;
+ bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
+ }
+ var textHandler = TextReceived;
if (textHandler != null)
{
if (StreamDebugging.RxStreamDebuggingIsEnabled)
Debug.LogMessage(LogEventLevel.Information, this, "Received: '{0}'", s);
textHandler(this, new GenericCommMethodReceiveTextArgs(s));
}
- }
+ }
- #region IBasicCommunication Members
+ #region IBasicCommunication Members
- public void SendText(string text)
- {
- if (Port == null)
- return;
+ public void SendText(string text)
+ {
+ if (Port == null)
+ return;
if (StreamDebugging.TxStreamDebuggingIsEnabled)
Debug.LogMessage(LogEventLevel.Information, this, "Sending {0} characters of text: '{1}'", text.Length, text);
- Port.StreamCec.Send.StringValue = text;
- }
+ Port.StreamCec.Send.StringValue = text;
+ }
- public void SendBytes(byte[] bytes)
- {
- if (Port == null)
- return;
- var text = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
+ public void SendBytes(byte[] bytes)
+ {
+ if (Port == null)
+ return;
+ var text = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
if (StreamDebugging.TxStreamDebuggingIsEnabled)
Debug.LogMessage(LogEventLevel.Information, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
- Port.StreamCec.Send.StringValue = text;
- }
+ Port.StreamCec.Send.StringValue = text;
+ }
- public void Connect()
- {
- }
+ public void Connect()
+ {
+ }
- public void Disconnect()
- {
- }
+ public void Disconnect()
+ {
+ }
- #endregion
+ #endregion
- ///
- ///
- ///
- ///
- public void SimulateReceive(string s)
+ ///
+ ///
+ ///
+ ///
+ public void SimulateReceive(string s)
+ {
+ // split out hex chars and build string
+ var split = Regex.Split(s, @"(\\[Xx][0-9a-fA-F][0-9a-fA-F])");
+ StringBuilder b = new StringBuilder();
+ foreach (var t in split)
{
- // split out hex chars and build string
- var split = Regex.Split(s, @"(\\[Xx][0-9a-fA-F][0-9a-fA-F])");
- StringBuilder b = new StringBuilder();
- foreach (var t in split)
- {
- if (t.StartsWith(@"\") && t.Length == 4)
- b.Append((char)(Convert.ToByte(t.Substring(2, 2), 16)));
- else
- b.Append(t);
- }
-
- OnDataReceived(b.ToString());
+ if (t.StartsWith(@"\") && t.Length == 4)
+ b.Append((char)(Convert.ToByte(t.Substring(2, 2), 16)));
+ else
+ b.Append(t);
}
+
+ OnDataReceived(b.ToString());
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
index 41420b7ca..a011e29cd 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
@@ -10,11 +10,11 @@
using Serilog.Events;
-namespace PepperDash.Essentials.Core
-{
+namespace PepperDash.Essentials.Core;
+
public class ComPortController : Device, IBasicCommunicationWithStreamDebugging
{
- public CommunicationStreamDebugging StreamDebugging { get; private set; }
+ public CommunicationStreamDebugging StreamDebugging { get; private set; }
public event EventHandler BytesReceived;
public event EventHandler TextReceived;
@@ -27,16 +27,16 @@ public class ComPortController : Device, IBasicCommunicationWithStreamDebugging
public ComPortController(string key, Func postActivationFunc,
ComPort.ComPortSpec spec, EssentialsControlPropertiesConfig config) : base(key)
{
- StreamDebugging = new CommunicationStreamDebugging(key);
+ StreamDebugging = new CommunicationStreamDebugging(key);
Spec = spec;
- AddPostActivationAction(() =>
- {
- Port = postActivationFunc(config);
+ AddPostActivationAction(() =>
+ {
+ Port = postActivationFunc(config);
- RegisterAndConfigureComPort();
- });
+ RegisterAndConfigureComPort();
+ });
}
public ComPortController(string key, ComPort port, ComPort.ComPortSpec spec)
@@ -62,15 +62,15 @@ private void RegisterAndConfigureComPort()
Debug.LogMessage(LogEventLevel.Information, this, "Configured com Port for this device does not exist.");
return;
}
- if (Port.Parent is CrestronControlSystem)
+ if (Port.Parent is CrestronControlSystem)
+ {
+ var result = Port.Register();
+ if (result != eDeviceRegistrationUnRegistrationResponse.Success)
{
- var result = Port.Register();
- if (result != eDeviceRegistrationUnRegistrationResponse.Success)
- {
- Debug.LogMessage(LogEventLevel.Information, this, "ERROR: Cannot register Com port: {0}", result);
- return; // false
- }
+ Debug.LogMessage(LogEventLevel.Information, this, "ERROR: Cannot register Com port: {0}", result);
+ return; // false
}
+ }
var specResult = Port.SetComPortSpec(Spec);
if (specResult != 0)
@@ -88,33 +88,33 @@ private void RegisterAndConfigureComPort()
void Port_SerialDataReceived(ComPort ReceivingComPort, ComPortSerialDataEventArgs args)
{
- OnDataReceived(args.SerialData);
+ OnDataReceived(args.SerialData);
}
- void OnDataReceived(string s)
- {
+ void OnDataReceived(string s)
+ {
var eventSubscribed = false;
- var bytesHandler = BytesReceived;
- if (bytesHandler != null)
- {
- var bytes = Encoding.GetEncoding(28591).GetBytes(s);
+ var bytesHandler = BytesReceived;
+ if (bytesHandler != null)
+ {
+ var bytes = Encoding.GetEncoding(28591).GetBytes(s);
if (StreamDebugging.RxStreamDebuggingIsEnabled)
Debug.LogMessage(LogEventLevel.Information, this, "Received: '{0}'", ComTextHelper.GetEscapedText(bytes));
- bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
+ bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
eventSubscribed = true;
- }
- var textHandler = TextReceived;
- if (textHandler != null)
- {
+ }
+ var textHandler = TextReceived;
+ if (textHandler != null)
+ {
if (StreamDebugging.RxStreamDebuggingIsEnabled)
Debug.LogMessage(LogEventLevel.Information, this, "Received: '{0}'", s);
- textHandler(this, new GenericCommMethodReceiveTextArgs(s));
+ textHandler(this, new GenericCommMethodReceiveTextArgs(s));
eventSubscribed = true;
- }
+ }
if(!eventSubscribed) Debug.LogMessage(LogEventLevel.Warning, this, "Received data but no handler is registered");
- }
+ }
public override bool Deactivate()
{
@@ -128,9 +128,9 @@ public void SendText(string text)
if (Port == null)
return;
- if (StreamDebugging.TxStreamDebuggingIsEnabled)
- Debug.LogMessage(LogEventLevel.Information, this, "Sending {0} characters of text: '{1}'", text.Length, text);
- Port.Send(text);
+ if (StreamDebugging.TxStreamDebuggingIsEnabled)
+ Debug.LogMessage(LogEventLevel.Information, this, "Sending {0} characters of text: '{1}'", text.Length, text);
+ Port.Send(text);
}
public void SendBytes(byte[] bytes)
@@ -138,8 +138,8 @@ public void SendBytes(byte[] bytes)
if (Port == null)
return;
var text = Encoding.GetEncoding(28591).GetString(bytes, 0, bytes.Length);
- if (StreamDebugging.TxStreamDebuggingIsEnabled)
- Debug.LogMessage(LogEventLevel.Information, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
+ if (StreamDebugging.TxStreamDebuggingIsEnabled)
+ Debug.LogMessage(LogEventLevel.Information, this, "Sending {0} bytes: '{1}'", bytes.Length, ComTextHelper.GetEscapedText(bytes));
Port.Send(text);
}
@@ -154,24 +154,23 @@ public void Disconnect()
#endregion
- ///
- ///
- ///
- ///
- public void SimulateReceive(string s)
+ ///
+ ///
+ ///
+ ///
+ public void SimulateReceive(string s)
+ {
+ // split out hex chars and build string
+ var split = Regex.Split(s, @"(\\[Xx][0-9a-fA-F][0-9a-fA-F])");
+ StringBuilder b = new StringBuilder();
+ foreach (var t in split)
{
- // split out hex chars and build string
- var split = Regex.Split(s, @"(\\[Xx][0-9a-fA-F][0-9a-fA-F])");
- StringBuilder b = new StringBuilder();
- foreach (var t in split)
- {
- if (t.StartsWith(@"\") && t.Length == 4)
- b.Append((char)(Convert.ToByte(t.Substring(2, 2), 16)));
- else
- b.Append(t);
- }
-
- OnDataReceived(b.ToString());
+ if (t.StartsWith(@"\") && t.Length == 4)
+ b.Append((char)(Convert.ToByte(t.Substring(2, 2), 16)));
+ else
+ b.Append(t);
}
- }
-}
\ No newline at end of file
+
+ OnDataReceived(b.ToString());
+ }
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/ComSpecJsonConverter.cs b/src/PepperDash.Essentials.Core/Comm and IR/ComSpecJsonConverter.cs
index bfdccb65d..6ef2f916b 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/ComSpecJsonConverter.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/ComSpecJsonConverter.cs
@@ -13,92 +13,89 @@
using PepperDash.Core;
-namespace PepperDash.Essentials.Core
+namespace PepperDash.Essentials.Core;
+
+///
+/// This converter creates a proper ComPort.ComPortSpec struct from more-friendly JSON values. It uses
+/// ComSpecPropsJsonConverter to finish the individual properties.
+///
+public class ComSpecJsonConverter : JsonConverter
{
- ///
- /// This converter creates a proper ComPort.ComPortSpec struct from more-friendly JSON values. It uses
- /// ComSpecPropsJsonConverter to finish the individual properties.
- ///
- public class ComSpecJsonConverter : JsonConverter
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- if (objectType == typeof(ComPort.ComPortSpec?))
- {
- var newSer = new JsonSerializer();
- newSer.Converters.Add(new ComSpecPropsJsonConverter());
- newSer.ObjectCreationHandling = ObjectCreationHandling.Replace;
- return newSer.Deserialize(reader);
- }
- return null;
- }
-
- ///
- ///
- ///
- public override bool CanConvert(Type objectType)
+ if (objectType == typeof(ComPort.ComPortSpec?))
{
- return objectType == typeof(ComPort.ComPortSpec?);
- }
-
- public override bool CanRead { get { return true; } }
-
- ///
- /// This converter will not be used for writing
- ///
- public override bool CanWrite { get { return false; } }
-
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
- {
- throw new NotImplementedException();
+ var newSer = new JsonSerializer();
+ newSer.Converters.Add(new ComSpecPropsJsonConverter());
+ newSer.ObjectCreationHandling = ObjectCreationHandling.Replace;
+ return newSer.Deserialize(reader);
}
+ return null;
}
///
- /// The gist of this converter: The comspec JSON comes in with normal values that need to be converted
- /// into enum names. This converter takes the value and applies the appropriate enum's name prefix to the value
- /// and then returns the enum value using Enum.Parse. NOTE: Does not write
+ ///
///
- public class ComSpecPropsJsonConverter : JsonConverter
+ public override bool CanConvert(Type objectType)
{
- public override bool CanConvert(Type objectType)
- {
- return objectType == typeof(ComPort.eComBaudRates)
- || objectType == typeof(ComPort.eComDataBits)
- || objectType == typeof(ComPort.eComParityType)
- || objectType == typeof(ComPort.eComHardwareHandshakeType)
- || objectType == typeof(ComPort.eComSoftwareHandshakeType)
- || objectType == typeof(ComPort.eComProtocolType)
- || objectType == typeof(ComPort.eComStopBits);
- }
+ return objectType == typeof(ComPort.ComPortSpec?);
+ }
- public override bool CanRead { get { return true; } }
+ public override bool CanRead { get { return true; } }
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- //Debug.LogMessage(LogEventLevel.Verbose, "ReadJson type: " + objectType.Name);
- if (objectType == typeof(ComPort.eComBaudRates))
- return Enum.Parse(typeof(ComPort.eComBaudRates), "ComspecBaudRate" + reader.Value, false);
- else if (objectType == typeof(ComPort.eComDataBits))
- return Enum.Parse(typeof(ComPort.eComDataBits), "ComspecDataBits" + reader.Value, true);
- else if (objectType == typeof(ComPort.eComHardwareHandshakeType))
- return Enum.Parse(typeof(ComPort.eComHardwareHandshakeType), "ComspecHardwareHandshake" + reader.Value, true);
- else if (objectType == typeof(ComPort.eComParityType))
- return Enum.Parse(typeof(ComPort.eComParityType), "ComspecParity" + reader.Value, true);
- else if (objectType == typeof(ComPort.eComProtocolType))
- return Enum.Parse(typeof(ComPort.eComProtocolType), "ComspecProtocol" + reader.Value, true);
- else if (objectType == typeof(ComPort.eComSoftwareHandshakeType))
- return Enum.Parse(typeof(ComPort.eComSoftwareHandshakeType), "ComspecSoftwareHandshake" + reader.Value, true);
- else if (objectType == typeof(ComPort.eComStopBits))
- return Enum.Parse(typeof(ComPort.eComStopBits), "ComspecStopBits" + reader.Value, true);
- return null;
- }
+ ///
+ /// This converter will not be used for writing
+ ///
+ public override bool CanWrite { get { return false; } }
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
- {
- throw new NotImplementedException();
- }
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ throw new NotImplementedException();
}
+}
+///
+/// The gist of this converter: The comspec JSON comes in with normal values that need to be converted
+/// into enum names. This converter takes the value and applies the appropriate enum's name prefix to the value
+/// and then returns the enum value using Enum.Parse. NOTE: Does not write
+///
+public class ComSpecPropsJsonConverter : JsonConverter
+{
+ public override bool CanConvert(Type objectType)
+ {
+ return objectType == typeof(ComPort.eComBaudRates)
+ || objectType == typeof(ComPort.eComDataBits)
+ || objectType == typeof(ComPort.eComParityType)
+ || objectType == typeof(ComPort.eComHardwareHandshakeType)
+ || objectType == typeof(ComPort.eComSoftwareHandshakeType)
+ || objectType == typeof(ComPort.eComProtocolType)
+ || objectType == typeof(ComPort.eComStopBits);
+ }
+
+ public override bool CanRead { get { return true; } }
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ //Debug.LogMessage(LogEventLevel.Verbose, "ReadJson type: " + objectType.Name);
+ if (objectType == typeof(ComPort.eComBaudRates))
+ return Enum.Parse(typeof(ComPort.eComBaudRates), "ComspecBaudRate" + reader.Value, false);
+ else if (objectType == typeof(ComPort.eComDataBits))
+ return Enum.Parse(typeof(ComPort.eComDataBits), "ComspecDataBits" + reader.Value, true);
+ else if (objectType == typeof(ComPort.eComHardwareHandshakeType))
+ return Enum.Parse(typeof(ComPort.eComHardwareHandshakeType), "ComspecHardwareHandshake" + reader.Value, true);
+ else if (objectType == typeof(ComPort.eComParityType))
+ return Enum.Parse(typeof(ComPort.eComParityType), "ComspecParity" + reader.Value, true);
+ else if (objectType == typeof(ComPort.eComProtocolType))
+ return Enum.Parse(typeof(ComPort.eComProtocolType), "ComspecProtocol" + reader.Value, true);
+ else if (objectType == typeof(ComPort.eComSoftwareHandshakeType))
+ return Enum.Parse(typeof(ComPort.eComSoftwareHandshakeType), "ComspecSoftwareHandshake" + reader.Value, true);
+ else if (objectType == typeof(ComPort.eComStopBits))
+ return Enum.Parse(typeof(ComPort.eComStopBits), "ComspecStopBits" + reader.Value, true);
+ return null;
+ }
+
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ throw new NotImplementedException();
+ }
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/CommFactory.cs b/src/PepperDash.Essentials.Core/Comm and IR/CommFactory.cs
index 8fa4076a9..7a41ed8ee 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/CommFactory.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/CommFactory.cs
@@ -10,8 +10,8 @@
using PepperDash.Essentials.Core.Config;
using Serilog.Events;
-namespace PepperDash.Essentials.Core
-{
+namespace PepperDash.Essentials.Core;
+
///
///
///
@@ -53,35 +53,35 @@ public static IBasicCommunication CreateCommForDevice(DeviceConfig deviceConfig)
case eControlMethod.Com:
comm = new ComPortController(deviceConfig.Key + "-com", GetComPort, controlConfig.ComParams.Value, controlConfig);
break;
- case eControlMethod.Cec:
- comm = new CecPortController(deviceConfig.Key + "-cec", GetCecPort, controlConfig);
- break;
+ case eControlMethod.Cec:
+ comm = new CecPortController(deviceConfig.Key + "-cec", GetCecPort, controlConfig);
+ break;
case eControlMethod.IR:
break;
- case eControlMethod.Ssh:
- {
- var ssh = new GenericSshClient(deviceConfig.Key + "-ssh", c.Address, c.Port, c.Username, c.Password);
- ssh.AutoReconnect = c.AutoReconnect;
- if(ssh.AutoReconnect)
- ssh.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
- comm = ssh;
- break;
- }
- case eControlMethod.Tcpip:
- {
- var tcp = new GenericTcpIpClient(deviceConfig.Key + "-tcp", c.Address, c.Port, c.BufferSize);
- tcp.AutoReconnect = c.AutoReconnect;
- if (tcp.AutoReconnect)
- tcp.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
- comm = tcp;
- break;
- }
- case eControlMethod.Udp:
- {
- var udp = new GenericUdpServer(deviceConfig.Key + "-udp", c.Address, c.Port, c.BufferSize);
- comm = udp;
- break;
- }
+ case eControlMethod.Ssh:
+ {
+ var ssh = new GenericSshClient(deviceConfig.Key + "-ssh", c.Address, c.Port, c.Username, c.Password);
+ ssh.AutoReconnect = c.AutoReconnect;
+ if(ssh.AutoReconnect)
+ ssh.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
+ comm = ssh;
+ break;
+ }
+ case eControlMethod.Tcpip:
+ {
+ var tcp = new GenericTcpIpClient(deviceConfig.Key + "-tcp", c.Address, c.Port, c.BufferSize);
+ tcp.AutoReconnect = c.AutoReconnect;
+ if (tcp.AutoReconnect)
+ tcp.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
+ comm = tcp;
+ break;
+ }
+ case eControlMethod.Udp:
+ {
+ var udp = new GenericUdpServer(deviceConfig.Key + "-udp", c.Address, c.Port, c.BufferSize);
+ comm = udp;
+ break;
+ }
case eControlMethod.Telnet:
break;
case eControlMethod.SecureTcpIp:
@@ -120,13 +120,13 @@ public static ComPort GetComPort(EssentialsControlPropertiesConfig config)
return null;
}
- ///
- /// Gets an ICec port from a RoutingInput or RoutingOutput on a device
- ///
- ///
- ///
- public static ICec GetCecPort(ControlPropertiesConfig config)
- {
+ ///
+ /// Gets an ICec port from a RoutingInput or RoutingOutput on a device
+ ///
+ ///
+ ///
+ public static ICec GetCecPort(ControlPropertiesConfig config)
+ {
try
{
var dev = DeviceManager.GetDeviceForKey(config.ControlPortDevKey);
@@ -175,7 +175,7 @@ public static ICec GetCecPort(ControlPropertiesConfig config)
config.ControlPortDevKey, config.ControlPortName);
return null;
- }
+ }
///
/// Helper to grab the IComPorts device for this PortDeviceKey. Key "controlSystem" will
@@ -198,66 +198,65 @@ public static IComPorts GetIComPortsDeviceFromManagedDevice(string ComPortDevKey
}
}
- ///
- ///
- ///
- public class EssentialsControlPropertiesConfig :
- ControlPropertiesConfig
- {
+///
+///
+///
+public class EssentialsControlPropertiesConfig :
+ ControlPropertiesConfig
+{
- [JsonProperty("comParams", NullValueHandling = NullValueHandling.Ignore)]
- [JsonConverter(typeof(ComSpecJsonConverter))]
- public ComPort.ComPortSpec? ComParams { get; set; }
+ [JsonProperty("comParams", NullValueHandling = NullValueHandling.Ignore)]
+ [JsonConverter(typeof(ComSpecJsonConverter))]
+ public ComPort.ComPortSpec? ComParams { get; set; }
- [JsonProperty("cresnetId", NullValueHandling = NullValueHandling.Ignore)]
- public string CresnetId { get; set; }
+ [JsonProperty("cresnetId", NullValueHandling = NullValueHandling.Ignore)]
+ public string CresnetId { get; set; }
- ///
- /// Attempts to provide uint conversion of string CresnetId
- ///
- [JsonIgnore]
- public uint CresnetIdInt
+ ///
+ /// Attempts to provide uint conversion of string CresnetId
+ ///
+ [JsonIgnore]
+ public uint CresnetIdInt
+ {
+ get
{
- get
+ try
{
- try
- {
- return Convert.ToUInt32(CresnetId, 16);
- }
- catch (Exception)
- {
- throw new FormatException(string.Format("ERROR:Unable to convert Cresnet ID: {0} to hex. Error:\n{1}", CresnetId));
- }
+ return Convert.ToUInt32(CresnetId, 16);
+ }
+ catch (Exception)
+ {
+ throw new FormatException(string.Format("ERROR:Unable to convert Cresnet ID: {0} to hex. Error:\n{1}", CresnetId));
}
}
+ }
- [JsonProperty("infinetId", NullValueHandling = NullValueHandling.Ignore)]
- public string InfinetId { get; set; }
+ [JsonProperty("infinetId", NullValueHandling = NullValueHandling.Ignore)]
+ public string InfinetId { get; set; }
- ///
- /// Attepmts to provide uiont conversion of string InifinetId
- ///
- [JsonIgnore]
- public uint InfinetIdInt
+ ///
+ /// Attepmts to provide uiont conversion of string InifinetId
+ ///
+ [JsonIgnore]
+ public uint InfinetIdInt
+ {
+ get
{
- get
+ try
+ {
+ return Convert.ToUInt32(InfinetId, 16);
+ }
+ catch (Exception)
{
- try
- {
- return Convert.ToUInt32(InfinetId, 16);
- }
- catch (Exception)
- {
- throw new FormatException(string.Format("ERROR:Unable to conver Infinet ID: {0} to hex. Error:\n{1}", InfinetId));
- }
+ throw new FormatException(string.Format("ERROR:Unable to conver Infinet ID: {0} to hex. Error:\n{1}", InfinetId));
}
}
}
+}
- public class IrControlSpec
- {
- public string PortDeviceKey { get; set; }
- public uint PortNumber { get; set; }
- public string File { get; set; }
- }
+public class IrControlSpec
+{
+ public string PortDeviceKey { get; set; }
+ public uint PortNumber { get; set; }
+ public string File { get; set; }
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/CommunicationExtras.cs b/src/PepperDash.Essentials.Core/Comm and IR/CommunicationExtras.cs
index 995004b96..e335157fa 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/CommunicationExtras.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/CommunicationExtras.cs
@@ -13,13 +13,12 @@
using PepperDash.Core;
-namespace PepperDash.Essentials.Core
-{
+namespace PepperDash.Essentials.Core;
+
///
///
///
public interface IComPortsDevice
{
IComPorts Device { get; }
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/ConsoleCommMockDevice.cs b/src/PepperDash.Essentials.Core/Comm and IR/ConsoleCommMockDevice.cs
index fd7184aa5..3960d38b3 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/ConsoleCommMockDevice.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/ConsoleCommMockDevice.cs
@@ -9,8 +9,8 @@
using Serilog.Events;
-namespace PepperDash.Essentials.Core
-{
+namespace PepperDash.Essentials.Core;
+
public class ConsoleCommMockDevice : EssentialsDevice, ICommunicationMonitor
{
public IBasicCommunication Communication { get; private set; }
@@ -67,21 +67,19 @@ public ConsoleCommMockDevicePropertiesConfig()
}
}
- public class ConsoleCommMockDeviceFactory : EssentialsDeviceFactory
+public class ConsoleCommMockDeviceFactory : EssentialsDeviceFactory
+{
+ public ConsoleCommMockDeviceFactory()
{
- public ConsoleCommMockDeviceFactory()
- {
- TypeNames = new List() { "commmock" };
- }
-
- public override EssentialsDevice BuildDevice(DeviceConfig dc)
- {
- Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Comm Mock Device");
- var comm = CommFactory.CreateCommForDevice(dc);
- var props = Newtonsoft.Json.JsonConvert.DeserializeObject(
- dc.Properties.ToString());
- return new ConsoleCommMockDevice(dc.Key, dc.Name, props, comm);
- }
+ TypeNames = new List() { "commmock" };
}
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+ Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Comm Mock Device");
+ var comm = CommFactory.CreateCommForDevice(dc);
+ var props = Newtonsoft.Json.JsonConvert.DeserializeObject(
+ dc.Properties.ToString());
+ return new ConsoleCommMockDevice(dc.Key, dc.Name, props, comm);
+ }
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/GenericComm.cs b/src/PepperDash.Essentials.Core/Comm and IR/GenericComm.cs
index ddd7ec5df..6e913968a 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/GenericComm.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/GenericComm.cs
@@ -13,133 +13,132 @@
using Serilog.Events;
-namespace PepperDash.Essentials.Core
+namespace PepperDash.Essentials.Core;
+
+///
+/// Serves as a generic wrapper class for all styles of IBasicCommuncation ports
+///
+[Description("Generic communication wrapper class for any IBasicCommunication type")]
+public class GenericComm : ReconfigurableBridgableDevice
{
- ///
- /// Serves as a generic wrapper class for all styles of IBasicCommuncation ports
- ///
- [Description("Generic communication wrapper class for any IBasicCommunication type")]
- public class GenericComm : ReconfigurableBridgableDevice
+ EssentialsControlPropertiesConfig PropertiesConfig;
+
+ public IBasicCommunication CommPort { get; private set; }
+
+ public GenericComm(DeviceConfig config)
+ : base(config)
{
- EssentialsControlPropertiesConfig PropertiesConfig;
- public IBasicCommunication CommPort { get; private set; }
+ PropertiesConfig = CommFactory.GetControlPropertiesConfig(config);
- public GenericComm(DeviceConfig config)
- : base(config)
- {
+ var commPort = CommFactory.CreateCommForDevice(config);
- PropertiesConfig = CommFactory.GetControlPropertiesConfig(config);
+ //Fixing decision to require '-comPorts' in delcaration for DGE in order to get a device with comports included
+ if (commPort == null)
+ {
+ config.Key = config.Key + "-comPorts";
+ commPort = CommFactory.CreateCommForDevice(config);
+ }
- var commPort = CommFactory.CreateCommForDevice(config);
+ CommPort = commPort;
- //Fixing decision to require '-comPorts' in delcaration for DGE in order to get a device with comports included
- if (commPort == null)
- {
- config.Key = config.Key + "-comPorts";
- commPort = CommFactory.CreateCommForDevice(config);
- }
+ }
- CommPort = commPort;
+ public static IKeyed BuildDevice(DeviceConfig dc)
+ {
+ Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Comm Device");
+ return new GenericComm(dc);
+ }
+ public void SetPortConfig(string portConfig)
+ {
+ // TODO: Deserialize new EssentialsControlPropertiesConfig and handle as necessary
+ try
+ {
+ PropertiesConfig = JsonConvert.DeserializeObject
+ (portConfig);
}
-
- public static IKeyed BuildDevice(DeviceConfig dc)
+ catch (Exception e)
{
- Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Comm Device");
- return new GenericComm(dc);
+ Debug.LogMessage(LogEventLevel.Verbose, this, "Error deserializing port config: {0}", e);
}
+ }
+
+ protected override void CustomSetConfig(DeviceConfig config)
+ {
+ PropertiesConfig = CommFactory.GetControlPropertiesConfig(config);
- public void SetPortConfig(string portConfig)
+ ConfigWriter.UpdateDeviceConfig(config);
+ }
+
+ public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = new IBasicCommunicationJoinMap(joinStart);
+
+ var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
+
+ if (!string.IsNullOrEmpty(joinMapSerialized))
+ joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
+
+ if (bridge != null)
{
- // TODO: Deserialize new EssentialsControlPropertiesConfig and handle as necessary
- try
- {
- PropertiesConfig = JsonConvert.DeserializeObject
- (portConfig);
- }
- catch (Exception e)
- {
- Debug.LogMessage(LogEventLevel.Verbose, this, "Error deserializing port config: {0}", e);
- }
+ bridge.AddJoinMap(Key, joinMap);
}
-
- protected override void CustomSetConfig(DeviceConfig config)
+ else
{
- PropertiesConfig = CommFactory.GetControlPropertiesConfig(config);
+ Debug.LogMessage(LogEventLevel.Information, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
+ }
- ConfigWriter.UpdateDeviceConfig(config);
+ if (CommPort == null)
+ {
+ Debug.LogMessage(LogEventLevel.Debug, this, "Unable to link device '{0}'. CommPort is null", Key);
+ return;
}
- public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ Debug.LogMessage(LogEventLevel.Debug, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
+
+ // this is a permanent event handler. This cannot be -= from event
+ CommPort.TextReceived += (s, a) =>
{
- var joinMap = new IBasicCommunicationJoinMap(joinStart);
+ trilist.SetString(joinMap.TextReceived.JoinNumber, a.Text);
+ };
+ trilist.SetStringSigAction(joinMap.SendText.JoinNumber, s => CommPort.SendText(s));
+ trilist.SetStringSigAction(joinMap.SetPortConfig.JoinNumber, SetPortConfig);
- var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
- if (!string.IsNullOrEmpty(joinMapSerialized))
- joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
+ var sComm = CommPort as ISocketStatus;
+ if (sComm == null) return;
+ sComm.ConnectionChange += (s, a) =>
+ {
+ trilist.SetUshort(joinMap.Status.JoinNumber, (ushort)(a.Client.ClientStatus));
+ trilist.SetBool(joinMap.Connected.JoinNumber, a.Client.ClientStatus ==
+ SocketStatus.SOCKET_STATUS_CONNECTED);
+ };
- if (bridge != null)
+ trilist.SetBoolSigAction(joinMap.Connect.JoinNumber, b =>
+ {
+ if (b)
{
- bridge.AddJoinMap(Key, joinMap);
+ sComm.Connect();
}
else
{
- Debug.LogMessage(LogEventLevel.Information, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
+ sComm.Disconnect();
}
-
- if (CommPort == null)
- {
- Debug.LogMessage(LogEventLevel.Debug, this, "Unable to link device '{0}'. CommPort is null", Key);
- return;
- }
-
- Debug.LogMessage(LogEventLevel.Debug, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
-
- // this is a permanent event handler. This cannot be -= from event
- CommPort.TextReceived += (s, a) =>
- {
- trilist.SetString(joinMap.TextReceived.JoinNumber, a.Text);
- };
- trilist.SetStringSigAction(joinMap.SendText.JoinNumber, s => CommPort.SendText(s));
- trilist.SetStringSigAction(joinMap.SetPortConfig.JoinNumber, SetPortConfig);
-
-
- var sComm = CommPort as ISocketStatus;
- if (sComm == null) return;
- sComm.ConnectionChange += (s, a) =>
- {
- trilist.SetUshort(joinMap.Status.JoinNumber, (ushort)(a.Client.ClientStatus));
- trilist.SetBool(joinMap.Connected.JoinNumber, a.Client.ClientStatus ==
- SocketStatus.SOCKET_STATUS_CONNECTED);
- };
-
- trilist.SetBoolSigAction(joinMap.Connect.JoinNumber, b =>
- {
- if (b)
- {
- sComm.Connect();
- }
- else
- {
- sComm.Disconnect();
- }
- });
- }
+ });
}
+}
- public class GenericCommFactory : EssentialsDeviceFactory
+public class GenericCommFactory : EssentialsDeviceFactory
+{
+ public GenericCommFactory()
{
- public GenericCommFactory()
- {
- TypeNames = new List() { "genericComm" };
- }
+ TypeNames = new List() { "genericComm" };
+ }
- public override EssentialsDevice BuildDevice(DeviceConfig dc)
- {
- Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Comm Device");
- return new GenericComm(dc);
- }
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+ Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Comm Device");
+ return new GenericComm(dc);
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/GenericHttpClient.cs b/src/PepperDash.Essentials.Core/Comm and IR/GenericHttpClient.cs
index d88e9728e..3fa521625 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/GenericHttpClient.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/GenericHttpClient.cs
@@ -2,9 +2,9 @@
using PepperDash.Core;
using System;
-namespace PepperDash.Essentials.Core
-{
- [Obsolete("Please use the builtin HttpClient class instead: https://learn.microsoft.com/en-us/dotnet/fundamentals/networking/http/httpclient-guidelines")]
+namespace PepperDash.Essentials.Core;
+
+[Obsolete("Please use the builtin HttpClient class instead: https://learn.microsoft.com/en-us/dotnet/fundamentals/networking/http/httpclient-guidelines")]
public class GenericHttpClient : Device, IBasicCommunication
{
private readonly HttpClient Client;
@@ -13,13 +13,13 @@ public class GenericHttpClient : Device, IBasicCommunication
public GenericHttpClient(string key, string name, string hostname)
: base(key, name)
{
- Client = new HttpClient
- {
- HostName = hostname
- };
+ Client = new HttpClient
+ {
+ HostName = hostname
+ };
- }
+ }
///
///
@@ -56,8 +56,8 @@ private void Response(HttpClientResponse response, HTTP_CALLBACK_ERROR error, ob
if (responseReceived.ContentString.Length > 0)
{
- ResponseRecived?.Invoke(this, new GenericHttpClientEventArgs(responseReceived.ContentString, (request as HttpClientRequest).Url.ToString(), error));
- }
+ ResponseRecived?.Invoke(this, new GenericHttpClientEventArgs(responseReceived.ContentString, (request as HttpClientRequest).Url.ToString(), error));
+ }
}
}
@@ -108,5 +108,4 @@ public GenericHttpClientEventArgs(string response, string request, HTTP_CALLBACK
RequestPath = request;
Error = error;
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Comm and IR/IRPortHelper.cs b/src/PepperDash.Essentials.Core/Comm and IR/IRPortHelper.cs
index 498df9d25..52474d420 100644
--- a/src/PepperDash.Essentials.Core/Comm and IR/IRPortHelper.cs
+++ b/src/PepperDash.Essentials.Core/Comm and IR/IRPortHelper.cs
@@ -12,8 +12,8 @@
using PepperDash.Essentials.Core.Config;
using Serilog.Events;
-namespace PepperDash.Essentials.Core
-{
+namespace PepperDash.Essentials.Core;
+
///
///
///
@@ -137,89 +137,89 @@ public static IROutputPort GetIrOutputPort(DeviceConfig dc)
var port = irDev.IROutputPorts[portNum];
-
+
return port;
}
public static IrOutputPortController GetIrOutputPortController(DeviceConfig config)
{
- Debug.LogMessage(LogEventLevel.Debug, "Attempting to create new Ir Port Controller");
+ Debug.LogMessage(LogEventLevel.Debug, "Attempting to create new Ir Port Controller");
if (config == null)
{
return null;
}
- var postActivationFunc = new Func (GetIrOutputPort);
+ var postActivationFunc = new Func (GetIrOutputPort);
var irDevice = new IrOutputPortController(config.Key + "-ir", postActivationFunc, config);
return irDevice;
}
/*
- ///
- /// Returns a ready-to-go IrOutputPortController from a DeviceConfig object.
- ///
- public static IrOutputPortController GetIrOutputPortController(DeviceConfig devConf)
+ ///
+ /// Returns a ready-to-go IrOutputPortController from a DeviceConfig object.
+ ///
+ public static IrOutputPortController GetIrOutputPortController(DeviceConfig devConf)
+ {
+ var irControllerKey = devConf.Key + "-ir";
+ if (devConf.Properties == null)
+ {
+ Debug.LogMessage(LogEventLevel.Information, "[{0}] WARNING: Device config does not include properties. IR will not function.", devConf.Key);
+ return new IrOutputPortController(irControllerKey, null, "");
+ }
+
+ var control = devConf.Properties["control"];
+ if (control == null)
+ {
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.LogMessage(LogEventLevel.Information, c, "WARNING: Device config does not include control properties. IR will not function");
+ return c;
+ }
+
+ var portDevKey = control.Value("controlPortDevKey");
+ var portNum = control.Value("controlPortNumber");
+ IIROutputPorts irDev = null;
+
+ if (portDevKey == null)
{
- var irControllerKey = devConf.Key + "-ir";
- if (devConf.Properties == null)
- {
- Debug.LogMessage(LogEventLevel.Information, "[{0}] WARNING: Device config does not include properties. IR will not function.", devConf.Key);
- return new IrOutputPortController(irControllerKey, null, "");
- }
-
- var control = devConf.Properties["control"];
- if (control == null)
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.LogMessage(LogEventLevel.Information, c, "WARNING: Device config does not include control properties. IR will not function");
- return c;
- }
-
- var portDevKey = control.Value("controlPortDevKey");
- var portNum = control.Value("controlPortNumber");
- IIROutputPorts irDev = null;
-
- if (portDevKey == null)
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.LogMessage(LogEventLevel.Information, c, "WARNING: control properties is missing ir device");
- return c;
- }
-
- if (portNum == 0)
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.LogMessage(LogEventLevel.Information, c, "WARNING: control properties is missing ir port number");
- return c;
- }
-
- if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
- || portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
- irDev = Global.ControlSystem;
- else
- irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
-
- if (irDev == null)
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.LogMessage(LogEventLevel.Information, c, "WARNING: device with IR ports '{0}' not found", portDevKey);
- return c;
- }
-
- if (portNum <= irDev.NumberOfIROutputPorts) // success!
- return new IrOutputPortController(irControllerKey, irDev.IROutputPorts[portNum],
- IrDriverPathPrefix + control["irFile"].Value());
- else
- {
- var c = new IrOutputPortController(irControllerKey, null, "");
- Debug.LogMessage(LogEventLevel.Information, c, "WARNING: device '{0}' IR port {1} out of range",
- portDevKey, portNum);
- return c;
- }
- }*/
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.LogMessage(LogEventLevel.Information, c, "WARNING: control properties is missing ir device");
+ return c;
+ }
+
+ if (portNum == 0)
+ {
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.LogMessage(LogEventLevel.Information, c, "WARNING: control properties is missing ir port number");
+ return c;
+ }
+
+ if (portDevKey.Equals("controlSystem", StringComparison.OrdinalIgnoreCase)
+ || portDevKey.Equals("processor", StringComparison.OrdinalIgnoreCase))
+ irDev = Global.ControlSystem;
+ else
+ irDev = DeviceManager.GetDeviceForKey(portDevKey) as IIROutputPorts;
+
+ if (irDev == null)
+ {
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.LogMessage(LogEventLevel.Information, c, "WARNING: device with IR ports '{0}' not found", portDevKey);
+ return c;
+ }
+
+ if (portNum <= irDev.NumberOfIROutputPorts) // success!
+ return new IrOutputPortController(irControllerKey, irDev.IROutputPorts[portNum],
+ IrDriverPathPrefix + control["irFile"].Value());
+ else
+ {
+ var c = new IrOutputPortController(irControllerKey, null, "");
+ Debug.LogMessage(LogEventLevel.Information, c, "WARNING: device '{0}' IR port {1} out of range",
+ portDevKey, portNum);
+ return c;
+ }
+ }*/
}
///
@@ -240,5 +240,4 @@ public IrOutPortConfig()
{
FileName = "";
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Config/AudioControlPointListItem.cs b/src/PepperDash.Essentials.Core/Config/AudioControlPointListItem.cs
index 3552c2b25..3a3e2fc80 100644
--- a/src/PepperDash.Essentials.Core/Config/AudioControlPointListItem.cs
+++ b/src/PepperDash.Essentials.Core/Config/AudioControlPointListItem.cs
@@ -6,15 +6,14 @@
using System.Text;
using System.Threading.Tasks;
-namespace PepperDash.Essentials.Core.Config
+namespace PepperDash.Essentials.Core.Config;
+
+public class AudioControlPointListItem
{
- public class AudioControlPointListItem
- {
- [JsonProperty("levelControls")]
- public Dictionary LevelControls { get; set; } = new Dictionary();
+ [JsonProperty("levelControls")]
+ public Dictionary LevelControls { get; set; } = new Dictionary();
- [JsonProperty("presets")]
- public Dictionary Presets { get; set; } = new Dictionary();
+ [JsonProperty("presets")]
+ public Dictionary Presets { get; set; } = new Dictionary();
- }
}
diff --git a/src/PepperDash.Essentials.Core/Config/BasicConfig.cs b/src/PepperDash.Essentials.Core/Config/BasicConfig.cs
index 0e3e1e35c..c210dd025 100644
--- a/src/PepperDash.Essentials.Core/Config/BasicConfig.cs
+++ b/src/PepperDash.Essentials.Core/Config/BasicConfig.cs
@@ -7,8 +7,8 @@
using Newtonsoft.Json.Linq;
using PepperDash.Essentials.Core.Devices;
-namespace PepperDash.Essentials.Core.Config
-{
+namespace PepperDash.Essentials.Core.Config;
+
///
/// Override this and splice on specific room type behavior, as well as other properties
///
@@ -23,32 +23,32 @@ public class BasicConfig
[JsonProperty("sourceLists")]
public Dictionary> SourceLists { get; set; }
- [JsonProperty("destinationLists")]
- public Dictionary> DestinationLists { get; set; }
+ [JsonProperty("destinationLists")]
+ public Dictionary> DestinationLists { get; set; }
- [JsonProperty("audioControlPointLists")]
- public Dictionary AudioControlPointLists { get; set; }
+ [JsonProperty("audioControlPointLists")]
+ public Dictionary AudioControlPointLists { get; set; }
- [JsonProperty("cameraLists")]
- public Dictionary> CameraLists { get; set; }
+ [JsonProperty("cameraLists")]
+ public Dictionary> CameraLists { get; set; }
- [JsonProperty("tieLines")]
+ [JsonProperty("tieLines")]
public List TieLines { get; set; }
- [JsonProperty("joinMaps")]
- public Dictionary JoinMaps { get; set; }
-
- public BasicConfig()
- {
- Info = new InfoConfig();
- Devices = new List();
- SourceLists = new Dictionary>();
- DestinationLists = new Dictionary>();
- AudioControlPointLists = new Dictionary();
- CameraLists = new Dictionary>();
- TieLines = new List();
- JoinMaps = new Dictionary();
- }
+ [JsonProperty("joinMaps")]
+ public Dictionary JoinMaps { get; set; }
+
+ public BasicConfig()
+ {
+ Info = new InfoConfig();
+ Devices = new List();
+ SourceLists = new Dictionary>();
+ DestinationLists = new Dictionary>();
+ AudioControlPointLists = new Dictionary();
+ CameraLists = new Dictionary>();
+ TieLines = new List();
+ JoinMaps = new Dictionary();
+ }
///
/// Checks SourceLists for a given list and returns it if found. Otherwise, returns null
@@ -61,11 +61,11 @@ public Dictionary GetSourceListForKey(string key)
return SourceLists[key];
}
- ///
- /// Retrieves a DestinationListItem based on the key
- ///
- /// key of the list to retrieve
- /// DestinationList if the key exists, null otherwise
+ ///
+ /// Retrieves a DestinationListItem based on the key
+ ///
+ /// key of the list to retrieve
+ /// DestinationList if the key exists, null otherwise
public Dictionary GetDestinationListForKey(string key)
{
if (DestinationLists == null || string.IsNullOrEmpty(key) || !DestinationLists.ContainsKey(key))
@@ -76,48 +76,47 @@ public Dictionary GetDestinationListForKey(string k
return DestinationLists[key];
}
- ///
- /// Retrieves a AudioControlPointList based on the key
- ///
- /// key of the list to retrieve
- /// AudioControlPointList if the key exists, null otherwise
- public AudioControlPointListItem GetAudioControlPointListForKey(string key)
- {
- if (AudioControlPointLists == null || string.IsNullOrEmpty(key) || !AudioControlPointLists.ContainsKey(key))
- return null;
-
- return AudioControlPointLists[key];
- }
-
- ///
- /// Checks CameraLists for a given list and returns it if found. Otherwise, returns null
- ///
- public Dictionary GetCameraListForKey(string key)
+ ///
+ /// Retrieves a AudioControlPointList based on the key
+ ///
+ /// key of the list to retrieve
+ /// AudioControlPointList if the key exists, null otherwise
+ public AudioControlPointListItem GetAudioControlPointListForKey(string key)
+ {
+ if (AudioControlPointLists == null || string.IsNullOrEmpty(key) || !AudioControlPointLists.ContainsKey(key))
+ return null;
+
+ return AudioControlPointLists[key];
+ }
+
+ ///
+ /// Checks CameraLists for a given list and returns it if found. Otherwise, returns null
+ ///
+ public Dictionary GetCameraListForKey(string key)
+ {
+ if (CameraLists == null || string.IsNullOrEmpty(key) || !CameraLists.ContainsKey(key))
+ return null;
+
+ return CameraLists[key];
+ }
+
+ ///
+ /// Checks Devices for an item with a Key that matches and returns it if found. Otherwise, retunes null
+ ///
+ /// Key of desired device
+ ///
+ public DeviceConfig GetDeviceForKey(string key)
+ {
+ if (string.IsNullOrEmpty(key))
+ return null;
+
+ var deviceConfig = Devices.FirstOrDefault(d => d.Key.Equals(key));
+
+ if (deviceConfig != null)
+ return deviceConfig;
+ else
{
- if (CameraLists == null || string.IsNullOrEmpty(key) || !CameraLists.ContainsKey(key))
- return null;
-
- return CameraLists[key];
- }
-
- ///
- /// Checks Devices for an item with a Key that matches and returns it if found. Otherwise, retunes null
- ///
- /// Key of desired device
- ///
- public DeviceConfig GetDeviceForKey(string key)
- {
- if (string.IsNullOrEmpty(key))
- return null;
-
- var deviceConfig = Devices.FirstOrDefault(d => d.Key.Equals(key));
-
- if (deviceConfig != null)
- return deviceConfig;
- else
- {
- return null;
- }
+ return null;
}
- }
-}
\ No newline at end of file
+ }
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Config/ConfigPropertiesHelpers.cs b/src/PepperDash.Essentials.Core/Config/ConfigPropertiesHelpers.cs
index 0950d62e3..9eb8e61df 100644
--- a/src/PepperDash.Essentials.Core/Config/ConfigPropertiesHelpers.cs
+++ b/src/PepperDash.Essentials.Core/Config/ConfigPropertiesHelpers.cs
@@ -9,24 +9,23 @@
using PepperDash.Core;
using Newtonsoft.Json.Linq;
-namespace PepperDash.Essentials.Core.Config
+namespace PepperDash.Essentials.Core.Config;
+
+public class ConfigPropertiesHelpers
{
- public class ConfigPropertiesHelpers
+ ///
+ /// Returns the value of properties.hasAudio, or false if not defined
+ ///
+ public static bool GetHasAudio(DeviceConfig deviceConfig)
{
- ///
- /// Returns the value of properties.hasAudio, or false if not defined
- ///
- public static bool GetHasAudio(DeviceConfig deviceConfig)
- {
- return deviceConfig.Properties.Value("hasAudio");
- }
+ return deviceConfig.Properties.Value("hasAudio");
+ }
- ///
- /// Returns the value of properties.hasControls, or false if not defined
- ///
- public static bool GetHasControls(DeviceConfig deviceConfig)
- {
- return deviceConfig.Properties.Value("hasControls");
- }
+ ///
+ /// Returns the value of properties.hasControls, or false if not defined
+ ///
+ public static bool GetHasControls(DeviceConfig deviceConfig)
+ {
+ return deviceConfig.Properties.Value("hasControls");
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Config/DeviceConfig.cs b/src/PepperDash.Essentials.Core/Config/DeviceConfig.cs
index 3eac80d9d..49994abc5 100644
--- a/src/PepperDash.Essentials.Core/Config/DeviceConfig.cs
+++ b/src/PepperDash.Essentials.Core/Config/DeviceConfig.cs
@@ -11,72 +11,71 @@
using PepperDash.Core;
using PepperDash.Essentials.Core;
-namespace PepperDash.Essentials.Core.Config
-{
- public class DeviceConfig
- {
- [JsonProperty("key")]
- public string Key { get; set; }
+namespace PepperDash.Essentials.Core.Config;
- [JsonProperty("uid")]
- public int Uid { get; set; }
+public class DeviceConfig
+{
+ [JsonProperty("key")]
+ public string Key { get; set; }
- [JsonProperty("name")]
- public string Name { get; set; }
+ [JsonProperty("uid")]
+ public int Uid { get; set; }
- [JsonProperty("group")]
- public string Group { get; set; }
+ [JsonProperty("name")]
+ public string Name { get; set; }
- [JsonProperty("type")]
- public string Type { get; set; }
+ [JsonProperty("group")]
+ public string Group { get; set; }
- [JsonProperty("properties")]
- [JsonConverter(typeof(DevicePropertiesConverter))]
- public JToken Properties { get; set; }
+ [JsonProperty("type")]
+ public string Type { get; set; }
- public DeviceConfig(DeviceConfig dc)
- {
- Key = dc.Key;
- Uid = dc.Uid;
- Name = dc.Name;
- Group = dc.Group;
- Type = dc.Type;
+ [JsonProperty("properties")]
+ [JsonConverter(typeof(DevicePropertiesConverter))]
+ public JToken Properties { get; set; }
- Properties = JToken.Parse(dc.Properties.ToString());
+ public DeviceConfig(DeviceConfig dc)
+ {
+ Key = dc.Key;
+ Uid = dc.Uid;
+ Name = dc.Name;
+ Group = dc.Group;
+ Type = dc.Type;
- //Properties = JToken.FromObject(dc.Properties);
- }
+ Properties = JToken.Parse(dc.Properties.ToString());
- public DeviceConfig() {}
+ //Properties = JToken.FromObject(dc.Properties);
}
- ///
- ///
- ///
- public class DevicePropertiesConverter : JsonConverter
- {
+ public DeviceConfig() {}
+}
- public override bool CanConvert(Type objectType)
- {
- return objectType == typeof(JToken);
- }
+///
+///
+///
+public class DevicePropertiesConverter : JsonConverter
+{
- public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
- {
- return JToken.ReadFrom(reader);
- }
+ public override bool CanConvert(Type objectType)
+ {
+ return objectType == typeof(JToken);
+ }
- public override bool CanWrite
- {
- get
- {
- return false;
- }
- }
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ return JToken.ReadFrom(reader);
+ }
- public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ public override bool CanWrite
+ {
+ get
{
- throw new NotImplementedException("SOD OFF HOSER");
+ return false;
}
}
+
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ throw new NotImplementedException("SOD OFF HOSER");
+ }
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Config/Essentials/ConfigReader.cs b/src/PepperDash.Essentials.Core/Config/Essentials/ConfigReader.cs
index 8549ecd83..d81223e39 100644
--- a/src/PepperDash.Essentials.Core/Config/Essentials/ConfigReader.cs
+++ b/src/PepperDash.Essentials.Core/Config/Essentials/ConfigReader.cs
@@ -11,15 +11,15 @@
using PepperDash.Core.Config;
using Serilog.Events;
-namespace PepperDash.Essentials.Core.Config
-{
+namespace PepperDash.Essentials.Core.Config;
+
///
/// Loads the ConfigObject from the file
///
public class ConfigReader
{
public const string LocalConfigPresent =
- @"
+ @"
***************************************************
************* Using Local config file *************
***************************************************";
@@ -31,227 +31,226 @@ public static bool LoadConfig2()
Debug.LogMessage(LogEventLevel.Information, "Loading unmerged system/template portal configuration file.");
try
{
- // Check for local config file first
- var filePath = Global.FilePathPrefix + ConfigWriter.LocalConfigFolder + Global.DirectorySeparator + Global.ConfigFileName;
+ // Check for local config file first
+ var filePath = Global.FilePathPrefix + ConfigWriter.LocalConfigFolder + Global.DirectorySeparator + Global.ConfigFileName;
- bool localConfigFound = false;
+ bool localConfigFound = false;
- Debug.LogMessage(LogEventLevel.Information, "Attempting to load Local config file: '{0}'", filePath);
+ Debug.LogMessage(LogEventLevel.Information, "Attempting to load Local config file: '{0}'", filePath);
- // Check for local config directory first
+ // Check for local config directory first
- var configFiles = GetConfigFiles(filePath);
+ var configFiles = GetConfigFiles(filePath);
- if (configFiles != null)
+ if (configFiles != null)
+ {
+ if (configFiles.Length > 1)
{
- if (configFiles.Length > 1)
- {
- Debug.LogMessage(LogEventLevel.Information,
- "****Error: Multiple Local Configuration files present. Please ensure only a single file exists and reset program.****");
- return false;
- }
- if(configFiles.Length == 1)
- {
- localConfigFound = true;
-
- }
+ Debug.LogMessage(LogEventLevel.Information,
+ "****Error: Multiple Local Configuration files present. Please ensure only a single file exists and reset program.****");
+ return false;
}
- else
+ if(configFiles.Length == 1)
{
- Debug.LogMessage(LogEventLevel.Information,
- "Local Configuration file not present.", filePath);
-
+ localConfigFound = true;
+
}
+ }
+ else
+ {
+ Debug.LogMessage(LogEventLevel.Information,
+ "Local Configuration file not present.", filePath);
- // Check for Portal Config
- if(!localConfigFound)
- {
- filePath = Global.FilePathPrefix + Global.ConfigFileName;
+ }
- Debug.LogMessage(LogEventLevel.Information, "Attempting to load Portal config file: '{0}'", filePath);
+ // Check for Portal Config
+ if(!localConfigFound)
+ {
+ filePath = Global.FilePathPrefix + Global.ConfigFileName;
- configFiles = GetConfigFiles(filePath);
+ Debug.LogMessage(LogEventLevel.Information, "Attempting to load Portal config file: '{0}'", filePath);
- if (configFiles != null)
+ configFiles = GetConfigFiles(filePath);
+
+ if (configFiles != null)
+ {
+ Debug.LogMessage(LogEventLevel.Verbose, "{0} config files found matching pattern", configFiles.Length);
+
+ if (configFiles.Length > 1)
{
- Debug.LogMessage(LogEventLevel.Verbose, "{0} config files found matching pattern", configFiles.Length);
-
- if (configFiles.Length > 1)
- {
- Debug.LogMessage(LogEventLevel.Information,
- "****Error: Multiple Portal Configuration files present. Please ensure only a single file exists and reset program.****");
- return false;
- }
- else if (configFiles.Length == 1)
- {
- Debug.LogMessage(LogEventLevel.Information, "Found Portal config file: '{0}'", filePath);
- }
- else
- {
- Debug.LogMessage(LogEventLevel.Information, "No config file found.");
- return false;
- }
+ Debug.LogMessage(LogEventLevel.Information,
+ "****Error: Multiple Portal Configuration files present. Please ensure only a single file exists and reset program.****");
+ return false;
+ }
+ else if (configFiles.Length == 1)
+ {
+ Debug.LogMessage(LogEventLevel.Information, "Found Portal config file: '{0}'", filePath);
}
else
{
- Debug.LogMessage(LogEventLevel.Information,
- "ERROR: Portal Configuration file not present. Please load file and reset program.");
+ Debug.LogMessage(LogEventLevel.Information, "No config file found.");
return false;
}
}
+ else
+ {
+ Debug.LogMessage(LogEventLevel.Information,
+ "ERROR: Portal Configuration file not present. Please load file and reset program.");
+ return false;
+ }
+ }
- // Get the actual file path
- filePath = configFiles[0].FullName;
+ // Get the actual file path
+ filePath = configFiles[0].FullName;
- // Generate debug statement if using a local file.
+ // Generate debug statement if using a local file.
if (localConfigFound)
{
- GetLocalFileMessage(filePath);
+ GetLocalFileMessage(filePath);
}
- // Read the file
- using (StreamReader fs = new StreamReader(filePath))
- {
- Debug.LogMessage(LogEventLevel.Information, "Loading config file: '{0}'", filePath);
+ // Read the file
+ using (StreamReader fs = new StreamReader(filePath))
+ {
+ Debug.LogMessage(LogEventLevel.Information, "Loading config file: '{0}'", filePath);
- if (localConfigFound)
- {
- ConfigObject = JObject.Parse(fs.ReadToEnd()).ToObject();
+ if (localConfigFound)
+ {
+ ConfigObject = JObject.Parse(fs.ReadToEnd()).ToObject();
- Debug.LogMessage(LogEventLevel.Information, "Successfully Loaded Local Config");
+ Debug.LogMessage(LogEventLevel.Information, "Successfully Loaded Local Config");
- return true;
- }
- else
- {
- var doubleObj = JObject.Parse(fs.ReadToEnd());
- ConfigObject = PortalConfigReader.MergeConfigs(doubleObj).ToObject();
+ return true;
+ }
+ else
+ {
+ var doubleObj = JObject.Parse(fs.ReadToEnd());
+ ConfigObject = PortalConfigReader.MergeConfigs(doubleObj).ToObject();
- // Extract SystemUrl and TemplateUrl into final config output
+ // Extract SystemUrl and TemplateUrl into final config output
- if (doubleObj["system_url"] != null)
- {
- ConfigObject.SystemUrl = doubleObj["system_url"].Value();
- }
+ if (doubleObj["system_url"] != null)
+ {
+ ConfigObject.SystemUrl = doubleObj["system_url"].Value();
+ }
- if (doubleObj["template_url"] != null)
- {
- ConfigObject.TemplateUrl = doubleObj["template_url"].Value();
- }
+ if (doubleObj["template_url"] != null)
+ {
+ ConfigObject.TemplateUrl = doubleObj["template_url"].Value();
}
+ }
- Debug.LogMessage(LogEventLevel.Information, "Successfully Loaded Merged Config");
+ Debug.LogMessage(LogEventLevel.Information, "Successfully Loaded Merged Config");
- return true;
- }
+ return true;
+ }
}
catch (Exception e)
{
- Debug.LogMessage(LogEventLevel.Information, "ERROR: Config load failed: \r{0}", e);
+ Debug.LogMessage(LogEventLevel.Information, "ERROR: Config load failed: \r{0}", e);
return false;
}
}
- ///
- /// Returns all the files from the directory specified.
- ///
- ///
- ///
- public static FileInfo[] GetConfigFiles(string filePath)
+ ///
+ /// Returns all the files from the directory specified.
+ ///
+ ///
+ ///
+ public static FileInfo[] GetConfigFiles(string filePath)
+ {
+ // Get the directory
+ var dir = Path.GetDirectoryName(filePath);
+
+ if (Directory.Exists(dir))
{
- // Get the directory
- var dir = Path.GetDirectoryName(filePath);
+ Debug.LogMessage(LogEventLevel.Debug, "Searching in Directory '{0}'", dir);
+ // Get the directory info
+ var dirInfo = new DirectoryInfo(dir);
- if (Directory.Exists(dir))
- {
- Debug.LogMessage(LogEventLevel.Debug, "Searching in Directory '{0}'", dir);
- // Get the directory info
- var dirInfo = new DirectoryInfo(dir);
+ // Get the file name
+ var fileName = Path.GetFileName(filePath);
+ Debug.LogMessage(LogEventLevel.Debug, "For Config Files matching: '{0}'", fileName);
- // Get the file name
- var fileName = Path.GetFileName(filePath);
- Debug.LogMessage(LogEventLevel.Debug, "For Config Files matching: '{0}'", fileName);
-
- // Get the files that match from the directory
- return dirInfo.GetFiles(fileName);
- }
- else
- {
- Debug.LogMessage(LogEventLevel.Information,
- "Directory not found: ", dir);
+ // Get the files that match from the directory
+ return dirInfo.GetFiles(fileName);
+ }
+ else
+ {
+ Debug.LogMessage(LogEventLevel.Information,
+ "Directory not found: ", dir);
- return null;
- }
+ return null;
}
+ }
///
/// Returns the group for a given device key in config
///
///
///
- public static string GetGroupForDeviceKey(string key)
- {
- var dev = ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
- return dev == null ? null : dev.Group;
- }
+ public static string GetGroupForDeviceKey(string key)
+ {
+ var dev = ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
+ return dev == null ? null : dev.Group;
+ }
private static void GetLocalFileMessage(string filePath)
{
- var filePathLength = filePath.Length + 2;
- var debugStringWidth = filePathLength + 12;
+ var filePathLength = filePath.Length + 2;
+ var debugStringWidth = filePathLength + 12;
- if (debugStringWidth < 51)
- {
- debugStringWidth = 51;
- }
- var qualifier = (filePathLength % 2 != 0)
- ? " Using Local Config File "
- : " Using Local Config File ";
- var bookend1 = (debugStringWidth - qualifier.Length) / 2;
- var bookend2 = (debugStringWidth - filePathLength) / 2;
+ if (debugStringWidth < 51)
+ {
+ debugStringWidth = 51;
+ }
+ var qualifier = (filePathLength % 2 != 0)
+ ? " Using Local Config File "
+ : " Using Local Config File ";
+ var bookend1 = (debugStringWidth - qualifier.Length) / 2;
+ var bookend2 = (debugStringWidth - filePathLength) / 2;
var newDebugString = new StringBuilder()
.Append(CrestronEnvironment.NewLine)
- // Line 1
+ // Line 1
.Append(new string('*', debugStringWidth))
.Append(CrestronEnvironment.NewLine)
- // Line 2
+ // Line 2
.Append(new string('*', debugStringWidth))
.Append(CrestronEnvironment.NewLine)
- // Line 3
+ // Line 3
.Append(new string('*', 2))
.Append(new string(' ', debugStringWidth - 4))
.Append(new string('*', 2))
.Append(CrestronEnvironment.NewLine)
- // Line 4
+ // Line 4
.Append(new string('*', 2))
.Append(new string(' ', bookend1 - 2))
.Append(qualifier)
.Append(new string(' ', bookend1 - 2))
.Append(new string('*', 2))
.Append(CrestronEnvironment.NewLine)
- // Line 5
+ // Line 5
.Append(new string('*', 2))
.Append(new string(' ', bookend2 - 2))
.Append(" " + filePath + " ")
.Append(new string(' ', bookend2 - 2))
.Append(new string('*', 2))
.Append(CrestronEnvironment.NewLine)
- // Line 6
+ // Line 6
.Append(new string('*', 2))
.Append(new string(' ', debugStringWidth - 4))
.Append(new string('*', 2))
.Append(CrestronEnvironment.NewLine)
- // Line 7
+ // Line 7
.Append(new string('*', debugStringWidth))
.Append(CrestronEnvironment.NewLine)
- // Line 8
+ // Line 8
.Append(new string('*', debugStringWidth));
- Debug.LogMessage(LogEventLevel.Verbose, "Found Local config file: '{0}'", filePath);
- Debug.LogMessage(LogEventLevel.Information, newDebugString.ToString());
+ Debug.LogMessage(LogEventLevel.Verbose, "Found Local config file: '{0}'", filePath);
+ Debug.LogMessage(LogEventLevel.Information, newDebugString.ToString());
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Config/Essentials/ConfigUpdater.cs b/src/PepperDash.Essentials.Core/Config/Essentials/ConfigUpdater.cs
index 141ffc25b..0f14e4557 100644
--- a/src/PepperDash.Essentials.Core/Config/Essentials/ConfigUpdater.cs
+++ b/src/PepperDash.Essentials.Core/Config/Essentials/ConfigUpdater.cs
@@ -14,213 +14,212 @@
using PepperDash.Core;
using Serilog.Events;
-namespace PepperDash.Essentials.Core.Config
+namespace PepperDash.Essentials.Core.Config;
+
+public static class ConfigUpdater
{
- public static class ConfigUpdater
- {
- public static event EventHandler ConfigStatusChanged;
+ public static event EventHandler ConfigStatusChanged;
- public static void GetConfigFromServer(string url)
- {
- Debug.LogMessage(LogEventLevel.Information, "Attempting to get new config from '{0}'", url);
+ public static void GetConfigFromServer(string url)
+ {
+ Debug.LogMessage(LogEventLevel.Information, "Attempting to get new config from '{0}'", url);
- // HTTP GET
- var req = new HttpClientRequest();
+ // HTTP GET
+ var req = new HttpClientRequest();
- try
- {
- req.RequestType = RequestType.Get;
- req.Url.Parse(url);
+ try
+ {
+ req.RequestType = RequestType.Get;
+ req.Url.Parse(url);
- new HttpClient().DispatchAsync(req, (r, e) =>
+ new HttpClient().DispatchAsync(req, (r, e) =>
+ {
+ if (e == HTTP_CALLBACK_ERROR.COMPLETED)
{
- if (e == HTTP_CALLBACK_ERROR.COMPLETED)
+ if (r.Code == 200)
{
- if (r.Code == 200)
- {
- var newConfig = r.ContentString;
+ var newConfig = r.ContentString;
- OnStatusUpdate(eUpdateStatus.ConfigFileReceived);
+ OnStatusUpdate(eUpdateStatus.ConfigFileReceived);
- ArchiveExistingPortalConfigs();
+ ArchiveExistingPortalConfigs();
- CheckForLocalConfigAndDelete();
+ CheckForLocalConfigAndDelete();
- WriteConfigToFile(newConfig);
+ WriteConfigToFile(newConfig);
- RestartProgram();
- }
- else
- {
- Debug.LogMessage(LogEventLevel.Information, "Config Update Process Stopped. Failed to get config file from server: {0}", r.Code);
- OnStatusUpdate(eUpdateStatus.UpdateFailed);
- }
+ RestartProgram();
}
else
- Debug.LogMessage(LogEventLevel.Information, "Request for config from Server Failed: {0}", e);
- });
- }
- catch (Exception e)
- {
- Debug.LogMessage(LogEventLevel.Debug, "Error Getting Config from Server: {0}", e);
- }
-
+ {
+ Debug.LogMessage(LogEventLevel.Information, "Config Update Process Stopped. Failed to get config file from server: {0}", r.Code);
+ OnStatusUpdate(eUpdateStatus.UpdateFailed);
+ }
+ }
+ else
+ Debug.LogMessage(LogEventLevel.Information, "Request for config from Server Failed: {0}", e);
+ });
}
-
- static void OnStatusUpdate(eUpdateStatus status)
+ catch (Exception e)
{
- var handler = ConfigStatusChanged;
-
- if(handler != null)
- {
- handler(typeof(ConfigUpdater), new ConfigStatusEventArgs(status));
- }
+ Debug.LogMessage(LogEventLevel.Debug, "Error Getting Config from Server: {0}", e);
}
- static void WriteConfigToFile(string configData)
+ }
+
+ static void OnStatusUpdate(eUpdateStatus status)
+ {
+ var handler = ConfigStatusChanged;
+
+ if(handler != null)
{
- var filePath = Global.FilePathPrefix+ "configurationFile-updated.json";
+ handler(typeof(ConfigUpdater), new ConfigStatusEventArgs(status));
+ }
+ }
- try
- {
- var config = JObject.Parse(configData).ToObject();
+ static void WriteConfigToFile(string configData)
+ {
+ var filePath = Global.FilePathPrefix+ "configurationFile-updated.json";
- ConfigWriter.WriteFile(filePath, configData);
+ try
+ {
+ var config = JObject.Parse(configData).ToObject();
- OnStatusUpdate(eUpdateStatus.WritingConfigFile);
- }
- catch (Exception e)
- {
- Debug.LogMessage(LogEventLevel.Debug, "Error parsing new config: {0}", e);
+ ConfigWriter.WriteFile(filePath, configData);
- OnStatusUpdate(eUpdateStatus.UpdateFailed);
- }
+ OnStatusUpdate(eUpdateStatus.WritingConfigFile);
}
-
- ///
- /// Checks for any existing portal config files and archives them
- ///
- static void ArchiveExistingPortalConfigs()
+ catch (Exception e)
{
- var filePath = Global.FilePathPrefix + Global.ConfigFileName;
+ Debug.LogMessage(LogEventLevel.Debug, "Error parsing new config: {0}", e);
- var configFiles = ConfigReader.GetConfigFiles(filePath);
+ OnStatusUpdate(eUpdateStatus.UpdateFailed);
+ }
+ }
- if (configFiles != null)
- {
- Debug.LogMessage(LogEventLevel.Information, "Existing config files found. Moving to Archive folder.");
+ ///
+ /// Checks for any existing portal config files and archives them
+ ///
+ static void ArchiveExistingPortalConfigs()
+ {
+ var filePath = Global.FilePathPrefix + Global.ConfigFileName;
- OnStatusUpdate(eUpdateStatus.ArchivingConfigs);
+ var configFiles = ConfigReader.GetConfigFiles(filePath);
- MoveFilesToArchiveFolder(configFiles);
- }
- else
- {
- Debug.LogMessage(LogEventLevel.Information, "No Existing config files found in '{0}'. Nothing to archive", filePath);
- }
- }
-
- ///
- /// Checks for presence of archive folder and if found deletes contents.
- /// Moves any config files to the archive folder and adds a .bak suffix
- ///
- ///
- static void MoveFilesToArchiveFolder(FileInfo[] files)
+ if (configFiles != null)
{
- string archiveDirectoryPath = Global.FilePathPrefix + "archive";
+ Debug.LogMessage(LogEventLevel.Information, "Existing config files found. Moving to Archive folder.");
- if (!Directory.Exists(archiveDirectoryPath))
- {
- // Directory does not exist, create it
- Directory.Create(archiveDirectoryPath);
- }
- else
- {
- // Directory exists, first clear any contents
- var archivedConfigFiles = ConfigReader.GetConfigFiles(archiveDirectoryPath + Global.DirectorySeparator + Global.ConfigFileName + ".bak");
+ OnStatusUpdate(eUpdateStatus.ArchivingConfigs);
- if(archivedConfigFiles != null || archivedConfigFiles.Length > 0)
- {
- Debug.LogMessage(LogEventLevel.Information, "{0} Existing files found in archive folder. Deleting.", archivedConfigFiles.Length);
+ MoveFilesToArchiveFolder(configFiles);
+ }
+ else
+ {
+ Debug.LogMessage(LogEventLevel.Information, "No Existing config files found in '{0}'. Nothing to archive", filePath);
+ }
+ }
- for (int i = 0; i < archivedConfigFiles.Length; i++ )
- {
- var file = archivedConfigFiles[i];
- Debug.LogMessage(LogEventLevel.Information, "Deleting archived file: '{0}'", file.FullName);
- file.Delete();
- }
- }
+ ///
+ /// Checks for presence of archive folder and if found deletes contents.
+ /// Moves any config files to the archive folder and adds a .bak suffix
+ ///
+ ///
+ static void MoveFilesToArchiveFolder(FileInfo[] files)
+ {
+ string archiveDirectoryPath = Global.FilePathPrefix + "archive";
- }
+ if (!Directory.Exists(archiveDirectoryPath))
+ {
+ // Directory does not exist, create it
+ Directory.Create(archiveDirectoryPath);
+ }
+ else
+ {
+ // Directory exists, first clear any contents
+ var archivedConfigFiles = ConfigReader.GetConfigFiles(archiveDirectoryPath + Global.DirectorySeparator + Global.ConfigFileName + ".bak");
- // Move any files from the program folder to the archive folder
- foreach (var file in files)
+ if(archivedConfigFiles != null || archivedConfigFiles.Length > 0)
{
- Debug.LogMessage(LogEventLevel.Information, "Moving config file '{0}' to archive folder", file.FullName);
+ Debug.LogMessage(LogEventLevel.Information, "{0} Existing files found in archive folder. Deleting.", archivedConfigFiles.Length);
- // Moves the file and appends the .bak extension
- var fileDest = archiveDirectoryPath + "/" + file.Name + ".bak";
- if(!File.Exists(fileDest))
+ for (int i = 0; i < archivedConfigFiles.Length; i++ )
{
- file.MoveTo(fileDest);
+ var file = archivedConfigFiles[i];
+ Debug.LogMessage(LogEventLevel.Information, "Deleting archived file: '{0}'", file.FullName);
+ file.Delete();
}
- else
- Debug.LogMessage(LogEventLevel.Information, "Cannot move file to archive folder. Existing file already exists with same name: '{0}'", fileDest);
}
+
}
- ///
- /// Checks for LocalConfig folder in file system and deletes if found
- ///
- static void CheckForLocalConfigAndDelete()
+ // Move any files from the program folder to the archive folder
+ foreach (var file in files)
{
- var folderPath = Global.FilePathPrefix + ConfigWriter.LocalConfigFolder;
+ Debug.LogMessage(LogEventLevel.Information, "Moving config file '{0}' to archive folder", file.FullName);
- if (Directory.Exists(folderPath))
+ // Moves the file and appends the .bak extension
+ var fileDest = archiveDirectoryPath + "/" + file.Name + ".bak";
+ if(!File.Exists(fileDest))
{
- OnStatusUpdate(eUpdateStatus.DeletingLocalConfig);
- Directory.Delete(folderPath);
- Debug.LogMessage(LogEventLevel.Information, "Local Config Found in '{0}'. Deleting.", folderPath);
+ file.MoveTo(fileDest);
}
+ else
+ Debug.LogMessage(LogEventLevel.Information, "Cannot move file to archive folder. Existing file already exists with same name: '{0}'", fileDest);
}
+ }
- ///
- /// Connects to the processor via SSH and restarts the program
- ///
- static void RestartProgram()
+ ///
+ /// Checks for LocalConfig folder in file system and deletes if found
+ ///
+ static void CheckForLocalConfigAndDelete()
+ {
+ var folderPath = Global.FilePathPrefix + ConfigWriter.LocalConfigFolder;
+
+ if (Directory.Exists(folderPath))
{
- Debug.LogMessage(LogEventLevel.Information, "Attempting to Reset Program");
+ OnStatusUpdate(eUpdateStatus.DeletingLocalConfig);
+ Directory.Delete(folderPath);
+ Debug.LogMessage(LogEventLevel.Information, "Local Config Found in '{0}'. Deleting.", folderPath);
+ }
+ }
- OnStatusUpdate(eUpdateStatus.RestartingProgram);
+ ///
+ /// Connects to the processor via SSH and restarts the program
+ ///
+ static void RestartProgram()
+ {
+ Debug.LogMessage(LogEventLevel.Information, "Attempting to Reset Program");
- string response = string.Empty;
+ OnStatusUpdate(eUpdateStatus.RestartingProgram);
- CrestronConsole.SendControlSystemCommand(string.Format("progreset -p:{0}", InitialParametersClass.ApplicationNumber), ref response);
+ string response = string.Empty;
- Debug.LogMessage(LogEventLevel.Debug, "Console Response: {0}", response);
- }
+ CrestronConsole.SendControlSystemCommand(string.Format("progreset -p:{0}", InitialParametersClass.ApplicationNumber), ref response);
+ Debug.LogMessage(LogEventLevel.Debug, "Console Response: {0}", response);
}
- public enum eUpdateStatus
- {
- UpdateStarted,
- ConfigFileReceived,
- ArchivingConfigs,
- DeletingLocalConfig,
- WritingConfigFile,
- RestartingProgram,
- UpdateSucceeded,
- UpdateFailed
- }
+}
- public class ConfigStatusEventArgs : EventArgs
- {
- public eUpdateStatus UpdateStatus { get; private set; }
+ public enum eUpdateStatus
+{
+ UpdateStarted,
+ ConfigFileReceived,
+ ArchivingConfigs,
+ DeletingLocalConfig,
+ WritingConfigFile,
+ RestartingProgram,
+ UpdateSucceeded,
+ UpdateFailed
+}
+
+public class ConfigStatusEventArgs : EventArgs
+{
+ public eUpdateStatus UpdateStatus { get; private set; }
- public ConfigStatusEventArgs(eUpdateStatus status)
- {
- UpdateStatus = status;
- }
+ public ConfigStatusEventArgs(eUpdateStatus status)
+ {
+ UpdateStatus = status;
}
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Config/Essentials/ConfigWriter.cs b/src/PepperDash.Essentials.Core/Config/Essentials/ConfigWriter.cs
index 58ced97ee..a688b3783 100644
--- a/src/PepperDash.Essentials.Core/Config/Essentials/ConfigWriter.cs
+++ b/src/PepperDash.Essentials.Core/Config/Essentials/ConfigWriter.cs
@@ -11,155 +11,154 @@
using PepperDash.Core;
using Serilog.Events;
-namespace PepperDash.Essentials.Core.Config
+namespace PepperDash.Essentials.Core.Config;
+
+///
+/// Responsible for updating config at runtime, and writing the updates out to a local file
+///
+public class ConfigWriter
{
+ public const string LocalConfigFolder = "LocalConfig";
+
+ public const long WriteTimeout = 30000;
+
+ public static CTimer WriteTimer;
+ static CCriticalSection fileLock = new CCriticalSection();
+
///
- /// Responsible for updating config at runtime, and writing the updates out to a local file
+ /// Updates the config properties of a device
///
- public class ConfigWriter
+ ///
+ ///
+ ///
+ public static bool UpdateDeviceProperties(string deviceKey, JToken properties)
{
- public const string LocalConfigFolder = "LocalConfig";
-
- public const long WriteTimeout = 30000;
+ bool success = false;
- public static CTimer WriteTimer;
- static CCriticalSection fileLock = new CCriticalSection();
+ // Get the current device config
+ var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(deviceKey));
- ///
- /// Updates the config properties of a device
- ///
- ///
- ///
- ///
- public static bool UpdateDeviceProperties(string deviceKey, JToken properties)
+ if (deviceConfig != null)
{
- bool success = false;
+ // Replace the current properties JToken with the new one passed into this method
+ deviceConfig.Properties = properties;
- // Get the current device config
- var deviceConfig = ConfigReader.ConfigObject.Devices.FirstOrDefault(d => d.Key.Equals(deviceKey));
+ Debug.LogMessage(LogEventLevel.Debug, "Updated properties of device: '{0}'", deviceKey);
- if (deviceConfig != null)
- {
- // Replace the current properties JToken with the new one passed into this method
- deviceConfig.Properties = properties;
+ success = true;
+ }
- Debug.LogMessage(LogEventLevel.Debug, "Updated properties of device: '{0}'", deviceKey);
+ ResetTimer();
- success = true;
- }
+ return success;
+ }
- ResetTimer();
+ public static bool UpdateDeviceConfig(DeviceConfig config)
+ {
+ bool success = false;
- return success;
- }
+ var deviceConfigIndex = ConfigReader.ConfigObject.Devices.FindIndex(d => d.Key.Equals(config.Key));
- public static bool UpdateDeviceConfig(DeviceConfig config)
+ if (deviceConfigIndex >= 0)
{
- bool success = false;
-
- var deviceConfigIndex = ConfigReader.ConfigObject.Devices.FindIndex(d => d.Key.Equals(config.Key));
+ ConfigReader.ConfigObject.Devices[deviceConfigIndex] = config;
- if (deviceConfigIndex >= 0)
- {
- ConfigReader.ConfigObject.Devices[deviceConfigIndex] = config;
-
- Debug.LogMessage(LogEventLevel.Debug, "Updated config of device: '{0}'", config.Key);
+ Debug.LogMessage(LogEventLevel.Debug, "Updated config of device: '{0}'", config.Key);
- success = true;
- }
+ success = true;
+ }
- ResetTimer();
+ ResetTimer();
- return success;
- }
+ return success;
+ }
- public static bool UpdateRoomConfig(DeviceConfig config)
- {
- bool success = false;
+ public static bool UpdateRoomConfig(DeviceConfig config)
+ {
+ bool success = false;
var roomConfigIndex = ConfigReader.ConfigObject.Rooms.FindIndex(d => d.Key.Equals(config.Key));
if (roomConfigIndex >= 0)
- {
- ConfigReader.ConfigObject.Rooms[roomConfigIndex] = config;
+ {
+ ConfigReader.ConfigObject.Rooms[roomConfigIndex] = config;
- Debug.LogMessage(LogEventLevel.Debug, "Updated room of device: '{0}'", config.Key);
+ Debug.LogMessage(LogEventLevel.Debug, "Updated room of device: '{0}'", config.Key);
- success = true;
- }
+ success = true;
+ }
- ResetTimer();
+ ResetTimer();
- return success;
- }
+ return success;
+ }
- ///
- /// Resets (or starts) the write timer
- ///
- static void ResetTimer()
- {
- if (WriteTimer == null)
- WriteTimer = new CTimer(WriteConfigFile, WriteTimeout);
+ ///
+ /// Resets (or starts) the write timer
+ ///
+ static void ResetTimer()
+ {
+ if (WriteTimer == null)
+ WriteTimer = new CTimer(WriteConfigFile, WriteTimeout);
- WriteTimer.Reset(WriteTimeout);
+ WriteTimer.Reset(WriteTimeout);
- Debug.LogMessage(LogEventLevel.Debug, "Config File write timer has been reset.");
- }
+ Debug.LogMessage(LogEventLevel.Debug, "Config File write timer has been reset.");
+ }
- ///
- /// Writes the current config to a file in the LocalConfig subfolder
- ///
- ///
- private static void WriteConfigFile(object o)
- {
- var filePath = Global.FilePathPrefix + LocalConfigFolder + Global.DirectorySeparator + "configurationFile.json";
+ ///
+ /// Writes the current config to a file in the LocalConfig subfolder
+ ///
+ ///
+ private static void WriteConfigFile(object o)
+ {
+ var filePath = Global.FilePathPrefix + LocalConfigFolder + Global.DirectorySeparator + "configurationFile.json";
- var configData = JsonConvert.SerializeObject(ConfigReader.ConfigObject);
+ var configData = JsonConvert.SerializeObject(ConfigReader.ConfigObject);
- WriteFile(filePath, configData);
- }
+ WriteFile(filePath, configData);
+ }
- ///
- /// Writes
- ///
- ///
- ///
- public static void WriteFile(string filePath, string configData)
- {
- if (WriteTimer != null)
- WriteTimer.Stop();
+ ///
+ /// Writes
+ ///
+ ///
+ ///
+ public static void WriteFile(string filePath, string configData)
+ {
+ if (WriteTimer != null)
+ WriteTimer.Stop();
- Debug.LogMessage(LogEventLevel.Information, "Writing Configuration to file");
+ Debug.LogMessage(LogEventLevel.Information, "Writing Configuration to file");
- Debug.LogMessage(LogEventLevel.Information, "Attempting to write config file: '{0}'", filePath);
+ Debug.LogMessage(LogEventLevel.Information, "Attempting to write config file: '{0}'", filePath);
- try
+ try
+ {
+ if (fileLock.TryEnter())
{
- if (fileLock.TryEnter())
+ using (StreamWriter sw = new StreamWriter(filePath))
{
- using (StreamWriter sw = new StreamWriter(filePath))
- {
- sw.Write(configData);
- sw.Flush();
- }
- }
- else
- {
- Debug.LogMessage(LogEventLevel.Information, "Unable to enter FileLock");
+ sw.Write(configData);
+ sw.Flush();
}
}
- catch (Exception e)
+ else
{
- Debug.LogMessage(LogEventLevel.Information, "Error: Config write failed: \r{0}", e);
+ Debug.LogMessage(LogEventLevel.Information, "Unable to enter FileLock");
}
- finally
- {
- if (fileLock != null && !fileLock.Disposed)
- fileLock.Leave();
+ }
+ catch (Exception e)
+ {
+ Debug.LogMessage(LogEventLevel.Information, "Error: Config write failed: \r{0}", e);
+ }
+ finally
+ {
+ if (fileLock != null && !fileLock.Disposed)
+ fileLock.Leave();
- }
}
+ }
- }
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Config/Essentials/EssentialsConfig.cs b/src/PepperDash.Essentials.Core/Config/Essentials/EssentialsConfig.cs
index b42ec94cd..bab6ae1dc 100644
--- a/src/PepperDash.Essentials.Core/Config/Essentials/EssentialsConfig.cs
+++ b/src/PepperDash.Essentials.Core/Config/Essentials/EssentialsConfig.cs
@@ -9,25 +9,25 @@
using PepperDash.Core;
-namespace PepperDash.Essentials.Core.Config
-{
+namespace PepperDash.Essentials.Core.Config;
+
///
/// Loads the ConfigObject from the file
///
public class EssentialsConfig : BasicConfig
{
[JsonProperty("system_url")]
- public string SystemUrl { get; set; }
+ public string SystemUrl { get; set; }
[JsonProperty("template_url")]
- public string TemplateUrl { get; set; }
+ public string TemplateUrl { get; set; }
[JsonProperty("systemUuid")]
public string SystemUuid
+ {
+ get
{
- get
- {
if (string.IsNullOrEmpty(SystemUrl))
return "missing url";
@@ -38,18 +38,18 @@ public string SystemUuid
return uuid;
} else
{
- var result = Regex.Match(SystemUrl, @"https?:\/\/.*\/systems\/(.*)\/.*");
- string uuid = result.Groups[1].Value;
- return uuid;
- }
+ var result = Regex.Match(SystemUrl, @"https?:\/\/.*\/systems\/(.*)\/.*");
+ string uuid = result.Groups[1].Value;
+ return uuid;
}
}
+ }
[JsonProperty("templateUuid")]
public string TemplateUuid
+ {
+ get
{
- get
- {
if (string.IsNullOrEmpty(TemplateUrl))
return "missing template url";
@@ -60,22 +60,22 @@ public string TemplateUuid
return uuid;
} else
{
- var result = Regex.Match(TemplateUrl, @"https?:\/\/.*\/system-templates\/(.*)\/system-template-versions\/(.*)\/.*");
- string uuid = result.Groups[2].Value;
- return uuid;
- }
+ var result = Regex.Match(TemplateUrl, @"https?:\/\/.*\/system-templates\/(.*)\/system-template-versions\/(.*)\/.*");
+ string uuid = result.Groups[2].Value;
+ return uuid;
}
}
+ }
[JsonProperty("rooms")]
- public List Rooms { get; set; }
+ public List Rooms { get; set; }
- public EssentialsConfig()
- : base()
- {
- Rooms = new List();
- }
+ public EssentialsConfig()
+ : base()
+ {
+ Rooms = new List();
+ }
}
///
@@ -86,5 +86,4 @@ public class SystemTemplateConfigs
public EssentialsConfig System { get; set; }
public EssentialsConfig Template { get; set; }
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Config/ILoadConfig.cs b/src/PepperDash.Essentials.Core/Config/ILoadConfig.cs
index 00bbf5f65..a02baa8cd 100644
--- a/src/PepperDash.Essentials.Core/Config/ILoadConfig.cs
+++ b/src/PepperDash.Essentials.Core/Config/ILoadConfig.cs
@@ -4,10 +4,9 @@
using System.Text;
using System.Threading.Tasks;
-namespace PepperDash.Essentials.Core
+namespace PepperDash.Essentials.Core;
+
+public interface ILoadConfig
{
- public interface ILoadConfig
- {
- void GoWithLoad();
- }
+ void GoWithLoad();
}
diff --git a/src/PepperDash.Essentials.Core/Config/InfoConfig.cs b/src/PepperDash.Essentials.Core/Config/InfoConfig.cs
index 12ca49f4e..95b7860ec 100644
--- a/src/PepperDash.Essentials.Core/Config/InfoConfig.cs
+++ b/src/PepperDash.Essentials.Core/Config/InfoConfig.cs
@@ -5,12 +5,12 @@
using System;
using System.Collections.Generic;
-namespace PepperDash.Essentials.Core.Config
-{
- ///
- /// Represents the info section of a Config file
- ///
- public class InfoConfig
+namespace PepperDash.Essentials.Core.Config;
+
+///
+/// Represents the info section of a Config file
+///
+public class InfoConfig
{
[JsonProperty("name")]
public string Name { get; set; }
@@ -24,17 +24,17 @@ public class InfoConfig
[JsonProperty("version")]
public string Version { get; set; }
- [JsonProperty("runtimeInfo")]
- public RuntimeInfo RuntimeInfo { get; set; }
+ [JsonProperty("runtimeInfo")]
+ public RuntimeInfo RuntimeInfo { get; set; }
[JsonProperty("comment")]
public string Comment { get; set; }
- [JsonProperty("hostname")]
- public string HostName { get; set; }
+ [JsonProperty("hostname")]
+ public string HostName { get; set; }
- [JsonProperty("appNumber")]
- public uint AppNumber { get; set; }
+ [JsonProperty("appNumber")]
+ public uint AppNumber { get; set; }
public InfoConfig()
{
@@ -43,49 +43,49 @@ public InfoConfig()
Type = "";
Version = "";
Comment = "";
- HostName = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_HOSTNAME, 0);
- AppNumber = InitialParametersClass.ApplicationNumber;
+ HostName = CrestronEthernetHelper.GetEthernetParameter(CrestronEthernetHelper.ETHERNET_PARAMETER_TO_GET.GET_HOSTNAME, 0);
+ AppNumber = InitialParametersClass.ApplicationNumber;
- RuntimeInfo = new RuntimeInfo();
+ RuntimeInfo = new RuntimeInfo();
}
}
-
+
+///
+/// Represents runtime information about the program/processor
+///
+public class RuntimeInfo
+{
///
- /// Represents runtime information about the program/processor
+ /// The name of the running application
///
- public class RuntimeInfo
- {
- ///
- /// The name of the running application
- ///
- [JsonProperty("appName")]
- public string AppName {get; set;}
- //{
- // get
- // {
- // return Assembly.GetExecutingAssembly().GetName().Name;
- // }
- //}
+ [JsonProperty("appName")]
+ public string AppName {get; set;}
+ //{
+ // get
+ // {
+ // return Assembly.GetExecutingAssembly().GetName().Name;
+ // }
+ //}
- ///
- /// The Assembly version of the running application
- ///
- [JsonProperty("assemblyVersion")]
- public string AssemblyVersion {get; set;}
- //{
- // get
- // {
- // var version = Assembly.GetExecutingAssembly().GetName().Version;
- // return string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build);
- // }
- //}
+ ///
+ /// The Assembly version of the running application
+ ///
+ [JsonProperty("assemblyVersion")]
+ public string AssemblyVersion {get; set;}
+ //{
+ // get
+ // {
+ // var version = Assembly.GetExecutingAssembly().GetName().Version;
+ // return string.Format("{0}.{1}.{2}", version.Major, version.Minor, version.Build);
+ // }
+ //}
- /// ,
- /// The OS Version of the processor (Firmware Version)
- ///
- [JsonProperty("osVersion")]
- public string OsVersion {get; set;}
+ /// ,
+ /// The OS Version of the processor (Firmware Version)
+ ///
+ [JsonProperty("osVersion")]
+ public string OsVersion {get; set;}
//{
// get
// {
@@ -93,17 +93,15 @@ public class RuntimeInfo
// }
//}
- ///
- /// The information gathered by the processor at runtime about it's NICs and their IP addresses.
- ///
- [JsonProperty("ipInfo")]
- public Dictionary IpInfo
+ ///
+ /// The information gathered by the processor at runtime about it's NICs and their IP addresses.
+ ///
+ [JsonProperty("ipInfo")]
+ public Dictionary IpInfo
+ {
+ get
{
- get
- {
- return Global.EthernetAdapterInfoCollection;
- }
+ return Global.EthernetAdapterInfoCollection;
}
}
-
}
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Config/SourceDevicePropertiesConfigBase.cs b/src/PepperDash.Essentials.Core/Config/SourceDevicePropertiesConfigBase.cs
index e6d133398..cc02289cf 100644
--- a/src/PepperDash.Essentials.Core/Config/SourceDevicePropertiesConfigBase.cs
+++ b/src/PepperDash.Essentials.Core/Config/SourceDevicePropertiesConfigBase.cs
@@ -4,10 +4,9 @@
using System.Text;
using Crestron.SimplSharp;
-namespace PepperDash.Essentials.Core.Config
-{
+namespace PepperDash.Essentials.Core.Config;
+
public class SourceDevicePropertiesConfigBase
{
public bool DisableSharing { get; set; }
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/Crestron/CrestronGenericBaseDevice.cs b/src/PepperDash.Essentials.Core/Crestron/CrestronGenericBaseDevice.cs
index ce5438859..8ad90b14f 100644
--- a/src/PepperDash.Essentials.Core/Crestron/CrestronGenericBaseDevice.cs
+++ b/src/PepperDash.Essentials.Core/Crestron/CrestronGenericBaseDevice.cs
@@ -7,16 +7,16 @@
using PepperDash.Essentials.Core.Bridges;
using Serilog.Events;
-namespace PepperDash.Essentials.Core
-{
+namespace PepperDash.Essentials.Core;
+
public abstract class CrestronGenericBaseDevice : EssentialsDevice, IOnline, IHasFeedback, ICommunicationMonitor, IUsageTracking
{
protected GenericBase Hardware;
- ///
- /// Returns a list containing the Outputs that we want to expose.
- ///
- public FeedbackCollection Feedbacks { get; private set; }
+ ///
+ /// Returns a list containing the Outputs that we want to expose.
+ ///
+ public FeedbackCollection Feedbacks { get; private set; }
public BoolFeedback IsOnline { get; private set; }
public BoolFeedback IsRegistered { get; private set; }
@@ -29,35 +29,35 @@ public abstract class CrestronGenericBaseDevice : EssentialsDevice, IOnline, IHa
public bool PreventRegistration { get; protected set; }
protected CrestronGenericBaseDevice(string key, string name, GenericBase hardware)
- : base(key, name)
- {
- Feedbacks = new FeedbackCollection();
+ : base(key, name)
+ {
+ Feedbacks = new FeedbackCollection();
- Hardware = hardware;
- IsOnline = new BoolFeedback("IsOnlineFeedback", () => Hardware.IsOnline);
- IsRegistered = new BoolFeedback("IsRegistered", () => Hardware.Registered);
- IpConnectionsText = new StringFeedback("IpConnectionsText", () => Hardware.ConnectedIpList != null ? string.Join(",", Hardware.ConnectedIpList.Select(cip => cip.DeviceIpAddress).ToArray()) : string.Empty);
- AddToFeedbackList(IsOnline, IpConnectionsText);
+ Hardware = hardware;
+ IsOnline = new BoolFeedback("IsOnlineFeedback", () => Hardware.IsOnline);
+ IsRegistered = new BoolFeedback("IsRegistered", () => Hardware.Registered);
+ IpConnectionsText = new StringFeedback("IpConnectionsText", () => Hardware.ConnectedIpList != null ? string.Join(",", Hardware.ConnectedIpList.Select(cip => cip.DeviceIpAddress).ToArray()) : string.Empty);
+ AddToFeedbackList(IsOnline, IpConnectionsText);
- CommunicationMonitor = new CrestronGenericBaseCommunicationMonitor(this, hardware, 120000, 300000);
- }
+ CommunicationMonitor = new CrestronGenericBaseCommunicationMonitor(this, hardware, 120000, 300000);
+ }
- protected CrestronGenericBaseDevice(string key, string name)
- : base(key, name)
- {
- Feedbacks = new FeedbackCollection();
+ protected CrestronGenericBaseDevice(string key, string name)
+ : base(key, name)
+ {
+ Feedbacks = new FeedbackCollection();
- }
+ }
protected void RegisterCrestronGenericBase(GenericBase hardware)
{
- Hardware = hardware;
- IsOnline = new BoolFeedback("IsOnlineFeedback", () => Hardware.IsOnline);
- IsRegistered = new BoolFeedback("IsRegistered", () => Hardware.Registered);
- IpConnectionsText = new StringFeedback("IpConnectionsText", () => Hardware.ConnectedIpList != null ? string.Join(",", Hardware.ConnectedIpList.Select(cip => cip.DeviceIpAddress).ToArray()) : string.Empty);
- AddToFeedbackList(IsOnline, IpConnectionsText);
+ Hardware = hardware;
+ IsOnline = new BoolFeedback("IsOnlineFeedback", () => Hardware.IsOnline);
+ IsRegistered = new BoolFeedback("IsRegistered", () => Hardware.Registered);
+ IpConnectionsText = new StringFeedback("IpConnectionsText", () => Hardware.ConnectedIpList != null ? string.Join(",", Hardware.ConnectedIpList.Select(cip => cip.DeviceIpAddress).ToArray()) : string.Empty);
+ AddToFeedbackList(IsOnline, IpConnectionsText);
- CommunicationMonitor = new CrestronGenericBaseCommunicationMonitor(this, hardware, 120000, 300000);
+ CommunicationMonitor = new CrestronGenericBaseCommunicationMonitor(this, hardware, 120000, 300000);
}
///
@@ -66,43 +66,43 @@ protected void RegisterCrestronGenericBase(GenericBase hardware)
///
public override bool CustomActivate()
{
- Debug.LogMessage(LogEventLevel.Information, this, "Activating");
- if (!PreventRegistration)
- {
- //Debug.LogMessage(LogEventLevel.Debug, this, " Does not require registration. Skipping");
+ Debug.LogMessage(LogEventLevel.Information, this, "Activating");
+ if (!PreventRegistration)
+ {
+ //Debug.LogMessage(LogEventLevel.Debug, this, " Does not require registration. Skipping");
- if (Hardware.Registerable && !Hardware.Registered)
+ if (Hardware.Registerable && !Hardware.Registered)
+ {
+ var response = Hardware.RegisterWithLogging(Key);
+ if (response != eDeviceRegistrationUnRegistrationResponse.Success)
{
- var response = Hardware.RegisterWithLogging(Key);
- if (response != eDeviceRegistrationUnRegistrationResponse.Success)
- {
- //Debug.LogMessage(LogEventLevel.Information, this, "ERROR: Cannot register Crestron device: {0}", response);
- return false;
- }
+ //Debug.LogMessage(LogEventLevel.Information, this, "ERROR: Cannot register Crestron device: {0}", response);
+ return false;
}
-
- IsRegistered.FireUpdate();
}
- else
- {
- AddPostActivationAction(() =>
+
+ IsRegistered.FireUpdate();
+ }
+ else
+ {
+ AddPostActivationAction(() =>
+ {
+ if (Hardware.Registerable && !Hardware.Registered)
{
- if (Hardware.Registerable && !Hardware.Registered)
- {
- var response = Hardware.RegisterWithLogging(Key);
- }
+ var response = Hardware.RegisterWithLogging(Key);
+ }
- IsRegistered.FireUpdate();
- });
- }
+ IsRegistered.FireUpdate();
+ });
+ }
- foreach (var f in Feedbacks)
- {
- f.FireUpdate();
- }
+ foreach (var f in Feedbacks)
+ {
+ f.FireUpdate();
+ }
- Hardware.OnlineStatusChange += Hardware_OnlineStatusChange;
- CommunicationMonitor.Start();
+ Hardware.OnlineStatusChange += Hardware_OnlineStatusChange;
+ CommunicationMonitor.Start();
return base.CustomActivate();
}
@@ -118,42 +118,42 @@ public override bool Deactivate()
var success = Hardware.UnRegister() == eDeviceRegistrationUnRegistrationResponse.Success;
- IsRegistered.FireUpdate();
+ IsRegistered.FireUpdate();
- return success;
+ return success;
}
///
- /// Adds feedback(s) to the list
- ///
- ///
- public void AddToFeedbackList(params Feedback[] newFbs)
+ /// Adds feedback(s) to the list
+ ///
+ ///
+ public void AddToFeedbackList(params Feedback[] newFbs)
+ {
+ foreach (var f in newFbs)
{
- foreach (var f in newFbs)
- {
- if (f == null) continue;
+ if (f == null) continue;
- if (!Feedbacks.Contains(f))
- {
- Feedbacks.Add(f);
- }
+ if (!Feedbacks.Contains(f))
+ {
+ Feedbacks.Add(f);
}
}
+ }
void Hardware_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventArgs args)
{
- Debug.LogMessage(LogEventLevel.Verbose, this, "OnlineStatusChange Event. Online = {0}", args.DeviceOnLine);
+ Debug.LogMessage(LogEventLevel.Verbose, this, "OnlineStatusChange Event. Online = {0}", args.DeviceOnLine);
- if (!Hardware.Registered)
- {
- return; // protects in cases where device has been unregistered and feedbacks would attempt to access null sigs.
- }
+ if (!Hardware.Registered)
+ {
+ return; // protects in cases where device has been unregistered and feedbacks would attempt to access null sigs.
+ }
- foreach (var feedback in Feedbacks)
- {
- if (feedback != null)
- feedback.FireUpdate();
- }
+ foreach (var feedback in Feedbacks)
+ {
+ if (feedback != null)
+ feedback.FireUpdate();
+ }
}
#region IStatusMonitor Members
@@ -161,27 +161,27 @@ void Hardware_OnlineStatusChange(GenericBase currentDevice, OnlineOfflineEventAr
public StatusMonitorBase CommunicationMonitor { get; private set; }
#endregion
- #region IUsageTracking Members
+ #region IUsageTracking Members
- public UsageTracking UsageTracker { get; set; }
+ public UsageTracking UsageTracker { get; set; }
- #endregion
+ #endregion
}
- public abstract class CrestronGenericBridgeableBaseDevice : CrestronGenericBaseDevice, IBridgeAdvanced
+public abstract class CrestronGenericBridgeableBaseDevice : CrestronGenericBaseDevice, IBridgeAdvanced
+{
+ protected CrestronGenericBridgeableBaseDevice(string key, string name, GenericBase hardware) : base(key, name, hardware)
{
- protected CrestronGenericBridgeableBaseDevice(string key, string name, GenericBase hardware) : base(key, name, hardware)
- {
- }
+ }
- protected CrestronGenericBridgeableBaseDevice(string key, string name)
- : base(key, name)
- {
- }
+ protected CrestronGenericBridgeableBaseDevice(string key, string name)
+ : base(key, name)
+ {
+ }
- public abstract void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge);
- }
+ public abstract void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge);
+}
//***********************************************************************************
@@ -208,5 +208,4 @@ public static eDeviceRegistrationUnRegistrationResponse RegisterWithLogging(this
return result;
}
- }
-}
\ No newline at end of file
+ }
\ No newline at end of file
diff --git a/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs b/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs
index a5923011d..34b363717 100644
--- a/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs
+++ b/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs
@@ -14,155 +14,152 @@
using Serilog.Events;
-namespace PepperDash.Essentials.Core.CrestronIO
+namespace PepperDash.Essentials.Core.CrestronIO;
+
+[Description("Wrapper class for Digital Input")]
+public class GenericDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput
{
- [Description("Wrapper class for Digital Input")]
- public class GenericDigitalInputDevice : EssentialsBridgeableDevice, IDigitalInput
- {
- public DigitalInput InputPort { get; private set; }
+ public DigitalInput InputPort { get; private set; }
- public BoolFeedback InputStateFeedback { get; private set; }
+ public BoolFeedback InputStateFeedback { get; private set; }
- Func InputStateFeedbackFunc
+ Func InputStateFeedbackFunc
+ {
+ get
{
- get
- {
- return () => InputPort.State;
- }
+ return () => InputPort.State;
}
+ }
- public GenericDigitalInputDevice(string key, string name, Func postActivationFunc,
- IOPortConfig config)
- : base(key, name)
+ public GenericDigitalInputDevice(string key, string name, Func postActivationFunc,
+ IOPortConfig config)
+ : base(key, name)
+ {
+ InputStateFeedback = new BoolFeedback(InputStateFeedbackFunc);
+
+ AddPostActivationAction(() =>
{
- InputStateFeedback = new BoolFeedback(InputStateFeedbackFunc);
+ InputPort = postActivationFunc(config);
- AddPostActivationAction(() =>
- {
- InputPort = postActivationFunc(config);
+ InputPort.Register();
- InputPort.Register();
+ InputPort.StateChange += InputPort_StateChange;
- InputPort.StateChange += InputPort_StateChange;
+ });
+ }
- });
- }
+ #region Events
- #region Events
+ void InputPort_StateChange(DigitalInput digitalInput, DigitalInputEventArgs args)
+ {
+ InputStateFeedback.FireUpdate();
+ }
- void InputPort_StateChange(DigitalInput digitalInput, DigitalInputEventArgs args)
- {
- InputStateFeedback.FireUpdate();
- }
+ #endregion
- #endregion
+ #region PreActivate
- #region PreActivate
+ private static DigitalInput GetDigitalInput(IOPortConfig dc)
+ {
+ IDigitalInputPorts ioPortDevice;
- private static DigitalInput GetDigitalInput(IOPortConfig dc)
+ if (dc.PortDeviceKey.Equals("processor"))
{
- IDigitalInputPorts ioPortDevice;
-
- if (dc.PortDeviceKey.Equals("processor"))
- {
- if (!Global.ControlSystem.SupportsDigitalInput)
- {
- Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Processor does not support Digital Inputs");
- return null;
- }
- ioPortDevice = Global.ControlSystem;
- }
- else
+ if (!Global.ControlSystem.SupportsDigitalInput)
{
- var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IDigitalInputPorts;
- if (ioPortDev == null)
- {
- Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Device {0} is not a valid device", dc.PortDeviceKey);
- return null;
- }
- ioPortDevice = ioPortDev;
+ Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Processor does not support Digital Inputs");
+ return null;
}
- if (ioPortDevice == null)
+ ioPortDevice = Global.ControlSystem;
+ }
+ else
+ {
+ var ioPortDev = DeviceManager.GetDeviceForKey(dc.PortDeviceKey) as IDigitalInputPorts;
+ if (ioPortDev == null)
{
- Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Device '0' is not a valid IDigitalInputPorts Device", dc.PortDeviceKey);
+ Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Device {0} is not a valid device", dc.PortDeviceKey);
return null;
}
+ ioPortDevice = ioPortDev;
+ }
+ if (ioPortDevice == null)
+ {
+ Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Device '0' is not a valid IDigitalInputPorts Device", dc.PortDeviceKey);
+ return null;
+ }
- if (dc.PortNumber > ioPortDevice.NumberOfDigitalInputPorts)
- {
- Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber);
- }
+ if (dc.PortNumber > ioPortDevice.NumberOfDigitalInputPorts)
+ {
+ Debug.LogMessage(LogEventLevel.Information, "GetDigitalInput: Device {0} does not contain a port {1}", dc.PortDeviceKey, dc.PortNumber);
+ }
- return ioPortDevice.DigitalInputPorts[dc.PortNumber];
+ return ioPortDevice.DigitalInputPorts[dc.PortNumber];
- }
+ }
- #endregion
+ #endregion
- #region Bridge Linking
+ #region Bridge Linking
- public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
- {
- var joinMap = new IDigitalInputJoinMap(joinStart);
+ public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
+ {
+ var joinMap = new IDigitalInputJoinMap(joinStart);
- var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
+ var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
- if (!string.IsNullOrEmpty(joinMapSerialized))
- joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
+ if (!string.IsNullOrEmpty(joinMapSerialized))
+ joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
- if (bridge != null)
- {
- bridge.AddJoinMap(Key, joinMap);
- }
- else
- {
- Debug.LogMessage(LogEventLevel.Information, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
- }
+ if (bridge != null)
+ {
+ bridge.AddJoinMap(Key, joinMap);
+ }
+ else
+ {
+ Debug.LogMessage(LogEventLevel.Information, this, "Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
+ }
- try
- {
- Debug.LogMessage(LogEventLevel.Debug, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
+ try
+ {
+ Debug.LogMessage(LogEventLevel.Debug, this, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
- // Link feedback for input state
- InputStateFeedback.LinkInputSig(trilist.BooleanInput[joinMap.InputState.JoinNumber]);
- }
- catch (Exception e)
- {
- Debug.LogMessage(LogEventLevel.Debug, this, "Unable to link device '{0}'. Input is null", Key);
- Debug.LogMessage(LogEventLevel.Debug, this, "Error: {0}", e);
- }
+ // Link feedback for input state
+ InputStateFeedback.LinkInputSig(trilist.BooleanInput[joinMap.InputState.JoinNumber]);
+ }
+ catch (Exception e)
+ {
+ Debug.LogMessage(LogEventLevel.Debug, this, "Unable to link device '{0}'. Input is null", Key);
+ Debug.LogMessage(LogEventLevel.Debug, this, "Error: {0}", e);
}
+ }
- #endregion
+ #endregion
- #region Factory
+ #region Factory
- public class GenericDigitalInputDeviceFactory : EssentialsDeviceFactory
+ public class GenericDigitalInputDeviceFactory : EssentialsDeviceFactory
+ {
+ public GenericDigitalInputDeviceFactory()
{
- public GenericDigitalInputDeviceFactory()
- {
- TypeNames = new List() { "digitalinput" };
- }
+ TypeNames = new List() { "digitalinput" };
+ }
- public override EssentialsDevice BuildDevice(DeviceConfig dc)
- {
- Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Digital Input Device");
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+ Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new Generic Digital Input Device");
- var props = JsonConvert.DeserializeObject