mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-06 08:16:11 +00:00
Compare commits
187 Commits
feature/Ge
...
v1.17.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e92fe5cf2c | ||
|
|
a673122e00 | ||
|
|
4854018d7b | ||
|
|
078f35a91d | ||
|
|
dba07dced8 | ||
|
|
5ad232135c | ||
|
|
3f8e72f366 | ||
|
|
307b2f54a7 | ||
|
|
f73482e8ed | ||
|
|
e5a7641564 | ||
|
|
2b845ce4cb | ||
|
|
1f095e2fb3 | ||
|
|
2a7f491f62 | ||
|
|
2af603013d | ||
|
|
9aa890d404 | ||
|
|
de714f998b | ||
|
|
bcc07fb4cf | ||
|
|
a3651eac76 | ||
|
|
645d9d7098 | ||
|
|
b731f51c5a | ||
|
|
02c2dceedc | ||
|
|
bc1e9b070a | ||
|
|
781faa0431 | ||
|
|
87602c19d7 | ||
|
|
ade5596a18 | ||
|
|
c32ffdc1a8 | ||
|
|
a8285f211d | ||
|
|
6f38f4953e | ||
|
|
8230d95746 | ||
|
|
065726ee72 | ||
|
|
33a31ab931 | ||
|
|
b85377dccf | ||
|
|
e7c5e0566a | ||
|
|
cb2c117588 | ||
|
|
be34808ef0 | ||
|
|
7a4224e52a | ||
|
|
428f9f34bd | ||
|
|
78e49871c6 | ||
|
|
12e81af9e6 | ||
|
|
544a7a2d73 | ||
|
|
1d843c6c89 | ||
|
|
c72db72e7e | ||
|
|
9e588f4da5 | ||
|
|
4c466b425c | ||
|
|
d0aed1c1c5 | ||
|
|
bf966121f9 | ||
|
|
ecadb439b2 | ||
|
|
8c1553a026 | ||
|
|
9755724342 | ||
|
|
4d25c420e5 | ||
|
|
3190dacdf8 | ||
|
|
44add9aac6 | ||
|
|
5bb6405874 | ||
|
|
fed3d7e13a | ||
|
|
af848b9ca4 | ||
|
|
b52c13d8e8 | ||
|
|
26f9118154 | ||
|
|
bba3c347c6 | ||
|
|
be96adcc06 | ||
|
|
b245016420 | ||
|
|
19f2c6aa79 | ||
|
|
533ca05ac2 | ||
|
|
9c7777fbaa | ||
|
|
5530c91b75 | ||
|
|
67e0378806 | ||
|
|
1c5aca03d2 | ||
|
|
6f5fa2c3b8 | ||
|
|
3d760cbedc | ||
|
|
d713abf614 | ||
|
|
a64b5240ad | ||
|
|
c528fecb9a | ||
|
|
355e9cde12 | ||
|
|
1df8d3f617 | ||
|
|
2f1caff815 | ||
|
|
4da2f25c3d | ||
|
|
552a315ac0 | ||
|
|
99c35f14e1 | ||
|
|
5f2b916220 | ||
|
|
c7a16a46e9 | ||
|
|
d6334538c0 | ||
|
|
4f64022623 | ||
|
|
7ad638ea9a | ||
|
|
51d168b1d5 | ||
|
|
3179f3bf59 | ||
|
|
eba27d016d | ||
|
|
e5fe16122f | ||
|
|
ee9b191f85 | ||
|
|
d1d1d81165 | ||
|
|
6698dcb46e | ||
|
|
c8aa77fbc0 | ||
|
|
53b96d54e6 | ||
|
|
6c41b8e19d | ||
|
|
922119fdd6 | ||
|
|
86c1faa7cd | ||
|
|
75895604ed | ||
|
|
de6f8c7896 | ||
|
|
5a5e24a921 | ||
|
|
8b3bc523d2 | ||
|
|
ff04d49a1b | ||
|
|
55af6a96f6 | ||
|
|
a3561bc89b | ||
|
|
1a123ab6dc | ||
|
|
c0b0b35f6d | ||
|
|
1d60f2e069 | ||
|
|
bd97676050 | ||
|
|
8612fab4fe | ||
|
|
b9fd9f23a4 | ||
|
|
1e07e44279 | ||
|
|
1569c12450 | ||
|
|
6d020132cf | ||
|
|
7ecb2ecf6d | ||
|
|
393033b6c9 | ||
|
|
9fb16f30b0 | ||
|
|
8b6a9db7e0 | ||
|
|
5a67a4060d | ||
|
|
0fad667fab | ||
|
|
95c37872ad | ||
|
|
a5ad7ea48b | ||
|
|
14221f9613 | ||
|
|
334a62c329 | ||
|
|
e590c7cedb | ||
|
|
189c470603 | ||
|
|
4deee11d15 | ||
|
|
4bdac8d9e9 | ||
|
|
58e019992a | ||
|
|
da5d2d74f2 | ||
|
|
2afa9df705 | ||
|
|
1aa9590587 | ||
|
|
27bac4e83d | ||
|
|
4e33743f50 | ||
|
|
08af6370a6 | ||
|
|
97c0bddb48 | ||
|
|
316d545bda | ||
|
|
13df52ab49 | ||
|
|
527457baf5 | ||
|
|
d74c5de651 | ||
|
|
b06d0c0deb | ||
|
|
759fb1d729 | ||
|
|
3defd6b41b | ||
|
|
794cd3be5f | ||
|
|
68cbbee6a3 | ||
|
|
a50d758f70 | ||
|
|
aedac14feb | ||
|
|
93134cae5c | ||
|
|
555915b151 | ||
|
|
fa0f006b9b | ||
|
|
4c0fb6311b | ||
|
|
6538cecc3b | ||
|
|
44296cbc54 | ||
|
|
0dcf45fc84 | ||
|
|
4d2ce83e75 | ||
|
|
da4070bad0 | ||
|
|
d95692ba96 | ||
|
|
daf3f321bd | ||
|
|
269d82227d | ||
|
|
e8f20a4ca3 | ||
|
|
5fbacadd7f | ||
|
|
9c9b2952aa | ||
|
|
a7a4b75382 | ||
|
|
8d0f0c0c37 | ||
|
|
2b97b9bdc4 | ||
|
|
77f5dafdfe | ||
|
|
b5bf87c634 | ||
|
|
62f175c24a | ||
|
|
0cfcf61d6b | ||
|
|
4a0bacb27e | ||
|
|
a36901894d | ||
|
|
c047507997 | ||
|
|
ef719b0a64 | ||
|
|
c46409dc3f | ||
|
|
f73d6994b8 | ||
|
|
a787be6ccc | ||
|
|
f0ae0094dc | ||
|
|
fcd4b5d772 | ||
|
|
c3ba6d5c28 | ||
|
|
3f6b2f05a2 | ||
|
|
cab0b01a08 | ||
|
|
f4af1b6e7c | ||
|
|
a04bfd1fcb | ||
|
|
faaf8151df | ||
|
|
0ee6322684 | ||
|
|
c614347f29 | ||
|
|
43f06d2167 | ||
|
|
2ffe24fd93 | ||
|
|
515ffd07f0 | ||
|
|
16ea7a88be | ||
|
|
0f3b0580f0 |
21
.github/workflows/EssentialsPlugins-builds-3-series-caller.yml
vendored
Normal file
21
.github/workflows/EssentialsPlugins-builds-3-series-caller.yml
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
name: Build Essentials 1.X
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '**'
|
||||
|
||||
jobs:
|
||||
getVersion:
|
||||
uses: PepperDash/workflow-templates/.github/workflows/essentialsplugins-getversion.yml@main
|
||||
secrets: inherit
|
||||
build-3Series:
|
||||
uses: PepperDash/workflow-templates/.github/workflows/essentials-3Series-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 }}
|
||||
141
.github/workflows/docker.yml
vendored
141
.github/workflows/docker.yml
vendored
@@ -1,141 +0,0 @@
|
||||
name: Branch Build Using Docker
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- feature/*
|
||||
- hotfix/*
|
||||
- bugfix/*
|
||||
- release/*
|
||||
- development
|
||||
|
||||
env:
|
||||
# solution path doesn't need slashes unless it is multiple folders deep
|
||||
# solution name does not include extension. .sln is assumed
|
||||
SOLUTION_PATH: PepperDashEssentials
|
||||
SOLUTION_FILE: PepperDashEssentials
|
||||
# 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-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: |
|
||||
$version = ./.github/scripts/GenerateVersionNumber.ps1
|
||||
echo "VERSION=$version" | 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: |
|
||||
./.github/scripts/UpdateAssemblyVersion.ps1 ${{ env.VERSION }}
|
||||
- name: restore Nuget Packages
|
||||
run: nuget install .\packages.config -OutputDirectory .\packages -ExcludeVersion
|
||||
# Login to Docker
|
||||
- name: Login to Docker
|
||||
uses: azure/docker-login@v1
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_TOKEN }}
|
||||
# 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_FILE).sln"" -BuildSolutionConfiguration $($ENV:BUILD_TYPE)"
|
||||
# Zip up the output files as needed
|
||||
- name: Zip Build Output
|
||||
shell: powershell
|
||||
run: ./.github/scripts/ZipBuildOutput.ps1
|
||||
# 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 the build output as an artifact
|
||||
- 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
|
||||
- name: Create Release
|
||||
id: create_release
|
||||
# using contributor's version to allow for pointing at the right commit
|
||||
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
|
||||
steps:
|
||||
- name: Download Build Version Info
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: Version
|
||||
- name: Set Version Number
|
||||
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
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: Build
|
||||
path: ./
|
||||
- name: Unzip Build file
|
||||
run: |
|
||||
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
|
||||
Remove-Item -Path .\*.zip
|
||||
- name: Copy Files to root & delete output directory
|
||||
run: |
|
||||
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
|
||||
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
|
||||
Remove-Item -Path .\output -Recurse
|
||||
- name: Add nuget.exe
|
||||
uses: nuget/setup-nuget@v1
|
||||
- name: Add Github Packages source
|
||||
run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash/index.json -username Pepperdash -password ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Add nuget.org API Key
|
||||
run: nuget setApiKey ${{ secrets.NUGET_API_KEY }}
|
||||
- name: Create nuget package
|
||||
run: nuget pack "./PepperDash_Essentials_Core.nuspec" -version ${{ env.VERSION }}
|
||||
- name: Publish nuget package to Github registry
|
||||
run: nuget push **/*.nupkg -source github
|
||||
- name: Publish nuget package to nuget.org
|
||||
run: nuget push **/*.nupkg -Source https://api.nuget.org/v3/index.json
|
||||
125
.github/workflows/main.yml
vendored
125
.github/workflows/main.yml
vendored
@@ -1,125 +0,0 @@
|
||||
name: main Build using Docker
|
||||
|
||||
on:
|
||||
release:
|
||||
types:
|
||||
- created
|
||||
branches:
|
||||
- main
|
||||
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: PepperDashEssentials
|
||||
SOLUTION_FILE: PepperDashEssentials
|
||||
# Do not edit this, we're just creating it here
|
||||
VERSION: 0.0.0-buildtype-buildnumber
|
||||
# Defaults to debug for build type
|
||||
BUILD_TYPE: Release
|
||||
# Defaults to main 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
|
||||
# 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: |
|
||||
./.github/scripts/UpdateAssemblyVersion.ps1 ${{ env.VERSION }}
|
||||
- name: restore Nuget Packages
|
||||
run: nuget install .\packages.config -OutputDirectory .\packages -ExcludeVersion
|
||||
# Login to Docker
|
||||
- name: Login to Docker
|
||||
uses: azure/docker-login@v1
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_TOKEN }}
|
||||
# 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_FILE).sln"" -BuildSolutionConfiguration $($ENV:BUILD_TYPE)"
|
||||
# Zip up the output files as needed
|
||||
- name: Zip Build Output
|
||||
shell: powershell
|
||||
run: ./.github/scripts/ZipBuildOutput.ps1
|
||||
# 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 the build output as an artifact
|
||||
- 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
|
||||
steps:
|
||||
- name: Download Build Version Info
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: Version
|
||||
- name: Set Version Number
|
||||
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
|
||||
uses: actions/download-artifact@v1
|
||||
with:
|
||||
name: Build
|
||||
path: ./
|
||||
- name: Unzip Build file
|
||||
run: |
|
||||
Get-ChildItem .\*.zip | Expand-Archive -DestinationPath .\
|
||||
Remove-Item -Path .\*.zip
|
||||
- name: Copy Files to root & delete output directory
|
||||
run: |
|
||||
Remove-Item -Path .\* -Include @("*.cpz","*.md","*.cplz","*.json","*.dll","*.clz")
|
||||
Get-ChildItem -Path .\output\* | Copy-Item -Destination .\
|
||||
Remove-Item -Path .\output -Recurse
|
||||
- name: Add nuget.exe
|
||||
uses: nuget/setup-nuget@v1
|
||||
- name: Add Github Packages source
|
||||
run: nuget sources add -name github -source https://nuget.pkg.github.com/pepperdash/index.json -username Pepperdash -password ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Add nuget.org API Key
|
||||
run: nuget setApiKey ${{ secrets.NUGET_API_KEY }}
|
||||
- name: Create nuget package
|
||||
run: nuget pack "./PepperDash_Essentials_Core.nuspec" -version ${{ env.VERSION }}
|
||||
- name: Publish nuget package to Github registry
|
||||
run: nuget push **/*.nupkg -source github
|
||||
- name: Publish nuget package to nuget.org
|
||||
run: nuget push **/*.nupkg -Source https://api.nuget.org/v3/index.json
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -389,3 +389,4 @@ MigrationBackup/
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
essentials-framework/Essentials Interfaces/PepperDash_Essentials_Interfaces/PepperDash_Essentials_Interfaces.csproj
|
||||
.DS_Store
|
||||
|
||||
34
.releaserc.json
Normal file
34
.releaserc.json
Normal 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": [
|
||||
"maintenance-1x",
|
||||
{
|
||||
"name": "replace-me-feature-branch",
|
||||
"prerelease": "replace-me-prerelease",
|
||||
"channel": "replace-me-prerelease"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -91,8 +91,8 @@ we receive and the availability of resources to evaluate contributions, we antic
|
||||
project remains dynamic and relevant. This may affect our responsiveness and ability to accept pull requests
|
||||
quickly. This does not mean we are ignoring them.
|
||||
- Not all innovative ideas need to be accepted as pull requests into this GitHub project to be valuable to the community.
|
||||
There may be times when we recommend that you just share your code for some enhancement to Ghidra from your own
|
||||
repository. As we identify and recognize extensions that are of general interest to the reverse engineering community, we
|
||||
There may be times when we recommend that you just share your code for some enhancement to Essentials from your own
|
||||
repository. As we identify and recognize extensions that are of general interest to Essentials, we
|
||||
may seek to incorporate them with our baseline.
|
||||
|
||||
## Legal
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||
# Visual Studio 2008
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDashEssentials", "PepperDashEssentials\PepperDashEssentials.csproj", "{1BED5BA9-88C4-4365-9362-6F4B128071D3}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDashEssentials", "src\PepperDashEssentials\PepperDashEssentials.csproj", "{1BED5BA9-88C4-4365-9362-6F4B128071D3}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{892B761C-E479-44CE-BD74-243E9214AF13} = {892B761C-E479-44CE-BD74-243E9214AF13}
|
||||
{9199CE8A-0C9F-4952-8672-3EED798B284F} = {9199CE8A-0C9F-4952-8672-3EED798B284F}
|
||||
{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5} = {A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash_Essentials_Core", "essentials-framework\Essentials Core\PepperDashEssentialsBase\PepperDash_Essentials_Core.csproj", "{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash_Essentials_Core", "src\essentials-framework\Essentials Core\PepperDashEssentialsBase\PepperDash_Essentials_Core.csproj", "{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials Devices Common", "essentials-framework\Essentials Devices Common\Essentials Devices Common\Essentials Devices Common.csproj", "{892B761C-E479-44CE-BD74-243E9214AF13}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Essentials Devices Common", "src\essentials-framework\Essentials Devices Common\Essentials Devices Common\Essentials Devices Common.csproj", "{892B761C-E479-44CE-BD74-243E9214AF13}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5} = {A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash_Essentials_DM", "essentials-framework\Essentials DM\Essentials_DM\PepperDash_Essentials_DM.csproj", "{9199CE8A-0C9F-4952-8672-3EED798B284F}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PepperDash_Essentials_DM", "src\essentials-framework\Essentials DM\Essentials_DM\PepperDash_Essentials_DM.csproj", "{9199CE8A-0C9F-4952-8672-3EED798B284F}"
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5} = {A49AD6C8-FC0A-4CC0-9089-DFB4CF92D2B5}
|
||||
EndProjectSection
|
||||
@@ -1,274 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using Crestron.SimplSharp.Net.Http;
|
||||
using Crestron.SimplSharp.Ssh;
|
||||
using Crestron.SimplSharpPro.EthernetCommunication;
|
||||
using PepperDash.Core;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
public class GenericHttpClient : Device, IBasicCommunication
|
||||
{
|
||||
public HttpClient Client;
|
||||
public event EventHandler<GenericHttpClientEventArgs> ResponseRecived;
|
||||
|
||||
public GenericHttpClient(string key, string name, string hostname)
|
||||
: base(key, name)
|
||||
{
|
||||
Client = new HttpClient {HostName = hostname};
|
||||
}
|
||||
|
||||
public GenericHttpClient(string key, string name, string hostname, GenericHttpClientConnectionOptions options)
|
||||
: base(key, name)
|
||||
{
|
||||
Client = new HttpClient
|
||||
{
|
||||
HostName = hostname,
|
||||
Accept = options.Accept,
|
||||
KeepAlive = options.KeepAlive,
|
||||
Password = options.Password,
|
||||
Timeout = options.Timeout,
|
||||
TimeoutEnabled = options.TimeoutEnabled,
|
||||
UserAgent = options.UserAgent,
|
||||
UserName = options.UserName,
|
||||
Version = options.Version
|
||||
};
|
||||
if (options.Port > 0) Client.Port = options.Port;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send a HTTP Get Request to a client
|
||||
/// </summary>
|
||||
/// <param name="path">Path to request node</param>
|
||||
public void SendText(string path)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, path);
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url)
|
||||
};
|
||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send a HTTP Get Request to a client using a formatted string
|
||||
/// </summary>
|
||||
/// <param name="format">Path</param>
|
||||
/// <param name="items">Parameters for Path String Formatting</param>
|
||||
public void SendText(string format, params object[] items)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url)
|
||||
};
|
||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send a unidirectional HTTP Get Request to a client using a formatted string
|
||||
/// </summary>
|
||||
/// <param name="format">Path</param>
|
||||
/// <param name="items">Parameters for Path String Formatting</param>
|
||||
public void SendTextNoResponse(string format, params object[] items)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url)
|
||||
};
|
||||
Client.Dispatch(request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send an HTTP Request of a specific request type
|
||||
/// </summary>
|
||||
/// <param name="requestType">HTTP Request Type</param>
|
||||
/// <param name="path">Path to request node</param>
|
||||
public void SendText(RequestType requestType, string path)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, path);
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url),
|
||||
RequestType = requestType
|
||||
};
|
||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send an HTTP Request of a specific request type using a formatted string
|
||||
/// </summary>
|
||||
/// <param name="requestType">HTTP Request Type</param>
|
||||
/// <param name="format">Path</param>
|
||||
/// <param name="items">Parameters for Path String Formatting</param>
|
||||
public void SendText(RequestType requestType, string format, params object[] items)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url),
|
||||
RequestType = requestType
|
||||
};
|
||||
var error = Client.DispatchAsyncEx(request, Response, request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Send a unidirectional HTTP Request of a specific request type using a formatted string
|
||||
/// </summary>
|
||||
/// <param name="requestType">HTTP Request Type</param>
|
||||
/// <param name="format">Path</param>
|
||||
/// <param name="items">Parameters for Path String Formatting</param>
|
||||
public void SendTextNoResponse(RequestType requestType, string format, params object[] items)
|
||||
{
|
||||
var url = string.Format("http://{0}/{1}", Client.HostName, string.Format(format, items));
|
||||
var request = new HttpClientRequest()
|
||||
{
|
||||
Url = new UrlParser(url)
|
||||
};
|
||||
Client.Dispatch(request);
|
||||
}
|
||||
|
||||
private void Response(HttpClientResponse response, HTTP_CALLBACK_ERROR error, object request)
|
||||
{
|
||||
if (error != HTTP_CALLBACK_ERROR.COMPLETED) return;
|
||||
var responseReceived = response;
|
||||
|
||||
if (responseReceived.ContentString.Length <= 0) return;
|
||||
if (ResponseRecived == null) return;
|
||||
var httpClientRequest = request as HttpClientRequest;
|
||||
if (httpClientRequest != null)
|
||||
ResponseRecived(this, new GenericHttpClientEventArgs(responseReceived.ContentString, httpClientRequest.Url.ToString(), error));
|
||||
}
|
||||
|
||||
|
||||
#region IBasicCommunication Members
|
||||
|
||||
public void SendBytes(byte[] bytes)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region ICommunicationReceiver Members
|
||||
|
||||
public event EventHandler<GenericCommMethodReceiveBytesArgs> BytesReceived;
|
||||
|
||||
public void Connect()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void Disconnect()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public bool IsConnected
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
public event EventHandler<GenericCommMethodReceiveTextArgs> TextReceived;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
public class GenericHttpClientEventArgs : EventArgs
|
||||
{
|
||||
public string ResponseText { get; private set; }
|
||||
public string RequestPath { get; private set; }
|
||||
public HTTP_CALLBACK_ERROR Error { get; set; }
|
||||
public GenericHttpClientEventArgs(string response, string request, HTTP_CALLBACK_ERROR error)
|
||||
{
|
||||
ResponseText = response;
|
||||
RequestPath = request;
|
||||
Error = error;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Objedct to set parameters for HTTP Requests
|
||||
/// </summary>
|
||||
public class GenericHttpClientConnectionOptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets content types that are acceptable for the response. The default
|
||||
/// value is "text/html, image/gif, image/jpeg, image/png, */*".
|
||||
/// </summary>
|
||||
[DefaultValue("text/html, image/gif, image/jpeg, image/png")]
|
||||
public string Accept { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Controls whether to use HTTP Keep-Alive to keep the connection alive between
|
||||
/// requests. If enabled (true) , once a request is made and a connection is
|
||||
/// established, this connection is kept open and used for future requests. If
|
||||
/// disabled, the connection is closed, and a new connection is created for future
|
||||
/// requests.
|
||||
/// </summary>
|
||||
[DefaultValue(true)]
|
||||
public bool KeepAlive { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// This property controls whether the request operation will do an automatic
|
||||
/// timeout checking. If timeout handling is turned on (i.e. this property is
|
||||
/// set to true) and a request takes longer than Timeout, it will be terminated.
|
||||
/// </summary>
|
||||
[DefaultValue(true)]
|
||||
public bool TimeoutEnabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the maximum amount of time (in seconds) that a client will wait
|
||||
/// for a server response within a single request. The default value is 60 seconds
|
||||
/// (1 minute). The timeout handling can be activated via the TimeoutEnabled
|
||||
/// property.
|
||||
/// </summary>
|
||||
[DefaultValue(60)]
|
||||
public int Timeout { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the version identifier of the UserAgent. Can be used to mimic
|
||||
/// particular browsers like Internet Explorer 6.0
|
||||
/// </summary>
|
||||
[DefaultValue("1.1")]
|
||||
public string Version { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the identifier of the software being used to retrieve data via
|
||||
/// the URL. Some custom HTTP servers check this HTTP header to provide content
|
||||
/// optimized for particular HTTP browsers.
|
||||
/// </summary>
|
||||
[DefaultValue("Crestron SimplSharp HTTP Client")]
|
||||
public string UserAgent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Name that will be inserted into the Authorization HTTP header in the request
|
||||
/// to the server.
|
||||
/// </summary>
|
||||
public string UserName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Password that will be inserted into the Authorization HTTP header in the
|
||||
/// request to the server.
|
||||
/// </summary>
|
||||
public string Password { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The server Port that you intend the client to connect to. If you do not
|
||||
/// assign a port number on this property, the port number in the parsed URL
|
||||
/// will be used. If a port number is assigned in the parsed URL, it will take
|
||||
/// precedence over this property.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// If you do not assign a port number on this property, the port number in the
|
||||
/// parsed URL will be used.
|
||||
/// </remarks>
|
||||
///
|
||||
public int Port { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
namespace PepperDash.Essentials.Core
|
||||
{
|
||||
public static class StringExtensions
|
||||
{
|
||||
public static string NullIfEmpty(this string s)
|
||||
{
|
||||
return string.IsNullOrEmpty(s) ? null : s;
|
||||
}
|
||||
public static string NullIfWhiteSpace(this string s)
|
||||
{
|
||||
return string.IsNullOrEmpty(s.Trim()) ? null : s;
|
||||
}
|
||||
public static string ReplaceIfNullOrEmpty(this string s, string newString)
|
||||
{
|
||||
return string.IsNullOrEmpty(s) ? newString : s;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,144 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharpPro;
|
||||
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Essentials.Core;
|
||||
|
||||
namespace PepperDash.Essentials.Core.Touchpanels
|
||||
{
|
||||
/// <summary>
|
||||
/// A wrapper class for the touchpanel portion of an MPC3 class process to allow for configurable
|
||||
/// behavior of the keybad buttons
|
||||
/// </summary>
|
||||
public class Mpc3TouchpanelController : Device
|
||||
{
|
||||
MPC3Basic _Touchpanel;
|
||||
|
||||
Dictionary<string, KeypadButton> _Buttons;
|
||||
|
||||
public Mpc3TouchpanelController(string key, string name, CrestronControlSystem processor, Dictionary<string, KeypadButton> buttons)
|
||||
: base(key, name)
|
||||
{
|
||||
_Touchpanel = processor.ControllerTouchScreenSlotDevice as MPC3Basic;
|
||||
_Buttons = buttons;
|
||||
|
||||
_Touchpanel.ButtonStateChange += new Crestron.SimplSharpPro.DeviceSupport.ButtonEventHandler(_Touchpanel_ButtonStateChange);
|
||||
|
||||
AddPostActivationAction(() =>
|
||||
{
|
||||
// Link up the button feedbacks to the specified BoolFeedbacks
|
||||
foreach (var button in _Buttons)
|
||||
{
|
||||
var feedbackConfig = button.Value.Feedback;
|
||||
var device = DeviceManager.GetDeviceForKey(feedbackConfig.DeviceKey) as Device;
|
||||
if (device != null)
|
||||
{
|
||||
var bKey = button.Key.ToLower();
|
||||
|
||||
var feedback = device.GetFeedbackProperty(feedbackConfig.FeedbackName);
|
||||
|
||||
var bFeedback = feedback as BoolFeedback;
|
||||
var iFeedback = feedback as IntFeedback;
|
||||
if (bFeedback != null)
|
||||
{
|
||||
|
||||
if (bKey == "power")
|
||||
{
|
||||
bFeedback.LinkCrestronFeedback(_Touchpanel.FeedbackPower);
|
||||
continue;
|
||||
}
|
||||
else if (bKey == "mute")
|
||||
{
|
||||
bFeedback.LinkCrestronFeedback(_Touchpanel.FeedbackMute);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Link to the Crestron Feedback corresponding to the button number
|
||||
bFeedback.LinkCrestronFeedback(_Touchpanel.Feedbacks[UInt16.Parse(button.Key)]);
|
||||
}
|
||||
else if (iFeedback != null)
|
||||
{
|
||||
if (bKey == "volumefeedback")
|
||||
{
|
||||
var volFeedback = feedback as IntFeedback;
|
||||
// TODO: Figure out how to subsribe to a volume IntFeedback and link it to the voluem
|
||||
volFeedback.LinkInputSig(_Touchpanel.VolumeBargraph);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(1, this, "Unable to get BoolFeedback with name: {0} from device: {1}", feedbackConfig.FeedbackName, device.Key);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(1, this, "Unable to get device with key: {0}", feedbackConfig.DeviceKey);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void _Touchpanel_ButtonStateChange(GenericBase device, Crestron.SimplSharpPro.DeviceSupport.ButtonEventArgs args)
|
||||
{
|
||||
Debug.Console(1, this, "Button {0} ({1}), {2}", args.Button.Number, args.Button.Name, args.NewButtonState);
|
||||
var type = args.NewButtonState.ToString();
|
||||
|
||||
if (_Buttons.ContainsKey(args.Button.Number.ToString()))
|
||||
{
|
||||
Press(args.Button.Number.ToString(), type);
|
||||
}
|
||||
else if(_Buttons.ContainsKey(args.Button.Name.ToString()))
|
||||
{
|
||||
Press(args.Button.Name.ToString(), type);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Runs the function associated with this button/type. One of the following strings:
|
||||
/// Pressed, Released, Tapped, DoubleTapped, Held, HeldReleased
|
||||
/// </summary>
|
||||
/// <param name="number"></param>
|
||||
/// <param name="type"></param>
|
||||
public void Press(string number, string type)
|
||||
{
|
||||
// TODO: In future, consider modifying this to generate actions at device activation time
|
||||
// to prevent the need to dynamically call the method via reflection on each button press
|
||||
if (!_Buttons.ContainsKey(number)) { return; }
|
||||
var but = _Buttons[number];
|
||||
if (but.EventTypes.ContainsKey(type))
|
||||
{
|
||||
foreach (var a in but.EventTypes[type]) { DeviceJsonApi.DoDeviceAction(a); }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Represents the configuration of a keybad buggon
|
||||
/// </summary>
|
||||
public class KeypadButton
|
||||
{
|
||||
public Dictionary<string, DeviceActionWrapper[]> EventTypes { get; set; }
|
||||
public KeypadButtonFeedback Feedback { get; set; }
|
||||
|
||||
public KeypadButton()
|
||||
{
|
||||
EventTypes = new Dictionary<string, DeviceActionWrapper[]>();
|
||||
Feedback = new KeypadButtonFeedback();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class KeypadButtonFeedback
|
||||
{
|
||||
public string DeviceKey { get; set; }
|
||||
public string FeedbackName { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,3 +1,3 @@
|
||||
<packages>
|
||||
<package id="PepperDashCore" version="1.2.1" targetFramework="net35" allowedVersions="[1.0,2.0)"/>
|
||||
<package id="PepperDashCore" version="1.4.2" targetFramework="net35" allowedVersions="[1.0,2.0)"/>
|
||||
</packages>
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace PepperDash.Essentials.Bridges
|
||||
catch (NullReferenceException)
|
||||
{
|
||||
Debug.ConsoleWithLog(0, this,
|
||||
"Please update the bridge config to use EiscBridgeAdvanced with this device: {0}", device.Key);
|
||||
"Please update the bridge config to use eiscApiAdvanced with this device: {0}", device.Key);
|
||||
}
|
||||
}
|
||||
Debug.Console(1, this, "Devices Linked.");
|
||||
@@ -401,20 +401,21 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
else if (this.ControllerPrompt.IndexOf("mpc3", StringComparison.OrdinalIgnoreCase) > -1)
|
||||
{
|
||||
Debug.Console(2, "MPC3 processor type detected. Adding Mpc3TouchpanelController.");
|
||||
Debug.Console(2, "MPC3 processor type detected. Adding Mpc3TouchpanelController.");
|
||||
|
||||
var butToken = devConf.Properties["buttons"];
|
||||
if (butToken != null)
|
||||
{
|
||||
var buttons = butToken.ToObject<Dictionary<string, Essentials.Core.Touchpanels.KeypadButton>>();
|
||||
var tpController = new Essentials.Core.Touchpanels.Mpc3TouchpanelController(devConf.Key, devConf.Name, Global.ControlSystem, buttons);
|
||||
DeviceManager.AddDevice(tpController);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(0, Debug.ErrorLogLevel.Error, "Error: Unable to deserialize buttons collection for device: {0}", devConf.Key);
|
||||
}
|
||||
var butToken = devConf.Properties["buttons"];
|
||||
if (butToken == null)
|
||||
{
|
||||
Debug.Console(0, Debug.ErrorLogLevel.Error,
|
||||
"Error: Unable to deserialize buttons collection for device: {0}", devConf.Key);
|
||||
continue;
|
||||
}
|
||||
|
||||
var buttons = butToken.ToObject<Dictionary<string, Essentials.Core.Touchpanels.KeypadButton>>();
|
||||
var tpController = new Core.Touchpanels.Mpc3TouchpanelController(
|
||||
string.Format("{0}-keypadButtons", devConf.Key), devConf.Name, Global.ControlSystem, buttons);
|
||||
|
||||
DeviceManager.AddDevice(tpController);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -71,9 +71,9 @@
|
||||
<HintPath>..\..\..\..\..\..\..\..\ProgramData\Crestron\SDK\SSPDevices\Crestron.SimplSharpPro.UI.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="mscorlib" />
|
||||
<Reference Include="PepperDash_Core, Version=1.0.42.30563, Culture=neutral, processorArchitecture=MSIL">
|
||||
<Reference Include="PepperDash_Core, Version=1.3.3.32940, Culture=neutral, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
|
||||
<HintPath>..\..\packages\PepperDashCore\lib\net35\PepperDash_Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="SimplSharpCustomAttributesInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1099c178b3b54c3b, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
@@ -226,7 +226,182 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
}
|
||||
|
||||
void Initialize()
|
||||
public override void Initialize()
|
||||
{
|
||||
try
|
||||
{
|
||||
//if (DefaultAudioDevice is IBasicVolumeControls)
|
||||
// DefaultVolumeControls = DefaultAudioDevice as IBasicVolumeControls;
|
||||
//else if (DefaultAudioDevice is IHasVolumeDevice)
|
||||
// DefaultVolumeControls = (DefaultAudioDevice as IHasVolumeDevice).VolumeDevice;
|
||||
//CurrentVolumeControls = DefaultVolumeControls;
|
||||
|
||||
|
||||
//// Combines call feedback from both codecs if available
|
||||
//InCallFeedback = new BoolFeedback(() =>
|
||||
//{
|
||||
// bool inAudioCall = false;
|
||||
// bool inVideoCall = false;
|
||||
|
||||
// if (AudioCodec != null)
|
||||
// inAudioCall = AudioCodec.IsInCall;
|
||||
|
||||
// if (VideoCodec != null)
|
||||
// inVideoCall = VideoCodec.IsInCall;
|
||||
|
||||
// if (inAudioCall || inVideoCall)
|
||||
// return true;
|
||||
// else
|
||||
// return false;
|
||||
//});
|
||||
|
||||
//SetupDisplays();
|
||||
|
||||
//// Get Microphone Privacy object, if any MUST HAPPEN AFTER setting InCallFeedback
|
||||
//this.MicrophonePrivacy = EssentialsRoomConfigHelper.GetMicrophonePrivacy(PropertiesConfig, this);
|
||||
|
||||
//Debug.Console(2, this, "Microphone Privacy Config evaluated.");
|
||||
|
||||
//// Get emergency object, if any
|
||||
//this.Emergency = EssentialsRoomConfigHelper.GetEmergency(PropertiesConfig, this);
|
||||
|
||||
//Debug.Console(2, this, "Emergency Config evaluated.");
|
||||
|
||||
|
||||
//VideoCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
||||
//VideoCodec.IsReadyChange += (o, a) => { this.SetCodecExternalSources(); SetCodecBranding(); };
|
||||
|
||||
//if (AudioCodec != null)
|
||||
// AudioCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
||||
|
||||
//IsSharingFeedback = new BoolFeedback(() => VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
||||
//VideoCodec.SharingContentIsOnFeedback.OutputChange += (o, a) => this.IsSharingFeedback.FireUpdate();
|
||||
|
||||
//// link privacy to VC (for now?)
|
||||
//PrivacyModeIsOnFeedback = new BoolFeedback(() => VideoCodec.PrivacyModeIsOnFeedback.BoolValue);
|
||||
//VideoCodec.PrivacyModeIsOnFeedback.OutputChange += (o, a) => this.PrivacyModeIsOnFeedback.FireUpdate();
|
||||
|
||||
//CallTypeFeedback = new IntFeedback(() => 0);
|
||||
|
||||
SetSourceListKey();
|
||||
|
||||
//EnablePowerOnToLastSource = true;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(0, this, "Error Initializing Room: {0}", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupDisplays()
|
||||
{
|
||||
//DefaultDisplay = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultDisplayKey) as IRoutingSinkWithSwitching;
|
||||
|
||||
var destinationList = ConfigReader.ConfigObject.DestinationLists[PropertiesConfig.DestinationListKey];
|
||||
|
||||
Displays.Clear();
|
||||
|
||||
foreach (var destination in destinationList)
|
||||
{
|
||||
var dest = destination.Value.SinkDevice as IRoutingSinkWithSwitching;
|
||||
|
||||
if (dest != null)
|
||||
{
|
||||
Displays.Add(dest);
|
||||
}
|
||||
|
||||
var display = dest as DisplayBase;
|
||||
if (display != null)
|
||||
{
|
||||
// Link power, warming, cooling to display
|
||||
var dispTwoWay = display as IHasPowerControlWithFeedback;
|
||||
if (dispTwoWay != null)
|
||||
{
|
||||
dispTwoWay.PowerIsOnFeedback.OutputChange -= PowerIsOnFeedback_OutputChange;
|
||||
dispTwoWay.PowerIsOnFeedback.OutputChange += PowerIsOnFeedback_OutputChange;
|
||||
|
||||
if (dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||
{
|
||||
SetDefaultLevels();
|
||||
}
|
||||
}
|
||||
|
||||
display.IsWarmingUpFeedback.OutputChange -= IsWarmingUpFeedback_OutputChange;
|
||||
display.IsWarmingUpFeedback.OutputChange += IsWarmingUpFeedback_OutputChange;
|
||||
|
||||
display.IsCoolingDownFeedback.OutputChange -= IsCoolingDownFeedback_OutputChange;
|
||||
display.IsCoolingDownFeedback.OutputChange += IsCoolingDownFeedback_OutputChange;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void IsCoolingDownFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
IsCoolingDownFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
void IsWarmingUpFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
IsWarmingUpFeedback.FireUpdate();
|
||||
if (!IsWarmingUpFeedback.BoolValue)
|
||||
(CurrentVolumeControls as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
|
||||
}
|
||||
|
||||
void PowerIsOnFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
var dispTwoWay = sender as IHasPowerControlWithFeedback;
|
||||
|
||||
if (dispTwoWay != null && dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
||||
{
|
||||
//if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||
// CurrentSourceInfo = null;
|
||||
OnFeedback.FireUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private void SetSourceListKey()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey))
|
||||
{
|
||||
SetSourceListKey(PropertiesConfig.SourceListKey);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSourceListKey(Key);
|
||||
}
|
||||
|
||||
SetUpVideoCodec();
|
||||
}
|
||||
|
||||
protected override void CustomSetConfig(DeviceConfig config)
|
||||
{
|
||||
var newPropertiesConfig = JsonConvert.DeserializeObject<EssentialsHuddleVtc1PropertiesConfig>(config.Properties.ToString());
|
||||
|
||||
if (newPropertiesConfig != null)
|
||||
PropertiesConfig = newPropertiesConfig;
|
||||
|
||||
ConfigWriter.UpdateRoomConfig(config);
|
||||
}
|
||||
|
||||
public override bool Deactivate()
|
||||
{
|
||||
// Stop listining to this event when room deactivated
|
||||
VideoCodec.IsReadyChange -= VideoCodec_IsReadyChange;
|
||||
|
||||
// Clear occupancy
|
||||
RoomOccupancy = null;
|
||||
|
||||
Debug.Console(0, this, "Room '{0}' Deactivated", Name);
|
||||
|
||||
return base.Deactivate();
|
||||
}
|
||||
|
||||
public override bool CustomActivate()
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -267,127 +442,95 @@ namespace PepperDash.Essentials
|
||||
|
||||
Debug.Console(2, this, "Emergency Config evaluated.");
|
||||
|
||||
|
||||
VideoCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
||||
VideoCodec.IsReadyChange += (o, a) => { this.SetCodecExternalSources(); SetCodecBranding(); };
|
||||
|
||||
if (AudioCodec != null)
|
||||
AudioCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
||||
{
|
||||
AudioCodec.CallStatusChange -= AudioCodec_CallStatusChange;
|
||||
AudioCodec.CallStatusChange += AudioCodec_CallStatusChange;
|
||||
}
|
||||
|
||||
VideoCodec.CallStatusChange -= VideoCodec_CallStatusChange;
|
||||
VideoCodec.CallStatusChange += VideoCodec_CallStatusChange;
|
||||
|
||||
VideoCodec.IsReadyChange -= VideoCodec_IsReadyChange;
|
||||
VideoCodec.IsReadyChange += VideoCodec_IsReadyChange;
|
||||
|
||||
VideoCodec.SharingContentIsOnFeedback.OutputChange -= SharingContentIsOnFeedback_OutputChange;
|
||||
VideoCodec.SharingContentIsOnFeedback.OutputChange += SharingContentIsOnFeedback_OutputChange;
|
||||
|
||||
|
||||
IsSharingFeedback = new BoolFeedback(() => VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
||||
VideoCodec.SharingContentIsOnFeedback.OutputChange += (o, a) => this.IsSharingFeedback.FireUpdate();
|
||||
|
||||
// link privacy to VC (for now?)
|
||||
PrivacyModeIsOnFeedback = new BoolFeedback(() => VideoCodec.PrivacyModeIsOnFeedback.BoolValue);
|
||||
VideoCodec.PrivacyModeIsOnFeedback.OutputChange += (o, a) => this.PrivacyModeIsOnFeedback.FireUpdate();
|
||||
|
||||
VideoCodec.PrivacyModeIsOnFeedback.OutputChange -= PrivacyModeIsOnFeedback_OutputChange;
|
||||
VideoCodec.PrivacyModeIsOnFeedback.OutputChange += PrivacyModeIsOnFeedback_OutputChange;
|
||||
|
||||
CallTypeFeedback = new IntFeedback(() => 0);
|
||||
|
||||
SetSourceListKey();
|
||||
|
||||
EnablePowerOnToLastSource = true;
|
||||
|
||||
|
||||
// Add Occupancy object from config
|
||||
if (PropertiesConfig.Occupancy != null)
|
||||
{
|
||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Setting Occupancy Provider for room");
|
||||
this.SetRoomOccupancy(DeviceManager.GetDeviceForKey(PropertiesConfig.Occupancy.DeviceKey) as
|
||||
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
||||
}
|
||||
|
||||
this.LogoUrlLightBkgnd = PropertiesConfig.LogoLight.GetLogoUrlLight();
|
||||
this.LogoUrlDarkBkgnd = PropertiesConfig.LogoDark.GetLogoUrlDark();
|
||||
|
||||
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
||||
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(0, this, "Error Initializing Room: {0}", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupDisplays()
|
||||
{
|
||||
//DefaultDisplay = DeviceManager.GetDeviceForKey(PropertiesConfig.DefaultDisplayKey) as IRoutingSinkWithSwitching;
|
||||
|
||||
var destinationList = ConfigReader.ConfigObject.DestinationLists[PropertiesConfig.DestinationListKey];
|
||||
|
||||
foreach (var destination in destinationList)
|
||||
{
|
||||
var dest = destination.Value.SinkDevice as IRoutingSinkWithSwitching;
|
||||
|
||||
if (dest != null)
|
||||
{
|
||||
Displays.Add(dest);
|
||||
}
|
||||
|
||||
var display = dest as DisplayBase;
|
||||
if (display != null)
|
||||
{
|
||||
// Link power, warming, cooling to display
|
||||
var dispTwoWay = display as IHasPowerControlWithFeedback;
|
||||
if (dispTwoWay != null)
|
||||
{
|
||||
dispTwoWay.PowerIsOnFeedback.OutputChange += (o, a) =>
|
||||
{
|
||||
if (dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
||||
{
|
||||
//if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||
// CurrentSourceInfo = null;
|
||||
OnFeedback.FireUpdate();
|
||||
}
|
||||
if (dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||
{
|
||||
SetDefaultLevels();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
display.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
||||
{
|
||||
IsWarmingUpFeedback.FireUpdate();
|
||||
if (!IsWarmingUpFeedback.BoolValue)
|
||||
(CurrentVolumeControls as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
|
||||
};
|
||||
display.IsCoolingDownFeedback.OutputChange += (o, a) =>
|
||||
{
|
||||
IsCoolingDownFeedback.FireUpdate();
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SetSourceListKey()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey))
|
||||
{
|
||||
SetSourceListKey(PropertiesConfig.SourceListKey);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSourceListKey(Key);
|
||||
Debug.Console(0, this, "Error Activiating Room: {0}", e);
|
||||
}
|
||||
|
||||
SetCodecExternalSources();
|
||||
}
|
||||
|
||||
protected override void CustomSetConfig(DeviceConfig config)
|
||||
{
|
||||
var newPropertiesConfig = JsonConvert.DeserializeObject<EssentialsHuddleVtc1PropertiesConfig>(config.Properties.ToString());
|
||||
|
||||
if (newPropertiesConfig != null)
|
||||
PropertiesConfig = newPropertiesConfig;
|
||||
|
||||
ConfigWriter.UpdateRoomConfig(config);
|
||||
}
|
||||
|
||||
public override bool CustomActivate()
|
||||
{
|
||||
// Add Occupancy object from config
|
||||
if (PropertiesConfig.Occupancy != null)
|
||||
{
|
||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Setting Occupancy Provider for room");
|
||||
this.SetRoomOccupancy(DeviceManager.GetDeviceForKey(PropertiesConfig.Occupancy.DeviceKey) as
|
||||
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
||||
}
|
||||
|
||||
this.LogoUrlLightBkgnd = PropertiesConfig.LogoLight.GetLogoUrlLight();
|
||||
this.LogoUrlDarkBkgnd = PropertiesConfig.LogoDark.GetLogoUrlDark();
|
||||
|
||||
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
||||
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
||||
|
||||
Debug.Console(0, this, "Room '{0}' Activated", Name);
|
||||
return base.CustomActivate();
|
||||
}
|
||||
|
||||
void AudioCodec_CallStatusChange(object sender, CodecCallStatusItemChangeEventArgs e)
|
||||
{
|
||||
InCallFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
void PrivacyModeIsOnFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
PrivacyModeIsOnFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
void VideoCodec_IsReadyChange(object sender, EventArgs e)
|
||||
{
|
||||
SetUpVideoCodec();
|
||||
}
|
||||
|
||||
void SetUpVideoCodec()
|
||||
{
|
||||
SetCodecExternalSources();
|
||||
SetCodecBranding();
|
||||
}
|
||||
|
||||
void VideoCodec_CallStatusChange(object sender, CodecCallStatusItemChangeEventArgs e)
|
||||
{
|
||||
InCallFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
void SharingContentIsOnFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
IsSharingFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -780,6 +923,8 @@ namespace PepperDash.Essentials
|
||||
videoCodecWithExternalSwitching.SetExternalSourceState(kvp.Key, PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.eExternalSourceMode.Ready);
|
||||
}
|
||||
}
|
||||
|
||||
Debug.Console(1, this, "Successfully set up codec external sources for room: {0}", Name);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -19,6 +19,8 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
public class EssentialsHuddleVtc1Room : EssentialsRoomBase, IEssentialsHuddleVtc1Room
|
||||
{
|
||||
private IEssentialsRoomCombiner _roomCombiner;
|
||||
|
||||
private bool _codecExternalSourceChange;
|
||||
public event EventHandler<VolumeDeviceChangeEventArgs> CurrentVolumeDeviceChange;
|
||||
public event SourceInfoChangeHandler CurrentSourceChange;
|
||||
@@ -234,7 +236,7 @@ namespace PepperDash.Essentials
|
||||
throw new ArgumentNullException("DefaultAudioDevice cannot be null");
|
||||
}
|
||||
|
||||
InitializeRoom();
|
||||
Initialize();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -242,8 +244,65 @@ namespace PepperDash.Essentials
|
||||
}
|
||||
}
|
||||
|
||||
void InitializeRoom()
|
||||
{
|
||||
|
||||
private void SetupEnvironmentalControlDevices()
|
||||
{
|
||||
if (PropertiesConfig.Environment != null)
|
||||
{
|
||||
if (PropertiesConfig.Environment.Enabled)
|
||||
{
|
||||
EnvironmentalControlDevices.Clear();
|
||||
|
||||
foreach (var d in PropertiesConfig.Environment.DeviceKeys)
|
||||
{
|
||||
var envDevice = DeviceManager.GetDeviceForKey(d) as EssentialsDevice;
|
||||
EnvironmentalControlDevices.Add(envDevice);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void SetSourceListKey()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey))
|
||||
{
|
||||
SetSourceListKey(PropertiesConfig.SourceListKey);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSourceListKey(Key);
|
||||
}
|
||||
|
||||
SetUpVideoCodec();
|
||||
}
|
||||
|
||||
protected override void CustomSetConfig(DeviceConfig config)
|
||||
{
|
||||
var newPropertiesConfig = JsonConvert.DeserializeObject<EssentialsHuddleVtc1PropertiesConfig>(config.Properties.ToString());
|
||||
|
||||
if (newPropertiesConfig != null)
|
||||
PropertiesConfig = newPropertiesConfig;
|
||||
|
||||
ConfigWriter.UpdateRoomConfig(config);
|
||||
}
|
||||
|
||||
public override bool Deactivate()
|
||||
{
|
||||
|
||||
// Stop listining to this event when room deactivated
|
||||
VideoCodec.IsReadyChange -= VideoCodec_IsReadyChange;
|
||||
|
||||
// Clear occupancy
|
||||
RoomOccupancy = null;
|
||||
|
||||
Debug.Console(0, this, "Room '{0}' Deactivated", Name);
|
||||
|
||||
return base.Deactivate();
|
||||
}
|
||||
|
||||
public override bool CustomActivate()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (DefaultAudioDevice is IBasicVolumeControls)
|
||||
@@ -278,32 +337,15 @@ namespace PepperDash.Essentials
|
||||
var dispTwoWay = disp as IHasPowerControlWithFeedback;
|
||||
if (dispTwoWay != null)
|
||||
{
|
||||
dispTwoWay.PowerIsOnFeedback.OutputChange += (o, a) =>
|
||||
{
|
||||
if (dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
||||
{
|
||||
if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||
CurrentSourceInfo = null;
|
||||
OnFeedback.FireUpdate();
|
||||
}
|
||||
if (dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||
{
|
||||
SetDefaultLevels();
|
||||
}
|
||||
};
|
||||
dispTwoWay.PowerIsOnFeedback.OutputChange -= PowerIsOnFeedback_OutputChange;
|
||||
dispTwoWay.PowerIsOnFeedback.OutputChange += PowerIsOnFeedback_OutputChange;
|
||||
}
|
||||
|
||||
disp.IsWarmingUpFeedback.OutputChange += (o, a) =>
|
||||
{
|
||||
IsWarmingUpFeedback.FireUpdate();
|
||||
if (!IsWarmingUpFeedback.BoolValue)
|
||||
(CurrentVolumeControls as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
|
||||
};
|
||||
disp.IsCoolingDownFeedback.OutputChange += (o, a) =>
|
||||
{
|
||||
IsCoolingDownFeedback.FireUpdate();
|
||||
};
|
||||
disp.IsWarmingUpFeedback.OutputChange -= IsWarmingUpFeedback_OutputChange;
|
||||
disp.IsWarmingUpFeedback.OutputChange += IsWarmingUpFeedback_OutputChange;
|
||||
|
||||
disp.IsCoolingDownFeedback.OutputChange -= IsCoolingDownFeedback_OutputChange;
|
||||
disp.IsCoolingDownFeedback.OutputChange += IsCoolingDownFeedback_OutputChange;
|
||||
}
|
||||
|
||||
|
||||
@@ -318,19 +360,29 @@ namespace PepperDash.Essentials
|
||||
|
||||
Debug.Console(2, this, "Emergency Config evaluated.");
|
||||
|
||||
|
||||
VideoCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
||||
VideoCodec.IsReadyChange += (o, a) => { this.SetCodecExternalSources(); SetCodecBranding(); };
|
||||
|
||||
if (AudioCodec != null)
|
||||
AudioCodec.CallStatusChange += (o, a) => this.InCallFeedback.FireUpdate();
|
||||
{
|
||||
AudioCodec.CallStatusChange -= AudioCodec_CallStatusChange;
|
||||
AudioCodec.CallStatusChange += AudioCodec_CallStatusChange;
|
||||
}
|
||||
|
||||
VideoCodec.CallStatusChange -= VideoCodec_CallStatusChange;
|
||||
VideoCodec.CallStatusChange += VideoCodec_CallStatusChange;
|
||||
|
||||
VideoCodec.IsReadyChange -= VideoCodec_IsReadyChange;
|
||||
VideoCodec.IsReadyChange += VideoCodec_IsReadyChange;
|
||||
|
||||
VideoCodec.SharingContentIsOnFeedback.OutputChange -= SharingContentIsOnFeedback_OutputChange;
|
||||
VideoCodec.SharingContentIsOnFeedback.OutputChange += SharingContentIsOnFeedback_OutputChange;
|
||||
|
||||
|
||||
IsSharingFeedback = new BoolFeedback(() => VideoCodec.SharingContentIsOnFeedback.BoolValue);
|
||||
VideoCodec.SharingContentIsOnFeedback.OutputChange += (o, a) => this.IsSharingFeedback.FireUpdate();
|
||||
|
||||
// link privacy to VC (for now?)
|
||||
PrivacyModeIsOnFeedback = new BoolFeedback(() => VideoCodec.PrivacyModeIsOnFeedback.BoolValue);
|
||||
VideoCodec.PrivacyModeIsOnFeedback.OutputChange += (o, a) => this.PrivacyModeIsOnFeedback.FireUpdate();
|
||||
|
||||
VideoCodec.PrivacyModeIsOnFeedback.OutputChange -= PrivacyModeIsOnFeedback_OutputChange;
|
||||
VideoCodec.PrivacyModeIsOnFeedback.OutputChange += PrivacyModeIsOnFeedback_OutputChange;
|
||||
|
||||
CallTypeFeedback = new IntFeedback(() => 0);
|
||||
|
||||
@@ -339,72 +391,92 @@ namespace PepperDash.Essentials
|
||||
SetSourceListKey();
|
||||
|
||||
EnablePowerOnToLastSource = true;
|
||||
|
||||
|
||||
// Add Occupancy object from config
|
||||
if (PropertiesConfig.Occupancy != null)
|
||||
{
|
||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Setting Occupancy Provider for room");
|
||||
this.SetRoomOccupancy(DeviceManager.GetDeviceForKey(PropertiesConfig.Occupancy.DeviceKey) as
|
||||
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
||||
}
|
||||
|
||||
this.LogoUrlLightBkgnd = PropertiesConfig.LogoLight.GetLogoUrlLight();
|
||||
this.LogoUrlDarkBkgnd = PropertiesConfig.LogoDark.GetLogoUrlDark();
|
||||
|
||||
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
||||
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(0, this, "Error Initializing Room: {0}", e);
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupEnvironmentalControlDevices()
|
||||
{
|
||||
if (PropertiesConfig.Environment != null)
|
||||
{
|
||||
if (PropertiesConfig.Environment.Enabled)
|
||||
{
|
||||
foreach (var d in PropertiesConfig.Environment.DeviceKeys)
|
||||
{
|
||||
var envDevice = DeviceManager.GetDeviceForKey(d) as EssentialsDevice;
|
||||
EnvironmentalControlDevices.Add(envDevice);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void SetSourceListKey()
|
||||
{
|
||||
if (!string.IsNullOrEmpty(PropertiesConfig.SourceListKey))
|
||||
{
|
||||
SetSourceListKey(PropertiesConfig.SourceListKey);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetSourceListKey(Key);
|
||||
Debug.Console(0, this, "Error Activiating Room: {0}", e);
|
||||
}
|
||||
|
||||
SetCodecExternalSources();
|
||||
}
|
||||
|
||||
protected override void CustomSetConfig(DeviceConfig config)
|
||||
{
|
||||
var newPropertiesConfig = JsonConvert.DeserializeObject<EssentialsHuddleVtc1PropertiesConfig>(config.Properties.ToString());
|
||||
|
||||
if (newPropertiesConfig != null)
|
||||
PropertiesConfig = newPropertiesConfig;
|
||||
|
||||
ConfigWriter.UpdateRoomConfig(config);
|
||||
}
|
||||
|
||||
public override bool CustomActivate()
|
||||
{
|
||||
// Add Occupancy object from config
|
||||
if (PropertiesConfig.Occupancy != null)
|
||||
{
|
||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "Setting Occupancy Provider for room");
|
||||
this.SetRoomOccupancy(DeviceManager.GetDeviceForKey(PropertiesConfig.Occupancy.DeviceKey) as
|
||||
IOccupancyStatusProvider, PropertiesConfig.Occupancy.TimeoutMinutes);
|
||||
}
|
||||
|
||||
this.LogoUrlLightBkgnd = PropertiesConfig.LogoLight.GetLogoUrlLight();
|
||||
this.LogoUrlDarkBkgnd = PropertiesConfig.LogoDark.GetLogoUrlDark();
|
||||
|
||||
this.DefaultSourceItem = PropertiesConfig.DefaultSourceItem;
|
||||
this.DefaultVolume = (ushort)(PropertiesConfig.Volumes.Master.Level * 65535 / 100);
|
||||
|
||||
Debug.Console(0, this, "Room '{0}' Activated", Name);
|
||||
return base.CustomActivate();
|
||||
}
|
||||
|
||||
void PrivacyModeIsOnFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
PrivacyModeIsOnFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
void SharingContentIsOnFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
IsSharingFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
void AudioCodec_CallStatusChange(object sender, CodecCallStatusItemChangeEventArgs e)
|
||||
{
|
||||
InCallFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
void VideoCodec_IsReadyChange(object sender, EventArgs e)
|
||||
{
|
||||
SetUpVideoCodec();
|
||||
}
|
||||
|
||||
void SetUpVideoCodec()
|
||||
{
|
||||
SetCodecExternalSources();
|
||||
SetCodecBranding();
|
||||
}
|
||||
|
||||
void VideoCodec_CallStatusChange(object sender, CodecCallStatusItemChangeEventArgs e)
|
||||
{
|
||||
InCallFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
void IsCoolingDownFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
IsCoolingDownFeedback.FireUpdate();
|
||||
}
|
||||
|
||||
void IsWarmingUpFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
IsWarmingUpFeedback.FireUpdate();
|
||||
if (!IsWarmingUpFeedback.BoolValue)
|
||||
(CurrentVolumeControls as IBasicVolumeWithFeedback).SetVolume(DefaultVolume);
|
||||
|
||||
}
|
||||
|
||||
void PowerIsOnFeedback_OutputChange(object sender, FeedbackEventArgs e)
|
||||
{
|
||||
var dispTwoWay = DefaultDisplay as IHasPowerControlWithFeedback;
|
||||
|
||||
if (dispTwoWay.PowerIsOnFeedback.BoolValue != OnFeedback.BoolValue)
|
||||
{
|
||||
if (!dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||
CurrentSourceInfo = null;
|
||||
OnFeedback.FireUpdate();
|
||||
}
|
||||
if (dispTwoWay.PowerIsOnFeedback.BoolValue)
|
||||
{
|
||||
SetDefaultLevels();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -832,6 +904,8 @@ namespace PepperDash.Essentials
|
||||
videoCodecWithExternalSwitching.SetExternalSourceState(kvp.Key, PepperDash.Essentials.Devices.Common.VideoCodec.Cisco.eExternalSourceMode.Ready);
|
||||
}
|
||||
}
|
||||
Debug.Console(1, this, "Successfully set up codec external sources for room: {0}", Name);
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -7,7 +7,8 @@ using PepperDash.Essentials.Room.Config;
|
||||
|
||||
namespace PepperDash.Essentials
|
||||
{
|
||||
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IRunDefaultPresentRoute, IHasDefaultDisplay, IHasCurrentVolumeControls
|
||||
public interface IEssentialsHuddleSpaceRoom : IEssentialsRoom, IHasCurrentSourceInfoChange, IRunRouteAction, IRunDefaultPresentRoute, IHasDefaultDisplay, IHasCurrentVolumeControls, IRoomOccupancy,
|
||||
IEmergency, IMicrophonePrivacy
|
||||
{
|
||||
bool ExcludeFromGlobalFunctions { get; }
|
||||
|
||||
@@ -8,7 +8,8 @@ using PepperDash.Essentials.Devices.Common.AudioCodec;
|
||||
namespace PepperDash.Essentials
|
||||
{
|
||||
public interface IEssentialsHuddleVtc1Room : IEssentialsRoom, IHasCurrentSourceInfoChange,
|
||||
IPrivacy, IHasCurrentVolumeControls, IRunRouteAction, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasDefaultDisplay, IHasInCallFeedback
|
||||
IPrivacy, IHasCurrentVolumeControls, IRunRouteAction, IRunDefaultCallRoute, IHasVideoCodec, IHasAudioCodec, IHasDefaultDisplay, IHasInCallFeedback,
|
||||
IRoomOccupancy, IEmergency, IMicrophonePrivacy
|
||||
{
|
||||
EssentialsHuddleVtc1PropertiesConfig PropertiesConfig { get; }
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user