Compare commits

..

126 Commits

Author SHA1 Message Date
Neil Dorin
258699fbcd fix: Enhance AppUrl change logging
Updated logging to include the new AppUrl value when it changes. This provides better context in the logs, making it easier to track the specific URL that was set.
2025-09-18 18:23:12 -06:00
Neil Dorin
738504e9fc fix: Add error handling for network parameter retrieval
Introduced a try-catch block to handle exceptions when fetching the Crestron Ethernet adapter's ID, subnet mask, and IP address. Added logging for cases where the processor lacks a CS LAN. Also included a new using directive for Serilog.Events.
2025-09-18 14:48:21 -06:00
erikdred
cae1bbd6e6 Merge pull request #1332 from PepperDash/feature/add-hide-property-to-room-combine-scenario
feat: Add HideInUi property to room combiner classes
2025-09-17 18:38:21 -04:00
Neil Dorin
dea4407e3e Update src/PepperDash.Essentials.Core/Room/Combining/IEssentialsRoomCombiner.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-17 16:36:33 -06:00
Neil Dorin
ab08a546f7 feat: Add HideInUi property to room combiner classes
- Introduced `HideInUi` property in `EssentialsRoomCombinerPropertiesConfig` to control UI visibility.
- Added `HideInUi` interface property in `IEssentialsRoomCombiner`.
- Implemented `HideInUi` in `RoomCombinationScenario`, along with new `Key` and `Name` properties for improved data representation.
2025-09-17 15:25:23 -06:00
Neil Dorin
ef98d47792 Merge pull request #1331 from PepperDash/dev-list-fix 2025-09-17 08:36:04 -06:00
Andrew Welker
c05976ee60 fix: modify formatting and sorting for devfb response 2025-09-17 09:28:04 -05:00
Andrew Welker
4ca1031bef docs: fix CS1587 errors 2025-09-17 08:52:44 -05:00
Andrew Welker
6d61c4525e fix: use ConsoleCommandResponse for device feedbacks 2025-09-17 08:52:29 -05:00
Andrew Welker
3db274ace5 fix: add line endings for devlist console command 2025-09-17 08:51:45 -05:00
Neil Dorin
f0f708294c Merge pull request #1329 from PepperDash/devlist-fix
fix: print devlist output using ConsoleCommandResponse
2025-09-10 09:58:13 -06:00
Andrew Welker
a00d186c62 fix: print devlist output using ConsoleCommandResponse 2025-09-10 10:45:55 -05:00
Neil Dorin
51da668dfd Merge pull request #1327 from PepperDash/cs-lan-mc-panel
fix: add config property for devices on CS LAN
2025-09-05 16:20:42 -06:00
Andrew Welker
d2b7400039 fix: INvxNetworkPortInformation inherits from IKeyed 2025-09-05 15:55:31 -05:00
Andrew Welker
2424838b7f chore: remove unused using
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-09-02 12:56:14 -05:00
Andrew Welker
9556edc064 fix: add config property for devices on CS LAN 2025-09-02 12:54:51 -05:00
Sumanth Rayancha
f9088691fd Merge pull request #1322 from PepperDash/release
Release
2025-08-26 10:16:18 -04:00
Andrew Welker
e40b6a8b4c Merge pull request #1320 from PepperDash/feature/extract-html-assets
feat: add html assets extraction from zip files in ControlSystem
2025-08-26 09:58:02 -04:00
Erik Meyer
c3b39a87da fix: enhance zip extraction to prevent directory traversal attacks 2025-08-22 15:15:02 -04:00
erikdred
06dc0e947e fix: check for null when getting directory
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-22 09:12:20 -04:00
aknous
147997f460 Merge pull request #1321 from PepperDash/IBasicVideoMuteWithFeedbackMessenger
Adds IBasicVideoMuteWithFeedbackMessenger
2025-08-21 14:26:10 -04:00
aknous
49abec5eea Update src/PepperDash.Essentials.MobileControl.Messengers/Messengers/CameraBaseMessenger.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-21 13:23:43 -04:00
aknous
6830efe42a fix: fixes CameraBaseMessenger hold timer for PTZ controls, adds storePreset messenger 2025-08-19 18:34:16 -04:00
Neil Dorin
d013068a0c Update src/PepperDash.Essentials/ControlSystem.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-19 14:54:11 -06:00
Neil Dorin
52916d29f4 Update src/PepperDash.Essentials/ControlSystem.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-19 14:53:06 -06:00
Erik Meyer
19e8489166 feat: add html assets extraction from zip files in ControlSystem 2025-08-19 15:48:43 -04:00
Neil Dorin
fe33443b25 fix: Update IP handling in MobileControlTouchpanelController
Updates logic to handle setting the URL sent to the CH5 wrapper app to use the CS LAN IP based on the actual IpInformationChange event on the panel itself.

- Added `._PepperDash.Essentials.4Series.sln` to .gitignore.
- Introduced new using directives for Regex and Crestron libraries.
- Added `csIpAddress` and `csSubnetMask` fields to store device IP info.
- Modified constructor to retrieve and assign current IP and subnet mask.
- Updated `Panel.IpInformationChange` event handler for logging and URL setting.
- Created `GetUrlWithCorrectIp` method to determine the correct URL based on IP.
- Refactored `SetAppUrl` to utilize the new URL method.
- Commented out old IP determination logic in `MobileControlWebsocketServer.cs` as it was moved to the touchpanel controller.
2025-08-19 13:28:45 -06:00
aknous
8cf195b262 feat: adds IBasicVideoMuteWithFeedbackMessenger 2025-08-19 11:37:39 -04:00
Neil Dorin
40406b797d Merge pull request #1314 from PepperDash/streaming-device-properties 2025-08-15 11:52:20 -06:00
Andrew Welker
65bc408ebf fix: add StreamUrl to baseStreamingDeviceProperties 2025-08-15 12:41:21 -05:00
Neil Dorin
9d49fb8357 Merge pull request #1313 from PepperDash/temp-to-dev
Temp to dev
2025-08-15 09:34:41 -06:00
Neil Dorin
fb7797dac7 Merge pull request #1312 from PepperDash/comm-bridge-add 2025-08-15 09:02:23 -06:00
Andrew Welker
574f5f6dc9 chore: remove unused using directives in CommFactory.cs 2025-08-15 09:51:17 -05:00
Andrew Welker
e49c69a12f feat: add CommBridge class and enhance EssentialsBridgeableDevice with new constructors 2025-08-15 09:48:30 -05:00
Sumanth Rayancha
7889cba196 Merge pull request #1307 from PepperDash/feature/assets-folder
feat: add LoadAssets method to manage asset loading and configuration…
2025-08-13 12:08:14 -04:00
Nick Genovese
033aa1f3dd feat: enhance asset extraction and configuration file handling in ControlSystem 2025-08-12 12:17:58 -04:00
Neil Dorin
9b6c2d80ea Merge pull request #1308 from PepperDash/current-sources 2025-08-11 22:53:11 -06:00
Andrew Welker
a0fc731701 chore: apply copilot suggestions
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-08-11 17:55:02 -05:00
Andrew Welker
f2d0dca7b8 fix: make appdebug case-insensitive
when commands like `appdebug verbose` are used rather than `appdebug 2`, the command would fail because Verbose != verbose. The enum conversion is now case-insensitive.
2025-08-11 17:50:50 -05:00
Andrew Welker
ab4e85d081 fix: use different methods for extensions
The logging extension methods now use the appropriate methods from
the debug class. Previously some messages were not getting handled correctly, and it was causing issues with log statements.
2025-08-11 17:48:46 -05:00
Andrew Welker
47017da527 fix: use correct property names 2025-08-11 17:47:14 -05:00
Andrew Welker
4f0d464ba4 Merge pull request #1306 from PepperDash/fix/remove-unsued-method-in-cs
Fix/remove unsued method in cs
2025-08-11 15:30:04 -05:00
Nick Genovese
0107422507 refactor: remove unused assembly resolution logic from ControlSystem 2025-08-11 16:24:44 -04:00
Nick Genovese
1a366790e7 feat: add LoadAssets method to manage asset loading and configuration file cleanup 2025-08-11 16:23:31 -04:00
Andrew Welker
97448f4f0f Merge branch 'main' into current-sources 2025-08-06 09:01:40 -05:00
Andrew Welker
cf3ece4237 fix: use cr-lf for line endings 2025-08-06 09:00:45 -05:00
Andrew Welker
bb4b2f88b6 Merge pull request #1304 from PepperDash/temp-to-dev
Temp to dev
2025-08-05 16:39:38 -05:00
aknous
808e8042a7 Merge pull request #1305 from PepperDash/default-debug-levels
fix: set default debug levels if not found
2025-08-04 14:47:31 -04:00
Andrew Welker
0bc4388bfd Merge branch 'default-debug-levels' into current-sources 2025-08-04 13:31:26 -05:00
Andrew Welker
dbc132c0da fix: set default debug levels if not found 2025-08-04 13:31:17 -05:00
Andrew Welker
5bb0ab2626 fix: base config properties for use with streaming devices 2025-08-01 21:17:35 -05:00
Andrew Welker
27bf36c58c fix: modify how current sources dictionary gets updated 2025-08-01 09:22:31 -05:00
Andrew Welker
ce886aea63 chore: update local build version 2025-08-01 09:22:31 -05:00
Andrew Welker
ef920bf54c Merge branch 'main' into current-sources 2025-07-31 13:27:43 -05:00
Andrew Welker
88466818ce Merge pull request #1303 from PepperDash/debug-fixes
fix: use correct overload for logging at levels
2025-07-31 13:03:14 -05:00
Andrew Welker
0871a902e1 fix: use correct overload for logging at levels
Some overloads that had the first argument as an Exception were calling the _logger.Write method with a null where the message template should have been, causing messages logged with that overload to be swallowed and not logged.
2025-07-31 12:50:41 -05:00
Andrew Welker
a031424752 fix: add destination & source keys to routelist 2025-07-30 11:20:54 -05:00
Andrew Welker
fd1ba345aa fix: remove StringEnumConverter 2025-07-29 23:01:13 -05:00
Andrew Welker
e03874a7a9 fix: add messenger and event to ICurrentSources 2025-07-29 22:26:07 -05:00
aknous
2efab4f196 Merge pull request #1301 from PepperDash/mc-tp-ip-fix
fix: only adjust IP if processor is a CS processor
2025-07-28 12:57:24 -04:00
Andrew Welker
a41aba1904 Merge pull request #1300 from PepperDash/temp-to-dev
Temp to dev
2025-07-28 11:54:11 -05:00
Andrew Welker
d0ca6721f5 fix: only adjust IP if processor is a CS processor 2025-07-28 11:48:00 -05:00
Andrew Welker
c732eb48f2 Merge pull request #1299 from PepperDash/factory-updates
Multiple Updates
2025-07-25 10:38:15 -05:00
Andrew Welker
efe70208d3 fix: check for null assembly name 2025-07-25 10:32:43 -05:00
Andrew Welker
615f640ebb fix: use continue instead of return
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-25 10:27:50 -05:00
Andrew Welker
ee6f9416a3 chore: remove unused configSnippet 2025-07-25 10:24:32 -05:00
Andrew Welker
4fc6ecbd0b style: switch to auto property for attributes 2025-07-25 09:56:39 -05:00
Andrew Welker
58bcc3315d fix: add changes from code review 2025-07-25 09:51:04 -05:00
Andrew Welker
08cc84a8e8 fix: apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-25 09:28:53 -05:00
Andrew Welker
226014fee0 fix: apply suggestions from code review
- remove commented out debug statements
- null check for description attribute

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-25 09:27:33 -05:00
Andrew Welker
dc7f99e176 fix: mark FeedbackBase default constructor as obsolete
There are situations now where feedbacks in the feedback collection
can be used to update things on UIs. If the feedback doesn't have a key, it can't
be used for this purpose.
2025-07-25 09:18:22 -05:00
Andrew Welker
f0af9f8d19 fix: mark IHasMultipleDisplays and associated enum as obsolete
Fixes #1219
2025-07-25 09:14:45 -05:00
Andrew Welker
31143f56df fix: modify how exceptions are printed to reduce noise
When an exception occurs during the connect method,
only the exception message will be printed at the Error log level.
The entire stack trace will be printed when at the Verbose level.

fixes #1273
2025-07-25 09:13:42 -05:00
Andrew Welker
43989b9588 chore: move interfaces to their own files 2025-07-25 09:12:09 -05:00
Andrew Welker
8db559f197 feat: factory updates & refactoring
This commit introduces significant updates to the device factory system, enhancing the way devices are created and managed within the PepperDash Essentials framework.
The changes include:
- New attributes for device configuration and description.
- Refactoring of the device manager and essentials device classes to support new factory methods.
- modified factory classes for essentials devices, plugin development devices, and processor extension devices.
- The device factory interface has been updated to include a factory method for creating devices.
- Added a wrapper for the device factory to streamline device creation.
- Updated plugin loader to accommodate the new device factory structure.

Fixes #1065
Fixed #1277
2025-07-25 09:05:40 -05:00
Andrew Welker
86f20da116 Merge pull request #1291 from PepperDash/copilot/fix-1290
docs: Add comprehensive XML documentation to all public members
2025-07-25 08:02:37 -05:00
Andrew Welker
0674dbda37 Merge branch 'main' into copilot/fix-1290 2025-07-25 07:48:49 -05:00
Andrew Welker
592607f3c8 Merge pull request #1296 from PepperDash/feature/add-IHasCamerasMessenger 2025-07-24 18:53:05 -05:00
Neil Dorin
ea0a779f8b Merge branch 'feature/add-IHasCamerasMessenger' of https://github.com/PepperDash/Essentials into feature/add-IHasCamerasMessenger 2025-07-24 16:40:06 -06:00
Neil Dorin
86e4d2f7fb feat: Update SendFullStatus to target specific clients
Modified the `SendFullStatus` method to accept a `string clientId` parameter, allowing it to send status messages to specific clients. Updated the action for `"/fullStatus"` to pass the client ID and adjusted the `PostStatusMessage` call accordingly.
2025-07-24 16:39:28 -06:00
Neil Dorin
0069233e13 Update src/PepperDash.Essentials.Devices.Common/Cameras/CameraControl.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-24 16:16:05 -06:00
Neil Dorin
4048efb07e Merge branch 'main' into feature/add-IHasCamerasMessenger 2025-07-24 16:03:41 -06:00
Andrew Welker
b12cdbc75c docs: apply suggestions from copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-23 09:08:10 -05:00
Neil Dorin
b47f1d6b77 Merge pull request #1293 from PepperDash/to-dev 2025-07-23 07:53:44 -06:00
copilot-swe-agent[bot]
80da4ad98f docs: fix duplicate and malformed XML documentation tags
Co-authored-by: andrew-welker <1765622+andrew-welker@users.noreply.github.com>
2025-07-22 17:40:17 +00:00
Andrew Welker
b283ed34b4 docs: remove duplicate
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 12:08:28 -05:00
Andrew Welker
899f13eadb docs: remove duplicate
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 12:08:10 -05:00
Andrew Welker
fc1e29565e docs: remove duplicate
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 12:03:33 -05:00
Andrew Welker
f9a74567d2 docs: remove duplicates
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 12:03:18 -05:00
Andrew Welker
53b1e5d142 docs: remove duplicates
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 12:03:03 -05:00
Andrew Welker
78e9ea8070 docs: duplicate tags
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 12:02:38 -05:00
Andrew Welker
df201558a5 docs: update
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 12:02:24 -05:00
Andrew Welker
130c874684 docs: fix documentation
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:37:08 -05:00
Andrew Welker
aee40ffe14 docs: fix duplicate XML tags
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:36:43 -05:00
Andrew Welker
3ffad13abf docs: remove duplicate
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:30:04 -05:00
Andrew Welker
5ee7aaa991 docs: revert to old comment
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:29:25 -05:00
Andrew Welker
4fa8433e73 docs: change wording
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:19:10 -05:00
Andrew Welker
5fe99518a0 docs: update formatting
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:18:50 -05:00
Andrew Welker
5a2a2129e6 docs: remove duplicate
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:13:33 -05:00
Andrew Welker
4fbfda62d6 docs: remove duplicate
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:13:21 -05:00
Andrew Welker
b8ab54cbe0 docs: remove duplicate
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:12:55 -05:00
Andrew Welker
f6f1619bc2 docs: remove duplicate
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:12:38 -05:00
Andrew Welker
41fd4d6adc docs: revert to original documentation
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:12:25 -05:00
Andrew Welker
5b73f8fbd2 docs: remove duplicate docs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:12:03 -05:00
Andrew Welker
c70a8edc24 docs: remove duplicate documentation
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 11:11:33 -05:00
copilot-swe-agent[bot]
7987eb8f9b docs: complete XML documentation for all projects with inheritdoc tags
Co-authored-by: andrew-welker <1765622+andrew-welker@users.noreply.github.com>
2025-07-22 15:53:01 +00:00
copilot-swe-agent[bot]
260677a37f docs: add XML documentation to PepperDash.Core project
Co-authored-by: andrew-welker <1765622+andrew-welker@users.noreply.github.com>
2025-07-22 15:48:23 +00:00
copilot-swe-agent[bot]
eeb0e84dc7 docs: enable XML documentation generation and add initial documentation
Co-authored-by: andrew-welker <1765622+andrew-welker@users.noreply.github.com>
2025-07-22 15:44:52 +00:00
copilot-swe-agent[bot]
d282487da6 Initial plan 2025-07-22 15:35:41 +00:00
Neil Dorin
f8455d4110 feat: Refactor IHasCamerasMessenger constructor parameters
Updated the constructor of `IHasCamerasMessenger` to reorder parameters, placing `IHasCameras cameraController` last. Added logic in `MobileControlSystemController.cs` to instantiate and add `IHasCamerasMessenger` for devices implementing the `IHasCameras` interface.
2025-07-17 11:14:32 -06:00
Neil Dorin
f006ed0076 feat: Add camera control interfaces and messenger classes
This commit introduces new interfaces in `CameraControl.cs` for various camera functionalities, including muting, panning, tilting, zooming, and auto modes. The `IHasCameras` interface is expanded to manage camera lists and selections, with the addition of `CameraSelectedEventArgs` for event handling.

In `CameraBaseMessenger.cs`, a new `IHasCamerasMessenger` class is created to facilitate communication for devices implementing the `IHasCameras` interface, along with the `IHasCamerasStateMessage` class to represent the state of camera devices. These changes enhance the overall camera control capabilities and improve interaction management within the application.
2025-07-16 16:54:57 -06:00
Andrew Welker
fda4a5a816 Merge pull request #1282 from PepperDash/main
Update Dev
2025-07-04 10:45:35 -05:00
Andrew Welker
9f70e3c721 Merge pull request #1276 from PepperDash/temp-to-dev
Temp to dev
2025-06-26 14:16:36 -04:00
Andrew Welker
ec6aeb17f6 Merge pull request #1271 from PepperDash/temp-to-dev
Temp to dev
2025-05-19 16:52:45 -05:00
Neil Dorin
91dc655103 Merge pull request #1269 from PepperDash/camera-preset-fix 2025-05-14 09:42:11 -06:00
Andrew Welker
bf31fb10eb fix: use correct join for preset select 2025-05-14 10:39:42 -05:00
Neil Dorin
5e21bad596 Merge pull request #1266 from PepperDash/temp-to-dev 2025-05-02 12:23:51 -06:00
Neil Dorin
2368f0c8cc Merge pull request #1262 from PepperDash/temp-to-dev 2025-04-28 11:37:01 -06:00
Neil Dorin
be58a0bc29 Merge pull request #1260 from PepperDash/temp-to-dev 2025-04-24 09:32:32 -06:00
Neil Dorin
8406f69e0d Merge pull request #1257 from PepperDash/temp-to-dev 2025-04-18 11:46:18 -06:00
Andrew Welker
116d83394a Merge pull request #1255 from PepperDash/temp-to-dev
Temp to dev
2025-04-14 11:15:27 -05:00
Neil Dorin
9b8e452eb4 Merge pull request #1251 from PepperDash/temp-to-dev 2025-04-11 14:00:02 -06:00
Neil Dorin
c9d86bd5dd Merge pull request #1248 from PepperDash/temp-to-dev 2025-04-11 11:55:35 -06:00
Neil Dorin
b2b257020f Merge pull request #1246 from PepperDash/temp-to-dev 2025-04-08 13:48:10 -06:00
Neil Dorin
6f58e18d14 Merge pull request #1244 from PepperDash/temp-to-dev
Temp to dev
2025-04-04 10:30:10 -06:00
Neil Dorin
60fc0298ec Merge pull request #1242 from PepperDash/temp-to-dev
Temp to dev
2025-04-02 11:14:45 -06:00
534 changed files with 11897 additions and 4483 deletions

1
.gitignore vendored
View File

@@ -395,3 +395,4 @@ essentials-framework/Essentials Interfaces/PepperDash_Essentials_Interfaces/Pepp
_site/ _site/
api/ api/
*.DS_Store *.DS_Store
/._PepperDash.Essentials.4Series.sln

View File

@@ -0,0 +1,282 @@
# Crestron Library Usage Analysis - PepperDash Essentials
This document provides a comprehensive analysis of Crestron classes and interfaces used throughout the PepperDash Essentials framework, organized by namespace and library component.
## Executive Summary
The PepperDash Essentials framework extensively leverages Crestron SDK components across 100+ files, providing abstractions for:
- Control system hardware (processors, touchpanels, IO devices)
- Communication interfaces (Serial, TCP/IP, SSH, CEC, IR)
- Device management and routing
- User interface components and smart objects
- System monitoring and diagnostics
## 1. Core Crestron Libraries
### 1.1 Crestron.SimplSharp
**Primary Usage**: Foundational framework components, collections, and basic types.
**Key Files**:
- Multiple files across all projects use `Crestron.SimplSharp` namespaces
- Provides basic C# runtime support for Crestron processors
### 1.2 Crestron.SimplSharpPro
**Primary Usage**: Main hardware abstraction layer for Crestron devices.
**Key Classes Used**:
#### CrestronControlSystem
- **File**: `/src/PepperDash.Essentials/ControlSystem.cs`
- **Usage**: Base class for the main control system implementation
- **Implementation**: `public class ControlSystem : CrestronControlSystem, ILoadConfig`
#### Device (Base Class)
- **Files**: 50+ files inherit from or use this class
- **Key Implementations**:
- `/src/PepperDash.Core/Device.cs` - Core device abstraction
- `/src/PepperDash.Essentials.Core/Devices/EssentialsDevice.cs` - Extended device base
- `/src/PepperDash.Essentials.Core/Room/Room.cs` - Room device implementation
- `/src/PepperDash.Essentials.Core/Devices/CrestronProcessor.cs` - Processor device wrapper
#### BasicTriList
- **Files**: 30+ files use this class extensively
- **Primary Usage**: Touchpanel communication and SIMPL bridging
- **Key Files**:
- `/src/PepperDash.Essentials.Core/Touchpanels/TriListExtensions.cs` - Extension methods for signal handling
- `/src/PepperDash.Essentials.Core/Devices/EssentialsBridgeableDevice.cs` - Bridge interface
- `/src/PepperDash.Essentials.Core/Touchpanels/ModalDialog.cs` - UI dialog implementation
#### BasicTriListWithSmartObject
- **Files**: Multiple touchpanel and UI files
- **Usage**: Enhanced touchpanel support with smart object integration
- **Key Files**:
- `/src/PepperDash.Essentials.Core/Touchpanels/Interfaces.cs` - Interface definitions
- `/src/PepperDash.Essentials.Core/SmartObjects/SubpageReferenceList/SubpageReferenceList.cs`
## 2. Communication Hardware
### 2.1 Serial Communication (ComPort)
**Primary Class**: `ComPort`
**Key Files**:
- `/src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs`
- `/src/PepperDash.Essentials.Core/Comm and IR/CommFactory.cs`
**Usage Pattern**:
```csharp
public class ComPortController : Device, IBasicCommunicationWithStreamDebugging
public static ComPort GetComPort(EssentialsControlPropertiesConfig config)
```
**Interface Support**: `IComPorts` - Used for devices that provide multiple COM ports
### 2.2 IR Communication (IROutputPort)
**Primary Class**: `IROutputPort`
**Key Files**:
- `/src/PepperDash.Essentials.Core/Devices/IrOutputPortController.cs`
- `/src/PepperDash.Essentials.Core/Devices/GenericIRController.cs`
- `/src/PepperDash.Essentials.Core/Comm and IR/IRPortHelper.cs`
**Usage Pattern**:
```csharp
public class IrOutputPortController : Device
IROutputPort IrPort;
public IrOutputPortController(string key, IROutputPort port, string irDriverFilepath)
```
### 2.3 CEC Communication (ICec)
**Primary Interface**: `ICec`
**Key Files**:
- `/src/PepperDash.Essentials.Core/Comm and IR/CecPortController.cs`
- `/src/PepperDash.Essentials.Core/Comm and IR/CommFactory.cs`
**Usage Pattern**:
```csharp
public class CecPortController : Device, IBasicCommunicationWithStreamDebugging
public static ICec GetCecPort(ControlPropertiesConfig config)
```
## 3. Input/Output Hardware
### 3.1 Digital Input
**Primary Interface**: `IDigitalInput`
**Key Files**:
- `/src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs`
- `/src/PepperDash.Essentials.Core/Microphone Privacy/MicrophonePrivacyController.cs`
**Usage Pattern**:
```csharp
public List<IDigitalInput> Inputs { get; private set; }
void AddInput(IDigitalInput input)
```
### 3.2 Versiport Support
**Key Files**:
- `/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs`
- `/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportAnalogInputDevice.cs`
- `/src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportOutputDevice.cs`
**Usage**: Provides flexible I/O port configuration for various signal types
## 4. Touchpanel Hardware
### 4.1 MPC3 Touchpanel
**Primary Class**: `MPC3Basic`
**Key File**: `/src/PepperDash.Essentials.Core/Touchpanels/Mpc3Touchpanel.cs`
**Usage Pattern**:
```csharp
public class Mpc3TouchpanelController : Device
readonly MPC3Basic _touchpanel;
_touchpanel = processor.ControllerTouchScreenSlotDevice as MPC3Basic;
```
### 4.2 TSW Series Support
**Evidence**: References found in messenger files and mobile control components
**Usage**: Integrated through mobile control messaging system for TSW touchpanel features
## 5. Timer and Threading
### 5.1 CTimer
**Primary Class**: `CTimer`
**Key File**: `/src/PepperDash.Core/PasswordManagement/PasswordManager.cs`
**Usage Pattern**:
```csharp
Debug.Console(1, string.Format("PasswordManager.UpdatePassword: CTimer Started"));
Debug.Console(1, string.Format("PasswordManager.UpdatePassword: CTimer Reset"));
```
## 6. Networking and Communication
### 6.1 Ethernet Communication
**Libraries Used**:
- `Crestron.SimplSharpPro.EthernetCommunication`
- `Crestron.SimplSharp.Net.Utilities.EthernetHelper`
**Key Files**:
- `/src/PepperDash.Core/Comm/GenericTcpIpClient.cs`
- `/src/PepperDash.Core/Comm/GenericTcpIpServer.cs`
- `/src/PepperDash.Core/Comm/GenericSecureTcpIpClient.cs`
- `/src/PepperDash.Core/Comm/GenericSshClient.cs`
- `/src/PepperDash.Core/Comm/GenericUdpServer.cs`
**Usage Pattern**:
```csharp
public class GenericTcpIpClient : Device, ISocketStatusWithStreamDebugging, IAutoReconnect
public class GenericSecureTcpIpClient : Device, ISocketStatusWithStreamDebugging, IAutoReconnect
```
## 7. Device Management Libraries
### 7.1 DeviceSupport
**Library**: `Crestron.SimplSharpPro.DeviceSupport`
**Usage**: Core device support infrastructure used throughout the framework
### 7.2 DM (DigitalMedia)
**Library**: `Crestron.SimplSharpPro.DM`
**Usage**: Digital media routing and switching support
**Evidence**: Found in routing configuration and DM output card references
## 8. User Interface Libraries
### 8.1 UI Components
**Library**: `Crestron.SimplSharpPro.UI`
**Usage**: User interface elements and touchpanel controls
### 8.2 Smart Objects
**Key Files**:
- `/src/PepperDash.Essentials.Core/SmartObjects/SmartObjectDynamicList.cs`
- `/src/PepperDash.Essentials.Core/SmartObjects/SubpageReferenceList/SubpageReferenceList.cs`
**Usage**: Advanced UI components with dynamic content
## 9. System Monitoring and Diagnostics
### 9.1 Diagnostics
**Library**: `Crestron.SimplSharpPro.Diagnostics`
**Usage**: System health monitoring and performance tracking
### 9.2 System Information
**Key Files**:
- `/src/PepperDash.Essentials.Core/Monitoring/SystemMonitorController.cs`
**Usage**: Provides system status, Ethernet information, and program details
## 10. Integration Patterns
### 10.1 SIMPL Bridging
**Pattern**: Extensive use of `BasicTriList` for SIMPL integration
**Files**: Bridge classes throughout the framework implement `LinkToApi` methods:
```csharp
public abstract void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge);
```
### 10.2 Device Factory Pattern
**Implementation**: Factory classes create hardware-specific implementations
**Example**: `CommFactory.cs` provides communication device creation
### 10.3 Extension Methods
**Pattern**: Extensive use of extension methods for Crestron classes
**Example**: `TriListExtensions.cs` adds 30+ extension methods to `BasicTriList`
## 11. Signal Processing
### 11.1 Signal Types
**Bool Signals**: Digital control and feedback
**UShort Signals**: Analog values and numeric data
**String Signals**: Text and configuration data
**Implementation**: Comprehensive signal handling in `TriListExtensions.cs`
## 12. Error Handling and Logging
**Pattern**: Consistent use of Crestron's Debug logging throughout
**Examples**:
```csharp
Debug.LogMessage(LogEventLevel.Information, "Device {0} is not a valid device", dc.PortDeviceKey);
Debug.LogMessage(LogEventLevel.Debug, "Error Waking Panel. Maybe testing with Xpanel?");
```
## 13. Threading and Synchronization
**Components**:
- CTimer for time-based operations
- Thread-safe collections and patterns
- Event-driven programming models
## Conclusion
The PepperDash Essentials framework demonstrates sophisticated integration with the Crestron ecosystem, leveraging:
- **Core Infrastructure**: CrestronControlSystem, Device base classes
- **Communication**: COM, IR, CEC, TCP/IP, SSH protocols
- **Hardware Abstraction**: Touchpanels, I/O devices, processors
- **User Interface**: Smart objects, signal processing, SIMPL bridging
- **System Services**: Monitoring, diagnostics, device management
This analysis shows that Essentials serves as a comprehensive middleware layer, abstracting Crestron hardware complexities while providing modern software development patterns and practices.
---
*Generated: [Current Date]*
*Framework Version: PepperDash Essentials (Based on codebase analysis)*

View File

@@ -1,6 +1,6 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<Version>2.4.0-local</Version> <Version>2.15.1-local</Version>
<InformationalVersion>$(Version)</InformationalVersion> <InformationalVersion>$(Version)</InformationalVersion>
<Authors>PepperDash Technology</Authors> <Authors>PepperDash Technology</Authors>
<Company>PepperDash Technology</Company> <Company>PepperDash Technology</Company>

View File

@@ -84,10 +84,9 @@ namespace PepperDash.Core
port.TextReceived += Port_TextReceivedStringDelimiter; port.TextReceived += Port_TextReceivedStringDelimiter;
} }
/// <summary> /// <summary>
/// Disconnects this gather from the Port's TextReceived event. This will not fire LineReceived /// Stop method
/// after the this call. /// </summary>
/// </summary>
public void Stop() public void Stop()
{ {
Port.TextReceived -= Port_TextReceived; Port.TextReceived -= Port_TextReceived;

View File

@@ -23,7 +23,7 @@ namespace PepperDash.Core
private CTimer DebugExpiryPeriod; private CTimer DebugExpiryPeriod;
/// <summary> /// <summary>
/// The current debug setting /// Gets or sets the DebugSetting
/// </summary> /// </summary>
public eStreamDebuggingSetting DebugSetting { get; private set; } public eStreamDebuggingSetting DebugSetting { get; private set; }
@@ -42,7 +42,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Indicates that receive stream debugging is enabled /// Gets or sets the RxStreamDebuggingIsEnabled
/// </summary> /// </summary>
public bool RxStreamDebuggingIsEnabled{ get; private set; } public bool RxStreamDebuggingIsEnabled{ get; private set; }
@@ -65,6 +65,9 @@ namespace PepperDash.Core
/// Sets the debugging setting and if not setting to off, assumes the default of 30 mintues /// Sets the debugging setting and if not setting to off, assumes the default of 30 mintues
/// </summary> /// </summary>
/// <param name="setting"></param> /// <param name="setting"></param>
/// <summary>
/// SetDebuggingWithDefaultTimeout method
/// </summary>
public void SetDebuggingWithDefaultTimeout(eStreamDebuggingSetting setting) public void SetDebuggingWithDefaultTimeout(eStreamDebuggingSetting setting)
{ {
if (setting == eStreamDebuggingSetting.Off) if (setting == eStreamDebuggingSetting.Off)
@@ -81,6 +84,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="setting"></param> /// <param name="setting"></param>
/// <param name="minutes"></param> /// <param name="minutes"></param>
/// <summary>
/// SetDebuggingWithSpecificTimeout method
/// </summary>
public void SetDebuggingWithSpecificTimeout(eStreamDebuggingSetting setting, uint minutes) public void SetDebuggingWithSpecificTimeout(eStreamDebuggingSetting setting, uint minutes)
{ {
if (setting == eStreamDebuggingSetting.Off) if (setting == eStreamDebuggingSetting.Off)
@@ -135,6 +141,9 @@ namespace PepperDash.Core
/// The available settings for stream debugging /// The available settings for stream debugging
/// </summary> /// </summary>
[Flags] [Flags]
/// <summary>
/// Enumeration of eStreamDebuggingSetting values
/// </summary>
public enum eStreamDebuggingSetting public enum eStreamDebuggingSetting
{ {
/// <summary> /// <summary>

View File

@@ -6,7 +6,7 @@ using Newtonsoft.Json.Converters;
namespace PepperDash.Core namespace PepperDash.Core
{ {
/// <summary> /// <summary>
/// Config properties that indicate how to communicate with a device for control /// Represents a ControlPropertiesConfig
/// </summary> /// </summary>
public class ControlPropertiesConfig public class ControlPropertiesConfig
{ {

View File

@@ -29,9 +29,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public class GenericSocketStatusChageEventArgs : EventArgs public class GenericSocketStatusChageEventArgs : EventArgs
{ {
/// <summary> /// <summary>
/// /// Gets or sets the Client
/// </summary> /// </summary>
public ISocketStatus Client { get; private set; } public ISocketStatus Client { get; private set; }
/// <summary> /// <summary>
@@ -60,7 +60,7 @@ namespace PepperDash.Core
public class GenericTcpServerStateChangedEventArgs : EventArgs public class GenericTcpServerStateChangedEventArgs : EventArgs
{ {
/// <summary> /// <summary>
/// /// Gets or sets the State
/// </summary> /// </summary>
public ServerState State { get; private set; } public ServerState State { get; private set; }
@@ -154,7 +154,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// Gets or sets the Text
/// </summary> /// </summary>
public string Text { get; private set; } public string Text { get; private set; }

View File

@@ -79,7 +79,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Port on server /// Gets or sets the Port
/// </summary> /// </summary>
public int Port { get; set; } public int Port { get; set; }
@@ -149,7 +149,7 @@ namespace PepperDash.Core
public string ConnectionFailure { get { return ClientStatus.ToString(); } } public string ConnectionFailure { get { return ClientStatus.ToString(); } }
/// <summary> /// <summary>
/// bool to track if auto reconnect should be set on the socket /// Gets or sets the AutoReconnect
/// </summary> /// </summary>
public bool AutoReconnect { get; set; } public bool AutoReconnect { get; set; }
@@ -188,7 +188,7 @@ namespace PepperDash.Core
#region GenericSecureTcpIpClient properties #region GenericSecureTcpIpClient properties
/// <summary> /// <summary>
/// Bool to show whether the server requires a preshared key. This is used in the DynamicTCPServer class /// Gets or sets the SharedKeyRequired
/// </summary> /// </summary>
public bool SharedKeyRequired { get; set; } public bool SharedKeyRequired { get; set; }
@@ -207,7 +207,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// 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 /// Gets or sets the SharedKey
/// </summary> /// </summary>
public string SharedKey { get; set; } public string SharedKey { get; set; }
@@ -222,7 +222,7 @@ namespace PepperDash.Core
bool IsTryingToConnect; bool IsTryingToConnect;
/// <summary> /// <summary>
/// Bool showing if socket is ready for communication after shared key exchange /// Gets or sets the IsReadyForCommunication
/// </summary> /// </summary>
public bool IsReadyForCommunication { get; set; } public bool IsReadyForCommunication { get; set; }
@@ -342,7 +342,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Just to help S+ set the key /// Initialize method
/// </summary> /// </summary>
public void Initialize(string key) public void Initialize(string key)
{ {
@@ -421,6 +421,9 @@ namespace PepperDash.Core
/// Deactivate the client /// Deactivate the client
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// Deactivate method
/// </summary>
public override bool Deactivate() public override bool Deactivate()
{ {
if (_client != null) if (_client != null)
@@ -432,7 +435,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name. /// Connect method
/// </summary> /// </summary>
public void Connect() public void Connect()
{ {
@@ -563,7 +566,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// Disconnect method
/// </summary> /// </summary>
public void Disconnect() public void Disconnect()
{ {
@@ -586,7 +589,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Does the actual disconnect business /// DisconnectClient method
/// </summary> /// </summary>
public void DisconnectClient() public void DisconnectClient()
{ {
@@ -846,7 +849,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// General send method /// SendText method
/// </summary> /// </summary>
public void SendText(string text) public void SendText(string text)
{ {
@@ -875,7 +878,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// SendBytes method
/// </summary> /// </summary>
public void SendBytes(byte[] bytes) public void SendBytes(byte[] bytes)
{ {

View File

@@ -80,7 +80,7 @@ namespace PepperDash.Core
public string Hostname { get; set; } public string Hostname { get; set; }
/// <summary> /// <summary>
/// Port on server /// Gets or sets the Port
/// </summary> /// </summary>
public int Port { get; set; } public int Port { get; set; }
@@ -113,7 +113,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// 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 /// Gets or sets the SharedKey
/// </summary> /// </summary>
public string SharedKey { get; set; } public string SharedKey { get; set; }
@@ -123,7 +123,7 @@ namespace PepperDash.Core
private bool WaitingForSharedKeyResponse { get; set; } private bool WaitingForSharedKeyResponse { get; set; }
/// <summary> /// <summary>
/// Defaults to 2000 /// Gets or sets the BufferSize
/// </summary> /// </summary>
public int BufferSize { get; set; } public int BufferSize { get; set; }
@@ -336,7 +336,7 @@ namespace PepperDash.Core
#region Methods #region Methods
/// <summary> /// <summary>
/// Just to help S+ set the key /// Initialize method
/// </summary> /// </summary>
public void Initialize(string key) public void Initialize(string key)
{ {
@@ -395,7 +395,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name. /// Connect method
/// </summary> /// </summary>
public void Connect() public void Connect()
{ {
@@ -526,7 +526,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// Disconnect method
/// </summary> /// </summary>
public void Disconnect() public void Disconnect()
{ {
@@ -804,7 +804,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// General send method /// SendText method
/// </summary> /// </summary>
public void SendText(string text) public void SendText(string text)
{ {
@@ -833,7 +833,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// SendBytes method
/// </summary> /// </summary>
public void SendBytes(byte[] bytes) public void SendBytes(byte[] bytes)
{ {

View File

@@ -58,7 +58,7 @@ namespace PepperDash.Core
public ServerHasChokedCallbackDelegate ServerHasChoked { get; set; } public ServerHasChokedCallbackDelegate ServerHasChoked { get; set; }
/// <summary> /// <summary>
/// /// Delegate for ServerHasChokedCallbackDelegate
/// </summary> /// </summary>
public delegate void ServerHasChokedCallbackDelegate(); public delegate void ServerHasChokedCallbackDelegate();
@@ -104,7 +104,7 @@ namespace PepperDash.Core
int MonitorClientFailureCount; int MonitorClientFailureCount;
/// <summary> /// <summary>
/// 3 by default /// Gets or sets the MonitorClientMaxFailureCount
/// </summary> /// </summary>
public int MonitorClientMaxFailureCount { get; set; } public int MonitorClientMaxFailureCount { get; set; }
@@ -190,7 +190,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Port Server should listen on /// Gets or sets the Port
/// </summary> /// </summary>
public int Port { get; set; } public int Port { get; set; }
@@ -223,8 +223,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// 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. /// Gets or sets the SharedKey
/// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called
/// </summary> /// </summary>
public string SharedKey { get; set; } public string SharedKey { get; set; }
@@ -248,7 +247,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+ /// Gets or sets the HeartbeatRequiredIntervalMs
/// </summary> /// </summary>
public int HeartbeatRequiredIntervalMs { get; set; } public int HeartbeatRequiredIntervalMs { get; set; }
@@ -258,7 +257,7 @@ namespace PepperDash.Core
public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } } public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } }
/// <summary> /// <summary>
/// String to Match for heartbeat. If null or empty any string will reset heartbeat timer /// Gets or sets the HeartbeatStringToMatch
/// </summary> /// </summary>
public string HeartbeatStringToMatch { get; set; } public string HeartbeatStringToMatch { get; set; }
@@ -276,7 +275,7 @@ namespace PepperDash.Core
public List<uint> ConnectedClientsIndexes = new List<uint>(); public List<uint> ConnectedClientsIndexes = new List<uint>();
/// <summary> /// <summary>
/// Defaults to 2000 /// Gets or sets the BufferSize
/// </summary> /// </summary>
public int BufferSize { get; set; } public int BufferSize { get; set; }
@@ -339,7 +338,7 @@ namespace PepperDash.Core
#region Methods - Server Actions #region Methods - Server Actions
/// <summary> /// <summary>
/// Disconnects all clients and stops the server /// KillServer method
/// </summary> /// </summary>
public void KillServer() public void KillServer()
{ {
@@ -356,6 +355,9 @@ namespace PepperDash.Core
/// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+ /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key"></param>
/// <summary>
/// Initialize method
/// </summary>
public void Initialize(string key) public void Initialize(string key)
{ {
Key = key; Key = key;
@@ -395,7 +397,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Start listening on the specified port /// Listen method
/// </summary> /// </summary>
public void Listen() public void Listen()
{ {
@@ -453,7 +455,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Stop Listeneing /// StopListening method
/// </summary> /// </summary>
public void StopListening() public void StopListening()
{ {
@@ -478,6 +480,9 @@ namespace PepperDash.Core
/// Disconnects Client /// Disconnects Client
/// </summary> /// </summary>
/// <param name="client"></param> /// <param name="client"></param>
/// <summary>
/// DisconnectClient method
/// </summary>
public void DisconnectClient(uint client) public void DisconnectClient(uint client)
{ {
try try
@@ -491,7 +496,7 @@ namespace PepperDash.Core
} }
} }
/// <summary> /// <summary>
/// Disconnect All Clients /// DisconnectAllClientsForShutdown method
/// </summary> /// </summary>
public void DisconnectAllClientsForShutdown() public void DisconnectAllClientsForShutdown()
{ {
@@ -533,6 +538,9 @@ namespace PepperDash.Core
/// Broadcast text from server to all connected clients /// Broadcast text from server to all connected clients
/// </summary> /// </summary>
/// <param name="text"></param> /// <param name="text"></param>
/// <summary>
/// BroadcastText method
/// </summary>
public void BroadcastText(string text) public void BroadcastText(string text)
{ {
CCriticalSection CCBroadcast = new CCriticalSection(); CCriticalSection CCBroadcast = new CCriticalSection();
@@ -566,6 +574,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="text"></param> /// <param name="text"></param>
/// <param name="clientIndex"></param> /// <param name="clientIndex"></param>
/// <summary>
/// SendTextToClient method
/// </summary>
public void SendTextToClient(string text, uint clientIndex) public void SendTextToClient(string text, uint clientIndex)
{ {
try try
@@ -634,6 +645,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="clientIndex"></param> /// <param name="clientIndex"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetClientIPAddress method
/// </summary>
public string GetClientIPAddress(uint clientIndex) public string GetClientIPAddress(uint clientIndex)
{ {
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress Index: {0}", clientIndex); Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress Index: {0}", clientIndex);

View File

@@ -36,13 +36,13 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public event EventHandler<GenericSocketStatusChageEventArgs> ConnectionChange; public event EventHandler<GenericSocketStatusChageEventArgs> ConnectionChange;
///// <summary> /// <summary>
///// /////
///// </summary> ///// </summary>
//public event GenericSocketStatusChangeEventDelegate SocketStatusChange; //public event GenericSocketStatusChangeEventDelegate SocketStatusChange;
/// <summary> /// <summary>
/// Address of server /// Gets or sets the Hostname
/// </summary> /// </summary>
public string Hostname { get; set; } public string Hostname { get; set; }
@@ -52,12 +52,12 @@ namespace PepperDash.Core
public int Port { get; set; } public int Port { get; set; }
/// <summary> /// <summary>
/// Username for server /// Gets or sets the Username
/// </summary> /// </summary>
public string Username { get; set; } public string Username { get; set; }
/// <summary> /// <summary>
/// And... Password for server. That was worth documenting! /// Gets or sets the Password
/// </summary> /// </summary>
public string Password { get; set; } public string Password { get; set; }
@@ -79,7 +79,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// Socket status change event
/// </summary> /// </summary>
public SocketStatus ClientStatus public SocketStatus ClientStatus
{ {
@@ -123,8 +123,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Millisecond value, determines the timeout period in between reconnect attempts. /// Gets or sets the AutoReconnectIntervalMs
/// Set to 5000 by default
/// </summary> /// </summary>
public int AutoReconnectIntervalMs { get; set; } public int AutoReconnectIntervalMs { get; set; }
@@ -147,31 +146,31 @@ namespace PepperDash.Core
base(key) base(key)
{ {
StreamDebugging = new CommunicationStreamDebugging(key); StreamDebugging = new CommunicationStreamDebugging(key);
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
Key = key; Key = key;
Hostname = hostname; Hostname = hostname;
Port = port; Port = port;
Username = username; Username = username;
Password = password; Password = password;
AutoReconnectIntervalMs = 5000; AutoReconnectIntervalMs = 5000;
ReconnectTimer = new CTimer(o => ReconnectTimer = new CTimer(o =>
{ {
if (ConnectEnabled) if (ConnectEnabled)
{ {
Connect(); Connect();
} }
}, System.Threading.Timeout.Infinite); }, System.Threading.Timeout.Infinite);
} }
/// <summary> /// <summary>
/// S+ Constructor - Must set all properties before calling Connect /// S+ Constructor - Must set all properties before calling Connect
/// </summary> /// </summary>
public GenericSshClient() public GenericSshClient()
: base(SPlusKey) : base(SPlusKey)
{ {
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler); CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
AutoReconnectIntervalMs = 5000; AutoReconnectIntervalMs = 5000;
ReconnectTimer = new CTimer(o => ReconnectTimer = new CTimer(o =>
{ {
@@ -180,25 +179,25 @@ namespace PepperDash.Core
Connect(); Connect();
} }
}, System.Threading.Timeout.Infinite); }, System.Threading.Timeout.Infinite);
} }
/// <summary> /// <summary>
/// Handles closing this up when the program shuts down /// Handles closing this up when the program shuts down
/// </summary> /// </summary>
void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType) void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
{ {
if (programEventType == eProgramStatusEventType.Stopping) if (programEventType == eProgramStatusEventType.Stopping)
{ {
if (Client != null) if (Client != null)
{ {
this.LogDebug("Program stopping. Closing connection"); this.LogDebug("Program stopping. Closing connection");
Disconnect(); Disconnect();
} }
} }
} }
/// <summary> /// <summary>
/// Connect to the server, using the provided properties. /// Connect method
/// </summary> /// </summary>
public void Connect() public void Connect()
{ {
@@ -224,10 +223,7 @@ namespace PepperDash.Core
this.LogDebug("Attempting connect"); this.LogDebug("Attempting connect");
// Cancel reconnect if running. // Cancel reconnect if running.
if (ReconnectTimer != null) ReconnectTimer?.Stop();
{
ReconnectTimer.Stop();
}
// Cleanup the old client if it already exists // Cleanup the old client if it already exists
if (Client != null) if (Client != null)
@@ -269,20 +265,26 @@ namespace PepperDash.Core
if (ie is SocketException) if (ie is SocketException)
{ {
this.LogException(ie, "CONNECTION failure: Cannot reach host"); this.LogError("CONNECTION failure: Cannot reach host");
this.LogVerbose(ie, "Exception details: ");
} }
if (ie is System.Net.Sockets.SocketException socketException) if (ie is System.Net.Sockets.SocketException socketException)
{ {
this.LogException(ie, "Connection failure: Cannot reach {host} on {port}", this.LogError("Connection failure: Cannot reach {host} on {port}",
Hostname, Port); Hostname, Port);
this.LogVerbose(socketException, "SocketException details: ");
} }
if (ie is SshAuthenticationException) if (ie is SshAuthenticationException)
{ {
this.LogException(ie, "Authentication failure for username {userName}", Username); this.LogError("Authentication failure for username {userName}", Username);
this.LogVerbose(ie, "AuthenticationException details: ");
} }
else else
this.LogException(ie, "Error on connect"); {
this.LogError("Error on connect: {error}", ie.Message);
this.LogVerbose(ie, "Exception details: ");
}
DisconnectLogged = true; DisconnectLogged = true;
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED); KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
@@ -292,7 +294,7 @@ namespace PepperDash.Core
ReconnectTimer.Reset(AutoReconnectIntervalMs); ReconnectTimer.Reset(AutoReconnectIntervalMs);
} }
} }
catch(SshOperationTimeoutException ex) catch (SshOperationTimeoutException ex)
{ {
this.LogWarning("Connection attempt timed out: {message}", ex.Message); this.LogWarning("Connection attempt timed out: {message}", ex.Message);
@@ -307,7 +309,8 @@ namespace PepperDash.Core
catch (Exception e) catch (Exception e)
{ {
var errorLogLevel = DisconnectLogged == true ? Debug.ErrorLogLevel.None : Debug.ErrorLogLevel.Error; var errorLogLevel = DisconnectLogged == true ? Debug.ErrorLogLevel.None : Debug.ErrorLogLevel.Error;
this.LogException(e, "Unhandled exception on connect"); this.LogError("Unhandled exception on connect: {error}", e.Message);
this.LogVerbose(e, "Exception details: ");
DisconnectLogged = true; DisconnectLogged = true;
KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED); KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
if (AutoReconnect) if (AutoReconnect)
@@ -324,18 +327,18 @@ namespace PepperDash.Core
} }
} }
/// <summary> /// <summary>
/// Disconnect the clients and put away it's resources. /// Disconnect method
/// </summary> /// </summary>
public void Disconnect() public void Disconnect()
{ {
ConnectEnabled = false; ConnectEnabled = false;
// Stop trying reconnects, if we are // Stop trying reconnects, if we are
if (ReconnectTimer != null) if (ReconnectTimer != null)
{ {
ReconnectTimer.Stop(); ReconnectTimer.Stop();
// ReconnectTimer = null; // ReconnectTimer = null;
} }
KillClient(SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY); KillClient(SocketStatus.SOCKET_STATUS_BROKEN_LOCALLY);
} }
@@ -361,7 +364,7 @@ namespace PepperDash.Core
} }
catch (Exception ex) catch (Exception ex)
{ {
this.LogException(ex,"Exception in Kill Client"); this.LogException(ex, "Exception in Kill Client");
} }
} }
@@ -369,7 +372,7 @@ namespace PepperDash.Core
/// Kills the stream /// Kills the stream
/// </summary> /// </summary>
void KillStream() void KillStream()
{ {
try try
{ {
if (TheStream != null) if (TheStream != null)
@@ -385,59 +388,59 @@ namespace PepperDash.Core
{ {
this.LogException(ex, "Exception in Kill Stream:{0}"); this.LogException(ex, "Exception in Kill Stream:{0}");
} }
} }
/// <summary> /// <summary>
/// Handles the keyboard interactive authentication, should it be required. /// Handles the keyboard interactive authentication, should it be required.
/// </summary> /// </summary>
void kauth_AuthenticationPrompt(object sender, AuthenticationPromptEventArgs e) void kauth_AuthenticationPrompt(object sender, AuthenticationPromptEventArgs e)
{ {
foreach (AuthenticationPrompt prompt in e.Prompts) foreach (AuthenticationPrompt prompt in e.Prompts)
if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1) if (prompt.Request.IndexOf("Password:", StringComparison.InvariantCultureIgnoreCase) != -1)
prompt.Response = Password; prompt.Response = Password;
} }
/// <summary> /// <summary>
/// Handler for data receive on ShellStream. Passes data across to queue for line parsing. /// Handler for data receive on ShellStream. Passes data across to queue for line parsing.
/// </summary> /// </summary>
void Stream_DataReceived(object sender, ShellDataEventArgs e) void Stream_DataReceived(object sender, ShellDataEventArgs e)
{ {
if (((ShellStream)sender).Length <= 0L) if (((ShellStream)sender).Length <= 0L)
{ {
return; return;
} }
var response = ((ShellStream)sender).Read(); var response = ((ShellStream)sender).Read();
var bytesHandler = BytesReceived; var bytesHandler = BytesReceived;
if (bytesHandler != null) if (bytesHandler != null)
{ {
var bytes = Encoding.UTF8.GetBytes(response); var bytes = Encoding.UTF8.GetBytes(response);
if (StreamDebugging.RxStreamDebuggingIsEnabled) if (StreamDebugging.RxStreamDebuggingIsEnabled)
{ {
this.LogInformation("Received {1} bytes: '{0}'", ComTextHelper.GetEscapedText(bytes), bytes.Length); this.LogInformation("Received {1} bytes: '{0}'", ComTextHelper.GetEscapedText(bytes), bytes.Length);
} }
bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes)); bytesHandler(this, new GenericCommMethodReceiveBytesArgs(bytes));
} }
var textHandler = TextReceived; var textHandler = TextReceived;
if (textHandler != null) if (textHandler != null)
{ {
if (StreamDebugging.RxStreamDebuggingIsEnabled) if (StreamDebugging.RxStreamDebuggingIsEnabled)
this.LogInformation("Received: '{0}'", ComTextHelper.GetDebugText(response)); this.LogInformation("Received: '{0}'", ComTextHelper.GetDebugText(response));
textHandler(this, new GenericCommMethodReceiveTextArgs(response)); textHandler(this, new GenericCommMethodReceiveTextArgs(response));
} }
} }
/// <summary> /// <summary>
/// Error event handler for client events - disconnect, etc. Will forward those events via ConnectionChange /// Error event handler for client events - disconnect, etc. Will forward those events via ConnectionChange
/// event /// event
/// </summary> /// </summary>
void Client_ErrorOccurred(object sender, ExceptionEventArgs 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) if (e.Exception is SshConnectionException || e.Exception is System.Net.Sockets.SocketException)
@@ -466,55 +469,54 @@ namespace PepperDash.Core
/// </summary> /// </summary>
void OnConnectionChange() void OnConnectionChange()
{ {
if (ConnectionChange != null) ConnectionChange?.Invoke(this, new GenericSocketStatusChageEventArgs(this));
ConnectionChange(this, new GenericSocketStatusChageEventArgs(this));
} }
#region IBasicCommunication Members #region IBasicCommunication Members
/// <summary> /// <summary>
/// Sends text to the server /// Sends text to the server
/// </summary> /// </summary>
/// <param name="text"></param> /// <param name="text">The text to send</param>
public void SendText(string text) public void SendText(string text)
{ {
try try
{ {
if (Client != null && TheStream != null && IsConnected) if (Client != null && TheStream != null && IsConnected)
{ {
if (StreamDebugging.TxStreamDebuggingIsEnabled) if (StreamDebugging.TxStreamDebuggingIsEnabled)
this.LogInformation( this.LogInformation(
"Sending {length} characters of text: '{text}'", "Sending {length} characters of text: '{text}'",
text.Length, text.Length,
ComTextHelper.GetDebugText(text)); ComTextHelper.GetDebugText(text));
TheStream.Write(text); TheStream.Write(text);
TheStream.Flush(); TheStream.Flush();
} }
else else
{ {
this.LogDebug("Client is null or disconnected. Cannot Send Text"); this.LogDebug("Client is null or disconnected. Cannot Send Text");
} }
} }
catch (ObjectDisposedException) 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); KillClient(SocketStatus.SOCKET_STATUS_CONNECT_FAILED);
ReconnectTimer.Reset(); ReconnectTimer.Reset();
} }
catch (Exception ex) catch (Exception ex)
{ {
this.LogException(ex, "Exception sending text: '{message}'", text); this.LogException(ex, "Exception sending text: '{message}'", text);
} }
} }
/// <summary> /// <summary>
/// Sends Bytes to the server /// Sends Bytes to the server
/// </summary> /// </summary>
/// <param name="bytes"></param> /// <param name="bytes">The bytes to send</param>
public void SendBytes(byte[] bytes) public void SendBytes(byte[] bytes)
{ {
try try
{ {
if (Client != null && TheStream != null && IsConnected) if (Client != null && TheStream != null && IsConnected)
@@ -541,37 +543,37 @@ namespace PepperDash.Core
{ {
this.LogException(ex, "Exception sending {message}", ComTextHelper.GetEscapedText(bytes)); this.LogException(ex, "Exception sending {message}", ComTextHelper.GetEscapedText(bytes));
} }
} }
#endregion #endregion
} }
//***************************************************************************************************** //*****************************************************************************************************
//***************************************************************************************************** //*****************************************************************************************************
/// <summary> /// <summary>
/// Fired when connection changes /// Represents a SshConnectionChangeEventArgs
/// </summary> /// </summary>
public class SshConnectionChangeEventArgs : EventArgs public class SshConnectionChangeEventArgs : EventArgs
{ {
/// <summary> /// <summary>
/// Connection State /// Connection State
/// </summary> /// </summary>
public bool IsConnected { get; private set; } public bool IsConnected { get; private set; }
/// <summary> /// <summary>
/// Connection Status represented as a ushort /// Gets or sets the UIsConnected
/// </summary> /// </summary>
public ushort UIsConnected { get { return (ushort)(Client.IsConnected ? 1 : 0); } } public ushort UIsConnected { get { return (ushort)(Client.IsConnected ? 1 : 0); } }
/// <summary> /// <summary>
/// The client /// Gets or sets the Client
/// </summary> /// </summary>
public GenericSshClient Client { get; private set; } public GenericSshClient Client { get; private set; }
/// <summary> /// <summary>
/// Socket Status as represented by /// Gets or sets the Status
/// </summary> /// </summary>
public ushort Status { get { return Client.UStatus; } } public ushort Status { get { return Client.UStatus; } }
/// <summary> /// <summary>
/// S+ Constructor /// S+ Constructor

View File

@@ -59,7 +59,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Port on server /// Gets or sets the Port
/// </summary> /// </summary>
public int Port { get; set; } public int Port { get; set; }
@@ -135,9 +135,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public string ConnectionFailure { get { return ClientStatus.ToString(); } } public string ConnectionFailure { get { return ClientStatus.ToString(); } }
/// <summary> /// <summary>
/// bool to track if auto reconnect should be set on the socket /// Gets or sets the AutoReconnect
/// </summary> /// </summary>
public bool AutoReconnect { get; set; } public bool AutoReconnect { get; set; }
/// <summary> /// <summary>
@@ -232,7 +232,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Just to help S+ set the key /// Initialize method
/// </summary> /// </summary>
public void Initialize(string key) public void Initialize(string key)
{ {
@@ -255,6 +255,9 @@ namespace PepperDash.Core
/// ///
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// Deactivate method
/// </summary>
public override bool Deactivate() public override bool Deactivate()
{ {
RetryTimer.Stop(); RetryTimer.Stop();
@@ -267,9 +270,9 @@ namespace PepperDash.Core
return true; return true;
} }
/// <summary> /// <summary>
/// Attempts to connect to the server /// Connect method
/// </summary> /// </summary>
public void Connect() public void Connect()
{ {
if (string.IsNullOrEmpty(Hostname)) if (string.IsNullOrEmpty(Hostname))
@@ -334,9 +337,9 @@ namespace PepperDash.Core
} }
} }
/// <summary> /// <summary>
/// Attempts to disconnect the client /// Disconnect method
/// </summary> /// </summary>
public void Disconnect() public void Disconnect()
{ {
try try
@@ -355,7 +358,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Does the actual disconnect business /// DisconnectClient method
/// </summary> /// </summary>
public void DisconnectClient() public void DisconnectClient()
{ {
@@ -446,9 +449,9 @@ namespace PepperDash.Core
} }
} }
/// <summary> /// <summary>
/// General send method /// SendText method
/// </summary> /// </summary>
public void SendText(string text) public void SendText(string text)
{ {
var bytes = Encoding.GetEncoding(28591).GetBytes(text); var bytes = Encoding.GetEncoding(28591).GetBytes(text);
@@ -459,9 +462,9 @@ namespace PepperDash.Core
_client.SendData(bytes, bytes.Length); _client.SendData(bytes, bytes.Length);
} }
/// <summary> /// <summary>
/// This is useful from console and...? /// SendEscapedText method
/// </summary> /// </summary>
public void SendEscapedText(string text) public void SendEscapedText(string text)
{ {
var unescapedText = Regex.Replace(text, @"\\x([0-9a-fA-F][0-9a-fA-F])", s => var unescapedText = Regex.Replace(text, @"\\x([0-9a-fA-F][0-9a-fA-F])", s =>
@@ -476,6 +479,9 @@ namespace PepperDash.Core
/// Sends Bytes to the server /// Sends Bytes to the server
/// </summary> /// </summary>
/// <param name="bytes"></param> /// <param name="bytes"></param>
/// <summary>
/// SendBytes method
/// </summary>
public void SendBytes(byte[] bytes) public void SendBytes(byte[] bytes)
{ {
if (StreamDebugging.TxStreamDebuggingIsEnabled) if (StreamDebugging.TxStreamDebuggingIsEnabled)
@@ -508,9 +514,9 @@ namespace PepperDash.Core
} }
} }
/// <summary> /// <summary>
/// Configuration properties for TCP/SSH Connections /// Represents a TcpSshPropertiesConfig
/// </summary> /// </summary>
public class TcpSshPropertiesConfig public class TcpSshPropertiesConfig
{ {
/// <summary> /// <summary>
@@ -529,9 +535,9 @@ namespace PepperDash.Core
/// Username credential /// Username credential
/// </summary> /// </summary>
public string Username { get; set; } public string Username { get; set; }
/// <summary> /// <summary>
/// Passord credential /// Gets or sets the Password
/// </summary> /// </summary>
public string Password { get; set; } public string Password { get; set; }
/// <summary> /// <summary>
@@ -539,14 +545,14 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public int BufferSize { get; set; } public int BufferSize { get; set; }
/// <summary> /// <summary>
/// Defaults to true /// Gets or sets the AutoReconnect
/// </summary> /// </summary>
public bool AutoReconnect { get; set; } public bool AutoReconnect { get; set; }
/// <summary> /// <summary>
/// Defaults to 5000ms /// Gets or sets the AutoReconnectIntervalMs
/// </summary> /// </summary>
public int AutoReconnectIntervalMs { get; set; } public int AutoReconnectIntervalMs { get; set; }
/// <summary> /// <summary>

View File

@@ -69,7 +69,7 @@ namespace PepperDash.Core
public string Hostname { get; set; } public string Hostname { get; set; }
/// <summary> /// <summary>
/// Port on server /// Gets or sets the Port
/// </summary> /// </summary>
public int Port { get; set; } public int Port { get; set; }
@@ -102,7 +102,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// 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 /// Gets or sets the SharedKey
/// </summary> /// </summary>
public string SharedKey { get; set; } public string SharedKey { get; set; }
@@ -112,7 +112,7 @@ namespace PepperDash.Core
private bool WaitingForSharedKeyResponse { get; set; } private bool WaitingForSharedKeyResponse { get; set; }
/// <summary> /// <summary>
/// Defaults to 2000 /// Gets or sets the BufferSize
/// </summary> /// </summary>
public int BufferSize { get; set; } public int BufferSize { get; set; }
@@ -289,7 +289,7 @@ namespace PepperDash.Core
#region Methods #region Methods
/// <summary> /// <summary>
/// Just to help S+ set the key /// Initialize method
/// </summary> /// </summary>
public void Initialize(string key) public void Initialize(string key)
{ {
@@ -311,7 +311,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Connect Method. Will return if already connected. Will write errors if missing address, port, or unique key/name. /// Connect method
/// </summary> /// </summary>
public void Connect() public void Connect()
{ {
@@ -442,7 +442,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// Disconnect method
/// </summary> /// </summary>
public void Disconnect() public void Disconnect()
{ {
@@ -669,7 +669,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// General send method /// SendText method
/// </summary> /// </summary>
public void SendText(string text) public void SendText(string text)
{ {
@@ -698,7 +698,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// SendBytes method
/// </summary> /// </summary>
public void SendBytes(byte[] bytes) public void SendBytes(byte[] bytes)
{ {

View File

@@ -52,7 +52,7 @@ namespace PepperDash.Core
public ServerHasChokedCallbackDelegate ServerHasChoked { get; set; } public ServerHasChokedCallbackDelegate ServerHasChoked { get; set; }
/// <summary> /// <summary>
/// /// Delegate for ServerHasChokedCallbackDelegate
/// </summary> /// </summary>
public delegate void ServerHasChokedCallbackDelegate(); public delegate void ServerHasChokedCallbackDelegate();
@@ -82,7 +82,7 @@ namespace PepperDash.Core
int MonitorClientFailureCount; int MonitorClientFailureCount;
/// <summary> /// <summary>
/// 3 by default /// Gets or sets the MonitorClientMaxFailureCount
/// </summary> /// </summary>
public int MonitorClientMaxFailureCount { get; set; } public int MonitorClientMaxFailureCount { get; set; }
@@ -171,7 +171,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Port Server should listen on /// Gets or sets the Port
/// </summary> /// </summary>
public int Port { get; set; } public int Port { get; set; }
@@ -204,8 +204,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// 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. /// Gets or sets the SharedKey
/// If SharedKey changes while server is listening or clients are connected, disconnect and stop listening will be called
/// </summary> /// </summary>
public string SharedKey { get; set; } public string SharedKey { get; set; }
@@ -229,7 +228,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Milliseconds before server expects another heartbeat. Set by property HeartbeatRequiredIntervalInSeconds which is driven from S+ /// Gets or sets the HeartbeatRequiredIntervalMs
/// </summary> /// </summary>
public int HeartbeatRequiredIntervalMs { get; set; } public int HeartbeatRequiredIntervalMs { get; set; }
@@ -239,7 +238,7 @@ namespace PepperDash.Core
public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } } public ushort HeartbeatRequiredIntervalInSeconds { set { HeartbeatRequiredIntervalMs = (value * 1000); } }
/// <summary> /// <summary>
/// String to Match for heartbeat. If null or empty any string will reset heartbeat timer /// Gets or sets the HeartbeatStringToMatch
/// </summary> /// </summary>
public string HeartbeatStringToMatch { get; set; } public string HeartbeatStringToMatch { get; set; }
@@ -257,7 +256,7 @@ namespace PepperDash.Core
public List<uint> ConnectedClientsIndexes = new List<uint>(); public List<uint> ConnectedClientsIndexes = new List<uint>();
/// <summary> /// <summary>
/// Defaults to 2000 /// Gets or sets the BufferSize
/// </summary> /// </summary>
public int BufferSize { get; set; } public int BufferSize { get; set; }
@@ -320,7 +319,7 @@ namespace PepperDash.Core
#region Methods - Server Actions #region Methods - Server Actions
/// <summary> /// <summary>
/// Disconnects all clients and stops the server /// KillServer method
/// </summary> /// </summary>
public void KillServer() public void KillServer()
{ {
@@ -337,6 +336,9 @@ namespace PepperDash.Core
/// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+ /// Initialize Key for device using client name from SIMPL+. Called on Listen from SIMPL+
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key"></param>
/// <summary>
/// Initialize method
/// </summary>
public void Initialize(string key) public void Initialize(string key)
{ {
Key = key; Key = key;
@@ -375,7 +377,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Start listening on the specified port /// Listen method
/// </summary> /// </summary>
public void Listen() public void Listen()
{ {
@@ -432,7 +434,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Stop Listening /// StopListening method
/// </summary> /// </summary>
public void StopListening() public void StopListening()
{ {
@@ -457,6 +459,9 @@ namespace PepperDash.Core
/// Disconnects Client /// Disconnects Client
/// </summary> /// </summary>
/// <param name="client"></param> /// <param name="client"></param>
/// <summary>
/// DisconnectClient method
/// </summary>
public void DisconnectClient(uint client) public void DisconnectClient(uint client)
{ {
try try
@@ -470,7 +475,7 @@ namespace PepperDash.Core
} }
} }
/// <summary> /// <summary>
/// Disconnect All Clients /// DisconnectAllClientsForShutdown method
/// </summary> /// </summary>
public void DisconnectAllClientsForShutdown() public void DisconnectAllClientsForShutdown()
{ {
@@ -512,6 +517,9 @@ namespace PepperDash.Core
/// Broadcast text from server to all connected clients /// Broadcast text from server to all connected clients
/// </summary> /// </summary>
/// <param name="text"></param> /// <param name="text"></param>
/// <summary>
/// BroadcastText method
/// </summary>
public void BroadcastText(string text) public void BroadcastText(string text)
{ {
CCriticalSection CCBroadcast = new CCriticalSection(); CCriticalSection CCBroadcast = new CCriticalSection();
@@ -545,6 +553,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="text"></param> /// <param name="text"></param>
/// <param name="clientIndex"></param> /// <param name="clientIndex"></param>
/// <summary>
/// SendTextToClient method
/// </summary>
public void SendTextToClient(string text, uint clientIndex) public void SendTextToClient(string text, uint clientIndex)
{ {
try try
@@ -613,6 +624,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="clientIndex"></param> /// <param name="clientIndex"></param>
/// <returns>IP address of the client</returns> /// <returns>IP address of the client</returns>
/// <summary>
/// GetClientIPAddress method
/// </summary>
public string GetClientIPAddress(uint clientIndex) public string GetClientIPAddress(uint clientIndex)
{ {
Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress Index: {0}", clientIndex); Debug.Console(1, this, Debug.ErrorLogLevel.Notice, "GetClientIPAddress Index: {0}", clientIndex);

View File

@@ -150,6 +150,9 @@ namespace PepperDash.Core
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="address"></param> /// <param name="address"></param>
/// <param name="port"></param> /// <param name="port"></param>
/// <summary>
/// Initialize method
/// </summary>
public void Initialize(string key, string address, ushort port) public void Initialize(string key, string address, ushort port)
{ {
Key = key; Key = key;
@@ -185,7 +188,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Enables the UDP Server /// Connect method
/// </summary> /// </summary>
public void Connect() public void Connect()
{ {
@@ -222,7 +225,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Disabled the UDP Server /// Disconnect method
/// </summary> /// </summary>
public void Disconnect() public void Disconnect()
{ {
@@ -292,6 +295,9 @@ namespace PepperDash.Core
/// General send method /// General send method
/// </summary> /// </summary>
/// <param name="text"></param> /// <param name="text"></param>
/// <summary>
/// SendText method
/// </summary>
public void SendText(string text) public void SendText(string text)
{ {
var bytes = Encoding.GetEncoding(28591).GetBytes(text); var bytes = Encoding.GetEncoding(28591).GetBytes(text);
@@ -309,6 +315,9 @@ namespace PepperDash.Core
/// ///
/// </summary> /// </summary>
/// <param name="bytes"></param> /// <param name="bytes"></param>
/// <summary>
/// SendBytes method
/// </summary>
public void SendBytes(byte[] bytes) public void SendBytes(byte[] bytes)
{ {
if (StreamDebugging.TxStreamDebuggingIsEnabled) if (StreamDebugging.TxStreamDebuggingIsEnabled)
@@ -320,9 +329,9 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// Represents a GenericUdpReceiveTextExtraArgs
/// </summary> /// </summary>
public class GenericUdpReceiveTextExtraArgs : EventArgs public class GenericUdpReceiveTextExtraArgs : EventArgs
{ {
/// <summary> /// <summary>

View File

@@ -3,7 +3,7 @@
namespace PepperDash.Core namespace PepperDash.Core
{ {
/// <summary> /// <summary>
/// Client config object for TCP client with server that inherits from TcpSshPropertiesConfig and adds properties for shared key and heartbeat /// Represents a TcpClientConfigObject
/// </summary> /// </summary>
public class TcpClientConfigObject public class TcpClientConfigObject
{ {

View File

@@ -74,6 +74,10 @@ namespace PepperDash.Core
/// <summary> /// <summary>
/// Secure TCP/IP /// Secure TCP/IP
/// </summary> /// </summary>
SecureTcpIp SecureTcpIp,
/// <summary>
/// Used when comms needs to be handled in SIMPL and bridged opposite the normal direction
/// </summary>
ComBridge
} }
} }

View File

@@ -38,9 +38,9 @@ namespace PepperDash.Core
void Disconnect(); void Disconnect();
} }
/// <summary> /// <summary>
/// Represents a device that uses basic connection /// Defines the contract for IBasicCommunication
/// </summary> /// </summary>
public interface IBasicCommunication : ICommunicationReceiver public interface IBasicCommunication : ICommunicationReceiver
{ {
/// <summary> /// <summary>
@@ -147,9 +147,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public class GenericCommMethodReceiveBytesArgs : EventArgs public class GenericCommMethodReceiveBytesArgs : EventArgs
{ {
/// <summary> /// <summary>
/// /// Gets or sets the Bytes
/// </summary> /// </summary>
public byte[] Bytes { get; private set; } public byte[] Bytes { get; private set; }
/// <summary> /// <summary>
@@ -228,6 +228,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="text"></param> /// <param name="text"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetEscapedText method
/// </summary>
public static string GetEscapedText(string text) public static string GetEscapedText(string text)
{ {
var bytes = Encoding.GetEncoding(28591).GetBytes(text); var bytes = Encoding.GetEncoding(28591).GetBytes(text);
@@ -239,6 +242,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="text"></param> /// <param name="text"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetDebugText method
/// </summary>
public static string GetDebugText(string text) public static string GetDebugText(string text)
{ {
return Regex.Replace(text, @"[^\u0020-\u007E]", a => GetEscapedText(a.Value)); return Regex.Replace(text, @"[^\u0020-\u007E]", a => GetEscapedText(a.Value));

View File

@@ -67,6 +67,9 @@ namespace PepperDash.Core.Config
/// </summary> /// </summary>
/// <param name="doubleConfig"></param> /// <param name="doubleConfig"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// MergeConfigs method
/// </summary>
public static JObject MergeConfigs(JObject doubleConfig) public static JObject MergeConfigs(JObject doubleConfig)
{ {
var system = JObject.FromObject(doubleConfig["system"]); var system = JObject.FromObject(doubleConfig["system"]);

View File

@@ -6,13 +6,22 @@ using Crestron.SimplSharp;
namespace PepperDash.Core namespace PepperDash.Core
{ {
/// <summary>
/// Represents a EncodingHelper
/// </summary>
public class EncodingHelper public class EncodingHelper
{ {
/// <summary>
/// ConvertUtf8ToAscii method
/// </summary>
public static string ConvertUtf8ToAscii(string utf8String) public static string ConvertUtf8ToAscii(string utf8String)
{ {
return Encoding.ASCII.GetString(Encoding.UTF8.GetBytes(utf8String), 0, utf8String.Length); return Encoding.ASCII.GetString(Encoding.UTF8.GetBytes(utf8String), 0, utf8String.Length);
} }
/// <summary>
/// ConvertUtf8ToUtf16 method
/// </summary>
public static string ConvertUtf8ToUtf16(string utf8String) public static string ConvertUtf8ToUtf16(string utf8String)
{ {
return Encoding.Unicode.GetString(Encoding.UTF8.GetBytes(utf8String), 0, utf8String.Length); return Encoding.Unicode.GetString(Encoding.UTF8.GetBytes(utf8String), 0, utf8String.Length);

View File

@@ -5,9 +5,9 @@ using Serilog.Events;
namespace PepperDash.Core namespace PepperDash.Core
{ {
//********************************************************************************************************* //*********************************************************************************************************
/// <summary> /// <summary>
/// The core event and status-bearing class that most if not all device and connectors can derive from. /// Represents a Device
/// </summary> /// </summary>
public class Device : IKeyName public class Device : IKeyName
{ {
@@ -15,23 +15,23 @@ namespace PepperDash.Core
/// Unique Key /// Unique Key
/// </summary> /// </summary>
public string Key { get; protected set; } public string Key { get; protected set; }
/// <summary> /// <summary>
/// Name of the devie /// Gets or sets the Name
/// </summary> /// </summary>
public string Name { get; protected set; } public string Name { get; protected set; }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public bool Enabled { get; protected set; } public bool Enabled { get; protected set; }
///// <summary> /// <summary>
///// A place to store reference to the original config object, if any. These values should /// A place to store reference to the original config object, if any. These values should
///// NOT be used as properties on the device as they are all publicly-settable values. /// NOT be used as properties on the device as they are all publicly-settable values.
///// </summary> /// </summary>
//public DeviceConfig Config { get; private set; } //public DeviceConfig Config { get; private set; }
///// <summary> /// <summary>
///// Helper method to check if Config exists /// Helper method to check if Config exists
///// </summary> /// </summary>
//public bool HasConfig { get { return Config != null; } } //public bool HasConfig { get { return Config != null; } }
List<Action> _PreActivationActions; List<Action> _PreActivationActions;
@@ -86,6 +86,9 @@ namespace PepperDash.Core
/// Adds a post activation action /// Adds a post activation action
/// </summary> /// </summary>
/// <param name="act"></param> /// <param name="act"></param>
/// <summary>
/// AddPostActivationAction method
/// </summary>
public void AddPostActivationAction(Action act) public void AddPostActivationAction(Action act)
{ {
if (_PostActivationActions == null) if (_PostActivationActions == null)
@@ -93,9 +96,9 @@ namespace PepperDash.Core
_PostActivationActions.Add(act); _PostActivationActions.Add(act);
} }
/// <summary> /// <summary>
/// Executes the preactivation actions /// PreActivate method
/// </summary> /// </summary>
public void PreActivate() public void PreActivate()
{ {
if (_PreActivationActions != null) if (_PreActivationActions != null)
@@ -112,11 +115,9 @@ namespace PepperDash.Core
}); });
} }
/// <summary> /// <summary>
/// Gets this device ready to be used in the system. Runs any added pre-activation items, and /// Activate method
/// all post-activation at end. Classes needing additional logic to /// </summary>
/// run should override CustomActivate()
/// </summary>
public bool Activate() public bool Activate()
{ {
//if (_PreActivationActions != null) //if (_PreActivationActions != null)
@@ -127,9 +128,9 @@ namespace PepperDash.Core
return result; return result;
} }
/// <summary> /// <summary>
/// Executes the postactivation actions /// PostActivate method
/// </summary> /// </summary>
public void PostActivate() public void PostActivate()
{ {
if (_PostActivationActions != null) if (_PostActivationActions != null)
@@ -152,6 +153,9 @@ namespace PepperDash.Core
/// do not need to call base.CustomActivate() /// do not need to call base.CustomActivate()
/// </summary> /// </summary>
/// <returns>true if device activated successfully.</returns> /// <returns>true if device activated successfully.</returns>
/// <summary>
/// CustomActivate method
/// </summary>
public virtual bool CustomActivate() { return true; } public virtual bool CustomActivate() { return true; }
/// <summary> /// <summary>
@@ -184,6 +188,9 @@ namespace PepperDash.Core
/// <remarks>The returned string is formatted as "{Key} - {Name}". If the <c>Name</c> property is /// <remarks>The returned string is formatted as "{Key} - {Name}". If the <c>Name</c> property is
/// null or empty, "---" is used in place of the name.</remarks> /// null or empty, "---" is used in place of the name.</remarks>
/// <returns>A string that represents the object, containing the key and name in the format "{Key} - {Name}".</returns> /// <returns>A string that represents the object, containing the key and name in the format "{Key} - {Name}".</returns>
/// <summary>
/// ToString method
/// </summary>
public override string ToString() public override string ToString()
{ {
return string.Format("{0} - {1}", Key, string.IsNullOrEmpty(Name) ? "---" : Name); return string.Format("{0} - {1}", Key, string.IsNullOrEmpty(Name) ? "---" : Name);

View File

@@ -4,9 +4,9 @@ using Serilog.Events;
namespace PepperDash.Core namespace PepperDash.Core
{ {
/// <summary> /// <summary>
/// Class to help with accessing values from the CrestronEthernetHelper class /// Represents a EthernetHelper
/// </summary> /// </summary>
public class EthernetHelper public class EthernetHelper
{ {
/// <summary> /// <summary>
@@ -24,9 +24,9 @@ namespace PepperDash.Core
// ADD OTHER HELPERS HERE // ADD OTHER HELPERS HERE
/// <summary> /// <summary>
/// /// Gets or sets the PortNumber
/// </summary> /// </summary>
public int PortNumber { get; private set; } public int PortNumber { get; private set; }
private EthernetHelper(int portNumber) private EthernetHelper(int portNumber)

View File

@@ -16,19 +16,19 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public bool State { get; set; } public bool State { get; set; }
/// <summary> /// <summary>
/// Boolean ushort value property /// Gets or sets the IntValue
/// </summary> /// </summary>
public ushort IntValue { get { return (ushort)(State ? 1 : 0); } } public ushort IntValue { get { return (ushort)(State ? 1 : 0); } }
/// <summary> /// <summary>
/// Boolean change event args type /// Gets or sets the Type
/// </summary> /// </summary>
public ushort Type { get; set; } public ushort Type { get; set; }
/// <summary> /// <summary>
/// Boolean change event args index /// Gets or sets the Index
/// </summary> /// </summary>
public ushort Index { get; set; } public ushort Index { get; set; }
/// <summary> /// <summary>
@@ -64,9 +64,9 @@ namespace PepperDash.Core
} }
} }
/// <summary> /// <summary>
/// Ushort change event args /// Represents a UshrtChangeEventArgs
/// </summary> /// </summary>
public class UshrtChangeEventArgs : EventArgs public class UshrtChangeEventArgs : EventArgs
{ {
/// <summary> /// <summary>
@@ -74,14 +74,14 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public ushort IntValue { get; set; } public ushort IntValue { get; set; }
/// <summary> /// <summary>
/// Ushort change event args type /// Gets or sets the Type
/// </summary> /// </summary>
public ushort Type { get; set; } public ushort Type { get; set; }
/// <summary> /// <summary>
/// Ushort change event args index /// Gets or sets the Index
/// </summary> /// </summary>
public ushort Index { get; set; } public ushort Index { get; set; }
/// <summary> /// <summary>
@@ -117,9 +117,9 @@ namespace PepperDash.Core
} }
} }
/// <summary> /// <summary>
/// String change event args /// Represents a StringChangeEventArgs
/// </summary> /// </summary>
public class StringChangeEventArgs : EventArgs public class StringChangeEventArgs : EventArgs
{ {
/// <summary> /// <summary>
@@ -127,14 +127,14 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public string StringValue { get; set; } public string StringValue { get; set; }
/// <summary> /// <summary>
/// String change event args type /// Gets or sets the Type
/// </summary> /// </summary>
public ushort Type { get; set; } public ushort Type { get; set; }
/// <summary> /// <summary>
/// string change event args index /// Gets or sets the Index
/// </summary> /// </summary>
public ushort Index { get; set; } public ushort Index { get; set; }
/// <summary> /// <summary>

View File

@@ -32,14 +32,14 @@ namespace PepperDash.Core.JsonStandardObjects
/// </summary> /// </summary>
public DeviceConfig Device { get; set; } public DeviceConfig Device { get; set; }
/// <summary> /// <summary>
/// Device change event args type /// Gets or sets the Type
/// </summary> /// </summary>
public ushort Type { get; set; } public ushort Type { get; set; }
/// <summary> /// <summary>
/// Device change event args index /// Gets or sets the Index
/// </summary> /// </summary>
public ushort Index { get; set; } public ushort Index { get; set; }
/// <summary> /// <summary>

View File

@@ -58,6 +58,9 @@ namespace PepperDash.Core.JsonStandardObjects
/// </summary> /// </summary>
/// <param name="uniqueID"></param> /// <param name="uniqueID"></param>
/// <param name="deviceKey"></param> /// <param name="deviceKey"></param>
/// <summary>
/// Initialize method
/// </summary>
public void Initialize(string uniqueID, string deviceKey) public void Initialize(string uniqueID, string deviceKey)
{ {
// S+ set EvaluateFb low // S+ set EvaluateFb low

View File

@@ -47,14 +47,14 @@ namespace PepperDash.Core.JsonStandardObjects
] ]
} }
*/ */
/// <summary> /// <summary>
/// Device communication parameter class /// Represents a ComParamsConfig
/// </summary> /// </summary>
public class ComParamsConfig public class ComParamsConfig
{ {
/// <summary> /// <summary>
/// /// Gets or sets the baudRate
/// </summary> /// </summary>
public int baudRate { get; set; } public int baudRate { get; set; }
/// <summary> /// <summary>
/// ///
@@ -86,13 +86,13 @@ namespace PepperDash.Core.JsonStandardObjects
public int pacing { get; set; } public int pacing { get; set; }
// convert properties for simpl // convert properties for simpl
/// <summary> /// <summary>
/// /// Gets or sets the simplBaudRate
/// </summary> /// </summary>
public ushort simplBaudRate { get { return Convert.ToUInt16(baudRate); } } public ushort simplBaudRate { get { return Convert.ToUInt16(baudRate); } }
/// <summary> /// <summary>
/// /// Gets or sets the simplDataBits
/// </summary> /// </summary>
public ushort simplDataBits { get { return Convert.ToUInt16(dataBits); } } public ushort simplDataBits { get { return Convert.ToUInt16(dataBits); } }
/// <summary> /// <summary>
/// ///
@@ -143,13 +143,13 @@ namespace PepperDash.Core.JsonStandardObjects
public int autoReconnectIntervalMs { get; set; } public int autoReconnectIntervalMs { get; set; }
// convert properties for simpl // convert properties for simpl
/// <summary> /// <summary>
/// /// Gets or sets the simplPort
/// </summary> /// </summary>
public ushort simplPort { get { return Convert.ToUInt16(port); } } public ushort simplPort { get { return Convert.ToUInt16(port); } }
/// <summary> /// <summary>
/// /// Gets or sets the simplAutoReconnect
/// </summary> /// </summary>
public ushort simplAutoReconnect { get { return (ushort)(autoReconnect ? 1 : 0); } } public ushort simplAutoReconnect { get { return (ushort)(autoReconnect ? 1 : 0); } }
/// <summary> /// <summary>
/// ///
@@ -192,9 +192,9 @@ namespace PepperDash.Core.JsonStandardObjects
public TcpSshPropertiesConfig tcpSshProperties { get; set; } public TcpSshPropertiesConfig tcpSshProperties { get; set; }
// convert properties for simpl // convert properties for simpl
/// <summary> /// <summary>
/// /// Gets or sets the simplControlPortNumber
/// </summary> /// </summary>
public ushort simplControlPortNumber { get { return Convert.ToUInt16(controlPortNumber); } } public ushort simplControlPortNumber { get { return Convert.ToUInt16(controlPortNumber); } }
/// <summary> /// <summary>
@@ -207,9 +207,9 @@ namespace PepperDash.Core.JsonStandardObjects
} }
} }
/// <summary> /// <summary>
/// Device properties class /// Represents a PropertiesConfig
/// </summary> /// </summary>
public class PropertiesConfig public class PropertiesConfig
{ {
/// <summary> /// <summary>
@@ -226,13 +226,13 @@ namespace PepperDash.Core.JsonStandardObjects
public ControlConfig control { get; set; } public ControlConfig control { get; set; }
// convert properties for simpl // convert properties for simpl
/// <summary> /// <summary>
/// /// Gets or sets the simplDeviceId
/// </summary> /// </summary>
public ushort simplDeviceId { get { return Convert.ToUInt16(deviceId); } } public ushort simplDeviceId { get { return Convert.ToUInt16(deviceId); } }
/// <summary> /// <summary>
/// /// Gets or sets the simplEnabled
/// </summary> /// </summary>
public ushort simplEnabled { get { return (ushort)(enabled ? 1 : 0); } } public ushort simplEnabled { get { return (ushort)(enabled ? 1 : 0); } }
/// <summary> /// <summary>

View File

@@ -88,9 +88,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
public class SPlusValueWrapper public class SPlusValueWrapper
{ {
/// <summary> /// <summary>
/// /// Gets or sets the ValueType
/// </summary> /// </summary>
public SPlusType ValueType { get; private set; } public SPlusType ValueType { get; private set; }
/// <summary> /// <summary>
/// ///
@@ -122,9 +122,9 @@ namespace PepperDash.Core.JsonToSimpl
} }
} }
/// <summary> /// <summary>
/// S+ types enum /// Enumeration of SPlusType values
/// </summary> /// </summary>
public enum SPlusType public enum SPlusType
{ {
/// <summary> /// <summary>

View File

@@ -23,6 +23,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
/// <param name="master">New master to add</param> /// <param name="master">New master to add</param>
/// ///
/// <summary>
/// AddMaster method
/// </summary>
public static void AddMaster(JsonToSimplMaster master) public static void AddMaster(JsonToSimplMaster master)
{ {
if (master == null) if (master == null)
@@ -49,9 +52,9 @@ namespace PepperDash.Core.JsonToSimpl
} }
} }
/// <summary> /// <summary>
/// Gets a master by its key. Case-insensitive /// GetMasterByFile method
/// </summary> /// </summary>
public static JsonToSimplMaster GetMasterByFile(string file) public static JsonToSimplMaster GetMasterByFile(string file)
{ {
return Masters.FirstOrDefault(m => m.UniqueID.Equals(file, StringComparison.OrdinalIgnoreCase)); return Masters.FirstOrDefault(m => m.UniqueID.Equals(file, StringComparison.OrdinalIgnoreCase));

View File

@@ -5,9 +5,9 @@ using Serilog.Events;
namespace PepperDash.Core.JsonToSimpl namespace PepperDash.Core.JsonToSimpl
{ {
/// <summary> /// <summary>
/// Used to interact with an array of values with the S+ modules /// Represents a JsonToSimplArrayLookupChild
/// </summary> /// </summary>
public class JsonToSimplArrayLookupChild : JsonToSimplChildObjectBase public class JsonToSimplArrayLookupChild : JsonToSimplChildObjectBase
{ {
/// <summary> /// <summary>
@@ -76,9 +76,10 @@ namespace PepperDash.Core.JsonToSimpl
PathSuffix == null ? "" : PathSuffix); PathSuffix == null ? "" : PathSuffix);
} }
/// <summary> /// <summary>
/// Process all values /// ProcessAll method
/// </summary> /// </summary>
/// <inheritdoc />
public override void ProcessAll() public override void ProcessAll()
{ {
if (FindInArray()) if (FindInArray())

View File

@@ -28,14 +28,14 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
public SPlusValuesDelegate GetAllValuesDelegate { get; set; } public SPlusValuesDelegate GetAllValuesDelegate { get; set; }
/// <summary> /// <summary>
/// Use a callback to reduce task switch/threading /// Gets or sets the SetAllPathsDelegate
/// </summary> /// </summary>
public SPlusValuesDelegate SetAllPathsDelegate { get; set; } public SPlusValuesDelegate SetAllPathsDelegate { get; set; }
/// <summary> /// <summary>
/// Unique identifier for instance /// Gets or sets the Key
/// </summary> /// </summary>
public string Key { get; protected set; } public string Key { get; protected set; }
/// <summary> /// <summary>
@@ -49,9 +49,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
public string PathSuffix { get; protected set; } public string PathSuffix { get; protected set; }
/// <summary> /// <summary>
/// Indicates if the instance is linked to an object /// Gets or sets the LinkedToObject
/// </summary> /// </summary>
public bool LinkedToObject { get; protected set; } public bool LinkedToObject { get; protected set; }
/// <summary> /// <summary>
@@ -96,6 +96,9 @@ namespace PepperDash.Core.JsonToSimpl
/// Sets the path prefix for the object /// Sets the path prefix for the object
/// </summary> /// </summary>
/// <param name="pathPrefix"></param> /// <param name="pathPrefix"></param>
/// <summary>
/// SetPathPrefix method
/// </summary>
public void SetPathPrefix(string pathPrefix) public void SetPathPrefix(string pathPrefix)
{ {
PathPrefix = pathPrefix; PathPrefix = pathPrefix;
@@ -110,9 +113,9 @@ namespace PepperDash.Core.JsonToSimpl
BoolPaths[index] = path; BoolPaths[index] = path;
} }
/// <summary> /// <summary>
/// Set the JPath for a ushort out index. /// SetUshortPath method
/// </summary> /// </summary>
public void SetUshortPath(ushort index, string path) public void SetUshortPath(ushort index, string path)
{ {
Debug.Console(1, "JSON Child[{0}] SetUshortPath {1}={2}", Key, index, path); Debug.Console(1, "JSON Child[{0}] SetUshortPath {1}={2}", Key, index, path);
@@ -120,9 +123,9 @@ namespace PepperDash.Core.JsonToSimpl
UshortPaths[index] = path; UshortPaths[index] = path;
} }
/// <summary> /// <summary>
/// Set the JPath for a string output index. /// SetStringPath method
/// </summary> /// </summary>
public void SetStringPath(ushort index, string path) public void SetStringPath(ushort index, string path)
{ {
Debug.Console(1, "JSON Child[{0}] SetStringPath {1}={2}", Key, index, path); Debug.Console(1, "JSON Child[{0}] SetStringPath {1}={2}", Key, index, path);
@@ -130,10 +133,10 @@ namespace PepperDash.Core.JsonToSimpl
StringPaths[index] = path; StringPaths[index] = path;
} }
/// <summary> /// <summary>
/// Evalutates all outputs with defined paths. called by S+ when paths are ready to process /// ProcessAll method
/// and by Master when file is read. /// </summary>
/// </summary> /// <inheritdoc />
public virtual void ProcessAll() public virtual void ProcessAll()
{ {
if (!LinkedToObject) if (!LinkedToObject)
@@ -277,6 +280,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="theValue"></param> /// <param name="theValue"></param>
/// <summary>
/// USetBoolValue method
/// </summary>
public void USetBoolValue(ushort key, ushort theValue) public void USetBoolValue(ushort key, ushort theValue)
{ {
SetBoolValue(key, theValue == 1); SetBoolValue(key, theValue == 1);
@@ -287,6 +293,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="theValue"></param> /// <param name="theValue"></param>
/// <summary>
/// SetBoolValue method
/// </summary>
public void SetBoolValue(ushort key, bool theValue) public void SetBoolValue(ushort key, bool theValue)
{ {
if (BoolPaths.ContainsKey(key)) if (BoolPaths.ContainsKey(key))
@@ -298,6 +307,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="theValue"></param> /// <param name="theValue"></param>
/// <summary>
/// SetUShortValue method
/// </summary>
public void SetUShortValue(ushort key, ushort theValue) public void SetUShortValue(ushort key, ushort theValue)
{ {
if (UshortPaths.ContainsKey(key)) if (UshortPaths.ContainsKey(key))
@@ -309,6 +321,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="theValue"></param> /// <param name="theValue"></param>
/// <summary>
/// SetStringValue method
/// </summary>
public void SetStringValue(ushort key, string theValue) public void SetStringValue(ushort key, string theValue)
{ {
if (StringPaths.ContainsKey(key)) if (StringPaths.ContainsKey(key))
@@ -320,6 +335,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
/// <param name="keyPath"></param> /// <param name="keyPath"></param>
/// <param name="valueToSave"></param> /// <param name="valueToSave"></param>
/// <summary>
/// SetValueOnMaster method
/// </summary>
public void SetValueOnMaster(string keyPath, JValue valueToSave) public void SetValueOnMaster(string keyPath, JValue valueToSave)
{ {
var path = GetFullPath(keyPath); var path = GetFullPath(keyPath);

View File

@@ -20,12 +20,12 @@ namespace PepperDash.Core.JsonToSimpl
public string Filepath { get; private set; } public string Filepath { get; private set; }
/// <summary> /// <summary>
/// Filepath to the actual file that will be read (Portal or local) /// Gets or sets the ActualFilePath
/// </summary> /// </summary>
public string ActualFilePath { get; private set; } public string ActualFilePath { get; private set; }
/// <summary> /// <summary>
/// /// Gets or sets the Filename
/// </summary> /// </summary>
public string Filename { get; private set; } public string Filename { get; private set; }
/// <summary> /// <summary>
@@ -194,6 +194,9 @@ namespace PepperDash.Core.JsonToSimpl
/// Sets the debug level /// Sets the debug level
/// </summary> /// </summary>
/// <param name="level"></param> /// <param name="level"></param>
/// <summary>
/// setDebugLevel method
/// </summary>
public void setDebugLevel(uint level) public void setDebugLevel(uint level)
{ {
Debug.SetDebugLevel(level); Debug.SetDebugLevel(level);

View File

@@ -2,9 +2,9 @@
namespace PepperDash.Core.JsonToSimpl namespace PepperDash.Core.JsonToSimpl
{ {
/// <summary> /// <summary>
/// /// Represents a JsonToSimplFixedPathObject
/// </summary> /// </summary>
public class JsonToSimplFixedPathObject : JsonToSimplChildObjectBase public class JsonToSimplFixedPathObject : JsonToSimplChildObjectBase
{ {
/// <summary> /// <summary>

View File

@@ -5,9 +5,9 @@ using Newtonsoft.Json.Linq;
namespace PepperDash.Core.JsonToSimpl namespace PepperDash.Core.JsonToSimpl
{ {
/// <summary> /// <summary>
/// Generic Master /// Represents a JsonToSimplGenericMaster
/// </summary> /// </summary>
public class JsonToSimplGenericMaster : JsonToSimplMaster public class JsonToSimplGenericMaster : JsonToSimplMaster
{ {
/*****************************************************************************************/ /*****************************************************************************************/
@@ -20,9 +20,9 @@ namespace PepperDash.Core.JsonToSimpl
// To prevent multiple same-file access // To prevent multiple same-file access
static object WriteLock = new object(); static object WriteLock = new object();
/// <summary> /// <summary>
/// Callback action for saving /// Gets or sets the SaveCallback
/// </summary> /// </summary>
public Action<string> SaveCallback { get; set; } public Action<string> SaveCallback { get; set; }
/*****************************************************************************************/ /*****************************************************************************************/
@@ -60,6 +60,9 @@ namespace PepperDash.Core.JsonToSimpl
/// Loads JSON into JsonObject, but does not trigger evaluation by children /// Loads JSON into JsonObject, but does not trigger evaluation by children
/// </summary> /// </summary>
/// <param name="json"></param> /// <param name="json"></param>
/// <summary>
/// SetJsonWithoutEvaluating method
/// </summary>
public void SetJsonWithoutEvaluating(string json) public void SetJsonWithoutEvaluating(string json)
{ {
try try
@@ -72,9 +75,10 @@ namespace PepperDash.Core.JsonToSimpl
} }
} }
/// <summary> /// <summary>
/// /// Save method
/// </summary> /// </summary>
/// <inheritdoc />
public override void Save() public override void Save()
{ {
// this code is duplicated in the other masters!!!!!!!!!!!!! // this code is duplicated in the other masters!!!!!!!!!!!!!

View File

@@ -38,9 +38,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
public string Key { get { return UniqueID; } } public string Key { get { return UniqueID; } }
/// <summary> /// <summary>
/// A unique ID /// Gets or sets the UniqueID
/// </summary> /// </summary>
public string UniqueID { get; protected set; } public string UniqueID { get; protected set; }
/// <summary> /// <summary>
@@ -53,10 +53,9 @@ namespace PepperDash.Core.JsonToSimpl
} }
string _DebugName = ""; string _DebugName = "";
/// <summary> /// <summary>
/// This will be prepended to all paths to allow path swapping or for more organized /// Gets or sets the PathPrefix
/// sub-paths /// </summary>
/// </summary>
public string PathPrefix { get; set; } public string PathPrefix { get; set; }
/// <summary> /// <summary>
@@ -83,9 +82,9 @@ namespace PepperDash.Core.JsonToSimpl
} }
} }
/// <summary> /// <summary>
/// /// Gets or sets the JsonObject
/// </summary> /// </summary>
public JObject JsonObject { get; protected set; } public JObject JsonObject { get; protected set; }
/*****************************************************************************************/ /*****************************************************************************************/
@@ -120,6 +119,9 @@ namespace PepperDash.Core.JsonToSimpl
/// Adds a child "module" to this master /// Adds a child "module" to this master
/// </summary> /// </summary>
/// <param name="child"></param> /// <param name="child"></param>
/// <summary>
/// AddChild method
/// </summary>
public void AddChild(JsonToSimplChildObjectBase child) public void AddChild(JsonToSimplChildObjectBase child)
{ {
if (!Children.Contains(child)) if (!Children.Contains(child))
@@ -128,9 +130,9 @@ namespace PepperDash.Core.JsonToSimpl
} }
} }
/// <summary> /// <summary>
/// Called from the child to add changed or new values for saving /// AddUnsavedValue method
/// </summary> /// </summary>
public void AddUnsavedValue(string path, JValue value) public void AddUnsavedValue(string path, JValue value)
{ {
if (UnsavedValues.ContainsKey(path)) if (UnsavedValues.ContainsKey(path))
@@ -179,6 +181,9 @@ namespace PepperDash.Core.JsonToSimpl
/// </summary> /// </summary>
/// <param name="json"></param> /// <param name="json"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// ParseArray method
/// </summary>
public static JArray ParseArray(string json) public static JArray ParseArray(string json)
{ {
#if NET6_0 #if NET6_0

View File

@@ -19,7 +19,7 @@ namespace PepperDash.Core.JsonToSimpl
public string PortalFilepath { get; private set; } public string PortalFilepath { get; private set; }
/// <summary> /// <summary>
/// File path of the actual file being read (Portal or local) /// Gets or sets the ActualFilePath
/// </summary> /// </summary>
public string ActualFilePath { get; private set; } public string ActualFilePath { get; private set; }
@@ -128,6 +128,9 @@ namespace PepperDash.Core.JsonToSimpl
/// ///
/// </summary> /// </summary>
/// <param name="level"></param> /// <param name="level"></param>
/// <summary>
/// setDebugLevel method
/// </summary>
public void setDebugLevel(uint level) public void setDebugLevel(uint level)
{ {
Debug.SetDebugLevel(level); Debug.SetDebugLevel(level);

View File

@@ -9,6 +9,9 @@ using System.Threading.Tasks;
namespace PepperDash.Core.Logging namespace PepperDash.Core.Logging
{ {
/// <summary>
/// Represents a CrestronEnricher
/// </summary>
public class CrestronEnricher : ILogEventEnricher public class CrestronEnricher : ILogEventEnricher
{ {
static readonly string _appName; static readonly string _appName;
@@ -27,6 +30,9 @@ namespace PepperDash.Core.Logging
} }
/// <summary>
/// Enrich method
/// </summary>
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{ {
var property = propertyFactory.CreateProperty("App", _appName); var property = propertyFactory.CreateProperty("App", _appName);

View File

@@ -1,4 +1,9 @@
using Crestron.SimplSharp; using System;
using System.Collections.Generic;
using System.Net;
using System.Reflection;
using System.Text.RegularExpressions;
using Crestron.SimplSharp;
using Crestron.SimplSharp.CrestronDataStore; using Crestron.SimplSharp.CrestronDataStore;
using Crestron.SimplSharp.CrestronIO; using Crestron.SimplSharp.CrestronIO;
using Crestron.SimplSharp.CrestronLogger; using Crestron.SimplSharp.CrestronLogger;
@@ -11,15 +16,10 @@ using Serilog.Events;
using Serilog.Formatting.Compact; using Serilog.Formatting.Compact;
using Serilog.Formatting.Json; using Serilog.Formatting.Json;
using Serilog.Templates; using Serilog.Templates;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text.RegularExpressions;
namespace PepperDash.Core namespace PepperDash.Core
{ {
/// <summary> /// <summary>
/// Contains debug commands for use in various situations
/// </summary> /// </summary>
public static class Debug public static class Debug
{ {
@@ -48,6 +48,9 @@ namespace PepperDash.Core
private static readonly LoggingLevelSwitch _fileLevelSwitch; private static readonly LoggingLevelSwitch _fileLevelSwitch;
/// <summary>
/// Gets the minimum log level for the websocket sink.
/// </summary>
public static LogEventLevel WebsocketMinimumLogLevel public static LogEventLevel WebsocketMinimumLogLevel
{ {
get { return _websocketLoggingLevelSwitch.MinimumLevel; } get { return _websocketLoggingLevelSwitch.MinimumLevel; }
@@ -55,6 +58,9 @@ namespace PepperDash.Core
private static readonly DebugWebsocketSink _websocketSink; private static readonly DebugWebsocketSink _websocketSink;
/// <summary>
/// Gets the websocket sink for debug logging.
/// </summary>
public static DebugWebsocketSink WebsocketSink public static DebugWebsocketSink WebsocketSink
{ {
get { return _websocketSink; } get { return _websocketSink; }
@@ -78,12 +84,12 @@ namespace PepperDash.Core
public static string FileName = string.Format(@"app{0}Debug.json", InitialParametersClass.ApplicationNumber); public static string FileName = string.Format(@"app{0}Debug.json", InitialParametersClass.ApplicationNumber);
/// <summary> /// <summary>
/// Debug level to set for a given program. /// Gets or sets the Level
/// </summary> /// </summary>
public static int Level { get; private set; } public static int Level { get; private set; }
/// <summary> /// <summary>
/// When this is true, the configuration file will NOT be loaded until triggered by either a console command or a signal /// Gets or sets the DoNotLoadConfigOnNextBoot
/// </summary> /// </summary>
public static bool DoNotLoadConfigOnNextBoot { get; private set; } public static bool DoNotLoadConfigOnNextBoot { get; private set; }
@@ -91,29 +97,33 @@ namespace PepperDash.Core
private const int SaveTimeoutMs = 30000; private const int SaveTimeoutMs = 30000;
/// <summary>
/// Indicates whether the system is running on an appliance.
/// </summary>
public static bool IsRunningOnAppliance = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance; public static bool IsRunningOnAppliance = CrestronEnvironment.DevicePlatform == eDevicePlatform.Appliance;
/// <summary> /// <summary>
/// Version for the currently loaded PepperDashCore dll /// Gets or sets the PepperDashCoreVersion
/// </summary> /// </summary>
public static string PepperDashCoreVersion { get; private set; } public static string PepperDashCoreVersion { get; private set; }
private static CTimer _saveTimer; private static CTimer _saveTimer;
/// <summary> /// <summary>
/// When true, the IncludedExcludedKeys dict will contain keys to include. /// When true, the IncludedExcludedKeys dict will contain keys to include.
/// When false (default), IncludedExcludedKeys will contain keys to exclude. /// When false (default), IncludedExcludedKeys will contain keys to exclude.
/// </summary> /// </summary>
private static bool _excludeAllMode; private static bool _excludeAllMode;
//static bool ExcludeNoKeyMessages; private static readonly Dictionary<string, object> IncludedExcludedKeys;
private static readonly Dictionary<string, object> IncludedExcludedKeys;
private static readonly LoggerConfiguration _defaultLoggerConfiguration; private static readonly LoggerConfiguration _defaultLoggerConfiguration;
private static LoggerConfiguration _loggerConfiguration; private static LoggerConfiguration _loggerConfiguration;
/// <summary>
/// Gets the logger configuration for the debug logging.
/// </summary>
public static LoggerConfiguration LoggerConfiguration => _loggerConfiguration; public static LoggerConfiguration LoggerConfiguration => _loggerConfiguration;
static Debug() static Debug()
@@ -193,9 +203,9 @@ namespace PepperDash.Core
CrestronConsole.PrintLine(msg); CrestronConsole.PrintLine(msg);
LogMessage(LogEventLevel.Information,msg); LogMessage(LogEventLevel.Information, msg);
IncludedExcludedKeys = new Dictionary<string, object>(); IncludedExcludedKeys = new Dictionary<string, object>();
if (CrestronEnvironment.RuntimeEnvironment == eRuntimeEnvironment.SimplSharpPro) if (CrestronEnvironment.RuntimeEnvironment == eRuntimeEnvironment.SimplSharpPro)
{ {
@@ -212,8 +222,8 @@ namespace PepperDash.Core
CrestronConsole.AddNewConsoleCommand(s => CrestronLogger.Clear(false), "appdebugclear", CrestronConsole.AddNewConsoleCommand(s => CrestronLogger.Clear(false), "appdebugclear",
"appdebugclear:P Clears the current custom log", "appdebugclear:P Clears the current custom log",
ConsoleAccessLevelEnum.AccessOperator); ConsoleAccessLevelEnum.AccessOperator);
CrestronConsole.AddNewConsoleCommand(SetDebugFilterFromConsole, "appdebugfilter", CrestronConsole.AddNewConsoleCommand(SetDebugFilterFromConsole, "appdebugfilter",
"appdebugfilter [params]", ConsoleAccessLevelEnum.AccessOperator); "appdebugfilter [params]", ConsoleAccessLevelEnum.AccessOperator);
} }
CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler; CrestronEnvironment.ProgramStatusEventHandler += CrestronEnvironment_ProgramStatusEventHandler;
@@ -224,7 +234,7 @@ namespace PepperDash.Core
Level = context.Level; Level = context.Level;
DoNotLoadConfigOnNextBoot = context.DoNotLoadOnNextBoot; 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)); 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) => _consoleLoggingLevelSwitch.MinimumLevelChanged += (sender, args) =>
@@ -233,6 +243,9 @@ namespace PepperDash.Core
}; };
} }
/// <summary>
/// UpdateLoggerConfiguration method
/// </summary>
public static void UpdateLoggerConfiguration(LoggerConfiguration config) public static void UpdateLoggerConfiguration(LoggerConfiguration config)
{ {
_loggerConfiguration = config; _loggerConfiguration = config;
@@ -240,6 +253,9 @@ namespace PepperDash.Core
_logger = config.CreateLogger(); _logger = config.CreateLogger();
} }
/// <summary>
/// ResetLoggerConfiguration method
/// </summary>
public static void ResetLoggerConfiguration() public static void ResetLoggerConfiguration()
{ {
_loggerConfiguration = _defaultLoggerConfiguration; _loggerConfiguration = _defaultLoggerConfiguration;
@@ -256,17 +272,21 @@ namespace PepperDash.Core
if (result != CrestronDataStore.CDS_ERROR.CDS_SUCCESS) 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"); CrestronConsole.Print($"Unable to retrieve stored log level for {levelStoreKey}.\r\nError: {result}.\r\nSetting level to {LogEventLevel.Information}\r\n");
CrestronDataStoreStatic.SetLocalIntValue(levelStoreKey, (int)LogEventLevel.Information);
return LogEventLevel.Information; return LogEventLevel.Information;
} }
if(logLevel < 0 || logLevel > 5) if (logLevel < 0 || logLevel > 5)
{ {
CrestronConsole.PrintLine($"Stored Log level not valid for {levelStoreKey}: {logLevel}. Setting level to {LogEventLevel.Information}"); CrestronConsole.PrintLine($"Stored Log level not valid for {levelStoreKey}: {logLevel}. Setting level to {LogEventLevel.Information}");
return LogEventLevel.Information; return LogEventLevel.Information;
} }
return (LogEventLevel)logLevel; return (LogEventLevel)logLevel;
} catch (Exception ex) }
catch (Exception ex)
{ {
CrestronConsole.PrintLine($"Exception retrieving log level for {levelStoreKey}: {ex.Message}"); CrestronConsole.PrintLine($"Exception retrieving log level for {levelStoreKey}: {ex.Message}");
return LogEventLevel.Information; return LogEventLevel.Information;
@@ -278,7 +298,7 @@ namespace PepperDash.Core
var assembly = Assembly.GetExecutingAssembly(); var assembly = Assembly.GetExecutingAssembly();
var ver = var ver =
assembly assembly
.GetCustomAttributes(typeof (AssemblyInformationalVersionAttribute), false); .GetCustomAttributes(typeof(AssemblyInformationalVersionAttribute), false);
if (ver != null && ver.Length > 0) if (ver != null && ver.Length > 0)
{ {
@@ -319,6 +339,9 @@ namespace PepperDash.Core
/// Callback for console command /// Callback for console command
/// </summary> /// </summary>
/// <param name="levelString"></param> /// <param name="levelString"></param>
/// <summary>
/// SetDebugFromConsole method
/// </summary>
public static void SetDebugFromConsole(string levelString) public static void SetDebugFromConsole(string levelString)
{ {
try try
@@ -326,13 +349,13 @@ namespace PepperDash.Core
if (levelString.Trim() == "?") if (levelString.Trim() == "?")
{ {
CrestronConsole.ConsoleCommandResponse( CrestronConsole.ConsoleCommandResponse(
$@"Used to set the minimum level of debug messages to be printed to the console: "Used to set the minimum level of debug messages to be printed to the console:\r\n" +
{_logLevels[0]} = 0 $"{_logLevels[0]} = 0\r\n" +
{_logLevels[1]} = 1 $"{_logLevels[1]} = 1\r\n" +
{_logLevels[2]} = 2 $"{_logLevels[2]} = 2\r\n" +
{_logLevels[3]} = 3 $"{_logLevels[3]} = 3\r\n" +
{_logLevels[4]} = 4 $"{_logLevels[4]} = 4\r\n" +
{_logLevels[5]} = 5"); $"{_logLevels[5]} = 5");
return; return;
} }
@@ -342,18 +365,18 @@ namespace PepperDash.Core
return; return;
} }
if(int.TryParse(levelString, out var levelInt)) if (int.TryParse(levelString, out var levelInt))
{ {
if(levelInt < 0 || levelInt > 5) 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"); CrestronConsole.ConsoleCommandResponse($"Error: Unable to parse {levelString} to valid log level. If using a number, value must be between 0-5");
return; return;
} }
SetDebugLevel((uint) levelInt); SetDebugLevel((uint)levelInt);
return; return;
} }
if(Enum.TryParse<LogEventLevel>(levelString, out var levelEnum)) if (Enum.TryParse<LogEventLevel>(levelString, true, out var levelEnum))
{ {
SetDebugLevel(levelEnum); SetDebugLevel(levelEnum);
return; return;
@@ -371,9 +394,12 @@ namespace PepperDash.Core
/// Sets the debug level /// Sets the debug level
/// </summary> /// </summary>
/// <param name="level"> Valid values 0-5</param> /// <param name="level"> Valid values 0-5</param>
/// <summary>
/// SetDebugLevel method
/// </summary>
public static void SetDebugLevel(uint level) public static void SetDebugLevel(uint level)
{ {
if(!_logLevels.TryGetValue(level, out var logLevel)) if (!_logLevels.TryGetValue(level, out var logLevel))
{ {
logLevel = LogEventLevel.Information; logLevel = LogEventLevel.Information;
@@ -385,6 +411,9 @@ namespace PepperDash.Core
SetDebugLevel(logLevel); SetDebugLevel(logLevel);
} }
/// <summary>
/// SetDebugLevel method
/// </summary>
public static void SetDebugLevel(LogEventLevel level) public static void SetDebugLevel(LogEventLevel level)
{ {
_consoleLoggingLevelSwitch.MinimumLevel = level; _consoleLoggingLevelSwitch.MinimumLevel = level;
@@ -392,9 +421,9 @@ namespace PepperDash.Core
CrestronConsole.ConsoleCommandResponse("[Application {0}], Debug level set to {1}\r\n", CrestronConsole.ConsoleCommandResponse("[Application {0}], Debug level set to {1}\r\n",
InitialParametersClass.ApplicationNumber, _consoleLoggingLevelSwitch.MinimumLevel); InitialParametersClass.ApplicationNumber, _consoleLoggingLevelSwitch.MinimumLevel);
CrestronConsole.ConsoleCommandResponse($"Storing level {level}:{(int) level}"); CrestronConsole.ConsoleCommandResponse($"Storing level {level}:{(int)level}");
var err = CrestronDataStoreStatic.SetLocalIntValue(LevelStoreKey, (int) level); var err = CrestronDataStoreStatic.SetLocalIntValue(LevelStoreKey, (int)level);
CrestronConsole.ConsoleCommandResponse($"Store result: {err}:{(int)level}"); CrestronConsole.ConsoleCommandResponse($"Store result: {err}:{(int)level}");
@@ -402,11 +431,14 @@ namespace PepperDash.Core
CrestronConsole.PrintLine($"Error saving console debug level setting: {err}"); CrestronConsole.PrintLine($"Error saving console debug level setting: {err}");
} }
/// <summary>
/// SetWebSocketMinimumDebugLevel method
/// </summary>
public static void SetWebSocketMinimumDebugLevel(LogEventLevel level) public static void SetWebSocketMinimumDebugLevel(LogEventLevel level)
{ {
_websocketLoggingLevelSwitch.MinimumLevel = level; _websocketLoggingLevelSwitch.MinimumLevel = level;
var err = CrestronDataStoreStatic.SetLocalUintValue(WebSocketLevelStoreKey, (uint) level); var err = CrestronDataStoreStatic.SetLocalUintValue(WebSocketLevelStoreKey, (uint)level);
if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS) if (err != CrestronDataStore.CDS_ERROR.CDS_SUCCESS)
LogMessage(LogEventLevel.Information, "Error saving websocket debug level setting: {erro}", err); LogMessage(LogEventLevel.Information, "Error saving websocket debug level setting: {erro}", err);
@@ -414,6 +446,9 @@ namespace PepperDash.Core
LogMessage(LogEventLevel.Information, "Websocket debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel); LogMessage(LogEventLevel.Information, "Websocket debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel);
} }
/// <summary>
/// SetErrorLogMinimumDebugLevel method
/// </summary>
public static void SetErrorLogMinimumDebugLevel(LogEventLevel level) public static void SetErrorLogMinimumDebugLevel(LogEventLevel level)
{ {
_errorLogLevelSwitch.MinimumLevel = level; _errorLogLevelSwitch.MinimumLevel = level;
@@ -426,6 +461,9 @@ namespace PepperDash.Core
LogMessage(LogEventLevel.Information, "Error log debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel); LogMessage(LogEventLevel.Information, "Error log debug level set to {0}", _websocketLoggingLevelSwitch.MinimumLevel);
} }
/// <summary>
/// SetFileMinimumDebugLevel method
/// </summary>
public static void SetFileMinimumDebugLevel(LogEventLevel level) public static void SetFileMinimumDebugLevel(LogEventLevel level)
{ {
_errorLogLevelSwitch.MinimumLevel = level; _errorLogLevelSwitch.MinimumLevel = level;
@@ -442,6 +480,9 @@ namespace PepperDash.Core
/// Callback for console command /// Callback for console command
/// </summary> /// </summary>
/// <param name="stateString"></param> /// <param name="stateString"></param>
/// <summary>
/// SetDoNotLoadOnNextBootFromConsole method
/// </summary>
public static void SetDoNotLoadOnNextBootFromConsole(string stateString) public static void SetDoNotLoadOnNextBootFromConsole(string stateString)
{ {
try try
@@ -464,80 +505,83 @@ namespace PepperDash.Core
/// Callback for console command /// Callback for console command
/// </summary> /// </summary>
/// <param name="items"></param> /// <param name="items"></param>
public static void SetDebugFilterFromConsole(string items) /// <summary>
{ /// SetDebugFilterFromConsole method
var str = items.Trim(); /// </summary>
if (str == "?") public static void SetDebugFilterFromConsole(string items)
{ {
CrestronConsole.ConsoleCommandResponse("Usage:\r APPDEBUGFILTER key1 key2 key3....\r " + var str = items.Trim();
"+all: at beginning puts filter into 'default include' mode\r" + if (str == "?")
" All keys that follow will be excluded from output.\r" + {
"-all: at beginning puts filter into 'default exclude all' mode.\r" + CrestronConsole.ConsoleCommandResponse("Usage:\r APPDEBUGFILTER key1 key2 key3....\r " +
" All keys that follow will be the only keys that are shown\r" + "+all: at beginning puts filter into 'default include' mode\r" +
"+nokey: Enables messages with no key (default)\r" + " All keys that follow will be excluded from output.\r" +
"-nokey: Disables messages with no key.\r" + "-all: at beginning puts filter into 'default exclude all' mode.\r" +
"(nokey settings are independent of all other settings)"); " All keys that follow will be the only keys that are shown\r" +
return; "+nokey: Enables messages with no key (default)\r" +
} "-nokey: Disables messages with no key.\r" +
var keys = Regex.Split(str, @"\s*"); "(nokey settings are independent of all other settings)");
foreach (var keyToken in keys) return;
{ }
var lkey = keyToken.ToLower(); var keys = Regex.Split(str, @"\s*");
if (lkey == "+all") foreach (var keyToken in keys)
{ {
IncludedExcludedKeys.Clear(); var lkey = keyToken.ToLower();
_excludeAllMode = false; if (lkey == "+all")
} {
else if (lkey == "-all") IncludedExcludedKeys.Clear();
{ _excludeAllMode = false;
IncludedExcludedKeys.Clear(); }
_excludeAllMode = true; else if (lkey == "-all")
} {
//else if (lkey == "+nokey") IncludedExcludedKeys.Clear();
//{ _excludeAllMode = true;
// ExcludeNoKeyMessages = false; }
//} //else if (lkey == "+nokey")
//else if (lkey == "-nokey") //{
//{ // ExcludeNoKeyMessages = false;
// ExcludeNoKeyMessages = true; //}
//} //else if (lkey == "-nokey")
else //{
{ // ExcludeNoKeyMessages = true;
string key; //}
if (lkey.StartsWith("-")) else
{ {
key = lkey.Substring(1); string key;
// if in exclude all mode, we need to remove this from the inclusions if (lkey.StartsWith("-"))
if (_excludeAllMode) {
{ key = lkey.Substring(1);
if (IncludedExcludedKeys.ContainsKey(key)) // if in exclude all mode, we need to remove this from the inclusions
IncludedExcludedKeys.Remove(key); if (_excludeAllMode)
} {
// otherwise include all mode, add to the exclusions if (IncludedExcludedKeys.ContainsKey(key))
else IncludedExcludedKeys.Remove(key);
{ }
IncludedExcludedKeys[key] = new object(); // otherwise include all mode, add to the exclusions
} else
} {
else if (lkey.StartsWith("+")) IncludedExcludedKeys[key] = new object();
{ }
key = lkey.Substring(1); }
// if in exclude all mode, we need to add this as inclusion else if (lkey.StartsWith("+"))
if (_excludeAllMode) {
{ key = lkey.Substring(1);
// if in exclude all mode, we need to add this as inclusion
if (_excludeAllMode)
{
IncludedExcludedKeys[key] = new object(); IncludedExcludedKeys[key] = new object();
} }
// otherwise include all mode, remove this from exclusions // otherwise include all mode, remove this from exclusions
else else
{ {
if (IncludedExcludedKeys.ContainsKey(key)) if (IncludedExcludedKeys.ContainsKey(key))
IncludedExcludedKeys.Remove(key); IncludedExcludedKeys.Remove(key);
} }
} }
} }
} }
} }
@@ -559,6 +603,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="deviceKey"></param> /// <param name="deviceKey"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetDeviceDebugSettingsForKey method
/// </summary>
public static object GetDeviceDebugSettingsForKey(string deviceKey) public static object GetDeviceDebugSettingsForKey(string deviceKey)
{ {
return _contexts.GetDebugSettingsForKey(deviceKey); return _contexts.GetDebugSettingsForKey(deviceKey);
@@ -579,7 +626,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// /// ShowDebugLog method
/// </summary> /// </summary>
public static void ShowDebugLog(string s) public static void ShowDebugLog(string s)
{ {
@@ -595,6 +642,9 @@ namespace PepperDash.Core
/// <param name="message">Message template</param> /// <param name="message">Message template</param>
/// <param name="device">Optional IKeyed device. If provided, the Key of the device will be added to the log message</param> /// <param name="device">Optional IKeyed device. If provided, the Key of the device will be added to the log message</param>
/// <param name="args">Args to put into message template</param> /// <param name="args">Args to put into message template</param>
/// <summary>
/// LogMessage method
/// </summary>
public static void LogMessage(Exception ex, string message, IKeyed device = null, params object[] args) public static void LogMessage(Exception ex, string message, IKeyed device = null, params object[] args)
{ {
using (LogContext.PushProperty("Key", device?.Key)) using (LogContext.PushProperty("Key", device?.Key))
@@ -618,21 +668,36 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// Logs a message at the specified log level.
/// </summary>
/// <param name="level">Level to log at</param>
/// <param name="message">Message template</param>
/// <param name="args">Args to put into message template</param>
public static void LogMessage(LogEventLevel level, string message, params object[] args) public static void LogMessage(LogEventLevel level, string message, params object[] args)
{ {
_logger.Write(level, message, args); _logger.Write(level, message, args);
} }
/// <summary>
/// LogMessage method
/// </summary>
public static void LogMessage(LogEventLevel level, Exception ex, string message, params object[] args) public static void LogMessage(LogEventLevel level, Exception ex, string message, params object[] args)
{ {
_logger.Write(level, ex, message, args); _logger.Write(level, ex, message, args);
} }
/// <summary>
/// LogMessage method
/// </summary>
public static void LogMessage(LogEventLevel level, IKeyed keyed, string message, params object[] args) public static void LogMessage(LogEventLevel level, IKeyed keyed, string message, params object[] args)
{ {
LogMessage(level, message, keyed, args); LogMessage(level, message, keyed, args);
} }
/// <summary>
/// LogMessage method
/// </summary>
public static void LogMessage(LogEventLevel level, Exception ex, IKeyed device, 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", device?.Key))
@@ -642,32 +707,47 @@ namespace PepperDash.Core
} }
#region Explicit methods for logging levels #region Explicit methods for logging levels
/// <summary>
/// LogVerbose method
/// </summary>
public static void LogVerbose(IKeyed keyed, string message, params object[] args) public static void LogVerbose(IKeyed keyed, string message, params object[] args)
{ {
using(LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
{ {
_logger.Write(LogEventLevel.Verbose, message, args); _logger.Write(LogEventLevel.Verbose, message, args);
} }
} }
/// <summary>
/// LogVerbose method
/// </summary>
public static void LogVerbose(Exception ex, IKeyed keyed, string message, params object[] args) public static void LogVerbose(Exception ex, IKeyed keyed, string message, params object[] args)
{ {
using(LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
{ {
_logger.Write(LogEventLevel.Verbose, ex, message, args); _logger.Write(LogEventLevel.Verbose, ex, message, args);
} }
} }
/// <summary>
/// LogVerbose method
/// </summary>
public static void LogVerbose(string message, params object[] args) public static void LogVerbose(string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Verbose, message, args); _logger.Write(LogEventLevel.Verbose, message, args);
} }
/// <summary>
/// LogVerbose method
/// </summary>
public static void LogVerbose(Exception ex, string message, params object[] args) public static void LogVerbose(Exception ex, string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Verbose, ex, null, message, args); _logger.Write(LogEventLevel.Verbose, ex, message, args);
} }
/// <summary>
/// LogDebug method
/// </summary>
public static void LogDebug(IKeyed keyed, string message, params object[] args) public static void LogDebug(IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -676,6 +756,9 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogDebug method
/// </summary>
public static void LogDebug(Exception ex, IKeyed keyed, string message, params object[] args) public static void LogDebug(Exception ex, IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -684,16 +767,25 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogDebug method
/// </summary>
public static void LogDebug(string message, params object[] args) public static void LogDebug(string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Debug, message, args); _logger.Write(LogEventLevel.Debug, message, args);
} }
/// <summary>
/// LogDebug method
/// </summary>
public static void LogDebug(Exception ex, string message, params object[] args) public static void LogDebug(Exception ex, string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Debug, ex, null, message, args); _logger.Write(LogEventLevel.Debug, ex, null, message, args);
} }
/// <summary>
/// LogInformation method
/// </summary>
public static void LogInformation(IKeyed keyed, string message, params object[] args) public static void LogInformation(IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -702,6 +794,9 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogInformation method
/// </summary>
public static void LogInformation(Exception ex, IKeyed keyed, string message, params object[] args) public static void LogInformation(Exception ex, IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -710,16 +805,25 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogInformation method
/// </summary>
public static void LogInformation(string message, params object[] args) public static void LogInformation(string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Information, message, args); _logger.Write(LogEventLevel.Information, message, args);
} }
/// <summary>
/// LogInformation method
/// </summary>
public static void LogInformation(Exception ex, string message, params object[] args) public static void LogInformation(Exception ex, string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Information, ex, null, message, args); _logger.Write(LogEventLevel.Information, ex, message, args);
} }
/// <summary>
/// LogWarning method
/// </summary>
public static void LogWarning(IKeyed keyed, string message, params object[] args) public static void LogWarning(IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -728,6 +832,9 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogWarning method
/// </summary>
public static void LogWarning(Exception ex, IKeyed keyed, string message, params object[] args) public static void LogWarning(Exception ex, IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -736,16 +843,25 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogWarning method
/// </summary>
public static void LogWarning(string message, params object[] args) public static void LogWarning(string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Warning, message, args); _logger.Write(LogEventLevel.Warning, message, args);
} }
/// <summary>
/// LogWarning method
/// </summary>
public static void LogWarning(Exception ex, string message, params object[] args) public static void LogWarning(Exception ex, string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Warning, ex, null, message, args); _logger.Write(LogEventLevel.Warning, ex, message, args);
} }
/// <summary>
/// LogError method
/// </summary>
public static void LogError(IKeyed keyed, string message, params object[] args) public static void LogError(IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -754,6 +870,9 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogError method
/// </summary>
public static void LogError(Exception ex, IKeyed keyed, string message, params object[] args) public static void LogError(Exception ex, IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -762,16 +881,25 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogError method
/// </summary>
public static void LogError(string message, params object[] args) public static void LogError(string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Error, message, args); _logger.Write(LogEventLevel.Error, message, args);
} }
/// <summary>
/// LogError method
/// </summary>
public static void LogError(Exception ex, string message, params object[] args) public static void LogError(Exception ex, string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Error, ex, null, message, args); _logger.Write(LogEventLevel.Error, ex, message, args);
} }
/// <summary>
/// LogFatal method
/// </summary>
public static void LogFatal(IKeyed keyed, string message, params object[] args) public static void LogFatal(IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -780,6 +908,9 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogFatal method
/// </summary>
public static void LogFatal(Exception ex, IKeyed keyed, string message, params object[] args) public static void LogFatal(Exception ex, IKeyed keyed, string message, params object[] args)
{ {
using (LogContext.PushProperty("Key", keyed?.Key)) using (LogContext.PushProperty("Key", keyed?.Key))
@@ -788,14 +919,20 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// LogFatal method
/// </summary>
public static void LogFatal(string message, params object[] args) public static void LogFatal(string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Fatal, message, args); _logger.Write(LogEventLevel.Fatal, message, args);
} }
/// <summary>
/// LogFatal method
/// </summary>
public static void LogFatal(Exception ex, string message, params object[] args) public static void LogFatal(Exception ex, string message, params object[] args)
{ {
_logger.Write(LogEventLevel.Fatal, ex, null, message, args); _logger.Write(LogEventLevel.Fatal, ex, message, args);
} }
#endregion #endregion
@@ -869,6 +1006,9 @@ namespace PepperDash.Core
/// Logs to Console when at-level, and all messages to error log /// Logs to Console when at-level, and all messages to error log
/// </summary> /// </summary>
[Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")] [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
/// <summary>
/// Console method
/// </summary>
public static void Console(uint level, ErrorLogLevel errorLogLevel, public static void Console(uint level, ErrorLogLevel errorLogLevel,
string format, params object[] items) string format, params object[] items)
{ {
@@ -881,6 +1021,9 @@ namespace PepperDash.Core
/// it will only be written to the log. /// it will only be written to the log.
/// </summary> /// </summary>
[Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")] [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later versions")]
/// <summary>
/// ConsoleWithLog method
/// </summary>
public static void ConsoleWithLog(uint level, string format, params object[] items) public static void ConsoleWithLog(uint level, string format, params object[] items)
{ {
LogMessage(level, format, items); LogMessage(level, format, items);
@@ -999,11 +1142,11 @@ namespace PepperDash.Core
return string.Format(@"\user\debugSettings\program{0}", InitialParametersClass.ApplicationNumber); 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); return string.Format("{0}{1}user{1}debugSettings{1}{2}.json", Directory.GetApplicationRootDirectory(), Path.DirectorySeparatorChar, InitialParametersClass.RoomId);
} }
/// <summary> /// <summary>
/// Error level to for message to be logged at /// Enumeration of ErrorLogLevel values
/// </summary> /// </summary>
public enum ErrorLogLevel public enum ErrorLogLevel
{ {

View File

@@ -11,10 +11,16 @@ using System.Text;
namespace PepperDash.Core namespace PepperDash.Core
{ {
/// <summary>
/// Represents a DebugConsoleSink
/// </summary>
public class DebugConsoleSink : ILogEventSink public class DebugConsoleSink : ILogEventSink
{ {
private readonly ITextFormatter _textFormatter; private readonly ITextFormatter _textFormatter;
/// <summary>
/// Emit method
/// </summary>
public void Emit(LogEvent logEvent) public void Emit(LogEvent logEvent)
{ {
if (!Debug.IsRunningOnAppliance) return; if (!Debug.IsRunningOnAppliance) return;
@@ -44,6 +50,9 @@ namespace PepperDash.Core
public static class DebugConsoleSinkExtensions public static class DebugConsoleSinkExtensions
{ {
/// <summary>
/// DebugConsoleSink method
/// </summary>
public static LoggerConfiguration DebugConsoleSink( public static LoggerConfiguration DebugConsoleSink(
this LoggerSinkConfiguration loggerConfiguration, this LoggerSinkConfiguration loggerConfiguration,
ITextFormatter formatProvider = null) ITextFormatter formatProvider = null)

View File

@@ -19,9 +19,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
public string Key { get; private set; } public string Key { get; private set; }
///// <summary> /// <summary>
///// The name of the file containing the current debug settings. /// The name of the file containing the current debug settings.
///// </summary> /// </summary>
//string FileName = string.Format(@"\nvram\debug\app{0}Debug.json", InitialParametersClass.ApplicationNumber); //string FileName = string.Format(@"\nvram\debug\app{0}Debug.json", InitialParametersClass.ApplicationNumber);
DebugContextSaveData SaveData; DebugContextSaveData SaveData;
@@ -38,6 +38,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetDebugContext method
/// </summary>
public static DebugContext GetDebugContext(string key) public static DebugContext GetDebugContext(string key)
{ {
var context = Contexts.FirstOrDefault(c => c.Key.Equals(key, StringComparison.OrdinalIgnoreCase)); var context = Contexts.FirstOrDefault(c => c.Key.Equals(key, StringComparison.OrdinalIgnoreCase));
@@ -92,6 +95,9 @@ namespace PepperDash.Core
/// Callback for console command /// Callback for console command
/// </summary> /// </summary>
/// <param name="levelString"></param> /// <param name="levelString"></param>
/// <summary>
/// SetDebugFromConsole method
/// </summary>
public void SetDebugFromConsole(string levelString) public void SetDebugFromConsole(string levelString)
{ {
try try
@@ -114,6 +120,9 @@ namespace PepperDash.Core
/// Sets the debug level /// Sets the debug level
/// </summary> /// </summary>
/// <param name="level"> Valid values 0 (no debug), 1 (critical), 2 (all messages)</param> /// <param name="level"> Valid values 0 (no debug), 1 (critical), 2 (all messages)</param>
/// <summary>
/// SetDebugLevel method
/// </summary>
public void SetDebugLevel(int level) public void SetDebugLevel(int level)
{ {
if (level <= 2) if (level <= 2)
@@ -141,7 +150,7 @@ namespace PepperDash.Core
} }
/// <summary> /// <summary>
/// Appends a device Key to the beginning of a message /// Console method
/// </summary> /// </summary>
public void Console(uint level, IKeyed dev, string format, params object[] items) public void Console(uint level, IKeyed dev, string format, params object[] items)
{ {
@@ -191,6 +200,9 @@ namespace PepperDash.Core
/// </summary> /// </summary>
/// <param name="errorLogLevel"></param> /// <param name="errorLogLevel"></param>
/// <param name="str"></param> /// <param name="str"></param>
/// <summary>
/// LogError method
/// </summary>
public void LogError(Debug.ErrorLogLevel errorLogLevel, string str) public void LogError(Debug.ErrorLogLevel errorLogLevel, string str)
{ {
string msg = string.Format("App {0}:{1}", InitialParametersClass.ApplicationNumber, str); string msg = string.Format("App {0}:{1}", InitialParametersClass.ApplicationNumber, str);

View File

@@ -5,8 +5,14 @@ using Serilog.Events;
namespace PepperDash.Core.Logging namespace PepperDash.Core.Logging
{ {
/// <summary>
/// Represents a DebugCrestronLoggerSink
/// </summary>
public class DebugCrestronLoggerSink : ILogEventSink public class DebugCrestronLoggerSink : ILogEventSink
{ {
/// <summary>
/// Emit method
/// </summary>
public void Emit(LogEvent logEvent) public void Emit(LogEvent logEvent)
{ {
if (!Debug.IsRunningOnAppliance) return; if (!Debug.IsRunningOnAppliance) return;

View File

@@ -11,6 +11,9 @@ using System.Threading.Tasks;
namespace PepperDash.Core.Logging namespace PepperDash.Core.Logging
{ {
/// <summary>
/// Represents a DebugErrorLogSink
/// </summary>
public class DebugErrorLogSink : ILogEventSink public class DebugErrorLogSink : ILogEventSink
{ {
private ITextFormatter _formatter; private ITextFormatter _formatter;
@@ -24,6 +27,9 @@ namespace PepperDash.Core.Logging
{LogEventLevel.Error, (msg) => ErrorLog.Error(msg) }, {LogEventLevel.Error, (msg) => ErrorLog.Error(msg) },
{LogEventLevel.Fatal, (msg) => ErrorLog.Error(msg) } {LogEventLevel.Fatal, (msg) => ErrorLog.Error(msg) }
}; };
/// <summary>
/// Emit method
/// </summary>
public void Emit(LogEvent logEvent) public void Emit(LogEvent logEvent)
{ {
string message; string message;

View File

@@ -1,74 +1,113 @@
using Serilog.Events; using System;
using System; using Serilog.Events;
using Log = PepperDash.Core.Debug; using Log = PepperDash.Core.Debug;
namespace PepperDash.Core.Logging namespace PepperDash.Core.Logging
{ {
public static class DebugExtensions public static class DebugExtensions
{ {
/// <summary>
/// LogException method
/// </summary>
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: device, args);
} }
/// <summary>
/// LogVerbose method
/// </summary>
public static void LogVerbose(this IKeyed device, Exception ex, string message, params object[] args) public static void LogVerbose(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Verbose, ex, message, device, args); Log.LogVerbose(ex, device, message, args);
} }
/// <summary>
/// LogVerbose method
/// </summary>
public static void LogVerbose(this IKeyed device, string message, params object[] args) public static void LogVerbose(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Verbose, device, message, args); Log.LogVerbose(device, message, args);
} }
/// <summary>
/// LogDebug method
/// </summary>
public static void LogDebug(this IKeyed device, Exception ex, string message, params object[] args) public static void LogDebug(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Debug, ex, message, device, args); Log.LogDebug(ex, device, message, args);
} }
/// <summary>
/// LogDebug method
/// </summary>
public static void LogDebug(this IKeyed device, string message, params object[] args) public static void LogDebug(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Debug, device, message, args); Log.LogDebug(device, message, args);
} }
/// <summary>
/// LogInformation method
/// </summary>
public static void LogInformation(this IKeyed device, Exception ex, string message, params object[] args) public static void LogInformation(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Information, ex, message, device, args); Log.LogInformation(ex, device, message, args);
} }
/// <summary>
/// LogInformation method
/// </summary>
public static void LogInformation(this IKeyed device, string message, params object[] args) public static void LogInformation(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Information, device, message, args); Log.LogInformation(device, message, args);
} }
/// <summary>
/// LogWarning method
/// </summary>
public static void LogWarning(this IKeyed device, Exception ex, string message, params object[] args) public static void LogWarning(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Warning, ex, message, device, args); Log.LogWarning(ex, device, message, args);
} }
/// <summary>
/// LogWarning method
/// </summary>
public static void LogWarning(this IKeyed device, string message, params object[] args) public static void LogWarning(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Warning, device, message, args); Log.LogWarning(device, message, args);
} }
/// <summary>
/// LogError method
/// </summary>
public static void LogError(this IKeyed device, Exception ex, string message, params object[] args) public static void LogError(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Error, ex, message, device, args); Log.LogError(ex, device, message, args);
} }
/// <summary>
/// LogError method
/// </summary>
public static void LogError(this IKeyed device, string message, params object[] args) public static void LogError(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Error, device, message, args); Log.LogError(device, message, args);
} }
/// <summary>
/// LogFatal method
/// </summary>
public static void LogFatal(this IKeyed device, Exception ex, string message, params object[] args) public static void LogFatal(this IKeyed device, Exception ex, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Fatal, ex, message, device, args); Log.LogFatal(ex, device, message, args);
} }
/// <summary>
/// LogFatal method
/// </summary>
public static void LogFatal(this IKeyed device, string message, params object[] args) public static void LogFatal(this IKeyed device, string message, params object[] args)
{ {
Log.LogMessage(LogEventLevel.Fatal, device, message, args); Log.LogFatal(device, message, args);
} }
} }
} }

View File

@@ -4,9 +4,9 @@ using Newtonsoft.Json;
namespace PepperDash.Core.Logging namespace PepperDash.Core.Logging
{ {
/// <summary> /// <summary>
/// Class to persist current Debug settings across program restarts /// Represents a DebugContextCollection
/// </summary> /// </summary>
public class DebugContextCollection public class DebugContextCollection
{ {
/// <summary> /// <summary>
@@ -39,6 +39,9 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
/// <param name="contextKey"></param> /// <param name="contextKey"></param>
/// <param name="level"></param> /// <param name="level"></param>
/// <summary>
/// SetLevel method
/// </summary>
public void SetLevel(string contextKey, int level) public void SetLevel(string contextKey, int level)
{ {
if (level < 0 || level > 2) if (level < 0 || level > 2)
@@ -51,6 +54,9 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
/// <param name="contextKey"></param> /// <param name="contextKey"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetOrCreateItem method
/// </summary>
public DebugContextItem GetOrCreateItem(string contextKey) public DebugContextItem GetOrCreateItem(string contextKey)
{ {
if (!_items.ContainsKey(contextKey)) if (!_items.ContainsKey(contextKey))
@@ -65,6 +71,9 @@ namespace PepperDash.Core.Logging
/// <param name="deviceKey"></param> /// <param name="deviceKey"></param>
/// <param name="settings"></param> /// <param name="settings"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// SetDebugSettingsForKey method
/// </summary>
public void SetDebugSettingsForKey(string deviceKey, object settings) public void SetDebugSettingsForKey(string deviceKey, object settings)
{ {
try try
@@ -89,6 +98,9 @@ namespace PepperDash.Core.Logging
/// </summary> /// </summary>
/// <param name="deviceKey"></param> /// <param name="deviceKey"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetDebugSettingsForKey method
/// </summary>
public object GetDebugSettingsForKey(string deviceKey) public object GetDebugSettingsForKey(string deviceKey)
{ {
return DeviceDebugSettings[deviceKey]; return DeviceDebugSettings[deviceKey];

View File

@@ -21,6 +21,9 @@ using Serilog.Formatting.Json;
namespace PepperDash.Core namespace PepperDash.Core
{ {
/// <summary>
/// Represents a DebugWebsocketSink
/// </summary>
public class DebugWebsocketSink : ILogEventSink public class DebugWebsocketSink : ILogEventSink
{ {
private HttpServer _httpsServer; private HttpServer _httpsServer;
@@ -47,6 +50,9 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// Gets or sets the IsRunning
/// </summary>
public bool IsRunning { get => _httpsServer?.IsListening ?? false; } public bool IsRunning { get => _httpsServer?.IsListening ?? false; }
@@ -105,6 +111,9 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// Emit method
/// </summary>
public void Emit(LogEvent logEvent) public void Emit(LogEvent logEvent)
{ {
if (_httpsServer == null || !_httpsServer.IsListening) return; if (_httpsServer == null || !_httpsServer.IsListening) return;
@@ -116,6 +125,9 @@ namespace PepperDash.Core
} }
/// <summary>
/// StartServerAndSetPort method
/// </summary>
public void StartServerAndSetPort(int port) public void StartServerAndSetPort(int port)
{ {
Debug.Console(0, "Starting Websocket Server on port: {0}", port); Debug.Console(0, "Starting Websocket Server on port: {0}", port);
@@ -193,6 +205,9 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// StopServer method
/// </summary>
public void StopServer() public void StopServer()
{ {
Debug.Console(0, "Stopping Websocket Server"); Debug.Console(0, "Stopping Websocket Server");
@@ -204,6 +219,9 @@ namespace PepperDash.Core
public static class DebugWebsocketSinkExtensions public static class DebugWebsocketSinkExtensions
{ {
/// <summary>
/// DebugWebsocketSink method
/// </summary>
public static LoggerConfiguration DebugWebsocketSink( public static LoggerConfiguration DebugWebsocketSink(
this LoggerSinkConfiguration loggerConfiguration, this LoggerSinkConfiguration loggerConfiguration,
ITextFormatter formatProvider = null) ITextFormatter formatProvider = null)
@@ -212,6 +230,9 @@ namespace PepperDash.Core
} }
} }
/// <summary>
/// Represents a DebugClient
/// </summary>
public class DebugClient : WebSocketBehavior public class DebugClient : WebSocketBehavior
{ {
private DateTime _connectionTime; private DateTime _connectionTime;

View File

@@ -2,9 +2,9 @@
namespace PepperDash.Core.PasswordManagement namespace PepperDash.Core.PasswordManagement
{ {
/// <summary> /// <summary>
/// A class to allow user interaction with the PasswordManager /// Represents a PasswordClient
/// </summary> /// </summary>
public class PasswordClient public class PasswordClient
{ {
/// <summary> /// <summary>
@@ -59,6 +59,9 @@ namespace PepperDash.Core.PasswordManagement
/// Retrieve password by index /// Retrieve password by index
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key"></param>
/// <summary>
/// GetPasswordByIndex method
/// </summary>
public void GetPasswordByIndex(ushort key) public void GetPasswordByIndex(ushort key)
{ {
OnUshrtChange((ushort)PasswordManager.Passwords.Count, 0, PasswordManagementConstants.PasswordManagerCountChange); OnUshrtChange((ushort)PasswordManager.Passwords.Count, 0, PasswordManagementConstants.PasswordManagerCountChange);
@@ -81,6 +84,9 @@ namespace PepperDash.Core.PasswordManagement
/// Password validation method /// Password validation method
/// </summary> /// </summary>
/// <param name="password"></param> /// <param name="password"></param>
/// <summary>
/// ValidatePassword method
/// </summary>
public void ValidatePassword(string password) public void ValidatePassword(string password)
{ {
if (string.IsNullOrEmpty(password)) if (string.IsNullOrEmpty(password))
@@ -99,6 +105,9 @@ namespace PepperDash.Core.PasswordManagement
/// password against the selected password when the length of the 2 are equal /// password against the selected password when the length of the 2 are equal
/// </summary> /// </summary>
/// <param name="data"></param> /// <param name="data"></param>
/// <summary>
/// BuildPassword method
/// </summary>
public void BuildPassword(string data) public void BuildPassword(string data)
{ {
PasswordToValidate = String.Concat(PasswordToValidate, data); PasswordToValidate = String.Concat(PasswordToValidate, data);
@@ -108,9 +117,9 @@ namespace PepperDash.Core.PasswordManagement
ValidatePassword(PasswordToValidate); ValidatePassword(PasswordToValidate);
} }
/// <summary> /// <summary>
/// Clears the user entered password and resets the LEDs /// ClearPassword method
/// </summary> /// </summary>
public void ClearPassword() public void ClearPassword()
{ {
PasswordToValidate = ""; PasswordToValidate = "";

View File

@@ -4,9 +4,9 @@ using Crestron.SimplSharp;
namespace PepperDash.Core.PasswordManagement namespace PepperDash.Core.PasswordManagement
{ {
/// <summary> /// <summary>
/// Allows passwords to be stored and managed /// Represents a PasswordManager
/// </summary> /// </summary>
public class PasswordManager public class PasswordManager
{ {
/// <summary> /// <summary>
@@ -71,6 +71,9 @@ namespace PepperDash.Core.PasswordManagement
/// </summary> /// </summary>
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="password"></param> /// <param name="password"></param>
/// <summary>
/// UpdatePassword method
/// </summary>
public void UpdatePassword(ushort key, string password) public void UpdatePassword(ushort key, string password)
{ {
// validate the parameters // validate the parameters
@@ -152,6 +155,9 @@ namespace PepperDash.Core.PasswordManagement
/// Method to change the default timer value, (default 5000ms/5s) /// Method to change the default timer value, (default 5000ms/5s)
/// </summary> /// </summary>
/// <param name="time"></param> /// <param name="time"></param>
/// <summary>
/// PasswordTimerMs method
/// </summary>
public void PasswordTimerMs(ushort time) public void PasswordTimerMs(ushort time)
{ {
PasswordTimerElapsedMs = Convert.ToInt64(time); PasswordTimerElapsedMs = Convert.ToInt64(time);

View File

@@ -68,9 +68,9 @@ namespace PepperDash.Core.SystemInfo
public const ushort ProgramConfigChange = 305; public const ushort ProgramConfigChange = 305;
} }
/// <summary> /// <summary>
/// Processor Change Event Args Class /// Represents a ProcessorChangeEventArgs
/// </summary> /// </summary>
public class ProcessorChangeEventArgs : EventArgs public class ProcessorChangeEventArgs : EventArgs
{ {
/// <summary> /// <summary>
@@ -114,9 +114,9 @@ namespace PepperDash.Core.SystemInfo
} }
} }
/// <summary> /// <summary>
/// Ethernet Change Event Args Class /// Represents a EthernetChangeEventArgs
/// </summary> /// </summary>
public class EthernetChangeEventArgs : EventArgs public class EthernetChangeEventArgs : EventArgs
{ {
/// <summary> /// <summary>
@@ -165,9 +165,9 @@ namespace PepperDash.Core.SystemInfo
} }
} }
/// <summary> /// <summary>
/// Control Subnet Chage Event Args Class /// Represents a ControlSubnetChangeEventArgs
/// </summary> /// </summary>
public class ControlSubnetChangeEventArgs : EventArgs public class ControlSubnetChangeEventArgs : EventArgs
{ {
/// <summary> /// <summary>
@@ -211,9 +211,9 @@ namespace PepperDash.Core.SystemInfo
} }
} }
/// <summary> /// <summary>
/// Program Change Event Args Class /// Represents a ProgramChangeEventArgs
/// </summary> /// </summary>
public class ProgramChangeEventArgs : EventArgs public class ProgramChangeEventArgs : EventArgs
{ {
/// <summary> /// <summary>

View File

@@ -100,9 +100,9 @@ namespace PepperDash.Core.SystemInfo
OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange); OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange);
} }
/// <summary> /// <summary>
/// Gets the current ethernet info /// GetEthernetInfo method
/// </summary> /// </summary>
public void GetEthernetInfo() public void GetEthernetInfo()
{ {
OnBoolChange(true, 0, SystemInfoConstants.BusyBoolChange); OnBoolChange(true, 0, SystemInfoConstants.BusyBoolChange);
@@ -161,9 +161,9 @@ namespace PepperDash.Core.SystemInfo
OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange); OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange);
} }
/// <summary> /// <summary>
/// Gets the current control subnet info /// GetControlSubnetInfo method
/// </summary> /// </summary>
public void GetControlSubnetInfo() public void GetControlSubnetInfo()
{ {
OnBoolChange(true, 0, SystemInfoConstants.BusyBoolChange); OnBoolChange(true, 0, SystemInfoConstants.BusyBoolChange);
@@ -206,6 +206,9 @@ namespace PepperDash.Core.SystemInfo
/// Gets the program info by index /// Gets the program info by index
/// </summary> /// </summary>
/// <param name="index"></param> /// <param name="index"></param>
/// <summary>
/// GetProgramInfoByIndex method
/// </summary>
public void GetProgramInfoByIndex(ushort index) public void GetProgramInfoByIndex(ushort index)
{ {
if (index < 1 || index > 10) if (index < 1 || index > 10)
@@ -263,9 +266,9 @@ namespace PepperDash.Core.SystemInfo
OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange); OnBoolChange(false, 0, SystemInfoConstants.BusyBoolChange);
} }
/// <summary> /// <summary>
/// Gets the processor uptime and passes it to S+ /// RefreshProcessorUptime method
/// </summary> /// </summary>
public void RefreshProcessorUptime() public void RefreshProcessorUptime()
{ {
try try
@@ -287,6 +290,9 @@ namespace PepperDash.Core.SystemInfo
/// Gets the program uptime, by index, and passes it to S+ /// Gets the program uptime, by index, and passes it to S+
/// </summary> /// </summary>
/// <param name="index"></param> /// <param name="index"></param>
/// <summary>
/// RefreshProgramUptimeByIndex method
/// </summary>
public void RefreshProgramUptimeByIndex(int index) public void RefreshProgramUptimeByIndex(int index)
{ {
try try
@@ -308,6 +314,9 @@ namespace PepperDash.Core.SystemInfo
/// Sends command to console, passes response back using string change event /// Sends command to console, passes response back using string change event
/// </summary> /// </summary>
/// <param name="cmd"></param> /// <param name="cmd"></param>
/// <summary>
/// SendConsoleCommand method
/// </summary>
public void SendConsoleCommand(string cmd) public void SendConsoleCommand(string cmd)
{ {
if (string.IsNullOrEmpty(cmd)) if (string.IsNullOrEmpty(cmd))

View File

@@ -35,6 +35,9 @@ namespace PepperDash.Core
return issuerCertificate; return issuerCertificate;
} }
/// <summary>
/// IssueCertificate method
/// </summary>
public X509Certificate2 IssueCertificate(string subjectName, X509Certificate2 issuerCertificate, string[] subjectAlternativeNames, KeyPurposeID[] usages) public X509Certificate2 IssueCertificate(string subjectName, X509Certificate2 issuerCertificate, string[] subjectAlternativeNames, KeyPurposeID[] usages)
{ {
// It's self-signed, so these are the same. // It's self-signed, so these are the same.
@@ -56,6 +59,9 @@ namespace PepperDash.Core
return ConvertCertificate(certificate, subjectKeyPair, random); return ConvertCertificate(certificate, subjectKeyPair, random);
} }
/// <summary>
/// CreateCertificateAuthorityCertificate method
/// </summary>
public X509Certificate2 CreateCertificateAuthorityCertificate(string subjectName, string[] subjectAlternativeNames, KeyPurposeID[] usages) public X509Certificate2 CreateCertificateAuthorityCertificate(string subjectName, string[] subjectAlternativeNames, KeyPurposeID[] usages)
{ {
// It's self-signed, so these are the same. // It's self-signed, so these are the same.
@@ -78,6 +84,9 @@ namespace PepperDash.Core
return ConvertCertificate(certificate, subjectKeyPair, random); return ConvertCertificate(certificate, subjectKeyPair, random);
} }
/// <summary>
/// CreateSelfSignedCertificate method
/// </summary>
public X509Certificate2 CreateSelfSignedCertificate(string subjectName, string[] subjectAlternativeNames, KeyPurposeID[] usages) public X509Certificate2 CreateSelfSignedCertificate(string subjectName, string[] subjectAlternativeNames, KeyPurposeID[] usages)
{ {
// It's self-signed, so these are the same. // It's self-signed, so these are the same.
@@ -305,6 +314,9 @@ namespace PepperDash.Core
return convertedCertificate; return convertedCertificate;
} }
/// <summary>
/// WriteCertificate method
/// </summary>
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. // This password is the one attached to the PFX file. Use 'null' for no password.
@@ -332,6 +344,9 @@ namespace PepperDash.Core
} }
} }
} }
/// <summary>
/// AddCertToStore method
/// </summary>
public bool AddCertToStore(X509Certificate2 cert, System.Security.Cryptography.X509Certificates.StoreName st, System.Security.Cryptography.X509Certificates.StoreLocation sl) public bool AddCertToStore(X509Certificate2 cert, System.Security.Cryptography.X509Certificates.StoreName st, System.Security.Cryptography.X509Certificates.StoreLocation sl)
{ {
bool bRet = false; bool bRet = false;

View File

@@ -2,9 +2,9 @@
namespace PepperDash.Core.Web.RequestHandlers namespace PepperDash.Core.Web.RequestHandlers
{ {
/// <summary> /// <summary>
/// Web API default request handler /// Represents a DefaultRequestHandler
/// </summary> /// </summary>
public class DefaultRequestHandler : WebApiBaseRequestHandler public class DefaultRequestHandler : WebApiBaseRequestHandler
{ {
/// <summary> /// <summary>

View File

@@ -142,6 +142,9 @@ namespace PepperDash.Core.Web.RequestHandlers
/// Process request /// Process request
/// </summary> /// </summary>
/// <param name="context"></param> /// <param name="context"></param>
/// <summary>
/// ProcessRequest method
/// </summary>
public void ProcessRequest(HttpCwsContext context) public void ProcessRequest(HttpCwsContext context)
{ {
if (!_handlers.TryGetValue(context.Request.HttpMethod, out Func<HttpCwsContext, Task> handler)) if (!_handlers.TryGetValue(context.Request.HttpMethod, out Func<HttpCwsContext, Task> handler))

View File

@@ -144,6 +144,9 @@ namespace PepperDash.Core.Web.RequestHandlers
/// Process request /// Process request
/// </summary> /// </summary>
/// <param name="context"></param> /// <param name="context"></param>
/// <summary>
/// ProcessRequest method
/// </summary>
public void ProcessRequest(HttpCwsContext context) public void ProcessRequest(HttpCwsContext context)
{ {
Action<HttpCwsContext> handler; Action<HttpCwsContext> handler;

View File

@@ -25,24 +25,24 @@ namespace PepperDash.Core.Web
private readonly CCriticalSection _serverLock = new CCriticalSection(); private readonly CCriticalSection _serverLock = new CCriticalSection();
private HttpCwsServer _server; private HttpCwsServer _server;
/// <summary> /// <summary>
/// Web API server key /// Gets or sets the Key
/// </summary> /// </summary>
public string Key { get; private set; } public string Key { get; private set; }
/// <summary> /// <summary>
/// Web API server name /// Gets or sets the Name
/// </summary> /// </summary>
public string Name { get; private set; } public string Name { get; private set; }
/// <summary> /// <summary>
/// CWS base path, will default to "/api" if not set via initialize method /// Gets or sets the BasePath
/// </summary> /// </summary>
public string BasePath { get; private set; } public string BasePath { get; private set; }
/// <summary> /// <summary>
/// Indicates CWS is registered with base path /// Gets or sets the IsRegistered
/// </summary> /// </summary>
public bool IsRegistered { get; private set; } public bool IsRegistered { get; private set; }
/// <summary> /// <summary>
@@ -137,9 +137,9 @@ namespace PepperDash.Core.Web
Start(); Start();
} }
/// <summary> /// <summary>
/// Initializes CWS class /// Initialize method
/// </summary> /// </summary>
public void Initialize(string key, string basePath) public void Initialize(string key, string basePath)
{ {
Key = key; Key = key;
@@ -165,6 +165,9 @@ namespace PepperDash.Core.Web
/// Removes a route from CWS /// Removes a route from CWS
/// </summary> /// </summary>
/// <param name="route"></param> /// <param name="route"></param>
/// <summary>
/// RemoveRoute method
/// </summary>
public void RemoveRoute(HttpCwsRoute route) public void RemoveRoute(HttpCwsRoute route)
{ {
if (route == null) if (route == null)
@@ -176,9 +179,9 @@ namespace PepperDash.Core.Web
_server.Routes.Remove(route); _server.Routes.Remove(route);
} }
/// <summary> /// <summary>
/// Returns a list of the current routes /// GetRouteCollection method
/// </summary> /// </summary>
public HttpCwsRouteCollection GetRouteCollection() public HttpCwsRouteCollection GetRouteCollection()
{ {
return _server.Routes; return _server.Routes;
@@ -222,9 +225,9 @@ namespace PepperDash.Core.Web
} }
} }
/// <summary> /// <summary>
/// Stop CWS instance /// Stop method
/// </summary> /// </summary>
public void Stop() public void Stop()
{ {
try try

View File

@@ -2,9 +2,9 @@
namespace PepperDash.Core.WebApi.Presets namespace PepperDash.Core.WebApi.Presets
{ {
/// <summary> /// <summary>
/// Represents a preset /// Represents a Preset
/// </summary> /// </summary>
public class Preset public class Preset
{ {
/// <summary> /// <summary>
@@ -12,29 +12,29 @@ namespace PepperDash.Core.WebApi.Presets
/// </summary> /// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary> /// <summary>
/// User ID /// Gets or sets the UserId
/// </summary> /// </summary>
public int UserId { get; set; } public int UserId { get; set; }
/// <summary> /// <summary>
/// Room Type ID /// Gets or sets the RoomTypeId
/// </summary> /// </summary>
public int RoomTypeId { get; set; } public int RoomTypeId { get; set; }
/// <summary> /// <summary>
/// Preset Name /// Gets or sets the PresetName
/// </summary> /// </summary>
public string PresetName { get; set; } public string PresetName { get; set; }
/// <summary> /// <summary>
/// Preset Number /// Gets or sets the PresetNumber
/// </summary> /// </summary>
public int PresetNumber { get; set; } public int PresetNumber { get; set; }
/// <summary> /// <summary>
/// Preset Data /// Gets or sets the Data
/// </summary> /// </summary>
public string Data { get; set; } public string Data { get; set; }
/// <summary> /// <summary>
@@ -48,9 +48,9 @@ namespace PepperDash.Core.WebApi.Presets
} }
} }
/// <summary> /// <summary>
/// /// Represents a PresetReceivedEventArgs
/// </summary> /// </summary>
public class PresetReceivedEventArgs : EventArgs public class PresetReceivedEventArgs : EventArgs
{ {
/// <summary> /// <summary>
@@ -59,12 +59,12 @@ namespace PepperDash.Core.WebApi.Presets
public bool LookupSuccess { get; private set; } public bool LookupSuccess { get; private set; }
/// <summary> /// <summary>
/// S+ helper /// Gets or sets the ULookupSuccess
/// </summary> /// </summary>
public ushort ULookupSuccess { get { return (ushort)(LookupSuccess ? 1 : 0); } } public ushort ULookupSuccess { get { return (ushort)(LookupSuccess ? 1 : 0); } }
/// <summary> /// <summary>
/// The preset /// Gets or sets the Preset
/// </summary> /// </summary>
public Preset Preset { get; private set; } public Preset Preset { get; private set; }

View File

@@ -16,19 +16,19 @@ namespace PepperDash.Core.WebApi.Presets
/// </summary> /// </summary>
public int Id { get; set; } public int Id { get; set; }
/// <summary> /// <summary>
/// /// Gets or sets the ExternalId
/// </summary> /// </summary>
public string ExternalId { get; set; } public string ExternalId { get; set; }
/// <summary> /// <summary>
/// /// Gets or sets the FirstName
/// </summary> /// </summary>
public string FirstName { get; set; } public string FirstName { get; set; }
/// <summary> /// <summary>
/// /// Gets or sets the LastName
/// </summary> /// </summary>
public string LastName { get; set; } public string LastName { get; set; }
} }
@@ -44,13 +44,13 @@ namespace PepperDash.Core.WebApi.Presets
public bool LookupSuccess { get; private set; } public bool LookupSuccess { get; private set; }
/// <summary> /// <summary>
/// For stupid S+ /// Gets or sets the ULookupSuccess
/// </summary> /// </summary>
public ushort ULookupSuccess { get { return (ushort)(LookupSuccess ? 1 : 0); } } public ushort ULookupSuccess { get { return (ushort)(LookupSuccess ? 1 : 0); } }
/// <summary> /// <summary>
/// /// Gets or sets the User
/// </summary> /// </summary>
public User User { get; private set; } public User User { get; private set; }
/// <summary> /// <summary>
@@ -70,9 +70,9 @@ namespace PepperDash.Core.WebApi.Presets
} }
} }
/// <summary> /// <summary>
/// /// Represents a UserAndRoomMessage
/// </summary> /// </summary>
public class UserAndRoomMessage public class UserAndRoomMessage
{ {
/// <summary> /// <summary>
@@ -80,14 +80,14 @@ namespace PepperDash.Core.WebApi.Presets
/// </summary> /// </summary>
public int UserId { get; set; } public int UserId { get; set; }
/// <summary> /// <summary>
/// /// Gets or sets the RoomTypeId
/// </summary> /// </summary>
public int RoomTypeId { get; set; } public int RoomTypeId { get; set; }
/// <summary> /// <summary>
/// /// Gets or sets the PresetNumber
/// </summary> /// </summary>
public int PresetNumber { get; set; } public int PresetNumber { get; set; }
} }
} }

View File

@@ -25,9 +25,9 @@ namespace PepperDash.Core.WebApi.Presets
/// </summary> /// </summary>
public event EventHandler<PresetReceivedEventArgs> PresetReceived; public event EventHandler<PresetReceivedEventArgs> PresetReceived;
/// <summary> /// <summary>
/// Unique identifier for this instance /// Gets or sets the Key
/// </summary> /// </summary>
public string Key { get; private set; } public string Key { get; private set; }
//string JsonMasterKey; //string JsonMasterKey;
@@ -77,6 +77,9 @@ namespace PepperDash.Core.WebApi.Presets
/// Gets the user for a passcode /// Gets the user for a passcode
/// </summary> /// </summary>
/// <param name="passcode"></param> /// <param name="passcode"></param>
/// <summary>
/// GetUserForPasscode method
/// </summary>
public void GetUserForPasscode(string passcode) public void GetUserForPasscode(string passcode)
{ {
// Bullshit duplicate code here... These two cases should be the same // Bullshit duplicate code here... These two cases should be the same
@@ -115,6 +118,9 @@ namespace PepperDash.Core.WebApi.Presets
/// </summary> /// </summary>
/// <param name="roomTypeId"></param> /// <param name="roomTypeId"></param>
/// <param name="presetNumber"></param> /// <param name="presetNumber"></param>
/// <summary>
/// GetPresetForThisUser method
/// </summary>
public void GetPresetForThisUser(int roomTypeId, int presetNumber) public void GetPresetForThisUser(int roomTypeId, int presetNumber)
{ {
if (CurrentUser == null) if (CurrentUser == null)
@@ -212,6 +218,9 @@ namespace PepperDash.Core.WebApi.Presets
/// </summary> /// </summary>
/// <param name="roomTypeId"></param> /// <param name="roomTypeId"></param>
/// <param name="presetNumber"></param> /// <param name="presetNumber"></param>
/// <summary>
/// SavePresetForThisUser method
/// </summary>
public void SavePresetForThisUser(int roomTypeId, int presetNumber) public void SavePresetForThisUser(int roomTypeId, int presetNumber)
{ {
if (CurrentPreset == null) if (CurrentPreset == null)

View File

@@ -59,6 +59,9 @@ namespace PepperDash.Core.Intersystem.Tokens
/// </summary> /// </summary>
/// <param name="offset"></param> /// <param name="offset"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetTokenWithOffset method
/// </summary>
public override XSigToken GetTokenWithOffset(int offset) public override XSigToken GetTokenWithOffset(int offset)
{ {
if (offset == 0) return this; if (offset == 0) return this;
@@ -69,6 +72,10 @@ namespace PepperDash.Core.Intersystem.Tokens
/// ///
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// ToString method
/// </summary>
/// <inheritdoc />
public override string ToString() public override string ToString()
{ {
return Index + " = 0x" + Value.ToString("X4"); return Index + " = 0x" + Value.ToString("X4");
@@ -80,6 +87,9 @@ namespace PepperDash.Core.Intersystem.Tokens
/// <param name="format"></param> /// <param name="format"></param>
/// <param name="formatProvider"></param> /// <param name="formatProvider"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// ToString method
/// </summary>
public string ToString(string format, IFormatProvider formatProvider) public string ToString(string format, IFormatProvider formatProvider)
{ {
return Value.ToString(format, formatProvider); return Value.ToString(format, formatProvider);

View File

@@ -57,6 +57,9 @@ namespace PepperDash.Core.Intersystem.Tokens
/// </summary> /// </summary>
/// <param name="offset"></param> /// <param name="offset"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetTokenWithOffset method
/// </summary>
public override XSigToken GetTokenWithOffset(int offset) public override XSigToken GetTokenWithOffset(int offset)
{ {
if (offset == 0) return this; if (offset == 0) return this;
@@ -67,6 +70,10 @@ namespace PepperDash.Core.Intersystem.Tokens
/// ///
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// ToString method
/// </summary>
/// <inheritdoc />
public override string ToString() public override string ToString()
{ {
return Index + " = " + (Value ? "High" : "Low"); return Index + " = " + (Value ? "High" : "Low");
@@ -77,6 +84,9 @@ namespace PepperDash.Core.Intersystem.Tokens
/// </summary> /// </summary>
/// <param name="formatProvider"></param> /// <param name="formatProvider"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// ToString method
/// </summary>
public string ToString(IFormatProvider formatProvider) public string ToString(IFormatProvider formatProvider)
{ {
return Value.ToString(formatProvider); return Value.ToString(formatProvider);

View File

@@ -63,6 +63,9 @@ namespace PepperDash.Core.Intersystem.Tokens
/// </summary> /// </summary>
/// <param name="offset"></param> /// <param name="offset"></param>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// GetTokenWithOffset method
/// </summary>
public override XSigToken GetTokenWithOffset(int offset) public override XSigToken GetTokenWithOffset(int offset)
{ {
if (offset == 0) return this; if (offset == 0) return this;
@@ -73,6 +76,10 @@ namespace PepperDash.Core.Intersystem.Tokens
/// ///
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
/// <summary>
/// ToString method
/// </summary>
/// <inheritdoc />
public override string ToString() public override string ToString()
{ {
return Index + " = \"" + Value + "\""; return Index + " = \"" + Value + "\"";

View File

@@ -52,6 +52,9 @@ namespace PepperDash.Core.Intersystem
/// </summary> /// </summary>
/// <param name="xSigSerialization">XSig state resolver.</param> /// <param name="xSigSerialization">XSig state resolver.</param>
/// <returns>Bytes in XSig format for each token within the state representation.</returns> /// <returns>Bytes in XSig format for each token within the state representation.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(IXSigSerialization xSigSerialization) public static byte[] GetBytes(IXSigSerialization xSigSerialization)
{ {
return GetBytes(xSigSerialization, 0); return GetBytes(xSigSerialization, 0);
@@ -63,6 +66,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="xSigSerialization">XSig state resolver.</param> /// <param name="xSigSerialization">XSig state resolver.</param>
/// <param name="offset">Offset to which the data will be aligned.</param> /// <param name="offset">Offset to which the data will be aligned.</param>
/// <returns>Bytes in XSig format for each token within the state representation.</returns> /// <returns>Bytes in XSig format for each token within the state representation.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(IXSigSerialization xSigSerialization, int offset) public static byte[] GetBytes(IXSigSerialization xSigSerialization, int offset)
{ {
var tokens = xSigSerialization.Serialize(); var tokens = xSigSerialization.Serialize();
@@ -82,6 +88,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="index">1-based digital index</param> /// <param name="index">1-based digital index</param>
/// <param name="value">Digital data to be encoded</param> /// <param name="value">Digital data to be encoded</param>
/// <returns>Bytes in XSig format for digtial information.</returns> /// <returns>Bytes in XSig format for digtial information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int index, bool value) public static byte[] GetBytes(int index, bool value)
{ {
return GetBytes(index, 0, value); return GetBytes(index, 0, value);
@@ -94,6 +103,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="offset">Index offset.</param> /// <param name="offset">Index offset.</param>
/// <param name="value">Digital data to be encoded</param> /// <param name="value">Digital data to be encoded</param>
/// <returns>Bytes in XSig format for digtial information.</returns> /// <returns>Bytes in XSig format for digtial information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int index, int offset, bool value) public static byte[] GetBytes(int index, int offset, bool value)
{ {
return new XSigDigitalToken(index + offset, value).GetBytes(); return new XSigDigitalToken(index + offset, value).GetBytes();
@@ -105,6 +117,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="startIndex">Starting index of the sequence.</param> /// <param name="startIndex">Starting index of the sequence.</param>
/// <param name="values">Digital signal value array.</param> /// <param name="values">Digital signal value array.</param>
/// <returns>Byte sequence in XSig format for digital signal information.</returns> /// <returns>Byte sequence in XSig format for digital signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int startIndex, bool[] values) public static byte[] GetBytes(int startIndex, bool[] values)
{ {
return GetBytes(startIndex, 0, values); return GetBytes(startIndex, 0, values);
@@ -117,6 +132,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="offset">Index offset.</param> /// <param name="offset">Index offset.</param>
/// <param name="values">Digital signal value array.</param> /// <param name="values">Digital signal value array.</param>
/// <returns>Byte sequence in XSig format for digital signal information.</returns> /// <returns>Byte sequence in XSig format for digital signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int startIndex, int offset, bool[] values) public static byte[] GetBytes(int startIndex, int offset, bool[] values)
{ {
// Digital XSig data is 2 bytes per value // Digital XSig data is 2 bytes per value
@@ -134,6 +152,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="index">1-based analog index</param> /// <param name="index">1-based analog index</param>
/// <param name="value">Analog data to be encoded</param> /// <param name="value">Analog data to be encoded</param>
/// <returns>Bytes in XSig format for analog signal information.</returns> /// <returns>Bytes in XSig format for analog signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int index, ushort value) public static byte[] GetBytes(int index, ushort value)
{ {
return GetBytes(index, 0, value); return GetBytes(index, 0, value);
@@ -146,6 +167,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="offset">Index offset.</param> /// <param name="offset">Index offset.</param>
/// <param name="value">Analog data to be encoded</param> /// <param name="value">Analog data to be encoded</param>
/// <returns>Bytes in XSig format for analog signal information.</returns> /// <returns>Bytes in XSig format for analog signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int index, int offset, ushort value) public static byte[] GetBytes(int index, int offset, ushort value)
{ {
return new XSigAnalogToken(index + offset, value).GetBytes(); return new XSigAnalogToken(index + offset, value).GetBytes();
@@ -157,6 +181,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="startIndex">Starting index of the sequence.</param> /// <param name="startIndex">Starting index of the sequence.</param>
/// <param name="values">Analog signal value array.</param> /// <param name="values">Analog signal value array.</param>
/// <returns>Byte sequence in XSig format for analog signal information.</returns> /// <returns>Byte sequence in XSig format for analog signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int startIndex, ushort[] values) public static byte[] GetBytes(int startIndex, ushort[] values)
{ {
return GetBytes(startIndex, 0, values); return GetBytes(startIndex, 0, values);
@@ -169,6 +196,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="offset">Index offset.</param> /// <param name="offset">Index offset.</param>
/// <param name="values">Analog signal value array.</param> /// <param name="values">Analog signal value array.</param>
/// <returns>Byte sequence in XSig format for analog signal information.</returns> /// <returns>Byte sequence in XSig format for analog signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int startIndex, int offset, ushort[] values) public static byte[] GetBytes(int startIndex, int offset, ushort[] values)
{ {
// Analog XSig data is 4 bytes per value // Analog XSig data is 4 bytes per value
@@ -186,6 +216,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="index">1-based serial index</param> /// <param name="index">1-based serial index</param>
/// <param name="value">Serial data to be encoded</param> /// <param name="value">Serial data to be encoded</param>
/// <returns>Bytes in XSig format for serial signal information.</returns> /// <returns>Bytes in XSig format for serial signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int index, string value) public static byte[] GetBytes(int index, string value)
{ {
return GetBytes(index, 0, value); return GetBytes(index, 0, value);
@@ -198,6 +231,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="offset">Index offset.</param> /// <param name="offset">Index offset.</param>
/// <param name="value">Serial data to be encoded</param> /// <param name="value">Serial data to be encoded</param>
/// <returns>Bytes in XSig format for serial signal information.</returns> /// <returns>Bytes in XSig format for serial signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int index, int offset, string value) public static byte[] GetBytes(int index, int offset, string value)
{ {
return new XSigSerialToken(index + offset, value).GetBytes(); return new XSigSerialToken(index + offset, value).GetBytes();
@@ -209,6 +245,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="startIndex">Starting index of the sequence.</param> /// <param name="startIndex">Starting index of the sequence.</param>
/// <param name="values">Serial signal value array.</param> /// <param name="values">Serial signal value array.</param>
/// <returns>Byte sequence in XSig format for serial signal information.</returns> /// <returns>Byte sequence in XSig format for serial signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int startIndex, string[] values) public static byte[] GetBytes(int startIndex, string[] values)
{ {
return GetBytes(startIndex, 0, values); return GetBytes(startIndex, 0, values);
@@ -221,6 +260,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="offset">Index offset.</param> /// <param name="offset">Index offset.</param>
/// <param name="values">Serial signal value array.</param> /// <param name="values">Serial signal value array.</param>
/// <returns>Byte sequence in XSig format for serial signal information.</returns> /// <returns>Byte sequence in XSig format for serial signal information.</returns>
/// <summary>
/// GetBytes method
/// </summary>
public static byte[] GetBytes(int startIndex, int offset, string[] values) public static byte[] GetBytes(int startIndex, int offset, string[] values)
{ {
// Serial XSig data is not fixed-length like the other formats // Serial XSig data is not fixed-length like the other formats

View File

@@ -48,6 +48,9 @@ namespace PepperDash.Core.Intersystem
/// <param name="stream">Input stream</param> /// <param name="stream">Input stream</param>
/// <param name="value">Result</param> /// <param name="value">Result</param>
/// <returns>True if successful, otherwise false.</returns> /// <returns>True if successful, otherwise false.</returns>
/// <summary>
/// TryReadUInt16BE method
/// </summary>
public static bool TryReadUInt16BE(Stream stream, out ushort value) public static bool TryReadUInt16BE(Stream stream, out ushort value)
{ {
value = 0; value = 0;
@@ -65,6 +68,9 @@ namespace PepperDash.Core.Intersystem
/// </summary> /// </summary>
/// <returns>XSigToken</returns> /// <returns>XSigToken</returns>
/// <exception cref="ArgumentOutOfRangeException">Offset is less than 0.</exception> /// <exception cref="ArgumentOutOfRangeException">Offset is less than 0.</exception>
/// <summary>
/// ReadXSigToken method
/// </summary>
public XSigToken ReadXSigToken() public XSigToken ReadXSigToken()
{ {
ushort prefix; ushort prefix;
@@ -114,6 +120,9 @@ namespace PepperDash.Core.Intersystem
/// Reads all available XSig tokens from the stream. /// Reads all available XSig tokens from the stream.
/// </summary> /// </summary>
/// <returns>XSigToken collection.</returns> /// <returns>XSigToken collection.</returns>
/// <summary>
/// ReadAllXSigTokens method
/// </summary>
public IEnumerable<XSigToken> ReadAllXSigTokens() public IEnumerable<XSigToken> ReadAllXSigTokens()
{ {
var tokens = new List<XSigToken>(); var tokens = new List<XSigToken>();

View File

@@ -47,6 +47,9 @@ namespace PepperDash.Core.Intersystem
/// Write XSig data gathered from an IXSigStateResolver to the stream. /// Write XSig data gathered from an IXSigStateResolver to the stream.
/// </summary> /// </summary>
/// <param name="xSigSerialization">IXSigStateResolver object.</param> /// <param name="xSigSerialization">IXSigStateResolver object.</param>
/// <summary>
/// WriteXSigData method
/// </summary>
public void WriteXSigData(IXSigSerialization xSigSerialization) public void WriteXSigData(IXSigSerialization xSigSerialization)
{ {
WriteXSigData(xSigSerialization, 0); WriteXSigData(xSigSerialization, 0);
@@ -57,6 +60,9 @@ namespace PepperDash.Core.Intersystem
/// </summary> /// </summary>
/// <param name="xSigSerialization">IXSigStateResolver object.</param> /// <param name="xSigSerialization">IXSigStateResolver object.</param>
/// <param name="offset">Index offset for each XSigToken.</param> /// <param name="offset">Index offset for each XSigToken.</param>
/// <summary>
/// WriteXSigData method
/// </summary>
public void WriteXSigData(IXSigSerialization xSigSerialization, int offset) public void WriteXSigData(IXSigSerialization xSigSerialization, int offset)
{ {
if (xSigSerialization == null) if (xSigSerialization == null)
@@ -70,6 +76,9 @@ namespace PepperDash.Core.Intersystem
/// Write XSigToken to the stream. /// Write XSigToken to the stream.
/// </summary> /// </summary>
/// <param name="token">XSigToken object.</param> /// <param name="token">XSigToken object.</param>
/// <summary>
/// WriteXSigData method
/// </summary>
public void WriteXSigData(XSigToken token) public void WriteXSigData(XSigToken token)
{ {
WriteXSigData(token, 0); WriteXSigData(token, 0);
@@ -80,6 +89,9 @@ namespace PepperDash.Core.Intersystem
/// </summary> /// </summary>
/// <param name="token">XSigToken object.</param> /// <param name="token">XSigToken object.</param>
/// <param name="offset">Index offset for each XSigToken.</param> /// <param name="offset">Index offset for each XSigToken.</param>
/// <summary>
/// WriteXSigData method
/// </summary>
public void WriteXSigData(XSigToken token, int offset) public void WriteXSigData(XSigToken token, int offset)
{ {
WriteXSigData(new[] { token }, offset); WriteXSigData(new[] { token }, offset);
@@ -108,6 +120,9 @@ namespace PepperDash.Core.Intersystem
/// </summary> /// </summary>
/// <param name="tokens">XSigToken objects.</param> /// <param name="tokens">XSigToken objects.</param>
/// <param name="offset">Index offset for each XSigToken.</param> /// <param name="offset">Index offset for each XSigToken.</param>
/// <summary>
/// WriteXSigData method
/// </summary>
public void WriteXSigData(IEnumerable<XSigToken> tokens, int offset) public void WriteXSigData(IEnumerable<XSigToken> tokens, int offset)
{ {
if (offset < 0) if (offset < 0)
@@ -125,7 +140,7 @@ namespace PepperDash.Core.Intersystem
} }
/// <summary> /// <summary>
/// Disposes of the internal stream if specified to not leave open. /// Dispose method
/// </summary> /// </summary>
public void Dispose() public void Dispose()
{ {

View File

@@ -2,14 +2,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Crestron.SimplSharp;
using System.Reflection; using System.Reflection;
using Crestron.SimplSharp;
using Crestron.SimplSharpPro; using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using Crestron.SimplSharpPro.EthernetCommunication; using Crestron.SimplSharpPro.EthernetCommunication;
using Newtonsoft.Json; using Newtonsoft.Json;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core.Config; using PepperDash.Essentials.Core.Config;
using Serilog.Events; using Serilog.Events;
@@ -31,7 +29,7 @@ namespace PepperDash.Essentials.Core.Bridges
} }
/// <summary> /// <summary>
/// Bridge API using EISC /// Represents a EiscApiAdvanced
/// </summary> /// </summary>
public class EiscApiAdvanced : BridgeApi, ICommunicationMonitor public class EiscApiAdvanced : BridgeApi, ICommunicationMonitor
{ {
@@ -60,12 +58,19 @@ namespace PepperDash.Essentials.Core.Bridges
AddPostActivationAction(RegisterEisc); AddPostActivationAction(RegisterEisc);
} }
/// <summary>
/// CustomActivate method
/// </summary>
/// <inheritdoc />
public override bool CustomActivate() public override bool CustomActivate()
{ {
CommunicationMonitor.Start(); CommunicationMonitor.Start();
return base.CustomActivate(); return base.CustomActivate();
} }
/// <summary>
/// Deactivate method
/// </summary>
public override bool Deactivate() public override bool Deactivate()
{ {
CommunicationMonitor.Stop(); CommunicationMonitor.Stop();
@@ -123,6 +128,9 @@ namespace PepperDash.Essentials.Core.Bridges
Debug.LogMessage(LogEventLevel.Debug, this, "EISC registration successful"); Debug.LogMessage(LogEventLevel.Debug, this, "EISC registration successful");
} }
/// <summary>
/// LinkRooms method
/// </summary>
public void LinkRooms() public void LinkRooms()
{ {
Debug.LogMessage(LogEventLevel.Debug, this, "Linking Rooms..."); Debug.LogMessage(LogEventLevel.Debug, this, "Linking Rooms...");
@@ -153,6 +161,9 @@ namespace PepperDash.Essentials.Core.Bridges
/// </summary> /// </summary>
/// <param name="deviceKey"></param> /// <param name="deviceKey"></param>
/// <param name="joinMap"></param> /// <param name="joinMap"></param>
/// <summary>
/// AddJoinMap method
/// </summary>
public void AddJoinMap(string deviceKey, JoinMapBaseAdvanced joinMap) public void AddJoinMap(string deviceKey, JoinMapBaseAdvanced joinMap)
{ {
if (!JoinMaps.ContainsKey(deviceKey)) if (!JoinMaps.ContainsKey(deviceKey))
@@ -166,8 +177,9 @@ namespace PepperDash.Essentials.Core.Bridges
} }
/// <summary> /// <summary>
/// Prints all the join maps on this bridge /// PrintJoinMaps method
/// </summary> /// </summary>
/// <inheritdoc />
public virtual void PrintJoinMaps() public virtual void PrintJoinMaps()
{ {
CrestronConsole.ConsoleCommandResponse("Join Maps for EISC IPID: {0}\r\n", Eisc.ID.ToString("X")); CrestronConsole.ConsoleCommandResponse("Join Maps for EISC IPID: {0}\r\n", Eisc.ID.ToString("X"));
@@ -179,8 +191,9 @@ namespace PepperDash.Essentials.Core.Bridges
} }
} }
/// <summary> /// <summary>
/// Generates markdown for all join maps on this bridge /// MarkdownForBridge method
/// </summary> /// </summary>
/// <inheritdoc />
public virtual void MarkdownForBridge(string bridgeKey) public virtual void MarkdownForBridge(string bridgeKey)
{ {
Debug.LogMessage(LogEventLevel.Information, this, "Writing Joinmaps to files for EISC IPID: {0}", Eisc.ID.ToString("X")); Debug.LogMessage(LogEventLevel.Information, this, "Writing Joinmaps to files for EISC IPID: {0}", Eisc.ID.ToString("X"));
@@ -196,6 +209,9 @@ namespace PepperDash.Essentials.Core.Bridges
/// Prints the join map for a device by key /// Prints the join map for a device by key
/// </summary> /// </summary>
/// <param name="deviceKey"></param> /// <param name="deviceKey"></param>
/// <summary>
/// PrintJoinMapForDevice method
/// </summary>
public void PrintJoinMapForDevice(string deviceKey) public void PrintJoinMapForDevice(string deviceKey)
{ {
var joinMap = JoinMaps[deviceKey]; var joinMap = JoinMaps[deviceKey];
@@ -213,6 +229,9 @@ namespace PepperDash.Essentials.Core.Bridges
/// Prints the join map for a device by key /// Prints the join map for a device by key
/// </summary> /// </summary>
/// <param name="deviceKey"></param> /// <param name="deviceKey"></param>
/// <summary>
/// MarkdownJoinMapForDevice method
/// </summary>
public void MarkdownJoinMapForDevice(string deviceKey, string bridgeKey) public void MarkdownJoinMapForDevice(string deviceKey, string bridgeKey)
{ {
var joinMap = JoinMaps[deviceKey]; var joinMap = JoinMaps[deviceKey];
@@ -233,6 +252,9 @@ namespace PepperDash.Essentials.Core.Bridges
/// <param name="join"></param> /// <param name="join"></param>
/// <param name="type"></param> /// <param name="type"></param>
/// <param name="state"></param> /// <param name="state"></param>
/// <summary>
/// ExecuteJoinAction method
/// </summary>
public void ExecuteJoinAction(uint join, string type, object state) public void ExecuteJoinAction(uint join, string type, object state)
{ {
try try
@@ -318,49 +340,91 @@ namespace PepperDash.Essentials.Core.Bridges
#region Implementation of ICommunicationMonitor #region Implementation of ICommunicationMonitor
/// <summary>
/// Gets or sets the CommunicationMonitor
/// </summary>
public StatusMonitorBase CommunicationMonitor { get; private set; } public StatusMonitorBase CommunicationMonitor { get; private set; }
#endregion #endregion
} }
/// <summary>
/// Represents a EiscApiPropertiesConfig
/// </summary>
public class EiscApiPropertiesConfig public class EiscApiPropertiesConfig
{ {
/// <summary>
/// Gets or sets the Control
/// </summary>
[JsonProperty("control")] [JsonProperty("control")]
public EssentialsControlPropertiesConfig Control { get; set; } public EssentialsControlPropertiesConfig Control { get; set; }
/// <summary>
/// Gets or sets the Devices
/// </summary>
[JsonProperty("devices")] [JsonProperty("devices")]
public List<ApiDevicePropertiesConfig> Devices { get; set; } public List<ApiDevicePropertiesConfig> Devices { get; set; }
/// <summary>
/// Gets or sets the Rooms
/// </summary>
[JsonProperty("rooms")] [JsonProperty("rooms")]
public List<ApiRoomPropertiesConfig> Rooms { get; set; } public List<ApiRoomPropertiesConfig> Rooms { get; set; }
/// <summary>
/// Represents a ApiDevicePropertiesConfig
/// </summary>
public class ApiDevicePropertiesConfig public class ApiDevicePropertiesConfig
{ {
/// <summary>
/// Gets or sets the DeviceKey
/// </summary>
[JsonProperty("deviceKey")] [JsonProperty("deviceKey")]
public string DeviceKey { get; set; } public string DeviceKey { get; set; }
/// <summary>
/// Gets or sets the JoinStart
/// </summary>
[JsonProperty("joinStart")] [JsonProperty("joinStart")]
public uint JoinStart { get; set; } public uint JoinStart { get; set; }
/// <summary>
/// Gets or sets the JoinMapKey
/// </summary>
[JsonProperty("joinMapKey")] [JsonProperty("joinMapKey")]
public string JoinMapKey { get; set; } public string JoinMapKey { get; set; }
} }
/// <summary>
/// Represents a ApiRoomPropertiesConfig
/// </summary>
public class ApiRoomPropertiesConfig public class ApiRoomPropertiesConfig
{ {
/// <summary>
/// Gets or sets the RoomKey
/// </summary>
[JsonProperty("roomKey")] [JsonProperty("roomKey")]
public string RoomKey { get; set; } public string RoomKey { get; set; }
/// <summary>
/// Gets or sets the JoinStart
/// </summary>
[JsonProperty("joinStart")] [JsonProperty("joinStart")]
public uint JoinStart { get; set; } public uint JoinStart { get; set; }
/// <summary>
/// Gets or sets the JoinMapKey
/// </summary>
[JsonProperty("joinMapKey")] [JsonProperty("joinMapKey")]
public string JoinMapKey { get; set; } public string JoinMapKey { get; set; }
} }
} }
/// <summary>
/// Represents a EiscApiAdvancedFactory
/// </summary>
public class EiscApiAdvancedFactory : EssentialsDeviceFactory<EiscApiAdvanced> public class EiscApiAdvancedFactory : EssentialsDeviceFactory<EiscApiAdvanced>
{ {
public EiscApiAdvancedFactory() public EiscApiAdvancedFactory()
@@ -368,6 +432,10 @@ namespace PepperDash.Essentials.Core.Bridges
TypeNames = new List<string> { "eiscapiadv", "eiscapiadvanced", "eiscapiadvancedserver", "eiscapiadvancedclient", "vceiscapiadv", "vceiscapiadvanced" }; TypeNames = new List<string> { "eiscapiadv", "eiscapiadvanced", "eiscapiadvancedserver", "eiscapiadvancedclient", "vceiscapiadv", "vceiscapiadvanced" };
} }
/// <summary>
/// BuildDevice method
/// </summary>
/// <inheritdoc />
public override EssentialsDevice BuildDevice(DeviceConfig dc) public override EssentialsDevice BuildDevice(DeviceConfig dc)
{ {
Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new EiscApiAdvanced Device"); Debug.LogMessage(LogEventLevel.Debug, "Factory Attempting to create new EiscApiAdvanced Device");

View File

@@ -34,6 +34,9 @@ namespace PepperDash.Essentials.Core.Bridges
bridge.PrintJoinMaps(); bridge.PrintJoinMaps();
} }
} }
/// <summary>
/// JoinmapMarkdown method
/// </summary>
public static void JoinmapMarkdown(string command) public static void JoinmapMarkdown(string command)
{ {
var targets = command.Split(' '); var targets = command.Split(' ');

View File

@@ -3,10 +3,17 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary> /// <summary>
/// Defines a device that uses JoinMapBaseAdvanced for its join map /// Defines the contract for IBridgeAdvanced
/// </summary> /// </summary>
public interface IBridgeAdvanced public interface IBridgeAdvanced
{ {
/// <summary>
/// Links the bridge to the API using the provided trilist, join start, join map key, and bridge.
/// </summary>
/// <param name="trilist">The trilist to link to.</param>
/// <param name="joinStart">The starting join number.</param>
/// <param name="joinMapKey">The key for the join map.</param>
/// <param name="bridge">The EISC API bridge.</param>
void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge); void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge);
} }
} }

View File

@@ -2,6 +2,9 @@ using System;
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a AirMediaControllerJoinMap
/// </summary>
public class AirMediaControllerJoinMap : JoinMapBaseAdvanced public class AirMediaControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("IsOnline")] [JoinName("IsOnline")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a AppleTvJoinMap
/// </summary>
public class AppleTvJoinMap : JoinMapBaseAdvanced public class AppleTvJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("UpArrow")] [JoinName("UpArrow")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a C2nRthsControllerJoinMap
/// </summary>
public class C2nRthsControllerJoinMap : JoinMapBaseAdvanced public class C2nRthsControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("IsOnline")] [JoinName("IsOnline")]

View File

@@ -3,7 +3,7 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary> /// <summary>
/// Join map for CameraBase devices /// Represents a CameraControllerJoinMap
/// </summary> /// </summary>
public class CameraControllerJoinMap : JoinMapBaseAdvanced public class CameraControllerJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a CenOdtOccupancySensorBaseJoinMap
/// </summary>
public class CenOdtOccupancySensorBaseJoinMap : JoinMapBaseAdvanced public class CenOdtOccupancySensorBaseJoinMap : JoinMapBaseAdvanced
{ {
#region Digitals #region Digitals

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a DisplayControllerJoinMap
/// </summary>
public class DisplayControllerJoinMap : JoinMapBaseAdvanced public class DisplayControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("Name")] [JoinName("Name")]

View File

@@ -1,6 +1,9 @@
using System; using System;
namespace PepperDash.Essentials.Core.Bridges { namespace PepperDash.Essentials.Core.Bridges {
/// <summary>
/// Represents a DmBladeChassisControllerJoinMap
/// </summary>
public class DmBladeChassisControllerJoinMap : JoinMapBaseAdvanced { public class DmBladeChassisControllerJoinMap : JoinMapBaseAdvanced {
[JoinName("IsOnline")] [JoinName("IsOnline")]

View File

@@ -2,6 +2,9 @@ using System;
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a DmChassisControllerJoinMap
/// </summary>
public class DmChassisControllerJoinMap : JoinMapBaseAdvanced public class DmChassisControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("EnableAudioBreakaway")] [JoinName("EnableAudioBreakaway")]

View File

@@ -2,6 +2,9 @@ using System;
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a DmRmcControllerJoinMap
/// </summary>
public class DmRmcControllerJoinMap : JoinMapBaseAdvanced public class DmRmcControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("IsOnline")] [JoinName("IsOnline")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a DmTxControllerJoinMap
/// </summary>
public class DmTxControllerJoinMap : JoinMapBaseAdvanced public class DmTxControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("IsOnline")] [JoinName("IsOnline")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a DmpsAudioOutputControllerJoinMap
/// </summary>
public class DmpsAudioOutputControllerJoinMap : JoinMapBaseAdvanced public class DmpsAudioOutputControllerJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a DmpsMicrophoneControllerJoinMap
/// </summary>
public class DmpsMicrophoneControllerJoinMap : JoinMapBaseAdvanced public class DmpsMicrophoneControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("MicGain")] [JoinName("MicGain")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a DmpsRoutingControllerJoinMap
/// </summary>
public class DmpsRoutingControllerJoinMap : JoinMapBaseAdvanced public class DmpsRoutingControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("EnableRouting")] [JoinName("EnableRouting")]

View File

@@ -3,6 +3,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a GenericLightingJoinMap
/// </summary>
public class GenericLightingJoinMap : JoinMapBaseAdvanced public class GenericLightingJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a GenericRelayControllerJoinMap
/// </summary>
public class GenericRelayControllerJoinMap : JoinMapBaseAdvanced public class GenericRelayControllerJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a GlsOccupancySensorBaseJoinMap
/// </summary>
public class GlsOccupancySensorBaseJoinMap : JoinMapBaseAdvanced public class GlsOccupancySensorBaseJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("IsOnline")] [JoinName("IsOnline")]

View File

@@ -3,6 +3,9 @@ using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Core.Bridges.JoinMaps namespace PepperDash.Essentials.Core.Bridges.JoinMaps
{ {
/// <summary>
/// Represents a GlsPartitionSensorJoinMap
/// </summary>
public class GlsPartitionSensorJoinMap : JoinMapBaseAdvanced public class GlsPartitionSensorJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a HdMdNxM4kEControllerJoinMap
/// </summary>
public class HdMdNxM4kEControllerJoinMap : JoinMapBaseAdvanced public class HdMdNxM4kEControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("Name")] [JoinName("Name")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a HdMdxxxCEControllerJoinMap
/// </summary>
public class HdMdxxxCEControllerJoinMap : JoinMapBaseAdvanced public class HdMdxxxCEControllerJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -3,6 +3,9 @@ using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a HdPsXxxControllerJoinMap
/// </summary>
public class HdPsXxxControllerJoinMap : JoinMapBaseAdvanced public class HdPsXxxControllerJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a Hrxxx0WirelessRemoteControllerJoinMap
/// </summary>
public class Hrxxx0WirelessRemoteControllerJoinMap : JoinMapBaseAdvanced public class Hrxxx0WirelessRemoteControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("Power")] [JoinName("Power")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a IAnalogInputJoinMap
/// </summary>
public class IAnalogInputJoinMap : JoinMapBaseAdvanced public class IAnalogInputJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a IBasicCommunicationJoinMap
/// </summary>
public class IBasicCommunicationJoinMap : JoinMapBaseAdvanced public class IBasicCommunicationJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("TextReceived")] [JoinName("TextReceived")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a IDigitalInputJoinMap
/// </summary>
public class IDigitalInputJoinMap : JoinMapBaseAdvanced public class IDigitalInputJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a IDigitalOutputJoinMap
/// </summary>
public class IDigitalOutputJoinMap : JoinMapBaseAdvanced public class IDigitalOutputJoinMap : JoinMapBaseAdvanced
{ {

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a PduJoinMapBase
/// </summary>
public class PduJoinMapBase : JoinMapBaseAdvanced public class PduJoinMapBase : JoinMapBaseAdvanced
{ {
[JoinName("Name")] [JoinName("Name")]

View File

@@ -3,6 +3,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a SetTopBoxControllerJoinMap
/// </summary>
public class SetTopBoxControllerJoinMap : JoinMapBaseAdvanced public class SetTopBoxControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("PowerOn")] [JoinName("PowerOn")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a StatusSignControllerJoinMap
/// </summary>
public class StatusSignControllerJoinMap : JoinMapBaseAdvanced public class StatusSignControllerJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("IsOnline")] [JoinName("IsOnline")]

View File

@@ -2,6 +2,9 @@
namespace PepperDash.Essentials.Core.Bridges namespace PepperDash.Essentials.Core.Bridges
{ {
/// <summary>
/// Represents a SystemMonitorJoinMap
/// </summary>
public class SystemMonitorJoinMap : JoinMapBaseAdvanced public class SystemMonitorJoinMap : JoinMapBaseAdvanced
{ {
[JoinName("TimeZone")] [JoinName("TimeZone")]

View File

@@ -2,6 +2,9 @@ using System;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Core.Bridges.JoinMaps namespace PepperDash.Essentials.Core.Bridges.JoinMaps
{ {
/// <summary>
/// Represents a VideoCodecControllerJoinMap
/// </summary>
public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
{ {
#region Digital #region Digital

View File

@@ -12,13 +12,22 @@ using Serilog.Events;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
/// <summary>
/// Represents a CecPortController
/// </summary>
public class CecPortController : Device, IBasicCommunicationWithStreamDebugging public class CecPortController : Device, IBasicCommunicationWithStreamDebugging
{ {
/// <summary>
/// Gets or sets the StreamDebugging
/// </summary>
public CommunicationStreamDebugging StreamDebugging { get; private set; } public CommunicationStreamDebugging StreamDebugging { get; private set; }
public event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived; public event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived;
public event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived; public event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived;
/// <summary>
/// Gets or sets the IsConnected
/// </summary>
public bool IsConnected { get { return true; } } public bool IsConnected { get { return true; } }
ICec Port; ICec Port;
@@ -74,6 +83,9 @@ namespace PepperDash.Essentials.Core
#region IBasicCommunication Members #region IBasicCommunication Members
/// <summary>
/// SendText method
/// </summary>
public void SendText(string text) public void SendText(string text)
{ {
if (Port == null) if (Port == null)
@@ -83,6 +95,9 @@ namespace PepperDash.Essentials.Core
Port.StreamCec.Send.StringValue = text; Port.StreamCec.Send.StringValue = text;
} }
/// <summary>
/// SendBytes method
/// </summary>
public void SendBytes(byte[] bytes) public void SendBytes(byte[] bytes)
{ {
if (Port == null) if (Port == null)
@@ -93,10 +108,16 @@ namespace PepperDash.Essentials.Core
Port.StreamCec.Send.StringValue = text; Port.StreamCec.Send.StringValue = text;
} }
/// <summary>
/// Connect method
/// </summary>
public void Connect() public void Connect()
{ {
} }
/// <summary>
/// Disconnect method
/// </summary>
public void Disconnect() public void Disconnect()
{ {
} }
@@ -107,6 +128,9 @@ namespace PepperDash.Essentials.Core
/// ///
/// </summary> /// </summary>
/// <param name="s"></param> /// <param name="s"></param>
/// <summary>
/// SimulateReceive method
/// </summary>
public void SimulateReceive(string s) public void SimulateReceive(string s)
{ {
// split out hex chars and build string // split out hex chars and build string

View File

@@ -12,13 +12,22 @@ using Serilog.Events;
namespace PepperDash.Essentials.Core namespace PepperDash.Essentials.Core
{ {
/// <summary>
/// Represents a ComPortController
/// </summary>
public class ComPortController : Device, IBasicCommunicationWithStreamDebugging public class ComPortController : Device, IBasicCommunicationWithStreamDebugging
{ {
/// <summary>
/// Gets or sets the StreamDebugging
/// </summary>
public CommunicationStreamDebugging StreamDebugging { get; private set; } public CommunicationStreamDebugging StreamDebugging { get; private set; }
public event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived; public event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived;
public event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived; public event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived;
/// <summary>
/// Gets or sets the IsConnected
/// </summary>
public bool IsConnected { get { return true; } } public bool IsConnected { get { return true; } }
ComPort Port; ComPort Port;
@@ -116,6 +125,10 @@ namespace PepperDash.Essentials.Core
if(!eventSubscribed) Debug.LogMessage(LogEventLevel.Warning, this, "Received data but no handler is registered"); if(!eventSubscribed) Debug.LogMessage(LogEventLevel.Warning, this, "Received data but no handler is registered");
} }
/// <summary>
/// Deactivate method
/// </summary>
/// <inheritdoc />
public override bool Deactivate() public override bool Deactivate()
{ {
return Port.UnRegister() == eDeviceRegistrationUnRegistrationResponse.Success; return Port.UnRegister() == eDeviceRegistrationUnRegistrationResponse.Success;
@@ -123,6 +136,9 @@ namespace PepperDash.Essentials.Core
#region IBasicCommunication Members #region IBasicCommunication Members
/// <summary>
/// SendText method
/// </summary>
public void SendText(string text) public void SendText(string text)
{ {
if (Port == null) if (Port == null)
@@ -133,6 +149,9 @@ namespace PepperDash.Essentials.Core
Port.Send(text); Port.Send(text);
} }
/// <summary>
/// SendBytes method
/// </summary>
public void SendBytes(byte[] bytes) public void SendBytes(byte[] bytes)
{ {
if (Port == null) if (Port == null)
@@ -144,10 +163,16 @@ namespace PepperDash.Essentials.Core
Port.Send(text); Port.Send(text);
} }
/// <summary>
/// Connect method
/// </summary>
public void Connect() public void Connect()
{ {
} }
/// <summary>
/// Disconnect method
/// </summary>
public void Disconnect() public void Disconnect()
{ {
} }
@@ -158,6 +183,9 @@ namespace PepperDash.Essentials.Core
/// ///
/// </summary> /// </summary>
/// <param name="s"></param> /// <param name="s"></param>
/// <summary>
/// SimulateReceive method
/// </summary>
public void SimulateReceive(string s) public void SimulateReceive(string s)
{ {
// split out hex chars and build string // split out hex chars and build string

View File

@@ -34,8 +34,9 @@ namespace PepperDash.Essentials.Core
} }
/// <summary> /// <summary>
/// /// CanConvert method
/// </summary> /// </summary>
/// <inheritdoc />
public override bool CanConvert(Type objectType) public override bool CanConvert(Type objectType)
{ {
return objectType == typeof(ComPort.ComPortSpec?); return objectType == typeof(ComPort.ComPortSpec?);
@@ -44,10 +45,15 @@ namespace PepperDash.Essentials.Core
public override bool CanRead { get { return true; } } public override bool CanRead { get { return true; } }
/// <summary> /// <summary>
/// This converter will not be used for writing /// Gets or sets the CanWrite
/// </summary> /// </summary>
/// <inheritdoc />
public override bool CanWrite { get { return false; } } public override bool CanWrite { get { return false; } }
/// <summary>
/// WriteJson method
/// </summary>
/// <inheritdoc />
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
@@ -55,12 +61,11 @@ namespace PepperDash.Essentials.Core
} }
/// <summary> /// <summary>
/// The gist of this converter: The comspec JSON comes in with normal values that need to be converted /// Represents a ComSpecPropsJsonConverter
/// 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
/// </summary> /// </summary>
public class ComSpecPropsJsonConverter : JsonConverter public class ComSpecPropsJsonConverter : JsonConverter
{ {
/// <inheritdoc />
public override bool CanConvert(Type objectType) public override bool CanConvert(Type objectType)
{ {
return objectType == typeof(ComPort.eComBaudRates) return objectType == typeof(ComPort.eComBaudRates)
@@ -72,8 +77,15 @@ namespace PepperDash.Essentials.Core
|| objectType == typeof(ComPort.eComStopBits); || objectType == typeof(ComPort.eComStopBits);
} }
/// <summary>
/// Gets or sets the CanRead
/// </summary>
/// <inheritdoc />
public override bool CanRead { get { return true; } } public override bool CanRead { get { return true; } }
/// <summary>
/// ReadJson method
/// </summary>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{ {
//Debug.LogMessage(LogEventLevel.Verbose, "ReadJson type: " + objectType.Name); //Debug.LogMessage(LogEventLevel.Verbose, "ReadJson type: " + objectType.Name);
@@ -94,6 +106,10 @@ namespace PepperDash.Essentials.Core
return null; return null;
} }
/// <summary>
/// WriteJson method
/// </summary>
/// <inheritdoc />
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View File

@@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using System.Text;
using Crestron.SimplSharp.CrestronSockets;
using Crestron.SimplSharpPro.DeviceSupport;
using Newtonsoft.Json;
using PepperDash.Core;
using PepperDash.Core.Logging;
using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core.Config;
using PepperDash.Essentials.Core.Devices;
namespace PepperDash.Essentials.Core
{
/// <summary>
/// Implements IBasicCommunication and sends all communication through an EISC
/// </summary>
[Description("Generic communication wrapper class for any IBasicCommunication type")]
public class CommBridge : EssentialsBridgeableDevice, IBasicCommunication
{
private EiscApiAdvanced eisc;
private IBasicCommunicationJoinMap joinMap;
/// <summary>
/// Event triggered when text is received through the communication bridge.
/// </summary>
public event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived;
/// <summary>
/// Event triggered when bytes are received through the communication bridge.
/// </summary>
public event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived;
/// <summary>
/// Indicates whether the communication bridge is currently connected.
/// </summary>
public bool IsConnected { get; private set; }
/// <summary>
/// Initializes a new instance of the <see cref="CommBridge"/> class.
/// </summary>
/// <param name="key">The unique key for the communication bridge.</param>
/// <param name="name">The display name for the communication bridge.</param>
public CommBridge(string key, string name)
: base(key, name)
{
}
/// <summary>
/// Sends a byte array through the communication bridge.
/// </summary>
/// <param name="bytes">The byte array to send.</param>
public void SendBytes(byte[] bytes)
{
if (eisc == null)
{
this.LogWarning("EISC is null, cannot send bytes.");
return;
}
eisc.Eisc.SetString(joinMap.SendText.JoinNumber, Encoding.ASCII.GetString(bytes, 0, bytes.Length));
}
/// <summary>
/// Sends a text string through the communication bridge.
/// </summary>
/// <param name="text">The text string to send.</param>
public void SendText(string text)
{
if (eisc == null)
{
this.LogWarning("EISC is null, cannot send text.");
return;
}
eisc.Eisc.SetString(joinMap.SendText.JoinNumber, text);
}
/// <summary>
/// Initiates a connection through the communication bridge.
/// </summary>
public void Connect()
{
if (eisc == null)
{
this.LogWarning("EISC is null, cannot connect.");
return;
}
eisc.Eisc.SetBool(joinMap.Connect.JoinNumber, true);
}
/// <summary>
/// Terminates the connection through the communication bridge.
/// </summary>
public void Disconnect()
{
if (eisc == null)
{
this.LogWarning("EISC is null, cannot disconnect.");
return;
}
eisc.Eisc.SetBool(joinMap.Connect.JoinNumber, false);
}
/// <inheritdoc />
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
joinMap = new IBasicCommunicationJoinMap(joinStart);
var joinMapSerialized = JoinMapHelper.GetSerializedJoinMapForDevice(joinMapKey);
if (!string.IsNullOrEmpty(joinMapSerialized))
joinMap = JsonConvert.DeserializeObject<IBasicCommunicationJoinMap>(joinMapSerialized);
if (bridge != null)
{
bridge.AddJoinMap(Key, joinMap);
}
else
{
this.LogWarning("Please update config to use 'eiscapiadvanced' to get all join map features for this device.");
}
this.LogDebug("Linking to Trilist '{0}'", trilist.ID.ToString("X"));
eisc = bridge;
trilist.SetBoolSigAction(joinMap.Connected.JoinNumber, (b) => IsConnected = b);
trilist.SetStringSigAction(joinMap.TextReceived.JoinNumber, (s) =>
{
TextReceived?.Invoke(this, new GenericCommMethodReceiveTextArgs(s));
BytesReceived?.Invoke(this, new GenericCommMethodReceiveBytesArgs(Encoding.ASCII.GetBytes(s)));
});
}
}
}

View File

@@ -1,11 +1,9 @@
using System; using System;
using Crestron.SimplSharp;
using Crestron.SimplSharpPro; using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DM; using Crestron.SimplSharpPro.DM;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core.Config; using PepperDash.Essentials.Core.Config;
using Serilog.Events; using Serilog.Events;
@@ -38,6 +36,9 @@ namespace PepperDash.Essentials.Core
/// Returns a comm method of either com port, TCP, SSH, and puts this into the DeviceManager /// Returns a comm method of either com port, TCP, SSH, and puts this into the DeviceManager
/// </summary> /// </summary>
/// <param name="deviceConfig">The Device config object</param> /// <param name="deviceConfig">The Device config object</param>
/// <summary>
/// CreateCommForDevice method
/// </summary>
public static IBasicCommunication CreateCommForDevice(DeviceConfig deviceConfig) public static IBasicCommunication CreateCommForDevice(DeviceConfig deviceConfig)
{ {
EssentialsControlPropertiesConfig controlConfig = GetControlPropertiesConfig(deviceConfig); EssentialsControlPropertiesConfig controlConfig = GetControlPropertiesConfig(deviceConfig);
@@ -53,35 +54,38 @@ namespace PepperDash.Essentials.Core
case eControlMethod.Com: case eControlMethod.Com:
comm = new ComPortController(deviceConfig.Key + "-com", GetComPort, controlConfig.ComParams.Value, controlConfig); comm = new ComPortController(deviceConfig.Key + "-com", GetComPort, controlConfig.ComParams.Value, controlConfig);
break; break;
case eControlMethod.Cec: case eControlMethod.ComBridge:
comm = new CecPortController(deviceConfig.Key + "-cec", GetCecPort, controlConfig); comm = new CommBridge(deviceConfig.Key + "-simpl", deviceConfig.Name + " Simpl");
break; break;
case eControlMethod.Cec:
comm = new CecPortController(deviceConfig.Key + "-cec", GetCecPort, controlConfig);
break;
case eControlMethod.IR: case eControlMethod.IR:
break; break;
case eControlMethod.Ssh: case eControlMethod.Ssh:
{ {
var ssh = new GenericSshClient(deviceConfig.Key + "-ssh", c.Address, c.Port, c.Username, c.Password); var ssh = new GenericSshClient(deviceConfig.Key + "-ssh", c.Address, c.Port, c.Username, c.Password);
ssh.AutoReconnect = c.AutoReconnect; ssh.AutoReconnect = c.AutoReconnect;
if(ssh.AutoReconnect) if (ssh.AutoReconnect)
ssh.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs; ssh.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
comm = ssh; comm = ssh;
break; break;
} }
case eControlMethod.Tcpip: case eControlMethod.Tcpip:
{ {
var tcp = new GenericTcpIpClient(deviceConfig.Key + "-tcp", c.Address, c.Port, c.BufferSize); var tcp = new GenericTcpIpClient(deviceConfig.Key + "-tcp", c.Address, c.Port, c.BufferSize);
tcp.AutoReconnect = c.AutoReconnect; tcp.AutoReconnect = c.AutoReconnect;
if (tcp.AutoReconnect) if (tcp.AutoReconnect)
tcp.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs; tcp.AutoReconnectIntervalMs = c.AutoReconnectIntervalMs;
comm = tcp; comm = tcp;
break; break;
} }
case eControlMethod.Udp: case eControlMethod.Udp:
{ {
var udp = new GenericUdpServer(deviceConfig.Key + "-udp", c.Address, c.Port, c.BufferSize); var udp = new GenericUdpServer(deviceConfig.Key + "-udp", c.Address, c.Port, c.BufferSize);
comm = udp; comm = udp;
break; break;
} }
case eControlMethod.Telnet: case eControlMethod.Telnet:
break; break;
case eControlMethod.SecureTcpIp: case eControlMethod.SecureTcpIp:
@@ -104,12 +108,14 @@ namespace PepperDash.Essentials.Core
} }
// put it in the device manager if it's the right flavor // put it in the device manager if it's the right flavor
var comDev = comm as Device; if (comm is Device comDev)
if (comDev != null)
DeviceManager.AddDevice(comDev); DeviceManager.AddDevice(comDev);
return comm; return comm;
} }
/// <summary>
/// GetComPort method
/// </summary>
public static ComPort GetComPort(EssentialsControlPropertiesConfig config) public static ComPort GetComPort(EssentialsControlPropertiesConfig config)
{ {
var comPar = config.ComParams; var comPar = config.ComParams;
@@ -120,68 +126,74 @@ namespace PepperDash.Essentials.Core
return null; return null;
} }
/// <summary> /// <summary>
/// Gets an ICec port from a RoutingInput or RoutingOutput on a device /// Gets an ICec port from a RoutingInput or RoutingOutput on a device
/// </summary> /// </summary>
/// <param name="config"></param> /// <param name="config"></param>
/// <returns></returns> /// <returns></returns>
public static ICec GetCecPort(ControlPropertiesConfig config) /// <summary>
{ /// GetCecPort method
try /// </summary>
{ public static ICec GetCecPort(ControlPropertiesConfig config)
var dev = DeviceManager.GetDeviceForKey(config.ControlPortDevKey); {
try
{
var dev = DeviceManager.GetDeviceForKey(config.ControlPortDevKey);
Debug.LogMessage(LogEventLevel.Information, "GetCecPort: device '{0}' {1}", config.ControlPortDevKey, dev == null Debug.LogMessage(LogEventLevel.Information, "GetCecPort: device '{0}' {1}", config.ControlPortDevKey, dev == null
? "is not valid, failed to get cec port" ? "is not valid, failed to get cec port"
: "found in device manager, attempting to get cec port"); : "found in device manager, attempting to get cec port");
if (dev == null) if (dev == null)
return null; return null;
if (String.IsNullOrEmpty(config.ControlPortName)) if (String.IsNullOrEmpty(config.ControlPortName))
{ {
Debug.LogMessage(LogEventLevel.Information, "GetCecPort: '{0}' - Configuration missing 'ControlPortName'", config.ControlPortDevKey); Debug.LogMessage(LogEventLevel.Information, "GetCecPort: '{0}' - Configuration missing 'ControlPortName'", config.ControlPortDevKey);
return null; return null;
} }
var inputsOutputs = dev as IRoutingInputsOutputs; var inputsOutputs = dev as IRoutingInputsOutputs;
if (inputsOutputs == null) if (inputsOutputs == null)
{ {
Debug.LogMessage(LogEventLevel.Information, "GetCecPort: Device '{0}' does not support IRoutingInputsOutputs, failed to get CEC port called '{1}'", Debug.LogMessage(LogEventLevel.Information, "GetCecPort: Device '{0}' does not support IRoutingInputsOutputs, failed to get CEC port called '{1}'",
config.ControlPortDevKey, config.ControlPortName); config.ControlPortDevKey, config.ControlPortName);
return null; return null;
} }
var inputPort = inputsOutputs.InputPorts[config.ControlPortName]; var inputPort = inputsOutputs.InputPorts[config.ControlPortName];
if (inputPort != null && inputPort.Port is ICec) if (inputPort != null && inputPort.Port is ICec)
return inputPort.Port as ICec; return inputPort.Port as ICec;
var outputPort = inputsOutputs.OutputPorts[config.ControlPortName]; var outputPort = inputsOutputs.OutputPorts[config.ControlPortName];
if (outputPort != null && outputPort.Port is ICec) if (outputPort != null && outputPort.Port is ICec)
return outputPort.Port as ICec; return outputPort.Port as ICec;
} }
catch (Exception ex) catch (Exception ex)
{ {
Debug.LogMessage(LogEventLevel.Debug, "GetCecPort Exception Message: {0}", ex.Message); Debug.LogMessage(LogEventLevel.Debug, "GetCecPort Exception Message: {0}", ex.Message);
Debug.LogMessage(LogEventLevel.Verbose, "GetCecPort Exception StackTrace: {0}", ex.StackTrace); Debug.LogMessage(LogEventLevel.Verbose, "GetCecPort Exception StackTrace: {0}", ex.StackTrace);
if (ex.InnerException != null) if (ex.InnerException != null)
Debug.LogMessage(LogEventLevel.Information, "GetCecPort Exception InnerException: {0}", ex.InnerException); Debug.LogMessage(LogEventLevel.Information, "GetCecPort Exception InnerException: {0}", ex.InnerException);
} }
Debug.LogMessage(LogEventLevel.Information, "GetCecPort: Device '{0}' does not have a CEC port called '{1}'", Debug.LogMessage(LogEventLevel.Information, "GetCecPort: Device '{0}' does not have a CEC port called '{1}'",
config.ControlPortDevKey, config.ControlPortName); config.ControlPortDevKey, config.ControlPortName);
return null; return null;
} }
/// <summary> /// <summary>
/// Helper to grab the IComPorts device for this PortDeviceKey. Key "controlSystem" will /// Helper to grab the IComPorts device for this PortDeviceKey. Key "controlSystem" will
/// return the ControlSystem object from the Global class. /// return the ControlSystem object from the Global class.
/// </summary> /// </summary>
/// <returns>IComPorts device or null if the device is not found or does not implement IComPorts</returns> /// <returns>IComPorts device or null if the device is not found or does not implement IComPorts</returns>
/// <summary>
/// GetIComPortsDeviceFromManagedDevice method
/// </summary>
public static IComPorts GetIComPortsDeviceFromManagedDevice(string ComPortDevKey) public static IComPorts GetIComPortsDeviceFromManagedDevice(string ComPortDevKey)
{ {
if ((ComPortDevKey.Equals("controlSystem", System.StringComparison.OrdinalIgnoreCase) if ((ComPortDevKey.Equals("controlSystem", System.StringComparison.OrdinalIgnoreCase)
@@ -198,66 +210,81 @@ namespace PepperDash.Essentials.Core
} }
} }
/// <summary> /// <summary>
/// /// Represents a EssentialsControlPropertiesConfig
/// </summary> /// </summary>
public class EssentialsControlPropertiesConfig : public class EssentialsControlPropertiesConfig :
ControlPropertiesConfig ControlPropertiesConfig
{ {
[JsonProperty("comParams", NullValueHandling = NullValueHandling.Ignore)] [JsonProperty("comParams", NullValueHandling = NullValueHandling.Ignore)]
[JsonConverter(typeof(ComSpecJsonConverter))] [JsonConverter(typeof(ComSpecJsonConverter))]
public ComPort.ComPortSpec? ComParams { get; set; } public ComPort.ComPortSpec? ComParams { get; set; }
[JsonProperty("cresnetId", NullValueHandling = NullValueHandling.Ignore)] [JsonProperty("cresnetId", NullValueHandling = NullValueHandling.Ignore)]
public string CresnetId { get; set; } public string CresnetId { get; set; }
/// <summary> /// <summary>
/// Attempts to provide uint conversion of string CresnetId /// Attempts to provide uint conversion of string CresnetId
/// </summary> /// </summary>
[JsonIgnore] [JsonIgnore]
public uint CresnetIdInt public uint CresnetIdInt
{ {
get get
{ {
try try
{ {
return Convert.ToUInt32(CresnetId, 16); return Convert.ToUInt32(CresnetId, 16);
} }
catch (Exception) catch (Exception)
{ {
throw new FormatException(string.Format("ERROR:Unable to convert Cresnet ID: {0} to hex. Error:\n{1}", CresnetId)); throw new FormatException(string.Format("ERROR:Unable to convert Cresnet ID: {0} to hex. Error:\n{1}", CresnetId));
} }
} }
} }
[JsonProperty("infinetId", NullValueHandling = NullValueHandling.Ignore)] [JsonProperty("infinetId", NullValueHandling = NullValueHandling.Ignore)]
public string InfinetId { get; set; } /// <summary>
/// Gets or sets the InfinetId
/// </summary>
public string InfinetId { get; set; }
/// <summary> /// <summary>
/// Attepmts to provide uiont conversion of string InifinetId /// Attepmts to provide uiont conversion of string InifinetId
/// </summary> /// </summary>
[JsonIgnore] [JsonIgnore]
public uint InfinetIdInt public uint InfinetIdInt
{ {
get get
{ {
try try
{ {
return Convert.ToUInt32(InfinetId, 16); return Convert.ToUInt32(InfinetId, 16);
} }
catch (Exception) 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 /// <summary>
{ /// Represents a IrControlSpec
public string PortDeviceKey { get; set; } /// </summary>
public uint PortNumber { get; set; } public class IrControlSpec
public string File { get; set; } {
} /// <summary>
/// Gets or sets the PortDeviceKey
/// </summary>
public string PortDeviceKey { get; set; }
/// <summary>
/// Gets or sets the PortNumber
/// </summary>
public uint PortNumber { get; set; }
/// <summary>
/// Gets or sets the File
/// </summary>
public string File { get; set; }
}
} }

Some files were not shown because too many files have changed in this diff Show More