Compare commits

..

3 Commits

Author SHA1 Message Date
Jonathan Arndt
52a14c1f3a docs: update cleanup section with detailed file structure example 2025-05-27 08:48:03 -07:00
Jonathan Arndt
bb991544c4 docs: add checklist items for upgrade-to-4-series.md 2025-05-25 15:03:13 -07:00
Jonathan Arndt
663f2483b3 docs: 📝 Add readme.md for guidance to upgrade plugins v1 to v2 or 4series. 2025-05-22 17:14:29 -07:00
21 changed files with 583 additions and 579 deletions

View File

@@ -1,20 +0,0 @@
root=true
[*.cs]
indent_style=space
indent_size=2
# .editorconfig
# Define a naming style for camelCase without an underscore prefix
dotnet_naming_style.private_field_camel_case.capitalization = camel_case
dotnet_naming_style.private_field_camel_case.required_prefix =
# Define a naming rule for private fields to use the defined style
dotnet_naming_rule.private_field_no_underscore.symbols = private_fields
dotnet_naming_rule.private_field_no_underscore.style = private_field_camel_case
dotnet_naming_rule.private_field_no_underscore.severity = warning
# Define the symbol kind for private fields
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private

View File

@@ -1,9 +0,0 @@
{
"recommendations": [
"ms-dotnettools.vscode-dotnet-runtime",
"ms-dotnettools.csharp",
"ms-dotnettools.csdevkit",
"vivaxy.vscode-conventional-commits",
"mhutchie.git-graph"
]
}

32
.vscode/settings.json vendored
View File

@@ -1,32 +0,0 @@
{
"workbench.colorCustomizations": {
"activityBar.activeBackground": "#8c57e5",
"activityBar.background": "#8c57e5",
"activityBar.foreground": "#e7e7e7",
"activityBar.inactiveForeground": "#e7e7e799",
"activityBarBadge.background": "#6e3411",
"activityBarBadge.foreground": "#e7e7e7",
"commandCenter.border": "#e7e7e799",
"sash.hoverBorder": "#8c57e5",
"statusBar.background": "#6e2bde",
"statusBar.foreground": "#e7e7e7",
"statusBarItem.hoverBackground": "#8c57e5",
"statusBarItem.remoteBackground": "#6e2bde",
"statusBarItem.remoteForeground": "#e7e7e7",
"titleBar.activeBackground": "#6e2bde",
"titleBar.activeForeground": "#e7e7e7",
"titleBar.inactiveBackground": "#6e2bde99",
"titleBar.inactiveForeground": "#e7e7e799"
},
"peacock.color": "#6e2bde",
"[csharp]": {
"editor.defaultFormatter": "ms-dotnettools.csharp",
"editor.formatOnSave": true,
"editor.formatOnSaveMode": "file"
},
"csharp.inlayHints.enableInlayHintsForImplicitObjectCreation": true,
"csharp.inlayHints.enableInlayHintsForImplicitVariableTypes": true,
"csharp.inlayHints.enableInlayHintsForLambdaParameterTypes": true,
"csharp.inlayHints.enableInlayHintsForTypes": true,
"dotnet.formatting.organizeImportsOnFormat": true
}

103
README.md
View File

@@ -1,6 +1,6 @@
![PepperDash Essentials Pluign Logo](/images/essentials-plugin-blue.png) ![PepperDash Essentials Pluign Logo](/images/essentials-plugin-blue.png)
# Essentials Plugin Template (c) 2025 # Essentials Plugin Template (c) 2023
## License ## License
@@ -8,14 +8,14 @@ Provided under MIT license
## Overview ## Overview
Fork this repo when creating a new plugin for Essentials. For more information about plugins, refer to the Essentials Wiki [Plugins](https://pepperdash.github.io/Essentials/docs/Plugins.html) article. Fork this repo when creating a new plugin for Essentials. For more information about plugins, refer to the Essentials Wiki [Plugins](https://github.com/PepperDash/Essentials/wiki/Plugins) article.
This repo contains example classes for the three main categories of devices: This repo contains example classes for the three main categories of devices:
* `MakeModelDevice`: Used for most third party devices which require communication over a streaming mechanism such as a Com port, TCP/SSh/UDP socket, CEC, etc * `EssentialsPluginTemplateDevice`: Used for most third party devices which require communication over a streaming mechanism such as a Com port, TCP/SSh/UDP socket, CEC, etc
* `MakeModelLogicDevice`: Used for devices that contain logic, but don't require any communication with third parties outside the program * `EssentialsPluginTemplateLogicDevice`: Used for devices that contain logic, but don't require any communication with third parties outside the program
* `MakeModelCrestronDevice`: Used for devices that represent a piece of Crestron hardware * `EssentialsPluginTemplateCrestronDevice`: Used for devices that represent a piece of Crestron hardware
There are matching factory classes for each of the three categories of devices. The `MakeModelConfigObject` should be used as a template and modified for any of the categories of device. Same goes for the `MakeModeleBridgeJoinMap`. There are matching factory classes for each of the three categories of devices. The `EssentialsPluginTemplateConfigObject` should be used as a template and modified for any of the categories of device. Same goes for the `EssentialsPluginTemplateBridgeJoinMap`.
This also illustrates how a plugin can contain multiple devices. This also illustrates how a plugin can contain multiple devices.
@@ -29,7 +29,14 @@ The [Essentials](https://github.com/PepperDash/Essentials) libraries are require
### Installing Dependencies ### Installing Dependencies
Dependencies will be automatically installed when To install dependencies once nuget.exe is installed, run the following command from the root directory of your repository:
`nuget install .\packages.config -OutputDirectory .\packages -excludeVersion`.
Alternatively, you can simply run the `GetPackages.bat` file.
To verify that the packages installed correctly, open the plugin solution in your repo 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.
### Instructions for Renaming Solution and Files ### Instructions for Renaming Solution and Files
@@ -41,81 +48,13 @@ For renaming instructions in particular, see the XML `remarks` tags on class def
## Generating Nuget Package ## Generating Nuget Package
A nuget package is automatically generated when the plugin is build. To modify the name and other details of the package, edit the following properties in the .csproj file: In the solution folder is a file named "PDT.EssentialsPluginTemplate.nuspec"
1. `PackageId` - This is the name that will be used to pull the package from Nuget once it's published 1. Rename the file to match your plugin solution name
2. `PackgeProjectUrl` - This should match the URL for the plugin repo 2. Edit the file to include your project specifics including
3. `AssemblyTitle` - This is the dll file name that is will show on a processor when the plugin is loaded 1. <id>PepperDash.Essentials.Plugin.MakeModel</id> Convention is to use the prefix "PepperDash.Essentials.Plugin" and include the MakeModel of the device.
<!-- START Minimum Essentials Framework Versions --> 2. <projectUrl>https://github.com/PepperDash/EssentialsPluginTemplate</projectUrl> Change to your url to the project repo
### Minimum Essentials Framework Versions
- 2.12.1 There is no longer a requirement to adjust workflow files for nuget generation for private and public repositories. This is now handled automatically in the workflow.
- 2.12.1
- 2.12.1
<!-- END Minimum Essentials Framework Versions -->
<!-- START Config Example -->
### Config Example
```json __If you do not make these changes to the nuspec file, the project will not generate a nuget package__
{
"key": "GeneratedKey",
"uid": 1,
"name": "GeneratedName",
"type": "examplePluginDevice",
"group": "Group",
"properties": {
"control": "SampleValue",
"pollTimeMs": 0,
"warningTimeoutMs": 0,
"errorTimeoutMs": 0,
"DeviceDictionary": {
"SampleString": {
"name": "SampleString",
"value": "SampleValue"
}
}
}
}
```
<!-- END Config Example -->
<!-- START Supported Types -->
### Supported Types
- examplePluginDevice
- examplePluginCrestronDevice
- examplePluginLogicDevice
<!-- END Supported Types -->
<!-- START Join Maps -->
<!-- END Join Maps -->
<!-- START Interfaces Implemented -->
<!-- END Interfaces Implemented -->
<!-- START Base Classes -->
### Base Classes
- CrestronGenericBridgeableBaseDevice
- EssentialsBridgeableDevice
- JoinMapBaseAdvanced
<!-- END Base Classes -->
<!-- START Public Methods -->
### Public Methods
- public void SendText(string text)
- public void SendBytes(byte[] bytes)
- public void Poll()
<!-- END Public Methods -->
<!-- START Bool Feedbacks -->
### Bool Feedbacks
- ConnectFeedback
- OnlineFeedback
<!-- END Bool Feedbacks -->
<!-- START Int Feedbacks -->
### Int Feedbacks
- StatusFeedback
<!-- END Int Feedbacks -->
<!-- START String Feedbacks -->
<!-- END String Feedbacks -->

View File

@@ -0,0 +1,110 @@
![PepperDash Essentials Plugin Logo](/images/essentials-plugin-blue.png)
# Upgrading an EPI: Essentials v1.x → v2.x
## Preparation
1. **Clone the Template Repo referred to as TR** to your local machine.
- [EssentialsPluginTemplate](https://github.com/PepperDash/EssentialsPluginTemplate)
2. **Checkout `main` branch** in the TR.
## Branching
4. In your EPI repo:
- Confirm it does **not already support Essentials v2.x**.
- Ensure there is **no existing 4-series update branch**.
- Create a new branch (e.g., `feature/4-series-updates`) from `main`.
## Upgrade Steps
5. In the new branch:
- **Replace** EPI `.github` files/folders with those from TR as needed.
- *Note:* Retain any custom workflows if required. Consult with PepperDash Team if unsure.
- **Copy** the following from TR to EPI:
- `.releaserc.json` (root)
- `epi-make-model.4Series.sln` (root)
- `src/epi-make-model.4Series.csproj` (create `src` folder if missing)
- `images` folder (if your `readme.md` lacks the standard logo)
- **Initial Commit:** Commit changes, but do **not** push yet.
6. **If EPI has a `src/*.nuspec` file:**
- Record these values from `Nuspec` for later:
- `<id>` (Package ID)
- `<projectUrl>` (Project URL)
- `<title>` (Assembly Title)
7. **Open Solution:**
- Open `epi-make-model.4Series.sln` in Visual Studio 2022.
- If errors occur, ensure the `.csproj` file is located within `src` folder.
8. **Update Project Properties:**
- In `src/epi-make-model.4Series.csproj`, update:
- `AssemblyTitle` (from nuspec `<title>`)
- `RootNamespace` (from existing EPI, device namespace actual)
- `PackageProjectUrl` (from nuspec `<projectUrl>`)
- **Rename `make-model` build path references shown below:**
![defineBuildObjectstoRemove](/images/upgrade-to-4Series/removeObsoleteReferences.png)
- **Add runtime exclusion:**
Add `<ExcludeAssets>runtime</ExcludeAssets>` to the PepperDash Essentials `PackageReference`.
![addRuntimeExclusion](/images/upgrade-to-4Series/addRuntumeExclusion.png)
9. **Copy Build Files:**
- Copy `src/Directory.Build.props` and `src/Directory.Build.targets` from TR.
- Update `RepositoryUrl` in `Directory.Build.props` to match nuspec `PackageProjectUrl`.
- Remove "template" text from `<Product>` in `Directory.Build.props` as needed.
10. **Clean Up:**
- Delete old Visual Studio 2008 files: `.sln`, `.suo`, `.nuspec`, `.csproj`, `.csproj.user`, `.projectinfo`.
- Ensure file structure matches below example:
```
├── src/
│ ├── Directory.Build.props
│ ├── Directory.Build.tagets
│ ├── *.3Series.csproj
│ └── *.4Series.csproj
├── .releaserc.json
├── *.3Series.sln
├── *.4Series.sln
├── LICENSE.md
└── README.md
```
11. **Rename Solution/Project** as needed.
![renameEpiSolution](/images/upgrade-to-4Series/renameEpiSolution.png)
12. **Update Project References and Dependencies**
- Remove old PepperDash Essentials dependency.
- Add PepperDash Essentials v2.x dependency via Visual Studio 2022 > Project > `Manage Nuget Packages`.
![removeExistingReferences](/images/upgrade-to-4Series/removeExistingDependencies.png)
13. **Update Factory Class:**
Set `MinimumEssentialsFrameworkVersion` to match the Essentials version dependency.
14. **Build Solution:**
Ensure solution compiles (warnings about obsolete `Debug.Console` calls are OK).
15. **Update Debug Calls:**
Replace `Debug.Console` with `Debug.Log` methods as appropriate (see table).
![replaceDebugConsoleMethods](/images/upgrade-to-4Series/replaceExistingDebugConsoleMethods.png)
## Completion Checklist
- [ ] EPI compiles with **no warnings**.
- [ ] **Obsolete methods** updated to modern equivalents.
- [ ] **Workflows** complete successfully; packages generated via GitHub and NuGet.org.
- [ ] `readme.md` includes:
- Usage/setup instructions
- Example SIMPL Windows bridge joinmap
- Example device communication structure/properties
- [ ] EPI tested against full release Essentials version.
- [ ] EPI tested by another developer.
- [ ] Full release of EPI.
---
*For questions about workflows or customizations, consult with PepperDash Team.*

View File

@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "epi-make-model.3Series", "src\epi-make-model.3Series.csproj", "{9D249E47-8F95-4437-A6BB-563510287AD1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9D249E47-8F95-4437-A6BB-563510287AD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9D249E47-8F95-4437-A6BB-563510287AD1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9D249E47-8F95-4437-A6BB-563510287AD1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9D249E47-8F95-4437-A6BB-563510287AD1}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

3
packages.config Normal file
View File

@@ -0,0 +1,3 @@
<packages>
<package id="PepperDashEssentials" version="1.16.1" targetFramework="net35" allowedVersions="[1.0,2.0)"/>
</packages>

View File

@@ -14,7 +14,7 @@ namespace PepperDash.Essentials.Plugin
/// "EssentialsPluginConfigObjectTemplate" renamed to "SamsungMdcConfig" /// "EssentialsPluginConfigObjectTemplate" renamed to "SamsungMdcConfig"
/// </example> /// </example>
[ConfigSnippet("\"properties\":{\"control\":{}")] [ConfigSnippet("\"properties\":{\"control\":{}")]
public class MakeModelConfig public class EssentialsPluginTemplateConfigObject
{ {
/// <summary> /// <summary>
/// JSON control object /// JSON control object
@@ -139,7 +139,7 @@ namespace PepperDash.Essentials.Plugin
/// </code> /// </code>
/// </example> /// </example>
[JsonProperty("DeviceDictionary")] [JsonProperty("DeviceDictionary")]
public Dictionary<string, MakeModelConfigDictionary> DeviceDictionary { get; set; } public Dictionary<string, EssentialsPluginTemplateConfigObjectDictionary> DeviceDictionary { get; set; }
/// <summary> /// <summary>
/// Constuctor /// Constuctor
@@ -148,9 +148,9 @@ namespace PepperDash.Essentials.Plugin
/// If using a collection you must instantiate the collection in the constructor /// If using a collection you must instantiate the collection in the constructor
/// to avoid exceptions when reading the configuration file /// to avoid exceptions when reading the configuration file
/// </remarks> /// </remarks>
public MakeModelConfig() public EssentialsPluginTemplateConfigObject()
{ {
DeviceDictionary = new Dictionary<string, MakeModelConfigDictionary>(); DeviceDictionary = new Dictionary<string, EssentialsPluginTemplateConfigObjectDictionary>();
} }
} }
@@ -172,7 +172,7 @@ namespace PepperDash.Essentials.Plugin
/// } /// }
/// </code> /// </code>
/// </example> /// </example>
public class MakeModelConfigDictionary public class EssentialsPluginTemplateConfigObjectDictionary
{ {
/// <summary> /// <summary>
/// Serializes collection name property /// Serializes collection name property

View File

@@ -3,7 +3,7 @@
using Crestron.SimplSharpPro; using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core.Logging; using PepperDash.Core;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Bridges;
@@ -18,12 +18,12 @@ namespace PepperDash.Essentials.Plugin
/// <example> /// <example>
/// "EssentialsPluginDeviceTemplate" renamed to "SamsungMdcDevice" /// "EssentialsPluginDeviceTemplate" renamed to "SamsungMdcDevice"
/// </example> /// </example>
public class MakeModelCrestronDevice : CrestronGenericBridgeableBaseDevice public class EssentialsPluginTemplateCrestronDevice : CrestronGenericBridgeableBaseDevice
{ {
/// <summary> /// <summary>
/// It is often desirable to store the config /// It is often desirable to store the config
/// </summary> /// </summary>
private readonly MakeModelConfig config; private EssentialsPluginTemplateConfigObject _config;
#region Constructor for Devices without IBasicCommunication. Remove if not needed #region Constructor for Devices without IBasicCommunication. Remove if not needed
@@ -34,16 +34,16 @@ namespace PepperDash.Essentials.Plugin
/// <param name="name"></param> /// <param name="name"></param>
/// <param name="config"></param> /// <param name="config"></param>
/// <param name="hardware"></param> /// <param name="hardware"></param>
public MakeModelCrestronDevice(string key, string name, MakeModelConfig config, GenericBase hardware) public EssentialsPluginTemplateCrestronDevice(string key, string name, EssentialsPluginTemplateConfigObject config, GenericBase hardware)
: base(key, name, hardware) : base(key, name, hardware)
{ {
this.LogInformation("Constructing new {0} instance", name); Debug.Console(0, this, "Constructing new {0} instance", name);
// The base class takes care of registering the hardware device for you // The base class takes care of registering the hardware device for you
// TODO [ ] Update the constructor as needed for the plugin device being developed // TODO [ ] Update the constructor as needed for the plugin device being developed
this.config = config; _config = config;
} }
#endregion #endregion
@@ -63,7 +63,10 @@ namespace PepperDash.Essentials.Plugin
var joinMap = new EssentialsPluginTemplateBridgeJoinMap(joinStart); var joinMap = new EssentialsPluginTemplateBridgeJoinMap(joinStart);
// This adds the join map to the collection on the bridge // This adds the join map to the collection on the bridge
bridge?.AddJoinMap(Key, joinMap); if (bridge != null)
{
bridge.AddJoinMap(Key, joinMap);
}
var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey); var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey);
@@ -72,8 +75,8 @@ namespace PepperDash.Essentials.Plugin
joinMap.SetCustomJoinData(customJoins); joinMap.SetCustomJoinData(customJoins);
} }
this.LogDebug("Linking to Trilist {id}", trilist.ID.ToString("X")); Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
this.LogInformation("Linking to Bridge Type {type}", GetType().Name); Debug.Console(0, "Linking to Bridge Type {0}", GetType().Name);
// TODO [ ] Implement bridge links as needed // TODO [ ] Implement bridge links as needed

View File

@@ -1,87 +0,0 @@
using System.Collections.Generic;
using Crestron.SimplSharpPro.UI;
using PepperDash.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Plugin
{
/// <summary>
/// Plugin device factory for Crestron wrapper devices
/// </summary>
/// <remarks>
/// Rename the class to match the device plugin being developed
/// </remarks>
/// <example>
/// "EssentialsPluginFactoryTemplate" renamed to "MyCrestronDeviceFactory"
/// </example>
public class MakeModelCrestronDeviceFactory : EssentialsPluginDeviceFactory<MakeModelCrestronDevice>
{
/// <summary>
/// Plugin device factory constructor
/// </summary>
/// <remarks>
/// Update the MinimumEssentialsFrameworkVersion & TypeNames as needed when creating a plugin
/// </remarks>
/// <example>
/// Set the minimum Essentials Framework Version
/// <code>
/// MinimumEssentialsFrameworkVersion = "1.6.4;
/// </code>
/// In the constructor we initialize the list with the typenames that will build an instance of this device
/// <code>
/// TypeNames = new List<string>() { "SamsungMdc", "SamsungMdcDisplay" };
/// </code>
/// </example>
public MakeModelCrestronDeviceFactory()
{
// Set the minimum Essentials Framework Version
// TODO [ ] Update the Essentials minimum framework version which this plugin has been tested against
MinimumEssentialsFrameworkVersion = "2.12.1";
// In the constructor we initialize the list with the typenames that will build an instance of this device
// TODO [ ] Update the TypeNames for the plugin being developed
TypeNames = new List<string>() { "examplePluginCrestronDevice" };
}
/// <summary>
/// Builds and returns an instance of EssentialsPluginTemplateCrestronDevice
/// </summary>
/// <param name="dc">device configuration</param>
/// <returns>plugin device or null</returns>
/// <remarks>
/// The example provided below takes the device key, name, properties config and the comms device created.
/// Modify the EssetnialsPlugingDeviceTemplate constructor as needed to meet the requirements of the plugin device.
/// </remarks>
/// <seealso cref="PepperDash.Core.eControlMethod"/>
public override EssentialsDevice BuildDevice(PepperDash.Essentials.Core.Config.DeviceConfig dc)
{
Debug.LogDebug("[{key}] Factory Attempting to create new device from type: {type}", dc.Key, dc.Type);
// get the plugin device properties configuration object & check for null
var propertiesConfig = dc.Properties.ToObject<MakeModelConfig>();
if (propertiesConfig == null)
{
Debug.LogWarning("[{key}] Factory: failed to read properties config for {name}", dc.Key, dc.Name);
return null;
}
var controlConfig = CommFactory.GetControlPropertiesConfig(dc);
if (controlConfig != null)
{
var myTouchpanel = new Tsw760(controlConfig.IpIdInt, Global.ControlSystem);
return new MakeModelCrestronDevice(dc.Key, dc.Name, propertiesConfig, myTouchpanel);
}
else
{
Debug.LogWarning("[{key}] Factory: Unable to get control properties from device config for {name}", dc.Key, dc.Name);
return null;
}
}
}
}

View File

@@ -3,7 +3,6 @@
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Core.Logging;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Bridges;
using PepperDash.Essentials.Core.Queues; using PepperDash.Essentials.Core.Queues;
@@ -19,36 +18,36 @@ namespace PepperDash.Essentials.Plugin
/// <example> /// <example>
/// "EssentialsPluginDeviceTemplate" renamed to "SamsungMdcDevice" /// "EssentialsPluginDeviceTemplate" renamed to "SamsungMdcDevice"
/// </example> /// </example>
public class MakeModelDevice : EssentialsBridgeableDevice public class EssentialsPluginTemplateDevice : EssentialsBridgeableDevice
{ {
/// <summary> /// <summary>
/// It is often desirable to store the config /// It is often desirable to store the config
/// </summary> /// </summary>
private readonly MakeModelConfig config; private EssentialsPluginTemplateConfigObject _config;
/// <summary> /// <summary>
/// Provides a queue and dedicated worker thread for processing feedback messages from a device. /// Provides a queue and dedicated worker thread for processing feedback messages from a device.
/// </summary> /// </summary>
private readonly GenericQueue receiveQueue; private GenericQueue ReceiveQueue;
#region IBasicCommunication Properties and Constructor. Remove if not needed. #region IBasicCommunication Properties and Constructor. Remove if not needed.
// TODO [ ] Add, modify, remove properties and fields as needed for the plugin being developed // TODO [ ] Add, modify, remove properties and fields as needed for the plugin being developed
private readonly IBasicCommunication comms; private readonly IBasicCommunication _comms;
private readonly GenericCommunicationMonitor commsMonitor; private readonly GenericCommunicationMonitor _commsMonitor;
// comms gather for ASCII based API's // _comms gather for ASCII based API's
// TODO [ ] If not using an ASCII based API, delete the properties below // TODO [ ] If not using an ASCII based API, delete the properties below
private readonly CommunicationGather commsGather; private readonly CommunicationGather _commsGather;
/// <summary> /// <summary>
/// Set this value to that of the delimiter used by the API (if applicable) /// Set this value to that of the delimiter used by the API (if applicable)
/// </summary> /// </summary>
private const string commsDelimiter = "\r"; private const string CommsDelimiter = "\r";
// comms byte buffer for HEX/byte based API's // _comms byte buffer for HEX/byte based API's
// TODO [ ] If not using an HEX/byte based API, delete the properties below // TODO [ ] If not using an HEX/byte based API, delete the properties below
private readonly byte[] commsByteBuffer = { }; private byte[] _commsByteBuffer = { };
@@ -56,22 +55,22 @@ namespace PepperDash.Essentials.Plugin
/// Connects/disconnects the comms of the plugin device /// Connects/disconnects the comms of the plugin device
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// triggers the comms.Connect/Disconnect as well as thee comms monitor start/stop /// triggers the _comms.Connect/Disconnect as well as thee comms monitor start/stop
/// </remarks> /// </remarks>
public bool Connect public bool Connect
{ {
get { return comms.IsConnected; } get { return _comms.IsConnected; }
set set
{ {
if (value) if (value)
{ {
comms.Connect(); _comms.Connect();
commsMonitor.Start(); _commsMonitor.Start();
} }
else else
{ {
comms.Disconnect(); _comms.Disconnect();
commsMonitor.Stop(); _commsMonitor.Stop();
} }
} }
} }
@@ -98,25 +97,25 @@ namespace PepperDash.Essentials.Plugin
/// <param name="name"></param> /// <param name="name"></param>
/// <param name="config"></param> /// <param name="config"></param>
/// <param name="comms"></param> /// <param name="comms"></param>
public MakeModelDevice(string key, string name, MakeModelConfig config, IBasicCommunication comms) public EssentialsPluginTemplateDevice(string key, string name, EssentialsPluginTemplateConfigObject config, IBasicCommunication comms)
: base(key, name) : base(key, name)
{ {
this.LogInformation("Constructing new {0} instance", name); Debug.Console(0, this, "Constructing new {0} instance", name);
// TODO [ ] Update the constructor as needed for the plugin device being developed // TODO [ ] Update the constructor as needed for the plugin device being developed
this.config = config; _config = config;
receiveQueue = new GenericQueue(key + "-rxqueue"); // If you need to set the thread priority, use one of the available overloaded constructors. ReceiveQueue = new GenericQueue(key + "-rxqueue"); // If you need to set the thread priority, use one of the available overloaded constructors.
ConnectFeedback = new BoolFeedback("connect", () => Connect); ConnectFeedback = new BoolFeedback(() => Connect);
OnlineFeedback = new BoolFeedback("online", () => commsMonitor.IsOnline); OnlineFeedback = new BoolFeedback(() => _commsMonitor.IsOnline);
StatusFeedback = new IntFeedback("status", () => (int)commsMonitor.Status); StatusFeedback = new IntFeedback(() => (int)_commsMonitor.Status);
this.comms = comms; _comms = comms;
commsMonitor = new GenericCommunicationMonitor(this, this.comms, this.config.PollTimeMs, this.config.WarningTimeoutMs, this.config.ErrorTimeoutMs, Poll); _commsMonitor = new GenericCommunicationMonitor(this, _comms, _config.PollTimeMs, _config.WarningTimeoutMs, _config.ErrorTimeoutMs, Poll);
var socket = this.comms as ISocketStatus; var socket = _comms as ISocketStatus;
if (socket != null) if (socket != null)
{ {
// device comms is IP **ELSE** device comms is RS232 // device comms is IP **ELSE** device comms is RS232
@@ -128,18 +127,18 @@ namespace PepperDash.Essentials.Plugin
// Only one of the below handlers should be necessary. // Only one of the below handlers should be necessary.
// comms gather for any API that has a defined delimiter // _comms gather for any API that has a defined delimiter
// TODO [ ] If not using an ASCII based API, remove the line below // TODO [ ] If not using an ASCII based API, remove the line below
commsGather = new CommunicationGather(this.comms, commsDelimiter); _commsGather = new CommunicationGather(_comms, CommsDelimiter);
commsGather.LineReceived += Handle_LineRecieved; _commsGather.LineReceived += Handle_LineRecieved;
// comms byte buffer for HEX/byte based API's with no delimiter // _comms byte buffer for HEX/byte based API's with no delimiter
// TODO [ ] If not using an HEX/byte based API, remove the line below // TODO [ ] If not using an HEX/byte based API, remove the line below
this.comms.BytesReceived += Handle_BytesReceived; _comms.BytesReceived += Handle_BytesReceived;
// comms byte buffer for HEX/byte based API's with no delimiter // _comms byte buffer for HEX/byte based API's with no delimiter
// TODO [ ] If not using an HEX/byte based API, remove the line below // TODO [ ] If not using an HEX/byte based API, remove the line below
this.comms.TextReceived += Handle_TextReceived; _comms.TextReceived += Handle_TextReceived;
#endregion #endregion
} }
@@ -147,9 +146,11 @@ namespace PepperDash.Essentials.Plugin
private void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs args) private void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs args)
{ {
ConnectFeedback?.FireUpdate(); if (ConnectFeedback != null)
ConnectFeedback.FireUpdate();
StatusFeedback?.FireUpdate(); if (StatusFeedback != null)
StatusFeedback.FireUpdate();
} }
// TODO [ ] If not using an API with a delimeter, delete the method below // TODO [ ] If not using an API with a delimeter, delete the method below
@@ -158,7 +159,7 @@ namespace PepperDash.Essentials.Plugin
// TODO [ ] Implement method // TODO [ ] Implement method
// Enqueues the message to be processed in a dedicated thread, but the specified method // Enqueues the message to be processed in a dedicated thread, but the specified method
receiveQueue.Enqueue(new ProcessStringMessage(args.Text, ProcessFeedbackMessage)); ReceiveQueue.Enqueue(new ProcessStringMessage(args.Text, ProcessFeedbackMessage));
} }
// TODO [ ] If not using an HEX/byte based API with no delimeter, delete the method below // TODO [ ] If not using an HEX/byte based API with no delimeter, delete the method below
@@ -197,7 +198,7 @@ namespace PepperDash.Essentials.Plugin
{ {
if (string.IsNullOrEmpty(text)) return; if (string.IsNullOrEmpty(text)) return;
comms.SendText(string.Format("{0}{1}", text, commsDelimiter)); _comms.SendText(string.Format("{0}{1}", text, CommsDelimiter));
} }
// TODO [ ] If not using an HEX/byte based API, delete the properties below // TODO [ ] If not using an HEX/byte based API, delete the properties below
@@ -212,7 +213,7 @@ namespace PepperDash.Essentials.Plugin
{ {
if (bytes == null) return; if (bytes == null) return;
comms.SendBytes(bytes); _comms.SendBytes(bytes);
} }
/// <summary> /// <summary>
@@ -245,7 +246,10 @@ namespace PepperDash.Essentials.Plugin
var joinMap = new EssentialsPluginTemplateBridgeJoinMap(joinStart); var joinMap = new EssentialsPluginTemplateBridgeJoinMap(joinStart);
// This adds the join map to the collection on the bridge // This adds the join map to the collection on the bridge
bridge?.AddJoinMap(Key, joinMap); if (bridge != null)
{
bridge.AddJoinMap(Key, joinMap);
}
var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey); var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey);
@@ -254,8 +258,8 @@ namespace PepperDash.Essentials.Plugin
joinMap.SetCustomJoinData(customJoins); joinMap.SetCustomJoinData(customJoins);
} }
this.LogDebug("Linking to Trilist {id}", trilist.ID.ToString("X")); Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
this.LogInformation("Linking to Bridge Type {type}", GetType().Name); Debug.Console(0, "Linking to Bridge Type {0}", GetType().Name);
// TODO [ ] Implement bridge links as needed // TODO [ ] Implement bridge links as needed

View File

@@ -1,85 +0,0 @@
using System.Collections.Generic;
using PepperDash.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Plugin
{
/// <summary>
/// Plugin device factory for devices that use IBasicCommunication
/// </summary>
/// <remarks>
/// Rename the class to match the device plugin being developed
/// </remarks>
/// <example>
/// "EssentialsPluginFactoryTemplate" renamed to "MyDeviceFactory"
/// </example>
public class MakeModelDeviceFactory : EssentialsPluginDeviceFactory<MakeModelDevice>
{
/// <summary>
/// Plugin device factory constructor
/// </summary>
/// <remarks>
/// Update the MinimumEssentialsFrameworkVersion & TypeNames as needed when creating a plugin
/// </remarks>
/// <example>
/// Set the minimum Essentials Framework Version
/// <code>
/// MinimumEssentialsFrameworkVersion = "2.12.1;
/// </code>
/// In the constructor we initialize the list with the typenames that will build an instance of this device
/// <code>
/// TypeNames = new List<string>() { "SamsungMdc", "SamsungMdcDisplay" };
/// </code>
/// </example>
public MakeModelDeviceFactory()
{
// Set the minimum Essentials Framework Version
// TODO [ ] Update the Essentials minimum framework version which this plugin has been tested against
MinimumEssentialsFrameworkVersion = "2.12.1";
// In the constructor we initialize the list with the typenames that will build an instance of this device
// TODO [ ] Update the TypeNames for the plugin being developed
TypeNames = new List<string>() { "examplePluginDevice" };
}
/// <summary>
/// Builds and returns an instance of EssentialsPluginDeviceTemplate
/// </summary>
/// <param name="dc">device configuration</param>
/// <returns>plugin device or null</returns>
/// <remarks>
/// The example provided below takes the device key, name, properties config and the comms device created.
/// Modify the EssetnialsPlugingDeviceTemplate constructor as needed to meet the requirements of the plugin device.
/// </remarks>
/// <seealso cref="PepperDash.Core.eControlMethod"/>
public override EssentialsDevice BuildDevice(PepperDash.Essentials.Core.Config.DeviceConfig dc)
{
Debug.LogVerbose("[{key}] Factory Attempting to create new device from type: {type}", dc.Key, dc.Type);
// get the plugin device properties configuration object & check for null
var propertiesConfig = dc.Properties.ToObject<MakeModelConfig>();
if (propertiesConfig == null)
{
Debug.LogError("[{key}] Factory: failed to read properties config for {name}", dc.Key, dc.Name);
return null;
}
// attempt build the plugin device comms device & check for null
// TODO { ] As of PepperDash Core 1.0.41, HTTP and HTTPS are not valid eControlMethods and will throw an exception.
var comms = CommFactory.CreateCommForDevice(dc);
if (comms == null)
{
Debug.LogError("[{key}] Factory Notice: No control object present for device {name}", dc.Key, dc.Name);
return null;
}
else
{
return new MakeModelDevice(dc.Key, dc.Name, propertiesConfig, comms);
}
}
}
}

239
src/MakeModelFactory.cs Normal file
View File

@@ -0,0 +1,239 @@
using System.Collections.Generic;
using Crestron.SimplSharpPro.UI;
using PepperDash.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Plugin
{
/// <summary>
/// Plugin device factory for devices that use IBasicCommunication
/// </summary>
/// <remarks>
/// Rename the class to match the device plugin being developed
/// </remarks>
/// <example>
/// "EssentialsPluginFactoryTemplate" renamed to "MyDeviceFactory"
/// </example>
public class EssentialsPluginTemplateFactory : EssentialsPluginDeviceFactory<EssentialsPluginTemplateDevice>
{
/// <summary>
/// Plugin device factory constructor
/// </summary>
/// <remarks>
/// Update the MinimumEssentialsFrameworkVersion & TypeNames as needed when creating a plugin
/// </remarks>
/// <example>
/// Set the minimum Essentials Framework Version
/// <code>
/// MinimumEssentialsFrameworkVersion = "1.6.4;
/// </code>
/// In the constructor we initialize the list with the typenames that will build an instance of this device
/// <code>
/// TypeNames = new List<string>() { "SamsungMdc", "SamsungMdcDisplay" };
/// </code>
/// </example>
public EssentialsPluginTemplateFactory()
{
// Set the minimum Essentials Framework Version
// TODO [ ] Update the Essentials minimum framework version which this plugin has been tested against
MinimumEssentialsFrameworkVersion = "1.6.4";
// In the constructor we initialize the list with the typenames that will build an instance of this device
// TODO [ ] Update the TypeNames for the plugin being developed
TypeNames = new List<string>() { "examplePluginDevice" };
}
/// <summary>
/// Builds and returns an instance of EssentialsPluginDeviceTemplate
/// </summary>
/// <param name="dc">device configuration</param>
/// <returns>plugin device or null</returns>
/// <remarks>
/// The example provided below takes the device key, name, properties config and the comms device created.
/// Modify the EssetnialsPlugingDeviceTemplate constructor as needed to meet the requirements of the plugin device.
/// </remarks>
/// <seealso cref="PepperDash.Core.eControlMethod"/>
public override EssentialsDevice BuildDevice(PepperDash.Essentials.Core.Config.DeviceConfig dc)
{
Debug.Console(1, "[{0}] Factory Attempting to create new device from type: {1}", dc.Key, dc.Type);
// get the plugin device properties configuration object & check for null
var propertiesConfig = dc.Properties.ToObject<EssentialsPluginTemplateConfigObject>();
if (propertiesConfig == null)
{
Debug.Console(0, "[{0}] Factory: failed to read properties config for {1}", dc.Key, dc.Name);
return null;
}
// attempt build the plugin device comms device & check for null
// TODO { ] As of PepperDash Core 1.0.41, HTTP and HTTPS are not valid eControlMethods and will throw an exception.
var comms = CommFactory.CreateCommForDevice(dc);
if (comms == null)
{
Debug.Console(1, "[{0}] Factory Notice: No control object present for device {1}", dc.Key, dc.Name);
return null;
}
else
{
return new EssentialsPluginTemplateDevice(dc.Key, dc.Name, propertiesConfig, comms);
}
}
}
/// <summary>
/// Plugin device factory for logic devices that don't communicate
/// </summary>
/// <remarks>
/// Rename the class to match the device plugin being developed
/// </remarks>
/// <example>
/// "EssentialsPluginFactoryTemplate" renamed to "MyLogicDeviceFactory"
/// </example>
public class EssentialsPluginTemplateFactoryLogicDevice : EssentialsPluginDeviceFactory<EssentialsPluginTemplateLogicDevice>
{
/// <summary>
/// Plugin device factory constructor
/// </summary>
/// <remarks>
/// Update the MinimumEssentialsFrameworkVersion & TypeNames as needed when creating a plugin
/// </remarks>
/// <example>
/// Set the minimum Essentials Framework Version
/// <code>
/// MinimumEssentialsFrameworkVersion = "1.6.4;
/// </code>
/// In the constructor we initialize the list with the typenames that will build an instance of this device
/// <code>
/// TypeNames = new List<string>() { "SamsungMdc", "SamsungMdcDisplay" };
/// </code>
/// </example>
public EssentialsPluginTemplateFactoryLogicDevice()
{
// Set the minimum Essentials Framework Version
// TODO [ ] Update the Essentials minimum framework version which this plugin has been tested against
MinimumEssentialsFrameworkVersion = "1.6.4";
// In the constructor we initialize the list with the typenames that will build an instance of this device
// TODO [ ] Update the TypeNames for the plugin being developed
TypeNames = new List<string>() { "examplePluginLogicDevice" };
}
/// <summary>
/// Builds and returns an instance of EssentialsPluginTemplateLogicDevice
/// </summary>
/// <param name="dc">device configuration</param>
/// <returns>plugin device or null</returns>
/// <remarks>
/// The example provided below takes the device key, name, properties config and the comms device created.
/// Modify the EssetnialsPlugingDeviceTemplate constructor as needed to meet the requirements of the plugin device.
/// </remarks>
/// <seealso cref="PepperDash.Core.eControlMethod"/>
public override EssentialsDevice BuildDevice(PepperDash.Essentials.Core.Config.DeviceConfig dc)
{
Debug.Console(1, "[{0}] Factory Attempting to create new device from type: {1}", dc.Key, dc.Type);
// get the plugin device properties configuration object & check for null
var propertiesConfig = dc.Properties.ToObject<EssentialsPluginTemplateConfigObject>();
if (propertiesConfig == null)
{
Debug.Console(0, "[{0}] Factory: failed to read properties config for {1}", dc.Key, dc.Name);
return null;
}
var controlConfig = CommFactory.GetControlPropertiesConfig(dc);
if (controlConfig == null)
{
return new EssentialsPluginTemplateLogicDevice(dc.Key, dc.Name, propertiesConfig);
}
else
{
Debug.Console(0, "[{0}] Factory: Unable to get control properties from device config for {1}", dc.Key, dc.Name);
return null;
}
}
}
/// <summary>
/// Plugin device factory for Crestron wrapper devices
/// </summary>
/// <remarks>
/// Rename the class to match the device plugin being developed
/// </remarks>
/// <example>
/// "EssentialsPluginFactoryTemplate" renamed to "MyCrestronDeviceFactory"
/// </example>
public class EssentialsPluginTemplateFactoryCrestronDevice : EssentialsPluginDeviceFactory<EssentialsPluginTemplateCrestronDevice>
{
/// <summary>
/// Plugin device factory constructor
/// </summary>
/// <remarks>
/// Update the MinimumEssentialsFrameworkVersion & TypeNames as needed when creating a plugin
/// </remarks>
/// <example>
/// Set the minimum Essentials Framework Version
/// <code>
/// MinimumEssentialsFrameworkVersion = "1.6.4;
/// </code>
/// In the constructor we initialize the list with the typenames that will build an instance of this device
/// <code>
/// TypeNames = new List<string>() { "SamsungMdc", "SamsungMdcDisplay" };
/// </code>
/// </example>
public EssentialsPluginTemplateFactoryCrestronDevice()
{
// Set the minimum Essentials Framework Version
// TODO [ ] Update the Essentials minimum framework version which this plugin has been tested against
MinimumEssentialsFrameworkVersion = "1.7.5";
// In the constructor we initialize the list with the typenames that will build an instance of this device
// TODO [ ] Update the TypeNames for the plugin being developed
TypeNames = new List<string>() { "examplePluginCrestronDevice" };
}
/// <summary>
/// Builds and returns an instance of EssentialsPluginTemplateCrestronDevice
/// </summary>
/// <param name="dc">device configuration</param>
/// <returns>plugin device or null</returns>
/// <remarks>
/// The example provided below takes the device key, name, properties config and the comms device created.
/// Modify the EssetnialsPlugingDeviceTemplate constructor as needed to meet the requirements of the plugin device.
/// </remarks>
/// <seealso cref="PepperDash.Core.eControlMethod"/>
public override EssentialsDevice BuildDevice(PepperDash.Essentials.Core.Config.DeviceConfig dc)
{
Debug.Console(1, "[{0}] Factory Attempting to create new device from type: {1}", dc.Key, dc.Type);
// get the plugin device properties configuration object & check for null
var propertiesConfig = dc.Properties.ToObject<EssentialsPluginTemplateConfigObject>();
if (propertiesConfig == null)
{
Debug.Console(0, "[{0}] Factory: failed to read properties config for {1}", dc.Key, dc.Name);
return null;
}
var controlConfig = CommFactory.GetControlPropertiesConfig(dc);
if (controlConfig == null)
{
var myTouchpanel = new Tsw760(controlConfig.IpIdInt, Global.ControlSystem);
return new EssentialsPluginTemplateCrestronDevice(dc.Key, dc.Name, propertiesConfig, myTouchpanel);
}
else
{
Debug.Console(0, "[{0}] Factory: Unable to get control properties from device config for {1}", dc.Key, dc.Name);
return null;
}
}
}
}

View File

@@ -1,6 +1,5 @@
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Core.Logging;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Bridges;
@@ -15,12 +14,12 @@ namespace PepperDash.Essentials.Plugin
/// <example> /// <example>
/// "EssentialsPluginTemplateLogicDevice" renamed to "SamsungMdcDevice" /// "EssentialsPluginTemplateLogicDevice" renamed to "SamsungMdcDevice"
/// </example> /// </example>
public class MakeModelLogicDevice : EssentialsBridgeableDevice public class EssentialsPluginTemplateLogicDevice : EssentialsBridgeableDevice
{ {
/// <summary> /// <summary>
/// It is often desirable to store the config /// It is often desirable to store the config
/// </summary> /// </summary>
private readonly MakeModelConfig config; private EssentialsPluginTemplateConfigObject _config;
/// <summary> /// <summary>
/// Plugin device constructor /// Plugin device constructor
@@ -28,14 +27,14 @@ namespace PepperDash.Essentials.Plugin
/// <param name="key"></param> /// <param name="key"></param>
/// <param name="name"></param> /// <param name="name"></param>
/// <param name="config"></param> /// <param name="config"></param>
public MakeModelLogicDevice(string key, string name, MakeModelConfig config) public EssentialsPluginTemplateLogicDevice(string key, string name, EssentialsPluginTemplateConfigObject config)
: base(key, name) : base(key, name)
{ {
this.LogInformation("Constructing new {0} instance", name); Debug.Console(0, this, "Constructing new {0} instance", name);
// TODO [ ] Update the constructor as needed for the plugin device being developed // TODO [ ] Update the constructor as needed for the plugin device being developed
this.config = config; _config = config;
} }
#region Overrides of EssentialsBridgeableDevice #region Overrides of EssentialsBridgeableDevice
@@ -52,7 +51,10 @@ namespace PepperDash.Essentials.Plugin
var joinMap = new EssentialsPluginTemplateBridgeJoinMap(joinStart); var joinMap = new EssentialsPluginTemplateBridgeJoinMap(joinStart);
// This adds the join map to the collection on the bridge // This adds the join map to the collection on the bridge
bridge?.AddJoinMap(Key, joinMap); if (bridge != null)
{
bridge.AddJoinMap(Key, joinMap);
}
var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey); var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey);
@@ -61,8 +63,8 @@ namespace PepperDash.Essentials.Plugin
joinMap.SetCustomJoinData(customJoins); joinMap.SetCustomJoinData(customJoins);
} }
this.LogDebug("Linking to Trilist {id}", trilist.ID.ToString("X")); Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
this.LogInformation("Linking to Bridge Type {type}", GetType().Name); Debug.Console(0, "Linking to Bridge Type {0}", GetType().Name);
// TODO [ ] Implement bridge links as needed // TODO [ ] Implement bridge links as needed

View File

@@ -1,83 +0,0 @@
using System.Collections.Generic;
using PepperDash.Core;
using PepperDash.Essentials.Core;
namespace PepperDash.Essentials.Plugin
{
/// <summary>
/// Plugin device factory for logic devices that don't communicate
/// </summary>
/// <remarks>
/// Rename the class to match the device plugin being developed
/// </remarks>
/// <example>
/// "EssentialsPluginFactoryTemplate" renamed to "MyLogicDeviceFactory"
/// </example>
public class MakeModelLogicDeviceFactory : EssentialsPluginDeviceFactory<MakeModelLogicDevice>
{
/// <summary>
/// Plugin device factory constructor
/// </summary>
/// <remarks>
/// Update the MinimumEssentialsFrameworkVersion & TypeNames as needed when creating a plugin
/// </remarks>
/// <example>
/// Set the minimum Essentials Framework Version
/// <code>
/// MinimumEssentialsFrameworkVersion = "1.6.4;
/// </code>
/// In the constructor we initialize the list with the typenames that will build an instance of this device
/// <code>
/// TypeNames = new List<string>() { "SamsungMdc", "SamsungMdcDisplay" };
/// </code>
/// </example>
public MakeModelLogicDeviceFactory()
{
// Set the minimum Essentials Framework Version
// TODO [ ] Update the Essentials minimum framework version which this plugin has been tested against
MinimumEssentialsFrameworkVersion = "2.12.1";
// In the constructor we initialize the list with the typenames that will build an instance of this device
// TODO [ ] Update the TypeNames for the plugin being developed
TypeNames = new List<string>() { "examplePluginLogicDevice" };
}
/// <summary>
/// Builds and returns an instance of EssentialsPluginTemplateLogicDevice
/// </summary>
/// <param name="dc">device configuration</param>
/// <returns>plugin device or null</returns>
/// <remarks>
/// The example provided below takes the device key, name, properties config and the comms device created.
/// Modify the EssetnialsPlugingDeviceTemplate constructor as needed to meet the requirements of the plugin device.
/// </remarks>
/// <seealso cref="PepperDash.Core.eControlMethod"/>
public override EssentialsDevice BuildDevice(PepperDash.Essentials.Core.Config.DeviceConfig dc)
{
Debug.LogDebug("[{key}] Factory Attempting to create new device from type: {type}", dc.Key, dc.Type);
// get the plugin device properties configuration object & check for null
var propertiesConfig = dc.Properties.ToObject<MakeModelConfig>();
if (propertiesConfig == null)
{
Debug.LogError("[{key}] Factory: failed to read properties config for {name}", dc.Key, dc.Name);
return null;
}
var controlConfig = CommFactory.GetControlPropertiesConfig(dc);
if (controlConfig == null)
{
return new MakeModelLogicDevice(dc.Key, dc.Name, propertiesConfig);
}
else
{
Debug.LogError("[{key}] Factory: Unable to get control properties from device config for {name}", dc.Key, dc.Name);
return null;
}
}
}
}

View File

@@ -35,7 +35,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="PepperDashEssentials" Version="2.12.1" > <PackageReference Include="PepperDashEssentials" Version="2.0.0" >
<ExcludeAssets>runtime</ExcludeAssets> <ExcludeAssets>runtime</ExcludeAssets>
</PackageReference> </PackageReference>
</ItemGroup> </ItemGroup>