Compare commits

..

19 commits

Author SHA1 Message Date
Jason T Alborough
c225184021
Rename releaserc.json to .releaserc.json 2025-03-25 16:43:00 -04:00
Jason T Alborough
de4cbcac73
Merge pull request #28 from PepperDash/feature/4-series
Feature/4 series
2025-03-12 10:13:33 -04:00
jdevito
61b8c51db2 chore: remove deleted file reference 2025-01-31 08:23:54 -06:00
jdevito
eee7822de0 feat: add updatedoc caller 2025-01-31 08:23:32 -06:00
jdevito
85d2e4e1dc fix: update template repo
1. update workflow files
2. Add 3-series SLN and csproj files
- Remove from project when using the template if not needed
3. Update 4-series SLN and csproj files
4. Moved SLN's to root of project
5. Rename *.cs files to identify naming convention of 'MakeModel'
6. Upate packages.config to reference latest Essentials v1 release
2025-01-30 16:39:56 -06:00
Aviv Cohn
7c3c0bea71 feat: add files 2024-10-10 14:27:29 -04:00
Aviv Cohn
a427afaf3c feat: Add Directory.Build.x files 2024-10-10 14:04:26 -04:00
Aviv Cohn
2264d90372 feat: Add 4Series csproj and update info 2024-10-10 13:04:15 -04:00
Jason T Alborough
809fb79bf1
Merge pull request #23 from PepperDash/feature/new-beta-bulds-caller-yaml
Create essentialsplugins-betabuilds-caller.yml
2023-10-06 16:18:18 -04:00
Jason T Alborough
507ca486ab
Merge pull request #24 from PepperDash/feature/new-release-bulds-caller-yaml
Create essentialsplugins-releasebuilds-caller.yml
2023-10-06 15:52:59 -04:00
Jason T Alborough
4ec7550625
Merge pull request #22 from PepperDash/feature/readme-logo
feature: adds logo file and updates readme to reference logo
2023-10-06 15:52:50 -04:00
Jason DeVito
d327f2def8
fix: removes old release build action 2023-09-26 09:04:31 -05:00
Jason DeVito
4244b394e7
fix: removes old betabuild action 2023-09-26 09:03:37 -05:00
Jason DeVito
1b3c28da0c
Create essentialsplugins-releasebuilds-caller.yml 2023-09-26 08:58:37 -05:00
Jason DeVito
2586e9502d
Create essentialsplugins-betabuilds-caller.yml 2023-09-26 08:57:39 -05:00
Jason DeVito
7ba409d64c
feature: adds logo file and updates readme to reference logo 2023-08-29 16:27:59 -05:00
Andrew Welker
0746d309df
Merge pull request #19 from PepperDash/feature/Conditional-Workflows
Multiple Style and Workflow Updates
2022-07-22 11:06:34 -06:00
Trevor Payne
259a71c562 style: renamed classes for consistency
build: updated essentials version

ci: updated workflows

docs: documentation updated

ci: updated nuspec
2022-07-21 12:07:27 -05:00
Trevor Payne
62f959bb25 test workflow syntax 2022-07-21 10:17:56 -05:00
22 changed files with 756 additions and 1108 deletions

View file

@ -0,0 +1,22 @@
name: Build Essentials Plugin
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 }}

View file

@ -1,285 +0,0 @@
name: Branch Build Using Docker
on:
push:
branches:
- feature/*
- hotfix/*
- release/*
- dev*
env:
# 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 master as the release branch. Change as necessary
RELEASE_BRANCH: main
jobs:
Build_Project:
runs-on: windows-2019
steps:
# First we checkout the source repo
- name: Checkout repo
uses: actions/checkout@v2
with:
fetch-depth: 0
# Fetch all tags
- name: Fetch tags
run: git fetch --tags
# Generate the appropriate version number
- name: Set Version Number
shell: powershell
run: |
$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
}
'^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\/dev*.' {
$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
}
}
echo "VERSION=$newVersionString" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
# Use the version number to set the version of the assemblies
- name: Update AssemblyInfo.cs
shell: powershell
run: |
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($Env:VERSION, "\d+\.\d+\.\d+.*");
if ($r.Success) {
Write-Output "Updating Assembly Version to $Env:VERSION ...";
Update-AllAssemblyInfoFiles $Env:VERSION;
}
else {
Write-Output " ";
Write-Output "Error: Input version $Env:VERSION does not match x.y.z format!"
Write-Output " ";
Write-Output "Unable to apply version to AssemblyInfo.cs files";
}
- name: restore Nuget Packages
run: nuget install .\packages.config -OutputDirectory .\packages -ExcludeVersion
# Set the SOLUTION_PATH
- name: Get SLN Path
shell: powershell
run: |
$solution_path = Get-ChildItem *.sln -recurse
$solution_path = $solution_path.FullName
$solution_path = $solution_path -replace "(?:[^\\]*\\){4}", ""
Write-Output $solution_path
echo "SOLUTION_PATH=$($solution_path)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
# Set the SOLUTION_FILE
- name: Get SLN File
shell: powershell
run: |
$solution_file = Get-ChildItem .\*.sln -recurse -Path "$($Env:GITHUB_WORKSPACE)"
echo "SOLUTION_FILE=$($solution_file.BaseName)"| Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
# Login to Docker
- 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)"" -BuildSolutionConfiguration $($ENV:BUILD_TYPE)"
# Zip up the output files as needed
- name: Zip Build Output
shell: powershell
run: |
$destination = "$($Env:GITHUB_HOME)\output"
New-Item -ItemType Directory -Force -Path ($destination)
Get-ChildItem ($destination)
$exclusions = "packages"
# 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", "*.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
$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
}
}
Get-ChildItem -Path $destination\*.cplz | 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
# Write the version to a file to be consumed by the push jobs
- name: Write Version
run: Write-Output "$($Env:VERSION)" | Out-File -FilePath "$($Env:GITHUB_HOME)\output\version.txt"
# Upload output files
- name: Upload Build Output
uses: actions/upload-artifact@v1
with:
name: Build
path: ./${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
# Upload the Version file as an artifact
- name: Upload version.txt
uses: actions/upload-artifact@v1
with:
name: Version
path: ${{env.GITHUB_HOME}}\output\version.txt
# Create the release on the source repo
- name: Create Release
id: create_release
uses: fleskesvor/create-release@feature/support-target-commitish
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 }}
Push_Nuget_Package:
needs: Build_Project
runs-on: windows-2019
env:
NUSPECNAME: default
steps:
- name: Get nuget File
shell: powershell
run: |
$nuspec_file = Get-ChildItem *.nuspec -recurse
echo "NUSPECNAME=$($nuspec_file.BaseName)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
echo "NUSPEC_FILE=$($nuspec_file.BaseName)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Download Build Version Info
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
uses: actions/download-artifact@v1
with:
name: Version
- name: Set Version Number
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
shell: powershell
run: |
Get-ChildItem "./Version"
$version = Get-Content -Path ./Version/version.txt
Write-Host "Version: $version"
echo "VERSION=$version" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
Remove-Item -Path ./Version/version.txt
Remove-Item -Path ./Version
- name: Download Build output
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
uses: actions/download-artifact@v1
with:
name: Build
path: ./
- name: Unzip Build file
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
run: |
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
Remove-Item -Path .\*.zip
- name: Copy Files to root & delete output directory
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
run: |
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
Remove-Item -Path .\output -Recurse
#Pushes to github nuget store
- name: Add nuget.exe
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
uses: nuget/setup-nuget@v1
- name: Add Github Packages source
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash/index.json -username Pepperdash -password ${{ secrets.GITHUB_TOKEN }}
# Pushes to nuget gallery, not needed unless publishing publicly
- name: Add nuget.org API Key
if: github.repository_owner == 'PepperDash' && github.repository_visibility == 'public' && !contains(env.NUSPECNAME, 'EssentialsPluginTemplate')
run: nuget setApiKey ${{ secrets.NUGET_API_KEY }}
- name: Create nuget package
if: github.repository_owner == 'PepperDash' && github.repository_visibility == 'public' && !contains(env.NUSPECNAME, 'EssentialsPluginTemplate')
run: nuget pack "./${{ env.NUSPEC_FILE}}.nuspec" -version ${{ env.VERSION }}
- name: Publish nuget package to Github registry
if: github.repository_owner == 'PepperDash' && github.repository_visibility == 'public' && !contains(env.NUSPECNAME, 'EssentialsPluginTemplate')
run: nuget push **/*.nupkg -source github
- name: Publish nuget package to nuget.org
if: github.repository_owner == 'PepperDash' && github.repository_visibility == 'public' && !contains(env.NUSPECNAME, 'EssentialsPluginTemplate')
run: nuget push **/*.nupkg -Source https://api.nuget.org/v3/index.json

View file

@ -1,233 +0,0 @@
name: Main Build using Docker
on:
release:
types:
- released
branches:
- main
env:
# 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 master as the release branch. Change as necessary
RELEASE_BRANCH: main
jobs:
Build_Project:
runs-on: windows-2019
steps:
# First we checkout the source repo
- name: Checkout repo
uses: actions/checkout@v2
with:
fetch-depth: 0
# Fetch all tags
- name: Fetch tags
run: git fetch --tags
# Generate the appropriate version number
- name: Set Version Number
shell: powershell
env:
TAG_NAME: ${{ github.event.release.tag_name }}
run: echo "VERSION=$($Env:TAG_NAME)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
# Use the version number to set the version of the assemblies
- name: Update AssemblyInfo.cs
shell: powershell
run: |
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($Env:VERSION, "\d+\.\d+\.\d+.*");
if ($r.Success) {
Write-Output "Updating Assembly Version to $Env:VERSION ...";
Update-AllAssemblyInfoFiles $Env:VERSION;
}
else {
Write-Output " ";
Write-Output "Error: Input version $Env:VERSION does not match x.y.z format!"
Write-Output " ";
Write-Output "Unable to apply version to AssemblyInfo.cs files";
}
- name: restore Nuget Packages
run: nuget install .\packages.config -OutputDirectory .\packages -ExcludeVersion
# Set the SOLUTION_PATH
- name: Get SLN Path
shell: powershell
run: |
$solution_path = Get-ChildItem *.sln -recurse
$solution_path = $solution_path.FullName
$solution_path = $solution_path -replace "(?:[^\\]*\\){4}", ""
Write-Output $solution_path
echo "SOLUTION_PATH=$($solution_path)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
# Set the SOLUTION_FILE
- name: Get SLN File
shell: powershell
run: |
$solution_file = Get-ChildItem .\*.sln -recurse -Path "$($Env:GITHUB_WORKSPACE)"
echo "SOLUTION_FILE=$($solution_file.BaseName)"| Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
# Login to Docker
- 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)"" -BuildSolutionConfiguration $($ENV:BUILD_TYPE)"
# Zip up the output files as needed
- name: Zip Build Output
shell: powershell
run: |
$destination = "$($Env:GITHUB_HOME)\output"
New-Item -ItemType Directory -Force -Path ($destination)
Get-ChildItem ($destination)
$exclusions = "packages"
# 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", "*.nuspec", "*.md" | 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
}
}
Get-ChildItem -Path $destination\*.cplz | 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
# Write the version to a file to be consumed by the push jobs
- name: Write Version
run: Write-Output "$($Env:VERSION)" | Out-File -FilePath "$($Env:GITHUB_HOME)\output\version.txt"
# Upload output files
- name: Upload Build Output
uses: actions/upload-artifact@v1
with:
name: Build
path: ./${{ env.SOLUTION_FILE}}-${{ env.VERSION}}.zip
# Upload the Version file as an artifact
- name: Upload version.txt
uses: actions/upload-artifact@v1
with:
name: Version
path: ${{env.GITHUB_HOME}}\output\version.txt
# Upload the build package to the release
- name: Upload Release Package
id: upload_release
uses: actions/upload-release-asset@v1
with:
upload_url: ${{ github.event.release.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 }}
Push_Nuget_Package:
needs: Build_Project
runs-on: windows-2019
env:
NUSPECNAME: default
steps:
- name: Get nuget File
shell: powershell
run: |
$nuspec_file = Get-ChildItem *.nuspec -recurse
echo "NUSPECNAME=$($nuspec_file.BaseName)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
echo "NUSPEC_FILE=$($nuspec_file.BaseName)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
- name: Download Build Version Info
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
uses: actions/download-artifact@v1
with:
name: Version
- name: Set Version Number
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
shell: powershell
run: |
Get-ChildItem "./Version"
$version = Get-Content -Path ./Version/version.txt
Write-Host "Version: $version"
echo "VERSION=$version" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
Remove-Item -Path ./Version/version.txt
Remove-Item -Path ./Version
- name: Download Build output
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
uses: actions/download-artifact@v1
with:
name: Build
path: ./
- name: Unzip Build file
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
run: |
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
Remove-Item -Path .\*.zip
- name: Copy Files to root & delete output directory
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
run: |
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
Remove-Item -Path .\output -Recurse
#Pushes to github nuget store
- name: Add nuget.exe
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
uses: nuget/setup-nuget@v1
- name: Add Github Packages source
if: "!contains(env.NUSPECNAME, 'EssentialsPluginTemplate')"
run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash/index.json -username Pepperdash -password ${{ secrets.GITHUB_TOKEN }}
# Pushes to nuget gallery, not needed unless publishing publicly
- name: Add nuget.org API Key
if: github.repository_owner == 'PepperDash' && github.repository_visibility == 'public' && !contains(env.NUSPECNAME, 'EssentialsPluginTemplate')
run: nuget setApiKey ${{ secrets.NUGET_API_KEY }}
- name: Create nuget package
if: github.repository_owner == 'PepperDash' && github.repository_visibility == 'public' && !contains(env.NUSPECNAME, 'EssentialsPluginTemplate')
run: nuget pack "./${{ env.NUSPEC_FILE}}.nuspec" -version ${{ env.VERSION }}
- name: Publish nuget package to Github registry
if: github.repository_owner == 'PepperDash' && github.repository_visibility == 'public' && !contains(env.NUSPECNAME, 'EssentialsPluginTemplate')
run: nuget push **/*.nupkg -source github
- name: Publish nuget package to nuget.org
if: github.repository_owner == 'PepperDash' && github.repository_visibility == 'public' && !contains(env.NUSPECNAME, 'EssentialsPluginTemplate')
run: nuget push **/*.nupkg -Source https://api.nuget.org/v3/index.json

View file

@ -0,0 +1,14 @@
name: Generate README
on:
push:
branches-ignore:
- 'robot-docs'
jobs:
call-update-readme:
uses: PepperDash/workflow-templates/.github/workflows/update-readme.yml@development
with:
target-branch: ${{ github.ref_name }}

34
.releaserc.json Normal file
View file

@ -0,0 +1,34 @@
{
"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": "replace-me-feature-branch",
"prerelease": "replace-me-prerelease",
"channel": "replace-me-prerelease"
}
]
}

View file

@ -1,4 +1,6 @@
# Essentials Plugin Template (c) 2020 ![PepperDash Essentials Pluign Logo](/images/essentials-plugin-blue.png)
# Essentials Plugin Template (c) 2023
## License ## License
@ -29,6 +31,7 @@ The [Essentials](https://github.com/PepperDash/Essentials) libraries are require
To install dependencies once nuget.exe is installed, run the following command from the root directory of your repository: 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`. `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. 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 ### Installing Different versions of PepperDash Core
@ -37,7 +40,7 @@ If you need a different version of PepperDash Core, use the command `nuget insta
### Instructions for Renaming Solution and Files ### Instructions for Renaming Solution and Files
See the Task List in Visual Studio for a guide on how to start using the templage. There is extensive inline documentation and examples as well. See the Task List in Visual Studio for a guide on how to start using the template. There is extensive inline documentation and examples as well.
For renaming instructions in particular, see the XML `remarks` tags on class definitions For renaming instructions in particular, see the XML `remarks` tags on class definitions
@ -45,10 +48,13 @@ For renaming instructions in particular, see the XML `remarks` tags on class def
## Generating Nuget Package ## Generating Nuget Package
In the solution folder is a file named "PDT.EssentialsPluginTemplate.nuspec-TEMPLATE" In the solution folder is a file named "PDT.EssentialsPluginTemplate.nuspec"
1. Remove the -TEMPLATE so that the extention is .nuspec. 1. Rename the file to match your plugin solution name
2. Rename the file to match your plugin solution name 2. Edit the file to include your project specifics including
3. Edit the file to include your project specifics including
1. <id>PepperDash.Essentials.Plugin.MakeModel</id> Convention is to use the prefix "PepperDash.Essentials.Plugin" and include the MakeModel of the device. 1. <id>PepperDash.Essentials.Plugin.MakeModel</id> Convention is to use the prefix "PepperDash.Essentials.Plugin" and include the MakeModel of the device.
2. <projectUrl>https://github.com/PepperDash/EssentialsPluginTemplate</projectUrl> Change to your url to the project repo 2. <projectUrl>https://github.com/PepperDash/EssentialsPluginTemplate</projectUrl> Change to your url to the project repo
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.
__If you do not make these changes to the nuspec file, the project will not generate a nuget package__

View file

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

View file

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35327.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "epi-make-model.4Series", "src\epi-make-model.4Series.csproj", "{52E6E0A0-A710-4B5F-AF52-08816F5C99BB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{52E6E0A0-A710-4B5F-AF52-08816F5C99BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{52E6E0A0-A710-4B5F-AF52-08816F5C99BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{52E6E0A0-A710-4B5F-AF52-08816F5C99BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{52E6E0A0-A710-4B5F-AF52-08816F5C99BB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {45BE70E2-A4DC-4851-92ED-CE67B99F5D86}
EndGlobalSection
EndGlobal

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View file

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

21
src/Directory.Build.props Normal file
View file

@ -0,0 +1,21 @@
<Project>
<PropertyGroup>
<Version>1.0.0-local</Version>
<InformationalVersion>$(Version)</InformationalVersion>
<Authors>PepperDash Technologies</Authors>
<Company>PepperDash Technologies</Company>
<Product>PepperDash Essentials Plugin Template</Product>
<Copyright>Copyright © 2025</Copyright>
<RepositoryUrl>https://github.com/PepperDash/EssentialsPluginTemplate.git</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>Crestron; 4series</PackageTags>
<PackageOutputPath>../output</PackageOutputPath>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<PackageLicenseFile>LICENSE.md</PackageLicenseFile>
<PackageReadmeFile>README.md</PackageReadmeFile>
</PropertyGroup>
<ItemGroup>
<None Include="..\LICENSE.md" Pack="true" PackagePath=""/>
<None Include="..\README.md" Pack="true" PackagePath=""/>
</ItemGroup>
</Project>

View file

@ -0,0 +1,20 @@
<Project>
<ItemGroup>
<None Include="$(TargetDir)\$(TargetName).$(Version).cpz" Condition="$(ProjectType) == 'Program'">
<Pack>true</Pack>
<PackagePath>content;</PackagePath>
</None>
<None Include="$(PackageOutputPath)\$(TargetName).$(Version).cplz" Condition="$(ProjectType) == 'ProgramLibrary'">
<Pack>true</Pack>
<PackagePath>content;</PackagePath>
</None>
</ItemGroup>
<Target Name="Create CPLZ" AfterTargets="Build; Rebuild" Condition="$(ProjectType) == 'ProgramLibrary'">
<Message Text="Creating CPLZ"></Message>
<MakeDir Directories="$(PackageOutputPath)" Condition="!Exists($(PackageOutputPath))"></MakeDir>
<ZipDirectory SourceDirectory="$(TargetDir)" DestinationFile="$(PackageOutputPath)\$(TargetName).$(Version).cplz" Overwrite="true"/>
</Target>
<Target Name="Clean CPLZ" AfterTargets="AfterClean" Condition="$(ProjectType) == 'ProgramLibrary'">
<Delete Files="$(PackageOutputPath)\$(TargetName).$(Version).cplz"/>
</Target>
</Project>

View file

@ -1,101 +1,101 @@
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
namespace EssentialsPluginTemplate namespace PepperDash.Essentials.Plugin
{ {
/// <summary> /// <summary>
/// Plugin device Bridge Join Map /// Plugin device Bridge Join Map
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Rename the class to match the device plugin being developed. Reference Essentials JoinMaps, if one exists for the device plugin being developed /// Rename the class to match the device plugin being developed. Reference Essentials JoinMaps, if one exists for the device plugin being developed
/// </remarks> /// </remarks>
/// <see cref="PepperDash.Essentials.Core.Bridges"/> /// <see cref="PepperDash.Essentials.Core.Bridges"/>
/// <example> /// <example>
/// "EssentialsPluginBridgeJoinMapTemplate" renamed to "SamsungMdcBridgeJoinMap" /// "EssentialsPluginBridgeJoinMapTemplate" renamed to "SamsungMdcBridgeJoinMap"
/// </example> /// </example>
public class EssentialsPluginTemplateBridgeJoinMap : JoinMapBaseAdvanced public class EssentialsPluginTemplateBridgeJoinMap : JoinMapBaseAdvanced
{ {
#region Digital #region Digital
// TODO [ ] Add digital joins below plugin being developed // TODO [ ] Add digital joins below plugin being developed
[JoinName("IsOnline")] [JoinName("IsOnline")]
public JoinDataComplete IsOnline = new JoinDataComplete( public JoinDataComplete IsOnline = new JoinDataComplete(
new JoinData new JoinData
{ {
JoinNumber = 1, JoinNumber = 1,
JoinSpan = 1 JoinSpan = 1
}, },
new JoinMetadata new JoinMetadata
{ {
Description = "Is Online", Description = "Is Online",
JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
[JoinName("Connect")] [JoinName("Connect")]
public JoinDataComplete Connect = new JoinDataComplete( public JoinDataComplete Connect = new JoinDataComplete(
new JoinData new JoinData
{ {
JoinNumber = 2, JoinNumber = 2,
JoinSpan = 1 JoinSpan = 1
}, },
new JoinMetadata new JoinMetadata
{ {
Description = "Connect (Held)/Disconnect (Release) & corresponding feedback", Description = "Connect (Held)/Disconnect (Release) & corresponding feedback",
JoinCapabilities = eJoinCapabilities.ToFromSIMPL, JoinCapabilities = eJoinCapabilities.ToFromSIMPL,
JoinType = eJoinType.Digital JoinType = eJoinType.Digital
}); });
#endregion #endregion
#region Analog #region Analog
// TODO [ ] Add analog joins below plugin being developed // TODO [ ] Add analog joins below plugin being developed
[JoinName("Status")] [JoinName("Status")]
public JoinDataComplete Status = new JoinDataComplete( public JoinDataComplete Status = new JoinDataComplete(
new JoinData new JoinData
{ {
JoinNumber = 1, JoinNumber = 1,
JoinSpan = 1 JoinSpan = 1
}, },
new JoinMetadata new JoinMetadata
{ {
Description = "Socket Status", Description = "Socket Status",
JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Analog JoinType = eJoinType.Analog
}); });
#endregion #endregion
#region Serial #region Serial
// TODO [ ] Add serial joins below plugin being developed // TODO [ ] Add serial joins below plugin being developed
public JoinDataComplete DeviceName = new JoinDataComplete( public JoinDataComplete DeviceName = new JoinDataComplete(
new JoinData new JoinData
{ {
JoinNumber = 1, JoinNumber = 1,
JoinSpan = 1 JoinSpan = 1
}, },
new JoinMetadata new JoinMetadata
{ {
Description = "Device Name", Description = "Device Name",
JoinCapabilities = eJoinCapabilities.ToSIMPL, JoinCapabilities = eJoinCapabilities.ToSIMPL,
JoinType = eJoinType.Serial JoinType = eJoinType.Serial
}); });
#endregion #endregion
/// <summary> /// <summary>
/// Plugin device BridgeJoinMap constructor /// Plugin device BridgeJoinMap constructor
/// </summary> /// </summary>
/// <param name="joinStart">This will be the join it starts on the EISC bridge</param> /// <param name="joinStart">This will be the join it starts on the EISC bridge</param>
public EssentialsPluginTemplateBridgeJoinMap(uint joinStart) public EssentialsPluginTemplateBridgeJoinMap(uint joinStart)
: base(joinStart, typeof(EssentialsPluginTemplateBridgeJoinMap)) : base(joinStart, typeof(EssentialsPluginTemplateBridgeJoinMap))
{ {
} }
} }
} }

View file

@ -1,8 +1,8 @@
using System.Collections.Generic; using System.Collections.Generic;
using Newtonsoft.Json; using Newtonsoft.Json;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
namespace EssentialsPluginTemplate namespace PepperDash.Essentials.Plugin
{ {
/// <summary> /// <summary>
/// Plugin device configuration object /// Plugin device configuration object

View file

@ -1,13 +1,13 @@
// For Basic SIMPL# Classes // For Basic SIMPL# Classes
// For Basic SIMPL#Pro classes // For Basic SIMPL#Pro classes
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro;
using Crestron.SimplSharpPro; using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Bridges;
namespace EssentialsPluginTemplate namespace PepperDash.Essentials.Plugin
{ {
/// <summary> /// <summary>
/// Plugin device /// Plugin device

View file

@ -1,299 +1,298 @@
// For Basic SIMPL# Classes // For Basic SIMPL# Classes
// For Basic SIMPL#Pro classes // For Basic SIMPL#Pro classes
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core; using PepperDash.Core;
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;
namespace PepperDash.Essentials.Plugin
namespace EssentialsPluginTemplate {
{ /// <summary>
/// <summary> /// Plugin device template for third party devices that use IBasicCommunication
/// Plugin device template for third party devices that use IBasicCommunication /// </summary>
/// </summary> /// <remarks>
/// <remarks> /// Rename the class to match the device plugin being developed.
/// Rename the class to match the device plugin being developed. /// </remarks>
/// </remarks> /// <example>
/// <example> /// "EssentialsPluginDeviceTemplate" renamed to "SamsungMdcDevice"
/// "EssentialsPluginDeviceTemplate" renamed to "SamsungMdcDevice" /// </example>
/// </example> public class EssentialsPluginTemplateDevice : 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 EssentialsPluginTemplateConfigObject _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 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 byte[] _commsByteBuffer = { };
private byte[] _commsByteBuffer = { };
/// <summary>
/// <summary> /// 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(); }
} }
} }
}
/// <summary>
/// <summary> /// Reports connect feedback through the bridge
/// Reports connect feedback through the bridge /// </summary>
/// </summary> public BoolFeedback ConnectFeedback { get; private set; }
public BoolFeedback ConnectFeedback { get; private set; }
/// <summary>
/// <summary> /// Reports online feedback through the bridge
/// Reports online feedback through the bridge /// </summary>
/// </summary> public BoolFeedback OnlineFeedback { get; private set; }
public BoolFeedback OnlineFeedback { get; private set; }
/// <summary>
/// <summary> /// Reports socket status feedback through the bridge
/// Reports socket status feedback through the bridge /// </summary>
/// </summary> public IntFeedback StatusFeedback { get; private set; }
public IntFeedback StatusFeedback { get; private set; }
/// <summary>
/// <summary> /// Plugin device constructor for devices that need IBasicCommunication
/// Plugin device constructor for devices that need IBasicCommunication /// </summary>
/// </summary> /// <param name="key"></param>
/// <param name="key"></param> /// <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 EssentialsPluginTemplateDevice(string key, string name, EssentialsPluginTemplateConfigObject config, IBasicCommunication comms)
public EssentialsPluginTemplateDevice(string key, string name, EssentialsPluginTemplateConfigObject config, IBasicCommunication comms) : base(key, name)
: base(key, name) {
{ Debug.Console(0, this, "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
_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);
ConnectFeedback = new BoolFeedback(() => Connect); OnlineFeedback = new BoolFeedback(() => _commsMonitor.IsOnline);
OnlineFeedback = new BoolFeedback(() => _commsMonitor.IsOnline); StatusFeedback = new IntFeedback(() => (int)_commsMonitor.Status);
StatusFeedback = new IntFeedback(() => (int)_commsMonitor.Status);
_comms = comms;
_comms = comms; _commsMonitor = new GenericCommunicationMonitor(this, _comms, _config.PollTimeMs, _config.WarningTimeoutMs, _config.ErrorTimeoutMs, Poll);
_commsMonitor = new GenericCommunicationMonitor(this, _comms, _config.PollTimeMs, _config.WarningTimeoutMs, _config.ErrorTimeoutMs, Poll);
var socket = _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 socket.ConnectionChange += socket_ConnectionChange;
socket.ConnectionChange += socket_ConnectionChange; Connect = true;
Connect = true; }
}
#region Communication data event handlers. Comment out any that don't apply to the API type
#region Communication data event handlers. Comment out any that don't apply to the API type
// 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(_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 _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 _comms.TextReceived += Handle_TextReceived;
_comms.TextReceived += Handle_TextReceived;
#endregion
#endregion }
}
private void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs args)
private void socket_ConnectionChange(object sender, GenericSocketStatusChageEventArgs args) {
{ if (ConnectFeedback != null)
if (ConnectFeedback != null) ConnectFeedback.FireUpdate();
ConnectFeedback.FireUpdate();
if (StatusFeedback != null)
if (StatusFeedback != null) StatusFeedback.FireUpdate();
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 private void Handle_LineRecieved(object sender, GenericCommMethodReceiveTextArgs args)
private void Handle_LineRecieved(object sender, GenericCommMethodReceiveTextArgs args) {
{ // 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 private void Handle_BytesReceived(object sender, GenericCommMethodReceiveBytesArgs args)
private void Handle_BytesReceived(object sender, GenericCommMethodReceiveBytesArgs args) {
{ // TODO [ ] Implement method
// TODO [ ] Implement method throw new System.NotImplementedException();
throw new System.NotImplementedException(); }
}
// TODO [ ] If not using an ASCII based API with no delimeter, delete the method below
// TODO [ ] If not using an ASCII based API with no delimeter, delete the method below void Handle_TextReceived(object sender, GenericCommMethodReceiveTextArgs e)
void Handle_TextReceived(object sender, GenericCommMethodReceiveTextArgs e) {
{ // TODO [ ] Implement method
// TODO [ ] Implement method throw new System.NotImplementedException();
throw new System.NotImplementedException(); }
}
/// <summary>
/// <summary> /// This method should perform any necessary parsing of feedback messages from the device
/// This method should perform any necessary parsing of feedback messages from the device /// </summary>
/// </summary> /// <param name="message"></param>
/// <param name="message"></param> void ProcessFeedbackMessage(string message)
void ProcessFeedbackMessage(string message) {
{
}
}
// TODO [ ] If not using an ACII based API, delete the properties below
// TODO [ ] If not using an ACII based API, delete the properties below /// <summary>
/// <summary> /// Sends text to the device plugin comms
/// Sends text to the device plugin comms /// </summary>
/// </summary> /// <remarks>
/// <remarks> /// Can be used to test commands with the device plugin using the DEVPROPS and DEVJSON console commands
/// Can be used to test commands with the device plugin using the DEVPROPS and DEVJSON console commands /// </remarks>
/// </remarks> /// <param name="text">Command to be sent</param>
/// <param name="text">Command to be sent</param> public void SendText(string text)
public void SendText(string text) {
{ 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 /// <summary>
/// <summary> /// Sends bytes to the device plugin comms
/// Sends bytes to the device plugin comms /// </summary>
/// </summary> /// <remarks>
/// <remarks> /// Can be used to test commands with the device plugin using the DEVPROPS and DEVJSON console commands
/// Can be used to test commands with the device plugin using the DEVPROPS and DEVJSON console commands /// </remarks>
/// </remarks> /// <param name="bytes">Bytes to be sent</param>
/// <param name="bytes">Bytes to be sent</param> public void SendBytes(byte[] bytes)
public void SendBytes(byte[] bytes) {
{ if (bytes == null) return;
if (bytes == null) return;
_comms.SendBytes(bytes);
_comms.SendBytes(bytes); }
}
/// <summary>
/// <summary> /// Polls the device
/// Polls the device /// </summary>
/// </summary> /// <remarks>
/// <remarks> /// Poll method is used by the communication monitor. Update the poll method as needed for the plugin being developed
/// Poll method is used by the communication monitor. Update the poll method as needed for the plugin being developed /// </remarks>
/// </remarks> public void Poll()
public void Poll() {
{ // TODO [ ] Update Poll method as needed for the plugin being developed
// TODO [ ] Update Poll method as needed for the plugin being developed // Example: SendText("getstatus");
// Example: SendText("getstatus"); throw new System.NotImplementedException();
throw new System.NotImplementedException(); }
}
#endregion
#endregion
#region Overrides of EssentialsBridgeableDevice
#region Overrides of EssentialsBridgeableDevice
/// <summary>
/// <summary> /// Links the plugin device to the EISC bridge
/// Links the plugin device to the EISC bridge /// </summary>
/// </summary> /// <param name="trilist"></param>
/// <param name="trilist"></param> /// <param name="joinStart"></param>
/// <param name="joinStart"></param> /// <param name="joinMapKey"></param>
/// <param name="joinMapKey"></param> /// <param name="bridge"></param>
/// <param name="bridge"></param> public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge)
public override void LinkToApi(BasicTriList trilist, uint joinStart, string joinMapKey, EiscApiAdvanced bridge) {
{ 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 if (bridge != null)
if (bridge != null) {
{ bridge.AddJoinMap(Key, joinMap);
bridge.AddJoinMap(Key, joinMap); }
}
var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey);
var customJoins = JoinMapHelper.TryGetJoinMapAdvancedForDevice(joinMapKey);
if (customJoins != null)
if (customJoins != null) {
{ joinMap.SetCustomJoinData(customJoins);
joinMap.SetCustomJoinData(customJoins); }
}
Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X"));
Debug.Console(1, "Linking to Trilist '{0}'", trilist.ID.ToString("X")); Debug.Console(0, "Linking to Bridge Type {0}", GetType().Name);
Debug.Console(0, "Linking to Bridge Type {0}", GetType().Name);
// TODO [ ] Implement bridge links as needed
// TODO [ ] Implement bridge links as needed
// links to bridge
// links to bridge trilist.SetString(joinMap.DeviceName.JoinNumber, Name);
trilist.SetString(joinMap.DeviceName.JoinNumber, Name);
trilist.SetBoolSigAction(joinMap.Connect.JoinNumber, sig => Connect = sig);
trilist.SetBoolSigAction(joinMap.Connect.JoinNumber, sig => Connect = sig); ConnectFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Connect.JoinNumber]);
ConnectFeedback.LinkInputSig(trilist.BooleanInput[joinMap.Connect.JoinNumber]);
StatusFeedback.LinkInputSig(trilist.UShortInput[joinMap.Status.JoinNumber]);
StatusFeedback.LinkInputSig(trilist.UShortInput[joinMap.Status.JoinNumber]); OnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
OnlineFeedback.LinkInputSig(trilist.BooleanInput[joinMap.IsOnline.JoinNumber]);
UpdateFeedbacks();
UpdateFeedbacks();
trilist.OnlineStatusChange += (o, a) =>
trilist.OnlineStatusChange += (o, a) => {
{ if (!a.DeviceOnLine) return;
if (!a.DeviceOnLine) return;
trilist.SetString(joinMap.DeviceName.JoinNumber, Name);
trilist.SetString(joinMap.DeviceName.JoinNumber, Name); UpdateFeedbacks();
UpdateFeedbacks(); };
}; }
}
private void UpdateFeedbacks()
private void UpdateFeedbacks() {
{ // TODO [ ] Update as needed for the plugin being developed
// TODO [ ] Update as needed for the plugin being developed ConnectFeedback.FireUpdate();
ConnectFeedback.FireUpdate(); OnlineFeedback.FireUpdate();
OnlineFeedback.FireUpdate(); StatusFeedback.FireUpdate();
StatusFeedback.FireUpdate(); }
}
#endregion
#endregion
}
} }
}

View file

@ -1,9 +1,9 @@
using System.Collections.Generic; using System.Collections.Generic;
using PepperDash.Core; using Crestron.SimplSharpPro.UI;
using PepperDash.Essentials.Core; using PepperDash.Core;
using Crestron.SimplSharpPro.UI; using PepperDash.Essentials.Core;
namespace EssentialsPluginTemplate namespace PepperDash.Essentials.Plugin
{ {
/// <summary> /// <summary>
/// Plugin device factory for devices that use IBasicCommunication /// Plugin device factory for devices that use IBasicCommunication

View file

@ -1,9 +1,9 @@
using Crestron.SimplSharpPro.DeviceSupport; using Crestron.SimplSharpPro.DeviceSupport;
using PepperDash.Core; using PepperDash.Core;
using PepperDash.Essentials.Core; using PepperDash.Essentials.Core;
using PepperDash.Essentials.Core.Bridges; using PepperDash.Essentials.Core.Bridges;
namespace EssentialsPluginTemplate namespace PepperDash.Essentials.Plugin
{ {
/// <summary> /// <summary>
/// Plugin device template for logic devices that don't communicate outside the program /// Plugin device template for logic devices that don't communicate outside the program

View file

@ -1,23 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<package >
<metadata>
<id>PDT.EssentialsPluginTemplate</id>
<readme>docs\README.md</readme>
<version>2.0.2</version>
<title>Essentials Plugin Template</title>
<authors>PepperDash Technologies</authors>
<owners>pepperdash</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<license type="expression">MIT</license>
<projectUrl>https://github.com/PepperDash/EssentialsPluginTemplate</projectUrl>
<copyright>Copyright 2022</copyright>
<description>This software iserves as a template for generating new Essentials-Compliant plugins</description>
<tags>crestron 3series 4series essentials pepperdash pepperdashessentials epi essentials plugin</tags>
<repository type="git" url="https://github.com/PepperDash/EssentialsPluginTemplate"/>
</metadata>
<files>
<file src="**" target="lib\net35"/>
<file src="**" target="lib\net47"/>
<file src="README.md" target="docs\"/>
</files>
</package>

View file

@ -1,115 +1,115 @@
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion> <ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{9D249E47-8F95-4437-A6BB-563510287AD1}</ProjectGuid> <ProjectGuid>{9D249E47-8F95-4437-A6BB-563510287AD1}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>PDT.EssentialsPluginTemplate.EPI</RootNamespace> <RootNamespace>PepperDash.Essentials.Plugin</RootNamespace>
<AssemblyName>PDT.EssentialsPluginTemplate.EPI</AssemblyName> <AssemblyName>MakeModelPlugin</AssemblyName>
<ProjectTypeGuids>{0B4745B0-194B-4BB6-8E21-E9057CA92300};{4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> <ProjectTypeGuids>{0B4745B0-194B-4BB6-8E21-E9057CA92300};{4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<PlatformFamilyName>WindowsCE</PlatformFamilyName> <PlatformFamilyName>WindowsCE</PlatformFamilyName>
<PlatformID>E2BECB1F-8C8C-41ba-B736-9BE7D946A398</PlatformID> <PlatformID>E2BECB1F-8C8C-41ba-B736-9BE7D946A398</PlatformID>
<OSVersion>5.0</OSVersion> <OSVersion>5.0</OSVersion>
<DeployDirSuffix>SmartDeviceProject1</DeployDirSuffix> <DeployDirSuffix>SmartDeviceProject1</DeployDirSuffix>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion> <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<NativePlatformName>Windows CE</NativePlatformName> <NativePlatformName>Windows CE</NativePlatformName>
<FormFactorID> <FormFactorID>
</FormFactorID> </FormFactorID>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<AllowedReferenceRelatedFileExtensions>.allowedReferenceRelatedFileExtensions</AllowedReferenceRelatedFileExtensions> <AllowedReferenceRelatedFileExtensions>.allowedReferenceRelatedFileExtensions</AllowedReferenceRelatedFileExtensions>
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath> <OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE;</DefineConstants> <DefineConstants>DEBUG;TRACE;</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<NoStdLib>true</NoStdLib> <NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig> <NoConfig>true</NoConfig>
<GenerateSerializationAssemblies>off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>off</GenerateSerializationAssemblies>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<AllowedReferenceRelatedFileExtensions>.allowedReferenceRelatedFileExtensions</AllowedReferenceRelatedFileExtensions> <AllowedReferenceRelatedFileExtensions>.allowedReferenceRelatedFileExtensions</AllowedReferenceRelatedFileExtensions>
<DebugType>none</DebugType> <DebugType>none</DebugType>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath> <OutputPath>bin\Release\</OutputPath>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<NoStdLib>true</NoStdLib> <NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig> <NoConfig>true</NoConfig>
<GenerateSerializationAssemblies>off</GenerateSerializationAssemblies> <GenerateSerializationAssemblies>off</GenerateSerializationAssemblies>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Crestron.SimplSharpPro.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL"> <Reference Include="Crestron.SimplSharpPro.UI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath> <HintPath>C:\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
</Reference> </Reference>
<Reference Include="Essentials Devices Common, Version=1.6.2.33892, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Essentials Devices Common, Version=1.6.2.33892, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\PepperDashEssentials\lib\net35\Essentials Devices Common.dll</HintPath> <HintPath>..\packages\PepperDashEssentials\lib\net35\Essentials Devices Common.dll</HintPath>
</Reference> </Reference>
<Reference Include="mscorlib" /> <Reference Include="mscorlib" />
<Reference Include="PepperDashEssentials, Version=1.4.19.29953, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="PepperDashEssentials, Version=1.4.19.29953, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\PepperDashEssentials\lib\net35\PepperDashEssentials.dll</HintPath> <HintPath>..\packages\PepperDashEssentials\lib\net35\PepperDashEssentials.dll</HintPath>
</Reference> </Reference>
<Reference Include="PepperDash_Core, Version=1.0.20.28344, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="PepperDash_Core, Version=1.0.20.28344, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\PepperDashEssentials\lib\net35\PepperDash_Core.dll</HintPath> <HintPath>..\packages\PepperDashEssentials\lib\net35\PepperDash_Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="PepperDash_Essentials_Core, Version=1.4.19.29946, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="PepperDash_Essentials_Core, Version=1.4.19.29946, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\PepperDashEssentials\lib\net35\PepperDash_Essentials_Core.dll</HintPath> <HintPath>..\packages\PepperDashEssentials\lib\net35\PepperDash_Essentials_Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="PepperDash_Essentials_DM, Version=1.3.7177.29951, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="PepperDash_Essentials_DM, Version=1.3.7177.29951, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\packages\PepperDashEssentials\lib\net35\PepperDash_Essentials_DM.dll</HintPath> <HintPath>..\packages\PepperDashEssentials\lib\net35\PepperDash_Essentials_DM.dll</HintPath>
</Reference> </Reference>
<Reference Include="SimplSharpCustomAttributesInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL"> <Reference Include="SimplSharpCustomAttributesInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpCustomAttributesInterface.dll</HintPath> <HintPath>C:\ProgramData\Crestron\SDK\SimplSharpCustomAttributesInterface.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="SimplSharpHelperInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL"> <Reference Include="SimplSharpHelperInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpHelperInterface.dll</HintPath> <HintPath>C:\ProgramData\Crestron\SDK\SimplSharpHelperInterface.dll</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="SimplSharpNewtonsoft, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL"> <Reference Include="SimplSharpNewtonsoft, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpNewtonsoft.dll</HintPath> <HintPath>C:\ProgramData\Crestron\SDK\SimplSharpNewtonsoft.dll</HintPath>
</Reference> </Reference>
<Reference Include="SimplSharpPro, Version=1.5.3.17, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL"> <Reference Include="SimplSharpPro, Version=1.5.3.17, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpPro.exe</HintPath> <HintPath>C:\ProgramData\Crestron\SDK\SimplSharpPro.exe</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
<Reference Include="SimplSharpReflectionInterface, Version=1.0.5583.25238, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL"> <Reference Include="SimplSharpReflectionInterface, Version=1.0.5583.25238, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SimplSharpReflectionInterface.dll</HintPath> <HintPath>C:\ProgramData\Crestron\SDK\SimplSharpReflectionInterface.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="EssentialsPluginTemplateLogicDevice.cs" /> <Compile Include="MakeModelCrestronDevice.cs" />
<Compile Include="EssentialsPluginTemplateCrestronDevice.cs" /> <Compile Include="MakeModelBridgeJoinMap.cs" />
<Compile Include="EssentialsPluginTemplateBridgeJoinMap.cs" /> <Compile Include="MakeModelConfigObject.cs" />
<Compile Include="EssentialsPluginTemplateConfigObject.cs" /> <Compile Include="MakeModelDevice.cs" />
<Compile Include="EssentialsPluginTemplateFactory.cs" /> <Compile Include="MakeModelFactory.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="MakeModelLogicDevice.cs" />
<Compile Include="EssentialsPluginTemplateDevice.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<None Include="Properties\ControlSystem.cfg" /> <None Include="Properties\ControlSystem.cfg" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>rem S# Pro preparation will execute after these operations</PostBuildEvent> <PostBuildEvent>rem S# Pro preparation will execute after these operations</PostBuildEvent>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View file

@ -0,0 +1,48 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ProjectType>ProgramLibrary</ProjectType>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net472</TargetFramework>
<RootNamespace>PepperDash.Essentials.Plugin</RootNamespace>
<Deterministic>false</Deterministic>
<AssemblyTitle>PepperDash.Essentials.Plugin.Make.Model</AssemblyTitle>
<Company>PepperDash Technologies</Company>
<Description>This software is a template for a PepperDash Essentials Plugin.</Description>
<Copyright>Copyright 2025</Copyright>
<Version>1.0.0-local</Version>
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
<InformationalVersion>$(Version)</InformationalVersion>
<OutputPath>4Series\bin\$(Configuration)\</OutputPath>
<Authors>PepperDash Technologies</Authors>
<PackageId>Pepperdash.Essentials.Plugins.Template</PackageId>
<PackageProjectUrl>https://github.com/PepperDash/EssentialsPluginTemplate.git</PackageProjectUrl>
<PackageTags>crestron 4series essentials plugin template</PackageTags>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DefineConstants>$(DefineConstants);SERIES4</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Properties\**" />
<EmbeddedResource Remove="Properties\**" />
<None Remove="Properties\**" />
</ItemGroup>
<ItemGroup>
<None Remove="epi-make-model.projectinfo" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="PepperDashEssentials" Version="2.0.0-hotfix-2613" />
</ItemGroup>
<ItemGroup>
<None Remove="../output\epi-make-model.4Series.1.0.0-local.cplz" />
</ItemGroup>
<ItemGroup>
<None Remove="../output\epi-make-model.4Series.1.0.0-local.cplz" />
</ItemGroup>
</Project>