Full Code of PepperDash/Essentials for AI

main e1a5c32c1f19 cached
784 files
5.1 MB
1.4M tokens
4291 symbols
1 requests
Download .txt
Showing preview only (5,499K chars total). Download the full file or copy to clipboard to get everything.
Repository: PepperDash/Essentials
Branch: main
Commit: e1a5c32c1f19
Files: 784
Total size: 5.1 MB

Directory structure:
gitextract_fb__7fh1/

├── .config/
│   └── dotnet-tools.json
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   └── rfi_request.md
│   ├── scripts/
│   │   ├── GenerateVersionNumber-2.0.0.ps1
│   │   ├── GenerateVersionNumber.ps1
│   │   ├── UpdateAssemblyVersion.ps1
│   │   └── ZipBuildOutput.ps1
│   └── workflows/
│       ├── EssentialsPlugins-builds-4-series-caller.yml
│       └── publish-docs.yml
├── .gitignore
├── .gitmodules
├── .releaserc.json
├── .vscode/
│   └── extensions.json
├── CONTRIBUTING.md
├── Crestron-Library-Usage-Analysis.md
├── IR Drivers/
│   ├── Apple_AppleTV_4th_Gen_Essentials.ir
│   ├── Cisco Explorer 4642HDC.ir
│   ├── Comcast Motorola DVR.ir
│   ├── Comcast X1.ir
│   ├── DirecTV H21.ir
│   ├── EXPLORER 8200HD Full Set Pulsed.ir
│   ├── Etisalat Cable Box.ir
│   ├── Etisalat e-Vision.ir
│   ├── Panasonic DMP-BD70.ir
│   ├── Sony BDP Series.ir
│   └── samsung_un_series.ir
├── LICENSE.md
├── PepperDash.Essentials.4Series.sln
├── README.md
├── Sample Presets/
│   └── SampleDirecTV.json
├── docs/
│   ├── docfx.json
│   ├── docs/
│   │   ├── CardFrame.md
│   │   ├── Get-started.md
│   │   ├── Home.md
│   │   ├── Plugins-Deprecated.md
│   │   ├── SIMPL-Bridging-Deprecated.md
│   │   ├── SIMPL-Bridging.md
│   │   ├── getting-started.md
│   │   ├── how-to/
│   │   │   └── how-to-add-docs.md
│   │   ├── technical-docs/
│   │   │   ├── Arch-1.md
│   │   │   ├── Arch-activate.md
│   │   │   ├── Arch-lifecycle.md
│   │   │   ├── Arch-summary.md
│   │   │   ├── Arch-topics.md
│   │   │   ├── Communication-Basics.md
│   │   │   ├── ConfigurationStructure.md
│   │   │   ├── Connection-Based-Routing.md
│   │   │   ├── Debugging.md
│   │   │   ├── Feedback-Classes.md
│   │   │   ├── Glossary-of-Terms.md
│   │   │   ├── Plugins.md
│   │   │   └── Supported-Devices.md
│   │   ├── toc.yml
│   │   └── usage/
│   │       ├── Bridging-To-Hardware-Resources.md
│   │       ├── DigitalInput.md
│   │       ├── GenericComm.md
│   │       ├── IR-Driver-Bridging.md
│   │       ├── JoinMaps.md
│   │       ├── RelayOutput.md
│   │       ├── SIMPL-Bridging-Updated.md
│   │       └── Standalone-Use.md
│   ├── index.md
│   └── toc.yml
└── src/
    ├── Directory.Build.props
    ├── Directory.Build.targets
    ├── PepperDash.Core/
    │   ├── ComTextHelper.cs
    │   ├── Comm/
    │   │   ├── CommunicationGather.cs
    │   │   ├── CommunicationStreamDebugging.cs
    │   │   ├── ControlPropertiesConfig.cs
    │   │   ├── EventArgs.cs
    │   │   ├── GenericSecureTcpIpClient.cs
    │   │   ├── GenericSecureTcpIpClient_ForServer.cs
    │   │   ├── GenericSecureTcpIpServer.cs
    │   │   ├── GenericSshClient.cs
    │   │   ├── GenericTcpIpClient.cs
    │   │   ├── GenericTcpIpClient_ForServer.cs
    │   │   ├── GenericTcpIpServer.cs
    │   │   ├── GenericUdpClient.cs
    │   │   ├── GenericUdpServer.cs
    │   │   ├── StreamDebuggingExtensions.cs
    │   │   ├── TcpClientConfigObject.cs
    │   │   ├── TcpServerConfigObject.cs
    │   │   ├── eControlMethods.cs
    │   │   ├── eStreamDebuggingDataTypeSettings.cs
    │   │   └── eStreamDebuggingSetting.cs
    │   ├── CommunicationExtras.cs
    │   ├── Config/
    │   │   └── PortalConfigReader.cs
    │   ├── Conversion/
    │   │   └── Convert.cs
    │   ├── CoreInterfaces.cs
    │   ├── Device.cs
    │   ├── EthernetHelper.cs
    │   ├── EventArgs.cs
    │   ├── GenericRESTfulCommunications/
    │   │   ├── Constants.cs
    │   │   └── GenericRESTfulClient.cs
    │   ├── JsonStandardObjects/
    │   │   ├── EventArgs and Constants.cs
    │   │   ├── JsonToSimplDevice.cs
    │   │   └── JsonToSimplDeviceConfig.cs
    │   ├── JsonToSimpl/
    │   │   ├── Constants.cs
    │   │   ├── Global.cs
    │   │   ├── JsonToSimplArrayLookupChild.cs
    │   │   ├── JsonToSimplChildObjectBase.cs
    │   │   ├── JsonToSimplFileMaster.cs
    │   │   ├── JsonToSimplFixedPathObject.cs
    │   │   ├── JsonToSimplGenericMaster.cs
    │   │   ├── JsonToSimplMaster.cs
    │   │   └── JsonToSimplPortalFileMaster.cs
    │   ├── Logging/
    │   │   ├── CrestronEnricher.cs
    │   │   ├── Debug.cs
    │   │   ├── DebugConsoleSink.cs
    │   │   ├── DebugContext.cs
    │   │   ├── DebugCrestronLoggerSink.cs
    │   │   ├── DebugErrorLogSink.cs
    │   │   ├── DebugExtensions.cs
    │   │   ├── DebugMemory.cs
    │   │   └── DebugWebsocketSink.cs
    │   ├── Network/
    │   │   └── DiscoveryThings.cs
    │   ├── PasswordManagement/
    │   │   ├── Config.cs
    │   │   ├── Constants.cs
    │   │   ├── PasswordClient.cs
    │   │   └── PasswordManager.cs
    │   ├── PepperDash.Core.csproj
    │   ├── PepperDashCore.build/
    │   │   └── net472/
    │   │       ├── PepperDashCore.props
    │   │       └── PepperDashCore.targets
    │   ├── Properties/
    │   │   └── ControlSystem.cfg
    │   ├── SystemInfo/
    │   │   ├── EventArgs and Constants.cs
    │   │   ├── SystemInfoConfig.cs
    │   │   └── SystemInfoToSimpl.cs
    │   ├── Web/
    │   │   ├── BouncyCertificate.cs
    │   │   ├── RequestHandlers/
    │   │   │   ├── DefaultRequestHandler.cs
    │   │   │   ├── WebApiBaseRequestAsyncHandler.cs
    │   │   │   └── WebApiBaseRequestHandler.cs
    │   │   └── WebApiServer.cs
    │   ├── WebApi/
    │   │   └── Presets/
    │   │       ├── Preset.cs
    │   │       ├── User.cs
    │   │       └── WebApiPasscodeClient.cs
    │   └── XSigUtility/
    │       ├── Serialization/
    │       │   ├── IXSigSerialization.cs
    │       │   └── XSigSerializationException.cs
    │       ├── Tokens/
    │       │   ├── XSigAnalogToken.cs
    │       │   ├── XSigDigitalToken.cs
    │       │   ├── XSigSerialToken.cs
    │       │   ├── XSigToken.cs
    │       │   └── XSigTokenType.cs
    │       ├── XSigHelpers.cs
    │       ├── XSigTokenStreamReader.cs
    │       └── XSigTokenStreamWriter.cs
    ├── PepperDash.Essentials/
    │   ├── AssetLoader.cs
    │   ├── ClassDiagram1.cd
    │   ├── ControlSystem.cs
    │   ├── Example Configuration/
    │   │   ├── EssentialsHuddleSpaceRoom/
    │   │   │   └── configurationFile-HuddleSpace-2-Source.json
    │   │   ├── EssentialsHuddleVtc1Room/
    │   │   │   └── configurationFile-mockVideoCodec_din-ap3_-_dm4x1.json
    │   │   └── SIMPLBridging/
    │   │       ├── SIMPLBridgeExample_configurationFile.json
    │   │       └── configurationFile-dmps3300c-avRouting.json
    │   ├── Factory/
    │   │   └── DeviceFactory.cs
    │   ├── HttpLogoServer.cs
    │   ├── PepperDash.Essentials.csproj
    │   ├── Properties/
    │   │   ├── ControlSystem.cfg
    │   │   └── UpdateAssemblyVersion.ps1
    │   ├── SGD/
    │   │   ├── PepperDash Essentials TSW-560.sgd
    │   │   ├── PepperDash Essentials TSW-760.sgd
    │   │   └── PepperDash Essentials iPad.sgd
    │   └── app.config
    ├── PepperDash.Essentials.Core/
    │   ├── Bridges/
    │   │   ├── BridgeBase.cs
    │   │   ├── BridgeHelper.cs
    │   │   ├── IBridge.cs
    │   │   └── JoinMaps/
    │   │       ├── AirMediaControllerJoinMap.cs
    │   │       ├── AppleTvJoinMap.cs
    │   │       ├── C2nRthsControllerJoinMap.cs
    │   │       ├── CameraControllerJoinMap.cs
    │   │       ├── CenOdtOccupancySensorBaseJoinMap.cs
    │   │       ├── DisplayControllerJoinMap.cs
    │   │       ├── DmBladeChassisControllerJoinMap.cs
    │   │       ├── DmChassisControllerJoinMap.cs
    │   │       ├── DmRmcControllerJoinMap.cs
    │   │       ├── DmTxControllerJoinMap.cs
    │   │       ├── DmpsAudioOutputControllerJoinMap.cs
    │   │       ├── DmpsMicrophoneControllerJoinMap.cs
    │   │       ├── DmpsRoutingControllerJoinMap.cs
    │   │       ├── GenericIrControllerJoinMap.cs
    │   │       ├── GenericLightingJoinMap.cs
    │   │       ├── GenericRelayControllerJoinMap.cs
    │   │       ├── GlsOccupancySensorBaseJoinMap.cs
    │   │       ├── GlsPartitionSensorJoinMap.cs
    │   │       ├── HdMdNxM4kEControllerJoinMap.cs
    │   │       ├── HdMdxxxCEControllerJoinMap.cs
    │   │       ├── HdPsXxxControllerJoinMap.cs
    │   │       ├── Hrxxx0WirelessRemoteControllerJoinMap.cs
    │   │       ├── IAnalogInputJoinMap.cs
    │   │       ├── IBasicCommunicationJoinMap.cs
    │   │       ├── IDigitalInputJoinMap.cs
    │   │       ├── IDigitalOutputJoinMap.cs
    │   │       ├── IRBlurayBaseJoinMap.cs
    │   │       ├── PduJoinMapBase.cs
    │   │       ├── SetTopBoxControllerJoinMap.cs
    │   │       ├── StatusSignControllerJoinMap.cs
    │   │       ├── SystemMonitorJoinMap.cs
    │   │       └── VideoCodecControllerJoinMap.cs
    │   ├── Comm and IR/
    │   │   ├── CecPortController.cs
    │   │   ├── ComPortController.cs
    │   │   ├── ComSpecJsonConverter.cs
    │   │   ├── CommBridge.cs
    │   │   ├── CommFactory.cs
    │   │   ├── CommunicationExtras.cs
    │   │   ├── ConsoleCommMockDevice.cs
    │   │   ├── GenericComm.cs
    │   │   ├── GenericHttpClient.cs
    │   │   └── IRPortHelper.cs
    │   ├── Config/
    │   │   ├── AudioControlPointListItem.cs
    │   │   ├── BaseStreamingDeviceProperties.cs
    │   │   ├── BasicConfig.cs
    │   │   ├── ConfigPropertiesHelpers.cs
    │   │   ├── DeviceConfig.cs
    │   │   ├── Essentials/
    │   │   │   ├── ConfigReader.cs
    │   │   │   ├── ConfigUpdater.cs
    │   │   │   ├── ConfigWriter.cs
    │   │   │   └── EssentialsConfig.cs
    │   │   ├── ILoadConfig.cs
    │   │   ├── InfoConfig.cs
    │   │   └── SourceDevicePropertiesConfigBase.cs
    │   ├── Crestron/
    │   │   ├── CrestronGenericBaseDevice.cs
    │   │   └── CrestronGenericBaseDevice.cs.orig
    │   ├── CrestronIO/
    │   │   ├── GenericDigitalInputDevice.cs
    │   │   ├── GenericRelayDevice.cs
    │   │   ├── GenericVersiportAnalogInputDevice.cs
    │   │   ├── GenericVersiportInputDevice.cs
    │   │   ├── GenericVersiportOutputDevice.cs
    │   │   ├── IAnalogInput.cs
    │   │   ├── IDigitalInput.cs
    │   │   ├── IDigitalOutput.cs
    │   │   ├── IHasCresnetBranches.cs
    │   │   ├── IOPortConfig.cs
    │   │   └── ISwitchedOutput.cs
    │   ├── Device Info/
    │   │   ├── DeviceInfo.cs
    │   │   ├── DeviceInfoEventArgs.cs
    │   │   ├── IDeviceInfoProvider.cs
    │   │   └── NetworkDeviceHelpers.cs
    │   ├── DeviceControlsParentInterfaces/
    │   │   └── IPresentationSource.cs
    │   ├── DeviceTypeInterfaces/
    │   │   ├── IAudioZone.cs
    │   │   ├── IAudioZones.cs
    │   │   ├── IBasicVolumeControls.cs
    │   │   ├── IBasicVolumeWithFeedback.cs
    │   │   ├── IBasicVolumeWithFeedbackAdvanced.cs
    │   │   ├── IChannel.cs
    │   │   ├── IColorFunctions.cs
    │   │   ├── ICustomMobileControl.cs
    │   │   ├── IDPad.cs
    │   │   ├── IDiscPlayerControls.cs
    │   │   ├── IDisplay.cs
    │   │   ├── IDisplayBasic.cs
    │   │   ├── IDumbSource.cs
    │   │   ├── IDvr.cs
    │   │   ├── IEmergencyOSD.cs
    │   │   ├── IFullAudioSettings.cs
    │   │   ├── IHasBranding.cs
    │   │   ├── IHasCurrentVolumeControls.cs
    │   │   ├── IHasFarEndContentStatus.cs
    │   │   ├── IHasInputs.cs
    │   │   ├── IHasMuteControl.cs
    │   │   ├── IHasMuteControlWithFeedback.cs
    │   │   ├── IHasPhoneDialing.cs
    │   │   ├── IHasScreensWithLayouts.cs
    │   │   ├── IHasSurroundSoundModes.cs
    │   │   ├── IHasVolumeControl.cs
    │   │   ├── IHasVolumeControlWithFeedback.cs
    │   │   ├── IHasVolumeDevice.cs
    │   │   ├── IHasWebView.cs
    │   │   ├── IHumiditySensor.cs
    │   │   ├── ILanguageDefinition.cs
    │   │   ├── ILanguageProvider.cs
    │   │   ├── ILevelControls.cs
    │   │   ├── IMeterFeedback.cs
    │   │   ├── IMobileControl.cs
    │   │   ├── IMobileControlAction.cs
    │   │   ├── IMobileControlCrestronTouchpanelController.cs
    │   │   ├── IMobileControlMessage.cs
    │   │   ├── IMobileControlMessenger.cs
    │   │   ├── IMobileControlMessengerWithSubscriptions.cs
    │   │   ├── IMobileControlRoomMessenger.cs
    │   │   ├── IMobileControlTouchpanelController.cs
    │   │   ├── INumeric.cs
    │   │   ├── INvxNetworkPortInformation.cs
    │   │   ├── IPasswordPrompt.cs
    │   │   ├── IPower.cs
    │   │   ├── IProjectorScreenLiftControl.cs
    │   │   ├── ISelectableItem.cs
    │   │   ├── ISelectableItems.cs
    │   │   ├── ISetTopBoxControls.cs
    │   │   ├── IStateFeedback.cs
    │   │   ├── ITemperatureSensor.cs
    │   │   ├── ITransport.cs
    │   │   ├── ITvPresetsProvider.cs
    │   │   ├── IUiDisplayInfo.cs
    │   │   ├── IWarmingCooling.cs
    │   │   ├── LanguageLabel.cs
    │   │   ├── Template.cs
    │   │   └── eVolumeLevelUnits.cs
    │   ├── Devices/
    │   │   ├── AudioControlListItemBase.cs
    │   │   ├── AudioInterfaces.cs
    │   │   ├── CameraListItem.cs
    │   │   ├── CodecInterfaces.cs
    │   │   ├── ConfigSnippetAttribute.cs
    │   │   ├── CrestronProcessor.cs
    │   │   ├── DescriptionAttribute.cs
    │   │   ├── DestinationListItem.cs
    │   │   ├── DeviceApiBase.cs
    │   │   ├── DeviceFeedbackExtensions.cs
    │   │   ├── DeviceJsonApi.cs
    │   │   ├── DeviceManager.cs
    │   │   ├── DisplayUiConstants.cs
    │   │   ├── EssentialsBridgeableDevice.cs
    │   │   ├── EssentialsDevice.cs
    │   │   ├── EssentialsDeviceFactory.cs
    │   │   ├── EssentialsPluginDevelopmentDeviceFactory.cs
    │   │   ├── EssentialsPluginDeviceFactory.cs
    │   │   ├── GenericIRController.cs
    │   │   ├── GenericMonitoredTcpDevice.cs
    │   │   ├── IAttachVideoStatus.cs
    │   │   ├── IAttachVideoStatusExtensions.cs
    │   │   ├── IDisplayUsage.cs
    │   │   ├── IDspPresets.cs
    │   │   ├── IHasFeedbacks.cs
    │   │   ├── IMakeModel.cs
    │   │   ├── IOnline.cs
    │   │   ├── IProjectorInterfaces.cs
    │   │   ├── IReconfigurableDevice.cs
    │   │   ├── IUsageTracking.cs
    │   │   ├── IrOutputPortController.cs
    │   │   ├── LevelControlListItem.cs
    │   │   ├── PduInterfaces.cs
    │   │   ├── PowerInterfaces.cs
    │   │   ├── PresentationDeviceType.cs
    │   │   ├── PresetListItem.cs
    │   │   ├── ProcessorExtensionDeviceFactory.cs
    │   │   ├── ReconfigurableDevice.cs
    │   │   ├── SmartObjectBaseTypes.cs
    │   │   ├── SourceListItem.cs
    │   │   └── VolumeDeviceChangeEventArgs.cs
    │   ├── Ethernet/
    │   │   └── EthernetStatistics.cs
    │   ├── Extensions/
    │   │   ├── IpAddressExtensions.cs
    │   │   ├── JsonExtensions.cs
    │   │   └── StringExtensions.cs
    │   ├── Factory/
    │   │   ├── DeviceFactory.cs
    │   │   ├── DeviceFactoryWrapper.cs
    │   │   ├── IDeviceFactory.cs
    │   │   ├── IProcessorExtensionDeviceFactory.cs
    │   │   ├── ProcessorExtensionDeviceFactory.cs
    │   │   └── ReadyEventArgs.cs
    │   ├── Feedbacks/
    │   │   ├── BoolFeedback.cs
    │   │   ├── BoolFeedbackOneShot.cs
    │   │   ├── BoolFeedbackPulseExtender.cs
    │   │   ├── BoolOutputLogicals.cs
    │   │   ├── FeedbackBase.cs
    │   │   ├── FeedbackCollection.cs
    │   │   ├── FeedbackEventArgs.cs
    │   │   ├── IntFeedback.cs
    │   │   ├── SerialFeedback.cs
    │   │   └── StringFeedback.cs
    │   ├── File/
    │   │   └── FileIO.cs
    │   ├── Fusion/
    │   │   ├── EssentialsHuddleSpaceRoomFusionRoomJoinMap.cs
    │   │   ├── FusionCustomPropertiesBridge.cs
    │   │   ├── FusionEventHandlers.cs
    │   │   ├── FusionProcessorQueries.cs
    │   │   ├── FusionRviDataClasses.cs
    │   │   ├── IEssentialsRoomFusionController.cs
    │   │   ├── IEssentialsRoomFusionControllerFactory.cs
    │   │   ├── IEssentialsRoomFusionControllerPropertiesConfig.cs
    │   │   ├── IFusionHelpRequest.cs
    │   │   └── eFusionHelpResponse.cs
    │   ├── Global/
    │   │   ├── EthernetAdapterInfo.cs
    │   │   ├── Global.cs
    │   │   ├── JobTimer.cs
    │   │   └── Scheduler.cs
    │   ├── InUseTracking/
    │   │   ├── IInUseTracking.cs
    │   │   └── InUseTracking.cs
    │   ├── Interfaces/
    │   │   ├── ILogStrings.cs
    │   │   └── ILogStringsWithLevel.cs
    │   ├── JoinMaps/
    │   │   └── JoinMapBase.cs
    │   ├── License/
    │   │   └── EssentialsLicenseManager.cs
    │   ├── Lighting/
    │   │   ├── Lighting Interfaces.cs
    │   │   └── LightingScene.cs
    │   ├── Microphone Privacy/
    │   │   ├── MicrophonePrivacyController.cs
    │   │   └── MicrophonePrivacyControllerConfig.cs
    │   ├── Monitoring/
    │   │   ├── CrestronGenericBaseCommunicationMonitor.cs
    │   │   ├── GenericCommunicationMonitor.cs
    │   │   ├── Interfaces.cs
    │   │   ├── StatusMonitorBase.cs
    │   │   ├── StatusMonitorCollection.cs
    │   │   └── SystemMonitorController.cs
    │   ├── PartitionSensor/
    │   │   ├── EssentialsPartitionController.cs
    │   │   └── IPartitionStateProvider.cs
    │   ├── PepperDash.Essentials.Core.csproj
    │   ├── PepperDash_Essentials_Core.csproj.DotSettings
    │   ├── Plugins/
    │   │   ├── IPluginDeviceFactory.cs
    │   │   └── PluginLoader.cs
    │   ├── Presets/
    │   │   ├── DevicePresets.cs
    │   │   ├── DevicePresetsView.cs
    │   │   ├── Interfaces.cs
    │   │   ├── PresetBase.cs
    │   │   ├── PresetChannel.cs
    │   │   └── PresetsListSubpageReferenceListItem.cs
    │   ├── Properties/
    │   │   └── ControlSystem.cfg
    │   ├── Queues/
    │   │   ├── ComsMessage.cs
    │   │   ├── GenericQueue.cs
    │   │   ├── IQueue.cs
    │   │   ├── IQueueMessage.cs
    │   │   ├── ProcessStringMessage.cs
    │   │   └── StringResponseProcessor.cs
    │   ├── Ramps and Increments/
    │   │   ├── ActionIncrementer.cs
    │   │   ├── NumericalHelpers.cs
    │   │   └── UshortSigIncrementer.cs
    │   ├── Room/
    │   │   ├── Behaviours/
    │   │   │   └── RoomOnToDefaultSourceWhenOccupied.cs
    │   │   ├── Combining/
    │   │   │   ├── EssentialsRoomCombiner.cs
    │   │   │   ├── EssentialsRoomCombinerPropertiesConfig.cs
    │   │   │   ├── IEssentialsRoomCombiner.cs
    │   │   │   └── RoomCombinationScenario.cs
    │   │   ├── Config/
    │   │   │   ├── EssentialsDualDisplayRoomPropertiesConfig.cs
    │   │   │   ├── EssentialsHuddleRoomPropertiesConfig.cs
    │   │   │   ├── EssentialsHuddleVtc1PropertiesConfig.cs
    │   │   │   ├── EssentialsNDisplayRoomPropertiesConfig.cs
    │   │   │   ├── EssentialsPresentationPropertiesConfig.cs
    │   │   │   ├── EssentialsRoomConfig.cs
    │   │   │   ├── EssentialsRoomEmergencyConfig.cs
    │   │   │   ├── EssentialsRoomScheduledEventsConfig.cs
    │   │   │   ├── EssentialsTechRoomConfig.cs
    │   │   │   ├── EssentialsVolumeLevelConfig.cs
    │   │   │   └── SimplRoomPropertiesConfig.cs
    │   │   ├── EsentialsRoomEmergencyContactClosure.cs
    │   │   ├── EssentialsRoomBase.cs
    │   │   ├── IEssentialsRoom.cs
    │   │   ├── IRoomEventSchedule.cs
    │   │   ├── Interfaces.cs
    │   │   ├── Room.cs
    │   │   └── iOccupancyStatusProvider.cs
    │   ├── Routing/
    │   │   ├── DummyRoutingInputsDevice.cs
    │   │   ├── Extensions.cs
    │   │   ├── ICardPortsDevice.cs
    │   │   ├── ICurrentSources.cs
    │   │   ├── IHasCurrentSourceInfoChange.cs
    │   │   ├── IInputSync.cs
    │   │   ├── IMatrixRouting.cs
    │   │   ├── IRmcRouting.cs
    │   │   ├── IRmcRoutingWithFeedback.cs
    │   │   ├── IRouting.cs
    │   │   ├── IRoutingFeedback.cs
    │   │   ├── IRoutingHasVideoInputSyncFeedbacks.cs
    │   │   ├── IRoutingInputSlot.cs
    │   │   ├── IRoutingInputs.cs
    │   │   ├── IRoutingInputsOutputs.cs
    │   │   ├── IRoutingNumeric.cs
    │   │   ├── IRoutingNumericWithFeedback.cs
    │   │   ├── IRoutingOutputSlot.cs
    │   │   ├── IRoutingOutputs.cs
    │   │   ├── IRoutingSink.cs
    │   │   ├── IRoutingSinkWithFeedback.cs
    │   │   ├── IRoutingSinkWithSwitching.cs
    │   │   ├── IRoutingSlot.cs
    │   │   ├── IRoutingSource.cs
    │   │   ├── IRoutingWithClear.cs
    │   │   ├── IRoutingWithFeedback.cs
    │   │   ├── ITxRouting.cs
    │   │   ├── ITxRoutingWithFeedback.cs
    │   │   ├── RouteDescriptor.cs
    │   │   ├── RouteDescriptorCollection.cs
    │   │   ├── RouteRequest.cs
    │   │   ├── RouteRequestQueueItem.cs
    │   │   ├── RouteSwitchDescriptor.cs
    │   │   ├── RoutingFeedbackManager.cs
    │   │   ├── RoutingInputPort.cs
    │   │   ├── RoutingInputPortWithVideoStatuses.cs
    │   │   ├── RoutingNumericEventArgs.cs
    │   │   ├── RoutingOutputPort.cs
    │   │   ├── RoutingPort.cs
    │   │   ├── RoutingPortCollection.cs
    │   │   ├── RoutingPortNames.cs
    │   │   ├── TieLine.cs
    │   │   ├── TieLineConfig.cs
    │   │   ├── eRoutingPortConnectionType.cs
    │   │   └── eRoutingSignalType.cs
    │   ├── Secrets/
    │   │   ├── CrestronGlobalSecretsProvider.cs
    │   │   ├── CrestronLocalSecretsProvider.cs
    │   │   ├── CrestronSecret.cs
    │   │   ├── Interfaces.cs
    │   │   ├── SecretsManager.cs
    │   │   └── SecretsPropertiesConfig.cs
    │   ├── Shades/
    │   │   ├── Shade Interfaces.cs
    │   │   └── ShadeBase.cs
    │   ├── SigHelper.cs
    │   ├── SmartObjects/
    │   │   ├── SmartObjectDPad.cs
    │   │   ├── SmartObjectDynamicList.cs
    │   │   ├── SmartObjectHelperBase.cs
    │   │   ├── SmartObjectNumeric.cs
    │   │   └── SubpageReferencList/
    │   │       ├── SourceListSubpageReferenceList.cs
    │   │       ├── SubpageReferenceList.cs
    │   │       └── SubpageReferenceListItem.cs
    │   ├── Timers/
    │   │   ├── CountdownTimer.cs
    │   │   └── RetriggerableTimer.cs
    │   ├── Touchpanels/
    │   │   ├── CrestronTouchpanelPropertiesConfig.cs
    │   │   ├── Interfaces.cs
    │   │   ├── Keyboards/
    │   │   │   └── HabaneroKeyboardController.cs
    │   │   ├── ModalDialog.cs
    │   │   ├── Mpc3Touchpanel.cs
    │   │   └── TriListExtensions.cs
    │   ├── TriListBridges/
    │   │   └── HandlerBridge.cs
    │   ├── UI/
    │   │   └── TouchpanelBase.cs
    │   ├── UI PageManagers/
    │   │   ├── BlurayPageManager.cs
    │   │   ├── PageManager.cs
    │   │   ├── SetTopBoxThreePanelPageManager.cs
    │   │   ├── SetTopBoxTwoPanelPageManager.cs
    │   │   └── SinglePageManager.cs
    │   ├── Utilities/
    │   │   └── ActionSequence.cs
    │   ├── VideoStatus/
    │   │   └── VideoStatusOutputs.cs
    │   ├── Web/
    │   │   ├── EssentialsWebApi.cs
    │   │   ├── EssentialsWebApiFactory.cs
    │   │   ├── EssentialsWebApiHelpers.cs
    │   │   ├── EssentialsWebApiPropertiesConfig.cs
    │   │   └── RequestHandlers/
    │   │       ├── AppDebugRequestHandler.cs
    │   │       ├── DebugSessionRequestHandler.cs
    │   │       ├── DefaultRequestHandler.cs
    │   │       ├── DevJsonRequestHandler.cs
    │   │       ├── DevListRequestHandler.cs
    │   │       ├── DevMethodsRequestHandler.cs
    │   │       ├── DevPropsRequestHandler.cs
    │   │       ├── DisableAllStreamDebugRequestHandler.cs
    │   │       ├── DoNotLoadConfigOnNextBootRequestHandler.cs
    │   │       ├── GetFeedbacksForDeviceRequestHandler.cs
    │   │       ├── GetJoinMapForBridgeKeyRequestHandler.cs
    │   │       ├── GetJoinMapForDeviceKeyRequestHandler.cs
    │   │       ├── GetRoutesHandler.cs
    │   │       ├── GetRoutingDevicesAndTieLinesHandler.cs
    │   │       ├── GetRoutingPortsHandler.cs
    │   │       ├── GetTieLinesRequestHandler.cs
    │   │       ├── GetTypesByFilterRequestHandler.cs
    │   │       ├── GetTypesRequestHandler.cs
    │   │       ├── LoadConfigRequestHandler.cs
    │   │       ├── LoginRequestHandler.cs
    │   │       ├── ReportVersionsRequestHandler.cs
    │   │       ├── RestartProgramRequestHandler.cs
    │   │       ├── ServeDebugAppRequestHandler.cs
    │   │       ├── SetDeviceStreamDebugRequestHandler.cs
    │   │       └── ShowConfigRequestHandler.cs
    │   └── app.config
    ├── PepperDash.Essentials.Devices.Common/
    │   ├── Audio/
    │   │   └── GenericAudioOut.cs
    │   ├── AudioCodec/
    │   │   ├── AudioCodecBase.cs
    │   │   ├── Interfaces/
    │   │   │   ├── IAudioCodecInfo.cs
    │   │   │   └── IHasAudioCodec.cs
    │   │   └── MockAC/
    │   │       ├── MockAC.cs
    │   │       └── MockAcPropertiesConfig.cs
    │   ├── Cameras/
    │   │   ├── CameraBase.cs
    │   │   ├── CameraVisca.cs
    │   │   ├── IHasCameraPresets.cs
    │   │   └── Interfaces/
    │   │       ├── CameraSelectedEventArgs.cs
    │   │       ├── IAmFarEndCamera.cs
    │   │       ├── ICameraCapabilities.cs
    │   │       ├── IHasAutoFocusMode.cs
    │   │       ├── IHasCameraAutoMode.cs
    │   │       ├── IHasCameraControls.cs
    │   │       ├── IHasCameraFocusControl.cs
    │   │       ├── IHasCameraMute.cs
    │   │       ├── IHasCameraMuteWithUnmuteRequest.cs
    │   │       ├── IHasCameraOff.cs
    │   │       ├── IHasCameraPanControl.cs
    │   │       ├── IHasCameraPtzControl.cs
    │   │       ├── IHasCameraTiltControl.cs
    │   │       ├── IHasCameraZoomControl.cs
    │   │       ├── IHasCameras.cs
    │   │       ├── IHasCamerasWithControls.cs
    │   │       ├── IHasCodecCameras.cs
    │   │       ├── IHasFarEndCameraControl.cs
    │   │       └── eCameraControlMode.cs
    │   ├── Codec/
    │   │   ├── Call.cs
    │   │   ├── Cisco/
    │   │   │   ├── IPresenterTrack.cs
    │   │   │   └── ISpeakerTrack.cs
    │   │   ├── CodecActiveCallItem.cs
    │   │   ├── CodecDirectory.cs
    │   │   ├── CodecScheduleAwareness.cs
    │   │   ├── ContactMethod.cs
    │   │   ├── DirectoryContact.cs
    │   │   ├── DirectoryEventArgs.cs
    │   │   ├── DirectoryFolder.cs
    │   │   ├── DirectoryItem.cs
    │   │   ├── ICiscoCodecCameraConfig.cs
    │   │   ├── IHasCallHold.cs
    │   │   ├── IHasDirectoryHistoryStack.cs
    │   │   ├── IHasDoNotDisturb.cs
    │   │   ├── IHasExternalSourceSwitching.cs
    │   │   ├── IInvitableContact.cs
    │   │   ├── InvitableDirectoryContact.cs
    │   │   ├── Meeting.cs
    │   │   ├── MeetingEventArgs.cs
    │   │   ├── eCodecCallDirection.cs
    │   │   ├── eCodecCallStatus.cs
    │   │   ├── eCodecCallType.cs
    │   │   ├── eContactMethodCallType.cs
    │   │   ├── eContactMethodDevice.cs
    │   │   ├── eMeetingEventChangeType.cs
    │   │   ├── eMeetingPrivacy.cs
    │   │   ├── iCodecAudio.cs
    │   │   ├── iHasCallFavorites.cs
    │   │   ├── iHasCallHistory.cs
    │   │   ├── iHasContentSharing.cs
    │   │   ├── iHasDialer.cs
    │   │   ├── iHasDirectory.cs
    │   │   └── iHasScheduleAwareness.cs
    │   ├── DSP/
    │   │   └── DspBase.cs
    │   ├── DeviceFactory.cs
    │   ├── Displays/
    │   │   ├── BasicIrDisplay.cs
    │   │   ├── DisplayBase.cs
    │   │   ├── InputInterfaces.cs
    │   │   ├── MockDisplay.cs
    │   │   ├── MockDisplayInputs.cs
    │   │   ├── ScreenLiftController.cs
    │   │   ├── ScreenLiftControllerConfigProperties.cs
    │   │   ├── ScreenLiftRelaysConfig.cs
    │   │   ├── TwoWayDisplayBase.cs
    │   │   └── eScreenLiftControlMode.cs
    │   ├── Generic/
    │   │   ├── GenericSink.cs
    │   │   └── GenericSource.cs
    │   ├── Lighting/
    │   │   └── LightingBase.cs
    │   ├── PepperDash.Essentials.Devices.Common.csproj
    │   ├── Properties/
    │   │   └── ControlSystem.cfg
    │   ├── Room/
    │   │   ├── IEssentialsHuddleSpaceRoom.cs
    │   │   ├── IEssentialsHuddleVtc1Room.cs
    │   │   ├── IEssentialsRoomPropertiesConfig.cs
    │   │   └── IEssentialsTechRoom.cs
    │   ├── SetTopBox/
    │   │   ├── IRSetTopBoxBase.cs
    │   │   ├── IRSetTopBoxBaseFactory.cs
    │   │   └── SetTopBoxPropertiesConfig.cs
    │   ├── Shades/
    │   │   ├── RelayControlledShade.cs
    │   │   ├── ShadeBase.cs
    │   │   └── ShadeController.cs
    │   ├── SoftCodec/
    │   │   ├── BlueJeansPc.cs
    │   │   ├── BlueJeansPcFactory.cs
    │   │   ├── GenericSoftCodec.cs
    │   │   ├── GenericSoftCodecFactory.cs
    │   │   └── GenericSoftCodecProperties.cs
    │   ├── Sources/
    │   │   ├── InRoomPc.cs
    │   │   ├── InRoomPcFactory.cs
    │   │   ├── Laptop.cs
    │   │   └── LaptopFactory.cs
    │   ├── Streaming/
    │   │   ├── AppleTV.cs
    │   │   ├── AppleTVFactory.cs
    │   │   ├── AppleTvIrCommands.cs
    │   │   ├── Roku.cs
    │   │   └── Roku2Factory.cs
    │   └── VideoCodec/
    │       ├── CiscoCodec/
    │       │   ├── CallHistoryDataClasses.cs
    │       │   ├── RoomPresets.cs
    │       │   ├── eCommandType.cs
    │       │   ├── eExternalSourceMode.cs
    │       │   └── eExternalSourceType.cs
    │       ├── CodecCommandWithLabel.cs
    │       ├── CodecPhonebookSyncState.cs
    │       ├── ConvertiblePreset.cs
    │       ├── Interfaces/
    │       │   ├── CodecParticipants.cs
    │       │   ├── IHasCodecLayouts.cs
    │       │   ├── IHasCodecSelfview.cs
    │       │   ├── IHasMeetingInfo.cs
    │       │   ├── IHasMeetingLock.cs
    │       │   ├── IHasMeetingRecording.cs
    │       │   ├── IHasMeetingRecordingWithPrompt.cs
    │       │   ├── IHasParticipantAudioMute.cs
    │       │   ├── IHasParticipantPinUnpin.cs
    │       │   ├── IHasParticipantVideoMute.cs
    │       │   ├── IHasParticipants.cs
    │       │   ├── IHasPresentationOnlyMeeting.cs
    │       │   ├── IHasSelfviewPosition.cs
    │       │   ├── IHasSelfviewSize.cs
    │       │   ├── IHasStandbyMode.cs
    │       │   ├── IHasStartMeeting.cs
    │       │   ├── IHasVideoCodec.cs
    │       │   ├── IJoinCalls.cs
    │       │   ├── MeetingInfo.cs
    │       │   ├── MeetingInfoEventArgs.cs
    │       │   ├── Participant.cs
    │       │   └── iVideoCodecInfo.cs
    │       ├── MockVC/
    │       │   ├── MockCodecDirectory.cs
    │       │   ├── MockVC.cs
    │       │   ├── MockVCCamera.cs
    │       │   └── MockVcPropertiesConfig.cs
    │       └── VideoCodecBase.cs
    ├── PepperDash.Essentials.MobileControl/
    │   ├── AuthorizationResponse.cs
    │   ├── ClientSpecificUpdateRequest.cs
    │   ├── IDelayedConfiguration.cs
    │   ├── MessageToClients.cs
    │   ├── MobileControlAction.cs
    │   ├── MobileControlConfig.cs
    │   ├── MobileControlDeviceFactory.cs
    │   ├── MobileControlEssentialsConfig.cs
    │   ├── MobileControlFactory.cs
    │   ├── MobileControlSimplDeviceBridge.cs
    │   ├── MobileControlSystemController.cs
    │   ├── PepperDash.Essentials.MobileControl.csproj
    │   ├── RoomBridges/
    │   │   ├── MobileControlBridgeBase.cs
    │   │   ├── MobileControlEssentialsRoomBridge.cs
    │   │   ├── MobileControlSIMPLRoomBridge.cs
    │   │   └── SourceDeviceMapDictionary.cs
    │   ├── Services/
    │   │   └── MobileControlApiService.cs
    │   ├── Touchpanel/
    │   │   ├── ITheme.cs
    │   │   ├── ITswAppControl.cs
    │   │   ├── ITswAppControlMessenger.cs
    │   │   ├── ITswZoomControlMessenger.cs
    │   │   ├── MobileControlTouchpanelController.cs
    │   │   ├── MobileControlTouchpanelProperties.cs
    │   │   └── ThemeMessenger.cs
    │   ├── TransmitMessage.cs
    │   ├── UserCodeChanged.cs
    │   ├── UserCodeChangedContent.cs
    │   ├── Utilities.cs
    │   ├── Volumes.cs
    │   ├── WebApiHandlers/
    │   │   ├── ActionPathsHandler.cs
    │   │   ├── DeleteAllUiClientsHandler.cs
    │   │   ├── MobileAuthRequestHandler.cs
    │   │   ├── MobileInfoHandler.cs
    │   │   └── UiClientHandler.cs
    │   └── WebSocketServer/
    │       ├── ConnectionClosedEventArgs.cs
    │       ├── DeviceInterfaceInfo.cs
    │       ├── JoinResponse.cs
    │       ├── JoinToken.cs
    │       ├── MobileControlWebsocketServer.cs
    │       ├── ServerTokenSecrets.cs
    │       ├── UiClient.cs
    │       ├── UiClientContext.cs
    │       ├── Version.cs
    │       └── WebSocketServerSecretProvider.cs
    └── PepperDash.Essentials.MobileControl.Messengers/
        ├── ContentTypes.cs
        ├── DeviceTypeExtensions/
        │   ├── DisplayBaseMessenger.cs
        │   ├── IChannelMessenger.cs
        │   ├── IColorMessenger.cs
        │   ├── IDPadMessenger.cs
        │   ├── IDvrMessenger.cs
        │   ├── IHasPowerMessenger.cs
        │   ├── INumericMessenger.cs
        │   ├── ISetTopBoxControlsMessenger.cs
        │   └── ITransportMessenger.cs
        ├── Messengers/
        │   ├── AudioCodecBaseMessenger.cs
        │   ├── CameraBaseMessenger.cs
        │   ├── CurrentSourcesMessenger.cs
        │   ├── DeviceEventMessageBase.cs
        │   ├── DeviceInfoMessenger.cs
        │   ├── DeviceMessageBase.cs
        │   ├── DevicePresetsModelMessenger.cs
        │   ├── DeviceStateMessageBase.cs
        │   ├── DeviceVolumeMessenger.cs
        │   ├── GenericMessenger.cs
        │   ├── IBasicVideoMuteWithFeedbackMessenger.cs
        │   ├── ICommunicationMonitorMessenger.cs
        │   ├── IDspPresetsMessenger.cs
        │   ├── IEssentialsRoomCombinerMessenger.cs
        │   ├── IHasCamerasMessenger.cs
        │   ├── IHasCamerasWithControlMessenger.cs
        │   ├── IHasCurrentSourceInfoMessenger.cs
        │   ├── IHasInputsMessenger.cs
        │   ├── IHasPowerControlWithFeedbackMessenger.cs
        │   ├── IHasScheduleAwarenessMessenger.cs
        │   ├── IHumiditySensor.cs
        │   ├── ILevelControlsMessenger.cs
        │   ├── IMatrixRoutingMessenger.cs
        │   ├── IProjectorScreenLiftControlMessenger.cs
        │   ├── IRunRouteActionMessenger.cs
        │   ├── ISelectableItemsMessenger.cs
        │   ├── IShutdownPromptTimerMessenger.cs
        │   ├── ISwitchedOutputMessenger.cs
        │   ├── ITechPasswordMessenger.cs
        │   ├── ITemperatureSensorMessenger.cs
        │   ├── LightingBaseMessenger.cs
        │   ├── MessengerBase.cs
        │   ├── PressAndHoldHandler.cs
        │   ├── RoomEventScheduleMessenger.cs
        │   ├── SIMPLAtcMessenger.cs
        │   ├── SIMPLCameraMessenger.cs
        │   ├── SIMPLDirectRouteMessenger.cs
        │   ├── SIMPLRouteMessenger.cs
        │   ├── SIMPLVtcMessenger.cs
        │   ├── ShadeBaseMessenger.cs
        │   ├── SimplMessengerPropertiesConfig.cs
        │   ├── SystemMonitorMessenger.cs
        │   ├── TwoWayDisplayBaseMessenger.cs
        │   └── VideoCodecBaseMessenger.cs
        ├── MobileControlMessage.cs
        ├── MobileControlSimpleContent.cs
        ├── PepperDash.Essentials.MobileControl.Messengers.csproj
        └── SIMPLJoinMaps/
            ├── MobileControlSIMPLRoomJoinMap.cs
            ├── MobileControlSIMPLRunDirectRouteActionJoinMap.cs
            ├── SIMPLAtcJoinMap.cs
            └── SIMPLVtcJoinMap.cs

================================================
FILE CONTENTS
================================================

================================================
FILE: .config/dotnet-tools.json
================================================
{
  "version": 1,
  "isRoot": true,
  "tools": {
    "csharpier": {
      "version": "1.2.4",
      "commands": [
        "csharpier"
      ],
      "rollForward": false
    }
  }
}

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]-"
labels: bug
assignees: ''

---

**Was this bug identified in a specific build version?**
Please note the build version where this bug was identified

**Describe the bug**
A clear and concise description of what the bug is.  

**Stacktrace**

Include a stack trace of the exception if possible.
```
Paste stack trace here
```

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Additional context**
Add any other context about the problem here.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: "[FEATURE]-"
labels: enhancement
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
If this is a request for support for a new device or type, be as specific as possible and include any pertinent manufacturer and model information.

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/ISSUE_TEMPLATE/rfi_request.md
================================================
---
name: Request for Information
about: Request specific information about capabilities of the framework
title: "[RFI]-"
labels: RFI
assignees: ''

---

**What is your request?**
Please provide as much detail as possible.


**What is the intended use case**
- [ ] Essentials Standalone Application
- [ ] Essentials + SIMPL Windows Hybrid

**User Interface Requirements**
- [ ] Not Applicable (logic only)
- [ ] Crestron Smart Graphics Touchpanel
- [ ] Cisco Touch10
- [ ] Mobile Control
- [ ] Crestron CH5 Touchpanel interface


**Additional context**
Add any other context or screenshots about the request here.


================================================
FILE: .github/scripts/GenerateVersionNumber-2.0.0.ps1
================================================
$latestVersion = [version]"2.0.0"

$newVersion = [version]$latestVersion
$phase = ""
$newVersionString = ""

switch -regex ($Env:GITHUB_REF) {
  '^refs\/pull\/*.' {
    $phase = 'beta';
    $newVersionString = "{0}-{1}-{2}" -f $newVersion, $phase, $Env:GITHUB_RUN_NUMBER
  }
  '^refs\/heads\/feature-2.0.0\/*.' {
    $phase = 'alpha'
    $newVersionString = "{0}-{1}-{2}" -f $newVersion, $phase, $Env:GITHUB_RUN_NUMBER
  }
  'development-2.0.0' {
    $phase = 'beta'
    $newVersionString = "{0}-{1}-{2}" -f $newVersion, $phase, $Env:GITHUB_RUN_NUMBER
  }  
}


Write-Output $newVersionString


================================================
FILE: .github/scripts/GenerateVersionNumber.ps1
================================================
$latestVersions = $(git tag --merged origin/main)
$latestVersion = [version]"0.0.0"
Write-Host "GITHUB_REF: $($Env:GITHUB_REF)"
Write-Host "GITHUB_HEAD_REF: $($Env:GITHUB_HEAD_REF)"
Write-Host "GITHUB_BASE_REF: $($Env:GITHUB_BASE_REF)"
Foreach ($version in $latestVersions) {
  Write-Host $version
  try {
    if (([version]$version) -ge $latestVersion) {
      $latestVersion = $version
      Write-Host "Setting latest version to: $latestVersion"
    }
  }
  catch {
    Write-Host "Unable to convert $($version). Skipping"
    continue;
  }
}

$newVersion = [version]$latestVersion
$phase = ""
$newVersionString = ""

switch -regex ($Env:GITHUB_REF) {
  '^refs\/pull\/*.' {
    $splitRef = $Env:GITHUB_REF -split "/"
    $phase = "pr$($splitRef[2])"
    $newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
  }
  '^refs\/heads\/main*.' {
    $newVersionString = "{0}.{1}.{2}" -f $newVersion.Major, $newVersion.Minor, $newVersion.Build
  }
  '^refs\/heads\/feature\/*.' {
    $phase = 'alpha'
    $newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
  }
  '^refs\/heads\/release\/*.' {
    $splitRef = $Env:GITHUB_REF -split "/"
    $version = [version]($splitRef[-1] -replace "v", "")
    $phase = 'rc'
    $newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $version.Major, $version.Minor, $version.Build, $phase, $Env:GITHUB_RUN_NUMBER
  }
  '^refs\/heads\/development*.' {
    $phase = 'beta'
    $newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
  }
  '^refs\/heads\/hotfix\/*.' {
    $phase = 'hotfix'
    $newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
  }
  '^refs\/heads\/bugfix\/*.' {
    $phase = 'hotfix'
    $newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
  }
  
}


Write-Output $newVersionString


================================================
FILE: .github/scripts/UpdateAssemblyVersion.ps1
================================================
function Update-SourceVersion {
    Param ([string]$Version)
    #$fullVersion = $Version
    $baseVersion = [regex]::Match($Version, "(\d+.\d+.\d+).*").captures.groups[1].value
    $NewAssemblyVersion = ‘AssemblyVersion("‘ + $baseVersion + ‘.*")’
    Write-Output "AssemblyVersion = $NewAssemblyVersion"
    $NewAssemblyInformationalVersion = ‘AssemblyInformationalVersion("‘ + $Version + ‘")’
    Write-Output "AssemblyInformationalVersion = $NewAssemblyInformationalVersion"

    foreach ($o in $input) {
        Write-output $o.FullName
        $TmpFile = $o.FullName + “.tmp”
        get-content $o.FullName |
        ForEach-Object {
            $_ -replace ‘AssemblyVersion\(".*"\)’, $NewAssemblyVersion } |
        ForEach-Object {
            $_ -replace ‘AssemblyInformationalVersion\(".*"\)’, $NewAssemblyInformationalVersion
        }  > $TmpFile 
        move-item $TmpFile $o.FullName -force
    }
}

function Update-AllAssemblyInfoFiles ( $version ) {
    foreach ($file in “AssemblyInfo.cs”, “AssemblyInfo.vb” ) {
        get-childitem -Path $Env:GITHUB_WORKSPACE -recurse | Where-Object { $_.Name -eq $file } | Update-SourceVersion $version ;
    }
}

# validate arguments
$r = [System.Text.RegularExpressions.Regex]::Match($args[0], "\d+\.\d+\.\d+.*");
if ($r.Success) {
    Write-Output "Updating Assembly Version to $args ...";
    Update-AllAssemblyInfoFiles $args[0];
}
else {
    Write-Output ” “;
    Write-Output “Error: Input version does not match x.y.z format!”
    Write-Output ” “;
    Write-Output "Unable to apply version to AssemblyInfo.cs files";
}


================================================
FILE: .github/scripts/ZipBuildOutput.ps1
================================================
# Uncomment these for local testing
# $Env:GITHUB_WORKSPACE = "C:\Working Directories\PD\essentials"
# $Env:SOLUTION_FILE = "PepperDashEssentials"
# $Env:VERSION = "0.0.0-buildType-test"

# Sets the root directory for the operation
$destination = "$($Env:GITHUB_HOME)\output"
New-Item -ItemType Directory -Force -Path ($destination)
Get-ChildItem ($destination)
$exclusions = @(git submodule foreach --quiet 'echo $name')
$exclusions += "Newtonsoft.Compact.Json.dll"
# Trying to get any .json schema files (not currently working)
# Gets any files with the listed extensions.
Get-ChildItem -recurse -Path "$($Env:GITHUB_WORKSPACE)" -include "*.clz", "*.cpz", "*.cplz", "*.dll", "*.nuspec" | ForEach-Object {
  $allowed = $true;
  # Exclude any files in submodules
  foreach ($exclude in $exclusions) {
    if ((Split-Path $_.FullName -Parent).contains("$($exclude)")) {
      $allowed = $false;
      break;
    }
  }
  if ($allowed) {
    Write-Host "allowing $($_)"
    $_;
  }
} | Copy-Item -Destination ($destination) -Force
Write-Host "Getting matching files..."
# Get any files from the output folder that match the following extensions
Get-ChildItem -Path $destination | Where-Object { ($_.Extension -eq ".clz") -or ($_.Extension -eq ".cpz" -or ($_.Extension -eq ".cplz")) } | ForEach-Object { 
  # Replace the extensions with dll and xml and create an array 
  # Removed dll file capture, as previous step should capture all of them. Add if needed-> $($_ -replace "cpz|clz|cplz", "dll"),
  $filenames = @($($_ -replace "cpz|clz|cplz", "xml"))
  Write-Host "Filenames:"
  Write-Host $filenames
  if ($filenames.length -gt 0) {
    # Attempt to get the files and return them to the output directory
    Get-ChildItem -Recurse -Path "$($Env:GITHUB_WORKSPACE)" -include $filenames | Copy-Item -Destination ($destination) -Force
  }
}

Get-ChildItem -Path $destination\*.cpz | Rename-Item -NewName { "$($_.BaseName)-$($Env:VERSION)$($_.Extension)" }
Compress-Archive -Path $destination -DestinationPath "$($Env:GITHUB_WORKSPACE)\$($Env:SOLUTION_FILE)-$($Env:VERSION).zip" -Force
Write-Host "Output Contents post Zip"
Get-ChildItem -Path $destination

================================================
FILE: .github/workflows/EssentialsPlugins-builds-4-series-caller.yml
================================================
name: Build PepperDash Essentials

on:
  push:
    branches:
      - '**'

jobs:
  getVersion:
    uses: PepperDash/workflow-templates/.github/workflows/essentialsplugins-getversion.yml@main
    secrets: inherit
  build-4Series:
    uses: PepperDash/workflow-templates/.github/workflows/essentialsplugins-4Series-builds.yml@main
    secrets: inherit
    needs: getVersion
    if: needs.getVersion.outputs.newVersion == 'true'
    with:
      newVersion: ${{ needs.getVersion.outputs.newVersion }}
      version: ${{ needs.getVersion.outputs.version }}
      tag: ${{ needs.getVersion.outputs.tag }}
      channel: ${{ needs.getVersion.outputs.channel }}
      bypassPackageCheck: true
      devToolsVersion: ${{ vars.ESSENTIALSDEVTOOLSVERSION }}

================================================
FILE: .github/workflows/publish-docs.yml
================================================
name: Publish Docs

# Trigger the action on push to main
on:
  push:
    branches:      
      - main

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
  actions: read
  pages: write
  id-token: write

# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
  group: "pages"
  cancel-in-progress: false
  
jobs:
  publish-docs:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v4
    - name: Dotnet Setup
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: 8.x

    - run: dotnet tool update -g docfx
    - run: docfx ./docs/docfx.json

    - name: Upload artifact
      uses: actions/upload-pages-artifact@v3
      with:
        # Upload entire repository
        path: './docs/_site'
    - name: Deploy to GitHub Pages
      id: deployment
      uses: actions/deploy-pages@v4

================================================
FILE: .gitignore
================================================
#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
SIMPLSharpLogs/
*.projectinfo
essentials-framework/EssentialDMTestConfig/
output/
packages/

PepperDashEssentials-0.0.0-buildType-test.zip
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd
essentials-framework/Essentials Interfaces/PepperDash_Essentials_Interfaces/PepperDash_Essentials_Interfaces.csproj
.DS_Store
/._PepperDash.Essentials.sln
.vscode/settings.json
_site/
api/
*.DS_Store
/._PepperDash.Essentials.4Series.sln
dotnet


================================================
FILE: .gitmodules
================================================


================================================
FILE: .releaserc.json
================================================
{
  "plugins": [
    [
      "@semantic-release/commit-analyzer",
      {
        "releaseRules": [
          { "scope": "force-patch", "release": "patch" },
          { "scope": "no-release", "release": false }
        ]
      }
    ],
    "@semantic-release/release-notes-generator",    
    ["@semantic-release/changelog", 
      {
        "changelogFile": "CHANGELOG.md"
      }
    ],
    [
      "@semantic-release/exec",
      {
        "verifyReleaseCmd": "echo \"newVersion=true\" >> $GITHUB_OUTPUT",
        "publishCmd": "echo \"version=${nextRelease.version}\" >> $GITHUB_OUTPUT && echo \"tag=${nextRelease.gitTag}\" >> $GITHUB_OUTPUT && echo \"type=${nextRelease.type}\" >> $GITHUB_OUTPUT && echo \"channel=${nextRelease.channel}\" >> $GITHUB_OUTPUT"
      }
    ]
  ],  
  "branches": [
    "main",
    {"name": "development", "prerelease": "beta", "channel": "beta"},
    {"name": "release", "prerelease": "rc", "channel": "rc"},
    {
      "name": "replace-me-feature-branch",
      "prerelease": "replace-me-prerelease",
      "channel": "replace-me-prerelease"
    }
  ]
}

================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "ms-dotnettools.vscode-dotnet-runtime",
    "ms-dotnettools.csharp",
    "ms-dotnettools.csdevkit",
    "vivaxy.vscode-conventional-commits",
    "mhutchie.git-graph"
  ]
}

================================================
FILE: CONTRIBUTING.md
================================================
# Contributors Guide

Essentials is an open source project. If you are interested in making it better,
there are many ways you can contribute. For example, you can:

- Submit a bug report
- Suggest a new feature
- Provide feedback by commenting on feature requests/proposals
- Propose a patch by submitting a pull request
- Suggest or submit documentation improvements
- Review outstanding pull requests
- Answer questions from other users
- Share the software with other users who are interested
- Teach others to use the software

## Bugs and Feature Requests

If you believe that you have found a bug or wish to propose a new feature,
please first search the existing [issues] to see if it has already been
reported. If you are unable to find an existing issue, consider using one of
the provided templates to create a new issue and provide as many details as you
can to assist in reproducing the bug or explaining your proposed feature.

## Patch Submission tips

Patches should be submitted in the form of Pull Requests to the Essentials
[repository] on GitHub. But first, consider the following tips to ensure a
smooth process when submitting a patch:

- Ensure that the patch compiles and does not break any build-time tests.
- Be understanding, patient, and friendly; developers may need time to review
  your submissions before they can take action or respond. This does not mean
  your contribution is not valued. If your contribution has not received a
  response in a reasonable time, consider commenting with a polite inquiry for
  an update.
- Limit your patches to the smallest reasonable change to achieve your intended
  goal. For example, do not make unnecessary indentation changes; but don't go
  out of your way to make the patch so minimal that it isn't easy to read,
  either. Consider the reviewer's perspective.
- Before submission, please squash your commits to using a message that starts
  with the issue number and a description of the changes.
- Isolate multiple patches from each other. If you wish to make several
  independent patches, do so in separate, smaller pull requests that can be
  reviewed more easily.
- Be prepared to answer questions from reviewers. They may have further
  questions before accepting your patch, and may even propose changes. Please
  accept this feedback constructively, and not as a rejection of your proposed
  change.
  
## GitFlow Branch Model
This repository adheres to the [GitFlow](https://nvie.com/posts/a-successful-git-branching-model/) branch model and is intitialized for GitFlow to make for consistent branch name prefixes.  Please take time to familiarize yourself with this model.

- `master` will contain the latest stable version of the framework and release builds will be created from tagged commits on `master`.
- HotFix/Patch Pull Requests should target `master` as the base branch.
- All other Pull Requests (bug fixes, enhancements, etc.) should target `development` as the base branch.
- `release/vX.Y.X` branches will be used for release candidates when moving new features from `development` to `master`.  
  Beta builds will be created from tagged commits on release candidate branches.

## Review

- We welcome code reviews from anyone. A committer is required to formally
  accept and merge the changes.
- Reviewers will be looking for things like threading issues, performance
  implications, API design, duplication of existing functionality, readability
  and code style, avoidance of bloat (scope-creep), etc.
- Reviewers will likely ask questions to better understand your change.
- Reviewers will make comments about changes to your patch:
    - MUST means that the change is required
    - SHOULD means that the change is suggested, further discussion on the
      subject may be required
    - COULD means that the change is optional

## Timeline and Managing Expectations

As we continue to engage contributors and learn best practices for running a successful open source project, our processes 
and guidance will likely evolve. We will try to communicate expectations as we are able and to always be responsive. We 
hope that the community will share their suggestions for improving this engagement.  Based on the level of initial interest 
we receive and the availability of resources to evaluate contributions, we anticipate the following:

- We will initially prioritize pull requests that include small bug fixes and code that addresses potential vulnerabilities   
  as well as pull requests that include improvements for processor language specifications because these require a 
  reasonable amount of effort to evaluate and will help us exercise and revise our process for accepting contributions.  In 
  other words, we are going to start small in order to work out the kinks first.
- We are committed to maintaining the integrity and security of our code base.  In addition to the careful review the 
  maintainers will give to code contributions to make sure they do not introduce new bugs or vulnerabilities, we will be 
  trying to identify best practices to incorporate with our open source project so that contributors can have more control 
  over whether their contributions are accepted. These might include things like style guides and requirements for tests and 
  documentation to accompany some code contributions.  As a result, it may take a long time for some contributions to be 
  accepted.  This does not mean we are ignoring them.
- We are committed to integrating this GitHub project with our team's regular development work flow so that the open source 
  project remains dynamic and relevant.  This may  affect our responsiveness and ability to accept pull requests 
  quickly.  This does not mean we are ignoring them.
- Not all innovative ideas need to be accepted as pull requests into this GitHub project to be valuable to the community.        
  There may be times when we recommend that you just share your code for some enhancement to Essentials from your own 
  repository. As we identify and recognize extensions that are of general interest to Essentials, we 
  may seek to incorporate them with our baseline.

## Legal

Consistent with Section D.6. of the GitHub Terms of Service as of 2019, and the MIT license, the project maintainer for this project accepts contributions using the inbound=outbound model.
When you submit a pull request to this repository (inbound), you are agreeing to license your contribution under the same terms as specified in [LICENSE] (outbound).

This is an open source project.
Contributions you make to this repository are completely voluntary.
When you submit an issue, bug report, question, enhancement, pull request, etc., you are offering your contribution without expectation of payment, you expressly waive any future pay claims against PepperDash related to your contribution, and you acknowledge that this does not create an obligation on the part of PepperDash of any kind.
Furthermore, your contributing to this project does not create an employer-employee relationship between the PepperDash and the contributor.

[issues]: https://github.com/PepperDash/Essentials/issues
[repository]: https://github.com/PepperDash/Essentials
[LICENSE]: https://github.com/PepperDash/Essentials/blob/master/LICENSE.md


================================================
FILE: Crestron-Library-Usage-Analysis.md
================================================
# 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)*


================================================
FILE: LICENSE.md
================================================
Copyright (c) <2020> PepperDash Technology Corporation

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

================================================
FILE: PepperDash.Essentials.4Series.sln
================================================

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33213.308
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PepperDash.Essentials.Devices.Common", "src\PepperDash.Essentials.Devices.Common\PepperDash.Essentials.Devices.Common.csproj", "{53E204B7-97DD-441D-A96C-721DF014DF82}"
	ProjectSection(ProjectDependencies) = postProject
		{E5336563-1194-501E-BC4A-79AD9283EF90} = {E5336563-1194-501E-BC4A-79AD9283EF90}
	EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PepperDash.Essentials", "src\PepperDash.Essentials\PepperDash.Essentials.csproj", "{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}"
	ProjectSection(ProjectDependencies) = postProject
		{E5336563-1194-501E-BC4A-79AD9283EF90} = {E5336563-1194-501E-BC4A-79AD9283EF90}
	EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PepperDash.Essentials.Core", "src\PepperDash.Essentials.Core\PepperDash.Essentials.Core.csproj", "{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}"
	ProjectSection(ProjectDependencies) = postProject
		{E5336563-1194-501E-BC4A-79AD9283EF90} = {E5336563-1194-501E-BC4A-79AD9283EF90}
	EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile Control", "Mobile Control", "{B24989D7-32B5-48D5-9AE1-5F3B17D25206}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash.Essentials.MobileControl", "src\PepperDash.Essentials.MobileControl\PepperDash.Essentials.MobileControl.csproj", "{F6D362DE-2256-44B1-927A-8CE4705D839A}"
	ProjectSection(ProjectDependencies) = postProject
		{E5336563-1194-501E-BC4A-79AD9283EF90} = {E5336563-1194-501E-BC4A-79AD9283EF90}
	EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash.Essentials.MobileControl.Messengers", "src\PepperDash.Essentials.MobileControl.Messengers\PepperDash.Essentials.MobileControl.Messengers.csproj", "{B438694F-8FF7-464A-9EC8-10427374471F}"
	ProjectSection(ProjectDependencies) = postProject
		{E5336563-1194-501E-BC4A-79AD9283EF90} = {E5336563-1194-501E-BC4A-79AD9283EF90}
	EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Essentials", "Essentials", "{AD98B742-8D85-481C-A69D-D8D8ABED39EA}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Core", "Core", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash.Core", "src\PepperDash.Core\PepperDash.Core.csproj", "{E5336563-1194-501E-BC4A-79AD9283EF90}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug 4.7.2|Any CPU = Debug 4.7.2|Any CPU
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{53E204B7-97DD-441D-A96C-721DF014DF82}.Debug 4.7.2|Any CPU.ActiveCfg = Debug 4.7.2|Any CPU
		{53E204B7-97DD-441D-A96C-721DF014DF82}.Debug 4.7.2|Any CPU.Build.0 = Debug 4.7.2|Any CPU
		{53E204B7-97DD-441D-A96C-721DF014DF82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{53E204B7-97DD-441D-A96C-721DF014DF82}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{53E204B7-97DD-441D-A96C-721DF014DF82}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{53E204B7-97DD-441D-A96C-721DF014DF82}.Release|Any CPU.Build.0 = Release|Any CPU
		{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Debug 4.7.2|Any CPU.ActiveCfg = Debug 4.7.2|Any CPU
		{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Debug 4.7.2|Any CPU.Build.0 = Debug 4.7.2|Any CPU
		{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{CB3B11BA-625C-4D35-B663-FDC5BE9A230E}.Release|Any CPU.Build.0 = Release|Any CPU
		{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}.Debug 4.7.2|Any CPU.ActiveCfg = Debug 4.7.2|Any CPU
		{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}.Debug 4.7.2|Any CPU.Build.0 = Debug 4.7.2|Any CPU
		{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B}.Release|Any CPU.Build.0 = Release|Any CPU
		{F6D362DE-2256-44B1-927A-8CE4705D839A}.Debug 4.7.2|Any CPU.ActiveCfg = Debug|Any CPU
		{F6D362DE-2256-44B1-927A-8CE4705D839A}.Debug 4.7.2|Any CPU.Build.0 = Debug|Any CPU
		{F6D362DE-2256-44B1-927A-8CE4705D839A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{F6D362DE-2256-44B1-927A-8CE4705D839A}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{F6D362DE-2256-44B1-927A-8CE4705D839A}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{F6D362DE-2256-44B1-927A-8CE4705D839A}.Release|Any CPU.Build.0 = Release|Any CPU
		{B438694F-8FF7-464A-9EC8-10427374471F}.Debug 4.7.2|Any CPU.ActiveCfg = Debug|Any CPU
		{B438694F-8FF7-464A-9EC8-10427374471F}.Debug 4.7.2|Any CPU.Build.0 = Debug|Any CPU
		{B438694F-8FF7-464A-9EC8-10427374471F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{B438694F-8FF7-464A-9EC8-10427374471F}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{B438694F-8FF7-464A-9EC8-10427374471F}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{B438694F-8FF7-464A-9EC8-10427374471F}.Release|Any CPU.Build.0 = Release|Any CPU
		{E5336563-1194-501E-BC4A-79AD9283EF90}.Debug 4.7.2|Any CPU.ActiveCfg = Debug|Any CPU
		{E5336563-1194-501E-BC4A-79AD9283EF90}.Debug 4.7.2|Any CPU.Build.0 = Debug|Any CPU
		{E5336563-1194-501E-BC4A-79AD9283EF90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{E5336563-1194-501E-BC4A-79AD9283EF90}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{E5336563-1194-501E-BC4A-79AD9283EF90}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{E5336563-1194-501E-BC4A-79AD9283EF90}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(NestedProjects) = preSolution
		{53E204B7-97DD-441D-A96C-721DF014DF82} = {AD98B742-8D85-481C-A69D-D8D8ABED39EA}
		{CB3B11BA-625C-4D35-B663-FDC5BE9A230E} = {AD98B742-8D85-481C-A69D-D8D8ABED39EA}
		{3D192FED-8FFC-4CB5-B5F7-BA307ABA254B} = {AD98B742-8D85-481C-A69D-D8D8ABED39EA}
		{F6D362DE-2256-44B1-927A-8CE4705D839A} = {B24989D7-32B5-48D5-9AE1-5F3B17D25206}
		{B438694F-8FF7-464A-9EC8-10427374471F} = {B24989D7-32B5-48D5-9AE1-5F3B17D25206}
		{E5336563-1194-501E-BC4A-79AD9283EF90} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {6907A4BF-7201-47CF-AAB1-3597F3B8E1C3}
	EndGlobalSection
EndGlobal


================================================
FILE: README.md
================================================
# PepperDash Essentials Framework (c) 2020

## [Latest Release](https://github.com/PepperDash/Essentials/releases/latest)

## License

Provided under MIT license

## Overview

PepperDash Essentials is an open source Crestron framework that can be configured as a standalone program capable of running a wide variety of system designs and can also be utilized as a plug-in architecture to augment other Simpl# Pro and Simpl Windows programs.

Essentials Framework is a collection of C# / Simpl# Pro libraries that can be utilized in several different manners. It is currently operating as a 100% configuration-driven system, and can be extended to add different workflows and behaviors, either through the addition of further device "types" or via the plug-in mechanism. The framework is a collection of "things" that are all related and interconnected, but in general do not have dependencies on each other.

## Minimum Requirements

- Essentials Framework runs on any Crestron 3-series processor, **4-series** processor or Crestron's VC-4 platform.
- To edit and compile the source, Microsoft Visual Studio 2008 Professional with SP1 is required.
- Crestron's Simpl# Plugin is also required (must be obtained from Crestron).

## Dependencies

The [PepperDash.Core](https://github.com/PepperDash/PepperDashCore) SIMPL# library is required. It is referenced via nuget. You must have nuget.exe installed and in the `PATH` environment variable to use the following command. Nuget.exe is available at [nuget.org](https://dist.nuget.org/win-x86-commandline/latest/nuget.exe).

### Installing Dependencies

To install dependencies once nuget.exe is installed, run the following command:
`nuget install .\packages.config -OutputDirectory .\packages -excludeVersion`.
To verify that the packages installed correctly, open Essentials and make sure that all references are found, then try and build it.

### Installing Different versions of PepperDash Core

If you need a different version of PepperDash Core, use the command `nuget install .\packages.config -OutputDirectory .\packages -excludeVersion -Version {versionToGet}`. Omitting the `-Version` option will pull the version indicated in the packages.config file.

## Utilization

Essentials was originally conceptualized as a standalone application for running control system logic entirely in Simpl# Pro. It is primarily designed around accomplishing this goal, but during development, it became obvious that it could easily be leveraged to also serve as a partner application to one or more SIMPL Windows programs.

Utilization of Essentials Framework falls into the following categories:

1. Standalone Control System Application for controlling one or more rooms. See [Standalone Use](https://github.com/PepperDash/Essentials/wiki/Standalone-Use#standalone-application)

2. Partner Application to a SIMPL Windows program. This allows for several useful advantages. See [SIMPL Windows Bridging](https://github.com/PepperDash/Essentials/wiki/SIMPL-Bridging#simpl-windows-bridging)

- Dynamic device instantiation. Devices can be defined in configuration and instantiated at runtime and then bridged to a SIMPL Windows program via EISC.

- Advanced logic. Some logic operations that cannot be affectively accomplished in SIMPL Windows (ex. JSON/XML serialization/deserialization, database operations, etc.) can be done in the Simpl# Pro environment and the necessary input and output bridged to a SIMPL Windows program via EISC.

3. Hybrid Application that may contain elements of both standalone control and SIMPL partner application integration.

- There may be a use case where a device can only be defined in a single application, but that device may need to be interacted with from multiple applications. The device can be defined in an Essentials application, interacted with in that application and also bridged to one or more SIMPL Windows applications.

## Documentation

For detailed documentation, see the [Wiki](https://github.com/PepperDash/EssentialsFramework/wiki).

## Support

* Check out our [Discord Server](https://discord.gg/rWyeRH3K)

## How-To (Getting Started)

See [Getting Started](https://github.com/PepperDash/Essentials/wiki/Get-started#how-to-get-started)

================================================
FILE: Sample Presets/SampleDirecTV.json
================================================
{
  "name": "Sample DirecTV List",
  "channels": [
    {
      "name": "HBO",
      "IconUrl": "HBO",
      "Channel": "501"
    },
    {
      "name": "HBO",
      "IconUrl": "HBO",
      "Channel": "501"
    },
    {
      "name": "HBO",
      "IconUrl": "HBO",
      "Channel": "501"
    },
    {
      "name": "HBO",
      "IconUrl": "HBO",
      "Channel": "501"
    },
    {
      "name": "HBO",
      "IconUrl": "HBO",
      "Channel": "501"
    },
    {
      "name": "HBO",
      "IconUrl": "HBO",
      "Channel": "501"
    }
  ]
}

================================================
FILE: docs/docfx.json
================================================
{
  "$schema": "https://raw.githubusercontent.com/dotnet/docfx/main/schemas/docfx.schema.json",
  "metadata": [
    {
      "src": [
        {
          "src": "../",
          "files": [
            "src/**/*.csproj"
          ]
        }
      ],
      "properties": {
        "TargetFramework": "net472"
      },
      "dest": "api",
      "namespaceLayout": "nested",
      "outputFormat": "apiPage"
    }
  ],
  "build": {
    "content": [
      {
        "files": [
          "docs/**/*.{md,yml}",
          "api/**/*.{md,yml}",
          "index.md",
          "toc.yml"
        ],
        "exclude": [
          "_site/**",
          ".github/**"
        ]
      }
    ],
    "resource": [
      {
        "files": [
          "docs/images/**"
        ]
      }
    ],
    "output": "_site",
    "template": [
      "default",
      "modern"
    ],
    "globalMetadata": {
      "_appName": "PepperDash Essentials",
      "_appTitle": "PepperDash Essentials",
      "_enableSearch": true,
      "_appLogoPath": "docs/images/favicon-32x32.png",
      "_appFaviconPath": "docs/images/favicon.ico",
      "_disableToc": false,
      "_enableNewTab": true,
      "pdf": false
    }
  }
}

================================================
FILE: docs/docs/CardFrame.md
================================================
        {
                "key": "cardCage1",
                "uid": 1,
                "name": "Internal Card Cage",
                "type": "internalcardcage",
                "group": "cardCage",
                "properties": {
                  "cards": {
                    "1": "c3com3",
                    "2": "c3com3",
                    "3": ""
                  }
                }
            },

================================================
FILE: docs/docs/Get-started.md
================================================
# Get started

---
[YouTube Video - Getting Started with PepperDash Essentials](https://youtu.be/FxEZtbpCwiQ)
***

## Get a CPZ

### Prerequisites

* [VS Code](https://code.visualstudio.com/)
* [.NET 9 SDK](https://dotnet.microsoft.com/en-us/download)
* [Git](https://git-scm.com/)

> Note: Essentials 2.x.x uses .NET Framework 4.7.2 currently. The .NET 9 SDK will build the project with the appropriate references

### Build From Source

1. Clone the repo: `git clone https://github.com/PepperDash/Essentials.git`
2. Open the folder in VS Code
3. Build using the dotnet CLI: `dotnet build`

### Download the latest release

The latest release can be found on [Github](https://github.com/PepperDash/Essentials/releases/latest)

## How to Get Started

2. Using an SFTP client or Crestron Toolbox, load the downloaded (or built) cpz to the processor in program slot 1
   1. If using SFTP, connect via SSH and start the program by sending console command `progload -p:1`
3. On first boot, the Essentials Application will build the necessary configuration folder structure in the user/program1/ path.
4. The application has some example configuration files included. Copy `/Program01/Example Configuration/EssentialsSpaceHuddleRoom/configurationFile-HuddleSpace-2-Source.json` to the `/User/Program1/` folder.
6. Reset the program via console `progreset -p:1`. The program will load the example configuration file.

Once Essentials is running with a valid configuration, the following console commands can be used to see what's going on:

* ```devlist:1```
  * Print the list of devices in [{key}] {name} format
  * The key of a device can be used with the rest of the commands to get more information
* `devprops:1 {deviceKey}`
  * Print the real-time property values of the device with key "display-1".
* `devmethods:1 display-1`
  * Print the public methods available for the device with key "display-1".
* `devjson:1 {"deviceKey":"display-1","methodName":"PowerOn", "params": []}`
  * Call the method `PowerOn()` on the device with key "display-1".

Next: [Standalone use](~/docs/usage/Standalone-Use.md)


================================================
FILE: docs/docs/Home.md
================================================
# Welcome to PepperDash Essentials!

PepperDash Essentials is an open-source framework for control systems, built on Crestron's Simpl# Pro framework. It can be configured as a standalone program capable of running a wide variety of system designs and can also be used to augment other Crestron programs.

Essentials is a collection of C# libraries that can be used in many ways. It is a 100% configuration-driven framework that can be extended to add different workflows and behaviors, either through the addition of new device-types and classes, or via a plug-in mechanism. The framework is a collection of things that are all related and interconnected, but in general do not have strong dependencies on each other.

---

## Get started

- [Download essentials build or clone repo](~/docs/Get-started.md)
- [How to get started](~/docs/Get-started.md)
- [YouTube Video Series Playlist](https://youtube.com/playlist?list=PLKOoNNwgPFZdV5wDEBDZxTHu1KROspaBu)
- [Discord Server](https://discord.gg/6Vh3ssDdPs)

Or use the links to the right to navigate our documentation.

---

## Benefits

- Runs on Crestron 3-Series, **4-Series** and VC-4 Control System platforms
- Reduced hardware overhead compared to S+ and Simpl solutions
- Quick development cycle
- Shared resources made easily available
- More flexibility with less code
- Configurable using simple JSON files
- Is awesome

---

## Comment

The Essentials wiki is clearly in-progress right now. Take a look at the links to the right. We are actively working on this documentation, so please be patient with us. If you have any comments on or suggestions for the documentation, please file an issue here, with as much detail as you can provide: <https://github.com/PepperDash/Essentials/issues>

Thanks!

---

## Collaboration

Essentials is an open-source project and we encourage collaboration on this community project. For features that may not be useful to the greater community, or for just-plain learning, we want to remind developers to try writing plugins for Essentials. More information can be found here: [Plugins](~/docs/technical-docs/Plugins.md)

### Open-source-collaborative workflow

The `main` branch always contain the latest stable version. The `development` branch is used for most development efforts.

[GitFlow](https://nvie.com/posts/a-successful-git-branching-model/) will be used as the workflow for this collaborative project. To contribute, follow this process:

1. Fork this repository ([More Info](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/working-with-forks))
2. Create a branch using standard GitFlow branch prefixes (feature/hotfix) followed by a descriptive name.
   - Example: `feature/add-awesomeness` or `hotfix/really-big-oops`
   - When working on a new feature or bugfix, branch from the `development` branch. When working on a hotfix, branch from `main`.
3. Make commits as necessary (often is better). And use concise, descriptive language, leveraging issue notation and/or [Closing Keywords](https://help.github.com/articles/closing-issues-using-keywords) to ensure any issues addressed by your work are referenced accordingly.
4. When the scope of the work for your branch is complete, make sure to rebase your branch in case further progress has been made since the repo was forked
5. Create a Pull Request to pull your branch into the appropriate branch in the main repository.
6. Your Pull Request will be reviewed by our team and evaluated for inclusion into the main repository.

Next: [Get started](~/docs/Get-started.md)


================================================
FILE: docs/docs/Plugins-Deprecated.md
================================================
# Deprecated

**Note : this entry is out of date - please see [Plugins](~/docs/technical-docs/Plugins.md)**

## What are Essentials Plugins?

Plugins are SIMPL# Pro libraries that reference the Essentials Framework and can be loaded into an Essentials Application at runtime to extend functionality beyond what the Essentials Framework provides on its own.

## Why Use Plugins?

Plugins are a way to extend or add new functionality to the Essentials Application without having to modify the actual Framework. In most cases, a plugin can be written to support a new device or behavior. Using plugins also limits the scope of understanding needed to work within the Essentials Framework.

## Should I use a Plugin?

Essentials is meant to be a lightweight framework and an extensible basis for development. While some devices are included in the framework, mostly for the purposes of providing examples and developing and prototyping new device types, the bulk of new development is intended to take place in Plugins. Once a plugin adds new functionality that may be of benefit if shared across multiple plugins, it may make sense to port that common logic (base classes and/or interfaces) back into the framework to make it available to others. The thrust of future Essentials development is targeted towards building a library of plugins.

## How do Plugins Work?

One or more plugins can be loaded to the /user/ProgramX/plugins as .dlls or .cplz packages. When the Essentials Application starts, it looks for any .cplz files, unzips them and then iterates any .dll assemblies in that folder and loads them. Once the plugin assemblies are loaded the Essentials Application will then attempt to load a configuration file and construct items as defined in the file. Those items can be defined in either the Essentials Framework or in any of the loaded plugin assemblies.

![Architecture drawing](~/docs/images/Plugin%20Load%20Sequence.png)

## What Must be Implemented in a Plugin for it to Work?

All plugin assemblies must contain a static method called LoadPlugin():

```cs
public class SomeDevice : Device , IBridge  //IBridge only needs to be implemented if using a bridge
{
    // This string is used to define the minimum version of the
    // Essentials Framework required for this plugin
    public static string MinimumEssentialsFrameworkVersion = "1.4.23";

    // This method gets called by the Essentials Framework when the application starts.
    // It is intended to be used to load the new Device type(s) specified in the plugin
    public static void LoadPlugin()
    {
        DeviceFactory.AddFactoryForType("typeName", FactoryMethod);
        // typeName should be the unique string that identifies the type of device to build,
        // FactoryMethod represents the method that takes a DevicConfig object as and argument
        // and returns an instance of the desired device type
    }

    // This is a factory method to construct a device and return it to be
    // added to the DeviceManager
    public static Device FactoryMethod(DeviceConfig dc)
    {
        return new SomeDevice(dc.key, dc.name, dc);
    }

#region IBridge
    // This method is called by an EiscApi bridge instance and should call an extension method
    // defined in your plugin.  Required for implementing IBridge
    public void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey)
    {
        this.LinkToApiExt(trilist, joinStart, joinMapKey);
    }
#endregion
}
```

## SIMPL Bridging

Optionally, if your plugin device needs to be able to bridge to a SIMPL program over EISC, and there isn't already an existing bridge class in the Essentials Framework, you can write a new bridge class in your plugin. However, in order for the Essentials Application to be able to us that new bridge, the bridge must implement the IBridge interface with the required LinkToApi() Extension method.

Often though, you may find that a bridge class already exists in the Essentials Framework that you can leverage. For example, if you were writing a plugin to support a new display model that isn't already in the Essentials Framework, you would define a class in your plugin that inherits from PepperDash.Essentials.Core.DisplayBase. If you're only implementing the standard display control functions such as power/input/volume control, then the existing bridge class `DisplayControllerBridge` can be used. If you needed to add additional functions to the bridge, then you would need to write your own bridge in the plugin.

For additional info see the [SIMPL-Bridging article](~/docs/SIMPL-Bridging.md).

## Template Essentials Plugin Repository

Fork this repository when starting a new plugin. The template repository uses the essentials-builds repository as a submodule. This allows the plugin to reference a specific build version of Essentials. You must make sure that you checkout the correct build of the Essentials-Builds repo that contains any dependencies that your plugin may rely on.

[Essentials Plugin Template Repository](https://github.com/PepperDash/EssentialsPluginTemplate)


================================================
FILE: docs/docs/SIMPL-Bridging-Deprecated.md
================================================
# Deprecated

**Note : this entry is out of date - please see [SIMPL Windows Bridging](~/docs/SIMPL-Bridging.md)**

## SIMPL Windows Bridging - Deprecated

Essentials allows for devices defined within the SIMPL# Pro application to be bridged to a SIMPL Windows application over Ethernet Intersystem Communication (EISC). This allows a SIMPL Windows program to take advantage of some of the features of the SIMPL# Pro environment, without requiring the entire application to be written in C#.

Some of the main advantages are:

1. The ability to instantiate devices from configuration.
1. The ability to leverage C# concepts to handle data intensive tasks (Serialization/Deserialization of JSON/XML, cyrptography, etc.).
1. The ability to reuse the same compiled SIMPL Windows program (regardless of target processor type) by offloading all the variables that may be room or hardware specific to Essentials.
1. The ability to handle multiple communciation types generically without changing the SIMPL Program (TCP/UDP/SSH/HTTP/HTTPS/CEC, etc.)
1. Much faster development cycle
1. Reduced processor overhead
1. Ability to easily share devices defined in Essentials between multiple other programs

## Implementation

Bridges are devices that are defined within the devices array in the config file. They are unique devices with a specialized purpose; to act as a bridge between Essentials Devices and applications programmed traditionally in Simpl Windows. This is accomplished by instantiating a Three Series Intersystem Communication symbol within the bridge device, and linking its Boolean/Ushort/String inputs and outputs to actions on one or multiple Essentials device(s). The definition for which joins map to which actions is defined within the device to be bridged to in a class that derives from JoinMapBase.

Let's consider the following Essentials Configuration:

```JSON
{
    "template": {
        "roomInfo": [
            {}
        ],
        "devices": [
            {
                "key": "processor",
                "uid": 1,
                "type": "pro3",
                "name": "PRO3 w/o cards",
                "group": "processor",
                "supportedConfigModes": [
                    "essentials"
                ],
                "supportedSystemTypes": [
                    "hudType",
                    "presType",
                    "vtcType",
                    "custom"
                ],
                "supportsCompliance": true,
                "properties": {
                    "numberOfComPorts": 6,
                    "numberOfIrPorts": 8,
                    "numberOfRelays": 8,
                    "numberOfDIOPorts": 8
                }
            },
            {
                "key": "panasonicDisplay01",
                "type": "PanasonicThefDisplay",
                "name": "Main Display",
                "group": "displays",
                "uid": 2,
                "properties": {
                    "id": "01",
                    "inputNumber": 1,
                    "outputNumber": 1,
                    "control": {
                        "comParams": {
                            "hardwareHandshake": "None",
                            "parity": "None",
                            "protocol": "RS232",
                            "baudRate": 9600,
                            "dataBits": 8,
                            "softwareHandshake": "None",
                            "stopBits": 1
                        },
                        "controlPortNumber": 1,
                        "controlPortDevKey": "processor",
                        "method": "com"
                    }
                }
            },
            {
                "key": "vtcComPort",
                "uid": 3,
                "name": "VTC Coms",
                "group": "comm",
                "type": "genericComm",
                "properties": {
                    "control": {
                        "comParams": {
                            "hardwareHandshake": "None",
                            "parity": "None",
                            "protocol": "RS232",
                            "baudRate": 38400,
                            "dataBits": 8,
                            "softwareHandshake": "None",
                            "stopBits": 1
                        },
                        "controlPortNumber": 2,
                        "controlPortDevKey": "processor",
                        "method": "com"
                    }
                }
            },
            {
                "key": "deviceBridge",
                "uid": 4,
                "name": "BridgeToDevices",
                "group": "api",
                "type": "eiscApi",
                "properties": {
                    "control": {
                        "tcpSshProperties": {
                            "address": "127.0.0.2",
                            "port": 0
                        },
                        "ipid": "03",
                        "method": "ipidTcp"
                    },
                    "devices": [
                        {
                            "deviceKey": "panasonicDisplay01",
                            "joinStart": 1
                        },
                        {
                            "deviceKey": "vtcComPort",
                            "joinStart": 51
                        }
                    ]
                }
            }
        ]
    }
}
```

We have four Essentials Devices configured:

1. Pro3 with a Key of "processor"

1. Panasonic Display with a Key of "panasonicDisplay01"

1. Com port with a Key of "vtcComPort"

1. Bridge with a Key of "deviceBridge"

We want to have access to the com port for VTC Control from Simpl Windows and we want to control the display from Simpl Windows. To accomplish this, we have created a bridge device and added the devices to be bridged to the "devices" array on the bridge. As you can see we define the device key and the join start, which will determine which joins we will use on the resulting EISC to interact with the devices. In the Bridge control properties we defined ipid 03, and we will need a corresponding Ethernet System Intercommunication in the Simpl Windows program at ipid 03.

Now that our devices have been built, we can refer to the device join maps to see which joins correspond to which actions.

See below:

```cs
namespace PepperDash.Essentials.Bridges
{
    public class DisplayControllerJoinMap : JoinMapBase
    {
        #region Digitals
        /// <summary>
        /// Turns the display off and reports power off feedback
        /// </summary>
        public uint PowerOff { get; set; }
        /// <summary>
        /// Turns the display on and repots power on feedback
        /// </summary>
        public uint PowerOn { get; set; }
        /// <summary>
        /// Indicates that the display device supports two way communication when high
        /// </summary>
        public uint IsTwoWayDisplay { get; set; }
        /// <summary>
        /// Increments the volume while high
        /// </summary>
        public uint VolumeUp { get; set; }
        /// <summary>
        /// Decrements teh volume while high
        /// </summary>
        public uint VolumeDown { get; set; }
        /// <summary>
        /// Toggles the mute state.  Feedback is high when volume is muted
        /// </summary>
        public uint VolumeMute { get; set; }
        /// <summary>
        /// Range of digital joins to select inputs and report current input as feedback
        /// </summary>
        public uint InputSelectOffset { get; set; }
        /// <summary>
        /// Range of digital joins to report visibility for input buttons
        /// </summary>
        public uint ButtonVisibilityOffset { get; set; }
        /// <summary>
        /// High if the device is online
        /// </summary>
        public uint IsOnline { get; set; }
        #endregion

        #region Analogs
        /// <summary>
        /// Analog join to set the input and report current input as feedback
        /// </summary>
        public uint InputSelect { get; set; }
        /// <summary>
        /// Sets the volume level and reports the current level as feedback
        /// </summary>
        public uint VolumeLevel { get; set; }
        #endregion

        #region Serials
        /// <summary>
        /// Reports the name of the display as defined in config as feedback
        /// </summary>
        public uint Name { get; set; }
        /// <summary>
        /// Range of serial joins that reports the names of the inputs as feedback
        /// </summary>
        public uint InputNamesOffset { get; set; }
        #endregion

        public DisplayControllerJoinMap()
        {
            // Digital
            IsOnline = 50;
            PowerOff = 1;
            PowerOn = 2;
            IsTwoWayDisplay = 3;
            VolumeUp = 5;
            VolumeDown = 6;
            VolumeMute = 7;

            ButtonVisibilityOffset = 40;
            InputSelectOffset = 10;

            // Analog
            InputSelect = 11;
            VolumeLevel = 5;

            // Serial
            Name = 1;
            InputNamesOffset = 10;
        }

        public override void OffsetJoinNumbers(uint joinStart)
        {
            var joinOffset = joinStart - 1;

            IsOnline = IsOnline + joinOffset;
            PowerOff = PowerOff + joinOffset;
            PowerOn = PowerOn + joinOffset;
            IsTwoWayDisplay = IsTwoWayDisplay + joinOffset;
            ButtonVisibilityOffset = ButtonVisibilityOffset + joinOffset;
            Name = Name + joinOffset;
            InputNamesOffset = InputNamesOffset + joinOffset;
            InputSelectOffset = InputSelectOffset + joinOffset;

            InputSelect = InputSelect + joinOffset;

            VolumeUp = VolumeUp + joinOffset;
            VolumeDown = VolumeDown + joinOffset;
            VolumeMute = VolumeMute + joinOffset;
            VolumeLevel = VolumeLevel + joinOffset;
        }
    }
}
```

We know that the Panasonic Display uses the DisplayControllerJoinMap class and can see the join numbers that will give us access to functionality in the Device.

IsOnline = 50  
PowerOff = 1  
PowerOn = 2  
IsTwoWayDisplay = 3  
VolumeUp = 5  
VolumeDown = 6  
VolumeMute = 7

```cs
namespace PepperDash.Essentials.Bridges
{
    public class IBasicCommunicationJoinMap : JoinMapBase
    {
        #region Digitals
        /// <summary>
        /// Set High to connect, Low to disconnect
        /// </summary>
        public uint Connect { get; set; }
        /// <summary>
        /// Reports Connected State (High = Connected)
        /// </summary>
        public uint Connected { get; set; }
        #endregion

        #region Analogs
        /// <summary>
        /// Reports the connections status value
        /// </summary>
        public uint Status { get; set; }
        #endregion

        #region Serials
        /// <summary>
        /// Data back from port
        /// </summary>
        public uint TextReceived { get; set; }
        /// <summary>
        /// Sends data to the port
        /// </summary>
        public uint SendText { get; set; }
        /// <summary>
        /// Takes a JSON serialized string that sets a COM port's parameters
        /// </summary>
        public uint SetPortConfig { get; set; }
        #endregion

        public IBasicCommunicationJoinMap()
        {
            TextReceived = 1;
            SendText = 1;
            SetPortConfig = 2;
            Connect = 1;
            Connected = 1;
            Status = 1;
        }

        public override void OffsetJoinNumbers(uint joinStart)
        {
            var joinOffset = joinStart - 1;

            TextReceived = TextReceived + joinOffset;
            SendText = SendText + joinOffset;
            SetPortConfig = SetPortConfig + joinOffset;
            Connect = Connect + joinOffset;
            Connected = Connected + joinOffset;
            Status = Status + joinOffset;
        }
    }
}
```

TextReceived = 1  
SendText = 1  
SetPortConfig = 2  
Connect = 1  
Connected = 1  
Status = 1

Considering our Bridge config, we can see that the display controls will start at join 1, and the VTC Com port will start at join 51. The result is a single EISC that allows us to interact with our Essentials devices.

To control diplay power from Simpl Windows, we would connect Digital Signals to joins 1 & 2 on the EISC to control Display Power On & Off.
To utilize the com port device, we would connect Serial Signals (VTC_TX$ and VTC_RX$) to join 51 on the EISC.

You can refer to our [Simpl Windows Bridging Example](https://github.com/PepperDash/EssentialsSIMPLWindowsBridgeExample) for a more complex example.  
Example device config: <https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Example%20Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json>

## Notes

1. It is important to realize that there are no safety checks (yet) when assigning joinStarts in bridge configurations. If you were to put two devices on a bridge with overlapping joins, the most recently bridged join would overwrite previously bridged joins. For now it is on the programmer to ensure there are no conflicting join maps.

1. There is _no_ limit to the amount of times a device may be bridged to. You may have the same device on multiple bridges across multiple applications without problem. That being said, we recommend using common sense. Accessing a single com port for VTC control via multiple bridges may not be wise...

1. A bridge need not only bridge between applications on the same processor. A bridge may bridge to an application on a completely separate processor; simply define the ip address in the Bridge control properties accordingly.

1. For devices included in Essentials, you will be able to find defined join maps below. If you are building your own plugins, you will need to build the join map yourself. It would be beneficial to review the wiki entry on the [Feedback Class](~/docs/technical-docs/Feedback-Classes.md) for this.

1. When building plugins, we highly recommend reusing JoinMaps, as this will make code more easily interchangeable. For example; if you were to build a display plugin, we'd recommend you use/extend the existing DisplayControllerJoinMap. This way, you can swap plugins without needing any change on the Simpl Windows side. This is extremely powerful when maintaining Simpl Windows code bases for large deployments that may utilize differing equipment per room. If you can build a Simpl Windows program that interacts with established join maps, you can swap out the device via config without any change needed to Simpl Windows.

1. Related to item 5, you can use the same paradigm with respect to physical device communication. If you were to have a DSP device in some rooms communicating over RS232 and some via SSH, it would be trival to swap the device from a Com port to an SSH client in the Essentials Devicee Config and update the Bridge Config to brigde to the desired communication method. Again this would require no change on the Simpl Windows side as long as you maintain the same join Start in the Bridge Device Configuration.

## Common Use Cases

1. There are 10 conference rooms that all operate the same, but have hardware differences that are impossible to account for in SIMPL Windows. For example, each room might have a DM-MD8X8 chassis, but the input and output cards aren't all in the same order, or they might be different models but function the same. You can use Essentials with a unique configuration file for each hardware configuration.

1. You have a floor of conference rooms that all share some centralized hardware like DSP, AV Routing and a shared CEN-GWEXER gateway with multiple GLS-OIR-CSM-EX-BATT occupancy sensors. All the shared hardware can be defined in the Essentials configuration and bridged over an EISC to each program that needs access. The same device can even be exposed to multiple programs over different EISCs.

1. You have a SIMPL program that works for many room types, but because some rooms have different models of processors than others (CP3/CP3N/AV3/PRO3/DMPS3 variants), you have to maintain several versions of the program, compiled for each processor model to maintain access to features like the System Monitor slot. You can use Essentials running in a slot on a processor to expose the System Monitor and many other features of the processor, regardless of model. Now you only need to maintain a single SIMPL program defined for your most complex processor application (ex. PRO3)

## Device Type Join Maps

### AirMediaController

> supports: AM-200, AM-300

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/AirMediaControllerJoinMap.cs>

### AppleTvController

> supports: IR control of Apple TV

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/AppleTvJoinMap.cs>

### CameraControlBase

> supports: any camera that derives from CameraBase

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs>

### DisplayController

> supports: IR controlled displays, any two way display driver that derives from PepperDash.Essentials.Core.DisplayBase

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DisplayControllerJoinMap.cs>

### DmChasisController

> supports: All DM-MD-8x8/16x16/32x32 chassis, with or w/o DM-CPU3 Card

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmChassisControllerJoinMap.cs>

### DmRmcController

> supports: All DM-RMC devices

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmRmcControllerJoinMap.cs>

### DmTxController

> supports: All Dm-Tx devices

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmTxControllerJoinMap.cs>

### DmpsAudioOutputController

> supports: Program, Aux1, Aux2 outputs of all DMPS3 Control Systems

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs>

### DmpsRoutingController

> supports: Av routing for all DMPS3 Control Systems

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs>

### GenericRelayController

> supports: Any relay port on a Crestron Control System or Dm Endpoint

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs>

### GenericLightingJoinMap

> supports: Devices derived from PepperDash.Essentials.Core.Lighting.LightingBase

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/GenericLightingJoinMap.cs>

### GlsOccupancySensorBase

> supports: Any Crestron GLS-Type Occupancy sensor - single/dual type

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs>

### HdMdxxxCEController

> supports: HD-MD-400-C-E, HD-MD-300-C-E, HD-MD-200-C-E, HD-MD-200-C-1G-E-B/W

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs>

### IBasicCommunication

> supports: Any COM Port on a Control System or Dm Endpoint device, TCP Client, SSH Client, or UDP Server

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs>

### IDigitalInput

> supports: Any Digital Input on a Control System, or DM Endpoint device

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/IDigitalInputJoinMap.cs>

### SystemMonitorController

> supports: Exposing the system monitor slot for any Control System

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/SystemMonitorJoinMap.cs>

## Example SIMPL Windows Program

We've provided an [example program](https://github.com/PepperDash/EssentialsSIMPLWindowsBridgeExample) for SIMPL Windows that works with the provided example Essentials configuration file [SIMPLBridgeExample_configurationFile.json](https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Example%20Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json). Load Essentials and the example SIMPL program to two slots on the same processor and you can get a better idea of how to take advantage of SIMPL Windows bridging.

Next: [Essentials architecture](~/docs/technical-docs/Arch-summary.md)


================================================
FILE: docs/docs/SIMPL-Bridging.md
================================================
# SIMPL Windows Bridging

**Note : this entry is out of date - please see [SIMPL Windows Bridging - Updated](~/docs/usage/SIMPL-Bridging-Updated.md)**

Essentials allows for devices defined within the SIMPL# Pro application to be bridged to a SIMPL Windows application over Ethernet Intersystem Communication (EISC). This allows a SIMPL Windows program to take advantage of some of the features of the SIMPL# Pro environment, without requiring the entire application to be written in C#.

Some of the main advantages are:

1. The ability to instantiate devices from configuration.
1. The ability to leverage C# concepts to handle data intensive tasks (Serialization/Deserialization of JSON/XML, cyrptography, etc.).
1. The ability to reuse the same compiled SIMPL Windows program (regardless of target processor type) by offloading all the variables that may be room or hardware specific to Essentials.
1. The ability to handle multiple communciation types generically without changing the SIMPL Program (TCP/UDP/SSH/HTTP/HTTPS/CEC, etc.)
1. Much faster development cycle
1. Reduced processor overhead
1. Ability to easily share devices defined in Essentials between multiple other programs

## Implementation

Bridges are devices that are defined within the devices array in the config file. They are unique devices with a specialized purpose; to act as a bridge between Essentials Devices and applications programmed traditionally in Simpl Windows. This is accomplished by instantiating a Three Series Intersystem Communication symbol within the bridge device, and linking its Boolean/Ushort/String inputs and outputs to actions on one or multiple Essentials device(s). The definition for which joins map to which actions is defined within the device to be bridged to in a class that derives from JoinMapBase.

Let's consider the following Essentials Configuration:

```JSON
{
    "template": {
        "roomInfo": [
            {}
        ],
        "devices": [
            {
                "key": "processor",
                "uid": 1,
                "type": "pro3",
                "name": "PRO3 w/o cards",
                "group": "processor",
                "supportedConfigModes": [
                    "essentials"
                ],
                "supportedSystemTypes": [
                    "hudType",
                    "presType",
                    "vtcType",
                    "custom"
                ],
                "supportsCompliance": true,
                "properties": {
                    "numberOfComPorts": 6,
                    "numberOfIrPorts": 8,
                    "numberOfRelays": 8,
                    "numberOfDIOPorts": 8
                }
            },
            {
                "key": "panasonicDisplay01",
                "type": "PanasonicThefDisplay",
                "name": "Main Display",
                "group": "displays",
                "uid": 2,
                "properties": {
                    "id": "01",
                    "inputNumber": 1,
                    "outputNumber": 1,
                    "control": {
                        "comParams": {
                            "hardwareHandshake": "None",
                            "parity": "None",
                            "protocol": "RS232",
                            "baudRate": 9600,
                            "dataBits": 8,
                            "softwareHandshake": "None",
                            "stopBits": 1
                        },
                        "controlPortNumber": 1,
                        "controlPortDevKey": "processor",
                        "method": "com"
                    }
                }
            },
            {
                "key": "vtcComPort",
                "uid": 3,
                "name": "VTC Coms",
                "group": "comm",
                "type": "genericComm",
                "properties": {
                    "control": {
                        "comParams": {
                            "hardwareHandshake": "None",
                            "parity": "None",
                            "protocol": "RS232",
                            "baudRate": 38400,
                            "dataBits": 8,
                            "softwareHandshake": "None",
                            "stopBits": 1
                        },
                        "controlPortNumber": 2,
                        "controlPortDevKey": "processor",
                        "method": "com"
                    }
                }
            },
            {
                "key": "deviceBridge",
                "uid": 4,
                "name": "BridgeToDevices",
                "group": "api",
                "type": "eiscApi",
                "properties": {
                    "control": {
                        "tcpSshProperties": {
                            "address": "127.0.0.2",
                            "port": 0
                        },
                        "ipid": "03",
                        "method": "ipidTcp"
                    },
                    "devices": [
                        {
                            "deviceKey": "panasonicDisplay01",
                            "joinStart": 1
                        },
                        {
                            "deviceKey": "vtcComPort",
                            "joinStart": 51
                        }
                    ]
                }
            }
        ]
    }
}
```

We have four Essentials Devices configured:

1. Pro3 with a Key of "processor"

1. Panasonic Display with a Key of "panasonicDisplay01"

1. Com port with a Key of "vtcComPort"

1. Bridge with a Key of "deviceBridge"

We want to have access to the com port for VTC Control from Simpl Windows and we want to control the display from Simpl Windows. To accomplish this, we have created a bridge device and added the devices to be bridged to the "devices" array on the bridge. As you can see we define the device key and the join start, which will determine which joins we will use on the resulting EISC to interact with the devices. In the Bridge control properties we defined ipid 03, and we will need a corresponding Ethernet System Intercommunication in the Simpl Windows program at ipid 03.

Now that our devices have been built, we can refer to the device join maps to see which joins correspond to which actions.

See below:

```cs
namespace PepperDash.Essentials.Bridges
{
    public class DisplayControllerJoinMap : JoinMapBase
    {
        #region Digitals
        /// <summary>
        /// Turns the display off and reports power off feedback
        /// </summary>
        public uint PowerOff { get; set; }
        /// <summary>
        /// Turns the display on and repots power on feedback
        /// </summary>
        public uint PowerOn { get; set; }
        /// <summary>
        /// Indicates that the display device supports two way communication when high
        /// </summary>
        public uint IsTwoWayDisplay { get; set; }
        /// <summary>
        /// Increments the volume while high
        /// </summary>
        public uint VolumeUp { get; set; }
        /// <summary>
        /// Decrements teh volume while high
        /// </summary>
        public uint VolumeDown { get; set; }
        /// <summary>
        /// Toggles the mute state.  Feedback is high when volume is muted
        /// </summary>
        public uint VolumeMute { get; set; }
        /// <summary>
        /// Range of digital joins to select inputs and report current input as feedback
        /// </summary>
        public uint InputSelectOffset { get; set; }
        /// <summary>
        /// Range of digital joins to report visibility for input buttons
        /// </summary>
        public uint ButtonVisibilityOffset { get; set; }
        /// <summary>
        /// High if the device is online
        /// </summary>
        public uint IsOnline { get; set; }
        #endregion

        #region Analogs
        /// <summary>
        /// Analog join to set the input and report current input as feedback
        /// </summary>
        public uint InputSelect { get; set; }
        /// <summary>
        /// Sets the volume level and reports the current level as feedback
        /// </summary>
        public uint VolumeLevel { get; set; }
        #endregion

        #region Serials
        /// <summary>
        /// Reports the name of the display as defined in config as feedback
        /// </summary>
        public uint Name { get; set; }
        /// <summary>
        /// Range of serial joins that reports the names of the inputs as feedback
        /// </summary>
        public uint InputNamesOffset { get; set; }
        #endregion

        public DisplayControllerJoinMap()
        {
            // Digital
            IsOnline = 50;
            PowerOff = 1;
            PowerOn = 2;
            IsTwoWayDisplay = 3;
            VolumeUp = 5;
            VolumeDown = 6;
            VolumeMute = 7;

            ButtonVisibilityOffset = 40;
            InputSelectOffset = 10;

            // Analog
            InputSelect = 11;
            VolumeLevel = 5;

            // Serial
            Name = 1;
            InputNamesOffset = 10;
        }

        public override void OffsetJoinNumbers(uint joinStart)
        {
            var joinOffset = joinStart - 1;

            IsOnline = IsOnline + joinOffset;
            PowerOff = PowerOff + joinOffset;
            PowerOn = PowerOn + joinOffset;
            IsTwoWayDisplay = IsTwoWayDisplay + joinOffset;
            ButtonVisibilityOffset = ButtonVisibilityOffset + joinOffset;
            Name = Name + joinOffset;
            InputNamesOffset = InputNamesOffset + joinOffset;
            InputSelectOffset = InputSelectOffset + joinOffset;

            InputSelect = InputSelect + joinOffset;

            VolumeUp = VolumeUp + joinOffset;
            VolumeDown = VolumeDown + joinOffset;
            VolumeMute = VolumeMute + joinOffset;
            VolumeLevel = VolumeLevel + joinOffset;
        }
    }
}
```

We know that the Panasonic Display uses the DisplayControllerJoinMap class and can see the join numbers that will give us access to functionality in the Device.

IsOnline = 50  
PowerOff = 1  
PowerOn = 2  
IsTwoWayDisplay = 3  
VolumeUp = 5  
VolumeDown = 6  
VolumeMute = 7

```cs
namespace PepperDash.Essentials.Bridges
{
    public class IBasicCommunicationJoinMap : JoinMapBase
    {
        #region Digitals
        /// <summary>
        /// Set High to connect, Low to disconnect
        /// </summary>
        public uint Connect { get; set; }
        /// <summary>
        /// Reports Connected State (High = Connected)
        /// </summary>
        public uint Connected { get; set; }
        #endregion

        #region Analogs
        /// <summary>
        /// Reports the connections status value
        /// </summary>
        public uint Status { get; set; }
        #endregion

        #region Serials
        /// <summary>
        /// Data back from port
        /// </summary>
        public uint TextReceived { get; set; }
        /// <summary>
        /// Sends data to the port
        /// </summary>
        public uint SendText { get; set; }
        /// <summary>
        /// Takes a JSON serialized string that sets a COM port's parameters
        /// </summary>
        public uint SetPortConfig { get; set; }
        #endregion

        public IBasicCommunicationJoinMap()
        {
            TextReceived = 1;
            SendText = 1;
            SetPortConfig = 2;
            Connect = 1;
            Connected = 1;
            Status = 1;
        }

        public override void OffsetJoinNumbers(uint joinStart)
        {
            var joinOffset = joinStart - 1;

            TextReceived = TextReceived + joinOffset;
            SendText = SendText + joinOffset;
            SetPortConfig = SetPortConfig + joinOffset;
            Connect = Connect + joinOffset;
            Connected = Connected + joinOffset;
            Status = Status + joinOffset;
        }
    }
}
```

TextReceived = 1  
SendText = 1  
SetPortConfig = 2  
Connect = 1  
Connected = 1  
Status = 1

Considering our Bridge config, we can see that the display controls will start at join 1, and the VTC Com port will start at join 51. The result is a single EISC that allows us to interact with our Essentials devices.

To control diplay power from Simpl Windows, we would connect Digital Signals to joins 1 & 2 on the EISC to control Display Power On & Off.
To utilize the com port device, we would connect Serial Signals (VTC_TX$ and VTC_RX$) to join 51 on the EISC.

You can refer to our [Simpl Windows Bridging Example](https://github.com/PepperDash/EssentialsSIMPLWindowsBridgeExample) for a more complex example.  
Example device config: <https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Example%20Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json>

## Notes

1. It is important to realize that there are no safety checks (yet) when assigning joinStarts in bridge configurations. If you were to put two devices on a bridge with overlapping joins, the most recently bridged join would overwrite previously bridged joins. For now it is on the programmer to ensure there are no conflicting join maps.

1. There is _no_ limit to the amount of times a device may be bridged to. You may have the same device on multiple bridges across multiple applications without problem. That being said, we recommend using common sense. Accessing a single com port for VTC control via multiple bridges may not be wise...

1. A bridge need not only bridge between applications on the same processor. A bridge may bridge to an application on a completely separate processor; simply define the ip address in the Bridge control properties accordingly.

1. For devices included in Essentials, you will be able to find defined join maps below. If you are building your own plugins, you will need to build the join map yourself. It would be beneficial to review the wiki entry on the [Feedback Class](~/docs/technical-docs/Feedback-Classes.md) for this.

1. When building plugins, we highly recommend reusing JoinMaps, as this will make code more easily interchangeable. For example; if you were to build a display plugin, we'd recommend you use/extend the existing DisplayControllerJoinMap. This way, you can swap plugins without needing any change on the Simpl Windows side. This is extremely powerful when maintaining Simpl Windows code bases for large deployments that may utilize differing equipment per room. If you can build a Simpl Windows program that interacts with established join maps, you can swap out the device via config without any change needed to Simpl Windows.

1. Related to item 5, you can use the same paradigm with respect to physical device communication. If you were to have a DSP device in some rooms communicating over RS232 and some via SSH, it would be trival to swap the device from a Com port to an SSH client in the Essentials Devicee Config and update the Bridge Config to brigde to the desired communication method. Again this would require no change on the Simpl Windows side as long as you maintain the same join Start in the Bridge Device Configuration.

## Common Use Cases

1. There are 10 conference rooms that all operate the same, but have hardware differences that are impossible to account for in SIMPL Windows. For example, each room might have a DM-MD8X8 chassis, but the input and output cards aren't all in the same order, or they might be different models but function the same. You can use Essentials with a unique configuration file for each hardware configuration.

1. You have a floor of conference rooms that all share some centralized hardware like DSP, AV Routing and a shared CEN-GWEXER gateway with multiple GLS-OIR-CSM-EX-BATT occupancy sensors. All the shared hardware can be defined in the Essentials configuration and bridged over an EISC to each program that needs access. The same device can even be exposed to multiple programs over different EISCs.

1. You have a SIMPL program that works for many room types, but because some rooms have different models of processors than others (CP3/CP3N/AV3/PRO3/DMPS3 variants), you have to maintain several versions of the program, compiled for each processor model to maintain access to features like the System Monitor slot. You can use Essentials running in a slot on a processor to expose the System Monitor and many other features of the processor, regardless of model. Now you only need to maintain a single SIMPL program defined for your most complex processor application (ex. PRO3)

## Device Type Join Maps

### AirMediaController

> supports: AM-200, AM-300

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/AirMediaControllerJoinMap.cs>

### AppleTvController

> supports: IR control of Apple TV

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/AppleTvJoinMap.cs>

### CameraControlBase

> supports: any camera that derives from CameraBase

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/CameraControllerJoinMap.cs>

### DisplayController

> supports: IR controlled displays, any two way display driver that derives from PepperDash.Essentials.Core.DisplayBase

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DisplayControllerJoinMap.cs>

### DmChasisController

> supports: All DM-MD-8x8/16x16/32x32 chassis, with or w/o DM-CPU3 Card

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmChassisControllerJoinMap.cs>

### DmRmcController

> supports: All DM-RMC devices

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmRmcControllerJoinMap.cs>

### DmTxController

> supports: All Dm-Tx devices

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmTxControllerJoinMap.cs>

### DmpsAudioOutputController

> supports: Program, Aux1, Aux2 outputs of all DMPS3 Control Systems

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs>

### DmpsRoutingController

> supports: Av routing for all DMPS3 Control Systems

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs>

### GenericRelayController

> supports: Any relay port on a Crestron Control System or Dm Endpoint

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs>

### GenericLightingJoinMap

> supports: Devices derived from PepperDash.Essentials.Core.Lighting.LightingBase

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/GenericLightingJoinMap.cs>

### GlsOccupancySensorBase

> supports: Any Crestron GLS-Type Occupancy sensor - single/dual type

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs>

### HdMdxxxCEController

> supports: HD-MD-400-C-E, HD-MD-300-C-E, HD-MD-200-C-E, HD-MD-200-C-1G-E-B/W

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs>

### IBasicCommunication

> supports: Any COM Port on a Control System or Dm Endpoint device, TCP Client, SSH Client, or UDP Server

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs>

### IDigitalInput

> supports: Any Digital Input on a Control System, or DM Endpoint device

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/IDigitalInputJoinMap.cs>

### SystemMonitorController

> supports: Exposing the system monitor slot for any Control System

<https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Bridges/JoinMaps/SystemMonitorJoinMap.cs>

## Example SIMPL Windows Program

We've provided an [example program](https://github.com/PepperDash/EssentialsSIMPLWindowsBridgeExample) for SIMPL Windows that works with the provided example Essentials configuration file [SIMPLBridgeExample_configurationFile.json](https://github.com/PepperDash/Essentials/blob/main/PepperDashEssentials/Example%20Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json). Load Essentials and the example SIMPL program to two slots on the same processor and you can get a better idea of how to take advantage of SIMPL Windows bridging.

Next: [Essentials architecture](~/docs/technical-docs/Arch-summary.md)


================================================
FILE: docs/docs/getting-started.md
================================================
# Getting Started

================================================
FILE: docs/docs/how-to/how-to-add-docs.md
================================================
# How to Add Documentation to Essentials

This guide explains how to add new documentation articles to the Essentials docFx site.

## Overview

The Essentials documentation uses [docFx](https://dotnet.github.io/docfx/) to generate a static documentation website. Documentation files are organized in a hierarchical structure with a table of contents (TOC) file that defines the site navigation. Documentation should be organized and written to fit into the [Diátaxis](https://diataxis.fr/start-here/) conceptual framework.

## Documentation Structure

Documentation files are located in `/docs/docs/` and organized into the following subdirectories:

- **how-to/** - Step-by-step guides and tutorials
- **usage/** - Usage documentation for SIMPL bridging, standalone use, and hardware integration
- **technical-docs/** - Technical documentation including architecture, plugins, and API references
- **images/** - Image assets used in documentation

## Adding a New Document

### Step 1: Create Your Markdown File

1. Determine which category your document belongs to (how-to, usage, or technical-docs)
2. Create a new `.md` file in the appropriate subdirectory
3. Use a descriptive filename with hyphens (e.g., `my-new-feature.md`)

**Example:**
```bash
# For a how-to guide
touch /docs/docs/how-to/configure-audio-settings.md

# For usage documentation
touch /docs/docs/usage/video-switcher-control.md

# For technical documentation
touch /docs/docs/technical-docs/custom-device-plugin.md
```

### Step 2: Write Your Content

Start your markdown file with a level 1 heading (`#`) that serves as the page title:

```markdown
# Your Document Title

Brief introduction to the topic.

## Section Heading

Content goes here...

### Subsection

More detailed content...
```

**Markdown Features:**
- Use standard markdown syntax
- Include code blocks with language specifiers (```csharp, ```json, etc.)
- Add images: `![Alt text](../images/your-image.png)`
- Link to other docs: `[Link text](../usage/related-doc.md)`

### Step 3: Add to Table of Contents

Edit `/docs/docs/toc.yml` to add your new document to the navigation:

```yaml
- name: How-to's
  items:
    - href: how-to/how-to-add-docs.md
    - href: how-to/your-new-doc.md  # Add your document here
```

**TOC Structure:**
- `name:` - Display name in the navigation menu
- `href:` - Relative path to the markdown file
- `items:` - Nested items for hierarchical navigation

**Example with nested items:**
```yaml
- name: Usage
  items:
  - name: SIMPL Bridging
    href: usage/SIMPL-Bridging-Updated.md
    items:
    - name: Your Sub-Topic
      href: usage/your-sub-topic.md
```

### Step 4: Test Locally

Build and preview the docFx site locally to verify your changes:

```bash
# Navigate to the docs directory
cd docs

# Build the documentation
docfx build

# Serve the site locally
docfx serve _site
```

Then open your browser to `http://localhost:8080` to view the site.

## Best Practices

### File Naming
- Use lowercase with hyphens: `my-document-name.md`
- Be descriptive but concise
- Avoid special characters

### Content Guidelines
- Start with a clear introduction
- Use hierarchical headings (H1 → H2 → H3)
- Include code examples where appropriate
- Add images to illustrate complex concepts
- Link to related documentation

### TOC Organization
- Group related documents under the same parent
- Order items logically (basic → advanced)
- Keep the TOC hierarchy shallow (2-3 levels max)
- Use clear, descriptive names for navigation items

## Common Issues

### Document Not Appearing
- Verify the file path in `toc.yml` is correct and uses forward slashes
- Ensure the markdown file exists in the specified location
- Check for YAML syntax errors in `toc.yml`

### Images Not Loading
- Verify image path is relative to the markdown file location
- Use `../images/` for files in the images directory
- Ensure image files are committed to the repository

### Broken Links
- Use relative paths for internal links
- Test all links after building the site
- Use `.md` extension when linking to other documentation files

## Additional Resources

- [docFx Documentation](https://dotnet.github.io/docfx/)
- [Markdown Guide](https://www.markdownguide.org/)
- [YAML Syntax](https://yaml.org/spec/1.2/spec.html)
- [Diátaxis](https://diataxis.fr/start-here/)


================================================
FILE: docs/docs/technical-docs/Arch-1.md
================================================
# Essentials architecture

## Device and DeviceManager

---
[YouTube Video - The Device Model in PepperDash Essentials](https://youtu.be/QF4vCQfOYGw)
***

A `Device` (`PepperDash.Core.Device`) is a logical construct. It may represent a piece of hardware, a port, a socket, a collection of other devices/ports/constructs that define an operation, or any unit of logic that should be created at startup and exist independent of other devices.

`DeviceManager` (`PepperDash.Essentials.Core.DeviceManager`) is the collection of all Devices. The collection of everything we control, and other business logic in a system. See the list below for what is typical in the device manager.

## Flat system design

In Essentials, most everything we do is focused in one layer: The Devices layer. This layer interacts with the physical Crestron and other hardware and logical constructs underneath, and is designed so that we rarely act directly on the often-inconsistent hardware layer. The `DeviceManager` is responsible for containing all of the devices in this layer.

Types of things in `DeviceManager`:

* Rooms
* Sources
* Codecs, DSPs, displays, routing hardware
* IR Ports, Com ports, SSh Clients, ...
* Occupancy sensors and relay-driven devices
* Logical devices that manage multiple devices and other business, like shade or lighting scene controllers
* Fusion connectors to rooms

A Device doesn't always represent a physical piece of hardware, but rather a logical construct that "does something" and is used by one or more other devices in the running program.  For example, we create a room device, and its corresponding Fusion device, and that room has a Cisco codec device, with an attached SSh client device. All of these lie in a flat collection in the `DeviceManager`.

> The `DeviceManager` is nothing more than a modified collection of things, and technically those things don't have to be Devices, but must at least implement the `IKeyed` (`PepperDash.Core.IKeyed`) interface (simply so items can be looked up by their key.) Items in the `DeviceManager` that are Devices are run through additional steps of [activation](~/docs/technical-docs/Arch-activate.md#2-pre-activation) at startup.  This collection of devices is all interrelated by their string keys.

In this flat design, we spin up devices, and then introduce them to their "coworkers and bosses" - the other devices and logical units that they will interact with - and get them all operating together to form a running unit. For example: A room configuration will contain a "VideoCodecKey" property and a "DefaultDisplayKey" property. The `DeviceManager` provides the room with the codec or displays having the appropriate keys. What the room does with those is dependent on its coding.

> In the default Essentials routing scheme, the routing system gets the various devices involved in given route from `DeviceManager`, as they are discovered along the defined tie-lines. This is all done at route-time, on the fly, using only device and port keys. As soon as the routing operation is done, the whole process is released from memory. This is extremely-loose coupling between objects.

This flat structure ensures that every device in a system exists in one place and may be shared and reused with relative ease. There is no hierarchy.

## Architecture drawing

![Architecture overview](~/docs/images/arch-overview.png)

Next: [Configurable lifecycle](~/docs/technical-docs/Arch-lifecycle.md)


================================================
FILE: docs/docs/technical-docs/Arch-activate.md
================================================
# Essentials architecture: DeviceManager activation

## What is all this?

The Essentials system architecture is a loose collection of "things" - generally real or logical Devices - that all need to relate to each other. In the interest of keeping Essentials extensible and flexible, we use an non-ordered collection of objects that should only have references to each other in the least-binding way possible. Meaning: Devices should be designed to be able to function without related objects present, and when they are present they should only retain loose reference to those other objects for memory management and later deconstruction as Essentials grows into a real-time configurable environment.

In order to facilitate this loose coupling, Essentials devices go through five phases during the startup process: Construction; addition to `DeviceManager`; pre-activation; activation; post-activation. We will describe what is optimal behavior for each of the steps below:

### Classes Referenced

* `PepperDash.Core.Device`
* `PepperDash.Essentials.Core.EssentialsDevice`
* `PepperDash.Essentials.Core.DeviceManager`
* `PepperDash.Essentials.Core.Privacy.MicrophonePrivacyController`

## 1. Construction and addition to the DeviceManager

In general, a device's constructor should only be used to get the "framework" of the device in place. All devices are constructed in this stage.  Rooms and fusion bridges included. Simple devices like IR driver devices, and devices with no controls can be completely spun up in this phase. All devices are added to the `DeviceManager` after they are constructed, but may not be fully functional.

## 2. Pre-activation

This stage is rarely used. It exists to allow an opportunity for any necessary logic to take place before the main activation phase.

## 3. Activation

This stage is the main phase of startup, and where most devices will get up and running, if they need additional startup behavior defined.  The developer will code an optional overridden `CustomActivate()` method on the device class. This is where hardware ports may be set up; signals and feedbacks linked; UI drivers fired up; rooms linked to their displays and codec... With the exception of early-designed devices, most new Essentials classes do all of their startup here, rather than in their constructors.

Remember that in your `CustomActivate()` method, you cannot assume that a device you depend on is alive and running yet.  It may be activating later.  You _can_ depend on that device's existence, and link yourself to it, but it may not be functional yet. In general, there should be no conditions in any Essentials code that depend on device startup sequence and ordering. All rooms, devices, classes should be able to function without linked devices being alive, and respond appropriately when they do come to life. Any post-activation steps can be done in step four below - and should be avoided in general.

If the `CustomActivate()` method is long, consider breaking it up into many smaller methods. This will enhance exception handling and debugging when things go wrong, with more-detailed stack traces, and makes for easier-to-read code.

Note: It is best-practice in Essentials to not write arbitrarily-timed startup sequences to ensure that a "system" or room is functional. Rather, we encourage the developer to use various properties and conditions on devices to aggregate together "room is ready" statuses that can trigger further action. This ensures that all devices can be up and alive, allowing them to be debugged within a program that may otherwise be misbehaving - as well as not making users and expensive developers wait for code to start up!

```cs
public override bool CustomActivate()
{
    Debug.Console(0, this, "Final activation. Setting up actions and feedbacks");
    SetupFunctions();
    SetupFeedbacks();

    EISC.SigChange += EISC_SigChange;
    ...
}
```

## 4. Post-activation

This phase is used primarily to handle any logic in a device that might be dependent on another device, and we need to ensure that we have waited for the dependent device to be activated first.  For example, if we look at the `MicrophonePrivacyController` class, this is a "virtual" device whose purpose is to control the mute state of microphones from one or more contact closure inputs as well as provide feedback via different colored LEDs as to the current mute state.  This virtual-device doesn't actually represent any sort of physical hardware device, but rather relies on associating itself with other devices that represent digital inputs and relays as well as whatever device is responsible for preforming the actual muting of the microphones.

We can see in the example below that during the `CustomActivate()` phase, we define a post-activation action via a lambda in `AddPostActivationAction()` that will execute during the post-activation phase.  The purpose here is to check the state of the microphone mute and set the state of the relays that control the LEDs accordingly.  We need to do this as a post-activation action because we need to make sure that the devices PrivacyDevice, RedLedRelay and GreenLedRelay are fully activated before we can attempt to interact with them.

### **Example**

```cs
public override bool CustomActivate()
{
    foreach (var i in Config.Inputs)
    {
        var input = DeviceManager.GetDeviceForKey(i.DeviceKey) as IDigitalInput;
        if(input != null)
            AddInput(input);
    }

    var greenLed = DeviceManager.GetDeviceForKey(Config.GreenLedRelay.DeviceKey) as GenericRelayDevice;
    if (greenLed != null)
        GreenLedRelay = greenLed;
    else
        Debug.Console(0, this, "Unable to add Green LED device");

    var redLed = DeviceManager.GetDeviceForKey(Config.RedLedRelay.DeviceKey) as GenericRelayDevice;
    if (redLed != null)
        RedLedRelay = redLed;
    else
        Debug.Console(0, this, "Unable to add Red LED device");

    AddPostActivationAction(() => {
        CheckPrivacyMode();
        PrivacyDevice.PrivacyModeIsOnFeedback.OutputChange -= PrivacyModeIsOnFeedback_OutputChange;
        PrivacyDevice.PrivacyModeIsOnFeedback.OutputChange += PrivacyModeIsOnFeedback_OutputChange;
    });

    initialized = true;

    return base.CustomActivate();
}

void CheckPrivacyMode()
{
    if (PrivacyDevice != null)
    {
        var privacyState = PrivacyDevice.PrivacyModeIsOnFeedback.BoolValue;
        if (privacyState)
            TurnOnRedLeds();
        else
            TurnOnGreenLeds();
    }
}
```

## Activation exceptions

Each of the three activation phases operates in a try/catch block for each device.  This way if one device has a fatal failure during activation, the failure will be logged and the system can continue to activate. This allows the developer to chase down multiple issues per load while testing, or to fix configuration omissions/errors as a group rather than one-at-a-time. A program can theoretically be fully-initialized and have many or all devices fail. We generally do not want to depend on exception handling to log device failures. Construction and activation code should have plenty of null checks, parameter validity checks, and debugging output to prevent exceptions from occurring. `String.IsEmptyOrNull(myString)` and `if(myObject == null)` are your friends. Invite them often.

## Interdependence

In any real-world system, devices and business logic need to talk to each other, otherwise, what's the point of all this coding? When creating your classes and configuration, it is best practice to _try_ not to "plug" one device into another during construction or activation. For example your touchpanel controller class has a `Display1` property that holds the display-1 object. Rather, it may be better to refer to the device as it is stored in the `DeviceManager` when it's needed using the static `DeviceManager.GetDeviceForKey(key)` method to get a reference to the device, which can be cast using various interfaces/class types, and then interacted with.  This prevents objects from being referenced in places where the developer may later forget to dereference them, causing memory leak.  This will become more important as Essentials becomes more able to be reconfigured at runtime.

As an example, [connection-based routing](~/docs/technical-docs/Connection-based-routing.md#essentials-connection-based-routing) uses these methods.  When a route is requested, the collection of tielines and devices is searched for the devices and paths necessary to complete a route, but there are no devices or tie lines that are object-referenced in running code.  It can all be torn down and reconfigured without any memory-management dereferencing, setting things to null.

## Device Initialization

Once the `DeviceManager` has completed the activation phase cycle for all devices, the devices themselves can be initialized.  The `EssentialsDevice` class subscribes to the `DeviceManager.AllDevicesActivated` event and invokes the virtual `Initialize()` method on `Device` in a separate thread.  This allows all devices to concurrently initialize in parallel threads. 

The main task that should be undertaken in the `Initialize()` method for any 3rd party device class, it to begin communication with the device via its API.  Ideally, no class that communicates with a 3rd party device outside the program should attempt to start communicating before this point.

### Example (from `PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.CiscoSparkCodec`)
```cs
        public override void Initialize()
        {
            var socket = Communication as ISocketStatus;
            if (socket != null)
            {
                socket.ConnectionChange += new EventHandler<GenericSocketStatusChageEventArgs>(socket_ConnectionChange);
            }

            Communication.Connect();

            CommunicationMonitor.Start();

            const string prefix = "xFeedback register ";

            CliFeedbackRegistrationExpression =
                prefix + "/Configuration" + Delimiter +
                prefix + "/Status/Audio" + Delimiter +
                prefix + "/Status/Call" + Delimiter +
                prefix + "/Status/Conference/Presentation" + Delimiter +
                prefix + "/Status/Cameras/SpeakerTrack" + Delimiter +
                prefix + "/Status/RoomAnalytics" + Delimiter +
                prefix + "/Status/RoomPreset" + Delimiter +
                prefix + "/Status/Standby" + Delimiter +
                prefix + "/Status/Video/Selfview" + Delimiter +
                prefix + "/Status/Video/Layout" + Delimiter +
                prefix + "/Status/Video/Input/MainVideoMute" + Delimiter +
                prefix + "/Bookings" + Delimiter +
                prefix + "/Event/CallDisconnect" + Delimiter +
                prefix + "/Event/Bookings" + Delimiter +
                prefix + "/Event/CameraPresetListUpdated" + Delimiter +
                prefix + "/Event/UserInterface/Presentation/ExternalSource/Selected/SourceIdentifier" + Delimiter;
        }
```

## The goal

Robust C#-based system code should not depend on "order" or "time" to get running.  We do not need to manage the order of our startup in this environment.  Our Room class may come alive before our DSP and or Codec, and the Room is responsible for handling things when those devices become available. The UI layer is responsible for blocking the UI or providing status when the Room's requirements are coming alive, or if something has gone away. We use events or `Feedbacks` to notify dependents that other devices/classes are ready or not, but we do not prevent continued construction/activation of the system when many of these events don't happen, or don't happen in a timely fashion.  This removes the need for startup management, which is often prolonged and consumes _tons_ of developer/installer time.  A fully-loaded Essentials system may go through activation in several seconds, with all devices concurrently getting themselves going, where legacy code may take 10 minutes.

When designing new Device-based classes, be it rooms, devices, port controllers, bridges, make them as independent as possible.  They could exist alone in a program with no required partner objects, and just quietly exist without failing. We want the system to be fast and flexible, and keeping the interdependence between objects at a minimum improves this flexibility into the future.

Next: [More architecture](~/docs/technical-docs/Arch-topics.md)


================================================
FILE: docs/docs/technical-docs/Arch-lifecycle.md
================================================
# Essentials Configurable System Lifecycle

The diagram below describes how Essentials gets a program up and running.

(The various activation phases are covered in more detail on the [next page](~/docs/technical-docs/Arch-activate.md))

![Lifecycle](~/docs/images/lifecycle.png)

Next: [Activation phases](~/docs/technical-docs/Arch-activate.md)


================================================
FILE: docs/docs/technical-docs/Arch-summary.md
================================================
# Essentials architecture

## Summary

PepperDash Essentials is an open-source framework for control systems, built on Crestron's Simpl# Pro framework. It can be configured as a standalone program capable of running a wide variety of system designs and can also be used to augment other Crestron programs.

Essentials is a collection of C# libraries that can be used in many ways. It is a 100% configuration-driven framework that can be extended to add different workflows and behaviors, either through the addition of new device-types and classes, or via a plug-in mechanism. The framework is a collection of things that are all related and interconnected, but in general do not have strong dependencies on each other.

## Framework Libraries

The table below is a guide to understand the basic organization of code concepts within the various libraries that make up the architecture.

![Table](~/docs/images/arch-table.PNG)

The diagram below shows the reference dependencies that exist between the different component libraries that make up the Essentials Framework.

![Architecture drawing](~/docs/images/arch-high-level.png)

Next: [Architecture](~/docs/technical-docs/Arch-1.md)


================================================
FILE: docs/docs/technical-docs/Arch-topics.md
================================================
# Configuration topics

Configuration is central to Essentials. On this page we will cover configuration-related topics, including the important concept of configure-first and some details about the config file process.

## Classes Referenced

- `PepperDash.Essentials.Core.Config.DeviceConfig`

## Configure-first development

## Framework Libraries

The table below is meant to serve as a guide to understand the basic organization of code concepts within the various libraries that make up the architecture.

_Todo, try a text-based table:_

![Table](~/docs/images/arch-table.PNG)

The diagram below shows the reference dependencies that exist between the different component libraries that make up the Essentials Framework.

![Architecture drawing](~/docs/images/arch-high-level.png)

### Architecture

#### Device and DeviceManager

A `Device` is a logical construct. It may represent a piece of hardware, a port, a socket, a collection of other devices/ports/constructs that define an operation, or any unit of logic that should be created at startup and exist independent of other devices.

`DeviceManager` is the collection of all Devices. The collection of everything we control on a system. **ADD SOME MORE HERE**

#### Flat system design

In Essentials, most everything we do is focused in one layer: The Devices layer. This layer interacts with the physical Crestron and other hardware and logical constructs underneath, and is designed so that we rarely act directly on the often-inconsistent hardware layer. The `DeviceManager` is responsible for containing all of the devices in this layer.

Types of devices:

- Rooms
- Sources
- Codecs, DSPs, displays, routing hardware
- IR Ports, Com ports, SSh Clients, ...
- Occupancy sensors and relay-driven devices
- Logical devices that manage multiple devices and other business, like shade or lighting scene controllers
- Fusion connectors to rooms

A Device doesn't always represent a physical piece of hardware, but rather a logical construct that "does something" and is used by one or more other devices in the running program. For example, we create a room device, and its corresponding Fusion device, and that room has a Cisco codec device, with an attached SSh client device. All of these lie in a flat collection in the `DeviceManager`.

> The `DeviceManager` is a modified collection of objects, and those objects don't have to inherit from Devices or EssentialsDevices, but must at least implement the `IKeyed` interface (so items can be looked up by their key.) Items in the `DeviceManager` that are Devices are run through additional steps of activation at startup. This collection of devices is all interrelated by their string keys.

In this flat design, we spin up devices, and then introduce them to their "coworkers and bosses" - the other devices and logical units that they will interact with - and get them all operating together to form a running unit. For example: A room configuration will contain a "VideoCodecKey" property and a "DefaultDisplayKey" property. The `DeviceManager` provides the room with the codec or displays having the appropriate keys. What the room does with those is dependent on its coding.

> In the default Essentials routing scheme, the routing system gets the various devices involved in given route from `DeviceManager`, as they are discovered along the defined tie-lines. This is all done at route-time, on the fly, using only device and port keys. As soon as the routing operation is done, the whole process is released from memory. This is extremely-loose coupling between objects.

This flat structure ensures that every device in a system exists in one place and may be shared and reused with relative ease. There is no hierarchy.

#### Architecture drawing

![Architecture overview](~/docs/images/arch-overview.png)

#### Essentials Configurable System Lifecycle

![Lifecycle](~/docs/images/lifecycle.png)

### Activation phases additional topics and examples (OTHER DOCS)

Concepts (link)

Room and touchpanel activation (link)

#### Configure first development

One of the primary concepts that has been adopted and must be adhered to when writing for Essentials framework is the concept of "configure first." The simple version is: Write what you need to do in the related configuration file (and configuration tool) first, then write the code that runs from that configuration. This ensures that the running code can actually be configured in the "flat" structure of devices and rooms that Essentials uses.

Often, code is written and tested first without consideration for configurability. Then, when a developer tries to make it configurable, they discover that the code as written doesn’t support it without complicated configuration files. This creates spaghetti code in tools that are written to generate configurations and tends to create tighter coupling between objects than we desire. Later, a modified version of the original program is desired, but because the code was written in such a specific fashion, the code is hard to refactor and extend. This causes the configuration tool and configuration files to become even more convoluted. The modern versions of configuration tools that are starting to come out are modular and componentized. We want to ensure as much re-use of these modules as possible, with extensions and added features added on, rather than complete rewrites of existing code. In our running systems, we want to ensure as much flexibility in design as possible, eliminating multiple classes with similar code.

### Configuration reader process

At the heart of the Essentials framework is the configuration system. While not technically necessary for a system written with the Essentials framework, it is the preferred and, currently, the only way to build an Essentials system. The configuration file is JSON, and well-defined (but not well documented, yet). It is comprised of blocks:

- info (object) Contains metadata about the config file
- devices (array) Contains, well, the devices we intend to build and load
- rooms (array, typically only one) Contains the rooms we need
- sourceLists (object) Used by one or more rooms to represent list(s) of sources for those rooms
- tieLines (array) Used by the routing system to discover routing between sources and displays

In addition, a downloaded Portal config file will most likely be in a template/system form, meaning that the file contains two main objects, representing the template configuration and its system-level overrides. Other metadata, such as Portal UUIDs or URLs may be present.

At startup, the configuration file is read, and a ReadyEvent is fired. Upon being ready, that configuration is loaded by the ConfigReader.LoadConfig() method. The template and system are merged into a single configuration object, and that object is then deserialized into configuration wrapper classes that define most of the structure of the program to be built. (Custom configuration objects were built to allow for better type handling rather than using JToken methods to parse out error-prone property names.)

For example, a `DeviceConfig` object:

```cs
namespace PepperDash.Essentials.Core.Config
{
    public class DeviceConfig
    {
        [JsonProperty("key")]
        public string Key { get; set; }

        [JsonProperty("uid")]
        public int Uid { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("group")]
        public string Group { get; set; }

        [JsonProperty("type")]
        public string Type { get; set; }

        [JsonProperty("properties")]
        [JsonConverter(typeof(DevicePropertiesConverter))]
        public JToken Properties { get; set; }
    }
}
```

_Every_ `Device` present must adhere to those five properties plus a properties object. The properties object will have its own deserialization helpers, depending on what its structure is.

Once the ConfigReader has successfully read and deserialized the config file, then `ControlSystem.Load()` is called. This does the following in order:

1. Loads Devices
2. Loads TieLines
3. Loads Rooms
4. Loads LogoServer
5. Activation sequence

This ordering ensures that all devices are at least present before building tie lines and rooms. Rooms can be built without their required devices being present. In principle, this could break from the loosely-coupled goal we have described, but it is the clearest way to build the system in code. The goal is still to build a room class that doesn't have functional dependencies on devices that may not be ready for use.

In each device/room step, a device factory process is called. We call subsequent device factory methods in the various libraries that make up Essentials until one of them returns a functional device. This allows us to break up the factory process into individual libraries, and not have a huge list of types and build procedures. Here's part of the code:

```cs
// Try local factories first
var newDev = DeviceFactory.GetDevice(devConf);

if (newDev == null)
    newDev = BridgeFactory.GetDevice(devConf);

// Then associated library factories
if (newDev == null)
    newDev = PepperDash.Essentials.Core.DeviceFactory.GetDevice(devConf);
if (newDev == null)
    newDev = PepperDash.Essentials.Devices.Common.DeviceFactory.GetDevice(devConf);
if (newDev == null)
    newDev = PepperDash.Essentials.DM.DeviceFactory.GetDevice(devConf);
if (newDev == null)
    newDev = PepperDash.Essentials.Devices.Displays.DisplayDeviceFactory.GetDevice(devConf);
```

In each respective factory, or device constructor, the configuration's properties object is either converted to a config object or read from using `JToken` methods. This builds the device which may be ready to go, or may require activation as described above.

A similar process is carried out for rooms, but as of now, the room types are so few that they are all handled in the `ControlSystem.LoadRooms()` method.

_This process will soon be enhanced by a plug-in mechanism that will drill into dynamically-loaded DLLs and load types from factories in those libraries. This is where custom essentials systems will grow from._

After those five steps, the system will be running and ready to use.


================================================
FILE: docs/docs/technical-docs/Communication-Basics.md
================================================
# Unifying communication methods

In networked A/V systems, devices can use many different methods of communication: COM ports, TCP/IP sockets, Telnet, SSH. Generally, the data protocol and commands that are sent and received using any of these methods are the same, and it is not necessary for a device to know the details of the communication method it is using. A Samsung MDC protocol display in room 1 using RS232 speaks the same language as another Samsung MDC does in the next room using TCP/IP. For these, and most cases where the device doesn't need to know its communication method, we introduce the `IBasicCommunication` interface.
## Classes Referenced

* `PepperDash.Core.IBasicCommunication`
* `PepperDash.Core.ISocketStatus`
* `PepperDash.Core.GenericTcpIpClient`
* `PepperDash.Core.GenericSshClient`
* `PepperDash.Core.GenericSecureTcpIpClient`
* `PepperDash.Essentials.Core.ComPortController`
* `PepperDash.Essentials.Core.StatusMonitorBase`
## IBasicCommunication and ISocketStatus

All common communication controllers will implement the `IBasicCommunication` interface, which is an extension of `ICommunicationReceiver`. This defines receive events, connection state properties, and send methods. Devices that need to use COM port, TCP, SSh or other similar communication will require an `IBasicCommunication` type object to be injected at construction time.

```cs
/// <summary>
/// An incoming communication stream
/// </summary>
public interface ICommunicationReceiver : IKeyed
{
    event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived;
    event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived;

    bool IsConnected { get; }
    void Connect();
    void Disconnect();
}

/// <summary>
/// Represents a device that uses basic connection
/// </summary>
public interface IBasicCommunication : ICommunicationReceiver
{
    void SendText(string text);
    void SendBytes(byte[] bytes);
}

/// <summary>
/// For IBasicCommunication classes that have SocketStatus. GenericSshClient,
/// GenericTcpIpClient
/// </summary>
public interface ISocketStatus : IBasicCommunication
{
    event EventHandler<GenericSocketStatusChageEventArgs> ConnectionChange;
    SocketStatus ClientStatus { get; }
}
```

### Developing devices with communication

Essentials uses dependency injection concepts in its start up phase. Simply, most devices use the same methods of communication, and are often communication-agnostic. During the build-from-configuration phase, the communication method device is instantiated, and then injected into the device that will use it. Since the communication device is of `IBasicCommunication`, the device controller receiving it knows that it can do things like listen for events, send text, or be notified when sockets change.

### Device Factory, Codec example

![Communication Device factory](~/docs/images/comm-device-factory.png)

The DeviceManager will contain two new devices after this: The Cisco codec, and the codec's `GenericSshClient`. This enables easier debugging of the client using console methods. Some devices like this codec will also have a `StatusMonitorBase` device, for Fusion and other reporting.

> `ComPortController` is `IBasicCommunication` as well, but methods like `Connect()` and `Disconnect()` do nothing on these types.

#### ISocketStatus

`PepperDash.Core.GenericTcpIpClient`, `GenericSshClient` and some other socket controllers implement `ISocketStatus`, which is an extension of `IBasicCommunication`. This interface reveals connection status properties and events.

```cs
public interface ISocketStatus : IBasicCommunication
{
    event EventHandler<GenericSocketStatusChageEventArgs> ConnectionChange;
    SocketStatus ClientStatus { get; }
}
```

Classes that are using socket-based comms will need to check if the communication is `ISocketStatus` and link up to the `ConnectionChange` event for connection handling.


================================================
FILE: docs/docs/technical-docs/ConfigurationStructure.md
================================================
# Configuration Structure

---

[YouTube Video - Configuring PepperDash Essentials](https://youtu.be/EK8Ti9a1o7s)

***

The Essentials configuration structure is designed to allow minimum duplication of data across systems that share many similarities, which makes it ideally suited for applications where large numbers of duplicate room types must be deployed.

At a high level, the idea is to define a template of all of the common configuration shared by a group of systems of the same type.  Then individual differences per system instance can be defined in a system block that either add data missing in the template, or override the default values set in the template.

## Top Level Object Structure (Double Config)

```cs
{
    // This object is deserialized to type PepperDash.Essentials.Core.Config.EssentialsConfig

    "system_url":"", // For Portal use only
    "template_url":"", // For Portal use only
    "template":{
        // This object is deserialized to type PepperDash.Essentials.Core.EssentialsConfig
        // For most manually generated configuration, only define data here.  Leave system empty
    },
    "system":{
        // This object is deserialized to type PepperDash.Essentials.Core.EssentialsConfig
        // Any data here will be overlayed on top of the data in template.  In the case of duplicate values
        // the value in system will be overwrite any value in template
    }
}
```

## Object Structure for `template` and `system` (`PepperDash.Essentials.Core.EssentialsConfig`)

``` js
{
     "info": {
        // This object is deserialized to type PepperDash.Essentials.Core.Config.InfoConfig
        // Contains information about the system/configuration
     },
     "devices": [
        // This object is deserialized to type List<PepperDash.Essentials.Core.Config.DeviceConfig>
        // An array of devices
     ],
     "rooms": [
        // This object is deserialized to type List<PepperDash.Essentials.Core.Config.DeviceConfig>
        // An array of rooms.  These are not automatically deserialized
     ],
     "tielines":[
        // An array of tie lines that describe the connections between routing ports on devices
     ],
     "sourceLists":{
        // This object is deserialized to type Dictionary<string, Dictionary<string, PepperDash.Essentials.Core.SourceListItem>>
        // An object that contains a collection
     },
     "joinMaps":{
        // This object is deserialized to type Dictionary<string, string> where the value is a serialized class that inherits from JoinMapBase to be deserialized later
        // Used to define custom join maps for bridging devices to SIMPL
     }
}
```

## The Template and System Concept (Merging Configurations)

In order to understand how and why we use a double configuration concept, it's important to understand the relationship between a Template and a System in Portal.  A System represents a physical installed group of hardware(either currently or in the future), acting together usually as part of a single control system program.  A system MUST inherit from a Template.  A Template represents the common elements of one or more systems.

The idea being that configuration values that are common to all systems can be stored in the configuration for the template.  Then, any configuration values that are unique to a particular system cane be stored in the configuration of the System.  By "merging" the System configuration values over top of the Template configuration values, the resulting data contains all of the values that should be shared by each system that inherits from a common template, as well as the unique values for each individual system.

Below is an example of a double configuration containing both template and system properties.

```JSON
{
    "template": {
        "info": {
            "name": "Template Name",
            "description": "A 12 person conference room"
        },
        "devices": [

        ],
        "rooms": [

        ]
    },
    "system": {
        "info": {
            "name": "System Name",
            "myNewSystemProperty": "Some Value"
        },
        "devices": [

        ],
        "rooms": [

        ]
    }
}
```

Below is an example of the result of merging the above double configuration example into a single configuration.

```JSON
{
    "info": {
        "name": "System Name",                          // Since this property existed in both the template and system, the system value replaces the template value after the merge
        "description": "A 12 person conference room",   // This property existed only in the template and is unchanged after the merge
        "myNewSystemProperty": "Some Value"             // This property existed only in the system and is unchanged after the merge
    },
    "devices": [

    ],
    "rooms": [

    ]
}
```

---

## Device Object Structure

The devices array is meant to hold a series of device objects.  The basic device object structure is defined below.

```JSON
{
    "key": "someUniqueString",  // *required* a unique string
    "name": "A friendly Name",  // *required* a friendly name meant for display to users
    "type": "exampleType",      // *required* the type identifier for this object.  
    "group": "exampleGroup",    // *required* the group identifier for this object.  This really equates to a category for the device,
                                // such as "lighting" or "displays" and may be deprecated in future in favor of "category"
    "uid":0,                    // *required* a unique numeric identifier for each device
    "properties": {             // *required* an object where the configurable properties of the device are contained
        "control": {            // an object to contain all of the properties to connect to and control the device
            "method": "ssh",    // the control method used by this device
            "tcpSshProperties": {   // contains the necessary properties for the specified method
                "address": "1.2.3.4",
                "port": 22,
                "username": "admin",
                "password": "uncrackablepassword"
            }
        },
        "someCustomProperty": "I Love Tacos!"
    }
    // Do NOT add any custom data at the top level of the device object.  All custom data must be in the properties object.
}
```

Some additional details about specific properties that are important to note:

* "key": This value needs to be unique in the array of devices objects
* "uid": This value also needs to be unique for reasons related to configuration tools and template/system merging
* "type": Think of this as a way to identify what specific module you might associate with this device.  In Essentials, this value is used to determine what class will be instantiated for the device (ex. "necmpsx" or "samsungMdc" for two types of displays)
* "properties":  This object is used to store both specific and miscellaneous data about the device.
  * Specific data, like that shown above in the "control" object has a pre-defined structure.
  * Other data must be stored as objects or new properties inside the "properties" object such as "someCustomProperty" in the example above.
* Do NOT add any additional properties at the top level of the device object.  All custom data must be in the "properties" object.

## The Device Properties.Control Object

The control object inside properties has some reserved properties that are used by configuration tools and Essentials that require some caution.

```JSON
{
    "properties": {             // *required* an object where the configurable properties of the device are contained
        "control": {            // an object to contain all of the properties to connect to and control the device
            // Example of the reserved properties for a socket based port (ssh, tcpIp, udp)
            "method": "ssh",    // the control method used by this device
            "tcpSshProperties": {   // contains the necessary properties for the specified method
                "address": "1.2.3.4",               // IP Address or hostname
                "port": 22,
                "username": "admin",
                "password": "uncrackablepassword",
                "autoReconnect": true,              // If true, the client will attempt to re-connect if the connection is broken externally
                "AutoReconnectIntervalMs": 2000     // The time between re-connection attempts
            },

            // Example of the reserved properties for a Com port
            "method": "com",
            "controlPortNumber": 1,                 // The number of the com port on the device specified by controlPortDevKey
            "controlPortDevKey": "processor",       // The key of the device where the com port is located
            "comParams": {                          // This object contains all of the com spec properties for the com port
                "hardwareHandshake": "None",
                "parity": "None",
                "protocol": "RS232",
                "baudRate": 9600,
                "dataBits": 8,
                "softwareHandshake": "None",
                "stopBits": 1
            }
        }
    }
}
```

---

## Device Merging

The following examples illustrate how the device key and uid properties affect how devices are merged together in a double configuration scenario.  In order for a template device and a system device to merge, they must have the same key and uid values

```JSON
{
    "template": {
        "info": {
            "name": "Template Name",
            "description": "A 12 person conference room"
        },
        "devices": [
            {                                           // This is the template device
                "key": "display-1",
                "name": "Display",
                "type": "samsungMdc",
                "group": "displays",
                "uid":0,
                "properties": {
                    "control": {
                        "method": "ssh",
                        "tcpSshProperties": {
                            "address": "",              // Note that at the template level we won't know the actual IP address so this value is left empty
                            "port": 22,
                            "username": "admin",
                            "password": "uncrackablepassword"
                        }
                    }
                }
            }
        ],
        "rooms": [

        ]
    },
    "system": {
        "info": {
            "name": "System Name",
            "myNewSystemProperty": "Some Value"
        },
        "devices": [
            {                                           // This is the system device
                "key": "display-1",
                "uid":0,
                "properties": {
                    "control": {
                            "tcpSshProperties": {
                            "address": "10.10.10.10"    // Note that the actual IP address is specified at the system level
                        }
                    }
                }
            }
        ],
        "rooms": [

        ]
    }
}
```

Below is an example of the result of merging the above double configuration example into a single configuration.  

```JSON
{
    "info": {
        "name": "System Name",
        "description": "A 12 person conference room",
        "myNewSystemProperty": "Some Value"
    },
     "devices": [
        {
            "key": "display-1",
            "name": "Display",
            "type": "samsungMdc",
            "group": "displays",
            "uid":0,
            "properties": {
                "control": {
                    "method": "ssh",
                    "tcpSshProperties": {
                        "address": "10.10.10.10",   // Note that the merged device object inherits all of the template
                                                    // properties and overwrites the template address property with the system value
                        "port": 22,
                        "username": "admin",
                        "password": "uncrackablepassword"
                    }
                }
            }
        }
     ],
     "rooms": [

     ]
}
```


================================================
FILE: docs/docs/technical-docs/Connection-Based-Routing.md
================================================
# Essentials connection-based routing

## TL;DR

Routing is defined by a connection graph or a wiring diagram. Routable devices are sources, midpoints, or destinations. Devices are connected by tie lines. Tie lines represent the cables connecting devices, and have specific signal types (audio, video, audioVideo, secondaryAudio, usbInput, usbOutput). Routes are made by telling a destination to get a route from a source for a specific signal type. Combined signal types (e.g., audioVideo) are automatically split into separate routing operations.

## Summary

Essentials routing is described by defining a graph of connections between devices in a system, typically in configuration. The audio, video and combination connections are like a wiring diagram. This graph is a collection of devices and tie lines, each tie line connecting a source device, source output port, destination device and destination input port. Tie lines are logically represented as a collection.

When routes are to be executed, Essentials will use this connection graph to decide on routes from source to destination. A method call is made on a destination, which says "destination, find a way for source xyz to get to you." An algorithm analyzes the tie lines, instantly walking backwards from the destination, down every connection until it finds a complete path from the source. If a connected path is found, the algorithm then walks forward through all midpoints to the destination, executing switches as required until the full route is complete. The developer or configurer only needs to say "destination, get source xyz" and Essentials figures out how, regardless of what devices lie in between.

### Signal Type Handling

When a combined signal type like `audioVideo` is requested, Essentials automatically splits it into two separate routing operations—one for audio and one for video. Each signal type is routed independently through the system, ensuring that:
- Audio-only tie lines can be used for the audio portion
- Video-only tie lines can be used for the video portion
- AudioVideo tie lines can be used for both portions

During path discovery, **only tie lines that support the requested signal type are considered**. For example, if a video route is requested, only tie lines with the video flag will be evaluated. This ensures signal compatibility throughout the entire routing chain.

### Port-Specific Routing

The routing system supports routing to and from specific ports on devices. You can specify:
- A specific input port on the destination device
- A specific output port on the source device
- Both specific ports for precise routing control

When no specific ports are specified, the algorithm will automatically discover the appropriate ports based on available tie lines.

### Request Queuing

All routing requests are processed sequentially through a queue. For devices that implement warming/cooling behavior (e.g., projectors), route requests are automatically held when a device is cooling down and executed once the device is ready. This prevents routing errors and ensures proper device state management.

### Classes Referenced

* `PepperDash.Essentials.Core.Routing.IRoutingSource`
* `PepperDash.Essentials.Core.Routing.IRoutingOutputs`
* `PepperDash.Essentials.Core.Routing.IRoutingInputs`
* `PepperDash.Essentials.Core.Routing.IRoutingInputsOutputs`
* `PepperDash.Essentials.Core.Routing.IRoutingSinkNoSwitching`
* `PepperDash.Essentials.Core.Routing.IRoutingSinkWithSwitching`

## Example system, a simple presentation system

The diagram below shows the connections in a simple presentation system, with a few variations in connection paths. Example routes will be described following the diagram.

Each visible line between ports on devices represents a tie line. A tie line connects an output port on one device to an input port on another device, for example: an HDMI port on a document camera to an HDMI input on a matrix switcher. A tie line has a signal type (audio, video, audioVideo, secondaryAudio, usbInput, or usbOutput) that determines what signals can travel through it. It is essentially a logical representation of a physical cable in a system. This diagram has 12 tie lines, and those tie lines are defined in the tieLines array in configuration.

![Routing system diagram](~/docs/images/routing-system-diagram.png)

Let’s go through some examples of routing, using pseudo-code:

1. Method call: “Projector 1, show Doc cam.” Routing will walk backwards through DM-RMC-3 and DM-8x8 iterating through all “wired up” ports until it finds a path back to the Doc cam. Routing will then step back through all devices in the discovered chain, switching routes on those that are switchable: Doc cam: no switching; DM 8x8: route input 3 to output 3; DM-RMC-3: no switching; Projector 1: Select input HDMI In. Route is complete.
2. Method call: "Projector 2, show Laptop, video-only." Routing will walk backwards through DM-RMC-4, DM 8x8, DM-TX-1, iterating through all connected ports until it finds a connection to the laptop. During this search, only tie lines that support video signals are considered. Routing then steps back through all devices, switching video where it can: Laptop: No switching; DM-TX-1: Select HDMI in; DM 8x8: Route input 5 to output 4; DM-RMC-4: No switching; Projector 2: Select HDMI input. Route is complete.
3. Method call: "Amplifier, connect Laptop audio." Again walking backwards to Laptop, as in #2 above, but this time only tie lines supporting audio signals are evaluated. Switching will take place on DM-TX-1, DM 8x8, audio-only.
4. Very simple call: “Lobby display, show signage controller.” Routing will walk back on HDMI input 1 and immediately find the signage controller. It then does a switch to HDMI 1 on the display.

All four of the above could be logically combined in a series of calls to define a possible “scene” in a room: Put Document camera on Projector 1, put Laptop on Projector 2 and the audio, put Signage on the Lobby display. They key takeaway is that the developer doesn’t need to define what is involved in making a certain route. The person configuring the system defines how it’s wired up, and the code only needs to tell a given destination to get a source, likely through configuration as well.

All of the above routes can be defined in source list routing tables, covered elsewhere (**make link)**.

---

## Routing Algorithm Details

### Combined Signal Type Splitting

When an `audioVideo` route is requested, the routing system automatically splits it into two independent routing operations:

1. **Audio Route**: Finds the best path for audio signals from source to destination
2. **Video Route**: Finds the best path for video signals from source to destination

Each route can take a different physical path through the system. For example:
- Video might travel: Laptop → DM-TX-1 → DM Matrix → Display
- Audio might travel: Laptop → DM-TX-1 → DM Matrix → Audio Processor → Amplifier

Both routes are discovered, stored, and executed independently. This allows for flexible system designs where audio and video follow different paths.

The same splitting behavior occurs for `Video + SecondaryAudio` requests, where video and secondary audio are routed as separate operations.

### Signal Type Filtering

At each step of the route discovery process, the algorithm filters tie lines based on the requested signal type:

- **Video request**: Only considers tie lines with the `video` flag set
- **Audio request**: Only considers tie lines with the `audio` flag set
- **AudioVideo request**: Routes audio and video separately, each following their respective filtering rules

If no tie line exists with the required signal type at any point in the chain, that path is rejected and the algorithm continues searching for an alternative route. If no valid path is found, the route request fails and no switching occurs.

This filtering ensures that incompatible signal types never interfere with routing decisions. For example, an audio-only cable will never be selected when routing video, preventing misconfiguration errors.

---

### Definitions

#### Ports

Ports are logical representations of the input and output ports on a device.

#### Source

A source is a device at the beginning of a signal chain. For example, a set-top box, or a camera. Source devices typically have only output ports.

Source devices in Essentials must implement `IRoutingOutputs` or `IRoutingSource`

#### Midpoint

A midpoint is a device in the middle of the signal chain. Typically a switcher, matrix or otherwise. Examples: DM chassis; DM-TX; DM-RMC; A video codec. These devices will have input and output ports.

Midpoint devices must implement `IRoutingInputsOutputs`. Midpoints with switching must implement `IRouting`.

#### Sink

A sink is a device at the end of a full signal path. For example, a display, amplifier, encoder, etc. Sinks typically contain only input ports. They may or may not have switching, like a display with several inputs. Classes defining sink devices must implement `IRoutingSinkNoSwitching` or `IRoutingSinkWithSwitching`.

#### Tie-line

A tie-line is a logical representation of a physical cable connection between two devices. It has five properties that define how the tie-line connects two devices.

##### How Tie Line Types Are Determined

The effective type of a tie line is determined by one of two methods:

1. **Automatic (Recommended)**: When no `type` property is specified in configuration, the tie line's type is automatically calculated as the **intersection** of signal types supported by both the source and destination ports. This ensures only compatible signals are considered for routing.

   Example: If a source port supports `AudioVideo` and the destination port supports `Audio`, the tie line will have type `Audio` (the only common type).

2. **Manual Override**: When the `type` property is explicitly set, it overrides the automatic calculation. This is useful when the physical cable supports fewer signal types than both ports are capable of.

   Example: Both ports support `AudioVideo`, but the cable only carries audio, so you set `"type": "audio"`.

##### Validation

At startup, tie line configurations are validated to ensure:
- Both ports exist on their respective devices
- The source and destination ports have at least one common signal type
- If a `type` override is specified, both ports must support that signal type

Invalid tie lines will fail to build with descriptive error messages, preventing runtime routing issues.

##### Signal Types

Tie lines support the following signal types:

- `audio` - Audio-only signals
- `video` - Video-only signals
- `audioVideo` - Combined audio and video (automatically split during routing)
- `secondaryAudio` - Secondary audio channel (e.g., program audio separate from microphone audio)
- `usbInput` - USB input signals
- `usbOutput` - USB output signals

The `type` property determines which signals can travel through the tie line. During route discovery, only tie lines matching the requested signal type will be considered as valid paths.

**Note**: In most cases, you should omit the `type` property and let the system automatically calculate it from the port capabilities. Only use it when you need to restrict the tie line to fewer signal types than the ports support or when needed for clarity.

##### Configuration Examples

**Example 1: Automatic type calculation (recommended)**

Connecting an HDMI cable between devices that both support audio and video. The `type` property is omitted, so the tie line will automatically support `AudioVideo`:

```json
{
  "sourceKey": "ciscoSparkPlusCodec-1",
  "sourcePort": "HdmiOut1",
  "destinationKey": "display-1",
  "destinationPort": "HdmiIn1"
}
```

**Example 2: Type override for cable limitations**

Both devices support `AudioVideo`, but the physical cable only carries audio. The `type` property restricts routing to audio only:

```json
{
  "sourceKey": "dmSwitcher-1",
  "sourcePort": "audioVideoOut1",
  "destinationKey": "amplifier-1",
  "destinationPort": "audioVideoIn1",
  "type": "audio"
}
```

**Example 3: Mismatched port types (automatically handled)**

Source only supports audio, destination supports both. No `type` needed—the tie line will automatically be `Audio`:

```json
{
  "sourceKey": "audioProcessor-1",
  "sourcePort": "audioOut1",
  "destinationKey": "dmSwitcher-1",
  "destinationPort": "audioVideoIn1"
}
```

**Invalid Example: Incompatible types**

This configuration will **fail validation** at startup because the ports have no common signal types:

```json
{
  "sourceKey": "audioProcessor-1",
  "sourcePort": "audioOut1",
  "destinationKey": "display-1",
  "destinationPort": "hdmiIn1",
  "type": "video"
}
```
Error: `"Override type 'Video' is not supported by source port 'audioOut1' (type: Audio)"`

### Interfaces

Todo: Define Interfaces IRouting, IRoutingOutputs, IRoutingInputs


================================================
FILE: docs/docs/technical-docs/Debugging.md
================================================
# Methods of Debugging

1. You can use Visual Studio step debugging
   - Pros:
     - Detailed real time debugging into with breakpoints and object inspection
   - Cons:
     - Doesn't really work remotely
     - On processors with Control Subnet, you must be connected to the CS interface to use step debugging. Often not practical or possible.
     - No logging
     - Using breakpoints stops the program and can interrupt system usage
     - Requires the running application to be built in debug mode, not release mode
2. You can use the Debug class features build into the PepperDash.Core library.
   - Pros:
     - Can be easily enabled from console
     - Allows for setting the level of verbosity
     - Works when troubleshooting remotely and doesn't require a connection to the CS interface of the processor.
     - Allows for logging to the Crestron error log or a custom log stored on removable media
     - Works regardless of build type setting (debug/release)
     - Can easily identify which class instance is generating console messages
     - Can use console commands to view the state of public properties on devices
     - Can use console commands to call methods on devices
     - Doesn't stop the program
   - Cons:
     - No detailed object inspection in real time
     - Only prints console statements already in code
     - When enabled at the highest level of verbosity, it can produce a significant amount of data in console. Can be hard to find messages easily.
     - No current mechanism to filter messages by device. (can be filtered by 3rd party tools easily, though)
     - Not very effective in debugging applications running on the VC-4 platform as only log messages get printed to the Syslog

## How to use the PepperDash.Core Debug Class

The majority of interaction is done via console, preferably via an SSH session through Crestron Toolbox, PuTTy or any other suitable application.

In code, the most useful method is `Debug.Console()` which has several overloads. All variations take an integer value for the level (0-2) as the first argument. Level 0 will ALWAYS print. Level 1 is for typical debug messages and level 2 is for verbose debugging. In cases where the overloads that accept a `Debug.ErrorLogLevel` parameter are used, the message will ALWAYS be logged, but will only print to console if the current debug level is the same or higher than the level set in the `Debug.Console()` statement.

All statements printed to console are prefixed by a timestamp which can be greatly helpful in debugging order of operations.

```cs
// The most basic use, sets the level (0) and the message to print.
Debug.Console(0, "Hello World");
// prints: [timestamp]App 1:Hello World

// The string parameter has a built in string.Format() that takes params object[] items
string world = "World";
Debug.Console(0, "Hello {0}", world);
// prints: [timestamp]App 1:Hello World

// This overload takes an IKeyed as the second parameter and the resulting statement will
// print the Key of the device in console to help identify the class instance the message
// originated from
Debug.Console(0, this, "Hello World");
// prints: [timestamp]App 1:[deviceKey]Hello World

// Each of the above overloads has a corresponding variant that takes an argument to indicate
// the level of error to log the message at as well as printing to console
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Hello World");
// prints: [timestamp]App 1:Hello World
```

## Console Commands

### General Console Commands

Below are is a non-exhaustive list of some of the Essentials specific console commands that allow interaction with the application at runtime.

### `help user`

Will print the available console commands for each program slot.  Console commands can be added and removed dynamically by Essentials and may vary by the version of Essentials that is running.  This is the best place to start to determine the available commands registered for each instance of Essentials running on a processor.

### `reportversions:[slot]`

Will print the running versions of all .dll libraries.  Useful for determining the exact build version of the Essentials application and all plugins

### `gettypes:[slot] [searchString(optional)]`

The `searchString` value is an optional parameter to filter the results.

Will print all of the valid `type` values registered in the `DeviceFactory` for the running Essentials application.  This helps when generating config structure and defining devices.  Device types added by plugins will also be shown.

### `showconfig:[slot]`

Will print out the merged config object

### `donotloadonnextboot:[slot] [true/false]`

When the value is set to true, Essentials will pause when starting up, to allow for a developer to attach to the running process from an IDE for purposes of step debugging.  Once attached, issuing the command `go:[slot]` will cause the configuration file to be read and the program to initialize.  This value gets set to false when the `go` command is issues.

### DeviceManager Console Commands

The following console commands all perform actions on devices that have been registered with the `PepperDash.Essentials.Core.DeviceManager` static class

### `Appdebug:[slot][0-2]`

Gets or sets the current debug level where 0 is the lowest setting and 2 is the most verbose

### `getjoinmap:[slot] [bridgeKey][deviceKey (optional)]

For use with SIMPL Bridging.  Prints the join map for the specified bridge.  If a device key is specified, only the joins for that device will be printed.

Example:

```sh
RMC3>appdebug:1 // Gets current level
RMC3>AppDebug level = 0

RMC3>appdebug:1 1 // Sets level to 1 (all messages level 1 or lower will print)
RMC3>[Application 1], Debug level set to 1
```

### `Devlist:[slot]`

Gets the current list of devices from `DeviceManager`

Prints in the form [deviceKey] deviceName

Example:

```sh
// Get the list of devices for program 1
RMC3>devlist:1

RMC3>[16:34:05.819]App 1:28 Devices registered with Device Mangager:
[16:34:05.834]App 1:  [cec-1] Tx 5 cec 1
[16:34:05.835]App 1:  [cec-1-cec]
[16:34:05.835]App 1:  [cec-5] Rmc 1 cec 1
[16:34:05.836]App 1:  [cec-5-cec]
[16:34:05.836]App 1:  [cec-6] Dm Chassis In 1 cec 1
[16:34:05.837]App 1:  [cec-6-cec]
[16:34:05.837]App 1:  [cec-7] Dm Chassis Out 1 cec 1
[16:34:05.838]App 1:  [cec-7-cec]
[16:34:05.838]App 1:  [comm-1] Generic comm 1
[16:34:05.838]App 1:  [comm-1-com]
[16:34:05.839]App 1:  [comm-2] Rmc comm 1
[16:34:05.839]App 1:  [comm-2-com]
[16:34:05.840]App 1:  [comm-3] Rmc comm 2
[16:34:05.840]App 1:  [comm-3-com]
[16:34:05.841]App 1:  [dmMd8x8-1] DM-MD8x8 Chassis 1
[16:34:05.842]App 1:  [dmRmc100C-1] DM-RMC-100-C Out 3
[16:34:05.843]App 1:  [dmRmc200C-1] DM-RMC-200-C Out 2
[16:34:05.843]App 1:  [dmRmc4kScalerC-1] DM-RMC-4K-SCALER-C Out 1
[16:34:05.844]App 1:  [dmTx201C-1] DM-TX-201C 1
[16:34:05.845]App 1:  [eisc-1A]
[16:34:05.845]App 1:  [gls-odt-1] GLS-ODT-CN 1
[16:34:05.846]App 1:  [gls-oir-1] GLS-OIR-CN 1
[16:34:05.846]App 1:  [processor]
[16:34:05.847]App 1:  [ssh-1] Generic SSH 1
[16:34:05.847]App 1:  [ssh-1-ssh]
[16:34:05.848]App 1:  [systemMonitor]
[16:34:05.848]App 1:  [tcp-1] Generic TCP 1
[16:34:05.849]App 1:  [tcp-1-tcp]
```
### `Setdevicestreamdebug:[slot][devicekey][both/rx/tx/off]`

Enables debug for communication on a single device

Example:

```sh
PRO3>setdevicestreamdebug:1 lights-1-com both

[13:13:57.000]App 1:[lights-1-com] Sending 4 characters of text: 'test'

PRO3>setdevicestreamdebug:1 lights-1-com off
```

### `Devprops:[slot][devicekey]`

Gets the list of public properties on the device with the corresponding `deviceKey`

Example:

```sh
// Get the properties on the device with Key 'cec-1-cec'
// This device happens to be a CEC port on a DM-TX-201-C's HDMI input
RMC3>devprops:1 cec-1-cec
[
  {
    "Name": "IsConnected",
    "Type": "Boolean",
    "Value": "True",
    "CanRead": true,
    "CanWrite": false
  },
  {
    "Name": "Key",
    "Type": "String",
    "Value": "cec-1-cec",
    "CanRead": true,
    "CanWrite": true
  },
  {
    "Name": "Name",
    "Type": "String",
    "Value": "",
    "CanRead": true,
    "CanWrite": true
  },
  {
    "Name": "Enabled",
    "Type": "Boolean",
    "Value": "False",
    "CanRead": true,
    "CanWrite": true
  }
]

RMC3>

```

### `Devmethods:[slot][devicekey]`

Gets the list of public methods available on the device

Example:

```sh
// Get the methods on the device with Key 'cec-1-cec'
RMC3>devmethods:1 cec-1-cec
[
  {
    "Name": "SendText",
    "Params": [
      {
        "Name": "text",
        "Type": "String"
      }
    ]
  },
  {
    "Name": "SendBytes",
    "Params": [
      {
        "Name": "bytes",
        "Type": "Byte[]"
      }
    ]
  },
  {
    "Name": "SimulateReceive",
    "Params": [
      {
        "Name": "s",
        "Type": "String"
      }
    ]
  },
  //... Response abbreviated for clarity ...
]

RMC3>
```

### `Devjson:[slot][json formatted object {"devicekey", "methodname", "params"}]`

Used in conjunction with devmethods, this command allows any of the public methods to be called from console and the appropriate arguments can be passed in to the method via a JSON object.

This command is most useful for testing without access to hardware as it allows both simulated input and output for a device.

Example:

```sh
// This command will call the SendText(string text) method on the
// device with the Key 'cec-1-cec' and pass in "hello world" as the
// argument parameter.  On this particular device, it would cause
// the string to be sent via the CEC Transmit
RMC3>devjson:1 {"deviceKey":"cec-1-cec", "methodName":"SendText", "params": ["hello world\r"]}

// This command will call SimulateReceive(string text) on the device with Key 'cec-1-cec'
// This would simulate receiving data on the CEC port of the DM-TX-201-C's HDMI input
RMC3>devjson:1 {"deviceKey":"cec-1-cec", "methodName":"SimulateReceive", "params": ["hello citizen of Earth\r"]}
```

For additional examples, see this [file](https://github.com/PepperDash/Essentials/blob/main/devjson%20commands.json).


================================================
FILE: docs/docs/technical-docs/Feedback-Classes.md
================================================
# Feedback classes

***
* [YouTube Video - Using Feedbacks in PepperDash Essentials](https://youtu.be/5GQVRKbD9Rk)
***

The various Feedback classes are like "signals". They can enable various events, and are designed to be used where we need small data events to be sent without requiring custom handlers.

## Why Feedbacks?

We have been writing "code" in an environment, Simpl, for years and have taken for granted the power that signals in that environment give us. With the release of the ability to develop in C#, we have been handed a massive set of tools to potentially make our lives better, but because of the age and limited scope of the .NET 3.5 Compact Framework, many of the things that have been very easy to do in the past have become challenging or bulky to write. Crestron classes have things called "Sigs", which are a less-functional version of the signal that we used in Simpl, but we have no ability to use our own Sigs around our own classes. This forces us to break out of the constraints and mindset of Simpl programming, but simultaneously keeps us partially bound to the "old way" of doing things.

Signals as we have known them since Simpl came around are great. They allow a certain type of functional programming to be built, where things operate in solutions, and we are given a whole set of behaviors that we don't really have to think about: Something goes high, the next thing responds, something else happens, etc. With our older C# framework, it is most straightforward (and least-flexible) to take Sig transitions and handle them using very-flat and bulky coding techniques: Switch/case blocks, if/else blocks, slow dictionaries... In the Essentials environment (and in many other frameworks) these methods quickly reveal their flaws.

Enter the Feedback. We want to define simple events that can be attached to various things - TP Sigs, EISC, event handlers - and maintain their own state. This simplifies the interface to various device classes, and allows us to define functional, simple classes with well-defined means of connecting them together.

### Feedbacks are similar to signals

Feedbacks can:

- Fire an event (OutputChange)
- Be linked to one or more matching Crestron Sigs and update those Sigs
- May contain complex computations to define the output value
- Be put into test mode and have their value function overridden

A Feedback is defined on a class using a C# construct called a `Func`. A `Func` is a small operation that returns a single value and is typically written in a lambda. The operation/expression in the `Func` is calculated when FireUpdate() is called on the Feedback. The result is then available for all objects listening to this Feedback.

[Func documentation (MSDN)](<https://msdn.microsoft.com/en-us/library/bb534960(v=vs.110).aspx>)

#### Creating Feedbacks

The following `IntFeedback` returns the value of the `_VolumeLevel` field in this display class:

```cs
public class MyDisplay
{
    public IntFeedback VolumeLevelFeedback { get; private set; }

...

    public MyDisplay(...)
    {
        VolumeLevelFeedback = new IntFeedback(() => { return _VolumeLevel; });

        ...
```

This BoolFeedback, adapted from the DmTx201Controller class, defines the `Func` first, and then creates the BoolFeedback using that `Func`. The value returned is true if the input is the digital-HDMI connection, and the TX hardware's VideoAttributes.HdcpActiveFeedback is true as well.

```cs
public class MyTx
{
    public BoolFeedback HdcpActiveFeedback { get; private set; }

    Func HdcpActiveFeedbackFunc = () =>
        ActualVideoInput == DmTx200Base.eSourceSelection.Digital
        && tx.HdmiInput.VideoAttributes.HdcpActiveFeedback.BoolValue,

...

    public MyTx(...)
    {
        HdcpActiveFeedback = new BoolFeedback(HdcpActiveFeedbackFunc);

        ...
```

#### Triggering Feedback

In your classes, when you need to update the objects listening to a Feedback, you will call MyFeedback.FireUpdate() inside your class. This will trigger the evaluation of the Func value, update any linked Sigs, and fire the OutputChange event.

```cs
int _VolumeLevel;

void ComDataChanged(string data) // volume=77
{
    if(data.StartsWith("volume="))
    {
        _VolumeLevel = MyParseVolumeMethod(data); // get the level, 77
        VolumeLevelFeedback.FireUpdate(); // all listeners updated

```

#### Using Feedbacks

Feedbacks of the various types have BoolValue, IntValue, UShortValue, and StringValue properties that return the current value of the Feedback.

```cs
if (MyTxDevice.HdcpActiveFeedback.BoolValue)
{
    ... do something that needs to happen when HDCP is active ...
```

Feedbacks all share an OutputChange event, that fires an event with an empty EventArgs object. The event handler can go get the appropriate \*Value property when the event fires. The example below is a bit contrived, but explains the idea.

```cs
    ...
    MyDisplayDevice.VolumeLevelFeedback.OutputChange += MyDisplayVolumeHandler;

    ...
}

void MyDisplayVolumeHandler(object o, EventArgs a)
{
    MobileControlServer.VolumeLevel = MyDisplayDevice.VolumeLevelFeedback.IntValue;
```

Feedbacks also have a LinkInputSig(\*InputSig sig) method that can directly trigger one or more Sigs on a Crestron device, without requiring an event handler. This is very useful for attaching states of our devices to Crestron touchpanels or EISCs, for example. The BoolFeedback class also has a LinkComplementInputSig(BoolInputSig sig) method that will invert the BoolFeedback's value to one or more attached Sigs.

As well as updating upon change, the Feedback will set the Sig's value to the Feedback value upon calling the LinkInputSig method. This eliminates the need to walk through an object, property-by-property, and update several Sig values - as well as setting up to watch those values for changes. It is all handled in one step.

```cs
public class MyClass
{
    Tsw760 MyTp;

    MyDisplay Display;

    HookUpSigsMethod()
    {
        ...

        // changes to VolumeLevelFeedback will automatically propagate to UShortInputSig 123
        // changes to HdcpActiveFeedback will propagate to BoolInputSig 456
        // and these two panel Sigs are updated immediately as well.
        Display.VolumeLevelFeedback.LinkInputSig(MyTp.UshortInput[123]);
        MyHdcpDevice.HdcpActiveFeedback.LinkInputSig(MyTp.BoolInput[456]);
```


================================================
FILE: docs/docs/technical-docs/Glossary-of-Terms.md
================================================
# Glossary of Terms

**Assembly**
 An assembly is a file that is automatically generated by the compiler upon successful compilation of every . NET application. It can be either a Dynamic Link Library or an executable file. It is generated only once for an application and upon each subsequent compilation the assembly gets updated.

**Device**
A base class, defined in the PepperDash.Core library (`PepperDash.Core.Device`).  It can represent a physical device, or a virtual device or behaviour.  Generally, most new classes defined in the Essentials ecosystem should derive from Device.

**DeviceManager**
A static class (`PepperDash.Core.Essentials.DeviceManager`) that contains an unordered collection of Devices.  Devices are added/registered to the DeviceManager and later can be retrieved as references by Key.

**Essentials Application**
A Crestron SIMPL# Pro application that is made up of the Essentials Framework and any optionally any number of Essentials Plugins

**Essentials Framework**
The collection of core libraries that make up the framework

**Essentials Plugins**
SIMPL# Pro libraries that reference the Essentials Framework and are loaded at runtime to add or extend functionality

**IKeyed**
An important interface defined in PepperDash.Core that requires a string property named Key, whose value must be unique.

**PepperDash.Core**
A SIMPL# utility library referenced by Essentials Framework.


================================================
FILE: docs/docs/technical-docs/Plugins.md
================================================
# What are Essentials Plugins?

**Note : this entry updates a deprecated method - for information related to that deprecated method, see [Plugins - Deprecated](~/docs/Plugins-Deprecated.md)**

***
* [YouTube Video - Loading Plugins in PepperDash Essentials](https://youtu.be/NA64iyNNAgE)
* [YouTube Video - Build Your Own Plugin, Part 1](https://youtu.be/m2phC8g3Kfk)
* [YouTube Video - Build Your Own Plugin, Part 2](https://youtu.be/2_PrWRk6Gy0)
***

Plugins are SIMPL# Pro libraries that reference the Essentials Framework and can be loaded into an Essentials Application at runtime to extend functionality beyond what the Essentials Framework provides on its own.

## Why Use Plugins?

Plugins are a way to extend or add new functionality to the Essentials Application without having to modify the actual Framework. In most cases, a plugin can be written to support a new device or behavior. Using plugins also limits the scope of understanding needed to work within the Essentials Framework.

## Should I use a Plugin?

Essentials is meant to be a lightweight framework and an extensible basis for development. While some devices are included in the framework, mostly for the purposes of providing examples and developing and prototyping new device types, the bulk of new development is intended to take place in Plugins. Once a plugin adds new functionality that may be of benefit if shared across multiple plugins, it may make sense to port that common logic (base classes and/or interfaces) back into the framework to make it available to others. The thrust of future Essentials development is targeted towards building a library of plugins.

## How do Plugins Work?

One or more plugins can be loaded to the /user/ProgramX/plugins as .dlls or .cplz packages. When the Essentials Application starts, it looks for any .cplz files, unzips them and then iterates any .dll assemblies in that folder and loads them. Once the plugin assemblies are loaded the Essentials Application will then attempt to load a configuration file and construct items as defined in the file. Those items can be defined in either the Essentials Framework or in any of the loaded plugin assemblies.

![Architecture drawing](~/docs/images/Plugin%20Load%20Sequence.png)

## What Must be Implemented in a Plugin for it to Work?

All plugin assemblies must contain a class which inherits from ```EssentialsPluginDeviceFactory<T>```, where ```<T>``` is a class which inherits from ```PepperDash.Essentials.Core.EssentialsDevice```

Within this class, we will define some metadata for the plugin and define which constructor to use
for instantiating each class as defined by type.

Note that multiple types can be loaded from the same plugin.

```cs
using System;
using Crestron.SimplSharp;
using Crestron.SimplSharpPro;
using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Config;
using PepperDash.Core;
using System.Collections.Generic;

namespace MyPlugin
{
    public class SomeDeviceFactory : EssentialsPluginDeviceFactory<SomeDevice>
    {
        // This method defines metadata for the devices in the plugin
        public SomeDeviceFactory()
        {
            // This string is used to define the minimum version of the
            // Essentials Framework required for this plugin
            MinimumEssentialsFrameworkVersion = "1.5.0";

            // This string is used to define all valid type names for
            // this plugin.  This string is case insensitive
            TypeNames = new List<string> { "SomeDevice" , "ThisNewDevice" };
        }

        // This method instantiates new devices for the defined type
        // within the plugin
        public override EssentialsDevice BuildDevice(DeviceConfig dc)
        {
            // Deserialize the json properties for the loaded type to a new object
            var props = dc.Properties.ToObject<SomeDeviceProperties>();

            // Return a newly instantiated device using the desired constructor
            // If no valid property data exists, return null with console print
            // describing the failure.
            if (props == null)
            {
                Debug.Console(0, "No valid property data for 'SomeDevice' - Verify Configuration.");
                Debug.Console(0, dc.Properties.ToString());
                return null;
            }
            return new SomeDevice(dc.Key, dc.Name, props);
        }
    }

    public class OtherDeviceFactory : EssentialsPluginDeviceFactory<OtherDevice>
    {
        // This method defines metadata for the devices in the plugin
        public OtherDeviceFactory()
        {
            // This string is used to define the minimum version of the
            // Essentials Framework required for this plugin
            MinimumEssentialsFrameworkVersion = "1.5.0";

            // This string is used to define all valid type names for
            // this plugin.  This string is case insensitive
            TypeNames = new List<string> { "OtherDevice", "ThisOtherDevice" };
        }

        // This method instantiates new devices for the defined type
        // within the plugin
        public override EssentialsDevice BuildDevice(DeviceConfig dc)
        {
            // Deserialize the json properties for the loaded type to a new object
            var props = dc.Properties.ToObject<OtherDeviceProperties>();

            // Return a newly instantiated device using the desired constructor
            // If no valid property data exists, return null with console print
            // describing the failure.
            if (props == null)
            {
                Debug.Console(0, "No valid property data for 'OtherDevice' - Verify Configuration.");
                Debug.Console(0, dc.Properties.ToString());
                return null;
            }
            return new OtherDevice(dc.Key, dc.Name, props);
        }
    }
}
```

## SIMPL Bridging

Optionally, if your plugin device needs to be able to bridge to a SIMPL program over EISC, and there isn't already an existing bridge class in the Essentials Framework, you can write a new bridge class in your plugin. However, in order for the Essentials Application to be able to us that new bridge, the bridge must implement the ```IBridgeAdvanced``` interface with the required ```LinkToApi()``` Extension method.

If you are writing code for a bridgeable device, you should be inheriting from ```EssentialsBridgeableDevice```, which inherits from the already-required ```EssentialsDevice``` and implements ```IBridgeAdvanced```.

Often though, you may find that a bridge class already exists in the Essentials Framework that you can leverage. For example, if you were writing a plugin to support a new display model that isn't already in the Essentials Framework, you would define a class in your plugin that inherits from PepperDash.Essentials.Core.DisplayBase. If you're only implementing the standard display control functions such as power/input/volume control, then the existing bridge class `DisplayControllerBridge` can be used. If you needed to add additional functions to the bridge, then you would need to write your own bridge in the plugin.

For additional info see the [SIMPL-Bridging article](~/docs/SIMPL-Bridging.md).

## Template Essentials Plugin Repository

Fork this repository when starting a new plugin. The template repository uses the essentials-builds repository as a submodule. This allows the plugin to reference a specific build version of Essentials. You must make sure that you checkout the correct build of the Essentials-Builds repo that contains any dependencies that your plugin may rely on.

[Essentials Plugin Template Repository](https://github.com/PepperDash/EssentialsPluginTemplate)


================================================
FILE: docs/docs/technical-docs/Supported-Devices.md
================================================
# Essentials Framework Devices by Type

## Cameras

* VISCA protocol
* Cisco (via codec)
* Zoom (via Zoom Room)

## Disc Player

* Any IR disc player that implements standard RAD commands

## Displays

* Any IR display that implements standard RAD commands
* Samsung MDC protocol (commercial)
* NEC Professional series flat panel
* Avocor VTF
* Panasonic TH series flat panels
* Panasonic Projectors [(via plugin)](https://github.com/PepperDash/epi-display-panasonic-projectors)
* LG Commercial series [(via plugin)](https://github.com/PepperDash/epi-display-lg)
* Generic CEC control via HDMI [(via plugin)](https://github.com/PepperDash/epi-generic-cec-display)
* Crestron Certified Driver Display [(via plugin)](https://github.com/batourin/epi-display-ccd)

## Lighting/Shading

* Lutron Quantum
* Somfy Shades (relay control)

## Power Controllers

* Digital Logger

## Set Top Boxes

* Any IR set top box that implements standard RAD commands

## Streaming Players

* AppleTV (IR)
* Roku (IR)

## Video Codecs

* Cisco CE series (C/SX/RoomKit)
* Zoom Room

## DSPs / Audio Codecs

* BiAmp Tesira [(via plugin](https://github.com/PepperDash/epi-dsp-tesira)

## Crestron Devices

* AM-200/300 Airmedia
* All DM Chassis (8x8 * 128x128)
* All DM input/output cards
* All DMPS Processors
* All DM Transmitter models (with COM/IR/Relay/CEC port access)
* All DM Receiver models (with COM/IR/Relay/CEC port access)
* DGE-100
* DM-DGE-200-C
* DIN-8SW8
* CEN-IO-DIGIN-104
* CEN-RFGWEX/GWEXER
* GLS-ODT/OIR-C-CN Occupancy Sensors
* TSW-XXX series touchpanels
* XPanel for SmartGraphics
* Fusion Room and Assets


================================================
FILE: docs/docs/toc.yml
================================================
- name: Get Started With Essentials
- href: ../index.md
- href: Get-started.md 
- name: How-to's
  items:
  - name: How to add an article or doc page
    href: how-to/how-to-add-docs.md
- name: Usage
  items:
  - href: usage/Standalone-Use.md    
  - href: usage/SIMPL-Bridging-Updated.md
    items:
    - name: Join Maps
      href: usage/JoinMaps.md
    - name: Bridging to Hardware Resources
      href: usage/Bridging-To-Hardware-Resources.md
      items:
      - name: GenericComm Bridging
        href: usage/GenericComm.md
      - name: RelayOutput Bridging
        href: usage/RelayOutput.md
      - name: Digital Input Bridging
        href: usage/DigitalInput.md
      - name: IR Driver Bridging
        href: usage/IR-Driver-Bridging.md
- name: Technical documentation
  items:    
    - href: technical-docs/Arch-summary.md
    - name: Devices and DeviceManager
      href: technical-docs/Arch-1.md
    - name: Configurable lifecycle
      href: technical-docs/Arch-lifecycle.md
    - name: Activation phases
      href: technical-docs/Arch-activate.md
    - name: More
      href: technical-docs/Arch-topics.md
    - name: Plugins
      href: technical-docs/Plugins.md
    - name: Communication Basics
      href: technical-docs/Communication-Basics.md
    - name: Debugging
      href: technical-docs/Debugging.md
    - name: Feedback Classes
      href: technical-docs/Feedback-Classes.md
    - name: Connection Based Routing
      href: technical-docs/Connection-Based-Routing.md
    - name: Configuration Structure
      href: technical-docs/ConfigurationStructure.md
    - name: Supported Devices
      href: technical-docs/Supported-Devices.md
    - name: Glossary of Terms
      href: technical-docs/Glossary-of-Terms.md

================================================
FILE: docs/docs/usage/Bridging-To-Hardware-Resources.md
================================================
# Bridging to Hardware and Network Resources

One of the most powerful features of Essentials is the ability to bridge SIMPL to and hardware resource to any piece of equipment instantiated inside of essentials.  You can bridge directly to a comport on the processor just as easily as you can to the comport of an instantiated DM device.  A simple change in the connection location of a display can be made with just a few keystrokes.  This isn't restricted to comports either.  Devices and direct connections can be linked to Digital Inputs, IR Ports, Relays, Comports, SSH, TCP/IP, UDP, and Cresnet resources.

## Examples

Follow the links below for examples of bridging to hardware and network resources.

**[GenericComm Bridging](~/docs/usage/GenericComm.md)**

**[RelayOutput Bridging](~/docs/usage/RelayOutput.md)**

**[Digital Input Bridging](~/docs/usage/DigitalInput.md)**

**[Card Frame Bridging](~/docs/CardFrame.md)**


================================================
FILE: docs/docs/usage/DigitalInput.md
================================================
# DigitalInput

Digital Inputs can be bridged directly to SIMPL from any device that is both inlcuded within essentials and has a relay.

Consider the following example.

```JSON
{
    "template": {
        "roomInfo": [
            {}
        ],
        "devices": [
            {
 
Download .txt
gitextract_fb__7fh1/

├── .config/
│   └── dotnet-tools.json
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feature_request.md
│   │   └── rfi_request.md
│   ├── scripts/
│   │   ├── GenerateVersionNumber-2.0.0.ps1
│   │   ├── GenerateVersionNumber.ps1
│   │   ├── UpdateAssemblyVersion.ps1
│   │   └── ZipBuildOutput.ps1
│   └── workflows/
│       ├── EssentialsPlugins-builds-4-series-caller.yml
│       └── publish-docs.yml
├── .gitignore
├── .gitmodules
├── .releaserc.json
├── .vscode/
│   └── extensions.json
├── CONTRIBUTING.md
├── Crestron-Library-Usage-Analysis.md
├── IR Drivers/
│   ├── Apple_AppleTV_4th_Gen_Essentials.ir
│   ├── Cisco Explorer 4642HDC.ir
│   ├── Comcast Motorola DVR.ir
│   ├── Comcast X1.ir
│   ├── DirecTV H21.ir
│   ├── EXPLORER 8200HD Full Set Pulsed.ir
│   ├── Etisalat Cable Box.ir
│   ├── Etisalat e-Vision.ir
│   ├── Panasonic DMP-BD70.ir
│   ├── Sony BDP Series.ir
│   └── samsung_un_series.ir
├── LICENSE.md
├── PepperDash.Essentials.4Series.sln
├── README.md
├── Sample Presets/
│   └── SampleDirecTV.json
├── docs/
│   ├── docfx.json
│   ├── docs/
│   │   ├── CardFrame.md
│   │   ├── Get-started.md
│   │   ├── Home.md
│   │   ├── Plugins-Deprecated.md
│   │   ├── SIMPL-Bridging-Deprecated.md
│   │   ├── SIMPL-Bridging.md
│   │   ├── getting-started.md
│   │   ├── how-to/
│   │   │   └── how-to-add-docs.md
│   │   ├── technical-docs/
│   │   │   ├── Arch-1.md
│   │   │   ├── Arch-activate.md
│   │   │   ├── Arch-lifecycle.md
│   │   │   ├── Arch-summary.md
│   │   │   ├── Arch-topics.md
│   │   │   ├── Communication-Basics.md
│   │   │   ├── ConfigurationStructure.md
│   │   │   ├── Connection-Based-Routing.md
│   │   │   ├── Debugging.md
│   │   │   ├── Feedback-Classes.md
│   │   │   ├── Glossary-of-Terms.md
│   │   │   ├── Plugins.md
│   │   │   └── Supported-Devices.md
│   │   ├── toc.yml
│   │   └── usage/
│   │       ├── Bridging-To-Hardware-Resources.md
│   │       ├── DigitalInput.md
│   │       ├── GenericComm.md
│   │       ├── IR-Driver-Bridging.md
│   │       ├── JoinMaps.md
│   │       ├── RelayOutput.md
│   │       ├── SIMPL-Bridging-Updated.md
│   │       └── Standalone-Use.md
│   ├── index.md
│   └── toc.yml
└── src/
    ├── Directory.Build.props
    ├── Directory.Build.targets
    ├── PepperDash.Core/
    │   ├── ComTextHelper.cs
    │   ├── Comm/
    │   │   ├── CommunicationGather.cs
    │   │   ├── CommunicationStreamDebugging.cs
    │   │   ├── ControlPropertiesConfig.cs
    │   │   ├── EventArgs.cs
    │   │   ├── GenericSecureTcpIpClient.cs
    │   │   ├── GenericSecureTcpIpClient_ForServer.cs
    │   │   ├── GenericSecureTcpIpServer.cs
    │   │   ├── GenericSshClient.cs
    │   │   ├── GenericTcpIpClient.cs
    │   │   ├── GenericTcpIpClient_ForServer.cs
    │   │   ├── GenericTcpIpServer.cs
    │   │   ├── GenericUdpClient.cs
    │   │   ├── GenericUdpServer.cs
    │   │   ├── StreamDebuggingExtensions.cs
    │   │   ├── TcpClientConfigObject.cs
    │   │   ├── TcpServerConfigObject.cs
    │   │   ├── eControlMethods.cs
    │   │   ├── eStreamDebuggingDataTypeSettings.cs
    │   │   └── eStreamDebuggingSetting.cs
    │   ├── CommunicationExtras.cs
    │   ├── Config/
    │   │   └── PortalConfigReader.cs
    │   ├── Conversion/
    │   │   └── Convert.cs
    │   ├── CoreInterfaces.cs
    │   ├── Device.cs
    │   ├── EthernetHelper.cs
    │   ├── EventArgs.cs
    │   ├── GenericRESTfulCommunications/
    │   │   ├── Constants.cs
    │   │   └── GenericRESTfulClient.cs
    │   ├── JsonStandardObjects/
    │   │   ├── EventArgs and Constants.cs
    │   │   ├── JsonToSimplDevice.cs
    │   │   └── JsonToSimplDeviceConfig.cs
    │   ├── JsonToSimpl/
    │   │   ├── Constants.cs
    │   │   ├── Global.cs
    │   │   ├── JsonToSimplArrayLookupChild.cs
    │   │   ├── JsonToSimplChildObjectBase.cs
    │   │   ├── JsonToSimplFileMaster.cs
    │   │   ├── JsonToSimplFixedPathObject.cs
    │   │   ├── JsonToSimplGenericMaster.cs
    │   │   ├── JsonToSimplMaster.cs
    │   │   └── JsonToSimplPortalFileMaster.cs
    │   ├── Logging/
    │   │   ├── CrestronEnricher.cs
    │   │   ├── Debug.cs
    │   │   ├── DebugConsoleSink.cs
    │   │   ├── DebugContext.cs
    │   │   ├── DebugCrestronLoggerSink.cs
    │   │   ├── DebugErrorLogSink.cs
    │   │   ├── DebugExtensions.cs
    │   │   ├── DebugMemory.cs
    │   │   └── DebugWebsocketSink.cs
    │   ├── Network/
    │   │   └── DiscoveryThings.cs
    │   ├── PasswordManagement/
    │   │   ├── Config.cs
    │   │   ├── Constants.cs
    │   │   ├── PasswordClient.cs
    │   │   └── PasswordManager.cs
    │   ├── PepperDash.Core.csproj
    │   ├── PepperDashCore.build/
    │   │   └── net472/
    │   │       ├── PepperDashCore.props
    │   │       └── PepperDashCore.targets
    │   ├── Properties/
    │   │   └── ControlSystem.cfg
    │   ├── SystemInfo/
    │   │   ├── EventArgs and Constants.cs
    │   │   ├── SystemInfoConfig.cs
    │   │   └── SystemInfoToSimpl.cs
    │   ├── Web/
    │   │   ├── BouncyCertificate.cs
    │   │   ├── RequestHandlers/
    │   │   │   ├── DefaultRequestHandler.cs
    │   │   │   ├── WebApiBaseRequestAsyncHandler.cs
    │   │   │   └── WebApiBaseRequestHandler.cs
    │   │   └── WebApiServer.cs
    │   ├── WebApi/
    │   │   └── Presets/
    │   │       ├── Preset.cs
    │   │       ├── User.cs
    │   │       └── WebApiPasscodeClient.cs
    │   └── XSigUtility/
    │       ├── Serialization/
    │       │   ├── IXSigSerialization.cs
    │       │   └── XSigSerializationException.cs
    │       ├── Tokens/
    │       │   ├── XSigAnalogToken.cs
    │       │   ├── XSigDigitalToken.cs
    │       │   ├── XSigSerialToken.cs
    │       │   ├── XSigToken.cs
    │       │   └── XSigTokenType.cs
    │       ├── XSigHelpers.cs
    │       ├── XSigTokenStreamReader.cs
    │       └── XSigTokenStreamWriter.cs
    ├── PepperDash.Essentials/
    │   ├── AssetLoader.cs
    │   ├── ClassDiagram1.cd
    │   ├── ControlSystem.cs
    │   ├── Example Configuration/
    │   │   ├── EssentialsHuddleSpaceRoom/
    │   │   │   └── configurationFile-HuddleSpace-2-Source.json
    │   │   ├── EssentialsHuddleVtc1Room/
    │   │   │   └── configurationFile-mockVideoCodec_din-ap3_-_dm4x1.json
    │   │   └── SIMPLBridging/
    │   │       ├── SIMPLBridgeExample_configurationFile.json
    │   │       └── configurationFile-dmps3300c-avRouting.json
    │   ├── Factory/
    │   │   └── DeviceFactory.cs
    │   ├── HttpLogoServer.cs
    │   ├── PepperDash.Essentials.csproj
    │   ├── Properties/
    │   │   ├── ControlSystem.cfg
    │   │   └── UpdateAssemblyVersion.ps1
    │   ├── SGD/
    │   │   ├── PepperDash Essentials TSW-560.sgd
    │   │   ├── PepperDash Essentials TSW-760.sgd
    │   │   └── PepperDash Essentials iPad.sgd
    │   └── app.config
    ├── PepperDash.Essentials.Core/
    │   ├── Bridges/
    │   │   ├── BridgeBase.cs
    │   │   ├── BridgeHelper.cs
    │   │   ├── IBridge.cs
    │   │   └── JoinMaps/
    │   │       ├── AirMediaControllerJoinMap.cs
    │   │       ├── AppleTvJoinMap.cs
    │   │       ├── C2nRthsControllerJoinMap.cs
    │   │       ├── CameraControllerJoinMap.cs
    │   │       ├── CenOdtOccupancySensorBaseJoinMap.cs
    │   │       ├── DisplayControllerJoinMap.cs
    │   │       ├── DmBladeChassisControllerJoinMap.cs
    │   │       ├── DmChassisControllerJoinMap.cs
    │   │       ├── DmRmcControllerJoinMap.cs
    │   │       ├── DmTxControllerJoinMap.cs
    │   │       ├── DmpsAudioOutputControllerJoinMap.cs
    │   │       ├── DmpsMicrophoneControllerJoinMap.cs
    │   │       ├── DmpsRoutingControllerJoinMap.cs
    │   │       ├── GenericIrControllerJoinMap.cs
    │   │       ├── GenericLightingJoinMap.cs
    │   │       ├── GenericRelayControllerJoinMap.cs
    │   │       ├── GlsOccupancySensorBaseJoinMap.cs
    │   │       ├── GlsPartitionSensorJoinMap.cs
    │   │       ├── HdMdNxM4kEControllerJoinMap.cs
    │   │       ├── HdMdxxxCEControllerJoinMap.cs
    │   │       ├── HdPsXxxControllerJoinMap.cs
    │   │       ├── Hrxxx0WirelessRemoteControllerJoinMap.cs
    │   │       ├── IAnalogInputJoinMap.cs
    │   │       ├── IBasicCommunicationJoinMap.cs
    │   │       ├── IDigitalInputJoinMap.cs
    │   │       ├── IDigitalOutputJoinMap.cs
    │   │       ├── IRBlurayBaseJoinMap.cs
    │   │       ├── PduJoinMapBase.cs
    │   │       ├── SetTopBoxControllerJoinMap.cs
    │   │       ├── StatusSignControllerJoinMap.cs
    │   │       ├── SystemMonitorJoinMap.cs
    │   │       └── VideoCodecControllerJoinMap.cs
    │   ├── Comm and IR/
    │   │   ├── CecPortController.cs
    │   │   ├── ComPortController.cs
    │   │   ├── ComSpecJsonConverter.cs
    │   │   ├── CommBridge.cs
    │   │   ├── CommFactory.cs
    │   │   ├── CommunicationExtras.cs
    │   │   ├── ConsoleCommMockDevice.cs
    │   │   ├── GenericComm.cs
    │   │   ├── GenericHttpClient.cs
    │   │   └── IRPortHelper.cs
    │   ├── Config/
    │   │   ├── AudioControlPointListItem.cs
    │   │   ├── BaseStreamingDeviceProperties.cs
    │   │   ├── BasicConfig.cs
    │   │   ├── ConfigPropertiesHelpers.cs
    │   │   ├── DeviceConfig.cs
    │   │   ├── Essentials/
    │   │   │   ├── ConfigReader.cs
    │   │   │   ├── ConfigUpdater.cs
    │   │   │   ├── ConfigWriter.cs
    │   │   │   └── EssentialsConfig.cs
    │   │   ├── ILoadConfig.cs
    │   │   ├── InfoConfig.cs
    │   │   └── SourceDevicePropertiesConfigBase.cs
    │   ├── Crestron/
    │   │   ├── CrestronGenericBaseDevice.cs
    │   │   └── CrestronGenericBaseDevice.cs.orig
    │   ├── CrestronIO/
    │   │   ├── GenericDigitalInputDevice.cs
    │   │   ├── GenericRelayDevice.cs
    │   │   ├── GenericVersiportAnalogInputDevice.cs
    │   │   ├── GenericVersiportInputDevice.cs
    │   │   ├── GenericVersiportOutputDevice.cs
    │   │   ├── IAnalogInput.cs
    │   │   ├── IDigitalInput.cs
    │   │   ├── IDigitalOutput.cs
    │   │   ├── IHasCresnetBranches.cs
    │   │   ├── IOPortConfig.cs
    │   │   └── ISwitchedOutput.cs
    │   ├── Device Info/
    │   │   ├── DeviceInfo.cs
    │   │   ├── DeviceInfoEventArgs.cs
    │   │   ├── IDeviceInfoProvider.cs
    │   │   └── NetworkDeviceHelpers.cs
    │   ├── DeviceControlsParentInterfaces/
    │   │   └── IPresentationSource.cs
    │   ├── DeviceTypeInterfaces/
    │   │   ├── IAudioZone.cs
    │   │   ├── IAudioZones.cs
    │   │   ├── IBasicVolumeControls.cs
    │   │   ├── IBasicVolumeWithFeedback.cs
    │   │   ├── IBasicVolumeWithFeedbackAdvanced.cs
    │   │   ├── IChannel.cs
    │   │   ├── IColorFunctions.cs
    │   │   ├── ICustomMobileControl.cs
    │   │   ├── IDPad.cs
    │   │   ├── IDiscPlayerControls.cs
    │   │   ├── IDisplay.cs
    │   │   ├── IDisplayBasic.cs
    │   │   ├── IDumbSource.cs
    │   │   ├── IDvr.cs
    │   │   ├── IEmergencyOSD.cs
    │   │   ├── IFullAudioSettings.cs
    │   │   ├── IHasBranding.cs
    │   │   ├── IHasCurrentVolumeControls.cs
    │   │   ├── IHasFarEndContentStatus.cs
    │   │   ├── IHasInputs.cs
    │   │   ├── IHasMuteControl.cs
    │   │   ├── IHasMuteControlWithFeedback.cs
    │   │   ├── IHasPhoneDialing.cs
    │   │   ├── IHasScreensWithLayouts.cs
    │   │   ├── IHasSurroundSoundModes.cs
    │   │   ├── IHasVolumeControl.cs
    │   │   ├── IHasVolumeControlWithFeedback.cs
    │   │   ├── IHasVolumeDevice.cs
    │   │   ├── IHasWebView.cs
    │   │   ├── IHumiditySensor.cs
    │   │   ├── ILanguageDefinition.cs
    │   │   ├── ILanguageProvider.cs
    │   │   ├── ILevelControls.cs
    │   │   ├── IMeterFeedback.cs
    │   │   ├── IMobileControl.cs
    │   │   ├── IMobileControlAction.cs
    │   │   ├── IMobileControlCrestronTouchpanelController.cs
    │   │   ├── IMobileControlMessage.cs
    │   │   ├── IMobileControlMessenger.cs
    │   │   ├── IMobileControlMessengerWithSubscriptions.cs
    │   │   ├── IMobileControlRoomMessenger.cs
    │   │   ├── IMobileControlTouchpanelController.cs
    │   │   ├── INumeric.cs
    │   │   ├── INvxNetworkPortInformation.cs
    │   │   ├── IPasswordPrompt.cs
    │   │   ├── IPower.cs
    │   │   ├── IProjectorScreenLiftControl.cs
    │   │   ├── ISelectableItem.cs
    │   │   ├── ISelectableItems.cs
    │   │   ├── ISetTopBoxControls.cs
    │   │   ├── IStateFeedback.cs
    │   │   ├── ITemperatureSensor.cs
    │   │   ├── ITransport.cs
    │   │   ├── ITvPresetsProvider.cs
    │   │   ├── IUiDisplayInfo.cs
    │   │   ├── IWarmingCooling.cs
    │   │   ├── LanguageLabel.cs
    │   │   ├── Template.cs
    │   │   └── eVolumeLevelUnits.cs
    │   ├── Devices/
    │   │   ├── AudioControlListItemBase.cs
    │   │   ├── AudioInterfaces.cs
    │   │   ├── CameraListItem.cs
    │   │   ├── CodecInterfaces.cs
    │   │   ├── ConfigSnippetAttribute.cs
    │   │   ├── CrestronProcessor.cs
    │   │   ├── DescriptionAttribute.cs
    │   │   ├── DestinationListItem.cs
    │   │   ├── DeviceApiBase.cs
    │   │   ├── DeviceFeedbackExtensions.cs
    │   │   ├── DeviceJsonApi.cs
    │   │   ├── DeviceManager.cs
    │   │   ├── DisplayUiConstants.cs
    │   │   ├── EssentialsBridgeableDevice.cs
    │   │   ├── EssentialsDevice.cs
    │   │   ├── EssentialsDeviceFactory.cs
    │   │   ├── EssentialsPluginDevelopmentDeviceFactory.cs
    │   │   ├── EssentialsPluginDeviceFactory.cs
    │   │   ├── GenericIRController.cs
    │   │   ├── GenericMonitoredTcpDevice.cs
    │   │   ├── IAttachVideoStatus.cs
    │   │   ├── IAttachVideoStatusExtensions.cs
    │   │   ├── IDisplayUsage.cs
    │   │   ├── IDspPresets.cs
    │   │   ├── IHasFeedbacks.cs
    │   │   ├── IMakeModel.cs
    │   │   ├── IOnline.cs
    │   │   ├── IProjectorInterfaces.cs
    │   │   ├── IReconfigurableDevice.cs
    │   │   ├── IUsageTracking.cs
    │   │   ├── IrOutputPortController.cs
    │   │   ├── LevelControlListItem.cs
    │   │   ├── PduInterfaces.cs
    │   │   ├── PowerInterfaces.cs
    │   │   ├── PresentationDeviceType.cs
    │   │   ├── PresetListItem.cs
    │   │   ├── ProcessorExtensionDeviceFactory.cs
    │   │   ├── ReconfigurableDevice.cs
    │   │   ├── SmartObjectBaseTypes.cs
    │   │   ├── SourceListItem.cs
    │   │   └── VolumeDeviceChangeEventArgs.cs
    │   ├── Ethernet/
    │   │   └── EthernetStatistics.cs
    │   ├── Extensions/
    │   │   ├── IpAddressExtensions.cs
    │   │   ├── JsonExtensions.cs
    │   │   └── StringExtensions.cs
    │   ├── Factory/
    │   │   ├── DeviceFactory.cs
    │   │   ├── DeviceFactoryWrapper.cs
    │   │   ├── IDeviceFactory.cs
    │   │   ├── IProcessorExtensionDeviceFactory.cs
    │   │   ├── ProcessorExtensionDeviceFactory.cs
    │   │   └── ReadyEventArgs.cs
    │   ├── Feedbacks/
    │   │   ├── BoolFeedback.cs
    │   │   ├── BoolFeedbackOneShot.cs
    │   │   ├── BoolFeedbackPulseExtender.cs
    │   │   ├── BoolOutputLogicals.cs
    │   │   ├── FeedbackBase.cs
    │   │   ├── FeedbackCollection.cs
    │   │   ├── FeedbackEventArgs.cs
    │   │   ├── IntFeedback.cs
    │   │   ├── SerialFeedback.cs
    │   │   └── StringFeedback.cs
    │   ├── File/
    │   │   └── FileIO.cs
    │   ├── Fusion/
    │   │   ├── EssentialsHuddleSpaceRoomFusionRoomJoinMap.cs
    │   │   ├── FusionCustomPropertiesBridge.cs
    │   │   ├── FusionEventHandlers.cs
    │   │   ├── FusionProcessorQueries.cs
    │   │   ├── FusionRviDataClasses.cs
    │   │   ├── IEssentialsRoomFusionController.cs
    │   │   ├── IEssentialsRoomFusionControllerFactory.cs
    │   │   ├── IEssentialsRoomFusionControllerPropertiesConfig.cs
    │   │   ├── IFusionHelpRequest.cs
    │   │   └── eFusionHelpResponse.cs
    │   ├── Global/
    │   │   ├── EthernetAdapterInfo.cs
    │   │   ├── Global.cs
    │   │   ├── JobTimer.cs
    │   │   └── Scheduler.cs
    │   ├── InUseTracking/
    │   │   ├── IInUseTracking.cs
    │   │   └── InUseTracking.cs
    │   ├── Interfaces/
    │   │   ├── ILogStrings.cs
    │   │   └── ILogStringsWithLevel.cs
    │   ├── JoinMaps/
    │   │   └── JoinMapBase.cs
    │   ├── License/
    │   │   └── EssentialsLicenseManager.cs
    │   ├── Lighting/
    │   │   ├── Lighting Interfaces.cs
    │   │   └── LightingScene.cs
    │   ├── Microphone Privacy/
    │   │   ├── MicrophonePrivacyController.cs
    │   │   └── MicrophonePrivacyControllerConfig.cs
    │   ├── Monitoring/
    │   │   ├── CrestronGenericBaseCommunicationMonitor.cs
    │   │   ├── GenericCommunicationMonitor.cs
    │   │   ├── Interfaces.cs
    │   │   ├── StatusMonitorBase.cs
    │   │   ├── StatusMonitorCollection.cs
    │   │   └── SystemMonitorController.cs
    │   ├── PartitionSensor/
    │   │   ├── EssentialsPartitionController.cs
    │   │   └── IPartitionStateProvider.cs
    │   ├── PepperDash.Essentials.Core.csproj
    │   ├── PepperDash_Essentials_Core.csproj.DotSettings
    │   ├── Plugins/
    │   │   ├── IPluginDeviceFactory.cs
    │   │   └── PluginLoader.cs
    │   ├── Presets/
    │   │   ├── DevicePresets.cs
    │   │   ├── DevicePresetsView.cs
    │   │   ├── Interfaces.cs
    │   │   ├── PresetBase.cs
    │   │   ├── PresetChannel.cs
    │   │   └── PresetsListSubpageReferenceListItem.cs
    │   ├── Properties/
    │   │   └── ControlSystem.cfg
    │   ├── Queues/
    │   │   ├── ComsMessage.cs
    │   │   ├── GenericQueue.cs
    │   │   ├── IQueue.cs
    │   │   ├── IQueueMessage.cs
    │   │   ├── ProcessStringMessage.cs
    │   │   └── StringResponseProcessor.cs
    │   ├── Ramps and Increments/
    │   │   ├── ActionIncrementer.cs
    │   │   ├── NumericalHelpers.cs
    │   │   └── UshortSigIncrementer.cs
    │   ├── Room/
    │   │   ├── Behaviours/
    │   │   │   └── RoomOnToDefaultSourceWhenOccupied.cs
    │   │   ├── Combining/
    │   │   │   ├── EssentialsRoomCombiner.cs
    │   │   │   ├── EssentialsRoomCombinerPropertiesConfig.cs
    │   │   │   ├── IEssentialsRoomCombiner.cs
    │   │   │   └── RoomCombinationScenario.cs
    │   │   ├── Config/
    │   │   │   ├── EssentialsDualDisplayRoomPropertiesConfig.cs
    │   │   │   ├── EssentialsHuddleRoomPropertiesConfig.cs
    │   │   │   ├── EssentialsHuddleVtc1PropertiesConfig.cs
    │   │   │   ├── EssentialsNDisplayRoomPropertiesConfig.cs
    │   │   │   ├── EssentialsPresentationPropertiesConfig.cs
    │   │   │   ├── EssentialsRoomConfig.cs
    │   │   │   ├── EssentialsRoomEmergencyConfig.cs
    │   │   │   ├── EssentialsRoomScheduledEventsConfig.cs
    │   │   │   ├── EssentialsTechRoomConfig.cs
    │   │   │   ├── EssentialsVolumeLevelConfig.cs
    │   │   │   └── SimplRoomPropertiesConfig.cs
    │   │   ├── EsentialsRoomEmergencyContactClosure.cs
    │   │   ├── EssentialsRoomBase.cs
    │   │   ├── IEssentialsRoom.cs
    │   │   ├── IRoomEventSchedule.cs
    │   │   ├── Interfaces.cs
    │   │   ├── Room.cs
    │   │   └── iOccupancyStatusProvider.cs
    │   ├── Routing/
    │   │   ├── DummyRoutingInputsDevice.cs
    │   │   ├── Extensions.cs
    │   │   ├── ICardPortsDevice.cs
    │   │   ├── ICurrentSources.cs
    │   │   ├── IHasCurrentSourceInfoChange.cs
    │   │   ├── IInputSync.cs
    │   │   ├── IMatrixRouting.cs
    │   │   ├── IRmcRouting.cs
    │   │   ├── IRmcRoutingWithFeedback.cs
    │   │   ├── IRouting.cs
    │   │   ├── IRoutingFeedback.cs
    │   │   ├── IRoutingHasVideoInputSyncFeedbacks.cs
    │   │   ├── IRoutingInputSlot.cs
    │   │   ├── IRoutingInputs.cs
    │   │   ├── IRoutingInputsOutputs.cs
    │   │   ├── IRoutingNumeric.cs
    │   │   ├── IRoutingNumericWithFeedback.cs
    │   │   ├── IRoutingOutputSlot.cs
    │   │   ├── IRoutingOutputs.cs
    │   │   ├── IRoutingSink.cs
    │   │   ├── IRoutingSinkWithFeedback.cs
    │   │   ├── IRoutingSinkWithSwitching.cs
    │   │   ├── IRoutingSlot.cs
    │   │   ├── IRoutingSource.cs
    │   │   ├── IRoutingWithClear.cs
    │   │   ├── IRoutingWithFeedback.cs
    │   │   ├── ITxRouting.cs
    │   │   ├── ITxRoutingWithFeedback.cs
    │   │   ├── RouteDescriptor.cs
    │   │   ├── RouteDescriptorCollection.cs
    │   │   ├── RouteRequest.cs
    │   │   ├── RouteRequestQueueItem.cs
    │   │   ├── RouteSwitchDescriptor.cs
    │   │   ├── RoutingFeedbackManager.cs
    │   │   ├── RoutingInputPort.cs
    │   │   ├── RoutingInputPortWithVideoStatuses.cs
    │   │   ├── RoutingNumericEventArgs.cs
    │   │   ├── RoutingOutputPort.cs
    │   │   ├── RoutingPort.cs
    │   │   ├── RoutingPortCollection.cs
    │   │   ├── RoutingPortNames.cs
    │   │   ├── TieLine.cs
    │   │   ├── TieLineConfig.cs
    │   │   ├── eRoutingPortConnectionType.cs
    │   │   └── eRoutingSignalType.cs
    │   ├── Secrets/
    │   │   ├── CrestronGlobalSecretsProvider.cs
    │   │   ├── CrestronLocalSecretsProvider.cs
    │   │   ├── CrestronSecret.cs
    │   │   ├── Interfaces.cs
    │   │   ├── SecretsManager.cs
    │   │   └── SecretsPropertiesConfig.cs
    │   ├── Shades/
    │   │   ├── Shade Interfaces.cs
    │   │   └── ShadeBase.cs
    │   ├── SigHelper.cs
    │   ├── SmartObjects/
    │   │   ├── SmartObjectDPad.cs
    │   │   ├── SmartObjectDynamicList.cs
    │   │   ├── SmartObjectHelperBase.cs
    │   │   ├── SmartObjectNumeric.cs
    │   │   └── SubpageReferencList/
    │   │       ├── SourceListSubpageReferenceList.cs
    │   │       ├── SubpageReferenceList.cs
    │   │       └── SubpageReferenceListItem.cs
    │   ├── Timers/
    │   │   ├── CountdownTimer.cs
    │   │   └── RetriggerableTimer.cs
    │   ├── Touchpanels/
    │   │   ├── CrestronTouchpanelPropertiesConfig.cs
    │   │   ├── Interfaces.cs
    │   │   ├── Keyboards/
    │   │   │   └── HabaneroKeyboardController.cs
    │   │   ├── ModalDialog.cs
    │   │   ├── Mpc3Touchpanel.cs
    │   │   └── TriListExtensions.cs
    │   ├── TriListBridges/
    │   │   └── HandlerBridge.cs
    │   ├── UI/
    │   │   └── TouchpanelBase.cs
    │   ├── UI PageManagers/
    │   │   ├── BlurayPageManager.cs
    │   │   ├── PageManager.cs
    │   │   ├── SetTopBoxThreePanelPageManager.cs
    │   │   ├── SetTopBoxTwoPanelPageManager.cs
    │   │   └── SinglePageManager.cs
    │   ├── Utilities/
    │   │   └── ActionSequence.cs
    │   ├── VideoStatus/
    │   │   └── VideoStatusOutputs.cs
    │   ├── Web/
    │   │   ├── EssentialsWebApi.cs
    │   │   ├── EssentialsWebApiFactory.cs
    │   │   ├── EssentialsWebApiHelpers.cs
    │   │   ├── EssentialsWebApiPropertiesConfig.cs
    │   │   └── RequestHandlers/
    │   │       ├── AppDebugRequestHandler.cs
    │   │       ├── DebugSessionRequestHandler.cs
    │   │       ├── DefaultRequestHandler.cs
    │   │       ├── DevJsonRequestHandler.cs
    │   │       ├── DevListRequestHandler.cs
    │   │       ├── DevMethodsRequestHandler.cs
    │   │       ├── DevPropsRequestHandler.cs
    │   │       ├── DisableAllStreamDebugRequestHandler.cs
    │   │       ├── DoNotLoadConfigOnNextBootRequestHandler.cs
    │   │       ├── GetFeedbacksForDeviceRequestHandler.cs
    │   │       ├── GetJoinMapForBridgeKeyRequestHandler.cs
    │   │       ├── GetJoinMapForDeviceKeyRequestHandler.cs
    │   │       ├── GetRoutesHandler.cs
    │   │       ├── GetRoutingDevicesAndTieLinesHandler.cs
    │   │       ├── GetRoutingPortsHandler.cs
    │   │       ├── GetTieLinesRequestHandler.cs
    │   │       ├── GetTypesByFilterRequestHandler.cs
    │   │       ├── GetTypesRequestHandler.cs
    │   │       ├── LoadConfigRequestHandler.cs
    │   │       ├── LoginRequestHandler.cs
    │   │       ├── ReportVersionsRequestHandler.cs
    │   │       ├── RestartProgramRequestHandler.cs
    │   │       ├── ServeDebugAppRequestHandler.cs
    │   │       ├── SetDeviceStreamDebugRequestHandler.cs
    │   │       └── ShowConfigRequestHandler.cs
    │   └── app.config
    ├── PepperDash.Essentials.Devices.Common/
    │   ├── Audio/
    │   │   └── GenericAudioOut.cs
    │   ├── AudioCodec/
    │   │   ├── AudioCodecBase.cs
    │   │   ├── Interfaces/
    │   │   │   ├── IAudioCodecInfo.cs
    │   │   │   └── IHasAudioCodec.cs
    │   │   └── MockAC/
    │   │       ├── MockAC.cs
    │   │       └── MockAcPropertiesConfig.cs
    │   ├── Cameras/
    │   │   ├── CameraBase.cs
    │   │   ├── CameraVisca.cs
    │   │   ├── IHasCameraPresets.cs
    │   │   └── Interfaces/
    │   │       ├── CameraSelectedEventArgs.cs
    │   │       ├── IAmFarEndCamera.cs
    │   │       ├── ICameraCapabilities.cs
    │   │       ├── IHasAutoFocusMode.cs
    │   │       ├── IHasCameraAutoMode.cs
    │   │       ├── IHasCameraControls.cs
    │   │       ├── IHasCameraFocusControl.cs
    │   │       ├── IHasCameraMute.cs
    │   │       ├── IHasCameraMuteWithUnmuteRequest.cs
    │   │       ├── IHasCameraOff.cs
    │   │       ├── IHasCameraPanControl.cs
    │   │       ├── IHasCameraPtzControl.cs
    │   │       ├── IHasCameraTiltControl.cs
    │   │       ├── IHasCameraZoomControl.cs
    │   │       ├── IHasCameras.cs
    │   │       ├── IHasCamerasWithControls.cs
    │   │       ├── IHasCodecCameras.cs
    │   │       ├── IHasFarEndCameraControl.cs
    │   │       └── eCameraControlMode.cs
    │   ├── Codec/
    │   │   ├── Call.cs
    │   │   ├── Cisco/
    │   │   │   ├── IPresenterTrack.cs
    │   │   │   └── ISpeakerTrack.cs
    │   │   ├── CodecActiveCallItem.cs
    │   │   ├── CodecDirectory.cs
    │   │   ├── CodecScheduleAwareness.cs
    │   │   ├── ContactMethod.cs
    │   │   ├── DirectoryContact.cs
    │   │   ├── DirectoryEventArgs.cs
    │   │   ├── DirectoryFolder.cs
    │   │   ├── DirectoryItem.cs
    │   │   ├── ICiscoCodecCameraConfig.cs
    │   │   ├── IHasCallHold.cs
    │   │   ├── IHasDirectoryHistoryStack.cs
    │   │   ├── IHasDoNotDisturb.cs
    │   │   ├── IHasExternalSourceSwitching.cs
    │   │   ├── IInvitableContact.cs
    │   │   ├── InvitableDirectoryContact.cs
    │   │   ├── Meeting.cs
    │   │   ├── MeetingEventArgs.cs
    │   │   ├── eCodecCallDirection.cs
    │   │   ├── eCodecCallStatus.cs
    │   │   ├── eCodecCallType.cs
    │   │   ├── eContactMethodCallType.cs
    │   │   ├── eContactMethodDevice.cs
    │   │   ├── eMeetingEventChangeType.cs
    │   │   ├── eMeetingPrivacy.cs
    │   │   ├── iCodecAudio.cs
    │   │   ├── iHasCallFavorites.cs
    │   │   ├── iHasCallHistory.cs
    │   │   ├── iHasContentSharing.cs
    │   │   ├── iHasDialer.cs
    │   │   ├── iHasDirectory.cs
    │   │   └── iHasScheduleAwareness.cs
    │   ├── DSP/
    │   │   └── DspBase.cs
    │   ├── DeviceFactory.cs
    │   ├── Displays/
    │   │   ├── BasicIrDisplay.cs
    │   │   ├── DisplayBase.cs
    │   │   ├── InputInterfaces.cs
    │   │   ├── MockDisplay.cs
    │   │   ├── MockDisplayInputs.cs
    │   │   ├── ScreenLiftController.cs
    │   │   ├── ScreenLiftControllerConfigProperties.cs
    │   │   ├── ScreenLiftRelaysConfig.cs
    │   │   ├── TwoWayDisplayBase.cs
    │   │   └── eScreenLiftControlMode.cs
    │   ├── Generic/
    │   │   ├── GenericSink.cs
    │   │   └── GenericSource.cs
    │   ├── Lighting/
    │   │   └── LightingBase.cs
    │   ├── PepperDash.Essentials.Devices.Common.csproj
    │   ├── Properties/
    │   │   └── ControlSystem.cfg
    │   ├── Room/
    │   │   ├── IEssentialsHuddleSpaceRoom.cs
    │   │   ├── IEssentialsHuddleVtc1Room.cs
    │   │   ├── IEssentialsRoomPropertiesConfig.cs
    │   │   └── IEssentialsTechRoom.cs
    │   ├── SetTopBox/
    │   │   ├── IRSetTopBoxBase.cs
    │   │   ├── IRSetTopBoxBaseFactory.cs
    │   │   └── SetTopBoxPropertiesConfig.cs
    │   ├── Shades/
    │   │   ├── RelayControlledShade.cs
    │   │   ├── ShadeBase.cs
    │   │   └── ShadeController.cs
    │   ├── SoftCodec/
    │   │   ├── BlueJeansPc.cs
    │   │   ├── BlueJeansPcFactory.cs
    │   │   ├── GenericSoftCodec.cs
    │   │   ├── GenericSoftCodecFactory.cs
    │   │   └── GenericSoftCodecProperties.cs
    │   ├── Sources/
    │   │   ├── InRoomPc.cs
    │   │   ├── InRoomPcFactory.cs
    │   │   ├── Laptop.cs
    │   │   └── LaptopFactory.cs
    │   ├── Streaming/
    │   │   ├── AppleTV.cs
    │   │   ├── AppleTVFactory.cs
    │   │   ├── AppleTvIrCommands.cs
    │   │   ├── Roku.cs
    │   │   └── Roku2Factory.cs
    │   └── VideoCodec/
    │       ├── CiscoCodec/
    │       │   ├── CallHistoryDataClasses.cs
    │       │   ├── RoomPresets.cs
    │       │   ├── eCommandType.cs
    │       │   ├── eExternalSourceMode.cs
    │       │   └── eExternalSourceType.cs
    │       ├── CodecCommandWithLabel.cs
    │       ├── CodecPhonebookSyncState.cs
    │       ├── ConvertiblePreset.cs
    │       ├── Interfaces/
    │       │   ├── CodecParticipants.cs
    │       │   ├── IHasCodecLayouts.cs
    │       │   ├── IHasCodecSelfview.cs
    │       │   ├── IHasMeetingInfo.cs
    │       │   ├── IHasMeetingLock.cs
    │       │   ├── IHasMeetingRecording.cs
    │       │   ├── IHasMeetingRecordingWithPrompt.cs
    │       │   ├── IHasParticipantAudioMute.cs
    │       │   ├── IHasParticipantPinUnpin.cs
    │       │   ├── IHasParticipantVideoMute.cs
    │       │   ├── IHasParticipants.cs
    │       │   ├── IHasPresentationOnlyMeeting.cs
    │       │   ├── IHasSelfviewPosition.cs
    │       │   ├── IHasSelfviewSize.cs
    │       │   ├── IHasStandbyMode.cs
    │       │   ├── IHasStartMeeting.cs
    │       │   ├── IHasVideoCodec.cs
    │       │   ├── IJoinCalls.cs
    │       │   ├── MeetingInfo.cs
    │       │   ├── MeetingInfoEventArgs.cs
    │       │   ├── Participant.cs
    │       │   └── iVideoCodecInfo.cs
    │       ├── MockVC/
    │       │   ├── MockCodecDirectory.cs
    │       │   ├── MockVC.cs
    │       │   ├── MockVCCamera.cs
    │       │   └── MockVcPropertiesConfig.cs
    │       └── VideoCodecBase.cs
    ├── PepperDash.Essentials.MobileControl/
    │   ├── AuthorizationResponse.cs
    │   ├── ClientSpecificUpdateRequest.cs
    │   ├── IDelayedConfiguration.cs
    │   ├── MessageToClients.cs
    │   ├── MobileControlAction.cs
    │   ├── MobileControlConfig.cs
    │   ├── MobileControlDeviceFactory.cs
    │   ├── MobileControlEssentialsConfig.cs
    │   ├── MobileControlFactory.cs
    │   ├── MobileControlSimplDeviceBridge.cs
    │   ├── MobileControlSystemController.cs
    │   ├── PepperDash.Essentials.MobileControl.csproj
    │   ├── RoomBridges/
    │   │   ├── MobileControlBridgeBase.cs
    │   │   ├── MobileControlEssentialsRoomBridge.cs
    │   │   ├── MobileControlSIMPLRoomBridge.cs
    │   │   └── SourceDeviceMapDictionary.cs
    │   ├── Services/
    │   │   └── MobileControlApiService.cs
    │   ├── Touchpanel/
    │   │   ├── ITheme.cs
    │   │   ├── ITswAppControl.cs
    │   │   ├── ITswAppControlMessenger.cs
    │   │   ├── ITswZoomControlMessenger.cs
    │   │   ├── MobileControlTouchpanelController.cs
    │   │   ├── MobileControlTouchpanelProperties.cs
    │   │   └── ThemeMessenger.cs
    │   ├── TransmitMessage.cs
    │   ├── UserCodeChanged.cs
    │   ├── UserCodeChangedContent.cs
    │   ├── Utilities.cs
    │   ├── Volumes.cs
    │   ├── WebApiHandlers/
    │   │   ├── ActionPathsHandler.cs
    │   │   ├── DeleteAllUiClientsHandler.cs
    │   │   ├── MobileAuthRequestHandler.cs
    │   │   ├── MobileInfoHandler.cs
    │   │   └── UiClientHandler.cs
    │   └── WebSocketServer/
    │       ├── ConnectionClosedEventArgs.cs
    │       ├── DeviceInterfaceInfo.cs
    │       ├── JoinResponse.cs
    │       ├── JoinToken.cs
    │       ├── MobileControlWebsocketServer.cs
    │       ├── ServerTokenSecrets.cs
    │       ├── UiClient.cs
    │       ├── UiClientContext.cs
    │       ├── Version.cs
    │       └── WebSocketServerSecretProvider.cs
    └── PepperDash.Essentials.MobileControl.Messengers/
        ├── ContentTypes.cs
        ├── DeviceTypeExtensions/
        │   ├── DisplayBaseMessenger.cs
        │   ├── IChannelMessenger.cs
        │   ├── IColorMessenger.cs
        │   ├── IDPadMessenger.cs
        │   ├── IDvrMessenger.cs
        │   ├── IHasPowerMessenger.cs
        │   ├── INumericMessenger.cs
        │   ├── ISetTopBoxControlsMessenger.cs
        │   └── ITransportMessenger.cs
        ├── Messengers/
        │   ├── AudioCodecBaseMessenger.cs
        │   ├── CameraBaseMessenger.cs
        │   ├── CurrentSourcesMessenger.cs
        │   ├── DeviceEventMessageBase.cs
        │   ├── DeviceInfoMessenger.cs
        │   ├── DeviceMessageBase.cs
        │   ├── DevicePresetsModelMessenger.cs
        │   ├── DeviceStateMessageBase.cs
        │   ├── DeviceVolumeMessenger.cs
        │   ├── GenericMessenger.cs
        │   ├── IBasicVideoMuteWithFeedbackMessenger.cs
        │   ├── ICommunicationMonitorMessenger.cs
        │   ├── IDspPresetsMessenger.cs
        │   ├── IEssentialsRoomCombinerMessenger.cs
        │   ├── IHasCamerasMessenger.cs
        │   ├── IHasCamerasWithControlMessenger.cs
        │   ├── IHasCurrentSourceInfoMessenger.cs
        │   ├── IHasInputsMessenger.cs
        │   ├── IHasPowerControlWithFeedbackMessenger.cs
        │   ├── IHasScheduleAwarenessMessenger.cs
        │   ├── IHumiditySensor.cs
        │   ├── ILevelControlsMessenger.cs
        │   ├── IMatrixRoutingMessenger.cs
        │   ├── IProjectorScreenLiftControlMessenger.cs
        │   ├── IRunRouteActionMessenger.cs
        │   ├── ISelectableItemsMessenger.cs
        │   ├── IShutdownPromptTimerMessenger.cs
        │   ├── ISwitchedOutputMessenger.cs
        │   ├── ITechPasswordMessenger.cs
        │   ├── ITemperatureSensorMessenger.cs
        │   ├── LightingBaseMessenger.cs
        │   ├── MessengerBase.cs
        │   ├── PressAndHoldHandler.cs
        │   ├── RoomEventScheduleMessenger.cs
        │   ├── SIMPLAtcMessenger.cs
        │   ├── SIMPLCameraMessenger.cs
        │   ├── SIMPLDirectRouteMessenger.cs
        │   ├── SIMPLRouteMessenger.cs
        │   ├── SIMPLVtcMessenger.cs
        │   ├── ShadeBaseMessenger.cs
        │   ├── SimplMessengerPropertiesConfig.cs
        │   ├── SystemMonitorMessenger.cs
        │   ├── TwoWayDisplayBaseMessenger.cs
        │   └── VideoCodecBaseMessenger.cs
        ├── MobileControlMessage.cs
        ├── MobileControlSimpleContent.cs
        ├── PepperDash.Essentials.MobileControl.Messengers.csproj
        └── SIMPLJoinMaps/
            ├── MobileControlSIMPLRoomJoinMap.cs
            ├── MobileControlSIMPLRunDirectRouteActionJoinMap.cs
            ├── SIMPLAtcJoinMap.cs
            └── SIMPLVtcJoinMap.cs
Download .txt
Showing preview only (436K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4291 symbols across 688 files)

FILE: src/PepperDash.Core/ComTextHelper.cs
  class ComTextHelper (line 10) | public class ComTextHelper
    method GetEscapedText (line 17) | public static string GetEscapedText(byte[] bytes)
    method GetEscapedText (line 27) | public static string GetEscapedText(string text)
    method GetDebugText (line 38) | public static string GetDebugText(string text)

FILE: src/PepperDash.Core/Comm/CommunicationGather.cs
  class CommunicationGather (line 22) | public class CommunicationGather
    method CommunicationGather (line 58) | public CommunicationGather(ICommunicationReceiver port, char delimiter)
    method CommunicationGather (line 70) | public CommunicationGather(ICommunicationReceiver port, string delimiter)
    method CommunicationGather (line 80) | public CommunicationGather(ICommunicationReceiver port, string[] delim...
    method Stop (line 90) | public void Stop()
    method Port_TextReceived (line 99) | void Port_TextReceived(object sender, GenericCommMethodReceiveTextArgs...
    method Port_TextReceivedStringDelimiter (line 128) | void Port_TextReceivedStringDelimiter(object sender, GenericCommMethod...

FILE: src/PepperDash.Core/Comm/CommunicationStreamDebugging.cs
  class CommunicationStreamDebugging (line 12) | public class CommunicationStreamDebugging
    method CommunicationStreamDebugging (line 57) | public CommunicationStreamDebugging(string parentDeviceKey)
    method SetDebuggingWithDefaultTimeout (line 70) | public void SetDebuggingWithDefaultTimeout(eStreamDebuggingSetting set...
    method SetDebuggingWithSpecificTimeout (line 89) | public void SetDebuggingWithSpecificTimeout(eStreamDebuggingSetting se...
    method DisableDebugging (line 116) | private void DisableDebugging()
    method StopDebugTimer (line 123) | private void StopDebugTimer()

FILE: src/PepperDash.Core/Comm/ControlPropertiesConfig.cs
  class ControlPropertiesConfig (line 11) | public class ControlPropertiesConfig
    method ControlPropertiesConfig (line 89) | public ControlPropertiesConfig()

FILE: src/PepperDash.Core/Comm/EventArgs.cs
  class GenericSocketStatusChageEventArgs (line 30) | public class GenericSocketStatusChageEventArgs : EventArgs
    method GenericSocketStatusChageEventArgs (line 41) | public GenericSocketStatusChageEventArgs(ISocketStatus client)
    method GenericSocketStatusChageEventArgs (line 48) | public GenericSocketStatusChageEventArgs() { }
  class GenericTcpServerStateChangedEventArgs (line 60) | public class GenericTcpServerStateChangedEventArgs : EventArgs
    method GenericTcpServerStateChangedEventArgs (line 71) | public GenericTcpServerStateChangedEventArgs(ServerState state)
    method GenericTcpServerStateChangedEventArgs (line 78) | public GenericTcpServerStateChangedEventArgs() { }
  class GenericTcpServerSocketStatusChangeEventArgs (line 91) | public class GenericTcpServerSocketStatusChangeEventArgs : EventArgs
    method GenericTcpServerSocketStatusChangeEventArgs (line 111) | public GenericTcpServerSocketStatusChangeEventArgs(object socket, Sock...
    method GenericTcpServerSocketStatusChangeEventArgs (line 123) | public GenericTcpServerSocketStatusChangeEventArgs(object socket, uint...
    method GenericTcpServerSocketStatusChangeEventArgs (line 132) | public GenericTcpServerSocketStatusChangeEventArgs() { }
  class GenericTcpServerCommMethodReceiveTextArgs (line 138) | public class GenericTcpServerCommMethodReceiveTextArgs : EventArgs
    method GenericTcpServerCommMethodReceiveTextArgs (line 165) | public GenericTcpServerCommMethodReceiveTextArgs(string text)
    method GenericTcpServerCommMethodReceiveTextArgs (line 175) | public GenericTcpServerCommMethodReceiveTextArgs(string text, uint cli...
    method GenericTcpServerCommMethodReceiveTextArgs (line 183) | public GenericTcpServerCommMethodReceiveTextArgs() { }
  class GenericTcpServerClientReadyForcommunicationsEventArgs (line 189) | public class GenericTcpServerClientReadyForcommunicationsEventArgs : Eve...
    method GenericTcpServerClientReadyForcommunicationsEventArgs (line 200) | public GenericTcpServerClientReadyForcommunicationsEventArgs(bool isRe...
    method GenericTcpServerClientReadyForcommunicationsEventArgs (line 207) | public GenericTcpServerClientReadyForcommunicationsEventArgs() { }
  class GenericUdpConnectedEventArgs (line 213) | public class GenericUdpConnectedEventArgs : EventArgs
    method GenericUdpConnectedEventArgs (line 227) | public GenericUdpConnectedEventArgs() { }
    method GenericUdpConnectedEventArgs (line 233) | public GenericUdpConnectedEventArgs(ushort uconnected)
    method GenericUdpConnectedEventArgs (line 242) | public GenericUdpConnectedEventArgs(bool connected)

FILE: src/PepperDash.Core/Comm/GenericSecureTcpIpClient.cs
  class GenericSecureTcpIpClient (line 15) | public class GenericSecureTcpIpClient : Device, ISocketStatusWithStreamD...
    method GenericSecureTcpIpClient (line 305) | public GenericSecureTcpIpClient(string key, string address, int port, ...
    method GenericSecureTcpIpClient (line 322) | public GenericSecureTcpIpClient(string key, TcpClientConfigObject clie...
    method GenericSecureTcpIpClient (line 336) | public GenericSecureTcpIpClient()
    method Initialize (line 347) | public void Initialize(string key)
    method Initialize (line 356) | public void Initialize(TcpClientConfigObject config)
    method CrestronEnvironment_ProgramStatusEventHandler (line 409) | void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEvent...
    method Deactivate (line 427) | public override bool Deactivate()
    method Connect (line 440) | public void Connect()
    method Disconnect (line 571) | public void Disconnect()
    method DisconnectClient (line 594) | public void DisconnectClient()
    method CheckClosedAndTryReconnect (line 622) | void CheckClosedAndTryReconnect()
    method Receive (line 650) | void Receive(SecureTCPClient client, int numBytes)
    method DequeueEvent (line 717) | void DequeueEvent()
    method HeartbeatStart (line 743) | void HeartbeatStart()
    method HeartbeatStop (line 760) | void HeartbeatStop()
    method SendHeartbeat (line 777) | void SendHeartbeat(object notused)
    method checkHeartbeat (line 785) | string checkHeartbeat(string received)
    method HeartbeatAckTimerFail (line 820) | void HeartbeatAckTimerFail(object o)
    method StopWaitForSharedKeyTimer (line 842) | void StopWaitForSharedKeyTimer()
    method SendText (line 854) | public void SendText(string text)
    method SendBytes (line 883) | public void SendBytes(byte[] bytes)
    method Client_SocketStatusChange (line 904) | void Client_SocketStatusChange(SecureTCPClient client, SocketStatus cl...
    method OnConnectionChange (line 933) | void OnConnectionChange()
    method OnClientReadyForcommunications (line 944) | void OnClientReadyForcommunications(bool isReady)

FILE: src/PepperDash.Core/Comm/GenericSecureTcpIpClient_ForServer.cs
  class GenericSecureTcpIpClient_ForServer (line 27) | public class GenericSecureTcpIpClient_ForServer : Device, IAutoReconnect
    method GenericSecureTcpIpClient_ForServer (line 300) | public GenericSecureTcpIpClient_ForServer(string key, string address, ...
    method GenericSecureTcpIpClient_ForServer (line 314) | public GenericSecureTcpIpClient_ForServer()
    method GenericSecureTcpIpClient_ForServer (line 327) | public GenericSecureTcpIpClient_ForServer(string key, TcpClientConfigO...
    method Initialize (line 341) | public void Initialize(string key)
    method Initialize (line 350) | public void Initialize(TcpClientConfigObject clientConfigObject)
    method CrestronEnvironment_ProgramStatusEventHandler (line 386) | void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEvent...
    method Connect (line 400) | public void Connect()
    method Disconnect (line 531) | public void Disconnect()
    method Cleanup (line 552) | void Cleanup()
    method CheckClosedAndTryReconnect (line 577) | void CheckClosedAndTryReconnect()
    method Receive (line 605) | void Receive(SecureTCPClient client, int numBytes)
    method DequeueEvent (line 672) | void DequeueEvent()
    method HeartbeatStart (line 698) | void HeartbeatStart()
    method HeartbeatStop (line 715) | void HeartbeatStop()
    method SendHeartbeat (line 732) | void SendHeartbeat(object notused)
    method checkHeartbeat (line 740) | string checkHeartbeat(string received)
    method HeartbeatAckTimerFail (line 775) | void HeartbeatAckTimerFail(object o)
    method StopWaitForSharedKeyTimer (line 797) | void StopWaitForSharedKeyTimer()
    method SendText (line 809) | public void SendText(string text)
    method SendBytes (line 838) | public void SendBytes(byte[] bytes)
    method Client_SocketStatusChange (line 859) | void Client_SocketStatusChange(SecureTCPClient client, SocketStatus cl...
    method OnConnectionChange (line 888) | void OnConnectionChange()
    method OnClientReadyForcommunications (line 898) | void OnClientReadyForcommunications(bool isReady)

FILE: src/PepperDash.Core/Comm/GenericSecureTcpIpServer.cs
  class GenericSecureTcpIpServer (line 25) | public class GenericSecureTcpIpServer : Device
    method GenericSecureTcpIpServer (line 301) | public GenericSecureTcpIpServer()
    method GenericSecureTcpIpServer (line 314) | public GenericSecureTcpIpServer(string key)
    method GenericSecureTcpIpServer (line 328) | public GenericSecureTcpIpServer(TcpServerConfigObject serverConfigObject)
    method KillServer (line 343) | public void KillServer()
    method Initialize (line 361) | public void Initialize(string key)
    method Initialize (line 370) | public void Initialize(TcpServerConfigObject serverConfigObject)
    method Listen (line 402) | public void Listen()
    method StopListening (line 460) | public void StopListening()
    method DisconnectClient (line 486) | public void DisconnectClient(uint client)
    method DisconnectAllClientsForShutdown (line 501) | public void DisconnectAllClientsForShutdown()
    method BroadcastText (line 544) | public void BroadcastText(string text)
    method SendTextToClient (line 580) | public void SendTextToClient(string text, uint clientIndex)
    method checkHeartbeat (line 598) | string checkHeartbeat(uint clientIndex, string received)
    method GetClientIPAddress (line 651) | public string GetClientIPAddress(uint clientIndex)
    method HeartbeatTimer_CallbackFunction (line 671) | void HeartbeatTimer_CallbackFunction(object o)
    method SecureServer_SocketStatusChange (line 711) | void SecureServer_SocketStatusChange(SecureTCPServer server, uint clie...
    method SecureConnectCallback (line 758) | void SecureConnectCallback(SecureTCPServer server, uint clientIndex)
    method SecureReceivedDataAsyncCallback (line 832) | void SecureReceivedDataAsyncCallback(SecureTCPServer mySecureTCPServer...
    method DequeueEvent (line 897) | void DequeueEvent()
    method onConnectionChange (line 928) | void onConnectionChange(uint clientIndex, SocketStatus clientStatus)
    method OnConnectionChange (line 941) | void OnConnectionChange()
    method onTextReceived (line 955) | void onTextReceived(string text, uint clientIndex)
    method OnServerStateChange (line 963) | void OnServerStateChange(ServerState state)
    method CrestronEnvironment_ProgramStatusEventHandler (line 980) | void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEvent...
    method OnServerClientReadyForCommunications (line 997) | void OnServerClientReadyForCommunications(uint clientIndex)
    method StartMonitorClient (line 1011) | void StartMonitorClient()
    method RunMonitorClient (line 1023) | void RunMonitorClient()
    method StopMonitorClient (line 1042) | void StopMonitorClient()
    method MonitorClient_IsReadyForComm (line 1055) | void MonitorClient_IsReadyForComm(object sender, GenericTcpServerClien...
    method MonitorClientHasHungCallback (line 1072) | void MonitorClientHasHungCallback()

FILE: src/PepperDash.Core/Comm/GenericSshClient.cs
  class GenericSshClient (line 17) | public class GenericSshClient : Device, ISocketStatusWithStreamDebugging...
    method GenericSshClient (line 164) | public GenericSshClient(string key, string hostname, int port, string ...
    method GenericSshClient (line 188) | public GenericSshClient()
    method CrestronEnvironment_ProgramStatusEventHandler (line 206) | private void CrestronEnvironment_ProgramStatusEventHandler(eProgramSta...
    method Connect (line 221) | public void Connect()
    method Disconnect (line 358) | public void Disconnect()
    method KillClient (line 370) | private void KillClient(SocketStatus status)
    method KillStream (line 395) | private void KillStream()
    method kauth_AuthenticationPrompt (line 417) | private void kauth_AuthenticationPrompt(object sender, AuthenticationP...
    method Stream_DataReceived (line 427) | private void Stream_DataReceived(object sender, ShellDataEventArgs e)
    method Client_ErrorOccurred (line 459) | private void Client_ErrorOccurred(object sender, ExceptionEventArgs e)
    method OnConnectionChange (line 487) | private void OnConnectionChange()
    method SendText (line 498) | public void SendText(string text)
    method SendBytes (line 531) | public void SendBytes(byte[] bytes)
    method StartReconnectTimer (line 564) | private void StartReconnectTimer()
    method StopReconnectTimer (line 580) | private void StopReconnectTimer()
    method Deactivate (line 596) | public override bool Deactivate()
  class SshConnectionChangeEventArgs (line 645) | public class SshConnectionChangeEventArgs : EventArgs
    method SshConnectionChangeEventArgs (line 670) | public SshConnectionChangeEventArgs() { }
    method SshConnectionChangeEventArgs (line 677) | public SshConnectionChangeEventArgs(bool isConnected, GenericSshClient...

FILE: src/PepperDash.Core/Comm/GenericTcpIpClient.cs
  class GenericTcpIpClient (line 14) | public class GenericTcpIpClient : Device, ISocketStatusWithStreamDebuggi...
    method GenericTcpIpClient (line 183) | public GenericTcpIpClient(string key, string address, int port, int bu...
    method GenericTcpIpClient (line 203) | public GenericTcpIpClient(string key)
    method GenericTcpIpClient (line 220) | public GenericTcpIpClient()
    method Initialize (line 237) | public void Initialize(string key)
    method CrestronEnvironment_ProgramStatusEventHandler (line 245) | void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEvent...
    method Deactivate (line 261) | public override bool Deactivate()
    method Connect (line 276) | public void Connect()
    method Reconnect (line 315) | private void Reconnect()
    method Disconnect (line 343) | public void Disconnect()
    method DisconnectClient (line 363) | public void DisconnectClient()
    method ConnectToServerCallback (line 377) | void ConnectToServerCallback(TCPClient c)
    method WaitAndTryReconnect (line 393) | void WaitAndTryReconnect()
    method Receive (line 419) | void Receive(TCPClient client, int numBytes)
    method SendText (line 449) | public void SendText(string text)
    method SendEscapedText (line 461) | public void SendEscapedText(string text)
    method SendBytes (line 478) | public void SendBytes(byte[] bytes)
    method Client_SocketStatusChange (line 490) | void Client_SocketStatusChange(TCPClient client, SocketStatus clientSo...
  class TcpSshPropertiesConfig (line 512) | public class TcpSshPropertiesConfig
    method TcpSshPropertiesConfig (line 559) | public TcpSshPropertiesConfig()

FILE: src/PepperDash.Core/Comm/GenericTcpIpClient_ForServer.cs
  class GenericTcpIpClient_ForServer (line 27) | public class GenericTcpIpClient_ForServer : Device, IAutoReconnect
    method GenericTcpIpClient_ForServer (line 266) | public GenericTcpIpClient_ForServer(string key, string address, int po...
    method GenericTcpIpClient_ForServer (line 280) | public GenericTcpIpClient_ForServer()
    method Initialize (line 294) | public void Initialize(string key)
    method CrestronEnvironment_ProgramStatusEventHandler (line 302) | void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEvent...
    method Connect (line 316) | public void Connect()
    method Disconnect (line 447) | public void Disconnect()
    method Cleanup (line 468) | void Cleanup()
    method CheckClosedAndTryReconnect (line 493) | void CheckClosedAndTryReconnect()
    method Receive (line 519) | void Receive(TCPClient client, int numBytes)
    method HeartbeatStart (line 563) | void HeartbeatStart()
    method HeartbeatStop (line 580) | void HeartbeatStop()
    method SendHeartbeat (line 597) | void SendHeartbeat(object notused)
    method checkHeartbeat (line 605) | string checkHeartbeat(string received)
    method HeartbeatAckTimerFail (line 640) | void HeartbeatAckTimerFail(object o)
    method StopWaitForSharedKeyTimer (line 662) | void StopWaitForSharedKeyTimer()
    method SendText (line 674) | public void SendText(string text)
    method SendBytes (line 703) | public void SendBytes(byte[] bytes)
    method Client_SocketStatusChange (line 724) | void Client_SocketStatusChange(TCPClient client, SocketStatus clientSo...
    method OnConnectionChange (line 754) | void OnConnectionChange()
    method OnClientReadyForcommunications (line 764) | void OnClientReadyForcommunications(bool isReady)

FILE: src/PepperDash.Core/Comm/GenericTcpIpServer.cs
  class GenericTcpIpServer (line 25) | public class GenericTcpIpServer : Device
    method GenericTcpIpServer (line 282) | public GenericTcpIpServer()
    method GenericTcpIpServer (line 295) | public GenericTcpIpServer(string key)
    method GenericTcpIpServer (line 309) | public GenericTcpIpServer(TcpServerConfigObject serverConfigObject)
    method KillServer (line 324) | public void KillServer()
    method Initialize (line 342) | public void Initialize(string key)
    method Initialize (line 351) | public void Initialize(TcpServerConfigObject serverConfigObject)
    method Listen (line 382) | public void Listen()
    method StopListening (line 439) | public void StopListening()
    method DisconnectClient (line 465) | public void DisconnectClient(uint client)
    method DisconnectAllClientsForShutdown (line 480) | public void DisconnectAllClientsForShutdown()
    method BroadcastText (line 523) | public void BroadcastText(string text)
    method SendTextToClient (line 559) | public void SendTextToClient(string text, uint clientIndex)
    method checkHeartbeat (line 577) | string checkHeartbeat(uint clientIndex, string received)
    method GetClientIPAddress (line 630) | public string GetClientIPAddress(uint clientIndex)
    method HeartbeatTimer_CallbackFunction (line 650) | void HeartbeatTimer_CallbackFunction(object o)
    method TcpServer_SocketStatusChange (line 690) | void TcpServer_SocketStatusChange(TCPServer server, uint clientIndex, ...
    method TcpConnectCallback (line 727) | void TcpConnectCallback(TCPServer server, uint clientIndex)
    method TcpServerReceivedDataAsyncCallback (line 803) | void TcpServerReceivedDataAsyncCallback(TCPServer myTCPServer, uint cl...
    method onConnectionChange (line 855) | void onConnectionChange(uint clientIndex, SocketStatus clientStatus)
    method OnConnectionChange (line 868) | void OnConnectionChange()
    method onTextReceived (line 882) | void onTextReceived(string text, uint clientIndex)
    method OnServerStateChange (line 890) | void OnServerStateChange(ServerState state)
    method CrestronEnvironment_ProgramStatusEventHandler (line 907) | void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEvent...
    method OnServerClientReadyForCommunications (line 924) | void OnServerClientReadyForCommunications(uint clientIndex)
    method StartMonitorClient (line 938) | void StartMonitorClient()
    method RunMonitorClient (line 950) | void RunMonitorClient()
    method StopMonitorClient (line 969) | void StopMonitorClient()
    method MonitorClient_IsReadyForComm (line 982) | void MonitorClient_IsReadyForComm(object sender, GenericTcpServerClien...
    method MonitorClientHasHungCallback (line 999) | void MonitorClientHasHungCallback()

FILE: src/PepperDash.Core/Comm/GenericUdpClient.cs
  class GenericUdpClient (line 16) | public class GenericUdpClient : Device, ISocketStatusWithStreamDebugging...
    method GenericUdpClient (line 149) | public GenericUdpClient(string key, string address, int port, int buff...
    method GenericUdpClient (line 169) | public GenericUdpClient()
    method Initialize (line 187) | public void Initialize(string key)
    method CrestronEnvironment_ProgramStatusEventHandler (line 192) | private void CrestronEnvironment_ProgramStatusEventHandler(eProgramSta...
    method Deactivate (line 204) | public override bool Deactivate()
    method Connect (line 213) | public void Connect()
    method Disconnect (line 301) | public void Disconnect()
    method SendText (line 315) | public void SendText(string text)
    method SendBytes (line 326) | public void SendBytes(byte[] bytes)
    method StartReceive (line 354) | private void StartReceive(CancellationToken token)
    method HandleDisconnected (line 431) | private void HandleDisconnected()
    method StartReconnectTimer (line 441) | private void StartReconnectTimer()
    method CleanupClient (line 447) | private void CleanupClient()

FILE: src/PepperDash.Core/Comm/GenericUdpServer.cs
  class GenericUdpServer (line 16) | public class GenericUdpServer : Device, ISocketStatusWithStreamDebugging
    method GenericUdpServer (line 118) | public GenericUdpServer()
    method GenericUdpServer (line 135) | public GenericUdpServer(string key, string address, int port, int buff...
    method Initialize (line 156) | public void Initialize(string key, string address, ushort port)
    method CrestronEnvironment_EthernetEventHandler (line 167) | void CrestronEnvironment_EthernetEventHandler(EthernetEventArgs ethern...
    method CrestronEnvironment_ProgramStatusEventHandler (line 181) | void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEvent...
    method Connect (line 193) | public void Connect()
    method Disconnect (line 244) | public void Disconnect()
    method Receive (line 262) | void Receive(UDPServer server, int numBytes)
    method SendText (line 311) | public void SendText(string text)
    method SendBytes (line 330) | public void SendBytes(byte[] bytes)
  class GenericUdpReceiveTextExtraArgs (line 343) | public class GenericUdpReceiveTextExtraArgs : EventArgs
    method GenericUdpReceiveTextExtraArgs (line 369) | public GenericUdpReceiveTextExtraArgs(string text, string ipAddress, i...
    method GenericUdpReceiveTextExtraArgs (line 380) | public GenericUdpReceiveTextExtraArgs() { }
  class UdpServerPropertiesConfig (line 386) | public class UdpServerPropertiesConfig
    method UdpServerPropertiesConfig (line 408) | public UdpServerPropertiesConfig()

FILE: src/PepperDash.Core/Comm/StreamDebuggingExtensions.cs
  class StreamDebuggingExtensions (line 9) | public static class StreamDebuggingExtensions
    method PrintSentBytes (line 18) | public static void PrintSentBytes(this IStreamDebugging comms, byte[] ...
    method PrintReceivedBytes (line 32) | public static void PrintReceivedBytes(this IStreamDebugging comms, byt...
    method PrintSentText (line 46) | public static void PrintSentText(this IStreamDebugging comms, string t...
    method PrintReceivedText (line 60) | public static void PrintReceivedText(this IStreamDebugging comms, stri...

FILE: src/PepperDash.Core/Comm/TcpClientConfigObject.cs
  class TcpClientConfigObject (line 8) | public class TcpClientConfigObject

FILE: src/PepperDash.Core/Comm/TcpServerConfigObject.cs
  class TcpServerConfigObject (line 12) | public class TcpServerConfigObject

FILE: src/PepperDash.Core/Comm/eControlMethods.cs
  type eControlMethod (line 12) | public enum eControlMethod

FILE: src/PepperDash.Core/Comm/eStreamDebuggingDataTypeSettings.cs
  type eStreamDebuggingDataTypeSettings (line 8) | [Flags]

FILE: src/PepperDash.Core/Comm/eStreamDebuggingSetting.cs
  type eStreamDebuggingSetting (line 8) | [Flags]

FILE: src/PepperDash.Core/CommunicationExtras.cs
  type ICommunicationReceiver (line 12) | public interface ICommunicationReceiver : IKeyed
    method Connect (line 31) | void Connect();
    method Disconnect (line 35) | void Disconnect();
  type IBasicCommunication (line 41) | public interface IBasicCommunication : ICommunicationReceiver
    method SendText (line 47) | void SendText(string text);
    method SendBytes (line 53) | void SendBytes(byte[] bytes);
  type IBasicCommunicationWithStreamDebugging (line 59) | public interface IBasicCommunicationWithStreamDebugging : IBasicCommunic...
  type IStreamDebugging (line 67) | public interface IStreamDebugging : IKeyed
  type ISocketStatus (line 80) | public interface ISocketStatus : IBasicCommunication
  type ISocketStatusWithStreamDebugging (line 98) | public interface ISocketStatusWithStreamDebugging : ISocketStatus, IStre...
  type IAutoReconnect (line 106) | public interface IAutoReconnect
  type eGenericCommMethodStatusChangeType (line 123) | public enum eGenericCommMethodStatusChangeType
  class GenericCommMethodReceiveBytesArgs (line 145) | public class GenericCommMethodReceiveBytesArgs : EventArgs
    method GenericCommMethodReceiveBytesArgs (line 156) | public GenericCommMethodReceiveBytesArgs(byte[] bytes)
    method GenericCommMethodReceiveBytesArgs (line 164) | public GenericCommMethodReceiveBytesArgs() { }
  class GenericCommMethodReceiveTextArgs (line 170) | public class GenericCommMethodReceiveTextArgs : EventArgs
    method GenericCommMethodReceiveTextArgs (line 184) | public GenericCommMethodReceiveTextArgs(string text)
    method GenericCommMethodReceiveTextArgs (line 194) | public GenericCommMethodReceiveTextArgs(string text, string delimiter)
    method GenericCommMethodReceiveTextArgs (line 203) | public GenericCommMethodReceiveTextArgs() { }

FILE: src/PepperDash.Core/Config/PortalConfigReader.cs
  class PortalConfigReader (line 17) | public class PortalConfigReader
    method ReadAndMergeFileIfNecessary (line 40) | public static void ReadAndMergeFileIfNecessary(string filePath, string...
    method MergeConfigs (line 92) | public static JObject MergeConfigs(JObject doubleConfig)
    method MergeArraysOnTopLevelProperty (line 165) | static JArray MergeArraysOnTopLevelProperty(JArray a1, JArray a2, stri...
    method Merge (line 200) | static JObject Merge(JToken t1, JToken t2, string path)
    method Merge (line 211) | static JObject Merge(JObject o1, JObject o2, string path)

FILE: src/PepperDash.Core/Conversion/Convert.cs
  class EncodingHelper (line 12) | public class EncodingHelper
    method ConvertUtf8ToAscii (line 17) | public static string ConvertUtf8ToAscii(string utf8String)
    method ConvertUtf8ToUtf16 (line 25) | public static string ConvertUtf8ToUtf16(string utf8String)

FILE: src/PepperDash.Core/CoreInterfaces.cs
  type IKeyed (line 14) | public interface IKeyed
  type IKeyName (line 26) | public interface IKeyName : IKeyed

FILE: src/PepperDash.Core/Device.cs
  class Device (line 11) | public class Device : IKeyName
    method Device (line 40) | public Device(string key)
    method Device (line 52) | public Device(string key, string name) : this(key)
    method AddPreActivationAction (line 68) | public void AddPreActivationAction(Action act)
    method AddPostActivationAction (line 82) | public void AddPostActivationAction(Action act)
    method PreActivate (line 92) | public void PreActivate()
    method Activate (line 111) | public bool Activate()
    method PostActivate (line 124) | public void PostActivate()
    method CustomActivate (line 149) | public virtual bool CustomActivate() { return true; }
    method Deactivate (line 156) | public virtual bool Deactivate() { return true; }
    method Initialize (line 161) | public virtual void Initialize()
    method OnFalse (line 170) | public void OnFalse(object o, Action a)
    method ToString (line 184) | public override string ToString()

FILE: src/PepperDash.Core/EthernetHelper.cs
  class EthernetHelper (line 10) | public class EthernetHelper
    method EthernetHelper (line 32) | private EthernetHelper(int portNumber)

FILE: src/PepperDash.Core/EventArgs.cs
  class BoolChangeEventArgs (line 12) | public class BoolChangeEventArgs : EventArgs
    method BoolChangeEventArgs (line 37) | public BoolChangeEventArgs()
    method BoolChangeEventArgs (line 47) | public BoolChangeEventArgs(bool state, ushort type)
    method BoolChangeEventArgs (line 59) | public BoolChangeEventArgs(bool state, ushort type, ushort index)
  class UshrtChangeEventArgs (line 70) | public class UshrtChangeEventArgs : EventArgs
    method UshrtChangeEventArgs (line 90) | public UshrtChangeEventArgs()
    method UshrtChangeEventArgs (line 100) | public UshrtChangeEventArgs(ushort intValue, ushort type)
    method UshrtChangeEventArgs (line 112) | public UshrtChangeEventArgs(ushort intValue, ushort type, ushort index)
  class StringChangeEventArgs (line 123) | public class StringChangeEventArgs : EventArgs
    method StringChangeEventArgs (line 143) | public StringChangeEventArgs()
    method StringChangeEventArgs (line 153) | public StringChangeEventArgs(string stringValue, ushort type)
    method StringChangeEventArgs (line 165) | public StringChangeEventArgs(string stringValue, ushort type, ushort i...

FILE: src/PepperDash.Core/GenericRESTfulCommunications/Constants.cs
  class GenericRESTfulConstants (line 12) | public class GenericRESTfulConstants

FILE: src/PepperDash.Core/GenericRESTfulCommunications/GenericRESTfulClient.cs
  class GenericRESTfulClient (line 14) | public class GenericRESTfulClient
    method GenericRESTfulClient (line 32) | public GenericRESTfulClient()
    method SubmitRequest (line 46) | public void SubmitRequest(string url, ushort port, ushort requestType,...
    method SubmitRequestHttp (line 71) | private void SubmitRequestHttp(string url, ushort port, ushort request...
    method SubmitRequestHttps (line 129) | private void SubmitRequestHttps(string url, ushort port, ushort reques...
    method EncodeBase64 (line 182) | private string EncodeBase64(string username, string password)
    method OnBoolChange (line 211) | protected void OnBoolChange(bool state, ushort index, ushort type)
    method OnUshrtChange (line 228) | protected void OnUshrtChange(ushort value, ushort index, ushort type)
    method OnStringChange (line 245) | protected void OnStringChange(string value, ushort index, ushort type)

FILE: src/PepperDash.Core/JsonStandardObjects/EventArgs and Constants.cs
  class JsonStandardDeviceConstants (line 12) | public class JsonStandardDeviceConstants
  class DeviceChangeEventArgs (line 28) | public class DeviceChangeEventArgs : EventArgs
    method DeviceChangeEventArgs (line 48) | public DeviceChangeEventArgs()
    method DeviceChangeEventArgs (line 58) | public DeviceChangeEventArgs(DeviceConfig device, ushort type)
    method DeviceChangeEventArgs (line 70) | public DeviceChangeEventArgs(DeviceConfig device, ushort type, ushort ...

FILE: src/PepperDash.Core/JsonStandardObjects/JsonToSimplDevice.cs
  class DeviceConfig (line 12) | public class DeviceConfig
    method DeviceConfig (line 51) | public DeviceConfig()
    method Initialize (line 64) | public void Initialize(string uniqueID, string deviceKey)
    method OnBoolChange (line 123) | protected void OnBoolChange(bool state, ushort index, ushort type)
    method OnUshrtChange (line 140) | protected void OnUshrtChange(ushort state, ushort index, ushort type)
    method OnStringChange (line 157) | protected void OnStringChange(string value, ushort index, ushort type)
    method OnObjectChange (line 174) | protected void OnObjectChange(DeviceConfig device, ushort index, ushor...

FILE: src/PepperDash.Core/JsonStandardObjects/JsonToSimplDeviceConfig.cs
  class ComParamsConfig (line 53) | public class ComParamsConfig
    method ComParamsConfig (line 109) | public ComParamsConfig()
  class TcpSshPropertiesConfig (line 118) | public class TcpSshPropertiesConfig
    method TcpSshPropertiesConfig (line 162) | public TcpSshPropertiesConfig()
  class ControlConfig (line 171) | public class ControlConfig
    method ControlConfig (line 203) | public ControlConfig()
  class PropertiesConfig (line 213) | public class PropertiesConfig
    method PropertiesConfig (line 241) | public PropertiesConfig()
  class RootObject (line 250) | public class RootObject

FILE: src/PepperDash.Core/JsonToSimpl/Constants.cs
  class JsonToSimplConstants (line 12) | public class JsonToSimplConstants
  class SPlusValueWrapper (line 89) | public class SPlusValueWrapper
    method SPlusValueWrapper (line 111) | public SPlusValueWrapper() {}
    method SPlusValueWrapper (line 118) | public SPlusValueWrapper(SPlusType type, ushort index)
  type SPlusType (line 128) | public enum SPlusType

FILE: src/PepperDash.Core/JsonToSimpl/Global.cs
  class J2SGlobal (line 15) | public class J2SGlobal
    method AddMaster (line 29) | public static void AddMaster(JsonToSimplMaster master)
    method GetMasterByFile (line 58) | public static JsonToSimplMaster GetMasterByFile(string file)

FILE: src/PepperDash.Core/JsonToSimpl/JsonToSimplArrayLookupChild.cs
  class JsonToSimplArrayLookupChild (line 11) | public class JsonToSimplArrayLookupChild : JsonToSimplChildObjectBase
    method Initialize (line 33) | public void Initialize(string file, string key, string pathPrefix, str...
    method InitializeWithAppend (line 52) | public void InitializeWithAppend(string file, string key, string pathP...
    method GetFullPath (line 70) | protected override string GetFullPath(string path)
    method ProcessAll (line 83) | public override void ProcessAll()
    method GetPathAppend (line 93) | string GetPathAppend(string a)
    method FindInArray (line 113) | bool FindInArray()

FILE: src/PepperDash.Core/JsonToSimpl/JsonToSimplChildObjectBase.cs
  class JsonToSimplChildObjectBase (line 11) | public abstract class JsonToSimplChildObjectBase : IKeyed
    method Initialize (line 82) | public void Initialize(string masterUniqueId, string key, string pathP...
    method SetPathPrefix (line 102) | public void SetPathPrefix(string pathPrefix)
    method SetBoolPath (line 109) | public void SetBoolPath(ushort index, string path)
    method SetUshortPath (line 119) | public void SetUshortPath(ushort index, string path)
    method SetStringPath (line 129) | public void SetStringPath(ushort index, string path)
    method ProcessAll (line 140) | public virtual void ProcessAll()
    method ProcessBoolPath (line 165) | void ProcessBoolPath(ushort index)
    method ProcessUshortPath (line 176) | void ProcessUshortPath(ushort index) {
    method ProcessStringPath (line 190) | void ProcessStringPath(ushort index)
    method Process (line 207) | bool Process(string path, out string response)
    method UpdateInputsForMaster (line 259) | public void UpdateInputsForMaster()
    method USetBoolValue (line 286) | public void USetBoolValue(ushort key, ushort theValue)
    method SetBoolValue (line 299) | public void SetBoolValue(ushort key, bool theValue)
    method SetUShortValue (line 313) | public void SetUShortValue(ushort key, ushort theValue)
    method SetStringValue (line 327) | public void SetStringValue(ushort key, string theValue)
    method SetValueOnMaster (line 341) | public void SetValueOnMaster(string keyPath, JValue valueToSave)
    method GetFullPath (line 362) | protected virtual string GetFullPath(string path)
    method OnBoolChange (line 376) | protected void OnBoolChange(bool state, ushort index, ushort type)
    method OnUShortChange (line 394) | protected void OnUShortChange(ushort state, ushort index, ushort type)
    method OnStringChange (line 411) | protected void OnStringChange(string value, ushort index, ushort type)

FILE: src/PepperDash.Core/JsonToSimpl/JsonToSimplFileMaster.cs
  class JsonToSimplFileMaster (line 15) | public class JsonToSimplFileMaster : JsonToSimplMaster
    method JsonToSimplFileMaster (line 51) | public JsonToSimplFileMaster()
    method EvaluateFile (line 58) | public void EvaluateFile(string filepath)
    method setDebugLevel (line 200) | public void setDebugLevel(uint level)
    method Save (line 208) | public override void Save()

FILE: src/PepperDash.Core/JsonToSimpl/JsonToSimplFixedPathObject.cs
  class JsonToSimplFixedPathObject (line 8) | public class JsonToSimplFixedPathObject : JsonToSimplChildObjectBase
    method JsonToSimplFixedPathObject (line 13) | public JsonToSimplFixedPathObject()

FILE: src/PepperDash.Core/JsonToSimpl/JsonToSimplGenericMaster.cs
  class JsonToSimplGenericMaster (line 11) | public class JsonToSimplGenericMaster : JsonToSimplMaster
    method JsonToSimplGenericMaster (line 33) | public JsonToSimplGenericMaster()
    method LoadWithJson (line 41) | public void LoadWithJson(string json)
    method SetJsonWithoutEvaluating (line 66) | public void SetJsonWithoutEvaluating(string json)
    method Save (line 82) | public override void Save()

FILE: src/PepperDash.Core/JsonToSimpl/JsonToSimplMaster.cs
  class JsonToSimplMaster (line 14) | public abstract class JsonToSimplMaster : IKeyed
    method JsonToSimplMaster (line 103) | public JsonToSimplMaster()
    method Initialize (line 112) | public virtual void Initialize(string uniqueId)
    method AddChild (line 125) | public void AddChild(JsonToSimplChildObjectBase child)
    method AddUnsavedValue (line 136) | public void AddUnsavedValue(string path, JValue value)
    method Save (line 150) | public abstract void Save();
    class JsonFixes (line 156) | public static class JsonFixes
      method ParseObject (line 163) | public static JObject ParseObject(string json)
      method ParseArray (line 187) | public static JArray ParseArray(string json)
    method OnBoolChange (line 210) | protected void OnBoolChange(bool state, ushort index, ushort type)
    method OnUshrtChange (line 226) | protected void OnUshrtChange(ushort state, ushort index, ushort type)
    method OnStringChange (line 242) | protected void OnStringChange(string value, ushort index, ushort type)

FILE: src/PepperDash.Core/JsonToSimpl/JsonToSimplPortalFileMaster.cs
  class JsonToSimplPortalFileMaster (line 14) | public class JsonToSimplPortalFileMaster : JsonToSimplMaster
    method JsonToSimplPortalFileMaster (line 38) | public JsonToSimplPortalFileMaster()
    method EvaluateFile (line 45) | public void EvaluateFile(string portalFilepath)
    method GetActualFileInfoFromPath (line 118) | FileInfo GetActualFileInfoFromPath(string path)
    method setDebugLevel (line 134) | public void setDebugLevel(uint level)
    method Save (line 142) | public override void Save()

FILE: src/PepperDash.Core/Logging/CrestronEnricher.cs
  class CrestronEnricher (line 15) | public class CrestronEnricher : ILogEventEnricher
    method CrestronEnricher (line 19) | static CrestronEnricher()
    method Enrich (line 36) | public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propert...

FILE: src/PepperDash.Core/Logging/Debug.cs
  class Debug (line 23) | public static class Debug
    method Debug (line 128) | static Debug()
    method UpdateLoggerConfiguration (line 251) | public static void UpdateLoggerConfiguration(LoggerConfiguration config)
    method ResetLoggerConfiguration (line 261) | public static void ResetLoggerConfiguration()
    method GetStoredLogEventLevel (line 268) | private static LogEventLevel GetStoredLogEventLevel(string levelStoreKey)
    method GetVersion (line 300) | private static void GetVersion()
    method CrestronEnvironment_ProgramStatusEventHandler (line 325) | static void CrestronEnvironment_ProgramStatusEventHandler(eProgramStat...
    method SetDebugFromConsole (line 349) | public static void SetDebugFromConsole(string levelString)
    method SetDebugLevel (line 464) | public static void SetDebugLevel(uint level)
    method SetDebugLevel (line 481) | public static void SetDebugLevel(LogEventLevel level)
    method SetWebSocketMinimumDebugLevel (line 501) | public static void SetWebSocketMinimumDebugLevel(LogEventLevel level)
    method SetErrorLogMinimumDebugLevel (line 516) | public static void SetErrorLogMinimumDebugLevel(LogEventLevel level)
    method SetFileMinimumDebugLevel (line 536) | public static void SetFileMinimumDebugLevel(LogEventLevel level)
    method SetDoNotLoadOnNextBootFromConsole (line 560) | public static void SetDoNotLoadOnNextBootFromConsole(string stateString)
    method SetDebugFilterFromConsole (line 585) | public static void SetDebugFilterFromConsole(string items)
    method SetDeviceDebugSettings (line 669) | public static void SetDeviceDebugSettings(string deviceKey, object set...
    method GetDeviceDebugSettingsForKey (line 683) | public static object GetDeviceDebugSettingsForKey(string deviceKey)
    method SetDoNotLoadConfigOnNextBoot (line 692) | public static void SetDoNotLoadConfigOnNextBoot(bool state)
    method ShowDebugLog (line 705) | public static void ShowDebugLog(string s)
    method LogMessage (line 722) | public static void LogMessage(Exception ex, string message, IKeyed dev...
    method LogMessage (line 737) | public static void LogMessage(LogEventLevel level, string message, IKe...
    method LogMessage (line 751) | public static void LogMessage(LogEventLevel level, string message, par...
    method LogMessage (line 759) | public static void LogMessage(LogEventLevel level, Exception ex, strin...
    method LogMessage (line 767) | public static void LogMessage(LogEventLevel level, IKeyed keyed, strin...
    method LogMessage (line 775) | public static void LogMessage(LogEventLevel level, Exception ex, IKeye...
    method LogVerbose (line 787) | public static void LogVerbose(IKeyed keyed, string message, params obj...
    method LogVerbose (line 798) | public static void LogVerbose(Exception ex, IKeyed keyed, string messa...
    method LogVerbose (line 809) | public static void LogVerbose(string message, params object[] args)
    method LogVerbose (line 817) | public static void LogVerbose(Exception ex, string message, params obj...
    method LogDebug (line 825) | public static void LogDebug(IKeyed keyed, string message, params objec...
    method LogDebug (line 836) | public static void LogDebug(Exception ex, IKeyed keyed, string message...
    method LogDebug (line 847) | public static void LogDebug(string message, params object[] args)
    method LogDebug (line 855) | public static void LogDebug(Exception ex, string message, params objec...
    method LogInformation (line 863) | public static void LogInformation(IKeyed keyed, string message, params...
    method LogInformation (line 874) | public static void LogInformation(Exception ex, IKeyed keyed, string m...
    method LogInformation (line 885) | public static void LogInformation(string message, params object[] args)
    method LogInformation (line 893) | public static void LogInformation(Exception ex, string message, params...
    method LogWarning (line 901) | public static void LogWarning(IKeyed keyed, string message, params obj...
    method LogWarning (line 912) | public static void LogWarning(Exception ex, IKeyed keyed, string messa...
    method LogWarning (line 923) | public static void LogWarning(string message, params object[] args)
    method LogWarning (line 931) | public static void LogWarning(Exception ex, string message, params obj...
    method LogError (line 939) | public static void LogError(IKeyed keyed, string message, params objec...
    method LogError (line 950) | public static void LogError(Exception ex, IKeyed keyed, string message...
    method LogError (line 961) | public static void LogError(string message, params object[] args)
    method LogError (line 969) | public static void LogError(Exception ex, string message, params objec...
    method LogFatal (line 977) | public static void LogFatal(IKeyed keyed, string message, params objec...
    method LogFatal (line 988) | public static void LogFatal(Exception ex, IKeyed keyed, string message...
    method LogFatal (line 999) | public static void LogFatal(string message, params object[] args)
    method LogFatal (line 1007) | public static void LogFatal(Exception ex, string message, params objec...
    method LogMessage (line 1015) | private static void LogMessage(uint level, string format, params objec...
    method LogMessage (line 1024) | private static void LogMessage(uint level, IKeyed keyed, string format...
    method Console (line 1041) | [Obsolete("Use LogMessage methods. Will be removed in 2.2.0 and later ...
    method Console (line 1059) | [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later ...
    method Console (line 1072) | [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later ...
    method Console (line 1082) | [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later ...
    method ConsoleWithLog (line 1094) | [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later ...
    method ConsoleWithLog (line 1110) | [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later ...
    method LogError (line 1124) | [Obsolete("Use LogMessage methods, Will be removed in 2.2.0 and later ...
    method SaveMemoryOnTimeout (line 1144) | static void SaveMemoryOnTimeout()
    method SaveMemory (line 1160) | static void SaveMemory()
    method LoadMemory (line 1181) | static void LoadMemory()
    method GetMemoryFileName (line 1205) | static string GetMemoryFileName()
    type ErrorLogLevel (line 1219) | public enum ErrorLogLevel

FILE: src/PepperDash.Core/Logging/DebugConsoleSink.cs
  class DebugConsoleSink (line 17) | public class DebugConsoleSink : ILogEventSink
    method Emit (line 24) | public void Emit(LogEvent logEvent)
    method DebugConsoleSink (line 44) | public DebugConsoleSink(ITextFormatter formatProvider )
  class DebugConsoleSinkExtensions (line 51) | public static class DebugConsoleSinkExtensions
    method DebugConsoleSink (line 56) | public static LoggerConfiguration DebugConsoleSink(

FILE: src/PepperDash.Core/Logging/DebugContext.cs
  class DebugContext (line 14) | [Obsolete("DebugContext is no longer supported and will be removed in a ...
    method GetDebugContext (line 45) | public static DebugContext GetDebugContext(string key)
    method DebugContext (line 59) | public DebugContext() { }
    method DebugContext (line 61) | DebugContext(string key)
    method CrestronEnvironment_ProgramStatusEventHandler (line 81) | void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEvent...
    method SetDebugFromConsole (line 102) | public void SetDebugFromConsole(string levelString)
    method SetDebugLevel (line 127) | public void SetDebugLevel(int level)
    method Console (line 146) | public void Console(uint level, string format, params object[] items)
    method Console (line 156) | public void Console(uint level, IKeyed dev, string format, params obje...
    method Console (line 170) | public void Console(uint level, IKeyed dev, Debug.ErrorLogLevel errorL...
    method Console (line 188) | public void Console(uint level, Debug.ErrorLogLevel errorLogLevel,
    method LogError (line 207) | public void LogError(Debug.ErrorLogLevel errorLogLevel, string str)
    method SaveMemoryOnTimeout (line 227) | void SaveMemoryOnTimeout()
    method SaveMemory (line 242) | void SaveMemory()
    method LoadMemory (line 255) | void LoadMemory()
    method GetMemoryFileName (line 278) | string GetMemoryFileName()
  class DebugContextSaveData (line 287) | public class DebugContextSaveData

FILE: src/PepperDash.Core/Logging/DebugCrestronLoggerSink.cs
  class DebugCrestronLoggerSink (line 11) | public class DebugCrestronLoggerSink : ILogEventSink
    method Emit (line 16) | public void Emit(LogEvent logEvent)
    method DebugCrestronLoggerSink (line 30) | public DebugCrestronLoggerSink()

FILE: src/PepperDash.Core/Logging/DebugErrorLogSink.cs
  class DebugErrorLogSink (line 17) | public class DebugErrorLogSink : ILogEventSink
    method Emit (line 33) | public void Emit(LogEvent logEvent)
    method DebugErrorLogSink (line 66) | public DebugErrorLogSink(ITextFormatter formatter = null)

FILE: src/PepperDash.Core/Logging/DebugExtensions.cs
  class DebugExtensions (line 7) | public static class DebugExtensions
    method LogException (line 12) | public static void LogException(this IKeyed device, Exception ex, stri...
    method LogVerbose (line 20) | public static void LogVerbose(this IKeyed device, Exception ex, string...
    method LogVerbose (line 28) | public static void LogVerbose(this IKeyed device, string message, para...
    method LogDebug (line 36) | public static void LogDebug(this IKeyed device, Exception ex, string m...
    method LogDebug (line 44) | public static void LogDebug(this IKeyed device, string message, params...
    method LogInformation (line 52) | public static void LogInformation(this IKeyed device, Exception ex, st...
    method LogInformation (line 60) | public static void LogInformation(this IKeyed device, string message, ...
    method LogWarning (line 68) | public static void LogWarning(this IKeyed device, Exception ex, string...
    method LogWarning (line 76) | public static void LogWarning(this IKeyed device, string message, para...
    method LogError (line 84) | public static void LogError(this IKeyed device, Exception ex, string m...
    method LogError (line 92) | public static void LogError(this IKeyed device, string message, params...
    method LogFatal (line 100) | public static void LogFatal(this IKeyed device, Exception ex, string m...
    method LogFatal (line 108) | public static void LogFatal(this IKeyed device, string message, params...

FILE: src/PepperDash.Core/Logging/DebugMemory.cs
  class DebugContextCollection (line 10) | public class DebugContextCollection
    method DebugContextCollection (line 29) | public DebugContextCollection()
    method SetLevel (line 45) | public void SetLevel(string contextKey, int level)
    method GetOrCreateItem (line 60) | public DebugContextItem GetOrCreateItem(string contextKey)
    method SetDebugSettingsForKey (line 77) | public void SetDebugSettingsForKey(string deviceKey, object settings)
    method GetDebugSettingsForKey (line 104) | public object GetDebugSettingsForKey(string deviceKey)
  class DebugContextItem (line 113) | public class DebugContextItem

FILE: src/PepperDash.Core/Logging/DebugWebsocketSink.cs
  class DebugWebsocketSink (line 30) | public class DebugWebsocketSink : ILogEventSink
    method DebugWebsocketSink (line 86) | public DebugWebsocketSink(ITextFormatter formatProvider)
    method CreateCert (line 108) | private static void CreateCert()
    method Emit (line 198) | public void Emit(LogEvent logEvent)
    method StartServerAndSetPort (line 216) | public void StartServerAndSetPort(int port)
    method LoadOrRecreateCert (line 224) | private static X509Certificate2 LoadOrRecreateCert(string certPath, st...
    method LoadCertFromBouncyCastle (line 250) | private static X509Certificate2 LoadCertFromBouncyCastle(string certPa...
    method Start (line 281) | private void Start(int port, string certPath = "", string certPassword...
    method StopServer (line 324) | public void StopServer()
    method WriteWebSocketInternalLog (line 369) | private static void WriteWebSocketInternalLog(LogData data, string sup...
  class DebugWebsocketSinkExtensions (line 391) | public static class DebugWebsocketSinkExtensions
    method DebugWebsocketSink (line 396) | public static LoggerConfiguration DebugWebsocketSink(
  class DebugClient (line 407) | public class DebugClient : WebSocketBehavior
    method DebugClient (line 426) | public DebugClient()
    method OnOpen (line 431) | protected override void OnOpen()
    method OnMessage (line 441) | protected override void OnMessage(MessageEventArgs e)
    method OnClose (line 448) | protected override void OnClose(CloseEventArgs e)
    method OnError (line 456) | protected override void OnError(WebSocketSharp.ErrorEventArgs e)

FILE: src/PepperDash.Core/Network/DiscoveryThings.cs
  class NetworkComm (line 12) | public static class NetworkComm
    method NetworkComm (line 17) | static NetworkComm()

FILE: src/PepperDash.Core/PasswordManagement/Config.cs
  class PasswordConfig (line 12) | public class PasswordConfig
    method PasswordConfig (line 21) | public PasswordConfig()

FILE: src/PepperDash.Core/PasswordManagement/Constants.cs
  class PasswordManagementConstants (line 12) | public class PasswordManagementConstants

FILE: src/PepperDash.Core/PasswordManagement/PasswordClient.cs
  class PasswordClient (line 8) | public class PasswordClient
    method PasswordClient (line 39) | public PasswordClient()
    method Initialize (line 47) | public void Initialize()
    method GetPasswordByIndex (line 65) | public void GetPasswordByIndex(ushort key)
    method ValidatePassword (line 90) | public void ValidatePassword(string password)
    method BuildPassword (line 111) | public void BuildPassword(string data)
    method ClearPassword (line 123) | public void ClearPassword()
    method OnBoolChange (line 135) | protected void OnBoolChange(bool state, ushort index, ushort type)
    method OnUshrtChange (line 152) | protected void OnUshrtChange(ushort value, ushort index, ushort type)
    method OnStringChange (line 169) | protected void OnStringChange(string value, ushort index, ushort type)
    method PasswordManager_PasswordChange (line 185) | protected void PasswordManager_PasswordChange(object sender, StringCha...

FILE: src/PepperDash.Core/PasswordManagement/PasswordManager.cs
  class PasswordManager (line 10) | public class PasswordManager
    method PasswordManager (line 50) | public PasswordManager()
    method Initialize (line 58) | public void Initialize()
    method UpdatePassword (line 77) | public void UpdatePassword(ushort key, string password)
    method PasswordTimerElapsed (line 119) | private void PasswordTimerElapsed()
    method PasswordTimerMs (line 161) | public void PasswordTimerMs(ushort time)
    method ListPasswords (line 169) | public void ListPasswords()
    method OnBoolChange (line 185) | protected void OnBoolChange(bool state, ushort index, ushort type)
    method OnUshrtChange (line 202) | protected void OnUshrtChange(ushort value, ushort index, ushort type)
    method OnStringChange (line 219) | protected void OnStringChange(string value, ushort index, ushort type)
    method OnPasswordChange (line 236) | protected void OnPasswordChange(string value, ushort index, ushort type)

FILE: src/PepperDash.Core/SystemInfo/EventArgs and Constants.cs
  class SystemInfoConstants (line 12) | public class SystemInfoConstants
  class ProcessorChangeEventArgs (line 74) | public class ProcessorChangeEventArgs : EventArgs
    method ProcessorChangeEventArgs (line 92) | public ProcessorChangeEventArgs()
    method ProcessorChangeEventArgs (line 100) | public ProcessorChangeEventArgs(ProcessorInfo processor, ushort type)
    method ProcessorChangeEventArgs (line 109) | public ProcessorChangeEventArgs(ProcessorInfo processor, ushort type, ...
  class EthernetChangeEventArgs (line 120) | public class EthernetChangeEventArgs : EventArgs
    method EthernetChangeEventArgs (line 138) | public EthernetChangeEventArgs()
    method EthernetChangeEventArgs (line 148) | public EthernetChangeEventArgs(EthernetInfo ethernet, ushort type)
    method EthernetChangeEventArgs (line 160) | public EthernetChangeEventArgs(EthernetInfo ethernet, ushort type, ush...
  class ControlSubnetChangeEventArgs (line 171) | public class ControlSubnetChangeEventArgs : EventArgs
    method ControlSubnetChangeEventArgs (line 189) | public ControlSubnetChangeEventArgs()
    method ControlSubnetChangeEventArgs (line 197) | public ControlSubnetChangeEventArgs(ControlSubnetInfo controlSubnet, u...
    method ControlSubnetChangeEventArgs (line 206) | public ControlSubnetChangeEventArgs(ControlSubnetInfo controlSubnet, u...
  class ProgramChangeEventArgs (line 217) | public class ProgramChangeEventArgs : EventArgs
    method ProgramChangeEventArgs (line 235) | public ProgramChangeEventArgs()
    method ProgramChangeEventArgs (line 245) | public ProgramChangeEventArgs(ProgramInfo program, ushort type)
    method ProgramChangeEventArgs (line 257) | public ProgramChangeEventArgs(ProgramInfo program, ushort type, ushort...

FILE: src/PepperDash.Core/SystemInfo/SystemInfoConfig.cs
  class ProcessorInfo (line 12) | public class ProcessorInfo
    method ProcessorInfo (line 58) | public ProcessorInfo()
  class EthernetInfo (line 67) | public class EthernetInfo
    method EthernetInfo (line 113) | public EthernetInfo()
  class ControlSubnetInfo (line 122) | public class ControlSubnetInfo
    method ControlSubnetInfo (line 152) | public ControlSubnetInfo()
  class ProgramInfo (line 161) | public class ProgramInfo
    method ProgramInfo (line 199) | public ProgramInfo()

FILE: src/PepperDash.Core/SystemInfo/SystemInfoToSimpl.cs
  class SystemInfoToSimpl (line 12) | public class SystemInfoToSimpl
    method SystemInfoToSimpl (line 43) | public SystemInfoToSimpl()
    method GetProcessorInfo (line 51) | public void GetProcessorInfo()
    method GetEthernetInfo (line 106) | public void GetEthernetInfo()
    method GetControlSubnetInfo (line 167) | public void GetControlSubnetInfo()
    method GetProgramInfoByIndex (line 212) | public void GetProgramInfoByIndex(ushort index)
    method RefreshProcessorUptime (line 272) | public void RefreshProcessorUptime()
    method RefreshProgramUptimeByIndex (line 296) | public void RefreshProgramUptimeByIndex(int index)
    method SendConsoleCommand (line 320) | public void SendConsoleCommand(string cmd)
    method ParseConsoleResponse (line 344) | private string ParseConsoleResponse(string data, string line, string d...
    method OnBoolChange (line 374) | protected void OnBoolChange(bool state, ushort index, ushort type)
    method OnStringChange (line 391) | protected void OnStringChange(string value, ushort index, ushort type)
    method OnProcessorChange (line 408) | protected void OnProcessorChange(ProcessorInfo processor, ushort index...
    method OnEthernetInfoChange (line 425) | protected void OnEthernetInfoChange(EthernetInfo ethernet, ushort inde...
    method OnControlSubnetInfoChange (line 442) | protected void OnControlSubnetInfoChange(ControlSubnetInfo ethernet, u...
    method OnProgramChange (line 459) | protected void OnProgramChange(ProgramInfo program, ushort index, usho...

FILE: src/PepperDash.Core/Web/BouncyCertificate.cs
  class BouncyCertificate (line 28) | internal class BouncyCertificate
    method LoadCertificate (line 31) | public X509Certificate2 LoadCertificate(string issuerFileName, string ...
    method IssueCertificate (line 41) | public X509Certificate2 IssueCertificate(string subjectName, X509Certi...
    method CreateCertificateAuthorityCertificate (line 65) | public X509Certificate2 CreateCertificateAuthorityCertificate(string s...
    method CreateSelfSignedCertificate (line 90) | public X509Certificate2 CreateSelfSignedCertificate(string subjectName...
    method GetSecureRandom (line 112) | private SecureRandom GetSecureRandom()
    method GenerateCertificate (line 122) | private X509Certificate GenerateCertificate(SecureRandom random,
    method GenerateSerialNumber (line 181) | private BigInteger GenerateSerialNumber(SecureRandom random)
    method GenerateKeyPair (line 195) | private AsymmetricCipherKeyPair GenerateKeyPair(SecureRandom random, i...
    method AddAuthorityKeyIdentifier (line 216) | private void AddAuthorityKeyIdentifier(X509V3CertificateGenerator cert...
    method AddSubjectAlternativeNames (line 236) | private void AddSubjectAlternativeNames(X509V3CertificateGenerator cer...
    method AddExtendedKeyUsage (line 252) | private void AddExtendedKeyUsage(X509V3CertificateGenerator certificat...
    method AddBasicConstraints (line 263) | private void AddBasicConstraints(X509V3CertificateGenerator certificat...
    method AddSubjectKeyIdentifier (line 275) | private void AddSubjectKeyIdentifier(X509V3CertificateGenerator certif...
    method ConvertCertificate (line 285) | private X509Certificate2 ConvertCertificate(X509Certificate certificate,
    method WriteCertificate (line 320) | public void WriteCertificate(X509Certificate2 certificate, string outp...
    method AddCertToStore (line 350) | public bool AddCertToStore(X509Certificate2 cert, System.Security.Cryp...

FILE: src/PepperDash.Core/Web/RequestHandlers/DefaultRequestHandler.cs
  class DefaultRequestHandler (line 8) | public class DefaultRequestHandler : WebApiBaseRequestHandler
    method DefaultRequestHandler (line 13) | public DefaultRequestHandler()

FILE: src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestAsyncHandler.cs
  class WebApiBaseRequestAsyncHandler (line 8) | public abstract class WebApiBaseRequestAsyncHandler:IHttpCwsHandler
    method WebApiBaseRequestAsyncHandler (line 16) | protected WebApiBaseRequestAsyncHandler(bool enableCors)
    method WebApiBaseRequestAsyncHandler (line 37) | protected WebApiBaseRequestAsyncHandler()
    method HandleConnect (line 46) | protected virtual async Task HandleConnect(HttpCwsContext context)
    method HandleDelete (line 57) | protected virtual async Task HandleDelete(HttpCwsContext context)
    method HandleGet (line 68) | protected virtual async Task HandleGet(HttpCwsContext context)
    method HandleHead (line 79) | protected virtual async Task HandleHead(HttpCwsContext context)
    method HandleOptions (line 90) | protected virtual async Task HandleOptions(HttpCwsContext context)
    method HandlePatch (line 101) | protected virtual async Task HandlePatch(HttpCwsContext context)
    method HandlePost (line 112) | protected virtual async Task HandlePost(HttpCwsContext context)
    method HandlePut (line 123) | protected virtual async Task HandlePut(HttpCwsContext context)
    method HandleTrace (line 134) | protected virtual async Task HandleTrace(HttpCwsContext context)
    method ProcessRequest (line 148) | public void ProcessRequest(HttpCwsContext context)

FILE: src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestHandler.cs
  class WebApiBaseRequestHandler (line 10) | public abstract class WebApiBaseRequestHandler : IHttpCwsHandler
    method WebApiBaseRequestHandler (line 18) | protected WebApiBaseRequestHandler(bool enableCors)
    method WebApiBaseRequestHandler (line 39) | protected WebApiBaseRequestHandler()
    method HandleConnect (line 48) | protected virtual void HandleConnect(HttpCwsContext context)
    method HandleDelete (line 59) | protected virtual void HandleDelete(HttpCwsContext context)
    method HandleGet (line 70) | protected virtual void HandleGet(HttpCwsContext context)
    method HandleHead (line 81) | protected virtual void HandleHead(HttpCwsContext context)
    method HandleOptions (line 92) | protected virtual void HandleOptions(HttpCwsContext context)
    method HandlePatch (line 103) | protected virtual void HandlePatch(HttpCwsContext context)
    method HandlePost (line 114) | protected virtual void HandlePost(HttpCwsContext context)
    method HandlePut (line 125) | protected virtual void HandlePut(HttpCwsContext context)
    method HandleTrace (line 136) | protected virtual void HandleTrace(HttpCwsContext context)
    method ProcessRequest (line 150) | public void ProcessRequest(HttpCwsContext context)

FILE: src/PepperDash.Core/Web/WebApiServer.cs
  class WebApiServer (line 16) | public class WebApiServer : IKeyName
    method WebApiServer (line 68) | public WebApiServer()
    method WebApiServer (line 78) | public WebApiServer(string key, string basePath)
    method WebApiServer (line 89) | public WebApiServer(string key, string name, string basePath)
    method CrestronEnvironment_ProgramStatusEventHandler (line 110) | void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEvent...
    method CrestronEnvironment_EthernetEventHandler (line 123) | void CrestronEnvironment_EthernetEventHandler(EthernetEventArgs ethern...
    method Initialize (line 140) | public void Initialize(string key, string basePath)
    method AddRoute (line 149) | public void AddRoute(HttpCwsRoute route)
    method RemoveRoute (line 165) | public void RemoveRoute(HttpCwsRoute route)
    method SetFallbackHandler (line 181) | public void SetFallbackHandler(IHttpCwsHandler handler)
    method GetRouteCollection (line 195) | public HttpCwsRouteCollection GetRouteCollection()
    method Start (line 203) | public void Start()
    method Stop (line 239) | public void Stop()
    method ReceivedRequestEventHandler (line 277) | public void ReceivedRequestEventHandler(object sender, HttpCwsRequestE...

FILE: src/PepperDash.Core/WebApi/Presets/Preset.cs
  class Preset (line 8) | public class Preset
    method Preset (line 43) | public Preset()
  class PresetReceivedEventArgs (line 54) | public class PresetReceivedEventArgs : EventArgs
    method PresetReceivedEventArgs (line 74) | public PresetReceivedEventArgs() { }
    method PresetReceivedEventArgs (line 81) | public PresetReceivedEventArgs(Preset preset, bool success)

FILE: src/PepperDash.Core/WebApi/Presets/User.cs
  class User (line 12) | public class User
  class UserReceivedEventArgs (line 39) | public class UserReceivedEventArgs : EventArgs
    method UserReceivedEventArgs (line 59) | public UserReceivedEventArgs() { }
    method UserReceivedEventArgs (line 66) | public UserReceivedEventArgs(User user, bool success)
  class UserAndRoomMessage (line 76) | public class UserAndRoomMessage

FILE: src/PepperDash.Core/WebApi/Presets/WebApiPasscodeClient.cs
  class WebApiPasscodeClient (line 16) | [Obsolete("WebApiPasscodeClient is no longer supported and will be remov...
    method WebApiPasscodeClient (line 54) | public WebApiPasscodeClient()
    method Initialize (line 65) | public void Initialize(string key, string jsonMasterKey, string urlBas...
    method GetUserForPasscode (line 84) | public void GetUserForPasscode(string passcode)
    method GetPresetForThisUser (line 125) | public void GetPresetForThisUser(int roomTypeId, int presetNumber)
    method LoadDefaultPresetData (line 194) | void LoadDefaultPresetData()
    method SavePresetForThisUser (line 225) | public void SavePresetForThisUser(int roomTypeId, int presetNumber)
    method SaveCallback (line 245) | void SaveCallback(string json)

FILE: src/PepperDash.Core/XSigUtility/Serialization/IXSigSerialization.cs
  type IXSigSerialization (line 9) | public interface IXSigSerialization
    method Serialize (line 15) | IEnumerable<XSigToken> Serialize();
    method Deserialize (line 23) | T Deserialize<T>(IEnumerable<XSigToken> tokens) where T : class, IXSig...

FILE: src/PepperDash.Core/XSigUtility/Serialization/XSigSerializationException.cs
  class XSigSerializationException (line 8) | public class XSigSerializationException : Exception
    method XSigSerializationException (line 13) | public XSigSerializationException() { }
    method XSigSerializationException (line 19) | public XSigSerializationException(string message) : base(message) { }
    method XSigSerializationException (line 26) | public XSigSerializationException(string message, Exception inner) : b...

FILE: src/PepperDash.Core/XSigUtility/Tokens/XSigAnalogToken.cs
  class XSigAnalogToken (line 8) | public sealed class XSigAnalogToken : XSigToken, IFormattable
    method XSigAnalogToken (line 17) | public XSigAnalogToken(int index, ushort value)
    method GetBytes (line 47) | public override byte[] GetBytes()
    method GetTokenWithOffset (line 65) | public override XSigToken GetTokenWithOffset(int offset)
    method ToString (line 79) | public override string ToString()
    method ToString (line 93) | public string ToString(string format, IFormatProvider formatProvider)

FILE: src/PepperDash.Core/XSigUtility/Tokens/XSigDigitalToken.cs
  class XSigDigitalToken (line 8) | public sealed class XSigDigitalToken : XSigToken
    method XSigDigitalToken (line 17) | public XSigDigitalToken(int index, bool value)
    method GetBytes (line 47) | public override byte[] GetBytes()
    method GetTokenWithOffset (line 63) | public override XSigToken GetTokenWithOffset(int offset)
    method ToString (line 77) | public override string ToString()
    method ToString (line 90) | public string ToString(IFormatProvider formatProvider)

FILE: src/PepperDash.Core/XSigUtility/Tokens/XSigSerialToken.cs
  class XSigSerialToken (line 9) | public sealed class XSigSerialToken : XSigToken
    method XSigSerialToken (line 18) | public XSigSerialToken(int index, string value)
    method GetBytes (line 48) | public override byte[] GetBytes()
    method GetTokenWithOffset (line 69) | public override XSigToken GetTokenWithOffset(int offset)
    method ToString (line 83) | public override string ToString()

FILE: src/PepperDash.Core/XSigUtility/Tokens/XSigToken.cs
  class XSigToken (line 6) | public abstract class XSigToken
    method XSigToken (line 14) | protected XSigToken(int index)
    method GetBytes (line 36) | public abstract byte[] GetBytes();
    method GetTokenWithOffset (line 43) | public abstract XSigToken GetTokenWithOffset(int offset);

FILE: src/PepperDash.Core/XSigUtility/Tokens/XSigTokenType.cs
  type XSigTokenType (line 6) | public enum XSigTokenType

FILE: src/PepperDash.Core/XSigUtility/XSigHelpers.cs
  class XSigHelpers (line 30) | public static class XSigHelpers
    method ClearOutputs (line 36) | public static byte[] ClearOutputs()
    method SendStatus (line 45) | public static byte[] SendStatus()
    method GetBytes (line 58) | public static byte[] GetBytes(IXSigSerialization xSigSerialization)
    method GetBytes (line 72) | public static byte[] GetBytes(IXSigSerialization xSigSerialization, in...
    method GetBytes (line 94) | public static byte[] GetBytes(int index, bool value)
    method GetBytes (line 109) | public static byte[] GetBytes(int index, int offset, bool value)
    method GetBytes (line 123) | public static byte[] GetBytes(int startIndex, bool[] values)
    method GetBytes (line 138) | public static byte[] GetBytes(int startIndex, int offset, bool[] values)
    method GetBytes (line 158) | public static byte[] GetBytes(int index, ushort value)
    method GetBytes (line 173) | public static byte[] GetBytes(int index, int offset, ushort value)
    method GetBytes (line 187) | public static byte[] GetBytes(int startIndex, ushort[] values)
    method GetBytes (line 202) | public static byte[] GetBytes(int startIndex, int offset, ushort[] val...
    method GetBytes (line 222) | public static byte[] GetBytes(int index, string value)
    method GetBytes (line 237) | public static byte[] GetBytes(int index, int offset, string value)
    method GetBytes (line 251) | public static byte[] GetBytes(int startIndex, string[] values)
    method GetBytes (line 266) | public static byte[] GetBytes(int startIndex, int offset, string[] val...

FILE: src/PepperDash.Core/XSigUtility/XSigTokenStreamReader.cs
  class XSigTokenStreamReader (line 12) | public sealed class XSigTokenStreamReader : IDisposable
    method XSigTokenStreamReader (line 24) | public XSigTokenStreamReader(Stream stream)
    method XSigTokenStreamReader (line 34) | public XSigTokenStreamReader(Stream stream, bool leaveOpen)
    method TryReadUInt16BE (line 54) | public static bool TryReadUInt16BE(Stream stream, out ushort value)
    method ReadXSigToken (line 74) | public XSigToken ReadXSigToken()
    method ReadAllXSigTokens (line 126) | public IEnumerable<XSigToken> ReadAllXSigTokens()
    method DeserializeStream (line 141) | public T DeserializeStream<T>()
    method Dispose (line 150) | public void Dispose()

FILE: src/PepperDash.Core/XSigUtility/XSigTokenStreamWriter.cs
  class XSigTokenStreamWriter (line 13) | public sealed class XSigTokenStreamWriter : IDisposable
    method XSigTokenStreamWriter (line 25) | public XSigTokenStreamWriter(Stream stream)
    method XSigTokenStreamWriter (line 35) | public XSigTokenStreamWriter(Stream stream, bool leaveOpen)
    method WriteXSigData (line 53) | public void WriteXSigData(IXSigSerialization xSigSerialization)
    method WriteXSigData (line 66) | public void WriteXSigData(IXSigSerialization xSigSerialization, int of...
    method WriteXSigData (line 82) | public void WriteXSigData(XSigToken token)
    method WriteXSigData (line 95) | public void WriteXSigData(XSigToken token, int offset)
    method WriteXSigData (line 104) | public void WriteXSigData(XSigToken[] tokens)
    method WriteXSigData (line 113) | public void WriteXSigData(IEnumerable<XSigToken> tokens)
    method WriteXSigData (line 126) | public void WriteXSigData(IEnumerable<XSigToken> tokens, int offset)
    method Dispose (line 145) | public void Dispose()

FILE: src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs
  class BridgeApi (line 21) | [Obsolete("Will be removed in v3.0.0")]
    method BridgeApi (line 28) | protected BridgeApi(string key) :
    method BridgeApi (line 39) | protected BridgeApi(string key, string name) :
  class EiscApiAdvanced (line 49) | public class EiscApiAdvanced : BridgeApi, ICommunicationMonitor
    method EiscApiAdvanced (line 71) | public EiscApiAdvanced(DeviceConfig dc, BasicTriList eisc) :
    method CustomActivate (line 92) | public override bool CustomActivate()
    method Deactivate (line 101) | public override bool Deactivate()
    method LinkDevices (line 107) | private void LinkDevices()
    method RegisterEisc (line 138) | private void RegisterEisc()
    method LinkRooms (line 159) | public void LinkRooms()
    method AddJoinMap (line 186) | public void AddJoinMap(string deviceKey, JoinMapBaseAdvanced joinMap)
    method PrintJoinMaps (line 201) | public virtual void PrintJoinMaps()
    method MarkdownForBridge (line 215) | public virtual void MarkdownForBridge(string bridgeKey)
    method PrintJoinMapForDevice (line 230) | public void PrintJoinMapForDevice(string deviceKey)
    method MarkdownJoinMapForDevice (line 248) | public void MarkdownJoinMapForDevice(string deviceKey, string bridgeKey)
    method ExecuteJoinAction (line 268) | public void ExecuteJoinAction(uint join, string type, object state)
    method Eisc_SigChange (line 327) | protected void Eisc_SigChange(object currentDevice, SigEventArgs args)
  class EiscApiPropertiesConfig (line 373) | public class EiscApiPropertiesConfig
    class ApiDevicePropertiesConfig (line 397) | public class ApiDevicePropertiesConfig
    class ApiRoomPropertiesConfig (line 421) | public class ApiRoomPropertiesConfig
  class EiscApiAdvancedFactory (line 458) | public class EiscApiAdvancedFactory : EssentialsDeviceFactory<EiscApiAdv...
    method EiscApiAdvancedFactory (line 463) | public EiscApiAdvancedFactory()
    method BuildDevice (line 469) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs
  class BridgeHelper (line 11) | public static class BridgeHelper
    method PrintJoinMap (line 17) | public static void PrintJoinMap(string command)
    method JoinmapMarkdown (line 44) | public static void JoinmapMarkdown(string command)

FILE: src/PepperDash.Essentials.Core/Bridges/IBridge.cs
  type IBridgeAdvanced (line 8) | public interface IBridgeAdvanced
    method LinkToApi (line 17) | void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/AirMediaControllerJoinMap.cs
  class AirMediaControllerJoinMap (line 8) | public class AirMediaControllerJoinMap : JoinMapBaseAdvanced
    method AirMediaControllerJoinMap (line 98) | public AirMediaControllerJoinMap(uint joinStart)
    method AirMediaControllerJoinMap (line 108) | protected AirMediaControllerJoinMap(uint joinStart, Type type) : base(...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/AppleTvJoinMap.cs
  class AppleTvJoinMap (line 8) | public class AppleTvJoinMap : JoinMapBaseAdvanced
    method AppleTvJoinMap (line 63) | public AppleTvJoinMap(uint joinStart)
    method AppleTvJoinMap (line 73) | public AppleTvJoinMap(uint joinStart, Type type) : base(joinStart, type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/C2nRthsControllerJoinMap.cs
  class C2nRthsControllerJoinMap (line 8) | public class C2nRthsControllerJoinMap : JoinMapBaseAdvanced
    method C2nRthsControllerJoinMap (line 49) | public C2nRthsControllerJoinMap(uint joinStart)
    method C2nRthsControllerJoinMap (line 59) | protected C2nRthsControllerJoinMap(uint joinStart, Type type) : base(j...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/CameraControllerJoinMap.cs
  class CameraControllerJoinMap (line 8) | public class CameraControllerJoinMap : JoinMapBaseAdvanced
    method CameraControllerJoinMap (line 128) | public CameraControllerJoinMap(uint joinStart)
    method CameraControllerJoinMap (line 138) | protected CameraControllerJoinMap(uint joinStart, Type type) : base(jo...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/CenOdtOccupancySensorBaseJoinMap.cs
  class CenOdtOccupancySensorBaseJoinMap (line 8) | public class CenOdtOccupancySensorBaseJoinMap : JoinMapBaseAdvanced
    method CenOdtOccupancySensorBaseJoinMap (line 305) | public CenOdtOccupancySensorBaseJoinMap(uint joinStart)
    method CenOdtOccupancySensorBaseJoinMap (line 315) | protected CenOdtOccupancySensorBaseJoinMap(uint joinStart, Type type) ...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/DisplayControllerJoinMap.cs
  class DisplayControllerJoinMap (line 8) | public class DisplayControllerJoinMap : JoinMapBaseAdvanced
    method DisplayControllerJoinMap (line 119) | public DisplayControllerJoinMap(uint joinStart)
    method DisplayControllerJoinMap (line 129) | protected DisplayControllerJoinMap(uint joinStart, Type type) : base(j...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmBladeChassisControllerJoinMap.cs
  class DmBladeChassisControllerJoinMap (line 7) | public class DmBladeChassisControllerJoinMap : JoinMapBaseAdvanced {
    method DmBladeChassisControllerJoinMap (line 98) | public DmBladeChassisControllerJoinMap(uint joinStart)
    method DmBladeChassisControllerJoinMap (line 108) | protected DmBladeChassisControllerJoinMap(uint joinStart, Type type) :...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmChassisControllerJoinMap.cs
  class DmChassisControllerJoinMap (line 8) | public class DmChassisControllerJoinMap : JoinMapBaseAdvanced
    method DmChassisControllerJoinMap (line 245) | public DmChassisControllerJoinMap(uint joinStart)
    method DmChassisControllerJoinMap (line 255) | protected DmChassisControllerJoinMap(uint joinStart, Type type) : base...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmRmcControllerJoinMap.cs
  class DmRmcControllerJoinMap (line 8) | public class DmRmcControllerJoinMap : JoinMapBaseAdvanced
    method DmRmcControllerJoinMap (line 128) | public DmRmcControllerJoinMap(uint joinStart)
    method DmRmcControllerJoinMap (line 138) | protected DmRmcControllerJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmTxControllerJoinMap.cs
  class DmTxControllerJoinMap (line 8) | public class DmTxControllerJoinMap : JoinMapBaseAdvanced
    method DmTxControllerJoinMap (line 135) | public DmTxControllerJoinMap(uint joinStart)
    method DmTxControllerJoinMap (line 145) | protected DmTxControllerJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs
  class DmpsAudioOutputControllerJoinMap (line 8) | public class DmpsAudioOutputControllerJoinMap : JoinMapBaseAdvanced
    method DmpsAudioOutputControllerJoinMap (line 274) | public DmpsAudioOutputControllerJoinMap(uint joinStart)
    method DmpsAudioOutputControllerJoinMap (line 284) | protected DmpsAudioOutputControllerJoinMap(uint joinStart, Type type) ...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsMicrophoneControllerJoinMap.cs
  class DmpsMicrophoneControllerJoinMap (line 8) | public class DmpsMicrophoneControllerJoinMap : JoinMapBaseAdvanced
    method DmpsMicrophoneControllerJoinMap (line 57) | public DmpsMicrophoneControllerJoinMap(uint joinStart)
    method DmpsMicrophoneControllerJoinMap (line 67) | protected DmpsMicrophoneControllerJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs
  class DmpsRoutingControllerJoinMap (line 8) | public class DmpsRoutingControllerJoinMap : JoinMapBaseAdvanced
    method DmpsRoutingControllerJoinMap (line 171) | public DmpsRoutingControllerJoinMap(uint joinStart)
    method DmpsRoutingControllerJoinMap (line 181) | protected DmpsRoutingControllerJoinMap(uint joinStart, Type type) : ba...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericIrControllerJoinMap.cs
  class GenericIrControllerJoinMap (line 8) | public sealed class GenericIrControllerJoinMap : JoinMapBaseAdvanced
    method GenericIrControllerJoinMap (line 994) | public GenericIrControllerJoinMap(uint joinStart)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericLightingJoinMap.cs
  class GenericLightingJoinMap (line 9) | public class GenericLightingJoinMap : JoinMapBaseAdvanced
    method GenericLightingJoinMap (line 53) | public GenericLightingJoinMap(uint joinStart)
    method GenericLightingJoinMap (line 63) | protected GenericLightingJoinMap(uint joinStart, Type type) : base(joi...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs
  class GenericRelayControllerJoinMap (line 8) | public class GenericRelayControllerJoinMap : JoinMapBaseAdvanced
    method GenericRelayControllerJoinMap (line 22) | public GenericRelayControllerJoinMap(uint joinStart)
    method GenericRelayControllerJoinMap (line 32) | protected GenericRelayControllerJoinMap(uint joinStart, Type type) : b...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs
  class GlsOccupancySensorBaseJoinMap (line 8) | public class GlsOccupancySensorBaseJoinMap : JoinMapBaseAdvanced
    method GlsOccupancySensorBaseJoinMap (line 288) | public GlsOccupancySensorBaseJoinMap(uint joinStart)
    method GlsOccupancySensorBaseJoinMap (line 298) | protected GlsOccupancySensorBaseJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsPartitionSensorJoinMap.cs
  class GlsPartitionSensorJoinMap (line 9) | public class GlsPartitionSensorJoinMap : JoinMapBaseAdvanced
    method GlsPartitionSensorJoinMap (line 166) | public GlsPartitionSensorJoinMap(uint joinStart)
    method GlsPartitionSensorJoinMap (line 177) | protected GlsPartitionSensorJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdNxM4kEControllerJoinMap.cs
  class HdMdNxM4kEControllerJoinMap (line 8) | public class HdMdNxM4kEControllerJoinMap : JoinMapBaseAdvanced
    method HdMdNxM4kEControllerJoinMap (line 84) | public HdMdNxM4kEControllerJoinMap(uint joinStart)
    method HdMdNxM4kEControllerJoinMap (line 94) | protected HdMdNxM4kEControllerJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs
  class HdMdxxxCEControllerJoinMap (line 8) | public class HdMdxxxCEControllerJoinMap : JoinMapBaseAdvanced
    method HdMdxxxCEControllerJoinMap (line 99) | public HdMdxxxCEControllerJoinMap(uint joinStart)
    method HdMdxxxCEControllerJoinMap (line 109) | protected HdMdxxxCEControllerJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdPsXxxControllerJoinMap.cs
  class HdPsXxxControllerJoinMap (line 9) | public class HdPsXxxControllerJoinMap : JoinMapBaseAdvanced
    method HdPsXxxControllerJoinMap (line 201) | public HdPsXxxControllerJoinMap(uint joinStart)
    method HdPsXxxControllerJoinMap (line 211) | protected HdPsXxxControllerJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/Hrxxx0WirelessRemoteControllerJoinMap.cs
  class Hrxxx0WirelessRemoteControllerJoinMap (line 8) | public class Hrxxx0WirelessRemoteControllerJoinMap : JoinMapBaseAdvanced
    method Hrxxx0WirelessRemoteControllerJoinMap (line 399) | public Hrxxx0WirelessRemoteControllerJoinMap(uint joinStart)
    method Hrxxx0WirelessRemoteControllerJoinMap (line 409) | protected Hrxxx0WirelessRemoteControllerJoinMap(uint joinStart, Type t...

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/IAnalogInputJoinMap.cs
  class IAnalogInputJoinMap (line 8) | public class IAnalogInputJoinMap : JoinMapBaseAdvanced
    method IAnalogInputJoinMap (line 29) | public IAnalogInputJoinMap(uint joinStart)
    method IAnalogInputJoinMap (line 39) | protected IAnalogInputJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs
  class IBasicCommunicationJoinMap (line 8) | public class IBasicCommunicationJoinMap : JoinMapBaseAdvanced
    method IBasicCommunicationJoinMap (line 56) | public IBasicCommunicationJoinMap(uint joinStart)
    method IBasicCommunicationJoinMap (line 66) | protected IBasicCommunicationJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalInputJoinMap.cs
  class IDigitalInputJoinMap (line 8) | public class IDigitalInputJoinMap : JoinMapBaseAdvanced
    method IDigitalInputJoinMap (line 21) | public IDigitalInputJoinMap(uint joinStart)
    method IDigitalInputJoinMap (line 31) | protected IDigitalInputJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalOutputJoinMap.cs
  class IDigitalOutputJoinMap (line 8) | public class IDigitalOutputJoinMap : JoinMapBaseAdvanced
    method IDigitalOutputJoinMap (line 21) | public IDigitalOutputJoinMap(uint joinStart)
    method IDigitalOutputJoinMap (line 31) | protected IDigitalOutputJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/IRBlurayBaseJoinMap.cs
  class IRBlurayBaseJoinMap (line 12) | public class IRBlurayBaseJoinMap : JoinMapBaseAdvanced
    method IRBlurayBaseJoinMap (line 347) | public IRBlurayBaseJoinMap(uint joinStart)
    method IRBlurayBaseJoinMap (line 357) | protected IRBlurayBaseJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/PduJoinMapBase.cs
  class PduJoinMapBase (line 8) | public class PduJoinMapBase : JoinMapBaseAdvanced
    method PduJoinMapBase (line 72) | public PduJoinMapBase(uint joinStart)
    method PduJoinMapBase (line 82) | public PduJoinMapBase(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/SetTopBoxControllerJoinMap.cs
  class SetTopBoxControllerJoinMap (line 9) | public class SetTopBoxControllerJoinMap : JoinMapBaseAdvanced
    method SetTopBoxControllerJoinMap (line 387) | public SetTopBoxControllerJoinMap(uint joinStart)
    method SetTopBoxControllerJoinMap (line 397) | protected SetTopBoxControllerJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/StatusSignControllerJoinMap.cs
  class StatusSignControllerJoinMap (line 8) | public class StatusSignControllerJoinMap : JoinMapBaseAdvanced
    method StatusSignControllerJoinMap (line 70) | public StatusSignControllerJoinMap(uint joinStart)
    method StatusSignControllerJoinMap (line 80) | protected StatusSignControllerJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/SystemMonitorJoinMap.cs
  class SystemMonitorJoinMap (line 8) | public class SystemMonitorJoinMap : JoinMapBaseAdvanced
    method SystemMonitorJoinMap (line 267) | public SystemMonitorJoinMap(uint joinStart)
    method SystemMonitorJoinMap (line 277) | protected SystemMonitorJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs
  class VideoCodecControllerJoinMap (line 8) | public class VideoCodecControllerJoinMap : JoinMapBaseAdvanced
    method VideoCodecControllerJoinMap (line 2229) | public VideoCodecControllerJoinMap(uint joinStart)
    method VideoCodecControllerJoinMap (line 2239) | public VideoCodecControllerJoinMap(uint joinStart, Type type)

FILE: src/PepperDash.Essentials.Core/Comm and IR/CecPortController.cs
  class CecPortController (line 18) | public class CecPortController : Device, IBasicCommunicationWithStreamDe...
    method CecPortController (line 48) | public CecPortController(string key, Func<EssentialsControlPropertiesC...
    method CecPortController (line 66) | public CecPortController(string key, ICec port)
    method StreamCec_CecChange (line 74) | void StreamCec_CecChange(Cec cecDevice, CecEventArgs args)
    method OnDataReceived (line 83) | void OnDataReceived(string s)
    method SendText (line 105) | public void SendText(string text)
    method SendBytes (line 116) | public void SendBytes(byte[] bytes)
    method Connect (line 129) | public void Connect()
    method Disconnect (line 136) | public void Disconnect()
    method SimulateReceive (line 149) | public void SimulateReceive(string s)

FILE: src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs
  class ComPortController (line 17) | public class ComPortController : Device, IBasicCommunicationWithStreamDe...
    method ComPortController (line 49) | public ComPortController(string key, Func<EssentialsControlPropertiesC...
    method ComPortController (line 70) | public ComPortController(string key, ComPort port, ComPort.ComPortSpec...
    method RegisterAndConfigureComPort (line 86) | private void RegisterAndConfigureComPort()
    method Port_SerialDataReceived (line 125) | void Port_SerialDataReceived(ComPort ReceivingComPort, ComPortSerialDa...
    method OnDataReceived (line 130) | void OnDataReceived(string s)
    method Deactivate (line 157) | public override bool Deactivate()
    method SendText (line 167) | public void SendText(string text)
    method SendBytes (line 179) | public void SendBytes(byte[] bytes)
    method Connect (line 192) | public void Connect()
    method Disconnect (line 199) | public void Disconnect()
    method SimulateReceive (line 212) | public void SimulateReceive(string s)

FILE: src/PepperDash.Essentials.Core/Comm and IR/ComSpecJsonConverter.cs
  class ComSpecJsonConverter (line 22) | public class ComSpecJsonConverter : JsonConverter
    method ReadJson (line 32) | public override object ReadJson(JsonReader reader, Type objectType, ob...
    method CanConvert (line 48) | public override bool CanConvert(Type objectType)
    method WriteJson (line 68) | public override void WriteJson(JsonWriter writer, object value, JsonSe...
  class ComSpecPropsJsonConverter (line 77) | public class ComSpecPropsJsonConverter : JsonConverter
    method CanConvert (line 80) | public override bool CanConvert(Type objectType)
    method ReadJson (line 100) | public override object ReadJson(JsonReader reader, Type objectType, ob...
    method WriteJson (line 124) | public override void WriteJson(JsonWriter writer, object value, JsonSe...

FILE: src/PepperDash.Essentials.Core/Comm and IR/CommBridge.cs
  class CommBridge (line 19) | [Description("Generic communication wrapper class for any IBasicCommunic...
    method CommBridge (line 46) | public CommBridge(string key, string name)
    method SendBytes (line 56) | public void SendBytes(byte[] bytes)
    method SendText (line 70) | public void SendText(string text)
    method Connect (line 83) | public void Connect()
    method Disconnect (line 96) | public void Disconnect()
    method LinkToApi (line 107) | public override void LinkToApi(BasicTriList trilist, uint joinStart, s...

FILE: src/PepperDash.Essentials.Core/Comm and IR/CommFactory.cs
  class CommFactory (line 16) | public class CommFactory
    method GetControlPropertiesConfig (line 23) | public static EssentialsControlPropertiesConfig GetControlPropertiesCo...
    method CreateCommForDevice (line 47) | public static IBasicCommunication CreateCommForDevice(DeviceConfig dev...
    method GetComPort (line 142) | public static ComPort GetComPort(EssentialsControlPropertiesConfig con...
    method GetCecPort (line 160) | public static ICec GetCecPort(ControlPropertiesConfig config)
    method GetIComPortsDeviceFromManagedDevice (line 220) | public static IComPorts GetIComPortsDeviceFromManagedDevice(string Com...
  class EssentialsControlPropertiesConfig (line 239) | public class EssentialsControlPropertiesConfig :
  class IrControlSpec (line 303) | public class IrControlSpec

FILE: src/PepperDash.Essentials.Core/Comm and IR/CommunicationExtras.cs
  type IComPortsDevice (line 21) | public interface IComPortsDevice

FILE: src/PepperDash.Essentials.Core/Comm and IR/ConsoleCommMockDevice.cs
  class ConsoleCommMockDevice (line 17) | public class ConsoleCommMockDevice : EssentialsDevice, ICommunicationMon...
    method ConsoleCommMockDevice (line 49) | public ConsoleCommMockDevice(string key, string name, ConsoleCommMockD...
    method CustomActivate (line 63) | public override bool CustomActivate()
    method SendLine (line 74) | void SendLine(string s)
  class ConsoleCommMockDevicePropertiesConfig (line 85) | public class ConsoleCommMockDevicePropertiesConfig
    method ConsoleCommMockDevicePropertiesConfig (line 100) | public ConsoleCommMockDevicePropertiesConfig()
  class ConsoleCommMockDeviceFactory (line 109) | public class ConsoleCommMockDeviceFactory : EssentialsDeviceFactory<Cons...
    method ConsoleCommMockDeviceFactory (line 114) | public ConsoleCommMockDeviceFactory()
    method BuildDevice (line 123) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/Comm and IR/GenericComm.cs
  class GenericComm (line 21) | [Description("Generic communication wrapper class for any IBasicCommunic...
    method GenericComm (line 35) | public GenericComm(DeviceConfig config)
    method BuildDevice (line 57) | public static IKeyed BuildDevice(DeviceConfig dc)
    method SetPortConfig (line 66) | public void SetPortConfig(string portConfig)
    method CustomSetConfig (line 84) | protected override void CustomSetConfig(DeviceConfig config)
    method LinkToApi (line 95) | public override void LinkToApi(BasicTriList trilist, uint joinStart, s...
  class GenericCommFactory (line 156) | public class GenericCommFactory : EssentialsDeviceFactory<GenericComm>
    method GenericCommFactory (line 161) | public GenericCommFactory()
    method BuildDevice (line 170) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/Comm and IR/GenericHttpClient.cs
  class GenericHttpClient (line 11) | [Obsolete("Please use the builtin HttpClient class instead: https://lear...
    method GenericHttpClient (line 27) | public GenericHttpClient(string key, string name, string hostname)
    method SendText (line 42) | public void SendText(string path)
    method SendText (line 55) | public void SendText(string format, params object[] items)
    method SendTextNoResponse (line 68) | public void SendTextNoResponse(string format, params object[] items)
    method Response (line 82) | private void Response(HttpClientResponse response, HTTP_CALLBACK_ERROR...
    method SendBytes (line 103) | public void SendBytes(byte[] bytes)
    method Connect (line 122) | public void Connect()
    method Disconnect (line 130) | public void Disconnect()
  class GenericHttpClientEventArgs (line 154) | public class GenericHttpClientEventArgs : EventArgs
    method GenericHttpClientEventArgs (line 177) | public GenericHttpClientEventArgs(string response, string request, HTT...

FILE: src/PepperDash.Essentials.Core/Comm and IR/IRPortHelper.cs
  class IRPortHelper (line 20) | public static class IRPortHelper
    method GetIrPort (line 40) | public static IrOutPortConfig GetIrPort(JToken propsToken)
    method GetIrOutputPort (line 94) | public static IROutputPort GetIrOutputPort(DeviceConfig dc)
    method GetIrOutputPortController (line 158) | public static IrOutputPortController GetIrOutputPortController(DeviceC...
  class IrOutPortConfig (line 241) | public class IrOutPortConfig
    method IrOutPortConfig (line 264) | public IrOutPortConfig()

FILE: src/PepperDash.Essentials.Core/Config/AudioControlPointListItem.cs
  class AudioControlPointListItem (line 14) | public class AudioControlPointListItem

FILE: src/PepperDash.Essentials.Core/Config/BaseStreamingDeviceProperties.cs
  class BaseStreamingDeviceProperties (line 9) | public class BaseStreamingDeviceProperties

FILE: src/PepperDash.Essentials.Core/Config/BasicConfig.cs
  class BasicConfig (line 15) | public class BasicConfig
    method BasicConfig (line 68) | public BasicConfig()
    method GetSourceListForKey (line 83) | public Dictionary<string, SourceListItem> GetSourceListForKey(string key)
    method GetDestinationListForKey (line 96) | public Dictionary<string, DestinationListItem> GetDestinationListForKe...
    method GetAudioControlPointListForKey (line 114) | public AudioControlPointListItem GetAudioControlPointListForKey(string...
    method GetCameraListForKey (line 126) | public Dictionary<string, CameraListItem> GetCameraListForKey(string key)
    method GetDeviceForKey (line 138) | public DeviceConfig GetDeviceForKey(string key)

FILE: src/PepperDash.Essentials.Core/Config/ConfigPropertiesHelpers.cs
  class ConfigPropertiesHelpers (line 17) | public class ConfigPropertiesHelpers
    method GetHasAudio (line 22) | public static bool GetHasAudio(DeviceConfig deviceConfig)
    method GetHasControls (line 30) | public static bool GetHasControls(DeviceConfig deviceConfig)

FILE: src/PepperDash.Essentials.Core/Config/DeviceConfig.cs
  class DeviceConfig (line 19) | public class DeviceConfig
    method DeviceConfig (line 62) | public DeviceConfig(DeviceConfig dc)
    method DeviceConfig (line 78) | public DeviceConfig() { }
  class DevicePropertiesConverter (line 84) | public class DevicePropertiesConverter : JsonConverter
    method CanConvert (line 90) | public override bool CanConvert(Type objectType)
    method ReadJson (line 103) | public override object ReadJson(JsonReader reader, Type objectType, ob...
    method WriteJson (line 121) | public override void WriteJson(JsonWriter writer, object value, JsonSe...

FILE: src/PepperDash.Essentials.Core/Config/Essentials/ConfigReader.cs
  class ConfigReader (line 19) | public class ConfigReader
    method LoadConfig2 (line 38) | public static bool LoadConfig2()
    method GetConfigFiles (line 182) | public static FileInfo[] GetConfigFiles(string filePath)
    method GetGroupForDeviceKey (line 214) | public static string GetGroupForDeviceKey(string key)
    method GetLocalFileMessage (line 220) | private static void GetLocalFileMessage(string filePath)

FILE: src/PepperDash.Essentials.Core/Config/Essentials/ConfigUpdater.cs
  class ConfigUpdater (line 22) | [Obsolete("ConfigUpdater is no longer supported and will be removed in a...
    method GetConfigFromServer (line 34) | public static void GetConfigFromServer(string url)
    method OnStatusUpdate (line 81) | static void OnStatusUpdate(eUpdateStatus status)
    method WriteConfigToFile (line 91) | static void WriteConfigToFile(string configData)
    method ArchiveExistingPortalConfigs (line 114) | static void ArchiveExistingPortalConfigs()
    method MoveFilesToArchiveFolder (line 139) | static void MoveFilesToArchiveFolder(FileInfo[] files)
    method CheckForLocalConfigAndDelete (line 186) | static void CheckForLocalConfigAndDelete()
    method RestartProgram (line 201) | static void RestartProgram()
  type eUpdateStatus (line 219) | public enum eUpdateStatus
  class ConfigStatusEventArgs (line 265) | public class ConfigStatusEventArgs : EventArgs
    method ConfigStatusEventArgs (line 276) | public ConfigStatusEventArgs(eUpdateStatus status)

FILE: src/PepperDash.Essentials.Core/Config/Essentials/ConfigWriter.cs
  class ConfigWriter (line 19) | public class ConfigWriter
    method UpdateDeviceProperties (line 44) | public static bool UpdateDeviceProperties(string deviceKey, JToken pro...
    method UpdateDeviceConfig (line 71) | public static bool UpdateDeviceConfig(DeviceConfig config)
    method UpdateRoomConfig (line 96) | public static bool UpdateRoomConfig(DeviceConfig config)
    method ResetTimer (line 119) | static void ResetTimer()
    method WriteConfigFile (line 132) | private static void WriteConfigFile(object o)
    method WriteFile (line 146) | public static void WriteFile(string filePath, string configData)

FILE: src/PepperDash.Essentials.Core/Config/Essentials/EssentialsConfig.cs
  class EssentialsConfig (line 17) | public class EssentialsConfig : BasicConfig
    method EssentialsConfig (line 113) | public EssentialsConfig()
  class VersionData (line 123) | public class VersionData
    method VersionData (line 140) | public VersionData()
  class NugetVersion (line 149) | public class NugetVersion
  class SystemTemplateConfigs (line 167) | public class SystemTemplateConfigs

FILE: src/PepperDash.Essentials.Core/Config/ILoadConfig.cs
  type ILoadConfig (line 12) | public interface ILoadConfig
    method GoWithLoad (line 17) | void GoWithLoad();

FILE: src/PepperDash.Essentials.Core/Config/InfoConfig.cs
  class InfoConfig (line 13) | public class InfoConfig
    method InfoConfig (line 66) | public InfoConfig()
  class RuntimeInfo (line 84) | public class RuntimeInfo

FILE: src/PepperDash.Essentials.Core/Config/SourceDevicePropertiesConfigBase.cs
  class SourceDevicePropertiesConfigBase (line 12) | public class SourceDevicePropertiesConfigBase

FILE: src/PepperDash.Essentials.Core/Crestron/CrestronGenericBaseDevice.cs
  class CrestronGenericBaseDevice (line 15) | public abstract class CrestronGenericBaseDevice : EssentialsDevice, IOnl...
    method CrestronGenericBaseDevice (line 53) | protected CrestronGenericBaseDevice(string key, string name, GenericBa...
    method CrestronGenericBaseDevice (line 72) | protected CrestronGenericBaseDevice(string key, string name)
    method RegisterCrestronGenericBase (line 83) | protected void RegisterCrestronGenericBase(GenericBase hardware)
    method CustomActivate (line 98) | public override bool CustomActivate()
    method Deactivate (line 145) | public override bool Deactivate()
    method AddToFeedbackList (line 161) | public void AddToFeedbackList(params Feedback[] newFbs)
    method Hardware_OnlineStatusChange (line 174) | void Hardware_OnlineStatusChange(GenericBase currentDevice, OnlineOffl...
  class CrestronGenericBridgeableBaseDevice (line 211) | public abstract class CrestronGenericBridgeableBaseDevice : CrestronGene...
    method CrestronGenericBridgeableBaseDevice (line 220) | protected CrestronGenericBridgeableBaseDevice(string key, string name,...
    method CrestronGenericBridgeableBaseDevice (line 229) | protected CrestronGenericBridgeableBaseDevice(string key, string name)
    method LinkToApi (line 241) | public abstract void LinkToApi(BasicTriList trilist, uint joinStart, s...
  class CrestronGenericBaseDeviceEventIds (line 249) | public class CrestronGenericBaseDeviceEventIds
  class GenericBaseExtensions (line 265) | public static class GenericBaseExtensions
    method RegisterWithLogging (line 272) | public static eDeviceRegistrationUnRegistrationResponse RegisterWithLo...

FILE: src/PepperDash.Essentials.Core/CrestronIO/GenericDigitalInputDevice.cs
  class GenericDigitalInputDevice (line 21) | public class GenericDigitalInputDevice : EssentialsBridgeableDevice, IDi...
    method GenericDigitalInputDevice (line 41) | public GenericDigitalInputDevice(string key, string name, Func<IOPortC...
    method InputPort_StateChange (line 61) | void InputPort_StateChange(DigitalInput digitalInput, DigitalInputEven...
    method GetDigitalInput (line 70) | private static DigitalInput GetDigitalInput(IOPortConfig dc)
    method LinkToApi (line 107) | public override void LinkToApi(BasicTriList trilist, uint joinStart, s...
    class GenericDigitalInputDeviceFactory (line 146) | public class GenericDigitalInputDeviceFactory : EssentialsDeviceFactor...
      method GenericDigitalInputDeviceFactory (line 151) | public GenericDigitalInputDeviceFactory()
      method BuildDevice (line 157) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/CrestronIO/GenericRelayDevice.cs
  class GenericRelayDevice (line 21) | [Description("Wrapper class for a Relay")]
    method GenericRelayDevice (line 40) | public GenericRelayDevice(string key, Relay relay) :
    method GenericRelayDevice (line 58) | public GenericRelayDevice(string key, string name, Func<IOPortConfig, ...
    method GetRelay (line 82) | private static Relay GetRelay(IOPortConfig dc)
    method RelayOutput_StateChange (line 127) | void RelayOutput_StateChange(Relay relay, RelayEventArgs args)
    method OpenRelay (line 139) | public void OpenRelay()
    method CloseRelay (line 147) | public void CloseRelay()
    method ToggleRelayState (line 155) | public void ToggleRelayState()
    method On (line 167) | void ISwitchedOutput.On()
    method Off (line 172) | void ISwitchedOutput.Off()
    method LinkToApi (line 185) | public override void LinkToApi(BasicTriList trilist, uint joinStart, s...
    class GenericRelayDeviceFactory (line 231) | public class GenericRelayDeviceFactory : EssentialsDeviceFactory<Gener...
      method GenericRelayDeviceFactory (line 236) | public GenericRelayDeviceFactory()
      method BuildDevice (line 245) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportAnalogInputDevice.cs
  class GenericVersiportAnalogInputDevice (line 18) | public class GenericVersiportAnalogInputDevice : EssentialsBridgeableDev...
    method GenericVersiportAnalogInputDevice (line 43) | public GenericVersiportAnalogInputDevice(string key, string name, Func...
    method SetMinimumChange (line 71) | public void SetMinimumChange(ushort value)
    method InputPort_VersiportChange (line 76) | void InputPort_VersiportChange(Versiport port, VersiportEventArgs args)
    method LinkToApi (line 90) | public override void LinkToApi(BasicTriList trilist, uint joinStart, s...
    method GetVersiportDigitalInput (line 139) | public static Versiport GetVersiportDigitalInput(IOPortConfig dc)
  class GenericVersiportAnalogInputDeviceFactory (line 176) | public class GenericVersiportAnalogInputDeviceFactory : EssentialsDevice...
    method GenericVersiportAnalogInputDeviceFactory (line 181) | public GenericVersiportAnalogInputDeviceFactory()
    method BuildDevice (line 187) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportInputDevice.cs
  class GenericVersiportDigitalInputDevice (line 18) | public class GenericVersiportDigitalInputDevice : EssentialsBridgeableDe...
    method GenericVersiportDigitalInputDevice (line 48) | public GenericVersiportDigitalInputDevice(string key, string name, Fun...
    method InputPort_VersiportChange (line 80) | void InputPort_VersiportChange(Versiport port, VersiportEventArgs args)
    method LinkToApi (line 98) | public override void LinkToApi(BasicTriList trilist, uint joinStart, s...
    method GetVersiportDigitalInput (line 136) | public static Versiport GetVersiportDigitalInput(IOPortConfig dc)
  class GenericVersiportDigitalInputDeviceFactory (line 168) | public class GenericVersiportDigitalInputDeviceFactory : EssentialsDevic...
    method GenericVersiportDigitalInputDeviceFactory (line 173) | public GenericVersiportDigitalInputDeviceFactory()
    method BuildDevice (line 179) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/CrestronIO/GenericVersiportOutputDevice.cs
  class GenericVersiportDigitalOutputDevice (line 19) | public class GenericVersiportDigitalOutputDevice : EssentialsBridgeableD...
    method GenericVersiportDigitalOutputDevice (line 34) | public GenericVersiportDigitalOutputDevice(string key, string name, Fu...
    method OutputPort_VersiportChange (line 60) | void OutputPort_VersiportChange(Versiport port, VersiportEventArgs args)
    method SetOutput (line 72) | public void SetOutput(bool state)
    method LinkToApi (line 89) | public override void LinkToApi(BasicTriList trilist, uint joinStart, s...
    method GetVersiportDigitalOutput (line 128) | public static Versiport GetVersiportDigitalOutput(IOPortConfig dc)
  class GenericVersiportDigitalOutputDeviceFactory (line 159) | public class GenericVersiportDigitalOutputDeviceFactory : EssentialsDevi...
    method GenericVersiportDigitalOutputDeviceFactory (line 164) | public GenericVersiportDigitalOutputDeviceFactory()
    method BuildDevice (line 170) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/CrestronIO/IAnalogInput.cs
  type IAnalogInput (line 13) | public interface IAnalogInput

FILE: src/PepperDash.Essentials.Core/CrestronIO/IDigitalInput.cs
  type IDigitalInput (line 12) | public interface IDigitalInput

FILE: src/PepperDash.Essentials.Core/CrestronIO/IDigitalOutput.cs
  type IDigitalOutput (line 12) | public interface IDigitalOutput
    method SetOutput (line 23) | void SetOutput(bool state);

FILE: src/PepperDash.Essentials.Core/CrestronIO/IHasCresnetBranches.cs
  type IHasCresnetBranches (line 14) | public interface IHasCresnetBranches

FILE: src/PepperDash.Essentials.Core/CrestronIO/IOPortConfig.cs
  class IOPortConfig (line 15) | public class IOPortConfig

FILE: src/PepperDash.Essentials.Core/CrestronIO/ISwitchedOutput.cs
  type ISwitchedOutput (line 14) | public interface ISwitchedOutput
    method On (line 24) | void On();
    method Off (line 29) | void Off();
  type ISwitchedOutputCollection (line 35) | public interface ISwitchedOutputCollection

FILE: src/PepperDash.Essentials.Core/Device Info/DeviceInfo.cs
  class DeviceInfo (line 6) | public class DeviceInfo

FILE: src/PepperDash.Essentials.Core/Device Info/DeviceInfoEventArgs.cs
  class DeviceInfoEventArgs (line 8) | public class DeviceInfoEventArgs:EventArgs
    method DeviceInfoEventArgs (line 18) | public DeviceInfoEventArgs()
    method DeviceInfoEventArgs (line 27) | public DeviceInfoEventArgs(DeviceInfo devInfo)

FILE: src/PepperDash.Essentials.Core/Device Info/IDeviceInfoProvider.cs
  type IDeviceInfoProvider (line 9) | public interface IDeviceInfoProvider:IKeyed
    method UpdateDeviceInfo (line 24) | void UpdateDeviceInfo();

FILE: src/PepperDash.Essentials.Core/Device Info/NetworkDeviceHelpers.cs
  class NetworkDeviceHelpers (line 14) | public static class NetworkDeviceHelpers
    method RefreshArp (line 40) | public static void RefreshArp()
    method OnArpTableUpdated (line 86) | private static void OnArpTableUpdated(ArpTableEventArgs args)
    method NetworkDeviceHelpers (line 94) | static NetworkDeviceHelpers()
    method SanitizeIpAddress (line 107) | public static string SanitizeIpAddress(string ipAddressIn)
    method ResolveHostnameFromIp (line 129) | public static string ResolveHostnameFromIp(string ipAddress)
    method ResolveIpFromHostname (line 152) | public static string ResolveIpFromHostname(string hostName)
  class ArpEntry (line 171) | public class ArpEntry
    method ArpEntry (line 188) | public ArpEntry(string ipAddress, string macAddress)
  class ArpTableEventArgs (line 206) | public class ArpTableEventArgs : EventArgs
    method ArpTableEventArgs (line 222) | public ArpTableEventArgs(List<ArpEntry> arpTable, bool error)
    method ArpTableEventArgs (line 232) | public ArpTableEventArgs(List<ArpEntry> arpTable)

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IAudioZone.cs
  type IAudioZone (line 6) | public interface IAudioZone : IBasicVolumeWithFeedback
    method SelectInput (line 12) | void SelectInput(ushort input);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IAudioZones.cs
  type IAudioZones (line 8) | public interface IAudioZones : IRouting

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IBasicVolumeControls.cs
  type IBasicVolumeControls (line 8) | public interface IBasicVolumeControls : IKeyName
    method VolumeUp (line 14) | void VolumeUp(bool pressRelease);
    method VolumeDown (line 20) | void VolumeDown(bool pressRelease);
    method MuteToggle (line 25) | void MuteToggle();

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IBasicVolumeWithFeedback.cs
  type IBasicVolumeWithFeedback (line 6) | public interface IBasicVolumeWithFeedback : IBasicVolumeControls
    method MuteOn (line 16) | void MuteOn();
    method MuteOff (line 21) | void MuteOff();
    method SetVolume (line 27) | void SetVolume(ushort level);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IBasicVolumeWithFeedbackAdvanced.cs
  type IBasicVolumeWithFeedbackAdvanced (line 6) | public interface IBasicVolumeWithFeedbackAdvanced : IBasicVolumeWithFeed...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IChannel.cs
  type IChannel (line 12) | public interface IChannel
    method ChannelUp (line 19) | void ChannelUp(bool pressRelease);
    method ChannelDown (line 24) | void ChannelDown(bool pressRelease);
    method LastChannel (line 30) | void LastChannel(bool pressRelease);
    method Guide (line 37) | void Guide(bool pressRelease);
    method Info (line 43) | void Info(bool pressRelease);
    method Exit (line 49) | void Exit(bool pressRelease);
  class IChannelExtensions (line 55) | public static class IChannelExtensions
    method LinkButtons (line 60) | public static void LinkButtons(this IChannel dev, BasicTriList triList)
    method UnlinkButtons (line 73) | public static void UnlinkButtons(this IChannel dev, BasicTriList triList)

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IColorFunctions.cs
  type IColor (line 12) | public interface IColor
    method Red (line 18) | void Red(bool pressRelease);
    method Green (line 24) | void Green(bool pressRelease);
    method Yellow (line 30) | void Yellow(bool pressRelease);
    method Blue (line 36) | void Blue(bool pressRelease);
  class IColorExtensions (line 42) | public static class IColorExtensions
    method LinkButtons (line 49) | public static void LinkButtons(this IColor dev, BasicTriList TriList)
    method UnlinkButtons (line 62) | public static void UnlinkButtons(this IColor dev, BasicTriList triList)

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ICustomMobileControl.cs
  type ICustomMobileControl (line 8) | public interface ICustomMobileControl : IKeyed

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IDPad.cs
  type IDPad (line 12) | public interface IDPad : IKeyed
    method Up (line 18) | void Up(bool pressRelease);
    method Down (line 24) | void Down(bool pressRelease);
    method Left (line 30) | void Left(bool pressRelease);
    method Right (line 36) | void Right(bool pressRelease);
    method Select (line 42) | void Select(bool pressRelease);
    method Menu (line 48) | void Menu(bool pressRelease);
    method Exit (line 54) | void Exit(bool pressRelease);
  class IDPadExtensions (line 60) | public static class IDPadExtensions
    method LinkButtons (line 65) | public static void LinkButtons(this IDPad dev, BasicTriList triList)
    method UnlinkButtons (line 79) | public static void UnlinkButtons(this IDPad dev, BasicTriList triList)

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IDiscPlayerControls.cs
  type IDiscPlayerControls (line 12) | public interface IDiscPlayerControls : IColor, IDPad, INumericKeypad, IH...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IDisplay.cs
  type IDisplay (line 12) | public interface IDisplay : IHasFeedback, IRoutingSinkWithSwitching, IHa...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IDisplayBasic.cs
  type IDisplayBasic (line 12) | public interface IDisplayBasic
    method InputHdmi1 (line 17) | void InputHdmi1();
    method InputHdmi2 (line 22) | void InputHdmi2();
    method InputHdmi3 (line 27) | void InputHdmi3();
    method InputHdmi4 (line 32) | void InputHdmi4();
    method InputDisplayPort1 (line 37) | void InputDisplayPort1();
    method InputDvi1 (line 42) | void InputDvi1();
    method InputVideo1 (line 47) | void InputVideo1();
    method InputVga1 (line 52) | void InputVga1();
    method InputVga2 (line 57) | void InputVga2();
    method InputRgb1 (line 62) | void InputRgb1();

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IDumbSource.cs
  type IDumbSource (line 12) | public interface IDumbSource

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IDvr.cs
  type IDvr (line 17) | public interface IDvr : IDPad
    method DvrList (line 23) | void DvrList(bool pressRelease);
    method Record (line 29) | void Record(bool pressRelease);
  class IDvrExtensions (line 35) | public static class IDvrExtensions
    method LinkButtons (line 42) | public static void LinkButtons(this IDvr dev, BasicTriList triList)
    method UnlinkButtons (line 53) | public static void UnlinkButtons(this IDvr dev, BasicTriList triList)

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IEmergencyOSD.cs
  type IEmergencyOSD (line 12) | public interface IEmergencyOSD
    method ShowEmergencyMessage (line 18) | void ShowEmergencyMessage(string url);
    method HideEmergencyMessage (line 23) | void HideEmergencyMessage();

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IFullAudioSettings.cs
  type IFullAudioSettings (line 6) | public interface IFullAudioSettings : IBasicVolumeWithFeedback
    method SetBalance (line 12) | void SetBalance(ushort level);
    method BalanceLeft (line 18) | void BalanceLeft(bool pressRelease);
    method BalanceRight (line 24) | void BalanceRight(bool pressRelease);
    method SetBass (line 30) | void SetBass(ushort level);
    method BassUp (line 36) | void BassUp(bool pressRelease);
    method BassDown (line 42) | void BassDown(bool pressRelease);
    method SetTreble (line 48) | void SetTreble(ushort level);
    method TrebleUp (line 54) | void TrebleUp(bool pressRelease);
    method TrebleDown (line 60) | void TrebleDown(bool pressRelease);
    method SetMaxVolume (line 71) | void SetMaxVolume(ushort level);
    method MaxVolumeUp (line 77) | void MaxVolumeUp(bool pressRelease);
    method MaxVolumeDown (line 83) | void MaxVolumeDown(bool pressRelease);
    method SetDefaultVolume (line 94) | void SetDefaultVolume(ushort level);
    method DefaultVolumeUp (line 100) | void DefaultVolumeUp(bool pressRelease);
    method DefaultVolumeDown (line 106) | void DefaultVolumeDown(bool pressRelease);
    method LoudnessToggle (line 111) | void LoudnessToggle();
    method MonoToggle (line 116) | void MonoToggle();

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasBranding.cs
  type IHasBranding (line 8) | public interface IHasBranding
    method InitializeBranding (line 19) | void InitializeBranding(string roomKey);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasCurrentVolumeControls.cs
  type IHasCurrentVolumeControls (line 8) | public interface IHasCurrentVolumeControls
    method SetDefaultLevels (line 23) | void SetDefaultLevels();

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasFarEndContentStatus.cs
  type IHasFarEndContentStatus (line 6) | public interface IHasFarEndContentStatus

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasInputs.cs
  type IHasInputs (line 12) | public interface IHasInputs<T> : IKeyName

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasMuteControl.cs
  type IHasMuteControl (line 6) | public interface IHasMuteControl
    method MuteToggle (line 11) | void MuteToggle();

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasMuteControlWithFeedback.cs
  type IHasMuteControlWithFeedback (line 6) | public interface IHasMuteControlWithFeedback : IHasMuteControl
    method MuteOn (line 16) | void MuteOn();
    method MuteOff (line 21) | void MuteOff();

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasPhoneDialing.cs
  type IHasPhoneDialing (line 9) | public interface IHasPhoneDialing
    method DialPhoneCall (line 30) | void DialPhoneCall(string number);
    method EndPhoneCall (line 35) | void EndPhoneCall();
    method SendDtmfToPhone (line 41) | void SendDtmfToPhone(string digit);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasScreensWithLayouts.cs
  type IHasScreensWithLayouts (line 14) | public interface IHasScreensWithLayouts
    method ApplyLayout (line 26) | void ApplyLayout(uint screenId, uint layoutIndex);
  class ScreenInfo (line 32) | public class ScreenInfo
  class LayoutInfo (line 63) | public class LayoutInfo
  class WindowConfig (line 93) | public class WindowConfig

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasSurroundSoundModes.cs
  type IHasSurroundSoundModes (line 15) | public interface IHasSurroundSoundModes<TKey, TSelector>: IKeyName
    method SetSurroundSoundMode (line 26) | void SetSurroundSoundMode(TSelector selector);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasVolumeControl.cs
  type IHasVolumeControl (line 6) | public interface IHasVolumeControl
    method VolumeUp (line 12) | void VolumeUp(bool pressRelease);
    method VolumeDown (line 18) | void VolumeDown(bool pressRelease);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasVolumeControlWithFeedback.cs
  type IHasVolumeControlWithFeedback (line 6) | public interface IHasVolumeControlWithFeedback : IHasVolumeControl
    method SetVolume (line 12) | void SetVolume(ushort level);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasVolumeDevice.cs
  type IHasVolumeDevice (line 6) | public interface IHasVolumeDevice

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHasWebView.cs
  type eWebViewEventMode (line 13) | public enum eWebViewEventMode
  type eWebViewTarget (line 35) | public enum eWebViewTarget
  class Reason (line 66) | public class Reason
  class XPath (line 77) | public class XPath
  class ValueProperty (line 88) | public abstract class ValueProperty
    method OnValueChanged (line 98) | protected void OnValueChanged()
  class WebViewEvent (line 110) | public class WebViewEvent
  class WebViewDisplay (line 140) | public class WebViewDisplay
  class WebViewClear (line 176) | public class WebViewClear
  class DisplayMode (line 200) | public class DisplayMode : ValueProperty
  class Target (line 232) | public class Target : ValueProperty
  class Status (line 264) | public class Status
  type IHasWebView (line 294) | public interface IHasWebView
    method ShowWebView (line 308) | void ShowWebView(string url, string mode, string title, string target);
    method HideWebView (line 313) | void HideWebView();
  type IHasWebViewWithPwaMode (line 326) | public interface IHasWebViewWithPwaMode : IHasWebView
    method SendNavigatorsToPwaUrl (line 342) | void SendNavigatorsToPwaUrl(string url);
    method ExitNavigatorsPwaMode (line 347) | void ExitNavigatorsPwaMode();
  class WebViewStatusChangedEventArgs (line 354) | public class WebViewStatusChangedEventArgs : EventArgs
    method WebViewStatusChangedEventArgs (line 370) | public WebViewStatusChangedEventArgs(string status)
    method WebViewStatusChangedEventArgs (line 380) | public WebViewStatusChangedEventArgs(string status, WebViewEvent webview)

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IHumiditySensor.cs
  type IHumiditySensor (line 12) | public interface IHumiditySensor

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ILanguageDefinition.cs
  type ILanguageDefinition (line 9) | public interface ILanguageDefinition

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ILanguageProvider.cs
  type ILanguageProvider (line 9) | public interface ILanguageProvider

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ILevelControls.cs
  type ILevelControls (line 12) | public interface ILevelControls

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IMeterFeedback.cs
  type IMeterFeedback (line 10) | public interface IMeterFeedback

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IMobileControl.cs
  type IMobileControl (line 11) | public interface IMobileControl : IKeyed
    method SendMessageObject (line 37) | void SendMessageObject(IMobileControlMessage o);
    method AddAction (line 45) | void AddAction<T>(T messenger, Action<string, string, JToken> action) ...
    method RemoveAction (line 51) | void RemoveAction(string key);
    method AddDeviceMessenger (line 57) | void AddDeviceMessenger(IMobileControlMessenger messenger);
    method CheckForDeviceMessenger (line 63) | bool CheckForDeviceMessenger(string key);
    method GetRoomMessenger (line 70) | IMobileControlRoomMessenger GetRoomMessenger(string key);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IMobileControlAction.cs
  type IMobileControlAction (line 9) | public interface IMobileControlAction

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IMobileControlCrestronTouchpanelController.cs
  type IMobileControlCrestronTouchpanelController (line 10) | public interface IMobileControlCrestronTouchpanelController : IMobileCon...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IMobileControlMessage.cs
  type IMobileControlMessage (line 9) | public interface IMobileControlMessage

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IMobileControlMessenger.cs
  type IMobileControlMessenger (line 8) | public interface IMobileControlMessenger : IKeyed
    method RegisterWithAppServer (line 29) | void RegisterWithAppServer(IMobileControl appServerController);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IMobileControlMessengerWithSubscriptions.cs
  type IMobileControlMessengerWithSubscriptions (line 8) | public interface IMobileControlMessengerWithSubscriptions : IMobileContr...
    method UnsubscribeClient (line 14) | void UnsubscribeClient(string clientId);
    method RegisterWithAppServer (line 21) | void RegisterWithAppServer(IMobileControl appServerController, bool en...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IMobileControlRoomMessenger.cs
  type IMobileControlRoomMessenger (line 9) | public interface IMobileControlRoomMessenger : IKeyed
    method UpdateAppUrl (line 65) | void UpdateAppUrl(string url);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IMobileControlTouchpanelController.cs
  type IMobileControlTouchpanelController (line 8) | public interface IMobileControlTouchpanelController : IKeyed
    method SetAppUrl (line 19) | void SetAppUrl(string url);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/INumeric.cs
  type INumericKeypad (line 11) | public interface INumericKeypad:IKeyed
    method Digit0 (line 17) | void Digit0(bool pressRelease);
    method Digit1 (line 23) | void Digit1(bool pressRelease);
    method Digit2 (line 29) | void Digit2(bool pressRelease);
    method Digit3 (line 35) | void Digit3(bool pressRelease);
    method Digit4 (line 41) | void Digit4(bool pressRelease);
    method Digit5 (line 47) | void Digit5(bool pressRelease);
    method Digit6 (line 53) | void Digit6(bool pressRelease);
    method Digit7 (line 59) | void Digit7(bool pressRelease);
    method Digit8 (line 65) | void Digit8(bool pressRelease);
    method Digit9 (line 71) | void Digit9(bool pressRelease);
    method KeypadAccessoryButton1 (line 87) | void KeypadAccessoryButton1(bool pressRelease);
    method KeypadAccessoryButton2 (line 103) | void KeypadAccessoryButton2(bool pressRelease);
  type ISetTopBoxNumericKeypad (line 109) | public interface ISetTopBoxNumericKeypad : INumericKeypad
    method Dash (line 115) | void Dash(bool pressRelease);
    method KeypadEnter (line 121) | void KeypadEnter(bool pressRelease);
  class INumericExtensions (line 127) | public static class INumericExtensions
    method LinkButtons (line 132) | public static void LinkButtons(this INumericKeypad dev, BasicTriList t...
    method UnlinkButtons (line 153) | public static void UnlinkButtons(this INumericKeypad dev, BasicTriList...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/INvxNetworkPortInformation.cs
  type INvxNetworkPortInformation (line 15) | public interface INvxNetworkPortInformation : IKeyed
  class NvxNetworkPortInformation (line 39) | public class NvxNetworkPortInformation
    method NvxNetworkPortInformation (line 85) | public NvxNetworkPortInformation(DmNvxBaseClass.DmNvx35xNetwork.DmNvxN...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IPasswordPrompt.cs
  type IPasswordPrompt (line 12) | public interface IPasswordPrompt
    method SubmitPassword (line 23) | void SubmitPassword(string password);
  class PasswordPromptEventArgs (line 29) | public class PasswordPromptEventArgs : EventArgs
    method PasswordPromptEventArgs (line 58) | public PasswordPromptEventArgs(bool lastAttemptIncorrect, bool loginFa...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IPower.cs
  type IHasPowerControlWithFeedback (line 20) | public interface IHasPowerControlWithFeedback : IHasPowerControl
  type IHasPowerControl (line 31) | public interface IHasPowerControl
    method PowerOn (line 36) | void PowerOn();
    method PowerOff (line 41) | void PowerOff();
    method PowerToggle (line 46) | void PowerToggle();
  class IHasPowerControlExtensions (line 52) | public static class IHasPowerControlExtensions
    method LinkButtons (line 57) | public static void LinkButtons(this IHasPowerControl dev, BasicTriList...
    method UnlinkButtons (line 73) | public static void UnlinkButtons(this IHasPowerControl dev, BasicTriLi...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IProjectorScreenLiftControl.cs
  type IProjectorScreenLiftControl (line 11) | public interface IProjectorScreenLiftControl
    method Raise (line 16) | void Raise();
    method Lower (line 21) | void Lower();
  type eScreenLiftControlType (line 52) | public enum eScreenLiftControlType

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ISelectableItem.cs
  type ISelectableItem (line 11) | public interface ISelectableItem : IKeyName
    method Select (line 27) | void Select();

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ISelectableItems.cs
  type ISelectableItems (line 10) | public interface ISelectableItems<TKey, TValue> where TValue : ISelectab...
  type ISelectableItems (line 40) | public interface ISelectableItems<TKey> : ISelectableItems<TKey, ISelect...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ISetTopBoxControls.cs
  type ISetTopBoxControls (line 11) | public interface ISetTopBoxControls : IChannel, IColor, IDPad, ISetTopBo...
    method LoadPresets (line 43) | void LoadPresets(string filePath);
    method DvrList (line 49) | void DvrList(bool pressRelease);
    method Replay (line 55) | void Replay(bool pressRelease);
  class ISetTopBoxControlsExtensions (line 61) | public static class ISetTopBoxControlsExtensions
    method LinkButtons (line 68) | public static void LinkButtons(this ISetTopBoxControls dev, BasicTriLi...
    method UnlinkButtons (line 79) | public static void UnlinkButtons(this ISetTopBoxControls dev, BasicTri...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IStateFeedback.cs
  type IStateFeedback (line 10) | public interface IStateFeedback

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ITemperatureSensor.cs
  type ITemperatureSensor (line 12) | public interface ITemperatureSensor
    method SetTemperatureFormat (line 29) | void SetTemperatureFormat(bool setToC);

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ITransport.cs
  type ITransport (line 8) | public interface ITransport
    method Play (line 14) | void Play(bool pressRelease);
    method Pause (line 20) | void Pause(bool pressRelease);
    method Rewind (line 26) | void Rewind(bool pressRelease);
    method FFwd (line 32) | void FFwd(bool pressRelease);
    method ChapMinus (line 38) | void ChapMinus(bool pressRelease);
    method ChapPlus (line 44) | void ChapPlus(bool pressRelease);
    method Stop (line 50) | void Stop(bool pressRelease);
    method Record (line 56) | void Record(bool pressRelease);
  class ITransportExtensions (line 62) | public static class ITransportExtensions
    method LinkButtons (line 69) | public static void LinkButtons(this ITransport dev, BasicTriList triList)
    method UnlinkButtons (line 86) | public static void UnlinkButtons(this ITransport dev, BasicTriList tri...

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/ITvPresetsProvider.cs
  type ITvPresetsProvider (line 8) | public interface ITvPresetsProvider

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IUiDisplayInfo.cs
  type IUiDisplayInfo (line 8) | public interface IUiDisplayInfo : IKeyed

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/IWarmingCooling.cs
  type IWarmingCooling (line 12) | public interface IWarmingCooling

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/LanguageLabel.cs
  class LanguageLabel (line 9) | public class LanguageLabel

FILE: src/PepperDash.Essentials.Core/DeviceTypeInterfaces/eVolumeLevelUnits.cs
  type eVolumeLevelUnits (line 6) | public enum eVolumeLevelUnits

FILE: src/PepperDash.Essentials.Core/Devices/AudioControlListItemBase.cs
  class AudioControlListItemBase (line 13) | public abstract class AudioControlListItemBase

FILE: src/PepperDash.Essentials.Core/Devices/AudioInterfaces.cs
  type AudioChangeType (line 15) | public enum AudioChangeType
  class AudioChangeEventArgs (line 31) | public class AudioChangeEventArgs
    method AudioChangeEventArgs (line 48) | public AudioChangeEventArgs(IBasicVolumeControls device, AudioChangeTy...

FILE: src/PepperDash.Essentials.Core/Devices/CameraListItem.cs
  class CameraListItem (line 9) | public class CameraListItem

FILE: src/PepperDash.Essentials.Core/Devices/CodecInterfaces.cs
  type IReceiveVolume (line 12) | public interface IReceiveVolume
    method SetReceiveVolume (line 20) | void SetReceiveVolume(ushort level);
    method ReceiveMuteOn (line 25) | void ReceiveMuteOn();
    method ReceiveMuteOff (line 30) | void ReceiveMuteOff();
    method ReceiveMuteToggle (line 35) | void ReceiveMuteToggle();
  type ITransmitVolume (line 51) | public interface ITransmitVolume
    method SetTransmitVolume (line 57) | void SetTransmitVolume(ushort level);
    method TransmitMuteOn (line 62) | void TransmitMuteOn();
    method TransmitMuteOff (line 67) | void TransmitMuteOff();
    method TransmitMuteToggle (line 72) | void TransmitMuteToggle();
  type IPrivacy (line 88) | public interface IPrivacy
    method PrivacyModeOn (line 93) | void PrivacyModeOn();
    method PrivacyModeOff (line 98) | void PrivacyModeOff();
    method PrivacyModeToggle (line 103) | void PrivacyModeToggle();

FILE: src/PepperDash.Essentials.Core/Devices/ConfigSnippetAttribute.cs
  class ConfigSnippetAttribute (line 8) | [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple ...
    method ConfigSnippetAttribute (line 15) | public ConfigSnippetAttribute(string configSnippet)

FILE: src/PepperDash.Essentials.Core/Devices/CrestronProcessor.cs
  class CrestronProcessor (line 16) | public class CrestronProcessor : Device, ISwitchedOutputCollection
    method CrestronProcessor (line 32) | public CrestronProcessor(string key)
    method GetRelays (line 44) | void GetRelays()

FILE: src/PepperDash.Essentials.Core/Devices/DescriptionAttribute.cs
  class DescriptionAttribute (line 8) | [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple ...
    method DescriptionAttribute (line 15) | public DescriptionAttribute(string description)

FILE: src/PepperDash.Essentials.Core/Devices/DestinationListItem.cs
  class DestinationListItem (line 12) | public class DestinationListItem

FILE: src/PepperDash.Essentials.Core/Devices/DeviceApiBase.cs
  class DeviceApiBase (line 12) | public abstract class DeviceApiBase

FILE: src/PepperDash.Essentials.Core/Devices/DeviceFeedbackExtensions.cs
  class DeviceFeedbackExtensions (line 14) | public static class DeviceFeedbackExtensions
    method GetFeedbackProperty (line 23) | public static Feedback GetFeedbackProperty(this Device device, string ...

FILE: src/PepperDash.Essentials.Core/Devices/DeviceJsonApi.cs
  class DeviceJsonApi (line 17) | public class DeviceJsonApi
    method DoDeviceActionWithJson (line 23) | public static void DoDeviceActionWithJson(string json)
    method DoDeviceAction (line 49) | public static void DoDeviceAction(DeviceActionWrapper action)
    method DoDeviceActionAsync (line 112) | public static async Task DoDeviceActionAsync(DeviceActionWrapper action)
    method ConvertType (line 175) | private static object ConvertType(object value, Type conversionType)
    method GetProperties (line 197) | public static string GetProperties(string deviceObjectPath)
    method GetPropertyByName (line 215) | public static object GetPropertyByName(string deviceObjectPath, string...
    method GetMethods (line 240) | public static string GetMethods(string deviceObjectPath)
    method GetApiMethods (line 259) | public static string GetApiMethods(string deviceObjectPath)
    method FindObjectOnPath (line 280) | public static object FindObjectOnPath(string deviceObjectPath)
    method SetProperty (line 367) | public static string SetProperty(string deviceObjectPath)
  class DeviceActionWrapper (line 389) | public class DeviceActionWrapper
  class PropertyNameType (line 410) | public class PropertyNameType
    method PropertyNameType (line 468) | public PropertyNameType(PropertyInfo info, object parent)
  class MethodNameParams (line 478) | public class MethodNameParams
    method MethodNameParams (line 507) | public MethodNameParams(MethodInfo info)
  class NameType (line 516) | public class NameType
  class ApiAttribute (line 531) | [AttributeUsage(AttributeTargets.All)]

FILE: src/PepperDash.Essentials.Core/Devices/DeviceManager.cs
  class DeviceManager (line 16) | public static class DeviceManager
    method Initialize (line 52) | public static void Initialize(CrestronControlSystem cs)
    method ActivateAll (line 76) | public static void ActivateAll()
    method DeviceManager_Initialized (line 145) | private static void DeviceManager_Initialized(object sender, EventArgs e)
    method OnAllDevicesActivated (line 157) | private static void OnAllDevicesActivated()
    method OnAllDevicesRegistered (line 166) | private static void OnAllDevicesRegistered()
    method OnAllDevicesInitialized (line 175) | private static void OnAllDevicesInitialized()
    method DeactivateAll (line 187) | public static void DeactivateAll()
    method ListDevices (line 203) | private static void ListDevices(string s)
    method ListDeviceFeedbacks (line 217) | private static void ListDeviceFeedbacks(string devKey)
    method ListDeviceCommStatuses (line 233) | private static void ListDeviceCommStatuses(string input)
    method AddDevice (line 245) | public static void AddDevice(IKeyed newDev)
    method AddDevice (line 286) | public static void AddDevice(IEnumerable<IKeyed> devicesToAdd)
    method RemoveDevice (line 325) | public static void RemoveDevice(IKeyed newDev)
    method GetDeviceKeys (line 348) | public static IEnumerable<string> GetDeviceKeys()
    method GetDevices (line 357) | public static IEnumerable<IKeyed> GetDevices()
    method GetDeviceForKey (line 366) | public static IKeyed GetDeviceForKey(string key)
    method GetDeviceForKey (line 379) | public static T GetDeviceForKey<T>(string key)
    method SimulateComReceiveOnDevice (line 401) | public static void SimulateComReceiveOnDevice(string s)
    method GetRoutingPorts (line 427) | public static void GetRoutingPorts(string s)
    method SetDeviceStreamDebugging (line 457) | public static void SetDeviceStreamDebugging(string s)
    method DisableAllDeviceStreamDebugging (line 524) | public static void DisableAllDeviceStreamDebugging()

FILE: src/PepperDash.Essentials.Core/Devices/DisplayUiConstants.cs
  class DisplayUiConstants (line 14) | public class DisplayUiConstants

FILE: src/PepperDash.Essentials.Core/Devices/EssentialsBridgeableDevice.cs
  class EssentialsBridgeableDevice (line 9) | public abstract class EssentialsBridgeableDevice : EssentialsDevice, IBr...
    method EssentialsBridgeableDevice (line 15) | protected EssentialsBridgeableDevice(string key) : base(key)
    method EssentialsBridgeableDevice (line 24) | protected EssentialsBridgeableDevice(string key, string name) : base(k...
    method LinkToApi (line 29) | public abstract void LinkToApi(BasicTriList trilist, uint joinStart, s...

FILE: src/PepperDash.Essentials.Core/Devices/EssentialsDevice.cs
  class EssentialsDevice (line 11) | [Description("The base Essentials Device Class")]
    method EssentialsDevice (line 44) | protected EssentialsDevice(string key)
    method EssentialsDevice (line 55) | protected EssentialsDevice(string key, string name)
    method SubscribeToActivateComplete (line 61) | private void SubscribeToActivateComplete()
    method DeviceManagerOnAllDevicesActivated (line 66) | private void DeviceManagerOnAllDevicesActivated(object sender, EventAr...
    method CustomActivate (line 88) | public override bool CustomActivate()
    method CreateMobileControlMessengers (line 98) | protected virtual void CreateMobileControlMessengers()

FILE: src/PepperDash.Essentials.Core/Devices/EssentialsDeviceFactory.cs
  class EssentialsDeviceFactory (line 10) | public abstract class EssentialsDeviceFactory<T> : IDeviceFactory where ...
    method BuildDevice (line 25) | public abstract EssentialsDevice BuildDevice(DeviceConfig dc);

FILE: src/PepperDash.Essentials.Core/Devices/EssentialsPluginDevelopmentDeviceFactory.cs
  class EssentialsPluginDevelopmentDeviceFactory (line 9) | public abstract class EssentialsPluginDevelopmentDeviceFactory<T> : Esse...

FILE: src/PepperDash.Essentials.Core/Devices/EssentialsPluginDeviceFactory.cs
  class EssentialsPluginDeviceFactory (line 6) | public abstract class EssentialsPluginDeviceFactory<T> : EssentialsDevic...

FILE: src/PepperDash.Essentials.Core/Devices/GenericIRController.cs
  class GenericIrController (line 19) | public class GenericIrController: EssentialsBridgeableDevice
    method GenericIrController (line 40) | public GenericIrController(string key, string name, IrOutputPortContro...
    method DriverLoadedOnOutputChange (line 53) | private void DriverLoadedOnOutputChange(object sender, FeedbackEventAr...
    method LinkToApi (line 74) | public override void LinkToApi(BasicTriList trilist, uint joinStart, s...
    method Press (line 170) | public void Press(string command, bool pressRelease)
  class GenericIrControllerFactory (line 179) | public class GenericIrControllerFactory : EssentialsDeviceFactory<Generi...
    method GenericIrControllerFactory (line 184) | public GenericIrControllerFactory()
    method BuildDevice (line 194) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/Devices/GenericMonitoredTcpDevice.cs
  class GenericCommunicationMonitoredDevice (line 16) | public class GenericCommunicationMonitoredDevice : Device, ICommunicatio...
    method GenericCommunicationMonitoredDevice (line 35) | public GenericCommunicationMonitoredDevice(string key, string name, IB...
    method GenericCommunicationMonitoredDevice (line 57) | public GenericCommunicationMonitoredDevice(string key, string name, IB...
    method CustomActivate (line 66) | public override bool CustomActivate()
    method Deactivate (line 75) | public override bool Deactivate()

FILE: src/PepperDash.Essentials.Core/Devices/IAttachVideoStatus.cs
  type IAttachVideoStatus (line 9) | public interface IAttachVideoStatus : IKeyed

FILE: src/PepperDash.Essentials.Core/Devices/IAttachVideoStatusExtensions.cs
  class IAttachVideoStatusExtensions (line 12) | public static class IAttachVideoStatusExtensions
    method GetVideoStatuses (line 19) | public static VideoStatusOutputs GetVideoStatuses(this IAttachVideoSta...
    method HasVideoStatuses (line 38) | public static bool HasVideoStatuses(this IAttachVideoStatus attachedDev)

FILE: src/PepperDash.Essentials.Core/Devices/IDisplayUsage.cs
  type IDisplayUsage (line 6) | public interface IDisplayUsage

FILE: src/PepperDash.Essentials.Core/Devices/IDspPresets.cs
  type IDspPresets (line 9) | public interface IDspPresets
    method RecallPreset (line 20) | void RecallPreset(string key);

FILE: src/PepperDash.Essentials.Core/Devices/IHasFeedbacks.cs
  type IHasFeedback (line 12) | public interface IHasFeedback : IKeyed
  class IHasFeedbackExtensions (line 25) | public static class IHasFeedbackExtensions
    method GetFeedbackTypeName (line 32) | private static string GetFeedbackTypeName(Feedback feedback)
    method DumpFeedbacksToConsole (line 49) | public static void DumpFeedbacksToConsole(this IHasFeedback source, bo...

FILE: src/PepperDash.Essentials.Core/Devices/IMakeModel.cs
  type IMakeModel (line 10) | public interface IMakeModel : IKeyed

FILE: src/PepperDash.Essentials.Core/Devices/IOnline.cs
  type IOnline (line 6) | public interface IOnline

FILE: src/PepperDash.Essentials.Core/Devices/IProjectorInterfaces.cs
  type IBasicVideoMute (line 12) | public interface IBasicVideoMute
    method VideoMuteToggle (line 17) | void VideoMuteToggle();
  type IBasicVideoMuteWithFeedback (line 23) | public interface IBasicVideoMuteWithFeedback : IBasicVideoMute
    method VideoMuteOn (line 33) | void VideoMuteOn();
    method VideoMuteOff (line 38) | void VideoMuteOff();

FILE: src/PepperDash.Essentials.Core/Devices/IReconfigurableDevice.cs
  type IReconfigurableDevice (line 14) | public interface IReconfigurableDevice
    method SetConfig (line 30) | void SetConfig(DeviceConfig config);

FILE: src/PepperDash.Essentials.Core/Devices/IUsageTracking.cs
  type IUsageTracking (line 14) | public interface IUsageTracking
  class UsageTracking (line 33) | public class UsageTracking
    method UsageTracking (line 72) | public UsageTracking(Device parent)
    method InUseFeedback_OutputChange (line 81) | void  InUseFeedback_OutputChange(object sender, EventArgs e)
    method StartDeviceUsage (line 97) | public void StartDeviceUsage()
    method EndDeviceUsage (line 106) | public void EndDeviceUsage()
  class DeviceUsageEventArgs (line 137) | public class DeviceUsageEventArgs : EventArgs

FILE: src/PepperDash.Essentials.Core/Devices/IrOutputPortController.cs
  class IrOutputPortController (line 24) | public class IrOutputPortController : Device
    method IrOutputPortController (line 63) | public IrOutputPortController(string key, IROutputPort port, string ir...
    method IrOutputPortController (line 84) | public IrOutputPortController(string key, Func<DeviceConfig, IROutputP...
    method PrintAvailableCommands (line 131) | public void PrintAvailableCommands()
    method LoadDriver (line 145) | public void LoadDriver(string path)
    method PressRelease (line 174) | public virtual void PressRelease(string command, bool state)
    method Pulse (line 204) | public virtual void Pulse(string command, ushort time)
    method NoIrCommandError (line 226) | protected void NoIrCommandError(string command)

FILE: src/PepperDash.Essentials.Core/Devices/LevelControlListItem.cs
  class LevelControlListItem (line 15) | public class LevelControlListItem : AudioControlListItemBase
  type eLevelControlType (line 96) | [Flags]

FILE: src/PepperDash.Essentials.Core/Devices/PduInterfaces.cs
  type IHasPowerCycle (line 12) | public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
    method PowerCycle (line 22) | void PowerCycle();
  type IHasControlledPowerOutlets (line 28) | public interface IHasControlledPowerOutlets : IKeyName

FILE: src/PepperDash.Essentials.Core/Devices/PowerInterfaces.cs
  type IHasBatteryStats (line 9) | public interface IHasBatteryStats : IKeyName
  type IHasBatteryCharging (line 50) | public interface IHasBatteryCharging : IHasBatteryStats
  type IHasBatteries (line 61) | public interface IHasBatteries : IKeyName
  type IHasBatteryStatsExtended (line 72) | public interface IHasBatteryStatsExtended : IHasBatteryStats
  type IHasPowerCycleWithBattery (line 118) | public interface IHasPowerCycleWithBattery : IHasPowerCycle, IHasBattery...
  type IHasPowerCycle (line 126) | public interface IHasPowerCycle : IKeyName, IHasPowerControlWithFeedback
    method PowerCycle (line 136) | void PowerCycle();
  type IHasControlledPowerOutlets (line 142) | public interface IHasControlledPowerOutlets : IKeyName

FILE: src/PepperDash.Essentials.Core/Devices/PresentationDeviceType.cs
  type PresentationSourceType (line 15) | public enum PresentationSourceType

FILE: src/PepperDash.Essentials.Core/Devices/PresetListItem.cs
  class PresetListItem (line 15) | public class PresetListItem : AudioControlListItemBase

FILE: src/PepperDash.Essentials.Core/Devices/ProcessorExtensionDeviceFactory.cs
  class ProcessorExtensionDeviceFactory (line 11) | [Obsolete("will be removed in a future version")]
    method LoadFactories (line 24) | public void LoadFactories()
    method BuildDevice (line 41) | public abstract EssentialsDevice BuildDevice(DeviceConfig dc);

FILE: src/PepperDash.Essentials.Core/Devices/ReconfigurableDevice.cs
  class ReconfigurableDevice (line 20) | public abstract class ReconfigurableDevice : EssentialsDevice, IReconfig...
    method ReconfigurableDevice (line 36) | protected ReconfigurableDevice(DeviceConfig config)
    method SetConfig (line 51) | public void SetConfig(DeviceConfig config)
    method SetNameHelper (line 66) | void SetNameHelper(DeviceConfig config)
    method CustomSetConfig (line 78) | protected virtual void CustomSetConfig(DeviceConfig config)
  class ReconfigurableBridgableDevice (line 87) | public abstract class ReconfigurableBridgableDevice : ReconfigurableDevi...
    method ReconfigurableBridgableDevice (line 93) | protected ReconfigurableBridgableDevice(DeviceConfig config) : base(co...
    method LinkToApi (line 104) | public abstract void LinkToApi(BasicTriList trilist, uint joinStart, s...

FILE: src/PepperDash.Essentials.Core/Devices/SmartObjectBaseTypes.cs
  class SmartObjectJoinOffsets (line 7) | public class SmartObjectJoinOffsets

FILE: src/PepperDash.Essentials.Core/Devices/SourceListItem.cs
  type eSourceListItemType (line 14) | public enum eSourceListItemType
  class SourceListItem (line 33) | public class SourceListItem
    method SourceListItem (line 195) | public SourceListItem()
    method ToString (line 204) | public override string ToString()
  class SourceRouteListItem (line 213) | public class SourceRouteListItem
  type eSourceListItemDestinationTypes (line 263) | [Obsolete]

FILE: src/PepperDash.Essentials.Core/Devices/VolumeDeviceChangeEventArgs.cs
  class VolumeDeviceChangeEventArgs (line 15) | public class VolumeDeviceChangeEventArgs : EventArgs
    method VolumeDeviceChangeEventArgs (line 38) | public VolumeDeviceChangeEventArgs(IBasicVolumeControls oldDev, IBasic...
  type ChangeType (line 49) | public enum ChangeType

FILE: src/PepperDash.Essentials.Core/Ethernet/EthernetStatistics.cs
  class EthernetSettings (line 14) | public static class EthernetSettings

FILE: src/PepperDash.Essentials.Core/Extensions/IpAddressExtensions.cs
  class IPAddressExtensions (line 13) | public static class IPAddressExtensions
    method GetBroadcastAddress (line 25) | public static IPAddress GetBroadcastAddress(this IPAddress address, IP...
    method GetNetworkAddress (line 51) | public static IPAddress GetNetworkAddress(this IPAddress address, IPAd...
    method IsInSameSubnet (line 78) | public static bool IsInSameSubnet(this IPAddress address2, IPAddress a...

FILE: src/PepperDash.Essentials.Core/Extensions/JsonExtensions.cs
  class JsonExtensions (line 16) | public static class JsonExtensions
    method FindTokens (line 24) | public static List<JToken> FindTokens(this JToken containerToken, stri...
    method FindTokens (line 31) | private static void FindTokens(JToken containerToken, string name, Lis...

FILE: src/PepperDash.Essentials.Core/Extensions/StringExtensions.cs
  class StringExtensions (line 13) | public static class StringExtensions
    method NullIfEmpty (line 20) | public static string NullIfEmpty(this string s)
    method NullIfWhiteSpace (line 30) | public static string NullIfWhiteSpace(this string s)
    method ReplaceIfNullOrEmpty (line 41) | public static string ReplaceIfNullOrEmpty(this string s, string newStr...
    method Contains (line 53) | public static bool Contains(this string source, string toCheck, String...
    method TrimAll (line 64) | public static string TrimAll(this string source)
    method TrimAll (line 75) | public static string TrimAll(this string source, char[] chars)

FILE: src/PepperDash.Essentials.Core/Factory/DeviceFactory.cs
  class DeviceFactory (line 24) | public class DeviceFactory
    method DeviceFactory (line 35) | public DeviceFactory()
    method LoadDeviceFactories (line 100) | private static void LoadDeviceFactories(IDeviceFactory deviceFactory)
    method AddFactoryForType (line 128) | public static void AddFactoryForType(string typeName, Func<DeviceConfi...
    method AddFactoryForType (line 143) | public static void AddFactoryForType(string typeName, string descripti...
    method CheckForSecrets (line 156) | private static void CheckForSecrets(IEnumerable<JProperty> obj)
    method GetSecret (line 173) | private static string GetSecret(SecretsPropertiesConfig data)
    method GetDevice (line 196) | public static IKeyed GetDevice(DeviceConfig dc)
    method GetDeviceFactoryTypes (line 243) | public static void GetDeviceFactoryTypes(string filter)
    method GetDeviceFactoryDictionary (line 275) | public static Dictionary<string, DeviceFactoryWrapper> GetDeviceFactor...

FILE: src/PepperDash.Essentials.Core/Factory/DeviceFactoryWrapper.cs
  class DeviceFactoryWrapper (line 12) | public class DeviceFactoryWrapper
    method DeviceFactoryWrapper (line 37) | public DeviceFactoryWrapper()

FILE: src/PepperDash.Essentials.Core/Factory/IDeviceFactory.cs
  type IDeviceFactory (line 10) | public interface IDeviceFactory
    method BuildDevice (line 28) | EssentialsDevice BuildDevice(DeviceConfig deviceConfig);

FILE: src/PepperDash.Essentials.Core/Factory/IProcessorExtensionDeviceFactory.cs
  type IProcessorExtensionDeviceFactory (line 12) | public interface IProcessorExtensionDeviceFactory
    method LoadFactories (line 17) | void LoadFactories();

FILE: src/PepperDash.Essentials.Core/Factory/ProcessorExtensionDeviceFactory.cs
  class ProcessorExtensionDeviceFactory (line 16) | public class ProcessorExtensionDeviceFactory
    method ProcessorExtensionDeviceFactory (line 21) | public ProcessorExtensionDeviceFactory() {
    method AddFactoryForType (line 59) | public static void AddFactoryForType(string extensionName, Func<Device...
    method AddFactoryForType (line 72) | public static void AddFactoryForType(string extensionName, string desc...
    method CheckForSecrets (line 86) | private static void CheckForSecrets(IEnumerable<Newtonsoft.Json.Linq.J...
    method GetSecret (line 102) | private static string GetSecret(SecretsPropertiesConfig data)
    method GetExtensionDevice (line 123) | public static IKeyed GetExtensionDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/Factory/ReadyEventArgs.cs
  class IsReadyEventArgs (line 13) | public class IsReadyEventArgs : EventArgs
    method IsReadyEventArgs (line 24) | public IsReadyEventArgs(bool data)
  type IHasReady (line 33) | public interface IHasReady

FILE: src/PepperDash.Essentials.Core/Feedbacks/BoolFeedback.cs
  class BoolFeedback (line 13) | public class BoolFeedback : Feedback
    method BoolFeedback (line 45) | [Obsolete("use constructor with Key parameter. This constructor will b...
    method BoolFeedback (line 60) | public BoolFeedback(string key, Func<bool> valueFunc)
    method SetValueFunc (line 70) | public void SetValueFunc(Func<bool> newFunc)
    method FireUpdate (line 79) | public override void FireUpdate()
    method LinkInputSig (line 98) | public void LinkInputSig(BoolInputSig sig)
    method UnlinkInputSig (line 111) | public void UnlinkInputSig(BoolInputSig sig)
    method LinkComplementInputSig (line 120) | public void LinkComplementInputSig(BoolInputSig sig)
    method UnlinkComplementInputSig (line 133) | public void UnlinkComplementInputSig(BoolInputSig sig)
    method LinkCrestronFeedback (line 142) | public void LinkCrestronFeedback(Crestron.SimplSharpPro.DeviceSupport....
    method UnlinkCrestronFeedback (line 155) | public void UnlinkCrestronFeedback(Crestron.SimplSharpPro.DeviceSuppor...
    method ToString (line 164) | public override string ToString()
    method SetTestValue (line 176) | public void SetTestValue(bool value)
    method UpdateSig (line 183) | void UpdateSig(BoolInputSig sig)
    method UpdateComplementSig (line 188) | void UpdateComplementSig(BoolInputSig sig)
    method UpdateCrestronFeedback (line 193) | void UpdateCrestronFeedback(Crestron.SimplSharpPro.DeviceSupport.Feedb...

FILE: src/PepperDash.Essentials.Core/Feedbacks/BoolFeedbackOneShot.cs
  class BoolFeedbackPulse (line 12) | public class BoolFeedbackPulse
    method BoolFeedbackPulse (line 35) | public BoolFeedbackPulse(uint timeoutMs)
    method BoolFeedbackPulse (line 43) | public BoolFeedbackPulse(uint timeoutMs, bool canRetrigger)
    method Start (line 53) | public void Start()
    method Cancel (line 74) | public void Cancel()

FILE: src/PepperDash.Essentials.Core/Feedbacks/BoolFeedbackPulseExtender.cs
  class BoolFeedbackPulseExtender (line 13) | public class BoolFeedbackPulseExtender
    method BoolFeedbackPulseExtender (line 62) | public BoolFeedbackPulseExtender(uint timeoutMs)
    method ClearNow (line 71) | public void ClearNow()
    method ClearFeedback (line 78) | void ClearFeedback()

FILE: src/PepperDash.Essentials.Core/Feedbacks/BoolOutputLogicals.cs
  class BoolFeedbackLogic (line 14) | public abstract class BoolFeedbackLogic
    method BoolFeedbackLogic (line 34) | protected BoolFeedbackLogic()
    method AddOutputIn (line 43) | public void AddOutputIn(BoolFeedback output)
    method AddOutputsIn (line 57) | public void AddOutputsIn(List<BoolFeedback> outputs)
    method RemoveOutputIn (line 71) | public void RemoveOutputIn(BoolFeedback output)
    method RemoveOutputsIn (line 85) | public void RemoveOutputsIn(List<BoolFeedback> outputs)
    method ClearOutputs (line 98) | public void ClearOutputs()
    method AnyInput_OutputChange (line 109) | void AnyInput_OutputChange(object sender, EventArgs e)
    method Evaluate (line 117) | protected abstract void Evaluate();
  class BoolFeedbackAnd (line 123) | public class BoolFeedbackAnd : BoolFeedbackLogic
    method Evaluate (line 128) | protected override void Evaluate()
  class BoolFeedbackOr (line 144) | public class BoolFeedbackOr : BoolFeedbackLogic
    method Evaluate (line 149) | protected override void Evaluate()
  class BoolFeedbackLinq (line 165) | public class BoolFeedbackLinq : BoolFeedbackLogic
    method BoolFeedbackLinq (line 173) | public BoolFeedbackLinq(Func<IEnumerable<BoolFeedback>, bool> predicate)
    method Evaluate (line 182) | protected override void Evaluate()

FILE: src/PepperDash.Essentials.Core/Feedbacks/FeedbackBase.cs
  class Feedback (line 15) | public abstract class Feedback : IKeyed
    method Feedback (line 53) | [Obsolete("use constructor with Key parameter. This constructor will b...
    method Feedback (line 60) | protected Feedback(string key)
    method ClearTestValue (line 73) | public void ClearTestValue()
    method FireUpdate (line 82) | public abstract void FireUpdate();
    method InvokeFireUpdate (line 87) | public void InvokeFireUpdate()
    method OnOutputChange (line 100) | protected void OnOutputChange(bool value)
    method OnOutputChange (line 109) | protected void OnOutputChange(int value)
    method OnOutputChange (line 118) | protected void OnOutputChange(string value)

FILE: src/PepperDash.Essentials.Core/Feedbacks/FeedbackCollection.cs
  class FeedbackCollection (line 12) | public class FeedbackCollection<T> : List<T> where T : Feedback

FILE: src/PepperDash.Essentials.Core/Feedbacks/FeedbackEventArgs.cs
  class FeedbackEventArgs (line 12) | public class FeedbackEventArgs : EventArgs
    method FeedbackEventArgs (line 49) | public FeedbackEventArgs(bool value)
    method FeedbackEventArgs (line 59) | public FeedbackEventArgs(int value)
    method FeedbackEventArgs (line 69) | public FeedbackEventArgs(string value)
  type eFeedbackEventType (line 79) | public enum eFeedbackEventType

FILE: src/PepperDash.Essentials.Core/Feedbacks/IntFeedback.cs
  class IntFeedback (line 13) | public class IntFeedback : Feedback
    method IntFeedback (line 46) | [Obsolete("use constructor with Key parameter. This constructor will b...
    method IntFeedback (line 61) | public IntFeedback(string key, Func<int> valueFunc)
    method SetValueFunc (line 71) | public void SetValueFunc(Func<int> newFunc)
    method FireUpdate (line 81) | public override void FireUpdate()
    method LinkInputSig (line 95) | public void LinkInputSig(UShortInputSig sig)
    method UnlinkInputSig (line 104) | public void UnlinkInputSig(UShortInputSig sig)
    method ToString (line 112) | public override string ToString()
    method SetTestValue (line 124) | public void SetTestValue(int value)
    method UpdateSig (line 131) | void UpdateSig(UShortInputSig sig)

FILE: src/PepperDash.Essentials.Core/Feedbacks/SerialFeedback.cs
  class SerialFeedback (line 14) | public class SerialFeedback : Feedback
    method SerialFeedback (line 34) | [Obsolete("use constructor with Key parameter. This constructor will b...
    method SerialFeedback (line 43) | public SerialFeedback(string key)
    method FireUpdate (line 52) | public override void FireUpdate()
    method FireUpdate (line 60) | public void FireUpdate(string newValue)
    method LinkInputSig (line 70) | public void LinkInputSig(StringInputSig sig)
    method UnlinkInputSig (line 79) | public void UnlinkInputSig(StringInputSig sig)
    method ToString (line 87) | public override string ToString()
    method SetTestValue (line 99) | public void SetTestValue(string value)
    method UpdateSig (line 106) | void UpdateSig(StringInputSig sig)
    method UpdateSig (line 111) | void UpdateSig(StringInputSig sig, string value)

FILE: src/PepperDash.Essentials.Core/Feedbacks/StringFeedback.cs
  class StringFeedback (line 14) | public class StringFeedback : Feedback
    method StringFeedback (line 41) | [Obsolete("use constructor with Key parameter. This constructor will b...
    method StringFeedback (line 56) | public StringFeedback(string key, Func<string> valueFunc)
    method SetValueFunc (line 66) | public void SetValueFunc(Func<string> newFunc)
    method FireUpdate (line 75) | public override void FireUpdate()
    method LinkInputSig (line 89) | public void LinkInputSig(StringInputSig sig)
    method UnlinkInputSig (line 98) | public void UnlinkInputSig(StringInputSig sig)
    method ToString (line 106) | public override string ToString()
    method SetTestValue (line 118) | public void SetTestValue(string value)
    method UpdateSig (line 125) | void UpdateSig(StringInputSig sig)

FILE: src/PepperDash.Essentials.Core/File/FileIO.cs
  class FileIO (line 16) | public static class FileIO
    method GetFiles (line 40) | public static FileInfo[] GetFiles(string fileName)
    method GetFile (line 59) | public static FileInfo GetFile(string fileName)
    method ReadDataFromFile (line 84) | public static string ReadDataFromFile(string fileName)
    method ReadDataFromFile (line 105) | public static string ReadDataFromFile(FileInfo file)
    method ReadDataFromFileASync (line 151) | public static void ReadDataFromFileASync(string fileName)
    method ReadDataFromFileASync (line 166) | public static void ReadDataFromFileASync(FileInfo file)
    method _ReadDataFromFileASync (line 178) | private static void _ReadDataFromFileASync(FileInfo file)
    method WriteDataToFile (line 230) | public static void WriteDataToFile(string data, string filePath)
    method _WriteFileMethod (line 240) | static object _WriteFileMethod(string data, string filePath)
    method FileIoUnitTest (line 283) | public static bool FileIoUnitTest()
  class FileEventArgs (line 307) | public class FileEventArgs
    method FileEventArgs (line 313) | public FileEventArgs(string data) { Data = data; }

FILE: src/PepperDash.Essentials.Core/Fusion/EssentialsHuddleSpaceRoomFusionRoomJoinMap.cs
  class EssentialsHuddleSpaceRoomFusionRoomJoinMap (line 15) | public class EssentialsHuddleSpaceRoomFusionRoomJoinMap : JoinMapBaseAdv...
    method EssentialsHuddleSpaceRoomFusionRoomJoinMap (line 218) | public EssentialsHuddleSpaceRoomFusionRoomJoinMap(uint joinStart)
    method EssentialsHuddleSpaceRoomFusionRoomJoinMap (line 229) | public EssentialsHuddleSpaceRoomFusionRoomJoinMap(uint joinStart, Type...

FILE: src/PepperDash.Essentials.Core/Fusion/FusionCustomPropertiesBridge.cs
  class FusionCustomPropertiesBridge (line 16) | public class FusionCustomPropertiesBridge
    method EvaluateRoomInfo (line 25) | public void EvaluateRoomInfo(IEssentialsRoom room, RoomInformation roo...

FILE: src/PepperDash.Essentials.Core/Fusion/FusionEventHandlers.cs
  class ScheduleChangeEventArgs (line 12) | public class ScheduleChangeEventArgs : EventArgs
  class MeetingChangeEventArgs (line 23) | public class MeetingChangeEventArgs : EventArgs

FILE: src/PepperDash.Essentials.Core/Fusion/FusionProcessorQueries.cs
  class ProcessorProgReg (line 14) | public class ProcessorProgReg
    method GetProcessorProgReg (line 22) | public static Dictionary<int, ProcessorProgramItem> GetProcessorProgReg()
  class ProcessorProgramItem (line 62) | public class ProcessorProgramItem

FILE: src/PepperDash.Essentials.Core/Fusion/FusionRviDataClasses.cs
  class FusionRoomGuids (line 18) | public class FusionRoomGuids
    method FusionRoomGuids (line 48) | public FusionRoomGuids()
    method FusionRoomGuids (line 61) | public FusionRoomGuids(string roomName, uint ipId, string roomGuid, Di...
    method FusionRoomGuids (line 79) | public FusionRoomGuids(string roomName, uint ipId, string roomGuid, Di...
    method GenerateNewRoomGuid (line 97) | public string GenerateNewRoomGuid(uint progSlot, string mac)
    method AddStaticAsset (line 114) | public FusionAsset AddStaticAsset(FusionRoom room, int uid, string ass...
    method GetNextAvailableAssetNumber (line 135) | public static uint GetNextAvailableAssetNumber(FusionRoom room)
  class FusionOccupancySensorAsset (line 162) | public class FusionOccupancySensorAsset
    method FusionOccupancySensorAsset (line 186) | public FusionOccupancySensorAsset()
    method FusionOccupancySensorAsset (line 194) | public FusionOccupancySensorAsset(eAssetType type)
  class FusionAsset (line 205) | public class FusionAsset
    method FusionAsset (line 227) | public FusionAsset()
    method FusionAsset (line 239) | public FusionAsset(uint slotNum, string assetName, string type, string...
  class RoomSchedule (line 260) | public class RoomSchedule
    method RoomSchedule (line 270) | public RoomSchedule()
  class LocalTimeRequest (line 282) | public class LocalTimeRequest
  class RequestSchedule (line 294) | public class RequestSchedule
    method RequestSchedule (line 325) | public RequestSchedule(string requestID, string roomID)
  class RequestAction (line 339) | public class RequestAction
    method RequestAction (line 368) | public RequestAction(string roomID, string actionID, List<Parameter> p...
  class ActionResponse (line 380) | public class ActionResponse
  class Parameter (line 405) | public class Parameter
  class ScheduleResponse (line 431) | public class ScheduleResponse
    method ScheduleResponse (line 460) | public ScheduleResponse()
  class Event (line 470) | public class Event
    method GetInProgress (line 658) | bool GetInProgress()
  class Resources (line 675) | public class Resources
  class Rooms (line 688) | public class Rooms
  class Room (line 701) | public class Room
  class Attendees (line 724) | public class Attendees
  class Required (line 742) | public class Required
  class Optional (line 755) | public class Optional
  class MeetingType (line 768) | public class MeetingType
  class MeetingTypes (line 786) | public class MeetingTypes
  class LiveMeeting (line 799) | public class LiveMeeting
  class LiveMeetingURL (line 827) | public class LiveMeetingURL

FILE: src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionController.cs
  class IEssentialsRoomFusionController (line 25) | public class IEssentialsRoomFusionController : EssentialsDevice, IOccupa...
    method IEssentialsRoomFusionController (line 131) | public IEssentialsRoomFusionController(string key, string name, IEssen...
    method IEssentialsRoomFusionController (line 159) | public IEssentialsRoomFusionController(IEssentialsRoom room, string ip...
    method ConstructorHelper (line 172) | private void ConstructorHelper(IEssentialsRoom room, uint ipId, string...
    method GetGuidFilePath (line 267) | private string GetGuidFilePath(uint ipId)
    method Initialize (line 309) | public override void Initialize()
    method ExecuteCustomSteps (line 377) | protected virtual void ExecuteCustomSteps()
    method GenerateGuidFile (line 385) | private void GenerateGuidFile(string filePath)
    method ReadGuidFile (line 437) | private void ReadGuidFile(string filePath)
    method CreateSymbolAndBasicSigs (line 495) | protected virtual void CreateSymbolAndBasicSigs(uint ipId)
    method CrestronEnvironment_EthernetEventHandler (line 561) | protected void CrestronEnvironment_EthernetEventHandler(EthernetEventA...
    method GetSystemInfo (line 572) | protected void GetSystemInfo()
    method SetUpEthernetValues (line 588) | protected void SetUpEthernetValues()
    method GetProcessorEthernetValues (line 606) | protected void GetProcessorEthernetValues()
    method GetProcessorInfo (line 657) | protected void GetProcessorInfo()
    method GetCustomProperties (line 678) | protected void GetCustomProperties()
    method GetTouchpanelInfo (line 690) | private void GetTouchpanelInfo()
    method FusionRoom_OnlineStatusChange (line 700) | protected void FusionRoom_OnlineStatusChange(GenericBase currentDevice...
    method RequestLocalDateTime (line 775) | public void RequestLocalDateTime(object callbackObject)
    method RequestFullRoomSchedule (line 788) | public void RequestFullRoomSchedule(object callbackObject)
    method ModifyMeetingEndTimeConsoleHelper (line 816) | public void ModifyMeetingEndTimeConsoleHelper(string command)
    method ModifyMeetingEndTime (line 844) | public void ModifyMeetingEndTime(string requestId, int extendMinutes)
    method CreateAdHocMeeting (line 880) | public void CreateAdHocMeeting(string command)
    method ExtenderFusionRoomDataReservedSigs_DeviceExtenderSigChange (line 930) | protected void ExtenderFusionRoomDataReservedSigs_DeviceExtenderSigCha...
    method FusionRoomSchedule_DeviceExtenderSigChange (line 1120) | protected void FusionRoomSchedule_DeviceExtenderSigChange(DeviceExtend...
    method PrintTodaysSchedule (line 1227) | private void PrintTodaysSchedule()
    method SetUpSources (line 1251) | protected virtual void SetUpSources()
    method UsageTracker_DeviceUsageEnded (line 1313) | protected void UsageTracker_DeviceUsageEnded(object sender, DeviceUsag...
    method TryAddRouteActionSigs (line 1350) | protected void TryAddRouteActionSigs(string attrName, uint attrNum, st...
    method SetUpCommunitcationMonitors (line 1386) | private void SetUpCommunitcationMonitors()
    method SetUpDisplay (line 1488) | protected virtual void SetUpDisplay()
    method MapDisplayToRoomJoins (line 1588) | protected virtual void MapDisplayToRoomJoins(int displayIndex, uint jo...
    method SetUpError (line 1656) | private void SetUpError()
    method SetUpLocalOccupancy (line 1678) | private void SetUpLocalOccupancy()
    method FusionRoom_FusionAssetStateChange (line 1690) | private void FusionRoom_FusionAssetStateChange(FusionBase device, Fusi...
    method SetUpRemoteOccupancy (line 1702) | private void SetUpRemoteOccupancy()
    method RoomIsOccupiedFeedback_OutputChange (line 1741) | private void RoomIsOccupiedFeedback_OutputChange(object sender, Feedba...
    method ExtractNumberFromKey (line 1751) | private int ExtractNumberFromKey(string key)
    method Room_CurrentSourceInfoChange (line 1764) | protected void Room_CurrentSourceInfoChange(SourceListItem info, Chang...
    method FusionRoom_FusionStateChange (line 1796) | protected void FusionRoom_FusionStateChange(FusionBase device, FusionS...
    method SendHelpRequest (line 1907) | public void SendHelpRequest()
    method OnTimedEvent (line 1953) | private void OnTimedEvent(object source, ElapsedEventArgs e)
    method CancelHelpRequest (line 1960) | public void CancelHelpRequest()
    method ToggleHelpRequest (line 1983) | public void ToggleHelpRequest()
  class FusionRoomExtensions (line 2001) | public static class FusionRoomExtensions
    method CreateOffsetBoolSig (line 2012) | public static BooleanSigData CreateOffsetBoolSig(this FusionRoom fr, u...
    method CreateOffsetUshortSig (line 2034) | public static UShortSigData CreateOffsetUshortSig(this FusionRoom fr, ...
    method CreateOffsetStringSig (line 2056) | public static StringSigData CreateOffsetStringSig(this FusionRoom fr, ...
    method CreateStaticAsset (line 2076) | public static FusionStaticAsset CreateStaticAsset(this FusionRoom fr, ...
    method CreateOccupancySensorAsset (line 2101) | public static FusionOccupancySensor CreateOccupancySensorAsset(this Fu...
  class FusionStaticAssetExtensions (line 2129) | public static class FusionStaticAssetExtensions
    method TrySetMakeModel (line 2136) | public static void TrySetMakeModel(this FusionStaticAsset asset, Devic...
    method TryLinkAssetErrorToCommunication (line 2152) | public static void TryLinkAssetErrorToCommunication(this FusionStaticA...
  class RoomInformation (line 2173) | public class RoomInformation
    method RoomInformation (line 2178) | public RoomInformation()
  class FusionCustomProperty (line 2228) | public class FusionCustomProperty
    method FusionCustomProperty (line 2233) | public FusionCustomProperty()
    method FusionCustomProperty (line 2241) | public FusionCustomProperty(string id)

FILE: src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionControllerFactory.cs
  class IEssentialsRoomFusionControllerFactory (line 9) | public class IEssentialsRoomFusionControllerFactory : EssentialsDeviceFa...
    method IEssentialsRoomFusionControllerFactory (line 14) | public IEssentialsRoomFusionControllerFactory()
    method BuildDevice (line 24) | public override EssentialsDevice BuildDevice(PepperDash.Essentials.Cor...

FILE: src/PepperDash.Essentials.Core/Fusion/IEssentialsRoomFusionControllerPropertiesConfig.cs
  class IEssentialsRoomFusionControllerPropertiesConfig (line 7) | public class IEssentialsRoomFusionControllerPropertiesConfig

FILE: src/PepperDash.Essentials.Core/Fusion/IFusionHelpRequest.cs
  type IFusionHelpRequest (line 12) | public interface IFusionHelpRequest
    method SendHelpRequest (line 32) | void SendHelpRequest();
    method CancelHelpRequest (line 37) | void CancelHelpRequest();
    method ToggleHelpRequest (line 42) | void ToggleHelpRequest();

FILE: src/PepperDash.Essentials.Core/Fusion/eFusionHelpResponse.cs
  type eFusionHelpResponse (line 8) | public enum eFusionHelpResponse

FILE: src/PepperDash.Essentials.Core/Global/EthernetAdapterInfo.cs
  class EthernetAdapterInfo (line 12) | public class EthernetAdapterInfo

FILE: src/PepperDash.Essentials.Core/Global/Global.cs
  class Global (line 28) | public static class Global
    method SetFilePathPrefix (line 158) | public static void SetFilePathPrefix(string prefix)
    method SetAssemblyVersion (line 189) | public static void SetAssemblyVersion(string assemblyVersion)
    method IsRunningDevelopmentVersion (line 201) | public static bool IsRunningDevelopmentVersion(List<string> developmen...
    method IsRunningMinimumVersionOrHigher (line 238) | public static bool IsRunningMinimumVersionOrHigher(string minimumVersion)
    method Global (line 304) | static Global()

FILE: src/PepperDash.Essentials.Core/Global/JobTimer.cs
  class JobTimer (line 12) | public static class JobTimer
    method AddAction (line 22) | public static void AddAction(Action act)
    method AddJobTimerItem (line 31) | public static void AddJobTimerItem(JobTimerItem item)
    method CheckAndRunTimer (line 41) | static void CheckAndRunTimer()
    method MinuteTimerCallback (line 49) | static void MinuteTimerCallback()
  class JobTimerItem (line 59) | public class JobTimerItem
    method JobTimerItem (line 87) | public JobTimerItem(string key, eJobTimerCycleTypes cycle, Action act)
  type eJobTimerCycleTypes (line 96) | public enum eJobTimerCycleTypes

FILE: src/PepperDash.Essentials.Core/Global/Scheduler.cs
  class Scheduler (line 19) | public static class Scheduler
    method Scheduler (line 23) | static Scheduler()
    method DeleteEventGroup (line 36) | static void DeleteEventGroup(string groupName)
    method ClearEventsFromGroup (line 54) | static void ClearEventsFromGroup(string groupName)
    method ListAllEventGroups (line 78) | static void ListAllEventGroups(string command)
    method ListAllEventsForGroup (line 87) | static void ListAllEventsForGroup(string args)
    method AddEventGroup (line 121) | public static void AddEventGroup(ScheduledEventGroup eventGroup)
    method RemoveEventGroup (line 135) | public static void RemoveEventGroup(ScheduledEventGroup eventGroup)
    method GetEventGroup (line 146) | public static ScheduledEventGroup GetEventGroup(string key)
  class SchedulerUtilities (line 157) | public static class SchedulerUtilities
    method CheckIfDayOfWeekMatchesRecurrenceDays (line 168) | public static bool CheckIfDayOfWeekMatchesRecurrenceDays(DateTime even...
    method CheckEventTimeForMatch (line 229) | public static bool CheckEventTimeForMatch(ScheduledEvent evnt, DateTim...
    method CheckEventRecurrenceForMatch (line 237) | public static bool CheckEventRecurrenceForMatch(ScheduledEvent evnt, S...
    method CreateEventFromConfig (line 245) | public static void CreateEventFromConfig(ScheduledEventConfig config, ...
    method ConvertDayOfWeek (line 308) | private static ScheduledEventCommon.eWeekDays ConvertDayOfWeek(DateTim...
    method IsFlagSet (line 313) | private static bool IsFlagSet<T>(this T value, T flag) where T : struct
    method CheckIsEnum (line 323) | private static void CheckIsEnum<T>(bool withFlags)

FILE: src/PepperDash.Essentials.Core/InUseTracking/IInUseTracking.cs
  type IInUseTracking (line 12) | public interface IInUseTracking

FILE: src/PepperDash.Essentials.Core/InUseTracking/InUseTracking.cs
  class InUseTracking (line 13) | public class InUseTracking
    method InUseTracking (line 34) | public InUseTracking()
    method AddUser (line 46) | public void AddUser(object objectToAdd, string label)
    method RemoveUser (line 65) | public void RemoveUser(object objectToRemove, string label)
  class InUseTrackingObject (line 82) | public class InUseTrackingObject
    method InUseTrackingObject (line 99) | public InUseTrackingObject(object user, string label)

FILE: src/PepperDash.Essentials.Core/Interfaces/ILogStrings.cs
  type ILogStrings (line 13) | [Obsolete("ILogStrings is no longer supported and will be removed in a f...
    method SendToLog (line 19) | void SendToLog(IKeyed device, string logMessage);

FILE: src/PepperDash.Essentials.Core/Interfaces/ILogStringsWithLevel.cs
  type ILogStringsWithLevel (line 13) | [Obsolete("ILogStringsWithLevel is no longer supported and will be remov...
    method SendToLog (line 19) | void SendToLog(IKeyed device, Debug.ErrorLogLevel level, string logMes...

FILE: src/PepperDash.Essentials.Core/JoinMaps/JoinMapBase.cs
  class JoinMapHelper (line 23) | public static class JoinMapHelper
    method GetSerializedJoinMapForDevice (line 33) | public static string GetSerializedJoinMapForDevice(string joinMapKey)
    method GetJoinMapForDevice (line 51) | public static string GetJoinMapForDevice(string joinMapKey)
    method TryGetJoinMapAdvancedForDevice (line 61) | public static Dictionary<string, JoinData> TryGetJoinMapAdvancedForDev...
  class JoinMapBaseAdvanced (line 97) | public abstract class JoinMapBaseAdvanced
    method JoinMapBaseAdvanced (line 113) | protected JoinMapBaseAdvanced(uint joinStart)
    method JoinMapBaseAdvanced (line 125) | protected JoinMapBaseAdvanced(uint joinStart, Type type):this(joinStart)
    method AddJoins (line 134) | protected void AddJoins(Type type)
    method PrintJoinMapInfo (line 173) | public void PrintJoinMapInfo()
    method JoinmapStringBuilder (line 180) | private StringBuilder JoinmapStringBuilder()
    method MarkdownJoinMapInfo (line 225) | public void MarkdownJoinMapInfo(string deviceKey, string bridgeKey)
    method WriteJoinmapMarkdown (line 237) | private static void WriteJoinmapMarkdown(StringBuilder stringBuilder, ...
    method GetSortedJoins (line 254) | static List<KeyValuePair<string, JoinDataComplete>> GetSortedJoins(Dic...
    method AppendJoinList (line 264) | static StringBuilder AppendJoinList(List<KeyValuePair<string, JoinData...
    method SetCustomJoinData (line 304) | public void SetCustomJoinData(Dictionary<string, JoinData> joinData)
  type eJoinCapabilities (line 340) | [Flags]
  type eJoinType (line 382) | [Flags]
  class JoinMetadata (line 429) | public class JoinMetadata
  class JoinData (line 461) | public class JoinData
  class JoinDataComplete (line 485) | public class JoinDataComplete
    method JoinDataComplete (line 506) | public JoinDataComplete(JoinData data, JoinMetadata metadata)
    method GetMarkdownFormattedData (line 518) | public string GetMarkdownFormattedData(string stringFormatter, int des...
    method SetJoinOffset (line 580) | public void SetJoinOffset(uint joinOffset)
    method SetCustomJoinData (line 613) | public void SetCustomJoinData(JoinData customJoinData)
    method GetNameAttribute (line 621) | public string GetNameAttribute(MemberInfo memberInfo)
  class JoinNameAttribute (line 639) | [AttributeUsage(AttributeTargets.All)]
    method JoinNameAttribute (line 648) | public JoinNameAttribute(string name)

FILE: src/PepperDash.Essentials.Core/License/EssentialsLicenseManager.cs
  class LicenseManager (line 19) | public abstract class LicenseManager
    method LicenseManager (line 39) | protected LicenseManager()
    method GetStatusString (line 50) | protected abstract string GetStatusString();
  class MockEssentialsLicenseManager (line 56) | public class MockEssentialsLicenseManager : LicenseManager
    method MockEssentialsLicenseManager (line 74) | MockEssentialsLicenseManager() : base()
    method SetIsValid (line 92) | void SetIsValid(bool isValid)
    method SetFromConsole (line 100) | void SetFromConsole(bool isValid)
    method GetStatusString (line 109) | protected override string GetStatusString()

FILE: src/PepperDash.Essentials.Core/Lighting/Lighting Interfaces.cs
  type ILightingScenes (line 9) | public interface ILightingScenes
    method SelectScene (line 25) | void SelectScene(LightingScene scene);
  type ILightingScenesDynamic (line 37) | public interface ILightingScenesDynamic : ILightingScenes
  type ILightingMasterRaiseLower (line 48) | public interface ILightingMasterRaiseLower
    method MasterRaise (line 53) | void MasterRaise();
    method MasterLower (line 58) | void MasterLower();
    method MasterRaiseLowerStop (line 63) | void MasterRaiseLowerStop();
  type ILightingLoad (line 69) | public interface ILightingLoad
    method SetLoadLevel (line 75) | void SetLoadLevel(int level);
    method Raise (line 80) | void Raise();
    method Lower (line 85) | void Lower();
  class LightingSceneChangeEventArgs (line 101) | public class LightingSceneChangeEventArgs : EventArgs
    method LightingSceneChangeEventArgs (line 112) | public LightingSceneChangeEventArgs(LightingScene scene)

FILE: src/PepperDash.Essentials.Core/Lighting/LightingScene.cs
  class LightingScene (line 11) | public class LightingScene
    method LightingScene (line 60) | public LightingScene()

FILE: src/PepperDash.Essentials.Core/Microphone Privacy/MicrophonePrivacyController.cs
  class MicrophonePrivacyController (line 20) | public class MicrophonePrivacyController : EssentialsDevice
    method MicrophonePrivacyController (line 80) | public MicrophonePrivacyController(string key, MicrophonePrivacyContro...
    method CustomActivate (line 92) | public override bool CustomActivate()
    method Initialize (line 132) | public override void Initialize()
    method SetPrivacyDevice (line 142) | public void SetPrivacyDevice(IPrivacy privacyDevice)
    method PrivacyModeIsOnFeedback_OutputChange (line 147) | void PrivacyModeIsOnFeedback_OutputChange(object sender, EventArgs e)
    method CheckPrivacyMode (line 153) | void CheckPrivacyMode()
    method AddInput (line 166) | void AddInput(IDigitalInput input)
    method RemoveInput (line 173) | void RemoveInput(IDigitalInput input)
    method SetRedLedRelay (line 183) | void SetRedLedRelay(GenericRelayDevice relay)
    method SetGreenLedRelay (line 188) | void SetGreenLedRelay(GenericRelayDevice relay)
    method InputStateFeedback_OutputChange (line 198) | void InputStateFeedback_OutputChange(object sender, EventArgs e)
    method TogglePrivacyMute (line 207) | public void TogglePrivacyMute()
    method TurnOnRedLeds (line 212) | void TurnOnRedLeds()
    method TurnOnGreenLeds (line 219) | void TurnOnGreenLeds()
    method SetLedStates (line 229) | void SetLedStates()
    method TurnOffAllLeds (line 242) | void TurnOffAllLeds()
    method SetRelayStates (line 250) | void SetRelayStates()
  class MicrophonePrivacyControllerFactory (line 273) | public class MicrophonePrivacyControllerFactory : EssentialsDeviceFactor...
    method MicrophonePrivacyControllerFactory (line 278) | public MicrophonePrivacyControllerFactory()
    method BuildDevice (line 287) | public override EssentialsDevice BuildDevice(DeviceConfig dc)

FILE: src/PepperDash.Essentials.Core/Microphone Privacy/MicrophonePrivacyControllerConfig.cs
  class MicrophonePrivacyControllerConfig (line 14) | public class MicrophonePrivacyControllerConfig
  class KeyedDevice (line 33) | public class KeyedDevice

FILE: src/PepperDash.Essentials.Core/Monitoring/CrestronGenericBaseCommunicationMonitor.cs
  class CrestronGenericBaseCommunicationMonitor (line 19) | public class CrestronGenericBaseCommunicationMonitor : StatusMonitorBase
    method CrestronGenericBaseCommunicationMonitor (line 30) | public CrestronGenericBaseCommunicationMonitor(IKeyed parent, GenericB...
    method Start (line 40) | public override void Start()
    method Stop (line 51) | public override void Stop()
    method Device_OnlineStatusChange (line 56) | void Device_OnlineStatusChange(GenericBase currentDevice, OnlineOfflin...
    method GetStatus (line 61) | void GetStatus()

FILE: src/PepperDash.Essentials.Core/Monitoring/GenericCommunicationMonitor.cs
  class GenericCommunicationMonitor (line 13) | public class GenericCommunicationMonitor : StatusMonitorBase
    method GenericCommunicationMonitor (line 50) | public GenericCommunicationMonitor(IKeyed parent, IBasicCommunication ...
    method GenericCommunicationMonitor (line 79) | public GenericCommunicationMonitor(IKeyed parent, IBasicCommunication ...
    method GenericCommunicationMonitor (line 98) | public GenericCommunicationMonitor(IKeyed parent, IBasicCommunication ...
    method GenericCommunicationMonitor (line 130) | public GenericCommunicationMonitor(IKeyed parent, IBasicCommunication ...
    method GenericCommunicationMonitor (line 146) | public GenericCommunicationMonitor(IKeyed parent, IBasicCommunication ...
    method GenericCommunicationMonitor (line 165) | public GenericCommunicationMonitor(IKeyed parent, IBasicCommunication ...
    method Start (line 174) | public override void Start()
    method Socket_ConnectionChange (line 190) | private void Socket_ConnectionChange(object sender, GenericSocketStatu...
    method BeginPolling (line 207) | private void BeginPolling()
    method Stop (line 231) | public override void Stop()
    method Client_TextReceived (line 253) | private void Client_TextReceived(object sender, GenericCommMethodRecei...
    method Client_BytesReceived (line 258) | private void Client_BytesReceived(object sender, GenericCommMethodRece...
    method DataReceived (line 263) | private void DataReceived()
    method Poll (line 269) | private void Poll()
  class CommunicationMonitorConfig (line 290) | public class CommunicationMonitorConfig
    method CommunicationMonitorConfig (line 315) | public CommunicationMonitorConfig()

FILE: src/PepperDash.Essentials.Core/Monitoring/Interfaces.cs
  type IStatusMonitor (line 12) | public interface IStatusMonitor
    method Start (line 42) | void Start();
    method Stop (line 47) | void Stop();
  type ICommunicationMonitor (line 54) | public interface ICommunicationMonitor
  type MonitorStatus (line 65) | public enum MonitorStatus
  class MonitorStatusChangeEventArgs (line 91) | public class MonitorStatusChangeEventArgs : EventArgs
    method MonitorStatusChangeEventArgs (line 107) | public MonitorStatusChangeEventArgs(MonitorStatus status)
    method MonitorStatusChangeEventArgs (line 118) | public MonitorStatusChangeEventArgs(MonitorStatus status, string message)

FILE: src/PepperDash.Essentials.Core/Monitoring/StatusMonitorBase.cs
  class StatusMonitorBase (line 19) | public abstract class StatusMonitorBase : IStatusMonitor, IKeyName
    method StatusMonitorBase (line 96) | public StatusMonitorBase(IKeyed parent, long warningTime, long errorTime)
    method Start (line 113) | public abstract void Start();
    method Stop (line 118) | public abstract void Stop();
    method OnStatusChange (line 124) | protected void OnStatusChange(MonitorStatus status)
    method OnStatusChange (line 141) | protected void OnStatusChange(MonitorStatus status, string message)
    method StartErrorTimers (line 156) | protected void StartErrorTimers()
    method StopErrorTimers (line 165) | protected void StopErrorTimers()
    method ResetErrorTimers (line 176) | protected void ResetErrorTimers()

FILE: src/PepperDash.Essentials.Core/Monitoring/StatusMonitorCollection.cs
  class StatusMonitorCollection (line 19) | public class StatusMonitorCollection : IStatusMonitor
    method StatusMonitorCollection (line 54) | public StatusMonitorCollection(IKeyed parent)
    method Start (line 62) | public void Start()
    method ProcessStatuses (line 70) | void ProcessStatuses()
    method mon_StatusChange (line 134) | void mon_StatusChange(object sender, MonitorStatusChangeEventArgs e)
    method Stop (line 142) | public void Stop()
    method AddMonitor (line 152) | public void AddMonitor(IStatusMonitor monitor)
    method OnStatusChange (line 163) | protected void OnStatusChange(MonitorStatus status, string message)

FILE: src/PepperDash.Essentials.Core/Monitoring/SystemMonitorController.cs
  class SystemMonitorController (line 21) | public class SystemMonitorController : EssentialsBridgeableDevice
    method SystemMonitorController (line 117) | public SystemMonitorController(string key)
    method CrestronEnvironmentOnProgramStatusEventHandler (line 159) | private void CrestronEnvironmentOnProgramStatusEventHandler(eProgramSt...
    method PollUptime (line 171) | public void PollUptime(object obj)
    method ParseUptime (line 183) | private void ParseUptime(string response)
    method ProcessorReboot (line 206) | public static void ProcessorReboot()
    method ProgramReset (line 219) | public static void ProgramReset(uint index)
    method CrestronEnvironmentOnEthernetEventHandler (line 232) | private void CrestronEnvironmentOnEthernetEventHandler(EthernetEventAr...
    method CreateEthernetStatusFeedbacks (line 242) | private void CreateEthernetStatusFeedbacks()
    method UpdateEthernetStatusFeeedbacks (line 256) | private void UpdateEthernetStatusFeeedbacks()
    method RefreshSystemMonitorData (line 277) | private void RefreshSystemMonitorData()
    method UpdateFeedback (line 283) | private void UpdateFeedback(object o)
    method OnSystemMonitorPropertiesChanged (line 300) | private void OnSystemMonitorPropertiesChanged()
    method CustomActivate (line 313) | public override bool CustomActivate()
    method LinkToApi (line 324) | public override void LinkToApi(BasicTriList trilist, uint joinStart, s...
    method LinkEthernetInfoJoins (line 368) | private static void LinkEthernetInfoJoins(SystemMonitorController syst...
    method LinkProgramInfoJoins (line 389) | private static void LinkProgramInfoJoins(SystemMonitorController syste...
    method SystemMonitor_ProgramChange (line 443) | private void SystemMonitor_ProgramChange(Program sender, ProgramEventA...
    method TimeZoneInformation_TimeZoneChange (line 477) | private void TimeZoneInformation_TimeZoneChange(TimeZoneEventArgs args)
    class EthernetStatusFeedbacks (line 489) | public class EthernetStatusFeedbacks
      method EthernetStatusFeedbacks (line 551) | public EthernetStatusFeedbacks(short adapterIndex)
      method UpdateEthernetStatus (line 637) | public void UpdateEthernetStatus()
    class ProgramStatusFeedbacks (line 657) | public class ProgramStatusFeedbacks
      method ProgramStatusFeedbacks (line 724) | public ProgramStatusFeedbacks(Program program)
      method GetProgramInfo (line 759) | public void GetProgramInfo()
      method GetProgramInfo (line 764) | private void GetProgramInfo(object o)
      method UpdateFeedbacks (line 851) | private void UpdateFeedbacks()
      method OnProgramInfoChanged (line 866) | public void OnProgramInfoChanged()
      method ParseConsoleData (line 876) | private string ParseConsoleData(string data, string line, string sta...
  class ProgramInfo (line 911) | public class ProgramInfo
    method ProgramInfo (line 1034) | public ProgramInfo(uint number)
  class ProgramInfoEventArgs (line 1059) | public class ProgramInfoEventArgs : EventArgs
    method ProgramInfoEventArgs (line 1070) | public ProgramInfoEventArgs(ProgramInfo progInfo)

FILE: src/PepperDash.Essentials.Core/PartitionSensor/EssentialsPartitionController.cs
  class EssentialsPartitionController (line 13) | public class EssentialsPartitionController : IPartitionController
    method EssentialsPartitionController (line 62) | public EssentialsPartitionController(string key, string name, IPartiti...
    method PartitionPresentFeedback_OutputChange (line 91) | private void PartitionPresentFeedback_OutputChange(object sender, Feed...
    method SetAutoMode (line 109) | public void SetAutoMode()
    method SetManualMode (line 136) | public void SetManualMode()
    method SetPartitionStatePresent (line 163) | public void SetPartitionStatePresent()
    method SetPartitionStateNotPresent (line 175) | public void SetPartitionStateNotPresent()
    method ToggglePartitionState (line 187) | public void ToggglePartitionState()

FILE: src/PepperDash.Essentials.Core/PartitionSensor/IPartitionStateProvider.cs
  type IPartitionStateProvider (line 10) | public interface IPartitionStateProvider : IKeyName
  type IPartitionController (line 28) | public interface IPartitionController : IPartitionStateProvider
    method SetPartitionStatePresent (line 45) | void SetPartitionStatePresent();
    method SetPartitionStateNotPresent (line 50) | void SetPartitionStateNotPresent();
    method ToggglePartitionState (line 55) | void ToggglePartitionState();
    method SetManualMode (line 60) | void SetManualMode();
    method SetAutoMode (line 65) | void SetAutoMode();

FILE: src/PepperDash.Essentials.Core/Plugins/IPluginDeviceFactory.cs
  type IPluginDeviceFactory (line 10) | public interface IPluginDeviceFactory : IDeviceFactory
  type IPluginDevelopmentDeviceFactory (line 22) | [Obsolete("This interface is obsolete and will be removed in a future ve...

FILE: src/PepperDash.Essentials.Core/Plugins/PluginLoader.cs
  class PluginLoader (line 17) | public static class PluginLoader
    method PluginLoader (line 58) | static PluginLoader()
    method AddProgramAssemblies (line 68) | public static void AddProgramAssemblies()
    method SetEssentialsAssembly (line 128) | public static void SetEssentialsAssembly(string name, Assembly assembly)
    method LoadAssembly (line 142) | static LoadedAssembly LoadAssembly(string filePath)
    method GetAssemblyVersion (line 177) | public static string GetAssemblyVersion(Assembly assembly)
    method CheckIfAssemblyLoaded (line 200) | public static bool CheckIfAssemblyLoaded(string name)
    method AddLoadedAssembly (line 224) | public static void AddLoadedAssembly(string name, Assembly assembly)
    method ReportAssemblyVersions (line 235) | public static void ReportAssemblyVersions(string command)
    method MoveDllAssemblies (line 255) | static void MoveDllAssemblies()
    method UnzipAndMoveCplzArchives (line 311) | static void UnzipAndMoveCplzArchives()
    method LoadPluginAssemblies (line 389) | static void LoadPluginAssemblies()
    method LoadCustomPluginTypes (line 410) | static void LoadCustomPluginTypes()
    method LoadCustomPlugin (line 481) | static void LoadCustomPlugin(IPluginDeviceFactory pluginDeviceFactory,...
    method LoadDeviceFactories (line 514) | private static void LoadDeviceFactories(IPluginDeviceFactory deviceFac...
    method LoadPlugins (line 530) | public static void LoadPlugins()
  class LoadedAssembly (line 560) | public class LoadedAssembly
    method LoadedAssembly (line 586) | public LoadedAssembly(string name, string version, Assembly assembly)
    method SetAssembly (line 596) | public void SetAssembly(Assembly assembly)

FILE: src/PepperDash.Essentials.Core/Presets/DevicePresets.cs
  class DevicePresetsModel (line 20) | public class DevicePresetsModel : Device
    method DevicePresetsModel (line 55) | public DevicePresetsModel(string key, ISetTopBoxNumericKeypad setTopBo...
    method DevicePresetsModel (line 94) | public DevicePresetsModel(string key, string fileName) : base(key)
    method SetFileName (line 178) | public void SetFileName(string path)
    method LoadChannels (line 189) | public void LoadChannels()
    method Dial (line 230) | public void Dial(int presetNum)
    method Dial (line 241) | public void Dial(string chanNum)
    method Dial (line 280) | public void Dial(int presetNum, ISetTopBoxNumericKeypad setTopBox)
    method Dial (line 291) | public void Dial(string chanNum, ISetTopBoxNumericKeypad setTopBox)
    method OnPresetRecalled (line 315) | private void OnPresetRecalled(ISetTopBoxNumericKeypad setTopBox, strin...
    method UpdatePreset (line 330) | public void UpdatePreset(int index, PresetChannel preset)
    method UpdatePresets (line 347) | public void UpdatePresets(List<PresetChannel> presets)
    method SavePresets (line 356) | private void SavePresets()
    method OnPresetsSaved (line 376) | private void OnPresetsSaved()
    method Pulse (line 385) | private void Pulse(Action<bool> act)

FILE: src/PepperDash.Essentials.Core/Presets/DevicePresetsView.cs
  class DevicePresetsView (line 14) | public class DevicePresetsView
    method DevicePresetsView (line 47) | public DevicePresetsView(BasicTriListWithSmartObject tl, DevicePresets...
    method Attach (line 65) | public void Attach()
    method Detach (line 82) | public void Detach()
    method Model_PresetsLoaded (line 87) | void Model_PresetsLoaded(object sender, EventArgs e)

FILE
Condensed preview — 784 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,639K chars).
[
  {
    "path": ".config/dotnet-tools.json",
    "chars": 181,
    "preview": "{\n  \"version\": 1,\n  \"isRoot\": true,\n  \"tools\": {\n    \"csharpier\": {\n      \"version\": \"1.2.4\",\n      \"commands\": [\n      "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 762,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG]-\"\nlabels: bug\nassignees: ''\n\n---\n\n**Was thi"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 762,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: \"[FEATURE]-\"\nlabels: enhancement\nassignees: ''\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/rfi_request.md",
    "chars": 614,
    "preview": "---\nname: Request for Information\nabout: Request specific information about capabilities of the framework\ntitle: \"[RFI]-"
  },
  {
    "path": ".github/scripts/GenerateVersionNumber-2.0.0.ps1",
    "chars": 593,
    "preview": "$latestVersion = [version]\"2.0.0\"\n\n$newVersion = [version]$latestVersion\n$phase = \"\"\n$newVersionString = \"\"\n\nswitch -reg"
  },
  {
    "path": ".github/scripts/GenerateVersionNumber.ps1",
    "chars": 2149,
    "preview": "$latestVersions = $(git tag --merged origin/main)\n$latestVersion = [version]\"0.0.0\"\nWrite-Host \"GITHUB_REF: $($Env:GITHU"
  },
  {
    "path": ".github/scripts/UpdateAssemblyVersion.ps1",
    "chars": 1584,
    "preview": "function Update-SourceVersion {\n    Param ([string]$Version)\n    #$fullVersion = $Version\n    $baseVersion = [regex]::M"
  },
  {
    "path": ".github/scripts/ZipBuildOutput.ps1",
    "chars": 2151,
    "preview": "# Uncomment these for local testing\n# $Env:GITHUB_WORKSPACE = \"C:\\Working Directories\\PD\\essentials\"\n# $Env:SOLUTION_FIL"
  },
  {
    "path": ".github/workflows/EssentialsPlugins-builds-4-series-caller.yml",
    "chars": 745,
    "preview": "name: Build PepperDash Essentials\n\non:\n  push:\n    branches:\n      - '**'\n\njobs:\n  getVersion:\n    uses: PepperDash/work"
  },
  {
    "path": ".github/workflows/publish-docs.yml",
    "chars": 1138,
    "preview": "name: Publish Docs\n\n# Trigger the action on push to main\non:\n  push:\n    branches:      \n      - main\n\n# Sets permission"
  },
  {
    "path": ".gitignore",
    "chars": 6817,
    "preview": "#ignore thumbnails created by windows\nThumbs.db\n#Ignore files build by Visual Studio\n*.user\n*.aps\n*.pch\n*.vspscc\n*_i.c\n*"
  },
  {
    "path": ".gitmodules",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".releaserc.json",
    "chars": 1091,
    "preview": "{\n  \"plugins\": [\n    [\n      \"@semantic-release/commit-analyzer\",\n      {\n        \"releaseRules\": [\n          { \"scope\":"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 201,
    "preview": "{\n  \"recommendations\": [\n    \"ms-dotnettools.vscode-dotnet-runtime\",\n    \"ms-dotnettools.csharp\",\n    \"ms-dotnettools.cs"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 7291,
    "preview": "# Contributors Guide\n\nEssentials is an open source project. If you are interested in making it better,\nthere are many wa"
  },
  {
    "path": "Crestron-Library-Usage-Analysis.md",
    "chars": 9633,
    "preview": "# Crestron Library Usage Analysis - PepperDash Essentials\n\nThis document provides a comprehensive analysis of Crestron c"
  },
  {
    "path": "LICENSE.md",
    "chars": 1078,
    "preview": "Copyright (c) <2020> PepperDash Technology Corporation\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "PepperDash.Essentials.4Series.sln",
    "chars": 6699,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.4.3321"
  },
  {
    "path": "README.md",
    "chars": 4234,
    "preview": "# PepperDash Essentials Framework (c) 2020\n\n## [Latest Release](https://github.com/PepperDash/Essentials/releases/latest"
  },
  {
    "path": "Sample Presets/SampleDirecTV.json",
    "chars": 541,
    "preview": "{\n  \"name\": \"Sample DirecTV List\",\n  \"channels\": [\n    {\n      \"name\": \"HBO\",\n      \"IconUrl\": \"HBO\",\n      \"Channel\": \""
  },
  {
    "path": "docs/docfx.json",
    "chars": 1190,
    "preview": "{\n  \"$schema\": \"https://raw.githubusercontent.com/dotnet/docfx/main/schemas/docfx.schema.json\",\n  \"metadata\": [\n    {\n  "
  },
  {
    "path": "docs/docs/CardFrame.md",
    "chars": 410,
    "preview": "        {\n                \"key\": \"cardCage1\",\n                \"uid\": 1,\n                \"name\": \"Internal Card Cage\",\n  "
  },
  {
    "path": "docs/docs/Get-started.md",
    "chars": 2105,
    "preview": "# Get started\n\n---\n[YouTube Video - Getting Started with PepperDash Essentials](https://youtu.be/FxEZtbpCwiQ)\n***\n\n## Ge"
  },
  {
    "path": "docs/docs/Home.md",
    "chars": 3565,
    "preview": "# Welcome to PepperDash Essentials!\n\nPepperDash Essentials is an open-source framework for control systems, built on Cre"
  },
  {
    "path": "docs/docs/Plugins-Deprecated.md",
    "chars": 5098,
    "preview": "# Deprecated\n\n**Note : this entry is out of date - please see [Plugins](~/docs/technical-docs/Plugins.md)**\n\n## What are"
  },
  {
    "path": "docs/docs/SIMPL-Bridging-Deprecated.md",
    "chars": 20792,
    "preview": "# Deprecated\n\n**Note : this entry is out of date - please see [SIMPL Windows Bridging](~/docs/SIMPL-Bridging.md)**\n\n## S"
  },
  {
    "path": "docs/docs/SIMPL-Bridging.md",
    "chars": 20788,
    "preview": "# SIMPL Windows Bridging\n\n**Note : this entry is out of date - please see [SIMPL Windows Bridging - Updated](~/docs/usag"
  },
  {
    "path": "docs/docs/getting-started.md",
    "chars": 17,
    "preview": "# Getting Started"
  },
  {
    "path": "docs/docs/how-to/how-to-add-docs.md",
    "chars": 4323,
    "preview": "# How to Add Documentation to Essentials\n\nThis guide explains how to add new documentation articles to the Essentials do"
  },
  {
    "path": "docs/docs/technical-docs/Arch-1.md",
    "chars": 3465,
    "preview": "# Essentials architecture\n\n## Device and DeviceManager\n\n---\n[YouTube Video - The Device Model in PepperDash Essentials]("
  },
  {
    "path": "docs/docs/technical-docs/Arch-activate.md",
    "chars": 12525,
    "preview": "# Essentials architecture: DeviceManager activation\n\n## What is all this?\n\nThe Essentials system architecture is a loose"
  },
  {
    "path": "docs/docs/technical-docs/Arch-lifecycle.md",
    "chars": 347,
    "preview": "# Essentials Configurable System Lifecycle\n\nThe diagram below describes how Essentials gets a program up and running.\n\n("
  },
  {
    "path": "docs/docs/technical-docs/Arch-summary.md",
    "chars": 1185,
    "preview": "# Essentials architecture\n\n## Summary\n\nPepperDash Essentials is an open-source framework for control systems, built on C"
  },
  {
    "path": "docs/docs/technical-docs/Arch-topics.md",
    "chars": 10267,
    "preview": "# Configuration topics\n\nConfiguration is central to Essentials. On this page we will cover configuration-related topics,"
  },
  {
    "path": "docs/docs/technical-docs/Communication-Basics.md",
    "chars": 3921,
    "preview": "# Unifying communication methods\n\nIn networked A/V systems, devices can use many different methods of communication: COM"
  },
  {
    "path": "docs/docs/technical-docs/ConfigurationStructure.md",
    "chars": 12277,
    "preview": "# Configuration Structure\n\n---\n\n[YouTube Video - Configuring PepperDash Essentials](https://youtu.be/EK8Ti9a1o7s)\n\n***\n\n"
  },
  {
    "path": "docs/docs/technical-docs/Connection-Based-Routing.md",
    "chars": 12975,
    "preview": "# Essentials connection-based routing\n\n## TL;DR\n\nRouting is defined by a connection graph or a wiring diagram. Routable "
  },
  {
    "path": "docs/docs/technical-docs/Debugging.md",
    "chars": 10076,
    "preview": "# Methods of Debugging\n\n1. You can use Visual Studio step debugging\n   - Pros:\n     - Detailed real time debugging into "
  },
  {
    "path": "docs/docs/technical-docs/Feedback-Classes.md",
    "chars": 6396,
    "preview": "# Feedback classes\n\n***\n* [YouTube Video - Using Feedbacks in PepperDash Essentials](https://youtu.be/5GQVRKbD9Rk)\n***\n\n"
  },
  {
    "path": "docs/docs/technical-docs/Glossary-of-Terms.md",
    "chars": 1419,
    "preview": "# Glossary of Terms\n\n**Assembly**\n An assembly is a file that is automatically generated by the compiler upon successful"
  },
  {
    "path": "docs/docs/technical-docs/Plugins.md",
    "chars": 7746,
    "preview": "# What are Essentials Plugins?\n\n**Note : this entry updates a deprecated method - for information related to that deprec"
  },
  {
    "path": "docs/docs/technical-docs/Supported-Devices.md",
    "chars": 1606,
    "preview": "# Essentials Framework Devices by Type\n\n## Cameras\n\n* VISCA protocol\n* Cisco (via codec)\n* Zoom (via Zoom Room)\n\n## Disc"
  },
  {
    "path": "docs/docs/toc.yml",
    "chars": 1740,
    "preview": "- name: Get Started With Essentials\n- href: ../index.md\n- href: Get-started.md \n- name: How-to's\n  items:\n  - name: How "
  },
  {
    "path": "docs/docs/usage/Bridging-To-Hardware-Resources.md",
    "chars": 930,
    "preview": "# Bridging to Hardware and Network Resources\n\nOne of the most powerful features of Essentials is the ability to bridge S"
  },
  {
    "path": "docs/docs/usage/DigitalInput.md",
    "chars": 5632,
    "preview": "# DigitalInput\n\nDigital Inputs can be bridged directly to SIMPL from any device that is both inlcuded within essentials "
  },
  {
    "path": "docs/docs/usage/GenericComm.md",
    "chars": 12516,
    "preview": "# GenericComm\n\nOne of the most common scenarios in control system development is utilizing RS232 to connect to a device."
  },
  {
    "path": "docs/docs/usage/IR-Driver-Bridging.md",
    "chars": 4731,
    "preview": "## Legacy IR Driver Bridging\n\n```json\n{\n\t\"id\": \"1\",\n\t\"name\": \"Apple TV\",\n\t\"key\": \"appleTv-1\",\n\t\"type\": \"genericIrControl"
  },
  {
    "path": "docs/docs/usage/JoinMaps.md",
    "chars": 7828,
    "preview": "# What is a Join Map?\n\nA join map is a class that defines the list of joins accessible to an `EssentialsBridgeableDevice"
  },
  {
    "path": "docs/docs/usage/RelayOutput.md",
    "chars": 5242,
    "preview": "# RelayOutput\n\nRelays can be bridged directly to SIMPL from any device that is both inlcuded within essentials and has a"
  },
  {
    "path": "docs/docs/usage/SIMPL-Bridging-Updated.md",
    "chars": 22842,
    "preview": "# Use with SIMPL Windows\n\n***\n* [YouTube Video - SIMPL Windows in PepperDash Essentials](https://youtu.be/P2jNzsfpgJE)\n*"
  },
  {
    "path": "docs/docs/usage/Standalone-Use.md",
    "chars": 1625,
    "preview": "# Stand-alone Application\n\nEssentials was originally designed as a standalone SIMPL# Pro control system application and "
  },
  {
    "path": "docs/index.md",
    "chars": 3171,
    "preview": "# Welcome to PepperDash Essentials!\n\nPepperDash Essentials is an open-source framework for control systems, built on Cre"
  },
  {
    "path": "docs/toc.yml",
    "chars": 51,
    "preview": "- name: Docs\n  href: docs/\n- name: API\n  href: api/"
  },
  {
    "path": "src/Directory.Build.props",
    "chars": 1009,
    "preview": "<Project>\n  <PropertyGroup>\n    <Version>2.29.0-local</Version>\n    <InformationalVersion>$(Version)</InformationalVersi"
  },
  {
    "path": "src/Directory.Build.targets",
    "chars": 4319,
    "preview": "<Project>\n  <ItemGroup>    \n    <None Include=\"$(TargetDir)$(TargetName).$(Version).$(TargetFramework).clz\" Condition=\"$"
  },
  {
    "path": "src/PepperDash.Core/ComTextHelper.cs",
    "chars": 1325,
    "preview": "using System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\nnamespace PepperDash.Core\n{\n  /// <summary>"
  },
  {
    "path": "src/PepperDash.Core/Comm/CommunicationGather.cs",
    "chars": 5283,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressi"
  },
  {
    "path": "src/PepperDash.Core/Comm/CommunicationStreamDebugging.cs",
    "chars": 4108,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\nusing PepperDash.Cor"
  },
  {
    "path": "src/PepperDash.Core/Comm/ControlPropertiesConfig.cs",
    "chars": 3326,
    "preview": "using System;\nusing Crestron.SimplSharp;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Converters;\n\nnamespace PepperDash"
  },
  {
    "path": "src/PepperDash.Core/Comm/EventArgs.cs",
    "chars": 7081,
    "preview": "/*PepperDash Technology Corp.\nCopyright:\t\t2017\n------------------------------------\n***Notice of Ownership and Copyrigh"
  },
  {
    "path": "src/PepperDash.Core/Comm/GenericSecureTcpIpClient.cs",
    "chars": 34546,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressi"
  },
  {
    "path": "src/PepperDash.Core/Comm/GenericSecureTcpIpClient_ForServer.cs",
    "chars": 34011,
    "preview": "/*PepperDash Technology Corp.\nJAG\nCopyright:\t\t2017\n------------------------------------\n***Notice of Ownership and Copy"
  },
  {
    "path": "src/PepperDash.Core/Comm/GenericSecureTcpIpServer.cs",
    "chars": 44927,
    "preview": "/*PepperDash Technology Corp.\nJAG\nCopyright:\t\t2017\n------------------------------------\n***Notice of Ownership and Copy"
  },
  {
    "path": "src/PepperDash.Core/Comm/GenericSshClient.cs",
    "chars": 23855,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading;\nusing Crestron.SimplSharp;\nu"
  },
  {
    "path": "src/PepperDash.Core/Comm/GenericTcpIpClient.cs",
    "chars": 17603,
    "preview": "using System;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing Crestron.SimplSharp;\nus"
  },
  {
    "path": "src/PepperDash.Core/Comm/GenericTcpIpClient_ForServer.cs",
    "chars": 27462,
    "preview": "/*PepperDash Technology Corp.\nJAG\nCopyright:\t\t2017\n------------------------------------\n***Notice of Ownership and Copy"
  },
  {
    "path": "src/PepperDash.Core/Comm/GenericTcpIpServer.cs",
    "chars": 40385,
    "preview": "/*PepperDash Technology Corp.\nJAG\nCopyright:\t\t2017\n------------------------------------\n***Notice of Ownership and Copy"
  },
  {
    "path": "src/PepperDash.Core/Comm/GenericUdpClient.cs",
    "chars": 15064,
    "preview": "using System;\nusing System.Net.Sockets;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing C"
  },
  {
    "path": "src/PepperDash.Core/Comm/GenericUdpServer.cs",
    "chars": 12317,
    "preview": "\nusing System;\nusing System.Linq;\nusing System.Text;\n\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp.CrestronSock"
  },
  {
    "path": "src/PepperDash.Core/Comm/StreamDebuggingExtensions.cs",
    "chars": 2607,
    "preview": "using System;\nusing Crestron.SimplSharp;\n\nnamespace PepperDash.Core\n{\n  /// <summary>\n  /// Extension methods for stream"
  },
  {
    "path": "src/PepperDash.Core/Comm/TcpClientConfigObject.cs",
    "chars": 2162,
    "preview": "using Newtonsoft.Json;\n\nnamespace PepperDash.Core\n{\n    /// <summary>\n    /// Represents a TcpClientConfigObject\n    //"
  },
  {
    "path": "src/PepperDash.Core/Comm/TcpServerConfigObject.cs",
    "chars": 2403,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/Comm/eControlMethods.cs",
    "chars": 2058,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/Comm/eStreamDebuggingDataTypeSettings.cs",
    "chars": 492,
    "preview": "using System;\n\nnamespace PepperDash.Core\n{\n  /// <summary>\n  /// The available settings for stream debugging data format"
  },
  {
    "path": "src/PepperDash.Core/Comm/eStreamDebuggingSetting.cs",
    "chars": 514,
    "preview": "using System;\n\nnamespace PepperDash.Core\n{\n  /// <summary>\n  /// The available settings for stream debugging\n  /// </sum"
  },
  {
    "path": "src/PepperDash.Core/CommunicationExtras.cs",
    "chars": 5631,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp.CrestronSockets;\nu"
  },
  {
    "path": "src/PepperDash.Core/Config/PortalConfigReader.cs",
    "chars": 8277,
    "preview": "using System;\nusing System.Linq;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp.CrestronIO;\nusing Newtonsoft.Json"
  },
  {
    "path": "src/PepperDash.Core/Conversion/Convert.cs",
    "chars": 811,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/CoreInterfaces.cs",
    "chars": 748,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\nusing "
  },
  {
    "path": "src/PepperDash.Core/Device.cs",
    "chars": 4944,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Serilog.Events;\n\nnamespace PepperDash.Core\n{\n\t//*****************"
  },
  {
    "path": "src/PepperDash.Core/EthernetHelper.cs",
    "chars": 2314,
    "preview": "using Crestron.SimplSharp;\nusing Newtonsoft.Json;\nusing Serilog.Events;\n\nnamespace PepperDash.Core\n{\n /// <summary>\n //"
  },
  {
    "path": "src/PepperDash.Core/EventArgs.cs",
    "chars": 3494,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/GenericRESTfulCommunications/Constants.cs",
    "chars": 926,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/GenericRESTfulCommunications/GenericRESTfulClient.cs",
    "chars": 7829,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\nusing "
  },
  {
    "path": "src/PepperDash.Core/JsonStandardObjects/EventArgs and Constants.cs",
    "chars": 1560,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/JsonStandardObjects/JsonToSimplDevice.cs",
    "chars": 4919,
    "preview": "using System;\nusing System.Linq;\nusing Crestron.SimplSharp;\nusing PepperDash.Core.JsonToSimpl;\nusing Serilog.Events;\n\nn"
  },
  {
    "path": "src/PepperDash.Core/JsonStandardObjects/JsonToSimplDeviceConfig.cs",
    "chars": 5957,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/JsonToSimpl/Constants.cs",
    "chars": 3337,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/JsonToSimpl/Global.cs",
    "chars": 1740,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\nusing "
  },
  {
    "path": "src/PepperDash.Core/JsonToSimpl/JsonToSimplArrayLookupChild.cs",
    "chars": 4518,
    "preview": "using System;\nusing System.Linq;\nusing Newtonsoft.Json.Linq;\nusing Serilog.Events;\n\nnamespace PepperDash.Core.JsonToSim"
  },
  {
    "path": "src/PepperDash.Core/JsonToSimpl/JsonToSimplChildObjectBase.cs",
    "chars": 12426,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Newtonsoft.Json.Linq;\n\nnamespace PepperDash.Co"
  },
  {
    "path": "src/PepperDash.Core/JsonToSimpl/JsonToSimplFileMaster.cs",
    "chars": 13611,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressi"
  },
  {
    "path": "src/PepperDash.Core/JsonToSimpl/JsonToSimplFixedPathObject.cs",
    "chars": 342,
    "preview": "\n\nnamespace PepperDash.Core.JsonToSimpl\n{\n /// <summary>\n /// Represents a JsonToSimplFixedPathObject\n /// </summary>\n\t"
  },
  {
    "path": "src/PepperDash.Core/JsonToSimpl/JsonToSimplGenericMaster.cs",
    "chars": 3228,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp;\nusing Newtonsoft.Json.Linq;\n\nnamespace Peppe"
  },
  {
    "path": "src/PepperDash.Core/JsonToSimpl/JsonToSimplMaster.cs",
    "chars": 6726,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp.Cr"
  },
  {
    "path": "src/PepperDash.Core/JsonToSimpl/JsonToSimplPortalFileMaster.cs",
    "chars": 5815,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp"
  },
  {
    "path": "src/PepperDash.Core/Logging/CrestronEnricher.cs",
    "chars": 1164,
    "preview": "using Crestron.SimplSharp;\nusing Serilog.Core;\nusing Serilog.Events;\nusing System;\nusing System.Collections.Generic;\nus"
  },
  {
    "path": "src/PepperDash.Core/Logging/Debug.cs",
    "chars": 47976,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\nusing Cre"
  },
  {
    "path": "src/PepperDash.Core/Logging/DebugConsoleSink.cs",
    "chars": 1944,
    "preview": "using Crestron.SimplSharp;\nusing Serilog.Configuration;\nusing Serilog;\nusing Serilog.Core;\nusing Serilog.Events;\nusing "
  },
  {
    "path": "src/PepperDash.Core/Logging/DebugContext.cs",
    "chars": 9471,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp"
  },
  {
    "path": "src/PepperDash.Core/Logging/DebugCrestronLoggerSink.cs",
    "chars": 1148,
    "preview": "using Crestron.SimplSharp;\nusing Crestron.SimplSharp.CrestronLogger;\nusing Serilog.Core;\nusing Serilog.Events;\n\nnamespa"
  },
  {
    "path": "src/PepperDash.Core/Logging/DebugErrorLogSink.cs",
    "chars": 2351,
    "preview": "using Crestron.SimplSharp;\nusing Serilog.Core;\nusing Serilog.Events;\nusing Serilog.Formatting;\nusing System;\nusing Syst"
  },
  {
    "path": "src/PepperDash.Core/Logging/DebugExtensions.cs",
    "chars": 3447,
    "preview": "using System;\nusing Serilog.Events;\nusing Log = PepperDash.Core.Debug;\n\nnamespace PepperDash.Core.Logging\n{\n    public "
  },
  {
    "path": "src/PepperDash.Core/Logging/DebugMemory.cs",
    "chars": 3667,
    "preview": "using System.Collections.Generic;\nusing Crestron.SimplSharp;\nusing Newtonsoft.Json;\n\nnamespace PepperDash.Core.Logging\n"
  },
  {
    "path": "src/PepperDash.Core/Logging/DebugWebsocketSink.cs",
    "chars": 18653,
    "preview": "using System;\nusing Serilog;\nusing Serilog.Core;\nusing Serilog.Events;\nusing Serilog.Configuration;\nusing WebSocketShar"
  },
  {
    "path": "src/PepperDash.Core/Network/DiscoveryThings.cs",
    "chars": 339,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/PasswordManagement/Config.cs",
    "chars": 502,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/PasswordManagement/Constants.cs",
    "chars": 1464,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/PasswordManagement/PasswordClient.cs",
    "chars": 5326,
    "preview": "using System;\n\nnamespace PepperDash.Core.PasswordManagement\n{\n /// <summary>\n /// Represents a PasswordClient\n /// </su"
  },
  {
    "path": "src/PepperDash.Core/PasswordManagement/PasswordManager.cs",
    "chars": 6981,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp;\n\nnamespace PepperDash.Core.PasswordManagemen"
  },
  {
    "path": "src/PepperDash.Core/PepperDash.Core.csproj",
    "chars": 3076,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <ProjectType>Library</ProjectType>\n  </PropertyGroup>\n  <Proper"
  },
  {
    "path": "src/PepperDash.Core/PepperDashCore.build/net472/PepperDashCore.props",
    "chars": 704,
    "preview": "<Project>\n  <PropertyGroup>\n    <Version>2.0.0-local</Version>    \n    <Authors>PepperDash Technologies</Authors>\n    <C"
  },
  {
    "path": "src/PepperDash.Core/PepperDashCore.build/net472/PepperDashCore.targets",
    "chars": 3651,
    "preview": "<Project>\n  <ItemGroup>\n    <None Include=\"$(TargetDir)$(TargetName).$(Version).$(TargetFramework).cpz\" Condition=\"$(Pro"
  },
  {
    "path": "src/PepperDash.Core/Properties/ControlSystem.cfg",
    "chars": 205,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ControlSystem>\n  <Name>MC3 SSH</Name>\n  <Address>ssh 10.0.0.15</Address>\n  <Pro"
  },
  {
    "path": "src/PepperDash.Core/SystemInfo/EventArgs and Constants.cs",
    "chars": 5479,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/SystemInfo/SystemInfoConfig.cs",
    "chars": 4220,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/SystemInfo/SystemInfoToSimpl.cs",
    "chars": 15777,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/Web/BouncyCertificate.cs",
    "chars": 18477,
    "preview": "using Crestron.SimplSharp;\n\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing O"
  },
  {
    "path": "src/PepperDash.Core/Web/RequestHandlers/DefaultRequestHandler.cs",
    "chars": 337,
    "preview": "using Crestron.SimplSharp.WebScripting;\n\nnamespace PepperDash.Core.Web.RequestHandlers\n{\n /// <summary>\n /// Represents"
  },
  {
    "path": "src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestAsyncHandler.cs",
    "chars": 5360,
    "preview": "using Crestron.SimplSharp.WebScripting;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\n"
  },
  {
    "path": "src/PepperDash.Core/Web/RequestHandlers/WebApiBaseRequestHandler.cs",
    "chars": 4239,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp.WebScripting;\n\nnamespace PepperDash.Core.Web."
  },
  {
    "path": "src/PepperDash.Core/Web/WebApiServer.cs",
    "chars": 7337,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp"
  },
  {
    "path": "src/PepperDash.Core/WebApi/Presets/Preset.cs",
    "chars": 1881,
    "preview": "using System;\n\nnamespace PepperDash.Core.WebApi.Presets\n{\n /// <summary>\n /// Represents a Preset\n /// </summary>\n\tpubl"
  },
  {
    "path": "src/PepperDash.Core/WebApi/Presets/User.cs",
    "chars": 1918,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Core/WebApi/Presets/WebApiPasscodeClient.cs",
    "chars": 8306,
    "preview": "using System;\nusing Crestron.SimplSharp;                                          // For Basic SIMPL# Classes\nusing Cre"
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/Serialization/IXSigSerialization.cs",
    "chars": 737,
    "preview": "using System.Collections.Generic;\nusing PepperDash.Core.Intersystem.Tokens;\n\nnamespace PepperDash.Core.Intersystem.Seria"
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/Serialization/XSigSerializationException.cs",
    "chars": 847,
    "preview": "using System;\n\nnamespace PepperDash.Core.Intersystem.Serialization\n{\n    /// <summary>\n    /// Class to handle this spec"
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/Tokens/XSigAnalogToken.cs",
    "chars": 2552,
    "preview": "using System;\n\nnamespace PepperDash.Core.Intersystem.Tokens\n{\n    /// <summary>\n    /// Represents an XSigAnalogToken\n  "
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/Tokens/XSigDigitalToken.cs",
    "chars": 2375,
    "preview": "using System;\n\nnamespace PepperDash.Core.Intersystem.Tokens\n{\n    /// <summary>\n    /// Represents an XSigDigitalToken\n "
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/Tokens/XSigSerialToken.cs",
    "chars": 2327,
    "preview": "using System;\nusing System.Text;\n\nnamespace PepperDash.Core.Intersystem.Tokens\n{\n    /// <summary>\n    /// Represents an"
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/Tokens/XSigToken.cs",
    "chars": 1300,
    "preview": "namespace PepperDash.Core.Intersystem.Tokens\n{\n    /// <summary>\n    /// Represents the base class for all XSig datatype"
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/Tokens/XSigTokenType.cs",
    "chars": 447,
    "preview": "namespace PepperDash.Core.Intersystem.Tokens\n{\n    /// <summary>\n    /// XSig token types.\n    /// </summary>\n    public"
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/XSigHelpers.cs",
    "chars": 10961,
    "preview": "using System;\nusing System.Linq;\nusing Crestron.SimplSharp.CrestronIO;\nusing PepperDash.Core.Intersystem.Serialization;\n"
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/XSigTokenStreamReader.cs",
    "chars": 5593,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp.CrestronIO;\nusing PepperDash.Core.Intersystem."
  },
  {
    "path": "src/PepperDash.Core/XSigUtility/XSigTokenStreamWriter.cs",
    "chars": 5259,
    "preview": "using System;\nusing System.Linq;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp.CrestronIO;\nusing PepperDas"
  },
  {
    "path": "src/PepperDash.Essentials/AssetLoader.cs",
    "chars": 12040,
    "preview": "using System;\nusing System.IO;\nusing System.IO.Compression;\nusing System.Linq;\nusing PepperDash.Core;\nusing Serilog.Even"
  },
  {
    "path": "src/PepperDash.Essentials/ClassDiagram1.cd",
    "chars": 40613,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ClassDiagram MajorVersion=\"1\" MinorVersion=\"1\">\n  <Class Name=\"PepperDash.Essen"
  },
  {
    "path": "src/PepperDash.Essentials/ControlSystem.cs",
    "chars": 36711,
    "preview": "using System;\nusing System.Linq;\nusing System.Reflection;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp.Crestron"
  },
  {
    "path": "src/PepperDash.Essentials/Example Configuration/EssentialsHuddleSpaceRoom/configurationFile-HuddleSpace-2-Source.json",
    "chars": 8036,
    "preview": "{\n    \"system\": {},\n    \"system_url\": \"\",\n    \"template_url\": \"\",\n    \"template\": {\n        \"sourceLists\": {\n           "
  },
  {
    "path": "src/PepperDash.Essentials/Example Configuration/EssentialsHuddleVtc1Room/configurationFile-mockVideoCodec_din-ap3_-_dm4x1.json",
    "chars": 13133,
    "preview": "{\n    \"system\": {\n        \"rooms\": [\n            {\n                \"name\": \"Example Room\",\n                \"key\": \"room1"
  },
  {
    "path": "src/PepperDash.Essentials/Example Configuration/SIMPLBridging/SIMPLBridgeExample_configurationFile.json",
    "chars": 11444,
    "preview": "{\n  \"system_url\": \"\",\n  \"template\": {\n    \"info\": {\n      \"comment\": \"\",\n      \"requiredControlSofwareVersion\": \"\",\n    "
  },
  {
    "path": "src/PepperDash.Essentials/Example Configuration/SIMPLBridging/configurationFile-dmps3300c-avRouting.json",
    "chars": 1979,
    "preview": "{\n    \"system_url\": \"\",\n    \"template\": {    \n        \"info\": {\n            \"comment\": \"\",\n            \"requiredControlS"
  },
  {
    "path": "src/PepperDash.Essentials/Factory/DeviceFactory.cs",
    "chars": 2625,
    "preview": "\n\nusing System;\nusing System.Linq;\nusing System.Reflection;\n\nusing PepperDash.Core;\nusing PepperDash.Essentials.Core;\n\n"
  },
  {
    "path": "src/PepperDash.Essentials/HttpLogoServer.cs",
    "chars": 5341,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp.CrestronIO;\nusing "
  },
  {
    "path": "src/PepperDash.Essentials/PepperDash.Essentials.csproj",
    "chars": 3193,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\r\n  <PropertyGroup>\r\n    <ProjectType>Program</ProjectType>\r\n    <Configurations>Debug"
  },
  {
    "path": "src/PepperDash.Essentials/Properties/ControlSystem.cfg",
    "chars": 229,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ControlSystem>\n  <Name>Test RMC3</Name>\n  <Address>auto 192.168.1.40;username c"
  },
  {
    "path": "src/PepperDash.Essentials/Properties/UpdateAssemblyVersion.ps1",
    "chars": 1461,
    "preview": "function Update-SourceVersion\n{\n    Param ([string]$Version)\n    $fullVersion = $Version\n    $baseVersion = [regex]::Ma"
  },
  {
    "path": "src/PepperDash.Essentials/SGD/PepperDash Essentials TSW-560.sgd",
    "chars": 530134,
    "preview": "[\nObjTp=FSgntr\nSgntr=SGD\nRelVrs=3\nVTProeVer=6.1.05\nSchema=1\nCRCGUID=6C002F1C-3D96-4EBF-A0D9-8A124BE8F48A\n]\n;============"
  },
  {
    "path": "src/PepperDash.Essentials/SGD/PepperDash Essentials TSW-760.sgd",
    "chars": 421656,
    "preview": "[\nObjTp=FSgntr\nSgntr=SGD\nRelVrs=3\nVTProeVer=6.1.05\nSchema=1\nCRCGUID=6C002F1C-3D96-4EBF-A0D9-8A124BE8F48A\n]\n;============"
  },
  {
    "path": "src/PepperDash.Essentials/SGD/PepperDash Essentials iPad.sgd",
    "chars": 557476,
    "preview": "[\nObjTp=FSgntr\nSgntr=SGD\nRelVrs=3\nVTProeVer=6.1.05\nSchema=1\nCRCGUID=BA116BF9-17DA-41E0-BF8A-42945AAA686D\n]\n;============"
  },
  {
    "path": "src/PepperDash.Essentials/app.config",
    "chars": 378,
    "preview": "<?xml version=\"1.0\"?>\n<configuration>\n\t<runtime>\n\t\t<assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n\t\t\t<depen"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/BridgeBase.cs",
    "chars": 18426,
    "preview": "\n\nusing System;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharpPro;\nusing Crestr"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/BridgeHelper.cs",
    "chars": 2076,
    "preview": "using PepperDash.Core;\nusing Serilog.Events;\n\n//using PepperDash.Essentials.Devices.Common.Cameras;\n\nnamespace PepperDa"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/IBridge.cs",
    "chars": 754,
    "preview": "using Crestron.SimplSharpPro.DeviceSupport;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// D"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/AirMediaControllerJoinMap.cs",
    "chars": 5729,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a AirMediaControllerJ"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/AppleTvJoinMap.cs",
    "chars": 3409,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a AppleTvJoinMap\n   "
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/C2nRthsControllerJoinMap.cs",
    "chars": 2841,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a C2nRthsControllerJ"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/CameraControllerJoinMap.cs",
    "chars": 7843,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a CameraControllerJo"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/CenOdtOccupancySensorBaseJoinMap.cs",
    "chars": 17104,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a CenOdtOccupancySen"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/DisplayControllerJoinMap.cs",
    "chars": 6529,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a DisplayControllerJ"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmBladeChassisControllerJoinMap.cs",
    "chars": 6168,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges {\n    /// <summary>\n    /// Represents a DmBladeChassisCont"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmChassisControllerJoinMap.cs",
    "chars": 13369,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a DmChassisController"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmRmcControllerJoinMap.cs",
    "chars": 7374,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a DmRmcControllerJoin"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmTxControllerJoinMap.cs",
    "chars": 7776,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a DmTxControllerJoin"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsAudioOutputControllerJoinMap.cs",
    "chars": 16788,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a DmpsAudioOutputCon"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsMicrophoneControllerJoinMap.cs",
    "chars": 3330,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a DmpsMicrophoneCont"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/DmpsRoutingControllerJoinMap.cs",
    "chars": 9269,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a DmpsRoutingControl"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericIrControllerJoinMap.cs",
    "chars": 20830,
    "preview": "using PepperDash.Essentials.Core;\n\nnamespace PepperDash.Essentials.Core.Bridges.JoinMaps\n{\n\t\t/// <summary>\n\t\t/// Repres"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericLightingJoinMap.cs",
    "chars": 2958,
    "preview": "using System;\n\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a GenericLightingJo"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/GenericRelayControllerJoinMap.cs",
    "chars": 1361,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a GenericRelayContro"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsOccupancySensorBaseJoinMap.cs",
    "chars": 17875,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a GlsOccupancySensor"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/GlsPartitionSensorJoinMap.cs",
    "chars": 5312,
    "preview": "using System;\nusing PepperDash.Essentials.Core;\n\nnamespace PepperDash.Essentials.Core.Bridges.JoinMaps\n{\n    /// <summa"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdNxM4kEControllerJoinMap.cs",
    "chars": 4780,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a HdMdNxM4kEControll"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdMdxxxCEControllerJoinMap.cs",
    "chars": 5601,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a HdMdxxxCEControlle"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/HdPsXxxControllerJoinMap.cs",
    "chars": 4736,
    "preview": "using System;\nusing PepperDash.Essentials.Core;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n /// <summary>\n /// Rep"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/Hrxxx0WirelessRemoteControllerJoinMap.cs",
    "chars": 19944,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a Hrxxx0WirelessRemo"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/IAnalogInputJoinMap.cs",
    "chars": 1696,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a IAnalogInputJoinMa"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/IBasicCommunicationJoinMap.cs",
    "chars": 3142,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a IBasicCommunicatio"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalInputJoinMap.cs",
    "chars": 1286,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a IDigitalInputJoinM"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/IDigitalOutputJoinMap.cs",
    "chars": 1319,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a IDigitalOutputJoin"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/IRBlurayBaseJoinMap.cs",
    "chars": 17648,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nnames"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/PduJoinMapBase.cs",
    "chars": 3872,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a PduJoinMapBase\n   "
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/SetTopBoxControllerJoinMap.cs",
    "chars": 20058,
    "preview": "using System;\n\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a SetTopBoxControll"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/StatusSignControllerJoinMap.cs",
    "chars": 3964,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a StatusSignControll"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/SystemMonitorJoinMap.cs",
    "chars": 15160,
    "preview": "using System;\n\nnamespace PepperDash.Essentials.Core.Bridges\n{\n    /// <summary>\n    /// Represents a SystemMonitorJoinM"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Bridges/JoinMaps/VideoCodecControllerJoinMap.cs",
    "chars": 56911,
    "preview": "using System;\nusing PepperDash.Essentials.Core;\nnamespace PepperDash.Essentials.Core.Bridges.JoinMaps\n{\n /// <summary>\n "
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/CecPortController.cs",
    "chars": 5154,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Text.RegularExpressi"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/ComPortController.cs",
    "chars": 5723,
    "preview": "using System;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing Crestron.SimplSharp;\nusing Crestron.SimplS"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/ComSpecJsonConverter.cs",
    "chars": 5094,
    "preview": "\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\nusin"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/CommBridge.cs",
    "chars": 4799,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing Crestron.SimplSharp.CrestronSockets;\nusing Cre"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/CommFactory.cs",
    "chars": 9788,
    "preview": "\n\nusing System;\nusing Crestron.SimplSharpPro;\nusing Crestron.SimplSharpPro.DM;\nusing Newtonsoft.Json;\nusing PepperDash."
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/CommunicationExtras.cs",
    "chars": 424,
    "preview": "\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\nusin"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/ConsoleCommMockDevice.cs",
    "chars": 4441,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\n\nusing"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/GenericComm.cs",
    "chars": 5945,
    "preview": "\n\nusing System;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp.CrestronSockets;\nusing Crestron.SimplSharpP"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/GenericHttpClient.cs",
    "chars": 4962,
    "preview": "using Crestron.SimplSharp.Net.Http;\nusing PepperDash.Core;\nusing System;\n\nnamespace PepperDash.Essentials.Core\n{\n\t\n\t///"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Comm and IR/IRPortHelper.cs",
    "chars": 9130,
    "preview": "\n\nusing System;\nusing System.Collections.Generic;\nusing Crestron.SimplSharp;\nusing Crestron.SimplSharp.CrestronIO;\nusin"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Config/AudioControlPointListItem.cs",
    "chars": 879,
    "preview": "using Crestron.SimplSharpPro;\nusing Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Config/BaseStreamingDeviceProperties.cs",
    "chars": 964,
    "preview": "using System;\r\nusing Newtonsoft.Json;\r\n\r\nnamespace PepperDash.Essentials.Core.Config\r\n{\r\n  /// <summary>\r\n  /// Represen"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Config/BasicConfig.cs",
    "chars": 5250,
    "preview": "\n\nusing System.Collections.Generic;\nusing System.Linq;\nusing Newtonsoft.Json;\n\nusing Newtonsoft.Json.Linq;\nusing Pepper"
  },
  {
    "path": "src/PepperDash.Essentials.Core/Config/ConfigPropertiesHelpers.cs",
    "chars": 901,
    "preview": "\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Crestron.SimplSharp;\nusin"
  }
]

// ... and 584 more files (download for full content)

About this extraction

This page contains the full source code of the PepperDash/Essentials GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 784 files (5.1 MB), approximately 1.4M tokens, and a symbol index with 4291 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!