diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..c969d2a
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,34 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: "[BUG]-"
+labels: bug
+assignees: ''
+
+---
+
+**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.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..0a854e7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,21 @@
+---
+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.
diff --git a/.github/scripts/GenerateVersionNumber.ps1 b/.github/scripts/GenerateVersionNumber.ps1
new file mode 100644
index 0000000..052d48a
--- /dev/null
+++ b/.github/scripts/GenerateVersionNumber.ps1
@@ -0,0 +1,38 @@
+$latestVersions = $(git tag --merged origin/main)
+$latestVersion = [version]"0.0.0"
+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\/heads\/main*.' {
+ $newVersionString = "{0}.{1}.{2}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1)
+ }
+ '^refs\/heads\/feature\/*.' {
+ $phase = 'alpha'
+ }
+ '^refs\/heads\/release\/*.' {
+ $phase = 'rc'
+ }
+ '^refs\/heads\/development*.' {
+ $phase = 'beta'
+ }
+ '^refs\/heads\/hotfix\/*.' {
+ $phase = 'hotfix'
+ }
+}
+$newVersionString = "{0}.{1}.{2}-{3}-{4}" -f $newVersion.Major, $newVersion.Minor, ($newVersion.Build + 1), $phase, $Env:GITHUB_RUN_NUMBER
+
+Write-Output $newVersionString
diff --git a/.github/scripts/UpdateAssemblyVersion.ps1 b/.github/scripts/UpdateAssemblyVersion.ps1
new file mode 100644
index 0000000..e52b31e
--- /dev/null
+++ b/.github/scripts/UpdateAssemblyVersion.ps1
@@ -0,0 +1,40 @@
+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";
+}
diff --git a/.github/scripts/ZipBuildOutput.ps1 b/.github/scripts/ZipBuildOutput.ps1
new file mode 100644
index 0000000..3f1998b
--- /dev/null
+++ b/.github/scripts/ZipBuildOutput.ps1
@@ -0,0 +1,41 @@
+# 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')
+# 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" | 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
+ $filenames = @($($_ -replace "cpz|clz|cplz", "dll"), $($_ -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
+ }
+}
+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
\ No newline at end of file
diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
new file mode 100644
index 0000000..bfff1c9
--- /dev/null
+++ b/.github/workflows/docker.yml
@@ -0,0 +1,101 @@
+name: Branch Build Using Docker
+
+on:
+ push:
+ branches:
+ - feature/*
+ - hotfix/*
+ - release/*
+ - main
+ - development
+
+env:
+ # solution path doesn't need slashes unless there it is multiple folders deep
+ # solution name does not include extension. .sln is assumed
+ SOLUTION_PATH: PDT.EssentialsPluginTemplate.EPI
+ SOLUTION_FILE: PDT.EssentialsPluginTemplate.EPI
+ # Do not edit this, we're just creating it here
+ VERSION: 0.0.0-buildtype-buildnumber
+ # Defaults to debug for build type
+ BUILD_TYPE: Debug
+ # Defaults to main as the release branch. Change as necessary
+ RELEASE_BRANCH: main
+jobs:
+ Build_Project:
+ runs-on: windows-latest
+ steps:
+ # First we checkout the source repo
+ - name: Checkout repo
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 0
+ # And any submodules
+ - name: Checkout submodules
+ shell: bash
+ run: |
+ git config --global url."https://github.com/".insteadOf "git@github.com:"
+ auth_header="$(git config --local --get http.https://github.com/.extraheader)"
+ git submodule sync --recursive
+ git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
+ # Set the BUILD_TYPE environment variable
+ - name: Set Build to Release if triggered from main
+ run: |
+ if("$($Env:GITHUB_REF)".contains("$($Env:RELEASE_BRANCH)")) {
+ Write-Host "Setting build type to Release"
+ Write-Output "::set-env name=BUILD_TYPE::Release"
+ }
+ # Fetch all tags
+ - name: Fetch tags
+ run: git fetch --tags
+ # Generate the appropriate version number
+ - name: Set Version Number
+ shell: powershell
+ run: |
+ $version = ./.github/scripts/GenerateVersionNumber.ps1
+ Write-Output "::set-env name=VERSION::$version"
+ # Use the version number to set the version of the assemblies
+ - name: Update AssemblyInfo.cs
+ shell: powershell
+ run: |
+ Write-Output ${{ env.VERSION }}
+ ./.github/scripts/UpdateAssemblyVersion.ps1 ${{ env.VERSION }}
+ - name: Login to Docker
+ uses: azure/docker-login@v1
+ with:
+ username: ${{ secrets.DOCKERHUB_USER }}
+ password: ${{ secrets.DOCKERHUB_PASSWORD }}
+ # Build the solutions in the docker image
+ - name: Build Solution
+ shell: powershell
+ run: |
+ Invoke-Expression "docker run --rm --mount type=bind,source=""$($Env:GITHUB_WORKSPACE)"",target=""c:/project"" pepperdash/sspbuilder c:\cihelpers\vsidebuild.exe -Solution ""c:\project\$($Env:SOLUTION_PATH)\$($Env:SOLUTION_FILE).sln"" -BuildSolutionConfiguration $($ENV:BUILD_TYPE)"
+ # Zip up the output files as needed
+ - name: Zip Build Output
+ shell: powershell
+ run: ./.github/scripts/ZipBuildOutput.ps1
+ - name: Upload Build Output
+ uses: actions/upload-artifact@v1
+ with:
+ name: Build
+ path: ./${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
+ # Create the release on the source repo
+ - name: Create Release
+ id: create_release
+ uses: actions/create-release@v1
+ with:
+ tag_name: ${{ env.VERSION }}
+ release_name: ${{ env.VERSION }}
+ prerelease: ${{contains('debug', env.BUILD_TYPE)}}
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # Upload the build package to the release
+ - name: Upload Release Package
+ id: upload_release
+ uses: actions/upload-release-asset@v1
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: ./${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
+ asset_name: ${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
+ asset_content_type: application/zip
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f218fa0
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,359 @@
+## 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/
+[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/
+
+# 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, .xml, .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/
+
+# Crestron Zip Files
+*.cplz
+*.clz
+*.projectinfo
+*.suo
diff --git a/EssentialsBuilds b/EssentialsBuilds
index 855dccd..e29501b 160000
--- a/EssentialsBuilds
+++ b/EssentialsBuilds
@@ -1 +1 @@
-Subproject commit 855dccd0d41aac272512f58d6bcd4764307bbb14
+Subproject commit e29501be5df2c587d1b6221e60565e38d21e369d
diff --git a/PDT.EssentialsPluginTemplate.EPI/EssentailsPluginTemplate.cs b/PDT.EssentialsPluginTemplate.EPI/EssentailsPluginTemplate.cs
deleted file mode 100644
index 0112c01..0000000
--- a/PDT.EssentialsPluginTemplate.EPI/EssentailsPluginTemplate.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-using Crestron.SimplSharp; // For Basic SIMPL# Classes
-using Crestron.SimplSharpPro; // For Basic SIMPL#Pro classes
-
-using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-
-using PepperDash.Essentials;
-using PepperDash.Essentials.Core;
-using PepperDash.Essentials.Core.Config;
-using PepperDash.Core;
-
-namespace EssentialsPluginTemplateEPI
-{
- ///
- /// This class contains the necessary properties and static methods required to function as an Essentials Plugin
- ///
- public class EssentialsPluginFactory
- {
- ///
- /// This string is used to define the minimum version of the
- /// Essentials Framework required for this plugin
- ///
- public static string MinimumEssentialsFrameworkVersion = "1.4.31";
-
- ///
- /// This method will get called by Essentials when this plugin is loaded.
- /// Use it to add factory methods for all new Device types defined in this plugin
- ///
- public static void LoadPlugin()
- {
- PepperDash.Essentials.Core.DeviceFactory.AddFactoryForType("EssentialsPluginTemplate", EssentialsPluginFactory.BuildDevice);
-
- // Add additional factories for each type here
- }
-
- ///
- /// Builds an instance of the device type. There should be method like this defined for each device type your plugin needs
- /// to be able to build
- ///
- /// The device configuration
- /// The device
- public static EssentialsPluginTemplateDevice BuildDevice(DeviceConfig dc)
- {
- var config = JsonConvert.DeserializeObject(dc.Properties.ToString());
- var newDevice = new EssentialsPluginTemplateDevice(dc.Key, dc.Name, config);
- return newDevice;
- }
-
- }
-}
-
diff --git a/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateBridge.cs b/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateBridge.cs
deleted file mode 100644
index e26e2d7..0000000
--- a/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateBridge.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-
-using Crestron.SimplSharp;
-using Crestron.SimplSharpPro.DeviceSupport;
-
-using PepperDash.Core;
-using PepperDash.Essentials.Core;
-using PepperDash.Essentials.Bridges;
-
-using Newtonsoft.Json;
-
-namespace EssentialsPluginTemplateEPI
-{
- public static class EssentialsPluginTemplateBridge
- {
- public static void LinkToApiExt(this EssentialsPluginFactory DspDevice, BasicTriList trilist, uint joinStart, string joinMapKey)
- {
- // Construct the default join map
- EssentialsPluginTemplateBridgeJoinMap joinMap = new EssentialsPluginTemplateBridgeJoinMap();
-
- // Attempt to get a custom join map if specified in config
- var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
-
- // If we find a custom join map, deserialize it
- if (!string.IsNullOrEmpty(joinMapSerialized))
- joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
-
- // Offset the joins based on the join start
- joinMap.OffsetJoinNumbers(joinStart);
-
-
- // Set all your join actions here
-
-
- // Link all your feedbacks to joins here
-
- }
- }
- public class EssentialsPluginTemplateBridgeJoinMap : JoinMapBase
- {
- // Specify your joins here
-
-
- public EssentialsPluginTemplateBridgeJoinMap()
- {
- // Set the values of your joins here
- }
-
- public override void OffsetJoinNumbers(uint joinStart)
- {
- // Offset the joins from joinStart as applicable
- }
- }
-}
\ No newline at end of file
diff --git a/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateDevice.cs b/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateDevice.cs
index 9cfcd62..dda96b2 100644
--- a/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateDevice.cs
+++ b/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateDevice.cs
@@ -1,22 +1,16 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using Crestron.SimplSharp;
-using Crestron.SimplSharpPro.DeviceSupport;
-
-using PepperDash.Essentials;
+using Crestron.SimplSharpPro.DeviceSupport;
+using Newtonsoft.Json;
+using PDT.EssentialsPluginTemplate.EPI;
using PepperDash.Essentials.Core;
-using PepperDash.Essentials.Core.Config;
+using PepperDash.Essentials.Core.Bridges;
using PepperDash.Core;
-using PepperDash.Essentials.Bridges;
namespace EssentialsPluginTemplateEPI
{
///
/// Example of a plugin device
///
- public class EssentialsPluginTemplateDevice : Device, IBridge
+ public class EssentialsPluginTemplateDevice : EssentialsDevice, IBridgeAdvanced
{
///
/// Device Constructor. Called by BuildDevice
@@ -46,9 +40,28 @@ namespace EssentialsPluginTemplateEPI
///
///
///
- public void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey)
+ public void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
{
- this.LinkToApi(trilist, joinStart, joinMapKey);
+ // Construct the default join map
+ var joinMap = new EssentialsPluginTemplateBridgeJoinMap(joinStart);
+
+ // Attempt to get a custom join map if specified in config
+ var joinMapSerialized = JoinMapHelper.GetJoinMapForDevice(joinMapKey);
+
+ // If we find a custom join map, deserialize it
+ if (!string.IsNullOrEmpty(joinMapSerialized))
+ joinMap = JsonConvert.DeserializeObject(joinMapSerialized);
+
+ //Checking if the bridge is null allows for backwards compatability with configurations that use EiscApi instead of EiscApiAdvanced
+ if (bridge != null)
+ {
+ bridge.AddJoinMap(Key, joinMap);
+ }
+
+ // Set all your join actions here
+
+
+ // Link all your feedbacks to joins here
}
}
}
\ No newline at end of file
diff --git a/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateFactory.cs b/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateFactory.cs
new file mode 100644
index 0000000..79cfcf9
--- /dev/null
+++ b/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateFactory.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using Crestron.SimplSharp; // For Basic SIMPL# Classes
+using Crestron.SimplSharpPro; // For Basic SIMPL#Pro classes
+
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+using PepperDash.Essentials;
+using PepperDash.Essentials.Core;
+using PepperDash.Essentials.Core.Config;
+using PepperDash.Core;
+
+namespace EssentialsPluginTemplateEPI
+{
+ ///
+ /// This class contains the necessary properties and methods required to function as an Essentials Plugin
+ ///
+ public class EssentialsPluginFactory:EssentialsPluginDeviceFactory
+ {
+ public EssentialsPluginFactory()
+ {
+ // This string is used to define the minimum version of the
+ // Essentials Framework required for this plugin
+ MinimumEssentialsFrameworkVersion = "1.6.1";
+
+ //The strings defined in this list will be used in the configuration file to build the device in this plugin.
+ TypeNames = new List {"essentialsPluginTemplateDevice"};
+ }
+
+ #region Overrides of EssentialsDeviceFactory
+
+ public override EssentialsDevice BuildDevice(DeviceConfig dc)
+ {
+ var config = dc.Properties.ToObject();
+ var newDevice = new EssentialsPluginTemplateDevice(dc.Key, dc.Name, config);
+ return newDevice;
+ }
+
+ #endregion
+ }
+}
+
diff --git a/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateJoinMap.cs b/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateJoinMap.cs
new file mode 100644
index 0000000..4272a97
--- /dev/null
+++ b/PDT.EssentialsPluginTemplate.EPI/EssentialsPluginTemplateJoinMap.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using Crestron.SimplSharp;
+using PepperDash.Essentials.Core;
+
+namespace PDT.EssentialsPluginTemplate.EPI
+{
+ public class EssentialsPluginTemplateBridgeJoinMap : JoinMapBaseAdvanced
+ {
+ [JoinName("IsOnline")]
+ public JoinDataComplete IsOnline = new JoinDataComplete(new JoinData {JoinNumber = 1, JoinSpan = 1},
+ new JoinMetadata
+ {
+ Description = "Device is Online",
+ JoinType = eJoinType.Digital,
+ JoinCapabilities = eJoinCapabilities.ToSIMPL
+ });
+
+
+ public EssentialsPluginTemplateBridgeJoinMap(uint joinStart):base(joinStart, typeof(EssentialsPluginTemplateBridgeJoinMap))
+ {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.EPI.csproj b/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.EPI.csproj
index 5a9ae47..e3bae95 100644
--- a/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.EPI.csproj
+++ b/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.EPI.csproj
@@ -91,9 +91,9 @@
-
-
+
+
diff --git a/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.EPI.suo b/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.EPI.suo
deleted file mode 100644
index ad4bc10..0000000
Binary files a/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.EPI.suo and /dev/null differ
diff --git a/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.projectinfo b/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.projectinfo
deleted file mode 100644
index acdbdf8..0000000
Binary files a/PDT.EssentialsPluginTemplate.EPI/PDT.EssentialsPluginTemplate.projectinfo and /dev/null differ
diff --git a/README.md b/README.md
index 2e77fe0..4cc9045 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,9 @@
-# PDT.EssentialsPluginTemplate.EPI
+# Essentials Plugin Template (c) 2020
+## License
+
+Provided under MIT license
+
+## Overview
+
+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.