Compare commits

..

No commits in common. "master" and "2.0.0-alpha.1" have entirely different histories.

954 changed files with 42914 additions and 119867 deletions

147
.azure.yml Normal file
View File

@ -0,0 +1,147 @@
jobs:
######################
###### Linux #########
######################
- job: Linux
timeoutInMinutes: 120
pool:
vmImage: 'ubuntu-16.04'
strategy:
matrix:
AMD64 (x64):
dockerTag: 'amd64'
dockerName: 'Debian Stretch (AMD64)'
platform: 'x11'
i386 (x86):
dockerTag: 'i386'
dockerName: 'Debian Stretch (i386)'
platform: 'x11'
ARMv6hf (Raspberry Pi v1 & ZERO):
dockerTag: 'armv6hf'
dockerName: 'Debian Stretch (Raspberry Pi v1 & ZERO)'
platform: 'rpi'
ARMv7hf (Raspberry Pi 2 & 3):
dockerTag: 'armv7hf'
dockerName: 'Debian Stretch (Raspberry Pi 2 & 3)'
platform: 'rpi'
ARMv8 (Generic AARCH64):
dockerTag: 'aarch64'
dockerName: 'ARMv8 (Generic AARCH64)'
platform: 'amlogic'
steps:
- checkout: self # represents the repo where the initial Pipelines YAML file was found
submodules: recursive # set to 'recursive' to get submodules of submodules
# read version file
- bash: echo "##vso[task.setvariable variable=semVer]$(grep -oE 'alpha|beta' version)"
workingDirectory: '$(Build.SourcesDirectory)'
displayName: 'Read and generate pipeline variables'
# build process
- bash: ./.ci/ci_build.sh
displayName: 'Build $(dockerName) packages'
env:
DOCKER_TAG: $(dockerTag)
DOCKER_NAME: $(dockerName)
PLATFORM: $(platform)
# copy files
- bash: 'cp -v deploy/Hyperion-* $(Build.ArtifactStagingDirectory) 2>/dev/null || :'
workingDirectory: '$(Build.SourcesDirectory)'
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
displayName: 'Collecting deployable artifacts'
# publish artifacts
- task: PublishBuildArtifacts@1
inputs:
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: $(dockerTag)
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
displayName: 'Publish deployables artifacts'
# set release to pre-release
- bash: echo '##vso[task.setvariable variable=preRelease;]true'
condition: and(succeeded(), or(contains(variables['semVer'], 'alpha'), contains(variables['semVer'], 'beta')), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
displayName: 'Mark alpha or beta as pre-release'
# create or update github release
- task: GithubRelease@0
inputs:
gitHubConnection: Hyperion.NG
repositoryName: $(Build.Repository.Name)
action: edit
target: $(Build.SourceVersion)
tagSource: manual
tag: $(Build.SourceBranchName)
assets: '$(Build.ArtifactStagingDirectory)/*'
assetUploadMode: 'replace'
addChangeLog: false
isPreRelease: $(preRelease)
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
displayName: Create/Update GitHub release
######################
###### macOS #########
######################
- job: macOS
timeoutInMinutes: 120
pool:
vmImage: 'macOS-10.13'
steps:
- checkout: self # represents the repo where the initial Pipelines YAML file was found
submodules: recursive # set to 'recursive' to get submodules of submodules
# read version file
- bash: echo "##vso[task.setvariable variable=semVer]$(grep -oE 'alpha|beta' version)"
workingDirectory: '$(Build.SourcesDirectory)'
displayName: 'Read and generate pipeline variables'
# install dependencies
- bash: ./.ci/ci_install.sh
displayName: 'Install dependencies'
# build process
- bash: ./.ci/ci_build.sh
displayName: 'Build macOS 10.13 packages'
env:
PLATFORM: 'osx'
# copy files
- bash: 'cp -v build/Hyperion-* $(Build.ArtifactStagingDirectory) 2>/dev/null || :'
workingDirectory: '$(Build.SourcesDirectory)'
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
displayName: 'Collecting deployable artifacts'
# publish artifacts
- task: PublishBuildArtifacts@1
inputs:
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'macos'
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
displayName: 'Publish deployables artifacts'
# set release to pre-release
- bash: echo '##vso[task.setvariable variable=preRelease;]true'
condition: and(succeeded(), or(contains(variables['semVer'], 'alpha'), contains(variables['semVer'], 'beta')), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
displayName: 'Mark alpha or beta as pre-release'
# create or update github release
- task: GithubRelease@0
inputs:
gitHubConnection: Hyperion.NG
repositoryName: $(Build.Repository.Name)
action: edit
target: $(Build.SourceVersion)
tagSource: manual
tag: '$(Build.SourceBranchName)'
assets: '$(Build.ArtifactStagingDirectory)/*'
assetUploadMode: 'replace'
addChangeLog: false
isPreRelease: $(preRelease)
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
displayName: Create/Update GitHub release

63
.ci/ci_build.sh Executable file
View File

@ -0,0 +1,63 @@
#!/bin/bash
# detect CI
if [ -n "${TRAVIS-}" ]; then
# Travis-CI
CI_NAME="$(echo "$TRAVIS_OS_NAME" | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$TRAVIS_BUILD_DIR"
elif [ "$SYSTEM_COLLECTIONID" != "" ]; then
# Azure Pipelines
CI_NAME="$(echo "$AGENT_OS" | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$BUILD_SOURCESDIRECTORY"
elif [ "$HOME" != "" ]; then
# GitHub Actions
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$GITHUB_WORKSPACE"
else
# for executing in non ci environment
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
fi
# set environment variables if not exists
[ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug"
# Determine cmake build type; tag builds are Release, else Debug (-dev appends to platform)
if [[ $BUILD_SOURCEBRANCH == *"refs/tags"* || $GITHUB_REF == *"refs/tags"* ]]; then
BUILD_TYPE=Release
else
PLATFORM=${PLATFORM}-dev
fi
# Build the package on osx or linux
if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then
# compile prepare
mkdir build || exit 1
cd build
cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2
make -j $(sysctl -n hw.ncpu) || exit 3 # Notes: The package creation is currently not supported because of strange errors.
cd ${CI_BUILD_DIR} && source /${CI_BUILD_DIR}/test/testrunner.sh || exit 4
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ "$CI_NAME" == 'linux' ]]; then
echo "Compile Hyperion with DOCKER_TAG = ${DOCKER_TAG} and friendly name DOCKER_NAME = ${DOCKER_NAME}"
# take ownership of deploy dir
mkdir ${CI_BUILD_DIR}/deploy
# run docker
docker run --rm \
-v "${CI_BUILD_DIR}/deploy:/deploy" \
-v "${CI_BUILD_DIR}:/source:ro" \
hyperionproject/hyperion-ci:$DOCKER_TAG \
/bin/bash -c "mkdir hyperion && cp -r source/. /hyperion &&
cd /hyperion && mkdir build && cd build &&
cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DDOCKER_PLATFORM=${DOCKER_TAG} ../ || exit 2 &&
make -j $(nproc) package || exit 3 &&
cp /hyperion/build/bin/h* /deploy/ 2>/dev/null || : &&
cp /hyperion/build/Hyperion-* /deploy/ 2>/dev/null || : &&
cd /hyperion && source /hyperion/test/testrunner.sh || exit 4 &&
exit 0;
exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
# overwrite file owner to current user
sudo chown -fR $(stat -c "%U:%G" ${CI_BUILD_DIR}/deploy) ${CI_BUILD_DIR}/deploy
fi

48
.ci/ci_install.sh Executable file
View File

@ -0,0 +1,48 @@
#!/bin/bash
# detect CI
if [ -n "${TRAVIS-}" ]; then
# Travis-CI
CI_NAME="$(echo "$TRAVIS_OS_NAME" | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$TRAVIS_BUILD_DIR"
elif [ "$SYSTEM_COLLECTIONID" != "" ]; then
# Azure Pipelines
CI_NAME="$(echo "$AGENT_OS" | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$BUILD_SOURCESDIRECTORY"
elif [ "$HOME" != "" ]; then
# GitHub Actions
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
CI_BUILD_DIR="$GITHUB_WORKSPACE"
else
# for executing in non ci environment
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
fi
function installAndUpgrade()
{
arr=("$@")
for i in "${arr[@]}";
do
list_output=`brew list | grep $i`
outdated_output=`brew outdated | grep $i`
if [[ ! -z "$list_output" ]]; then
if [[ ! -z "$outdated_output" ]]; then
brew upgrade $i
fi
else
brew install $i
fi
done
}
# install osx deps for hyperion compile
if [[ $CI_NAME == 'osx' || $CI_NAME == 'darwin' ]]; then
echo "Install dependencies"
brew update
dependencies=("qt5" "python" "libusb" "cmake" "doxygen")
installAndUpgrade "${dependencies[@]}"
elif [[ $CI_NAME != 'linux' ]]; then
echo "Unsupported platform: $CI_NAME"
exit 5
fi

76
.codedocs Normal file
View File

@ -0,0 +1,76 @@
# Hyperion.NG .codedocs Configuration File
#---------------------------------------------------------------------------
# CodeDocs Configuration
#---------------------------------------------------------------------------
# Include the Doxygen configuration from another file.
# The file must be a relative path with respect to the root of the repository.
DOXYFILE =
# Specify external repository to link documentation with.
# This is similar to Doxygen's TAGFILES option, but will automatically link to
# tags of other repositories already using CodeDocs. List each repository to
# link with by giving its location in the form of owner/repository.
# For example:
# TAGLINKS = doxygen/doxygen CodeDocs/osg
# Note: these repositories must already be built on CodeDocs.
TAGLINKS =
#---------------------------------------------------------------------------
# Doxygen Configuration
#---------------------------------------------------------------------------
# Doxygen configuration may also be placed in this file.
# Currently, the following Doxygen configuration options are available. Refer
# to http://doxygen.org/manual/config.html for detailed explanation of the
# options. To request support for more options, contact support@codedocs.xyz.
#
# ABBREVIATE_BRIEF =
# ALIASES =
# ALPHABETICAL_INDEX =
# ALWAYS_DETAILED_SEC =
# CASE_SENSE_NAMES =
# CLASS_DIAGRAMS =
# DISABLE_INDEX =
# DISTRIBUTE_GROUP_DOC =
# EXAMPLE_PATH =
EXCLUDE = .ci/ \
assets/ \
bin/
config/ \
effects/ \
test/ \
# EXCLUDE_PATTERNS =
# EXCLUDE_SYMBOLS =
# EXTENSION_MAPPING =
# EXTRACT_LOCAL_CLASSES =
# FILE_PATTERNS =
# GENERATE_TAGFILE =
# GENERATE_TREEVIEW =
# HIDE_COMPOUND_REFERENCE =
# HIDE_SCOPE_NAMES =
# HIDE_UNDOC_CLASSES =
# HIDE_UNDOC_MEMBERS =
# HTML_TIMESTAMP =
# INLINE_GROUPED_CLASSES =
# INPUT_ENCODING =
# INTERNAL_DOCS =
# OPTIMIZE_OUTPUT_FOR_C =
PROJECT_BRIEF = "The successor to Hyperion aka Hyperion Next Generation"
PROJECT_NAME = "Hyperion.NG"
# PROJECT_NUMBER =
# SHORT_NAMES =
# SHOW_FILES =
# SHOW_INCLUDE_FILES =
# SHOW_NAMESPACES =
# SORT_BRIEF_DOCS =
# SORT_BY_SCOPE_NAME =
# SORT_MEMBER_DOCS =
# STRICT_PROTO_MATCHING =
# TYPEDEF_HIDES_STRUCT =
USE_MDFILE_AS_MAINPAGE = README.md
# VERBATIM_HEADERS =
#

View File

@ -1,25 +0,0 @@
{
"name": "Hyperion.ng Linux",
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
"extensions": [
"twxs.cmake",
"ms-vscode.cpptools",
"ms-vscode.cmake-tools",
"spmeesseman.vscode-taskexplorer",
"yzhang.markdown-all-in-one",
"CoenraadS.bracket-pair-colorizer",
"vscode-icons-team.vscode-icons",
"editorconfig.editorconfig",
"RVSmartPorting.rpm-spec-ext"
],
"settings": {
"editor.formatOnSave": false,
"cmake.environment": { }
}
}
},
"forwardPorts": [8090, 8092],
"postCreateCommand": "git submodule update --recursive --init && sudo apt-get update && sudo apt-get install -y git cmake build-essential qtbase5-dev libqt5serialport5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libjpeg-dev libturbojpeg0-dev libssl-dev libasound2-dev"
}

View File

@ -1,25 +0,0 @@
root = true
# Unix-style newlines with a newline ending every file
[*]
charset = utf-8
trim_trailing_whitespace = true
end_of_line = lf
insert_final_newline = true
# Tab indentation (no size specified)
[Makefile]
indent_style = tab
[*.{c,h,cpp,hpp}]
indent_style = tab
indent_size = 4
# js and webui
[*.{ts,js,html}]
indent_style = space
indent_size = 2
# version file
[version]
insert_final_newline = false

1
.github/FUNDING.yml vendored
View File

@ -1 +0,0 @@
custom: "https://www.paypal.me/HyperionAmbi"

View File

@ -1,7 +1,7 @@
--- ---
name: Bug report name: Bug report
about: Create a report to help us improving Hyperion about: Create a report to help us improving Hyperion
labels: Waiting For Review
--- ---
<!-- Please don't delete this template or we'll close your issue --> <!-- Please don't delete this template or we'll close your issue -->
@ -29,4 +29,4 @@ labels: Waiting For Review
#### System #### System
<!-- In the web interface of the Hyperion config go to System > About Hyperion and Paste the content of "System info (Github Issue)" here --> <!-- Your system information - please copy paste "System info (Github Issue)" section from web configuration/system/about -->

View File

@ -1 +0,0 @@
blank_issues_enabled: false

View File

@ -1,7 +1,7 @@
--- ---
name: Feature request name: Feature request
about: Suggest an idea for Hyperion about: Suggest an idea for Hyperion
labels: feature request
--- ---
<!-- Please don't delete this template or we'll close your issue --> <!-- Please don't delete this template or we'll close your issue -->

View File

@ -5,8 +5,6 @@
**Summary** **Summary**
**What kind of change does this PR introduce?** (check at least one) **What kind of change does this PR introduce?** (check at least one)
- [ ] Bugfix - [ ] Bugfix
@ -27,8 +25,8 @@ If changing the UI of web configuration, please provide the **before/after** scr
If yes, please describe the impact and migration path for existing setups: If yes, please describe the impact and migration path for existing setups:
**The PR fulfills these requirements:** **The PR fulfills these requirements:**
<!-- Github will close properly linked issues automatically on PR merge -->
- [ ] When resolving a specific issue, it's referenced in the PR's body (e.g. `Fixes: #xxx[,#xxx]`, where "xxx" is the issue number) - [ ] When resolving a specific issue, it's referenced in the PR's title (e.g. `fix #xxx[,#xxx]`, where "xxx" is the issue number)
If adding a **new feature**, the PR's description includes: If adding a **new feature**, the PR's description includes:
@ -36,9 +34,6 @@ If adding a **new feature**, the PR's description includes:
- [ ] Related documents have been updated (docs/docs/en) - [ ] Related documents have been updated (docs/docs/en)
- [ ] Related tests have been updated - [ ] Related tests have been updated
**PLEASE DON'T FORGET TO ADD YOUR CHANGES TO CHANGELOG.MD**
- [ ] Yes, CHANGELOG.md is also updated
To avoid wasting your time, it's best to open a **feature request issue** first and wait for approval before working on it. To avoid wasting your time, it's best to open a **feature request issue** first and wait for approval before working on it.
**Other information:** **Other information:**

View File

@ -1,4 +0,0 @@
name: "CodeQL config"
paths-ignore:
- 'dependencies/external/'
- 'assets/webconfig/js/lib'

View File

@ -1,7 +0,0 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"

12
.github/issues.yml vendored
View File

@ -1,12 +0,0 @@
Issues:
opened: |
Hello @$AUTHOR
We make use of an **[ISSUE TEMPLATE](https://github.com/$REPO_FULL_NAME/issues/new/choose)** to capture relevant information to support you best. Unfortunately, **you ignored or deleted** the given sections. Please take care that all information requested is provided.
This issue will be automatically closed by our bot, please do not take it personally. We would like asking you to open a new issue following the **[ISSUE TEMPLATE](https://github.com/$REPO_FULL_NAME/issues/new/choose)**.
Thanks for your continuous support!
Best regards,
Hyperion-Project

View File

@ -1,20 +0,0 @@
PullRequest:
opened: |
Hello @$AUTHOR :wave:
I'm the Hyperion Project Bot and I want to thank you for
contributing to Hyperion with your pull requests!
To help you and other users test your pull requests faster,
I'll create a link for you to your workflow artifacts.
:link: https://github.com/$REPO_FULL_NAME/actions/runs/$RUN_ID
Of course, if you make changes to your PR, I will create a new link.
Best regards,
Hyperion Project
synchronize: |
Hey @$AUTHOR I created a new link to your workflow artifacts:
:link: https://github.com/$REPO_FULL_NAME/actions/runs/$RUN_ID

View File

@ -1,57 +0,0 @@
#!/bin/bash
# set environment variables if not exists
[ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug"
[ -z "${TARGET_ARCH}" ] && TARGET_ARCH="linux/amd64"
[ -z "${PLATFORM}" ] && PLATFORM="x11"
# Determine cmake build type; tag builds are Release, else Debug (-dev appends to platform)
if [[ $GITHUB_REF == *"refs/tags"* ]]; then
BUILD_TYPE=Release
else
PLATFORM=${PLATFORM}-dev
fi
echo "Compile Hyperion on '${RUNNER_OS}' with build type '${BUILD_TYPE}' and platform '${PLATFORM}'"
# Build the package on MacOS, Windows or Linux
if [[ "$RUNNER_OS" == 'macOS' ]]; then
mkdir build || exit 1
cmake -B build -G Ninja -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local || exit 2
cmake --build build --target package --parallel $(sysctl -n hw.ncpu) || exit 3
cd ${GITHUB_WORKSPACE} && source /${GITHUB_WORKSPACE}/test/testrunner.sh || exit 4
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ $RUNNER_OS == "Windows" ]]; then
echo "Number of Cores $NUMBER_OF_PROCESSORS"
mkdir build || exit 1
cd build
cmake -G "Visual Studio 17 2022" -A x64 -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE="Release" ../ || exit 2
cmake --build . --target package --config "Release" -- -nologo -v:m -maxcpucount || exit 3
exit 0;
exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
elif [[ "$RUNNER_OS" == 'Linux' ]]; then
echo "Docker arguments used: DOCKER_IMAGE=${DOCKER_IMAGE}, DOCKER_TAG=${DOCKER_TAG}, TARGET_ARCH=${TARGET_ARCH}"
# verification bypass of external dependencies
# set GitHub Container Registry url
REGISTRY_URL="ghcr.io/hyperion-project/${DOCKER_IMAGE}"
# take ownership of deploy dir
mkdir ${GITHUB_WORKSPACE}/deploy
# run docker
docker run --rm --platform=${TARGET_ARCH} \
-v "${GITHUB_WORKSPACE}/deploy:/deploy" \
-v "${GITHUB_WORKSPACE}:/source:rw" \
$REGISTRY_URL:$DOCKER_TAG \
/bin/bash -c "mkdir -p /source/build && cd /source/build &&
cmake -G Ninja -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} .. || exit 2 &&
cmake --build . --target package -- -j $(nproc) || exit 3 || : &&
cp /source/build/bin/h* /deploy/ 2>/dev/null || : &&
cp /source/build/Hyperion-* /deploy/ 2>/dev/null || : &&
cd /source && source /source/test/testrunner.sh || exit 5 &&
exit 0;
exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 5; }
# overwrite file owner to current user
sudo chown -fR $(stat -c "%U:%G" ${GITHUB_WORKSPACE}/deploy) ${GITHUB_WORKSPACE}/deploy
fi

80
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,80 @@
name: GitHub Actions
on: [push, pull_request]
jobs:
Linux:
name: ${{ matrix.dockerName }}
runs-on: ubuntu-latest
strategy:
matrix:
dockerTag: [ amd64, i386, armv6hf, armv7hf, aarch64 ]
include:
- dockerTag: amd64
dockerName: Debian Stretch (AMD64)
platform: x11
- dockerTag: i386
dockerName: Debian Stretch (i386)
platform: x11
- dockerTag: armv6hf
dockerName: Debian Stretch (Raspberry Pi v1 & ZERO)
platform: rpi
- dockerTag: armv7hf
dockerName: Debian Stretch (Raspberry Pi 2 & 3)
platform: rpi
- dockerTag: aarch64
dockerName: Debian Stretch (Generic AARCH64)
platform: amlogic
steps:
- uses: actions/checkout@v1
with:
submodules: true
# build process
- name: Build packages
env:
DOCKER_TAG: ${{ matrix.dockerTag }}
DOCKER_NAME: ${{ matrix.dockerName }}
PLATFORM: ${{ matrix.platform }}
shell: bash
run: ./.ci/ci_build.sh
# create/update github release (replacement for Microsoft Azure after the beta phase)
# - name: Create/Update GitHub release
# if: github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') && success()
# uses: docker://softprops/action-gh-release
# with:
# files: deploy/Hyperion.NG-*
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
macOS:
name: macOS
runs-on: macos-latest
steps:
- uses: actions/checkout@v1
with:
submodules: true
# install dependencies
- name: Install dependencies
shell: bash
run: ./.ci/ci_install.sh
# build process
- name: Build packages
env:
PLATFORM: osx
shell: bash
run: ./.ci/ci_build.sh
# create/update github release (replacement for Microsoft Azure after the beta phase)
# - name: Create/Update GitHub release
# if: github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') && success()
# uses: docker://softprops/action-gh-release
# with:
# files: deploy/Hyperion.NG-*
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,16 +0,0 @@
name: 🧹 Cleanup old artifacts
# Run cleanup workflow at the end of every day
on:
schedule:
- cron: '0 0 * * *'
jobs:
clean:
runs-on: ubuntu-latest
steps:
- name: 🧹 Cleanup old workflow artifacts
uses: kolpav/purge-artifacts-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
expire-in: 14days # all artifacts at least 14 days old

View File

@ -1,86 +0,0 @@
name: 📊 CodeQL
run-name: |
${{ github.event_name == 'schedule' && '⏰ Scheduled CodeQL run' || '' }}
${{ github.event_name == 'push' && format('📊 Pushed CodeQL run - {0}', github.event.head_commit.message) || '' }}
${{ github.event_name == 'pull_request' && format('📊 CodeQL run for PR {0} - {1}', github.event.pull_request.number, github.event.pull_request.title) || github.event.head_commit.message }}
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
schedule:
- cron: "36 18 * * 4"
jobs:
analyze:
name: 📊 Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ python, javascript, cpp ]
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 📥 Install Packages (cpp)
if: ${{ matrix.language == 'cpp' }}
run: |
sudo apt-get update
sudo apt-get install --yes git build-essential qtbase5-dev libqt5serialport5-dev libqt5websockets5-dev libqt5sql5-sqlite libqt5svg5-dev libqt5x11extras5-dev libusb-1.0-0-dev python3-dev libcec-dev libxcb-image0-dev libxcb-util0-dev libxcb-shm0-dev libxcb-render0-dev libxcb-randr0-dev libxrandr-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libasound2-dev libturbojpeg0-dev libjpeg-dev libssl-dev libftdi1-dev
- name: Temporarily downgrade CMake to 3.28.3 # Please remove if GitHub has updated Cmake (greater than 3.30.0)
uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.28.3'
- name: 🔁 Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: +security-and-quality
config-file: ./.github/config/codeql.yml
- name: 👷 Autobuild
uses: github/codeql-action/autobuild@v3
- name: 🏃 Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
upload: False
output: sarif-results
- name: 🆔 Filter SARIF
uses: advanced-security/filter-sarif@v1
with:
patterns: |
-**/dependencies/**
-**/moc_*.cpp
-**/libsrc/flatbufserver/hyperion_request_generated.h
-**/libsrc/protoserver/message.pb.cc
-**/libsrc/protoserver/message.pb.h
input: sarif-results/${{ matrix.language }}.sarif
output: sarif-results/${{ matrix.language }}.sarif
- name: 📦 Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: sarif-results/${{ matrix.language }}.sarif
- name: 📦 Upload loc as a Build Artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.language }}.sarif
path: sarif-results
retention-days: 1

View File

@ -1,49 +0,0 @@
name: Hyperion CI/PR Builds
run-name: |
${{ github.event_name == 'push' && '🌱 Push build -' || '' }}
${{ github.event_name == 'pull_request' && format('📦 Artifacts build for PR {0} - {1}', github.event.pull_request.number, github.event.pull_request.title) || github.event.head_commit.message }}
on:
push:
branches:
- '**'
tags:
- '*'
pull_request:
branches:
- 'master'
jobs:
# GitHub Push/Pull Request (Release only on tagged commits)
github_build:
name: Qt ${{ matrix.qt_version }} Build ${{ matrix.qt_version == '6' && '(Testing))' || '' }}
strategy:
fail-fast: false
matrix:
qt_version: ['5', '6']
uses: ./.github/workflows/qt5_6.yml
secrets: inherit
with:
qt_version: ${{ matrix.qt_version }}
event_name: ${{ github.event_name }}
pull_request_number: ${{ github.event.pull_request.number }}
publish: ${{ startsWith(github.event.ref, 'refs/tags') && matrix.qt_version == '5' }}
# Build DEB/RPM Packages for APT/DNF Repository (runs only on tagged commits)
repo_build:
name: 🚀 Let Hyperion build its own repository (APT/DNF)
if: startsWith(github.event.ref, 'refs/tags')
needs: [ github_build ]
runs-on: ubuntu-latest
steps:
- name: 📲 Dispatch APT/DNF build
if: ${{ env.SECRET_HYPERION_BOT_TOKEN != null }}
uses: peter-evans/repository-dispatch@v3.0.0
with:
repository: hyperion-project/hyperion.releases-ci
token: ${{ secrets.HYPERION_BOT_TOKEN }}
event-type: releases_repo_build
client-payload: '{ "head_sha": "${{ github.sha }}", "repo_checkout": "hyperion-project/hyperion.ng" }'
env:
SECRET_HYPERION_BOT_TOKEN: ${{ secrets.HYPERION_BOT_TOKEN }}

View File

@ -1,258 +0,0 @@
name: GitHub Qt5/6 Builds
on:
# Reusable from push_pull.yml
workflow_call:
inputs:
qt_version:
type: string
description: Build with this Qt version
default: '5'
required: false
event_name:
type: string
description: The event name
default: ''
required: false
pull_request_number:
type: string
description: The corresponding PR number
default: ''
required: false
publish:
type: boolean
description: Package publishing
default: false
required: false
env:
ghcr: hyperion-project
jobs:
######################
###### Linux #########
######################
Linux:
name: 🐧 ${{ matrix.os.description }}
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
os: [
{ distribution: debian, codename: buster, description: Debian Buster (x86_64), architecture: [ amd64, linux/amd64 ], platform: x11 },
{ distribution: debian, codename: buster, description: Debian Buster (Raspberry Pi 1 & Zero 1), architecture: [ armv6, linux/arm/v6 ], platform: rpi },
{ distribution: debian, codename: buster, description: Debian Buster (Raspberry Pi 2), architecture: [ armv7, linux/arm/v7 ], platform: rpi },
{ distribution: debian, codename: buster, description: Debian Buster (Raspberry Pi 3/4/5 & Zero 2), architecture: [ arm64, linux/arm64 ], platform: rpi },
{ distribution: debian, codename: bullseye, description: Debian Bullseye (x86_64), architecture: [ amd64, linux/amd64 ], platform: x11 },
{ distribution: debian, codename: bullseye, description: Debian Bullseye (Raspberry Pi 2), architecture: [ armv7, linux/arm/v7 ], platform: rpi },
{ distribution: debian, codename: bullseye, description: Debian Bullseye (Raspberry Pi 3/4/5 & Zero 2), architecture: [ arm64, linux/arm64 ], platform: rpi }
]
isQt5:
- ${{ inputs.qt_version == '5' }}
exclude:
- isQt5: true
os: { distribution: debian, codename: bullseye }
- isQt5: false
os: { distribution: debian, codename: buster }
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 🔧 Prepare
shell: bash
run: |
echo '::group::Append PR number to version (PR only)'
if [[ "${{ inputs.event_name }}" = "pull_request" ]]; then
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ inputs.pull_request_number }}" >> .version
fi
echo '::endgroup::'
- name: 👷 Build
shell: bash
run: ./.github/scripts/build.sh
env:
DOCKER_IMAGE: ${{ matrix.os.distribution }}
DOCKER_TAG: ${{ matrix.os.codename }}${{ inputs.qt_version == '6' && '-qt6' || '' }}
PLATFORM: ${{ matrix.os.platform }}
TARGET_ARCH: ${{ matrix.os.architecture[1] }}
- name: 📦 Upload
if: ${{ inputs.publish || inputs.event_name == 'pull_request' }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.event_name == 'pull_request' && env.NAME || format('artifact-{0}', env.NAME) }}
path: ${{ inputs.event_name == 'pull_request' && 'deploy/*.tar.gz' || 'deploy/Hyperion-*' }}
env:
NAME: ${{ format('{0}_{1}_{2}{3}', matrix.os.distribution, matrix.os.codename, matrix.os.architecture[0], inputs.qt_version == '6' && '_qt6' || '') }}
######################
###### macOS #########
######################
macOS:
name: 🍏 macOS x64
runs-on: macos-latest
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 🔧 Prepare
shell: bash
run: |
echo '::group::Append PR number to version (PR only)'
if [[ "${{ inputs.event_name }}" = "pull_request" ]]; then
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ inputs.pull_request_number }}" >> .version
fi
echo '::endgroup::'
echo '::group::Update/Install dependencies'
brew untap --force homebrew/core homebrew/cask
brew update || true
brew install qt@${{ inputs.qt_version }} vulkan-headers ninja libftdi || true
echo '::endgroup::'
- name: Temporarily downgrade CMake to 3.28.3 # Please remove if GitHub has updated Cmake (greater than 3.30.0)
uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.28.3'
- name: 👷 Build
shell: bash
run: ./.github/scripts/build.sh
env:
PLATFORM: osx
- name: 📦 Upload
if: ${{ inputs.publish || inputs.event_name == 'pull_request' }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.event_name == 'pull_request' && env.NAME || format('artifact-{0}', env.NAME) }}
path: 'build/Hyperion-*'
env:
NAME: ${{ inputs.qt_version == '6' && 'macOS_x64_qt6' || 'macOS_x64' }}
######################
###### Windows #######
######################
windows:
name: 🪟 Windows x64
runs-on: windows-2022
env:
VCINSTALLDIR: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC'
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: 🔧 Prepare PR
if: ${{ inputs.event_name == 'pull_request' }}
shell: bash
run: |
echo '::group::Append PR number to version'
tr -d '\n' < .version > temp && mv temp .version
echo -n "+PR${{ inputs.pull_request_number }}" >> .version
echo '::endgroup::'
- name: 💾 Cache/Restore
uses: actions/cache@v4
with:
path: C:\Users\runneradmin\AppData\Local\Temp\chocolatey
key: ${{ runner.os }}${{ '-chocolatey' }}
- name: 📥 Install DirectX SDK, OpenSSL, libjpeg-turbo
shell: powershell
run: |
choco install --no-progress directx-sdk -y
choco install --no-progress ${{env.OPENSSL}} -y
Invoke-WebRequest https://netcologne.dl.sourceforge.net/project/libjpeg-turbo/3.0.1/libjpeg-turbo-3.0.1-vc64.exe -OutFile libjpeg-turbo.exe -UserAgent NativeHost
.\libjpeg-turbo /S
env:
OPENSSL: ${{ inputs.qt_version == '6' && 'openssl' || 'openssl --version=1.1.1.2100' }}
- name: Install Vulkan SDK
if: ${{ inputs.qt_version == '6' }}
uses: jakoch/install-vulkan-sdk-action@v1.0.6
with:
install_runtime: false
cache: true
stripdown: true
- name: 📥 Install Qt
uses: jurplel/install-qt-action@v4
with:
version: ${{ inputs.qt_version == '6' && '6.8' || '5.15.*' }}
target: 'desktop'
modules: ${{ inputs.qt_version == '6' && 'qtserialport qtwebsockets' || '' }}
cache: 'true'
cache-key-prefix: 'cache-qt-windows'
- name: 🛠️ Setup MSVC
shell: cmd
run: call "${{env.VCINSTALLDIR}}\Auxiliary\Build\vcvars64.bat"
- name: Temporarily downgrade CMake to 3.28.3 # Please remove if GitHub has updated Cmake (greater than 3.30.0)
uses: jwlawson/actions-setup-cmake@v2
with:
cmake-version: '3.28.3'
- name: 👷 Build
shell: bash
run: ./.github/scripts/build.sh
env:
PLATFORM: windows
- name: 📦 Upload
if: ${{ inputs.publish || inputs.event_name == 'pull_request' }}
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.event_name == 'pull_request' && env.NAME || format('artifact-{0}', env.NAME) }}
path: ${{ inputs.event_name == 'pull_request' && 'build/*.exe' || 'build/Hyperion-*' }}
env:
NAME: ${{ inputs.qt_version == '6' && 'windows_x64_qt6' || 'windows_x64' }}
#####################################
###### Publish GitHub Releases ######
#####################################
github_publish:
name: 🚀 Publish GitHub Releases
if: ${{ inputs.qt_version == '5' && inputs.publish }}
needs: [Linux, macOS, windows]
runs-on: ubuntu-latest
steps:
- name: ⬇ Checkout
uses: actions/checkout@v4
- name: 🔧 Prepare
run: |
echo '::group::Generate environment variables from .version and tag'
echo "TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
echo "VERSION=$(tr -d '\n' < .version)" >> $GITHUB_ENV
echo '::endgroup::'
- name: 💾 Artifact download
uses: actions/download-artifact@v4.1.8
with:
pattern: artifact-*
path: all-artifacts
- name: 📦 Upload
uses: softprops/action-gh-release@v2
with:
name: Hyperion ${{ env.VERSION }}
tag_name: ${{ env.TAG }}
files: "all-artifacts/**"
draft: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,21 +0,0 @@
name: 🚀 Release Actions
run-name: 🚀 Let HyperBian create
on:
release:
types: [published]
jobs:
hyperbian:
name: 🚀 Let HyperBian create
runs-on: ubuntu-latest
steps:
# Dispatch event to build new HyperBian image
- name: 📲 Dispatch HyperBian build
uses: peter-evans/repository-dispatch@v3.0.0
if: ${{ github.repository_owner == 'hyperion-project'}}
with:
repository: hyperion-project/HyperBian
token: ${{ secrets.HYPERION_BOT_TOKEN }}
event-type: hyperion_push

34
.gitignore vendored
View File

@ -17,37 +17,3 @@ CMakeCache.txt
/lib /lib
.directory .directory
*.pyc *.pyc
compile_commands.json
# Autogenerated by flatbuffers
libsrc/flatbufserver/hyperion_reply_generated.h
libsrc/flatbufserver/hyperion_request_generated.h
# Kdevelop project files
*.kdev*
# Visual Studio 2015/2017/2019 cache/options directory
# Ignore
.vs/*
CMakeSettings.json
/out
# Allow
!.vs/launch.vs.json
# LedDevice 'File' output
NULL
# Docker deploy folder
deploy/*
# ccache/buildcache
.*cache/
# release-deps/debug-deps
*-deps/
# User defined CMake preset file.
CMakeUserPresets.json
#Configurations created under config for testing
/configs

13
.gitmodules vendored
View File

@ -1,17 +1,12 @@
[submodule "dependencies/external/rpi_ws281x"] [submodule "dependencies/external/rpi_ws281x"]
path = dependencies/external/rpi_ws281x path = dependencies/external/rpi_ws281x
url = https://github.com/hyperion-project/rpi_ws281x url = https://github.com/hyperion-project/rpi_ws281x.git
branch = main branch = master
[submodule "dependencies/external/flatbuffers"] [submodule "dependencies/external/flatbuffers"]
path = dependencies/external/flatbuffers path = dependencies/external/flatbuffers
url = https://github.com/google/flatbuffers url = https://github.com/google/flatbuffers
branch = master branch = master
[submodule "dependencies/external/protobuf"] [submodule "dependencies/external/protobuf"]
path = dependencies/external/protobuf path = dependencies/external/protobuf
url = https://github.com/protocolbuffers/protobuf url = https://github.com/hyperion-project/protobuf.git
[submodule "dependencies/external/qmdnsengine"] branch = master
path = dependencies/external/qmdnsengine
url = https://github.com/nitroshare/qmdnsengine.git
[submodule "dependencies/external/mbedtls"]
path = dependencies/external/mbedtls
url = ../../Mbed-TLS/mbedtls.git

66
.travis.yml Normal file
View File

@ -0,0 +1,66 @@
linux: &linux
os: linux
dist: xenial
services:
- docker
osx: &osx
os: osx
cache:
- ccache
- directories:
- $HOME/brew-cache
notifications:
email: false
language: cpp
before_install:
- ./.ci/ci_install.sh
jobs:
include:
- <<: *linux
name: "AMD64 (x64)"
env:
- DOCKER_TAG=amd64
- DOCKER_NAME="Debian Stretch (AMD64)"
- PLATFORM="x11"
- <<: *linux
name: "i386 (x86)"
env:
- DOCKER_TAG=i386
- DOCKER_NAME="Debian Stretch (i386)"
- PLATFORM="x11"
# ////////////////////////////////////////////////////////////////
# NOTE: Temporary disabled because travis timeouts
# ////////////////////////////////////////////////////////////////
# - <<: *linux
# name: "ARMv6hf (Raspberry Pi v1 & ZERO)"
# env:
# - DOCKER_TAG=armv6hf
# - DOCKER_NAME="Debian Stretch (Raspberry Pi v1 & ZERO)"
# - PLATFORM="rpi"
# - <<: *linux
# name: "ARMv7hf (Raspberry Pi 2 & 3)"
# env:
# - DOCKER_TAG=armv7hf
# - DOCKER_NAME="Debian Stretch (Raspberry Pi 2 & 3)"
# - PLATFORM="rpi"
# - <<: *linux
# name: "ARMv8 (Generic AARCH64)"
# env:
# - DOCKER_TAG=aarch64
# - DOCKER_NAME="ARMv8 (Generic AARCH64)"
# - PLATFORM="amlogic"
#
# ////////////////////////////////////////////////////////////////
- <<: *osx
osx_image: xcode11.2
name: "macOS 10.14 (Xcode 11.2.1)"
env:
- HOMEBREW_CACHE=$HOME/brew-cache
- PLATFORM="osx"
script:
- ./.ci/ci_build.sh

View File

@ -1 +0,0 @@
2.0.17-beta.2

View File

@ -1,47 +0,0 @@
{
"version": "0.2.1",
"defaults": {},
"configurations": [
{
"type": "default",
"project": "CMakeLists.txt",
"projectTarget": "hyperiond.exe (bin\\hyperiond.exe)",
"name": "Run Hyperion"
},
{
"type": "default",
"project": "CMakeLists.txt",
"projectTarget": "hyperiond.exe (bin\\hyperiond.exe)",
"name": "Run hyperion with debug logging and external console",
"args": [
"-d",
"-c"
],
"externalConsole": true
},
{
"type": "default",
"project": "CMakeLists.txt",
"projectTarget": "hyperiond.exe (bin\\hyperiond.exe)",
"name": "Run hyperion with verbose logging with external console",
"args": [
"-v",
"-c"
],
"externalConsole": true
},
{
"type": "default",
"project": "CMakeLists.txt",
"projectTarget": "hyperiond.exe (bin\\hyperiond.exe)",
"name": "Run hyperion with debug logging and a test configuration DB",
"args": [
"-d",
"-c",
"-u",
"${workspaceRoot}\\configs\\testConfig"
],
"externalConsole": true
}
]
}

View File

@ -1,34 +0,0 @@
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include/**"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"intelliSenseMode": "gcc-x64",
"cppStandard": "c++11",
"cStandard": "c11",
"configurationProvider": "ms-vscode.cmake-tools"
},
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"C:/Qt/5.15.0/msvc2019_64/include/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"cStandard": "c11",
"cppStandard": "c++11",
"intelliSenseMode": "msvc-x64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}

View File

@ -1,23 +0,0 @@
{
"folders": [
{
"path": "../"
}
],
"settings": {
"editor.formatOnSave": false,
"cmake.environment": {
},
},
"extensions": {
"recommendations": [
"twxs.cmake",
"ms-vscode.cpptools",
"ms-vscode.cmake-tools",
"spmeesseman.vscode-taskexplorer",
"yzhang.markdown-all-in-one",
"vscode-icons-team.vscode-icons",
"editorconfig.editorconfig"
]
}
}

50
.vscode/launch.json vendored
View File

@ -1,50 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(Linux) hyperiond",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/bin/hyperiond",
"args": ["-d"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "(Windows) hyperiond",
"type": "cppvsdbg",
"request": "launch",
"program": "${command:cmake.launchTargetDirectory}/hyperiond",
"args": ["-d"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"console": "internalConsole"
},
{
"name": "(macOS) Hyperion.app",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/bin/Hyperion.app/Contents/MacOS/Hyperion",
"args": ["-d"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"console": "internalConsole",
"MIMode": "lldb"
}
]
}

1
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1 @@
{}

123
.vscode/tasks.json vendored
View File

@ -1,123 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "cmake:conf Release",
"detail": "Configure Build Env. Release/Debug switch not required for multi generators (msvc)",
"type": "shell",
"command": "cmake -B ${workspaceFolder}/build -DCMAKE_BUILD_TYPE=Release",
"windows": {
"command": "cmake -G \"Visual Studio 16 2019\" -A x64 -B ${workspaceFolder}/build"
},
"group": "build"
},
{
"label": "cmake:conf Debug",
"detail": "Configure Build Env. Release/Debug switch not required with msvc",
"type": "shell",
"command": "cmake -B ${workspaceFolder}/build -DCMAKE_BUILD_TYPE=Debug",
"windows": {
"command": "cmake -G \"Visual Studio 16 2019\" -A x64 -B ${workspaceFolder}/build"
},
"group": "build"
},
{
"label": "build:debug hyperiond",
"type": "shell",
"command": "cmake --build ${workspaceFolder}/build --target hyperiond -- -j $(nproc)",
"windows": {
"command": "cmake --build ${workspaceFolder}/build --target hyperiond --config Debug -- -maxcpucount"
},
"osx": {
"command": "cmake --build ${workspaceFolder}/build --target hyperiond -- -j $(sysctl -n hw.ncpu)"
},
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "build:debug all",
"type": "shell",
"command": "cmake --build ${workspaceFolder}/build -- -j $(nproc)",
"windows": {
"command": "cmake --build ${workspaceFolder}/build --config Debug -- -maxcpucount"
},
"osx": {
"command": "cmake --build ${workspaceFolder}/build -- -j $(sysctl -n hw.ncpu)"
},
"group": "build"
},
{
"label": "build:debug package",
"type": "shell",
"command": "cmake --build ${workspaceFolder}/build --target package -- -j $(nproc)",
"windows": {
"command": "cmake --build ${workspaceFolder}/build --target package --config Debug -- -maxcpucount"
},
"osx": {
"command": "cmake --build ${workspaceFolder}/build --target package -- -j $(sysctl -n hw.ncpu)"
},
"group": "build"
},
{
"label": "build:release hyperiond",
"type": "shell",
"command": "cmake --build ${workspaceFolder}/build --target hyperiond -- -j $(nproc)",
"windows": {
"command": "cmake --build ${workspaceFolder}/build --target hyperiond --config Release -- -maxcpucount"
},
"osx": {
"command": "cmake --build ${workspaceFolder}/build --target hyperiond -- -j $(sysctl -n hw.ncpu)"
},
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "build:release all",
"type": "shell",
"command": "cmake --build ${workspaceFolder}/build -- -j $(nproc)",
"windows": {
"command": "cmake --build ${workspaceFolder}/build --config Release -- -maxcpucount"
},
"osx": {
"command": "cmake --build ${workspaceFolder}/build -- -j $(sysctl -n hw.ncpu)"
},
"group": "build"
},
{
"label": "build:release package",
"type": "shell",
"command": "cmake --build ${workspaceFolder}/build --target package -- -j $(nproc)",
"windows": {
"command": "cmake --build ${workspaceFolder}/build --target package --config Release -- -maxcpucount"
},
"osx": {
"command": "cmake --build ${workspaceFolder}/build --target package -- -j $(sysctl -n hw.ncpu)"
},
"group": "build"
},
{
"label": "run:hyperiond (Debug)",
"type": "shell",
"command": "${workspaceFolder}/build/bin/hyperiond -d",
"windows": {
"command": "${workspaceFolder}/build/bin/Debug/hyperiond -d -c"
},
"group": "build"
},
{
"label": "run:hyperiond (Release)",
"type": "shell",
"command": "${workspaceFolder}/build/bin/hyperiond -d",
"windows": {
"command": "${workspaceFolder}/build/bin/Release/hyperiond -d -c"
},
"group": "build"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@ -1,757 +0,0 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased](https://github.com/hyperion-project/hyperion.ng/compare/2.0.16...HEAD)
### Breaking
**JSON-API**
- Align JSON subscription update elements. `ledcolors-imagestream-update, ledcolors-ledstream-update, logmsg-update` now return data via `data` and not `result
- Global global configuration elements are now separated form instance specific ones
### Added
- Support for ftdi chip based LED-devices with ws2812, sk6812 apa102 LED types (Many thanks to @nurikk) (#1746)
- Support for Skydimo devices
- Support gaps on Matrix Layout (#1696)
- Windows: Added a new grabber that uses the DXGI DDA (Desktop Duplication API). This has much better performance than the DX grabber as it does more of its work on the GPU.
- Support to import, export and backup Hyperion's full configuration via the UI, JSON-API and commandline (`--importConfig, --exportConfig`) (#804)
- Allow to force starting Hyperion in read-only mode (`--readonlyMode`)
- JSON-API: Support to query for a dedicated set of configuration items for a set of instances
- JSON-API: Support to save a dedicated set of configuration items for a set of instances
- JSON-API: Limit update emission frequency: Images (25Hz), raw LED-Colors (40Hz) & LED-Device data (200Hz)
- Effects: Limit the maximum update rate to 200Hz
**JSON-API**
- New subscription support for event updates, i.e. `Suspend, Resume, Idle, idleResume, Restart, Quit`.
- Support direct or multiple instance addressing via single requests (#809)
- Support of `serverinfo` subcommands: `getInfo, subscribe, unsubscribe, getSubscriptions, getSubscriptionCommands`
- [Overview](https://github.com/hyperion-project/hyperion.ng/blob/API_Auth/doc/development/JSON-API%20_Commands_Overview.md) of API commands and subscription updates
### Changed
- Fixed: Cross Site Scripting Vulnerability (CVE-2024-4174, CVE-2024-4175)
- Fixed: hyperion-v4l2 taking screenshot failed (#1722)
- Nanoleaf: Support new devices and do not restore ExtControl state
- Workaround to address Web UI keeps forcing browser to download the html instead (#1692)
- Fixed: Kodi Color Calibration, Refactor Wizards (#1674)
- Fixed: Token Dialog not closing
- Fixed: Philip Hue APIv2 support without Entertainment group defined (#1742)
- Refactored: Database access layer
- Refactored: Hyperion's configuration database is validated before start-up (and migrated, if required)
- Refactored: Python to enable parallel effect processing under Python 3.12
- Fixed: Python 3.12 crashes (#1747)
- osX Grabber: Use ScreenCaptureKit under macOS 15 and above
- Removed maximum LED number constraint from Matrix layout schema which was not synced with the UI behaviour (#1804)
- Fixed bespoke WebSocket implementation by using of QWebSockets (#1816, #1448, #1247, #1130)
**JSON-API**
- Refactored JSON-API to ensure consistent authorization behaviour across sessions and single requests with token authorization.
- Provide additional error details with API responses, esp. on JSON parsing, validation or token errors.
- Generate random TANs for every API request from the Hyperion UI
- Fixed: Handling of IP4 addresses wrapped in IPv6 for external network connections-
- Fixed: Local Admin API Authentication rejects valid tokens (#1251)
### Removed
**JSON-API**
- Removed ability to enable/disable local admin authorization. All admin commands require authorization, i.e. `authorize-adminRequired` will always be `true`.
- Removed `session-updates` subscription
- `serverinfo/subscribe` element will be deprecated and replaced by corresponding subcommand
## [2.0.16](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.16) - 2024-01
### Added
- New languages: Hebrew, Indonesian, Ukrainian
**Event Services**
Newly introduced Event Service configuration and consistent handling across all components
- Suspend/Resume & Screen Locking support for MaxOS
- Allow to enable/disable suspend & lock on operating system events (#1633, #1632)
- Scheduled events allowing to suspend,resume, etc. (#1088)
- Configurable CEC event handling
##### LED-Devices
**Philips Hue**
- APIv2 support, incl. full https security and certificate validation
- Multi-Segment device support, e.g. Gradient light
- Use Entertainment area device location for Hyperion layout in addition to manual locations
- Option to layout by focussing on full- or only center of entertainment area
- Wizard supports multiple Hue-Bridge discovery
- Support of DIYHue specifics. DIYHue bridge's name must start with "DIY"
- Backward compatibility for bridges not supporting APIv2 and/or Entertainment API
Note: The wizard will configure an APIv2 capable bridge always with Entertainment to ensure the best experience.
**Nanoleaf**
- Wizard to generate user authorization token allowing users to configure the device via a single window
- Generation of a default layout per device's configuration, including orientation
- Lines support
### Changed
- Updated misleading error messages in case Hyperion is not able to support the suspend/lock feature (#1622)
- Restart Serial Device, if write error occurred
- ws281x - Update logic to identify is user is admin and disable device configuration if not (#1621)
- Hide Hyperion from the Dock on macOS, as all features can be accessed from the menubar - Thanks @Rastafabisch
### Fixed
- Correctly display local language characters in log, e.g. Umlauts
- Fixed that Audio Capture is enabled after reboot automatically (#1581)
- Fixed that Audio Capture is not shown when there is no screen nor video grabber
- Audio Capture settings are no longer ignored (#1630)
- Fixed that the Matrix effect finds its image - Thanks @lsellens
- MDNSBrower - Fixed, if timeout while resolving host occurs
- Non image updates ignored blacklisted LEDs (#1634)
- Fixed that Windows OsEvents failed in non-GUI mode (#1671)
- Addressed serious (#1425) and some smaller memory leaks
##### LED-Devices
**WLED**
- Fixed UI handling, if segment streaming is not supported
**Nanoleaf**
- "Panel numbering sequence" was not configurable any longer
- Number of panels increased during retries (#1643)
### Removed
##### LED-Devices
**Philips Hue**
- "Switch Off On Black" for APIv2, as the original bridge will switch off LEDs itself.
- "Candy Gamma" for APIv2, as the bridge maps the RGB values best per device.
**Nanoleaf**
- Removed "Start Position" in favour of the general Blacklist feature provided
### Technical
- Changed default build from Stretch to Buster
- Support Qt 6.7, Update to Protobuf 25.1, Update mbedTLS to v3.4.0, Update flatbuffers to v23.5.26
- Use C++17 standard as default
- Started using SmartPointers (#981)
- Added Pull Request (PR) installation script, allowing users to test development builds savely on Linux
- Fixed missing include limits in QJsonSchemaChecker - Thanks @Portisch
- Fixed dependencies for deb packages in Debian Bookworm (#1579) - Thanks @hg42, @Psirus
- Fixed git version identification when run in docker and local code
- Address cmake deprecation warnings, cmake 3.5 is required at minimum now
- Address some build warnings
- Removed UniqueConnections from Lambdas, as not supported
## [2.0.15](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.15) - 2023-02
### Added
- Audio Grabber to add audio visualization support for both Windows and Linux.
- Support streaming to individual WLED segments (requires WLED 0.13.3+).
To allow segment streaming, enable "Realtime - Use main segment only" in WLED's Sync Interfaces setup screen
- Allow to keep WLED powered on after streaming and restoring state
- Allow to Disable / Enable all instances (#970) by
- Suspend/Resume support for Linux and Windows (#1493,#1282, #978).
Suspend/Resume/Restart is supported via API, UI, Systray and hyperion-remote
- Idle scenario via Screen Locking (Linux/Windows), Screensaver invokation (Linux), hyperion-remote or API
In Idle, all instances, components will be disabled besides the output processing (LED-Devices, smoothing).
The current priorities will be cleared and the background effect per instance will be executed, if enabled.
- Commands toogleSuspend and toggleIdle allow to flip between modes, e.g. might be used to trigger modes by a remote
- Reduced pixel processing to reduce resources on big assignment areas
- Support for squared mean color processing
- Support for dominant color processing on assigned LED areas (#1382). A simple and advanced way is provided. Advanced and high accuracy might be combined with reduced pixel processing to lower CPU usage.
- Add instance# in API response (#1504)
### Changed
- REST API - Increased default timeout to address "Operation cancelled" errors
- LED Devices: Allow to differentiate between recoverable/unrecoverable errors
- Renamed LED area assignment naming to provide clarity on the processing algorithms
- Updated SEDU default baud rates
### Fixed
- Effects/Smoothing: Effects with dedicated smoothing settings will now run with those settings (even if general smoothing is off)
- No interim color update after streaming and turning off WLED
- LED-Matrix Layout: Add Cabling direction selection element again (#1566)
- Restart correctly, if running as service (#1368)
- Hue-Wizard: In case auto discovery failed, port 80 was not used as default (#1544)
- Send only one reply per Start Instance request (#1551)
- Add instance# in JSON-API replies (aligning to Add instance in websocket response to a subscription #1504 behaviour)
- hyperion-remote: Extracting reply for a configGet request correctly (#1555)
- Grabber fps setting was not applied correctly
- Smoothing: No empty updates
### Technical
- Add CodeQL for GitHub code scanning
- Update to Protocol Buffers 3.21.12
- Update to Mbed TLS 3.3.0
- Qt6 alignments
- cmake support of libcec without version in lib-name
- Refactor for Python 3.11 deprecated functions
## Removed
## [2.0.14](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.14) - 2022-11
Hyperion's November release is not too big, but provides you with the latest updates and fixes. Many thanks to all contributors providing code (xkns, drzony) or translations.
### Added
- New color processing settings: Saturation gain and brightness/value gain. They allow compensating washed out HDR colors on LEDs (#822, #1092, #1142 partially).
- New languages: Catalan & Greek
- USB Capture: Support 3D processing for MJPEG
- Forwarding: Support flat-/proto buffer input
- Adalight: HyperSerial support (High speed protocol by awawa-dev) and support device feedback, show statistics provided by HyperSerial (modified by LordGrey) sketch
- AtmoOrb: Firmware image for Particle/Photon
### Changed
- Serial LED-devices: Ability to select standard Baud rates, as well as defining a custom one
- LED-devices: Do not switch-off device, if background effect is configured and will kick-in soon
### Fixed
- USB-Grabber: Fixed a SEGFAULT when compiled on Ubuntu Server 22.04
- USB Grabber: Fixed memory leak when transforming MJPEG
- ImageResampler: Apply only half crop for 3D to maintain crop ratio
- Remote Control: Update Color calibration values when calibration settings were saved
- Fixed Smoothing got out of sync when saving configuration
- Smoothing: Removed "outputrate" as duplicate to update frequency
- Queue LED-device on/off signals
- UI: Correctly lookup current Instance Name
- Fixed AtmoOrb firmware image
## [2.0.13](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.13) - 2022-05-22
### Added
- Allow to build a "light" version of Hyperion, i.e. no grabbers, or services like flat-/proto buffers, boblight, CEC
- Allow to restart Hyperion via Systray
- mDNS support for all platforms inkl. Windows (#740)
- Forwarder: mDNS discovery support and ease of configuration of other Hyperion instances
- Grabber: mDNS discovery for standalone grabbers
- Grabber: Dynamic loading of the Dispmanx Grabber (#1418)
- Flatbuffer/Protobuf are now able to receive RGBA data
- Added the instance number as part of the logline (#910). In the UI Log the instance is presented as a readable name.
- New language: Japanese
##### LED-Devices
- Support retry attempts enabling devices, e.g. to open devices after network or a device itself got available (#1302). Fixes that devices got "stuck", if initial open failed e.g. for WLED, Hue
- New UDP-DDP (Distributed Display Protocol) device to overcome the 490 LEDs limitation of UDP-RAW
- mDNS discovery support and ease of configuration (Cololight, Nanoleaf, Philips-Hue, WLED, Yeelight); removes the need to configure IP-Address, as address is resolved automatically.
- Allow to disable switching LEDs on during startup (#1390)
- Support additional Yeelight models
- Show warning, if get properties failed (Network devices: indication that network device is not reachable)
- LED Layout Classic: Support keystone correction via draggable corner LEDs
- LED Layout Matrix: Support vertical cabling direction (#1420)
### Changed
- Color Smoothing is started in pause mode to save resources, when Hyperion starts with no active source
- Boblight: Support multiple Boblight clients with different priorities
- UI: LED Preview has been given a touch of Ambilight.
- UI: Allow configuration of a Boblight server per LED-instance
- UI: LED Layout - Removed limitations on indention
- UI: Log output and LED preview window can be maximized
- mDNS Publisher: Aligned Hyperion mDNS names to general conventions and simplified naming
##### LED-Devices
- Refactored Philips Hue wizard and LED-Device
- WLED's default streaming protocol is now UDP-DDP. More than 490 LEDs are supported now (requires minimum WLED 0.11.0). UDP-RAW is still supported in parallel (via expert settings).
- Present all serial/TTY devices during discovery in expert mode; no filtering on existing vendor-identifier (Adalight serial USB does not show up in GUI #1458)
### Fixed
- UI: Ensure all configuration and system info response are there before reloading the page (#1430)
- UI: Show all previous log lines in the Log UI (was only working for Debug before)
- UI: Remote control: Treat duration=0 as endless
- UI: Stop Web-Browser capture when user triggers other activities
- Effects: Fix image URL in Matrix effect
- Effects: Fix that start effect is stuck on UI
- Effects: Fixed that effect specific smoothing setup was not applied when effect is started from available- or effects under configuration
- Qt-Grabber: Fixed position handling of multiple monitors (#1320, #1403)
- Standalone grabbers: Improved fps help/error text, fixed default address and port, fixed auto discovery of Hyperion server in hyperion-remote
- hyperion-remote: Show image filename in UI for images sent
- Reworked PriorityMuxer and Subscriptions
- PriorityMuxer: Fix crash when running fore- and background effect in parallel during start-up
- Update Priority, if first LED changes for COLOR update (to reflect color correctly in UI)
- Start JSON and WebServer only, if Hyperion's instance 0 is available
- Treat http headers case insensitive (RFC 2616)
- Fixed: Signal detection does not switch off all instances (#1281)
- Do not kill application on SIGILL-signal (#1435)
- Fixed Qt version override, e.g. set via QTDIR
- Update jsonschema and checkschema to allow checking hyperion.config.json.default on Windows
##### LED-Devices
- Fixes that the Led-Device output flow was interrupted, by an enabling API request on an already enabled device (#967)
- Yeelight - Workaround: Ignore error when setting music mode = off, but the music-mode is already off (#1372)
- Fixed: Hue Entertainment mode does not resume after no signal (#930)
## Removed
- UI: Removed sessions (of other Hyperions)
- Replaced existing AVAHI/Bonjour code by QMdnsEngine
## [2.0.12](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.12) - 2021-11-20
Hyperion's November release brings you some new features, removed IPv6 address related limitations, as well as fixing a couple of issues.
Hyperion packages can be installed now under Ubuntu (x64) and Debian (amd64/armhf) (incl. Raspberry Pi OS) via our own APT server.
Details about the installation can be found in the installation.md and at apt.hyperion-project.org.
### Added
- New LED-device type: Razor Chroma.
Note: Due to Chroma Razer API limitations, only one device can be configured.
- APA102 - Support setting maximum brightness level (1-31)
- New installation method (Drag'n Drop) for macOS.
- hyperion-remote & standalone grabbers: IPv6 support
- New languages: Danish & Hungarian
### Changed
- LED-Devices: Removed IPv6 limitations
- Philips-Hue Wizard optimizations
- JSON/Flatbuffer forwarder: Removed IPv6 limitations
- Allow to import configurations from previous versions
Note: Existing configurations are migrated to new structures automatically
### Fixed
- Fixed API Subscription (e.g. as used by HomeAssistant) (#1351)
- Fixed APA102 protocol aligning to the standard defined, removed Latch-Time as not required by APA102 protocol (#1352, #1132)
- Fixed hyperion-remote when sending multiple Hex-Colors with "Set Color" option
- UI: Fixed "Selected Hyperion instance isn't running" issue (#1357)
- Fixed Database migration version handling
- Fixed Python ModuleNotFoundError (#1109)
### Technical
- Added Qt6 support
- Migrated to MBEDTSL 3
## [2.0.0-alpha.11](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.11) - 2021-10-06
The release is primarily fixing issues introduced with alpha 10, but covering other findings too.
Thanks to everybody highlighting real problem areas, as well as to those proactively providing fixes for integration via pull requests.
Besides bug fixing, you will find some smaller enhancements which make everybodys life easier.
The fact that WS281x devices must run under root caused many headaches before in getting them running.
We did not weaken security, but provide you with an easy to use script to switch the user-id of hyperion going forward. Furthermore, device configuration is blocked, if the environment does not allow it.
### Added:
- Script to change the user Hyperion is executed with.
To run Hyperion with root privileges (e.g. for WS281x) execute <br> `sudo updateHyperionUser -u root`
- Gif effects can source Gifs via URLs in addition to local files as input
- System info screen: Added used config path and "is run under root/admin"
- LED-Device enhancements
- WS281x: Ensure that a device cannot be configured via the UI when Hyperion is not run with root privileges
- Nanoleaf: Support discovering additional Nanoleaf devices, e.g. Shapes
- Nanoleaf: Ability to restore state when Hyperion stops streaming<br>
Note: In case previous state was a dynamic/temporary effect, the state cannot be restored
- Nanoleaf: New Feature: allow to overwrite brightness by Hyperion
### Changed:
- The Systemd/Upstart/System-V-Init service registers Hyperion under the name hyperion instead of hyperiond, as this has caused confusion among users in the past.
- WLED and UDP-Raw: Limit maximum LEDs number to 490
- WS281x: Update DMA default as per rpi_ws281x recommendation
- Smoothing is paused when no input source is available (to save resources)
- Disable LED update streaming, if LED updates are not required, Sync. Video-Streaming between Layout and Simulation
- Load configuration of last instance used when loading the UI page, Streamline API requests to avoid unnecessary invocations (#1311)
- BobLight: Priorities are not limited any longer. BobLight can feed Priorities [2-253], default is still 128 (#1269)
- Amlogic grabber: Limit grabber to 30fps during discovery
- Amlogic grabber: Continuous image feed even when paused (to not have LEDs switched off), plus no delay when pausing/unpausing
### Fixed:
- Fixed that Smoothing with "Continuous Updates" disabled does not provides LED updates (#1068, #1240)
- Fixed Issue Blinking / flickering cursor with QT screen capture on Windows (#1328)
- Fixed Colour effect priority is not deleted when Colorpicker is open (double click on delete is required)
- Fixed reuse local SSDP address (#1324)
- Exclude FB Grabber on Amlogic platform, as FB is included in Amlogic Grabber
- Escape XSS payload to avoid execution (#1292)
- Include libqt5sql5-sqlite packaging dependency
- Fixed embedded Python location (#1109)
- LED-Devices
- Fixed Philips Hue wizard (#1276)
- Fixed AtmoOrb wizard
- Fixed that Lightpack device does not core when lack of permissions error (LIBUSB_ERROR_ACCESS)
- Fixed Atmo/Karate LED count constraint handling
- Fixed Hue, Disable LED general options (HW Led count & RGB Byte order) as calculated
- Fixed SPI, Tpm2.Net - Memory issues
- Fixed: Nanoleaf does not turn on
- Fixed LED layout - Additional parameters for classic layout were not saved (#1314)
- Fixed Network LED-Device UI: Trigger getProperties for the configured host, when no hosts were discovered
### Removed:
- Smoothing: Removed "Continuous Updates" flag as it is obsolete.
In case an LED-device requires continuous updates, use the LED-Device's "Rewrite Time" parameter.
## [2.0.0-alpha.10](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.10) - 2021-07-17
The focus of this release is on user experience.
We tried as much as possible supporting you in getting valid setup done, as well as providing enough room for expert users to tweak configurations here and there.
The reworked dashboard provides you now with the ability to control individual components, jump to key configuration items, as well as to switch between LED instances easily.
The refined color coding in the user-interfaces, helps you to quickly identify instance specific and global configuration items.
Of course, the release brings new features (e.g. USB Capture on Windows), as well as minor enhancements and a good number of fixes.
Note:
- **IMPORTANT:** Due to the rework of the grabbers, both screen- and video grabbers are disabled after the upgrade to the new version.
Please, re-enable the grabber of choice via the UI, validate the configuration and save the setup. The grabber should the restart.
- Hyperion packages can now be installed under Ubuntu (x64) and Debian (amd64/armhf) (incl. Raspberry Pi OS) via our own APT server.
Details about the installation can be found in the [installation.md](https://github.com/hyperion-project/hyperion.ng/blob/master/Installation.md) and at [apt.hyperion-project.org](apt.hyperion-project.org).
- Find here more details on [supported platforms and configuration sets](https://github.com/hyperion-project/hyperion.ng/blob/master/doc/development/SupportedPlatforms.md)
### Breaking
### Added
- The Dashboard is now a one-stop control element to control instances and link into configuration areas
- LED Instance independent configuration objects (e.g. capturing hardware) are now separated out in the menu
- New menu item "Sources" per LED instances configuration to enable/disable screen or usb grabber per instance
#### Grabbers
- Windows Media Foundation USB grabber (incl. Media Foundation transform/Turbo-JPEG scaling)
- Linux V4L2 Grabber now supports the following formats: NV12, YUV420
- Image flipping ability in ImageResampler/Turbo-JPEG
- UI: Simplified screens for non-expert usage, do only show elements relevant
- Discover available Grabbers (incl. their capabilities for selection), not supported grabbers are not presented. Note: Screen capturing on Wayland is not supported (given the Wayland security architecture)
- USB Grabber: New ability to configure hardware controls (brightness, contrast, saturation, hue), as well as populating defaults
- Configuration item ranges are automatically adopted based on grabber capabilities,
- Grabbers can only be saved with a valid configuration
- Standalone grabbers: Added consistent options/capabilities for standalone grabbers, debug logging support
- Screen grabbers: Allow to set capture frequency, size decimation and cropping across all grabber types
- Screen grabber: QT-Grabber allows to capture individual displays or all displays in a multi-display setup
- Display Signal Detection area in preview (expert users)
- UI: Only show CEC detection, if supported by platform
#### LED-Devices
- Select device from list of available devices (UI Optimization - Select device from list of available devices #1053) - Cololight, Nanoleaf, Serial Devices (e.g. Adalight), SPI-Device, Pi-Blaster
- Get device properties for automatic configuration of number of LEDs and initial layout (WLED, Cololight, Nanoleaf)
- Identify/Test device (WLED, Cololight, Nanoleaf, Adalight)
- For selected devices a default layout configuration is created, if the user chooses "Overwrite" (WLED, Cololight, Nanoleaf, all serial devices, all spi device, pi-blaster)
- Ensure Hardware LED count matches number of lights (Philips Hue, Yeelight, Atmo Orb)
- User is presented a warning/error, if there is a mismatch between configured LED number and available hardware LEDs
- Add udev support for Serial-Devices
- Allow to get properties for Atmo and Karatedevices to limit LED numbers configurable
- Philips Hue: Add basic support for the Play Gradient Lightstrip
- WLED: Support of ["live" property] (https://github.com/Aircoookie/WLED/issues/1308) (#1095)
- WLED: Brightness overwrite control by configuration
- WLED: Allow to disable WLED synchronization when streaming via hyperion
- WLED: Support storing/restoring state (#1101)
- Adalight: Fix LED Num for non analogue output in arduino firmware
- Allow to blacklist LEDs in layout via UI
- Live Video image to LedLayout preview (#1136)
#### Other
- Effects: Support Custom Effect Templates in UI for custom effect creation and configuration
- Effects: Custom effect separation in the systray menu
- New languages - Portuguese (Std/Brazil) & Norwegian (Bokmål)
- New Flags: Russia, Cameroon, Great Britain, England, Scotland
- Provide cross compilation on x86_64 for developers using docker. This includes the ability to use local code, as well as build incrementally
### Changed
- Grabbers use now precise timings for better timing accuracy
- Nanoleaf: Consider Nanoleaf-Shape Controllers
- LED-Devices: Show HW-Ledcount in all setting levels
- System Log Screen: Support to copy loglines, system info and status of the current instance to the clipboard (to share it for investigation)
- Updated dependency rpi_ws281x to latest upstream
- Fix High CPU load (RPI3B+) (#1013)
### Fixed
- Active grabbers are displayed correctly after updating the WebUI
- Issue Crop values are checked against decimated resolution (#1160)
- Framebuffer grabber is deactivated in case of error
- Fix/no signal detection (#1087)
- Fix that global settings were not correctly reflected across instances after updates in other non default instance (#1131,#1186,#1188)
- Fix UI: Handle error scenario properly, when last instance number used does not exist any longer.
- UI Allow to have password handled by Password-Manager (#1263)
- Fixed effect freezing during startup
- Effects were not started from tray (#1199)
- Interrupt effect on timeout (#1013)
- Fixed color and effect handling and duplicate priorities (#993,#1113,#1216)
- Stop background effect, when it gets out of scope (to not use resources unnecessarily)
- Custom Effect Templates (schemas) are now loaded
- Effects: Uploaded images were not found executing custom image effects
- "LED Test" effect description is in wrong order (#1229)
- LED-Devices: Only consider Hardware LED count (#673)
- LED-Devices: Correct total packet count in tpm2net implementation (#1127)
- LED-Hue: Proper black in Entertainment mode if min brightness is set
- LED-Hue: Minor fix of setColor command
- Nanoleaf: Fixed behaviour, if external control mode cannot be set
- System Log Screen: Fixed Auto-Scrolling, Update Look & Feel, Works across multiple Browser tabs/windows, as log stream is not stopped by a new UI
- Rename Instance and Change Password: Modal did not close
- Read-Only mode was not handled in the SysInfo function
- WebSockets: Handling of fragmented frames fixed
- Fixed libcec dependencies
- General language and grammar updates
### Removed
## [2.0.0-alpha.9](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.9) - 2020-11-18
### Added
- Grabber: DirectX9 support (#1039)
- New blackbar detection mode "Letterbox", that considers only bars at the top and bottom of picture
- LED-Devices: Cololight support (Cololight Plus & Strip) incl. configuration wizard
- LED-Devices: SK9822 support (#1005,#1017)
- UX: New language support: Russian and Chinese (simplified) (#1005)
- UX: Additional details on Hardware/CPU information (#1045)
- UX: Systray icons added - Issue #925 (#1040)
- Read-Only configuration database support
- Hide Window Systray icon on Hyperion exit & Install DirectX Redistributable
- Read-Only configuration database support
### Changed
- boblight: reduce cpu time spent on memcopy and parsing rgb values (#1016)
- Windows Installer/Uninstaller notification when Hyperion is running (#1033)
- Updated Windows Dependencies
- Documentation: Optimized images (#1058)
- UX: Default LED-layout is now one LED only to avoid errors as in #673
- UX: Change links from http to https (#1067)
- Change links from http to https (#1067)
- Cleanup packages.cmake & extend NSIS plugin directory
- Optimize images (#1058)
- Docs: Refreshed EN JSON API documentation
### Fixed
- Color calibration for Kodi 18 (#1044)
- LED-Devices: Karatelight, allow an 8-LED configuration (#1037)
- LED-Devices: Save Hue light state between sessions (#1014)
- LED-Devices: LED's retain last state after clearing a source (#1008)
- LED-Devices: Lightpack issue #1015 (#1049)
- Fix various JSON API issues (#1036)
- Fix issue #909, Have ratio correction first and then scale (#1047)
- Fix display argument in hyperion-qt (#1027)
- Fix Python reset thread state
- AVAHI included in Webserver (#996)
- Fix add libcec to deb/rpm dependency list
- Fix Hyperion configuration is corrected during start-up, if required
- Fix color comparison / Signal detection (#1087)
### Removed
- Replace Multi-Lightpack by multi-instance Lightpack configuration (#1049)
## [2.0.0-alpha.8](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.8) - 2020-09-14
### Added
- Add XCB grabber, a faster and safer alternative for X11 grabbing (#912)
- for Windows: Add binary meta (#932)
- Differentiate between LED-Device Enable/Disable and Switch On/Off (#960) (Fixes: #828)
- AtmoOrb discovery and identification support (#988)
- New AtmoOrb Wizard (#988)
- Added and updated some language files (#900, #926, #916) (DE, CS, NL, FR, IT, PL, RO, ES, SV, TR, VI)
### Changed
- Improved UDP-Device Error handling (#961)
- NSIS/Systray option to launch Hyperion on Windows start (HKCU) (#887)
- Updated some dependencies (#929, #1003, #1004)
- refactor: Modernize Qt connections (#914)
- refactor: Resolve some clang warnings (#915)
- refactor: Several random fixes + Experimental playground (#917)
- Use query interface for void returning X requests (#945)
- Move Python related code to Python module (#946)
- General tidy up (#958)
- AtmoOrb ESP8266 sketch to support device identification, plus small fix (#988)
### Fixed
- webui: Works now with HTTPS port 443 (#923 with #924)
- Adalight issue (#903 with #991)
- Fixed CI: Trigger HyperBian build after release
- Fixed: -DUSE_SYSTEM_MBEDTLS_LIBS=ON - undefined reference (#898)
- set zlib back to system ignore list/revert pr #871 (#904)
- Fixed: logger and led colors (#906)
- Fixed: some more threading errors (#911)
- Fix OSX build (#952)
- AtmoOrb Fix (#988)
- Return TAN to API requests whenever possible (#1002)
## [2.0.0-alpha.7](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.7) - 2020-07-23
### Added
- [HyperBian](https://github.com/hyperion-project/HyperBian/releases) - A Raspberry Pi OS Lite image with Hyperion pre installed. (#832)
- An option to reset (delete) the database for the commandline has been added (#820)
- Improve language selection usability (#812)
- re-added V4L2 Input method from old Hyperion (#825)
- Windows: Start Hyperion with a console window `hyperiond -c` (Or new start menu entry) (#860)
- Get process IDs by iterating /proc (#843)
- Dump stack trace on crash (Implement #849) (#870)
- Minor fixes
- New Devices (#875)
* Yeelight support incl. device discovery and setup-wizard
* WLED as own device and pre-configuration
- Additional device related capabilities (#875)
* discover, getProperties, identify, store/restore state and power-on/off available for Philips-Hue, Nanoleaf, Yeelight, partially for Rs232 / USB (Hid)
* New device capabilities are accessible via JSON-API
* New REST-API wrapper class in support of network devices, e.g. Philips Hue, Nanoleaf and WLED
* Flexible SSDP-Discovery incl. RegEx matching and filtering
- Documentation (#875)
* Process workflow for LED-Devices
* Documentation of device classes & methods
* Code template for new LED-Devices available
- CEC detection (#877)
### Changed
- Updated dependency rpi_ws281x to latest upstream (#820)
- Updated websocket-extensions (#826)
- webui: Suppress default password warning (#830)
- webui: Add French, Vietnamese and Turkish (#842)
- Show thread names in GDB for better debugging (#848)
- CompileHowto.md updated (#864)
- Updated Embedded python package (zip) for Linux (#871)
- DBManager: ORDER BY parameter added to getRecord(s) (#770)
- Corrected GitHub Actions badge
- Fix GitHub Actions/Azure Windows Workflow/Pipeline
- Updated submodules flatbuffers/rpi_ws281x (#873)
- LED-Device workflow changed allowing proper suspend/resume & disable/enable scenarios (#875)
- Network LED-Devices will stop sending packages when disabled (#875)
- Rs232 Provider fully reworked and changed to synchronous writes (#875)
- Rs232 configuration via portname and system location (/dev/ style), auto detection is not case-sensitive any longer (#875)
- Additional error handling depending on device type (#875)
- Add Windows compatibility incl. moving to Qt functions (#875)
- Add compatibility for different Qt versions (#875)
### Fixed
- device: Nanoleaf (#829)
- device: LPD8806 Problems fixed (#829)
- Possible crash on shutdown (#846). Issue #668
- Enumerate only V4L2 frame sizes & intervals for framesize type DISCRETE (fix BCM2835 ISP) (#820)
- Fix systemd registration in debian for RPi4 (#820)
- Fix missing define in Profiler & added header notes (#820)
- some Windows Compile issues
- Fix: leaking active effects during quit (#850)
- Correct path for each build configuration
- Fix heap corruption (#862)
- Fix OpenSSL dependencies for Windows (#864)
- Fix resolution change event Fixes part of #620 (#867)
- some code improvements & cleanup (#861) (#872) (#880) (#876)
- some little things, as always (#863)
- AtmoOrb: Buffer length fix and new configuration validations (#875)
- Added missing DMX SubTypes to configuration (#875)
- Fix logger (#885)
* Make logger thread safe
* Include timestamp in logs
* Make logs look a bit more cleaner
- Decrease compile time (#886)
- Fix some data synchronization error (#890)
- Fix Qt screenshot crash (#889)
- Fix crash on startup if no X server available (#892)
- Fix RPC restart of Hyperion (#894)
## [2.0.0-alpha.6](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.6) - 2020-05-27
### Breaking
The release package names have been adjusted.\
If you used a `.deb` package please uninstall it before you upgrade
- Check for the package name `apt-cache search hyperion`. You may see now a entry like `hyperion-x86`, `hyperion-rpi`
- Remove with the correct name `sudo apt-get remove hyperion-XX`
- Now install the new .deb as usual. From now on the package is just called `hyperion`
### Added
- [Documentation](https://docs.hyperion-project.org) for Hyperion (#780)
- Hyperion can be compiled on windows. [Issues list](https://github.com/hyperion-project/hyperion.ng/issues/737) (#738)
- effect: New plasma/lava lamp effect (#792)
- device: Philips Hue Entertainment API now available as new device. [Read about requirements](https://docs.hyperion-project.org/en/user/LedDevices.html#philipshue) (#806)
- webui: Philips Hue Entertainment API Wizard (#806)
- webui: Toggle-Buttons for Component Remote Control (#677) (#778)
- webui: Add Trapezoid to LED Layout creation (#791)
### Changed
- webui: Dark mode adjustments (#789)
### Fixed
- device: Rewrite-/LatchTime definitions for all devices adjusted (#785) (#799)
- device: Nanoleaf crashes hyperion
- Documentation for Hyperion (#780)
- webui: Hide v4l2 if not available (#782)
- Documentation fixes (#790)
### Removed
- Linux 32bit packages are no longer available for download. Also the `.sh` packages are gone.
- Mac `.dmg` package disabled because of new apple restrictions. Please use the `tar.gz` instead.
## [2.0.0-alpha.5](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.5) - 2020-04-17
### Added:
- WebUI Dark Mode (#752) (#765)
### Fixed:
- SSDP Discovery reliability (#756)
- Some effects are running extreme slowly (#763)
- JsonAPI error "Dead lock detected" (2e578c1)
- USB Capture only in Black and white (#766)
### Changed:
- Check if requested Instance is running (#759)
- V4L2 enhancements (#766)
- Stages are now used in Azure CI/CD (9ca197e)
## [2.0.0-alpha.4](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.4) - 2020-03-27
### Fixed:
- Memoryleaks & Coredump, if no Grabber compiled (#724)
- Resolve enable state for v4l and screen capture (#728)
- Enable/Disable loops for components
- Runs now on x86_64 LibreElec (missing libs) (#736)
- Brightness compensation is now visible for configuration (#746)
- Prevent malformed image size for effects with specific led layouts (#746)
### Changed:
- SIGUSR1/SIGUSR2 implemented again (#725)
- V4L2 width/height/fps options available (#734)
- Swedish translation update
## [2.0.0-alpha.3](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.3) - 2020-03-01
### Added
- Package Update Descriptions on WebUi (#694)
- Pull Requests will now create artifacts for faster testing!
### Fixed
- Led Matrix Layout - Save/Restore (#669) (#697)
- New hue user generation (#696)
- Nanoleaf - Udp Network init was missing (#698)
- Multiple memory leaks and segfault issues in Flatbuffer Forwarder
## [2.0.0-alpha.2](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.2) - 2020-02-20
### Added
- Swedish Translation (#675)
- Dutch translation from [Kees](mailto:kees@vannieuwenhuijzen.com), [Nick](mailto:nick@doingcode.nl) & [Ward Wygaerts](mailto:wardwygaerts@gmail.com)
- Polish translation from [Patryk Niedźwiedziński](mailto:pniedzwiedzinski19@gmail.com)
- Romanian translation from [Ghenciu Ciprian](mailto:g.ciprian@osn.ro)
### Changed
- Smoothing comp state on startup (#685)
- Azure GitHub release title (#686)
- SSL/Avahi problems in previous release (#689)
- WebUI Version Check to SemVer. Also adds "Alpha" Channel (#692)
### Removed
- Travis CI tests (#684)
## [2.0.0-alpha.1](https://github.com/hyperion-project/hyperion.ng/releases/tag/2.0.0-alpha.1) - 2020-02-16
### Added
- Initial Release

View File

@ -1,481 +1,215 @@
cmake_minimum_required(VERSION 3.5.0) cmake_minimum_required(VERSION 3.0.0)
message(STATUS "CMake Version: ${CMAKE_VERSION}") message( STATUS "CMake Version: ${CMAKE_VERSION}" )
macro(addIndent text)
if(${CMAKE_VERSION} VERSION_GREATER "3.16.0")
list(APPEND CMAKE_MESSAGE_INDENT ${text})
endif()
endmacro()
macro(removeIndent)
if(${CMAKE_VERSION} VERSION_GREATER "3.16.0")
list(POP_BACK CMAKE_MESSAGE_INDENT)
endif()
endmacro()
PROJECT(hyperion) PROJECT(hyperion)
# Parse semantic version of version file and write version to config # Parse semantic version of version file
include (${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.cmake) include (${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.cmake)
file (STRINGS ".version" HYPERION_VERSION) file (STRINGS "version" HYPERION_VERSION)
SetVersionNumber(HYPERION ${HYPERION_VERSION}) SetVersionNumber(HYPERION ${HYPERION_VERSION})
set(DEFAULT_JSON_CONFIG_FILE ${CMAKE_CURRENT_SOURCE_DIR}/settings/hyperion.settings.json.default)
file(READ ${DEFAULT_JSON_CONFIG_FILE} DEFAULT_JSON_CONFIG_VAR)
string(REPLACE "configVersionValue" ${HYPERION_VERSION} DEFAULT_JSON_CONFIG_VAR "${DEFAULT_JSON_CONFIG_VAR}")
file(WRITE ${CMAKE_BINARY_DIR}/settings/hyperion.settings.json.default "${DEFAULT_JSON_CONFIG_VAR}")
# Instruct CMake to run moc automatically when needed. # Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
# auto prepare .qrc files # auto prepare .qrc files
set(CMAKE_AUTORCC ON) set(CMAKE_AUTORCC ON)
# multicore compiling if ( POLICY CMP0026 )
include(ProcessorCount) CMAKE_POLICY( SET CMP0026 OLD )
ProcessorCount(NCORES)
if(NOT NCORES EQUAL 0)
set(CMAKE_BUILD_PARALLEL_LEVEL NCORES)
endif() endif()
# Configure CCache ifavailable # Configure CCache if available
find_program(CCACHE_FOUND ccache) find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND) if ( CCACHE_FOUND )
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND) endif(CCACHE_FOUND)
# enable C++17 set(Python_ADDITIONAL_VERSIONS 3.5)
if(APPLE) find_package( PythonInterp 3.5 REQUIRED )
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("Werror=unguarded-availability" REQUIRED_UNGUARDED_AVAILABILITY)
if(REQUIRED_UNGUARDED_AVAILABILITY)
list(APPEND CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "Werror=unguarded-availability")
endif()
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "GNU")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-psabi")
endif()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Set build variables # Set build variables
# Grabber SET ( DEFAULT_AMLOGIC OFF )
set(DEFAULT_AMLOGIC OFF) SET ( DEFAULT_DISPMANX OFF )
set(DEFAULT_DISPMANX OFF) SET ( DEFAULT_OSX OFF )
set(DEFAULT_DX OFF) SET ( DEFAULT_X11 OFF )
set(DEFAULT_DDA OFF) SET ( DEFAULT_QT ON )
set(DEFAULT_MF OFF) SET ( DEFAULT_WS281XPWM OFF )
set(DEFAULT_OSX OFF) SET ( DEFAULT_USE_SHARED_AVAHI_LIBS ON )
set(DEFAULT_QT ON ) SET ( DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS OFF )
set(DEFAULT_V4L2 OFF) SET ( DEFAULT_USE_SYSTEM_PROTO_LIBS OFF )
set(DEFAULT_AUDIO ON ) SET ( DEFAULT_TESTS OFF )
set(DEFAULT_X11 OFF)
set(DEFAULT_XCB OFF)
# Input IF ( ${CMAKE_SYSTEM} MATCHES "Linux" )
set(DEFAULT_BOBLIGHT_SERVER ON ) SET ( DEFAULT_V4L2 ON )
set(DEFAULT_CEC OFF) SET ( DEFAULT_SPIDEV ON )
set(DEFAULT_FLATBUF_SERVER ON ) SET ( DEFAULT_FB ON )
set(DEFAULT_PROTOBUF_SERVER ON ) SET ( DEFAULT_USB_HID ON )
ELSE()
SET ( DEFAULT_V4L2 OFF )
SET ( DEFAULT_FB OFF )
SET ( DEFAULT_SPIDEV OFF )
SET ( DEFAULT_USB_HID OFF )
ENDIF()
# Output if ( NOT DEFINED PLATFORM )
set(DEFAULT_FORWARDER ON ) if ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86" )
set(DEFAULT_FLATBUF_CONNECT ON ) SET( PLATFORM "x11")
elseif ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64")
# LED-Devices SET( PLATFORM "rpi")
set(DEFAULT_DEV_NETWORK ON ) FILE( READ /proc/cpuinfo SYSTEM_CPUINFO )
set(DEFAULT_DEV_SERIAL ON ) STRING ( TOLOWER "${SYSTEM_CPUINFO}" SYSTEM_CPUINFO )
set(DEFAULT_DEV_SPI OFF) if ( "${SYSTEM_CPUINFO}" MATCHES "amlogic" AND ${CMAKE_SIZEOF_VOID_P} EQUAL 4 )
set(DEFAULT_DEV_TINKERFORGE OFF) SET( PLATFORM "amlogic" )
set(DEFAULT_DEV_USB_HID OFF) elseif ( ("${SYSTEM_CPUINFO}" MATCHES "amlogic" OR "${SYSTEM_CPUINFO}" MATCHES "odroid-c2" OR "${SYSTEM_CPUINFO}" MATCHES "vero4k") AND ${CMAKE_SIZEOF_VOID_P} EQUAL 8 )
set(DEFAULT_DEV_WS281XPWM OFF) SET( PLATFORM "amlogic64" )
set(DEFAULT_DEV_FTDI ON )
# Services
set(DEFAULT_EFFECTENGINE ON )
set(DEFAULT_EXPERIMENTAL OFF)
set(DEFAULT_MDNS ON )
set(DEFAULT_REMOTE_CTL ON )
# Build
set(DEFAULT_JSONCHECKS ON )
set(DEFAULT_DEPLOY_DEPENDENCIES ON )
set(DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS OFF)
set(DEFAULT_USE_SYSTEM_PROTO_LIBS OFF)
set(DEFAULT_USE_SYSTEM_MBEDTLS_LIBS OFF)
set(DEFAULT_USE_SYSTEM_QMDNS_LIBS OFF)
set(DEFAULT_TESTS OFF)
# Build Hyperion with a reduced set of functionality, overwrites other default values
set(DEFAULT_HYPERION_LIGHT OFF)
if(${CMAKE_SYSTEM} MATCHES "Linux")
set(DEFAULT_FB ON)
set(DEFAULT_V4L2 ON)
set(DEFAULT_DEV_SPI ON)
set(DEFAULT_DEV_TINKERFORGE ON)
set(DEFAULT_DEV_USB_HID ON)
set(DEFAULT_CEC ON)
elseif (WIN32)
set(DEFAULT_DX ON )
set(DEFAULT_DDA ON )
set(DEFAULT_MF ON )
set(DEFAULT_DEV_FTDI OFF)
else()
set(DEFAULT_FB OFF)
set(DEFAULT_V4L2 OFF)
set(DEFAULT_DEV_SPI OFF)
set(DEFAULT_DEV_TINKERFORGE OFF)
set(DEFAULT_DEV_USB_HID OFF)
set(DEFAULT_CEC OFF)
endif()
if(NOT DEFINED PLATFORM)
if(APPLE)
set(PLATFORM "osx")
elseif (WIN32)
set(PLATFORM "windows")
elseif ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86")
set(PLATFORM "x11")
elseif ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64")
set(PLATFORM "rpi")
file(READ /proc/cpuinfo SYSTEM_CPUINFO)
STRING (TOLOWER "${SYSTEM_CPUINFO}" SYSTEM_CPUINFO)
if("${SYSTEM_CPUINFO}" MATCHES "amlogic" AND ${CMAKE_SIZEOF_VOID_P} EQUAL 4)
set(PLATFORM "amlogic")
elseif (("${SYSTEM_CPUINFO}" MATCHES "amlogic" OR "${SYSTEM_CPUINFO}" MATCHES "odroid-c2" OR "${SYSTEM_CPUINFO}" MATCHES "vero4k") AND ${CMAKE_SIZEOF_VOID_P} EQUAL 8)
set(PLATFORM "amlogic64")
endif() endif()
elseif ( APPLE )
SET( PLATFORM "osx")
elseif ( WIN32 )
SET( PLATFORM "windows")
endif() endif()
if(PLATFORM) if ( PLATFORM )
message(STATUS "PLATFORM is not defined, evaluated platform: ${PLATFORM}") message( STATUS "PLATFORM is not defined, evaluated platform: ${PLATFORM}")
else() else()
message(FATAL_ERROR "PLATFORM is not defined and could not be evaluated. Set -DPLATFORM=<rpi|amlogic|amlogic64|x11|x11-dev|osx|osx-dev>") message( FATAL_ERROR "PLATFORM is not defined and could not be evaluated. Set -DPLATFORM=<rpi|amlogic|amlogic64|x11|x11-dev|osx|osx-dev>")
endif() endif()
endif() endif()
message(STATUS "PLATFORM: ${PLATFORM}") message( STATUS "PLATFORM: ${PLATFORM}")
# Macro to get path of first sub dir of a dir, used for MAC OSX lib/header searching # Macro to get path of first sub dir of a dir, used for MAC OSX lib/header searching
macro(FIRSTSUBDIR result curdir) MACRO(FIRSTSUBDIR result curdir)
file(GLOB children RELATIVE ${curdir} ${curdir}/*) FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
set(dirlist "") SET(dirlist "")
foreach(child ${children}) FOREACH(child ${children})
if(IS_DIRECTORY ${curdir}/${child}) IF(IS_DIRECTORY ${curdir}/${child})
list(APPEND dirlist "${curdir}/${child}") LIST(APPEND dirlist "${curdir}/${child}")
break() #BREAK()
endif() ENDIF()
endforeach() ENDFOREACH()
set(${result} ${dirlist}) SET(${result} ${dirlist})
endmacro() ENDMACRO()
if("${PLATFORM}" MATCHES "osx")
# specify the min version of the target platform (only GitHub Actions)
if(DEFINED ENV{GITHUB_WORKSPACE})
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15")
endif()
if ( "${PLATFORM}" MATCHES "osx" )
# add specific prefix paths # add specific prefix paths
FIRSTSUBDIR(SUBDIRQT "/usr/local/Cellar/qt5")
FIRSTSUBDIR(SUBDIRPY "/usr/local/opt/python3/Frameworks/Python.framework/Versions") FIRSTSUBDIR(SUBDIRPY "/usr/local/opt/python3/Frameworks/Python.framework/Versions")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${SUBDIRPY}) SET(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${SUBDIRQT} ${SUBDIRPY} "/usr/local/opt/qt5" )
include_directories("/opt/X11/include/") include_directories("/opt/X11/include/")
set(DEFAULT_OSX ON ) SET ( DEFAULT_OSX ON )
set(DEFAULT_AUDIO OFF) SET ( DEFAULT_USB_HID ON )
set(DEFAULT_DEV_USB_HID ON ) elseif ( "${PLATFORM}" STREQUAL "rpi" )
SET ( DEFAULT_DISPMANX ON )
elseif ("${PLATFORM}" MATCHES "rpi") SET ( DEFAULT_WS281XPWM ON )
set(DEFAULT_DISPMANX ON) elseif ( "${PLATFORM}" STREQUAL "amlogic" )
set(DEFAULT_DEV_WS281XPWM ON) SET ( DEFAULT_AMLOGIC ON )
elseif ("${PLATFORM}" MATCHES "^amlogic") elseif ( "${PLATFORM}" STREQUAL "amlogic64" )
set(DEFAULT_AMLOGIC ON) SET ( DEFAULT_AMLOGIC ON )
if("${PLATFORM}" MATCHES "-dev$") elseif ( "${PLATFORM}" MATCHES "x11" )
set(DEFAULT_AMLOGIC ON) SET ( DEFAULT_X11 ON )
set(DEFAULT_DISPMANX OFF) if ( "${PLATFORM}" STREQUAL "x11-dev" )
set(DEFAULT_QT OFF) SET ( DEFAULT_AMLOGIC ON)
set(DEFAULT_CEC OFF) SET ( DEFAULT_WS281XPWM ON )
endif() endif()
elseif ("${PLATFORM}" MATCHES "^x11") elseif ( "${PLATFORM}" STREQUAL "imx6" )
set(DEFAULT_X11 ON) SET ( DEFAULT_FB ON )
set(DEFAULT_XCB ON) elseif ( "${PLATFORM}" STREQUAL "windows" )
if("${PLATFORM}" MATCHES "-dev$") MESSAGE( WARNING "Hyperion is not developed nor tested on MS Windows.")
set(DEFAULT_AMLOGIC ON)
set(DEFAULT_DEV_WS281XPWM ON)
endif()
elseif ("${PLATFORM}" STREQUAL "imx6")
set(DEFAULT_FB ON)
endif() endif()
# enable tests for -dev builds # enable tests for -dev builds
if("${PLATFORM}" MATCHES "-dev$") if ( "${PLATFORM}" MATCHES "-dev" )
set(DEFAULT_TESTS ON) SET ( DEFAULT_TESTS ON )
endif() endif()
string(TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE) STRING( TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE)
string(REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}") STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" )
ADD_DEFINITIONS(${PLATFORM_DEFINE}) ADD_DEFINITIONS( ${PLATFORM_DEFINE} )
# set the build options # set the build options
option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC} )
option(HYPERION_LIGHT "Build Hyperion with a reduced set of functionality" ${DEFAULT_HYPERION_LIGHT})
message(STATUS "HYPERION_LIGHT = ${HYPERION_LIGHT}")
if(HYPERION_LIGHT)
message(STATUS "HYPERION_LIGHT: Hyperion is build with a reduced set of functionality.")
# Disable Screen/Video Grabbers
SET ( DEFAULT_AMLOGIC OFF )
SET ( DEFAULT_DISPMANX OFF )
SET ( DEFAULT_DX OFF )
SET ( DEFAULT_DDA OFF )
SET ( DEFAULT_FB OFF )
SET ( DEFAULT_MF OFF )
SET ( DEFAULT_OSX OFF )
SET ( DEFAULT_QT OFF )
SET ( DEFAULT_V4L2 OFF )
SET ( DEFAULT_X11 OFF )
SET ( DEFAULT_XCB OFF )
# Disable Audio Grabbers
SET ( DEFAULT_AUDIO OFF )
# LED-Devices
#SET ( DEFAULT_DEV_NETWORK OFF )
#SET ( DEFAULT_DEV_FTDI OFF )
#SET ( DEFAULT_DEV_SERIAL OFF )
#SET ( DEFAULT_DEV_SPI OFF )
#SET ( DEFAULT_DEV_TINKERFORGE OFF )
#SET ( DEFAULT_DEV_USB_HID OFF )
#SET ( DEFAULT_DEV_WS281XPWM OFF )
# Disable Input Servers
SET ( DEFAULT_BOBLIGHT_SERVER OFF )
SET ( DEFAULT_CEC OFF )
SET ( DEFAULT_FLATBUF_SERVER OFF )
SET ( DEFAULT_PROTOBUF_SERVER OFF )
# Disable Output Connectors
SET ( DEFAULT_FORWARDER OFF )
SET ( DEFAULT_FLATBUF_CONNECT OFF )
# Disable Services
SET ( DEFAULT_EFFECTENGINE OFF )
SET ( DEFAULT_EXPERIMENTAL OFF )
#SET ( DEFAULT_MDNS OFF )
SET ( DEFAULT_REMOTE_CTL OFF )
SET ( ENABLE_JSONCHECKS ON )
SET ( ENABLE_DEPLOY_DEPENDENCIES ON )
endif()
message(STATUS "Grabber options:")
addIndent(" - ")
option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC})
message(STATUS "ENABLE_AMLOGIC = ${ENABLE_AMLOGIC}") message(STATUS "ENABLE_AMLOGIC = ${ENABLE_AMLOGIC}")
option(ENABLE_DISPMANX "Enable the RPi dispmanx grabber" ${DEFAULT_DISPMANX}) option(ENABLE_DISPMANX "Enable the RPi dispmanx grabber" ${DEFAULT_DISPMANX} )
message(STATUS "ENABLE_DISPMANX = ${ENABLE_DISPMANX}") message(STATUS "ENABLE_DISPMANX = ${ENABLE_DISPMANX}")
option(ENABLE_DX "Enable the DirectX grabber" ${DEFAULT_DX}) if (ENABLE_AMLOGIC)
message(STATUS "ENABLE_DX = ${ENABLE_DX}") SET(ENABLE_FB ON)
option(ENABLE_DDA "Enable the DXGI DDA grabber" ${DEFAULT_DDA})
message(STATUS "ENABLE_DDA = ${ENABLE_DDA}")
if(ENABLE_AMLOGIC)
set(ENABLE_FB ON)
else() else()
option(ENABLE_FB " Enable the framebuffer grabber" ${DEFAULT_FB}) option(ENABLE_FB "Enable the framebuffer grabber" ${DEFAULT_FB} )
endif() endif()
message(STATUS "ENABLE_FB = ${ENABLE_FB}") message(STATUS "ENABLE_FB = ${ENABLE_FB}")
option(ENABLE_MF "Enable the Media Foundation grabber" ${DEFAULT_MF}) option(ENABLE_OSX "Enable the osx grabber" ${DEFAULT_OSX} )
message(STATUS "ENABLE_MF = ${ENABLE_MF}")
option(ENABLE_OSX "Enable the OSX grabber" ${DEFAULT_OSX})
message(STATUS "ENABLE_OSX = ${ENABLE_OSX}") message(STATUS "ENABLE_OSX = ${ENABLE_OSX}")
option(ENABLE_QT "Enable the Qt grabber" ${DEFAULT_QT}) option(ENABLE_SPIDEV "Enable the SPIDEV device" ${DEFAULT_SPIDEV} )
message(STATUS "ENABLE_QT = ${ENABLE_QT}") message(STATUS "ENABLE_SPIDEV = ${ENABLE_SPIDEV}")
option(ENABLE_TINKERFORGE "Enable the TINKERFORGE device" ON)
message(STATUS "ENABLE_TINKERFORGE = ${ENABLE_TINKERFORGE}")
option(ENABLE_V4L2 "Enable the V4L2 grabber" ${DEFAULT_V4L2}) option(ENABLE_V4L2 "Enable the V4L2 grabber" ${DEFAULT_V4L2})
message(STATUS "ENABLE_V4L2 = ${ENABLE_V4L2}") message(STATUS "ENABLE_V4L2 = ${ENABLE_V4L2}")
option(ENABLE_WS281XPWM "Enable the WS281x-PWM device" ${DEFAULT_WS281XPWM} )
message(STATUS "ENABLE_WS281XPWM = ${ENABLE_WS281XPWM}")
option(ENABLE_USB_HID "Enable the libusb and hid devices" ${DEFAULT_USB_HID} )
message(STATUS "ENABLE_USB_HID = ${ENABLE_USB_HID}")
option(ENABLE_X11 "Enable the X11 grabber" ${DEFAULT_X11}) option(ENABLE_X11 "Enable the X11 grabber" ${DEFAULT_X11})
message(STATUS "ENABLE_X11 = ${ENABLE_X11}") message(STATUS "ENABLE_X11 = ${ENABLE_X11}")
option(ENABLE_XCB "Enable the XCB grabber" ${DEFAULT_XCB}) option(ENABLE_QT "Enable the qt grabber" ${DEFAULT_QT})
message(STATUS "ENABLE_XCB = ${ENABLE_XCB}") message(STATUS "ENABLE_QT = ${ENABLE_QT}")
option(ENABLE_AUDIO "Enable the AUDIO grabber" ${DEFAULT_AUDIO})
message(STATUS "ENABLE_AUDIO = ${ENABLE_AUDIO}")
removeIndent()
message(STATUS "Input options:")
addIndent(" - ")
option(ENABLE_BOBLIGHT_SERVER "Enable BOBLIGHT server" ${DEFAULT_BOBLIGHT_SERVER})
message(STATUS "ENABLE_BOBLIGHT_SERVER = ${ENABLE_BOBLIGHT_SERVER}")
option(ENABLE_CEC "Enable the libcec and CEC control" ${DEFAULT_CEC})
message(STATUS "ENABLE_CEC = ${ENABLE_CEC}")
option(ENABLE_FLATBUF_SERVER "Enable Flatbuffers server" ${DEFAULT_FLATBUF_SERVER})
message(STATUS "ENABLE_FLATBUF_SERVER = ${ENABLE_FLATBUF_SERVER}")
option(ENABLE_PROTOBUF_SERVER "Enable Protocol Buffers server" ${DEFAULT_PROTOBUF_SERVER})
message(STATUS "ENABLE_PROTOBUF_SERVER = ${ENABLE_PROTOBUF_SERVER}")
removeIndent()
message(STATUS "Output options:")
addIndent(" - ")
option(ENABLE_FORWARDER "Enable Hyperion forwarding" ${DEFAULT_FORWARDER})
message(STATUS "ENABLE_FORWARDER = ${ENABLE_FORWARDER}")
if(ENABLE_FORWARDER)
set(ENABLE_FLATBUF_CONNECT ON)
else()
option(ENABLE_FLATBUF_CONNECT "Enable Flatbuffers connecting remotely" ${DEFAULT_FLATBUF_CONNECT})
endif()
message(STATUS "ENABLE_FLATBUF_CONNECT = ${ENABLE_FLATBUF_CONNECT}")
removeIndent()
message(STATUS "LED-Device options:")
addIndent(" - ")
option(ENABLE_DEV_NETWORK "Enable the Network devices" ${DEFAULT_DEV_NETWORK})
message(STATUS "ENABLE_DEV_NETWORK = ${ENABLE_DEV_NETWORK}")
option(ENABLE_DEV_SERIAL "Enable the Serial devices" ${DEFAULT_DEV_SERIAL})
message(STATUS "ENABLE_DEV_SERIAL = ${ENABLE_DEV_SERIAL}")
option(ENABLE_DEV_SPI "Enable the SPI device" ${DEFAULT_DEV_SPI})
message(STATUS "ENABLE_DEV_SPI = ${ENABLE_DEV_SPI}")
option(ENABLE_DEV_TINKERFORGE "Enable the TINKERFORGE device" ${DEFAULT_DEV_TINKERFORGE})
message(STATUS "ENABLE_DEV_TINKERFORGE = ${ENABLE_DEV_TINKERFORGE}")
option(ENABLE_DEV_USB_HID "Enable the libusb and hid devices" ${DEFAULT_DEV_USB_HID})
message(STATUS "ENABLE_DEV_USB_HID = ${ENABLE_DEV_USB_HID}")
option(ENABLE_DEV_WS281XPWM "Enable the WS281x-PWM device" ${DEFAULT_DEV_WS281XPWM})
message(STATUS "ENABLE_DEV_WS281XPWM = ${ENABLE_DEV_WS281XPWM}")
option(ENABLE_DEV_FTDI "Enable the FTDI devices" ${DEFAULT_DEV_FTDI} )
message(STATUS "ENABLE_DEV_FTDI = ${ENABLE_DEV_FTDI}")
removeIndent()
message(STATUS "Services options:")
addIndent(" - ")
option(ENABLE_EFFECTENGINE "Enable Effect-Engine" ${DEFAULT_EFFECTENGINE})
message(STATUS "ENABLE_EFFECTENGINE = ${ENABLE_EFFECTENGINE}")
option(ENABLE_EXPERIMENTAL "Compile experimental features" ${DEFAULT_EXPERIMENTAL})
message(STATUS "ENABLE_EXPERIMENTAL = ${ENABLE_EXPERIMENTAL}")
option(ENABLE_MDNS "Enable mDNS (aka Zeroconf)" ${DEFAULT_MDNS})
message(STATUS "ENABLE_MDNS = ${ENABLE_MDNS}")
option(ENABLE_REMOTE_CTL "Enable Hyperion remote control" ${DEFAULT_REMOTE_CTL})
message(STATUS "ENABLE_REMOTE_CTL = ${ENABLE_REMOTE_CTL}")
removeIndent()
message(STATUS "Build options:")
addIndent(" - ")
option(ENABLE_JSONCHECKS "Validate json schema files" ${DEFAULT_JSONCHECKS})
message(STATUS "ENABLE_JSONCHECKS = ${ENABLE_JSONCHECKS}")
option(ENABLE_DEPLOY_DEPENDENCIES "Deploy with dependencies" ${DEFAULT_DEPLOY_DEPENDENCIES})
message(STATUS "ENABLE_DEPLOY_DEPENDENCIES = ${ENABLE_DEPLOY_DEPENDENCIES}")
if(ENABLE_FLATBUF_SERVER OR ENABLE_FLATBUF_CONNECT)
message(STATUS "DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS = ${DEFAULT_USE_SYSTEM_FLATBUFFERS_LIBS}")
endif()
if(ENABLE_PROTOBUF_SERVER)
message(STATUS "DEFAULT_USE_SYSTEM_PROTO_LIBS = ${DEFAULT_USE_SYSTEM_PROTO_LIBS}")
endif()
message(STATUS "DEFAULT_USE_SYSTEM_MBEDTLS_LIBS = ${DEFAULT_USE_SYSTEM_MBEDTLS_LIBS}")
if(ENABLE_MDNS)
message(STATUS "DEFAULT_USE_SYSTEM_QMDNS_LIBS = ${DEFAULT_USE_SYSTEM_QMDNS_LIBS}")
endif()
option(ENABLE_PROFILER "enable profiler capabilities - not for release code" OFF)
message(STATUS "ENABLE_PROFILER = ${ENABLE_PROFILER}")
option(ENABLE_TESTS "Compile additional test applications" ${DEFAULT_TESTS}) option(ENABLE_TESTS "Compile additional test applications" ${DEFAULT_TESTS})
message(STATUS "ENABLE_TESTS = ${ENABLE_TESTS}") message(STATUS "ENABLE_TESTS = ${ENABLE_TESTS}")
removeIndent() option(ENABLE_PROFILER "enable profiler capabilities - not for release code" OFF)
message(STATUS "ENABLE_PROFILER = ${ENABLE_PROFILER}")
set(FLATBUFFERS_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/flatbuf) SET ( FLATBUFFERS_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/flatbuf )
set(FLATBUFFERS_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/flatbuf) SET ( FLATBUFFERS_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/flatbuf )
set(PROTOBUF_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/proto) SET ( PROTOBUF_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/proto )
set(PROTOBUF_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/proto) SET ( PROTOBUF_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/proto )
if(ENABLE_JSONCHECKS OR ENABLE_EFFECTENGINE) # check all json files
if("${CMAKE_VERSION}" VERSION_LESS "3.12.0") FILE ( GLOB_RECURSE HYPERION_SCHEMAS RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libsrc/*schema*.json )
set(Python_ADDITIONAL_VERSIONS 3.5) SET( JSON_FILES
find_package(PythonInterp 3.5 REQUIRED) config/hyperion.config.json.default
else() ${HYPERION_SCHEMAS}
find_package(Python3 3.5 COMPONENTS Interpreter Development REQUIRED) )
if(Python3_FOUND) EXECUTE_PROCESS (
set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE}) COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkjson.py ${JSON_FILES}
endif() WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
endif() RESULT_VARIABLE CHECK_JSON_FAILED
endif() )
IF ( ${CHECK_JSON_FAILED} )
MESSAGE (FATAL_ERROR "check of json files failed" )
ENDIF ()
if(ENABLE_JSONCHECKS) EXECUTE_PROCESS (
# check all json files COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkeffects.py effects effects/schema
file (GLOB_RECURSE HYPERION_SCHEMAS RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libsrc/*schema*.json) WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
set(JSON_FILES ${CMAKE_BINARY_DIR}/settings/hyperion.settings.json.default ${HYPERION_SCHEMAS}) RESULT_VARIABLE CHECK_EFFECTS_FAILED
)
IF ( ${CHECK_EFFECTS_FAILED} )
MESSAGE (FATAL_ERROR "check of json effect files failed" )
ENDIF ()
execute_process ( # for python 3 the checkschema.py file must be rewritten
COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkjson.py ${JSON_FILES} EXECUTE_PROCESS (
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND python test/jsonchecks/checkschema.py config/hyperion.config.json.default libsrc/hyperion/hyperion.schema.json
RESULT_VARIABLE CHECK_JSON_FAILED WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
) RESULT_VARIABLE CHECK_CONFIG_FAILED
if(${CHECK_JSON_FAILED}) )
message (FATAL_ERROR "check of json files failed") IF ( ${CHECK_CONFIG_FAILED} )
endif() MESSAGE (FATAL_ERROR "check of json default config failed" )
ENDIF ()
if(ENABLE_EFFECTENGINE)
execute_process (
COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkeffects.py effects effects/schema
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_EFFECTS_FAILED
)
if(${CHECK_EFFECTS_FAILED})
message (FATAL_ERROR "check of json effect files failed")
endif()
endif()
execute_process (
COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkschema.py ${CMAKE_BINARY_DIR}/settings/hyperion.settings.json.default libsrc/hyperion/schema/schema-settings-default.json
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_CONFIG_FAILED
)
if(${CHECK_CONFIG_FAILED})
message (FATAL_ERROR "check of json default config failed")
endif()
endif(ENABLE_JSONCHECKS)
# Add project specific cmake modules (find, etc) # Add project specific cmake modules (find, etc)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
@ -488,8 +222,8 @@ configure_file("${PROJECT_SOURCE_DIR}/HyperionConfig.h.in" "${PROJECT_BINARY_DIR
include_directories("${PROJECT_BINARY_DIR}") include_directories("${PROJECT_BINARY_DIR}")
# Define the global output path of binaries # Define the global output path of binaries
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
file(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH}) file(MAKE_DIRECTORY ${LIBRARY_OUTPUT_PATH})
file(MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) file(MAKE_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
@ -501,121 +235,111 @@ include_directories(${CMAKE_SOURCE_DIR}/include)
# Prefer static linking over dynamic # Prefer static linking over dynamic
#set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so") #set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so")
# MSVC options # enable C++11
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") include(CheckCXXCompilerFlag)
# Search for Windows SDK CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
find_package(WindowsSDK REQUIRED) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
message(STATUS "WINDOWS SDK: ${WINDOWSSDK_LATEST_DIR} ${WINDOWSSDK_LATEST_NAME}")
message(STATUS "MSVC VERSION: ${MSVC_VERSION}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
if (CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-psabi")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-psabi")
endif()
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
message(STATUS "No support for C++11 detected. Compilation will most likely fail on your compiler")
endif() endif()
# Don't create new dynamic tags (RUNPATH) and setup -rpath to search for shared libs in BINARY/../lib folder (only for Unix) # Use GNU gold linker if available
if(ENABLE_DEPLOY_DEPENDENCIES AND UNIX AND NOT APPLE) include (${CMAKE_CURRENT_SOURCE_DIR}/cmake/LDGold.cmake)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags")
set(CMAKE_SKIP_BUILD_RPATH FALSE) # Don't create new dynamic tags (RUNPATH)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--disable-new-dtags")
set(CMAKE_INSTALL_RPATH "$ORIGIN/../lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # setup -rpath to search for shared libs in BINARY/../lib folder
if (UNIX AND NOT APPLE)
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH}:$ORIGIN/../lib")
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
endif ()
# add QT5 dependency
IF ( CMAKE_CROSSCOMPILING )
file(GLOB QT_BIN ${QT_BIN_PATH})
set(QT_MOC_EXECUTABLE ${QT_BIN}/moc)
add_executable(Qt5::moc IMPORTED)
set_property(TARGET Qt5::moc PROPERTY IMPORTED_LOCATION ${QT_MOC_EXECUTABLE})
set(QT_RCC_EXECUTABLE ${QT_BIN}/rcc)
add_executable(Qt5::rcc IMPORTED)
set_property(TARGET Qt5::rcc PROPERTY IMPORTED_LOCATION ${QT_RCC_EXECUTABLE})
message(STATUS "QT_BIN_PATH = ${QT_BIN}")
message(STATUS "QT_MOC_EXECUTABLE = ${QT_MOC_EXECUTABLE}")
message(STATUS "QT_RCC_EXECUTABLE = ${QT_RCC_EXECUTABLE}")
ENDIF()
SET(QT_MIN_VERSION "5.5.0")
find_package(Qt5 COMPONENTS Core Gui Network SerialPort Sql REQUIRED)
message( STATUS "Found Qt Version: ${Qt5Core_VERSION}" )
IF ( "${Qt5Core_VERSION}" VERSION_LESS "${QT_MIN_VERSION}" )
message( FATAL_ERROR "Your Qt version is to old! Minimum required ${QT_MIN_VERSION}" )
ENDIF()
# Add libusb and pthreads
find_package(libusb-1.0 REQUIRED)
find_package(Threads REQUIRED)
add_definitions(${QT_DEFINITIONS})
# Add jpeg library
if (ENABLE_V4L2)
find_package(JPEG)
if (JPEG_FOUND)
add_definitions(-DHAVE_JPEG)
message( STATUS "Using JPEG library: ${JPEG_LIBRARIES}")
include_directories(${JPEG_INCLUDE_DIR})
else()
message( STATUS "JPEG library not found, MJPEG camera format won't work in V4L2 grabber.")
endif()
endif() endif()
# TODO[TvdZ]: This linking directory should only be added if we are cross compiling
#if(NOT APPLE)
# link_directories(${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf)
#endif()
if(APPLE) if(APPLE)
set(CMAKE_EXE_LINKER_FLAGS "-framework CoreGraphics") set(CMAKE_EXE_LINKER_FLAGS "-framework CoreGraphics")
endif() endif()
find_package(Threads REQUIRED)
# Allow to overwrite QT base directory
# Either supply QTDIR as -DQTDIR=<path> to cmake or set and environment variable QTDIR pointing to the Qt installation
# For Windows and OSX, the default Qt installation path are tried to resolved automatically
if(NOT DEFINED QTDIR)
if(DEFINED ENV{QTDIR})
set(QTDIR $ENV{QTDIR})
else()
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
FIRSTSUBDIR(SUBDIRQT "C:/Qt")
if(NOT ${SUBDIRQT} STREQUAL "")
set(QTDIR "${SUBDIRQT}/msvc2019_64")
endif()
elseif ("${PLATFORM}" MATCHES "osx")
foreach(QT_VERSION 6 5)
execute_process(
COMMAND brew --prefix qt@${QT_VERSION}
RESULT_VARIABLE DETECT_QT
OUTPUT_VARIABLE QT_LOCATION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(${DETECT_QT} EQUAL 0 AND EXISTS ${QT_LOCATION})
set(QTDIR ${QT_LOCATION})
break()
endif()
endforeach()
endif()
endif()
endif()
if(DEFINED QTDIR)
message(STATUS "Add QTDIR: ${QTDIR} to CMAKE_PREFIX_PATH")
list(PREPEND CMAKE_PREFIX_PATH ${QTDIR} "${QTDIR}/lib")
endif()
if(CMAKE_PREFIX_PATH)
message(STATUS "CMAKE_PREFIX_PATH used: ${CMAKE_PREFIX_PATH}")
endif()
# find QT libs
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Gui Network Sql Widgets REQUIRED)
message(STATUS "Found Qt Version: ${QT_VERSION}")
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
set(QT_MIN_VERSION "6.2.2")
else()
set(QT_MIN_VERSION "5.9.0")
endif()
if("${QT_VERSION}" VERSION_LESS "${QT_MIN_VERSION}")
message(FATAL_ERROR "Your Qt version is to old! Minimum required ${QT_MIN_VERSION}")
endif()
find_package(Qt${QT_VERSION_MAJOR} ${QT_VERSION} COMPONENTS Core Gui Network Sql Widgets REQUIRED)
message(STATUS "Qt version used: ${QT_VERSION}")
if(APPLE AND (${QT_VERSION_MAJOR} GREATER_EQUAL 6))
set(OPENSSL_ROOT_DIR /usr/local/opt/openssl)
endif()
# Add libusb and pthreads
find_package(libusb-1.0 REQUIRED)
add_definitions(${QT_DEFINITIONS})
# Add the source/lib directories # Add the source/lib directories
add_subdirectory(dependencies) add_subdirectory(dependencies)
add_subdirectory(libsrc) add_subdirectory(libsrc)
add_subdirectory(src) add_subdirectory(src)
if(ENABLE_TESTS) if (ENABLE_TESTS)
add_subdirectory(test) add_subdirectory(test)
endif() endif ()
# Add resources directory # Add resources directory
add_subdirectory(resources) add_subdirectory(resources)
# remove generated files on make cleaan too # remove generated files on make cleaan too
list(APPEND GENERATED_QRC LIST( APPEND GENERATED_QRC
${CMAKE_BINARY_DIR}/EffectEngine.qrc
${CMAKE_BINARY_DIR}/WebConfig.qrc ${CMAKE_BINARY_DIR}/WebConfig.qrc
${CMAKE_BINARY_DIR}/HyperionConfig.h ${CMAKE_BINARY_DIR}/HyperionConfig.h
) )
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${GENERATED_QRC}" )
if(ENABLE_EFFECTENGINE)
list(APPEND GENERATED_QRC
${CMAKE_BINARY_DIR}/EffectEngine.qrc
)
endif()
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${GENERATED_QRC}")
# uninstall target # uninstall target
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
# enable make package - no code after this line ! # enable make package - no code after this line !

View File

@ -1,317 +0,0 @@
{
"version": 8,
"configurePresets": [
{
"name": "base",
"description": "Base settings that apply to all configurations",
"hidden": true,
"binaryDir": "${sourceDir}/build"
},
{
"name": "ccache",
"description": "Set ccache variables",
"hidden": true,
"cacheVariables": {
"USE_COMPILER_CACHE": "ON"
},
"environment": {
"CCACHE_NODEBUG": "true",
"CCACHE_DIRECT": "true",
"CCACHE_MAXSIZE": "500M",
"CCACHE_COMPRESS": "true",
"CCACHE_COMPRESSLEVEL": "1",
"CCACHE_NOSTATS": "true",
"CCACHE_DIR": "${sourceDir}/.ccache"
}
},
{
"name": "buildcache",
"description": "Set buildcache variables",
"hidden": true,
"cacheVariables": {
"USE_COMPILER_CACHE": "ON"
},
"environment": {
"BUILDCACHE_DEBUG": "-1",
"BUILDCACHE_DIRECT_MODE": "true",
"BUILDCACHE_MAX_CACHE_SIZE": "524288000",
"BUILDCACHE_COMPRESS": "true",
"BUILDCACHE_COMPRESS_FORMAT": "LZ4",
"BUILDCACHE_DIR": "${sourceDir}/.buildcache"
}
},
{
"name": "hyperion-light",
"hidden": true,
"cacheVariables": {
"HYPERION_LIGHT": "ON"
}
},
{
"name": "hyperion-bare-minimum",
"hidden": true,
"cacheVariables": {
"ENABLE_AMLOGIC": "OFF",
"ENABLE_DDA": "OFF",
"ENABLE_DISPMANX": "OFF",
"ENABLE_DX": "OFF",
"ENABLE_FB": "OFF",
"ENABLE_MF": "OFF",
"ENABLE_OSX": "OFF",
"ENABLE_QT": "OFF",
"ENABLE_V4L2": "OFF",
"ENABLE_X11": "OFF",
"ENABLE_XCB": "OFF",
"ENABLE_AUDIO": "OFF",
"ENABLE_DEV_FTDI": "OFF",
"ENABLE_DEV_NETWORK": "OFF",
"ENABLE_DEV_SERIAL": "ON",
"ENABLE_DEV_SPI": "OFF",
"ENABLE_DEV_TINKERFORGE": "OFF",
"ENABLE_DEV_USB_HID": "OFF",
"ENABLE_DEV_WS281XPWM": "OFF",
"ENABLE_BOBLIGHT_SERVER": "OFF",
"ENABLE_CEC": "OFF",
"ENABLE_FLATBUF_SERVER": "OFF",
"ENABLE_PROTOBUF_SERVER": "OFF",
"ENABLE_FORWARDER": "OFF",
"ENABLE_FLATBUF_CONNECT": "OFF",
"ENABLE_EXPERIMENTAL": "OFF",
"ENABLE_MDNS": "OFF",
"ENABLE_REMOTE_CTL": "OFF",
"ENABLE_EFFECTENGINE": "OFF",
"ENABLE_JSONCHECKS": "ON",
"ENABLE_DEPLOY_DEPENDENCIES": "ON"
}
},
{
"name": "debug",
"hidden": true,
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "release",
"hidden": true,
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "clang",
"hidden": true,
"generator": "Ninja",
"cacheVariables": {
"CMAKE_C_COMPILER": "/usr/bin/clang",
"CMAKE_CXX_COMPILER": "/usr/bin/clang++"
}
},
{
"name": "msvc",
"hidden": true,
"generator": "Visual Studio 17 2022",
"architecture": "x64",
"toolset": "host=x64"
},
{
"name": "gcc",
"hidden": true,
"generator": "Ninja",
"cacheVariables": {
"CMAKE_C_COMPILER": "/usr/bin/gcc",
"CMAKE_CXX_COMPILER": "/usr/bin/g++"
}
},
{
"name": "macos-release",
"displayName": "MacOS (release) (clang)",
"description": "Build with Clang as Release without Debug Symbols",
"inherits": [ "base", "release", "clang" ],
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
}
},
{
"name": "macos-release-deps",
"displayName": "MacOS Dependencies (release) (clang)",
"description": "Build Dependencies with Clang as Release without Debug Symbols",
"inherits": [ "macos-release" ],
"cacheVariables": {
"CMAKE_INSTALL_PREFIX": "${sourceDir}/${presetName}"
}
},
{
"name": "macos-debug",
"displayName": "MacOS Debug (clang)",
"description": "Build with Clang with Debug Symbols",
"inherits": [ "base", "debug", "clang" ],
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
}
},
{
"name": "macos-debug-deps",
"displayName": "MacOS Dependencies (debug) (clang)",
"description": "Build Dependencies with Clang with Debug Symbols",
"inherits": [ "macos-debug" ],
"cacheVariables": {
"CMAKE_INSTALL_PREFIX": "${sourceDir}/${presetName}"
}
},
{
"name": "windows-release",
"displayName": "Windows Release (msvc)",
"description": "Build with MSVC's CL as Release without Debug Symbols",
"inherits": [ "base", "msvc" ],
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
}
},
{
"name": "windows-debug",
"displayName": "Windows Debug (msvc)",
"description": "Build with MSVC's CL with Debug Symbols",
"inherits": [ "base", "msvc" ],
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
}
},
{
"name": "linux-release",
"displayName": "Linux Release (gcc)",
"description": "Build with GCC as Release without Debug Symbols",
"inherits": [ "base", "release", "gcc" ],
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
}
},
{
"name": "linux-debug",
"displayName": "Linux Debug (gcc)",
"description": "Build with GCC with Debug Symbols",
"inherits": [ "base", "debug", "gcc" ],
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
}
}
],
"buildPresets": [
{
"name": "macos-release",
"displayName": "MacOS (release) (clang)",
"description": "Build with Clang as Release without Debug Symbols",
"targets": "all",
"configurePreset": "macos-release",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
}
},
{
"name": "macos-release-deps",
"displayName": "MacOS Dependencies (release) (clang)",
"description": "Build Dependencies with Clang as Release without Debug Symbols",
"targets": "dependencies/all",
"configurePreset": "macos-release-deps",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
}
},
{
"name": "macos-debug",
"displayName": "MacOS (debug) (clang)",
"description": "Build with Clang as Debug",
"targets": "all",
"configurePreset": "macos-debug",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
}
},
{
"name": "macos-debug-deps",
"displayName": "MacOS Dependencies (debug) (clang)",
"description": "Build Dependencies with Clang as Debug",
"targets": "dependencies/all",
"configurePreset": "macos-debug-deps",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Darwin"
}
},
{
"name": "windows-release",
"displayName": "Windows (release) (msvc)",
"description": "Build with MSVC's CL as Release without Debug Symbols",
"configuration": "Release",
"targets": "ALL_BUILD",
"configurePreset": "windows-release",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
}
},
{
"name": "windows-debug",
"displayName": "Windows (debug) (msvc)",
"description": "Build with MSVC's CL with Debug Symbols",
"configuration": "Debug",
"targets": "ALL_BUILD",
"configurePreset": "windows-debug",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Windows"
}
},
{
"name": "linux-release",
"displayName": "Linux (release) (gcc)",
"description": "Build with GCC as Release without Debug Symbols",
"targets": "all",
"configurePreset": "linux-release",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
}
},
{
"name": "linux-debug",
"displayName": "Linux (debug) (gcc)",
"description": "Build with GCC with Debug Symbols",
"targets": "all",
"configurePreset": "linux-debug",
"condition": {
"type": "equals",
"lhs": "${hostSystemName}",
"rhs": "Linux"
}
}
]
}

View File

@ -3,7 +3,10 @@ You can participate in the translation.
[![Join Translation](https://img.shields.io/badge/POEditor-translate-green.svg)](https://poeditor.com/join/project/Y4F6vHRFjA) [![Join Translation](https://img.shields.io/badge/POEditor-translate-green.svg)](https://poeditor.com/join/project/Y4F6vHRFjA)
## Development Setup ## Development Setup
You may already have an editor or IDE you want to use. In any case we provide a pre configured [Visual Studio Code](#visual-studio-code) setup.
> TODO: Be more specific, provide a Visual Studio Code workspace with plugins and pre configured build tasks
Get Hyperion to compile: [Compile HowTo](CompileHowTo.md)
## Workflow ## Workflow
@ -94,13 +97,13 @@ Error( log_main, "oh to crazy, aborting");
// quick logging, when only one message exists and want no typing overhead - or usage in static functions // quick logging, when only one message exists and want no typing overhead - or usage in static functions
Info( Logger::getInstance("LedDevice"), "Leddevice %s started", "PublicStreetLighting"); Info( Logger::getInstance("LedDevice"), "Leddevice %s started", "PublicStreetLighting");
// a bit more complex - with printf like format // a bit mor complex - with printf like format
Info( log_main, "hello %s, you have %d messages", "Dax", 25); Info( log_main, "hello %s, you have %d messages", "Dax", 25);
// conditional messages // conditional messages
WarningIf( (value>threshold), log_main, "Alert, your value is greater then %d", threshold ); WarningIf( (value>threshold), log_main, "Alert, your value is greater then %d", threshold );
``` ```
The amount of "%" must match with following arguments The amount of "%" mus match with following arguments
#### The Placeholders #### The Placeholders
- %s for strings (this are cstrings, when having std::string use myStdString.c_str() to convert) - %s for strings (this are cstrings, when having std::string use myStdString.c_str() to convert)
@ -110,24 +113,11 @@ The amount of "%" must match with following arguments
#### Log Level #### Log Level
* Debug - used when message is more or less for the developer or for trouble shooting * Debug - used when message is more or less for the developer or for trouble shooting
* Info - used for not absolutely developer stuff messages for what's going on * Info - used for not absolutly developer stuff messages for what's going on
* Warning - warn if something is not as it should be, but didn't harm * Warning - warn if something is not as it should be, but didn't harm
* Error - used when an error occurs * Error - used when an error occurs
## Commit specification ## Commit specification
> TODO > TODO
## Visual Studio Code
**We assume that you successfully compiled Hyperion with the [Compile HowTo](doc/development/CompileHowto.md) WITHOUT Docker** \
If you want to use VSCode for development follow the steps.
- Install [VSCode](https://code.visualstudio.com/). On Ubuntu 16.04+ you can also use the [Snapcraft VSCode](https://snapcraft.io/code) package.
- Install gdb:
- Linux: `sudo apt-get install gdb`
- Mac: `brew install gdb`
- Open VSCode and click on _File_ -> _Open Workspace_ and select the file `hyperion.ng/.vscode/hyperion.code-workspace`
- Install recommended extensions
- If you installed the Task Explorer you can now use the defined vscode tasks to build Hyperion and configure cmake
- For debugging you need to build Hyperion in Debug mode and start the correct Run config

180
CompileHowto.md Normal file
View File

@ -0,0 +1,180 @@
# With Docker
If you are using [Docker](https://www.docker.com/), you can compile Hyperion inside a docker container. This keeps your system clean and with a simple script it's easy to use. Supported is also cross compiling for Raspberry Pi (Debian Stretch or higher). To compile Hyperion just execute one of the following commands.
The compiled binaries and packages will be available at the deploy folder next to the script.<br/>
Note: call the script with `./docker-compile.sh -h` for more options
## Native compiling on Raspberry Pi
**Raspbian Stretch**
```
wget -qN https://raw.github.com/hyperion-project/hyperion.ng/master/bin/scripts/docker-compile.sh && chmod +x *.sh && ./docker-compile.sh -t rpi-raspbian-stretch
```
**Raspbian Buster**
```
wget -qN https://raw.github.com/hyperion-project/hyperion.ng/master/bin/scripts/docker-compile.sh && chmod +x *.sh && ./docker-compile.sh -t rpi-raspbian-buster
```
## Cross compiling on X64_86 for:
**X64:**
```
wget -qN https://raw.github.com/hyperion-project/hyperion.ng/master/bin/scripts/docker-compile.sh && chmod +x *.sh && ./docker-compile.sh
```
**i386:**
```
wget -qN https://raw.github.com/hyperion-project/hyperion.ng/master/bin/scripts/docker-compile.sh && chmod +x *.sh && ./docker-compile.sh -t i386
```
**Raspberry Pi v1 & ZERO**
```
wget -qN https://raw.github.com/hyperion-project/hyperion.ng/master/bin/scripts/docker-compile.sh && chmod +x *.sh && ./docker-compile.sh -t armv6hf
```
**Raspberry Pi 2 & 3**
```
wget -qN https://raw.github.com/hyperion-project/hyperion.ng/master/bin/scripts/docker-compile.sh && chmod +x *.sh && ./docker-compile.sh -t armv7hf
```
# The usual way
## Debian/Ubuntu/Win10LinuxSubsystem
```
sudo apt-get update
sudo apt-get install git cmake build-essential qtbase5-dev libqt5serialport5-dev libusb-1.0-0-dev python3-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libjpeg-dev libqt5sql5-sqlite
```
**on RPI you need the videocore IV headers**
```
sudo apt-get install libraspberrypi-dev
```
**OSMC on Raspberry Pi**
```
sudo apt-get install rbp-userland-dev-osmc
```
**ATTENTION Win10LinuxSubsystem** we do not (/we can't) support using hyperion in linux subsystem of MS Windows 10, albeit some users tested it with success. Keep in mind to disable
all linux specific led and grabber hardware via cmake. Because we use QT as framework in hyperion, serialport leds and network driven devices could work.
## Arch
See [AUR](https://aur.archlinux.org/packages/?O=0&SeB=nd&K=hyperion&outdated=&SB=n&SO=a&PP=50&do_Search=Go) for PKGBUILDs on arch. If the PKGBUILD does not work ask questions there please.
## OSX
To install on OS X you either need Homebrew or Macport but Homebrew is the recommended way to install the packages. To use Homebrew XCode is required as well, use `brew doctor` to check your install.
First you need to install the dependencies:
```
brew install qt5
brew install python3
brew install cmake
brew install libusb
brew install doxygen
```
# Compiling and installing Hyperion
### The general quick way (without big comments)
complete automated process:
```bash
wget -qO- https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/bin/compile.sh | sh
```
some more detailed way: (or more or less the content of the script above)
be sure you fulfill the prerequisites above.
```bash
git clone --recursive https://github.com/hyperion-project/hyperion.ng.git hyperion
cd hyperion
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j $(nproc)
if this get stucked and dmseg says out of memory try:
make -j 2
# optional: install into your system
sudo make install/strip
# to uninstall (not very well tested, please keep that in mind)
sudo make uninstall
# ... or run it from compile directory
bin/hyperiond
# webui is located on localhost:8090 or 8091
```
### Download
Creates hyperion directory and checkout the code from github
```
export HYPERION_DIR="hyperion"
git clone --recursive --depth 1 https://github.com/hyperion-project/hyperion.ng.git "$HYPERION_DIR"
```
### Preparations
Change into hyperion folder and create a build folder
```
cd "$HYPERION_DIR"
mkdir build
cd build
```
### Generate the make files:
To generate make files with automatic platform detection and default settings:
This should fit to *RPI, x86, amlogic/wetek*
```
cmake -DCMAKE_BUILD_TYPE=Release ..
```
*Developers on x86* linux should use:
```
cmake -DPLATFORM=x11-dev -DCMAKE_BUILD_TYPE=Release ..
```
To use framebuffer instead of dispmanx (for example on the *cubox-i*):
```
cmake -DENABLE_FB=ON -DCMAKE_BUILD_TYPE=Release ..
```
To generate make files on OS X:
Platform should be auto detected and refer to osx, you can also force osx:
```
cmake -DPLATFORM=osx -DCMAKE_BUILD_TYPE=Release ..
```
### Run make to build Hyperion
The `-j $(nproc)` specifies the amount of CPU cores to use.
```bash
make -j $(nproc)
```
On a mac you can use ``sysctl -n hw.ncpu`` to get the number of available CPU cores to use.
```bash
make -j $(sysctl -n hw.ncpu)
```
### Install hyperion into your system
Copy all necessary files to ``/usr/local/share/hyperion``
```bash
sudo make install/strip
```
If you want to install into another location call this before installing
```bash
cmake -DCMAKE_INSTALL_PREFIX=/home/pi/apps ..
```
This will install to ``/home/pi/apps/share/hyperion``
### Integrating hyperion into your system
... ToDo

92
CrossCompileHowto.md Normal file
View File

@ -0,0 +1,92 @@
# Cross-Compile Hyperion-NG
Leverage the power of a host environment (here Ubuntu) compiling for a target platform (here Raspberry Pi).
Use a clean Raspbian Stretch Lite (on target) and Ubuntu 18/19 (on host) to execute the steps outlined below.
## On the Target system (here Raspberry Pi)
Install required additional packages.
```
sudo apt-get install qtbase5-dev libqt5serialport5-dev libusb-1.0-0-dev python3-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libjpeg-dev libqt5sql5-sqlite aptitude show qt5-default rsync
```
## On the Host system (here Ubuntu)
Update the Ubuntu environment to the latest stage and install required additional packages.
```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get -qq -y install git rsync cmake build-essential qtbase5-dev libqt5serialport5-dev libusb-1.0-0-dev python3-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev libjpeg-dev libqt5sql5-sqlite
```
Refine the target IP or hostname, plus userID as required and set-up cross-compilation environment:
```
export TARGET_IP=x.x.x.x
export TARGET_USER=pi
```
```
export CROSSROOT="$HOME/crosscompile"
export RASCROSS_DIR="$CROSSROOT/raspberrypi"
export ROOTFS_DIR="$RASCROSS_DIR/rootfs"
export TOOLCHAIN_DIR="$RASCROSS_DIR/tools"
export QT5_DIR="$CROSSROOT/Qt5"
export HYPERION_DIR="$HOME/hyperion.ng"
```
Get native files from target platform into the host-environment:
```
mkdir -p "$ROOTFS_DIR/lib"
mkdir -p "$ROOTFS_DIR/usr"
rsync -rl --delete-after --copy-unsafe-links $TARGET_USER@$TARGET_IP:/lib "$ROOTFS_DIR"
rsync -rl --delete-after --copy-unsafe-links $TARGET_USER@$TARGET_IP:/usr/include "$ROOTFS_DIR/usr"
rsync -rl --delete-after --copy-unsafe-links $TARGET_USER@$TARGET_IP:/usr/lib "$ROOTFS_DIR/usr"
```
### Raspberry Pi specific steps
Get Raspberry Pi firmware:
```
mkdir -p "$RASCROSS_DIR/firmware"
git clone --depth 1 https://github.com/raspberrypi/firmware.git "$RASCROSS_DIR/firmware"
ln -s "$RASCROSS_DIR/firmware/hardfp/opt" "$ROOTFS_DIR/opt"
```
Get toolchain files which allows to build ARM executables on x86 platforms:
```
mkdir -p "$TOOLCHAIN_DIR"
cd $TOOLCHAIN_DIR
wget -c https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz --no-check-certificate
tar -xvf gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf.tar.xz
```
### Install the Qt5 framework
```
mkdir -p "$QT5_DIR"
cd "$QT5_DIR"
wget -c http://download.qt.io/archive/qt/5.7/5.7.1/qt-opensource-linux-x64-5.7.1.run
chmod +x $QT5_DIR/*.run
```
Display absolute installation directory to be used in Qt5 installer:
```
echo $HOME/crosscompile/Qt5
```
Start the Qt5 installation.
Follow the dialogs and install in absolute directory of ```$HOME/crosscompile/Qt5``` (copy from above)
```
./qt-opensource-linux-x64-5.7.1.run
```
### Get the Hyperion-NG source files
```
git clone --recursive https://github.com/hyperion-project/hyperion.ng.git "$HYPERION_DIR"
```
### Get required submodules for Hyperion
```
cd "$HYPERION_DIR"
git fetch --recurse-submodules -j2
```
### Compile Hyperion-NG
```
cd "$HYPERION_DIR"
chmod +x "$HYPERION_DIR/bin/"*.sh
./bin/create_all_releases.sh
```
### Transfer output packages to target platform and install Hyperion-NG
Output packages for target platform (.deb, .tar.gz, .sh) can be found here:
```
$HYPERION_DIR/deploy/rpi
```
# Install Hyperion-NG on target platform
t.b.d.

View File

@ -1,99 +1,41 @@
// Generated config file // Generated config file
// Define to enable the AMLogic grabber // Define to enable the dispmanx grabber
#cmakedefine ENABLE_AMLOGIC
// Define to enable the DispmanX grabber
#cmakedefine ENABLE_DISPMANX #cmakedefine ENABLE_DISPMANX
// Define to enable the DirectX grabber // Define to enable the v4l2 grabber
#cmakedefine ENABLE_DX
// Define to enable the DXGI DDA (Desktop Duplication API) grabber
#cmakedefine ENABLE_DDA
// Define to enable the framebuffer grabber
// Define to enable the Audio grabber
#cmakedefine ENABLE_AUDIO
// Define to enable the Framebuffer grabber
#cmakedefine ENABLE_FB
// Define to enable the Media Foundation grabber
#cmakedefine ENABLE_MF
// Define to enable the OSX grabber
#cmakedefine ENABLE_OSX
// Define to enable the Qt grabber
#cmakedefine ENABLE_QT
// Define to enable the V4L2 grabber
#cmakedefine ENABLE_V4L2 #cmakedefine ENABLE_V4L2
// Define to enable the X11 grabber // Define to enable the framebuffer grabber
#cmakedefine ENABLE_FB
// Define to enable the amlogic grabber
#cmakedefine ENABLE_AMLOGIC
// Define to enable the osx grabber
#cmakedefine ENABLE_OSX
// Define to enable the x11 grabber
#cmakedefine ENABLE_X11 #cmakedefine ENABLE_X11
// Define to enable the XCB grabber // Define to enable the qt grabber
#cmakedefine ENABLE_XCB #cmakedefine ENABLE_QT
// Define to enable boblight server // Define to enable the spi-device
#cmakedefine ENABLE_BOBLIGHT_SERVER #cmakedefine ENABLE_SPIDEV
// Define to enable CEC // Define to enable the ws281x-pwm-via-dma-device using jgarff's library
#cmakedefine ENABLE_CEC #cmakedefine ENABLE_WS281XPWM
// Define to enable flatbuffer server // Define to enable the tinkerforge device
#cmakedefine ENABLE_FLATBUF_SERVER #cmakedefine ENABLE_TINKERFORGE
// Define to enable protocol buffer server // Define to enable the usb / hid devices
#cmakedefine ENABLE_PROTOBUF_SERVER #cmakedefine ENABLE_USB_HID
// Define to enable hyperion forwarding
#cmakedefine ENABLE_FORWARDER
// Define to enable enable flatbuffer connect
#cmakedefine ENABLE_FLATBUF_CONNECT
// Define to enable protocol buffer connect
#cmakedefine ENABLE_PROTOBUF_CONNECT
// Define to enable the network devices
#cmakedefine ENABLE_DEV_NETWORK
// Define to enable the Serial devices
#cmakedefine ENABLE_DEV_SERIAL
// Define to enable the SPI devices
#cmakedefine ENABLE_DEV_SPI
// Define to enable the Tinkerforge devices
#cmakedefine ENABLE_DEV_TINKERFORGE
// Define to enable the USB / HID devices
#cmakedefine ENABLE_DEV_USB_HID
// Define to enable the WS281x-PWM-via-DMA-device using jgarff's library
#cmakedefine ENABLE_DEV_WS281XPWM
// Define to enable MDNS
#cmakedefine ENABLE_MDNS
// Define to enable EFFECTENGINE
#cmakedefine ENABLE_EFFECTENGINE
// Define to enable experimental features
#cmakedefine ENABLE_EXPERIMENTAL
// Define to enable Hyperion remote control
#cmakedefine ENABLE_REMOTE_CTL
// Define to enable profiler for development purpose // Define to enable profiler for development purpose
#cmakedefine ENABLE_PROFILER #cmakedefine ENABLE_PROFILER
// Define to enable deploy dependencies to packages
#cmakedefine ENABLE_DEPLOY_DEPENDENCIES
// the hyperion build id string // the hyperion build id string
#define HYPERION_BUILD_ID "${HYPERION_BUILD_ID}" #define HYPERION_BUILD_ID "${HYPERION_BUILD_ID}"
#define HYPERION_GIT_REMOTE "${HYPERION_GIT_REMOTE}" #define HYPERION_GIT_REMOTE "${HYPERION_GIT_REMOTE}"

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2014-2024 Hyperion Project Copyright (c) 2014 hyperion team
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,46 +0,0 @@
# Privacy Policy
Hyperion-Project takes your privacy seriously. To better protect your privacy we provide this privacy policy notice
explaining the way your personal or technical information is collected and used.
## Collection of Routine Information
This application does not collect or transmit any user's personally identifiable information.
No personal information is used, stored, secured or disclosed by services this application works with.
Limited technical information is sent (such as IP addresses included in the HTTP/S calls the application makes) but none of that is used or stored.
## Cookies
Where necessary, this app uses cookies to store information about a visitors preferences and history
in order to better serve the user and/or present the user with customized content.
## Links to Third Party Websites
We have included links on this app for your use and reference. We are not responsible for the privacy policies on these websites.
You should be aware that the privacy policies of these websites may differ from our own.
## Security
The security of your personal information is important to us. That is the reason we do not collect any information,
but remember that no method of transmission over the Internet, or method of electronic storage,
is 100% secure. While we strive to use commercially acceptable means to protect your personal information,
we cannot guarantee its absolute security.
## Changes To This Privacy Policy
This Privacy Policy is effective as of February 2022 and will remain in effect except with respect to any changes in its provisions in the future,
which will be in effect immediately after being posted on this page.
We reserve the right to update or change our Privacy Policy at any time and you should check this Privacy Policy periodically.
If we make any material changes to this Privacy Policy, we will notify you by placing a prominent notice on our app.
## Contact Information
For any questions or concerns regarding the privacy policy, please open up an issue on our GitHub
https://github.com/hyperion-project/hyperion.ng

View File

@ -1,21 +1,15 @@
<picture> ![Hyperion](https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/assets/webconfig/img/hyperion/hyperionlogo.png)
<source media="(prefers-color-scheme: dark)" srcset="doc/logo_dark.png">
<source media="(prefers-color-scheme: light)" srcset="doc/logo_light.png">
<img alt="Hyperion" src="doc/logo_light.png">
</picture>
[![Latest-Release](https://img.shields.io/github/v/release/hyperion-project/hyperion.ng?include_prereleases&label=Latest%20Release&logo=github&logoColor=white&color=0f83e7)](https://github.com/hyperion-project/hyperion.ng/releases) [![Dependencies](https://img.shields.io/librariesio/github/hyperion-project/hyperion.ng.svg)](https://github.com/hyperion-project/hyperion.ng/tree/master/dependencies/external)
[![GitHub Actions](https://github.com/hyperion-project/hyperion.ng/actions/workflows/push_pull.yml/badge.svg)](https://github.com/hyperion-project/hyperion.ng/actions) [![Azure-Pipeline](https://dev.azure.com/Hyperion-Project/Hyperion.NG/_apis/build/status/Hyperion.NG?branchName=master)](https://dev.azure.com/Hyperion-Project/Hyperion.NG/_build/latest?definitionId=7&branchName=master)
[![CodeQL Analysis](https://github.com/hyperion-project/hyperion.ng/actions/workflows/codeql.yml/badge.svg)](https://github.com/hyperion-project/hyperion.ng/actions/workflows/codeql.yml) [![Travis-CI](https://travis-ci.org/hyperion-project/hyperion.ng.svg?branch=master)](https://travis-ci.org/hyperion-project/hyperion.ng)
[![Forum](https://img.shields.io/website/https/hyperion-project.org.svg?label=Forum&down_color=red&down_message=offline&up_color=4bc51d&up_message=online&logo=homeadvisor&logoColor=white)](https://www.hyperion-project.org) [![GitHub Actions](https://github.com/hyperion-project/hyperion.ng/workflows/GitHub%20Actions/badge.svg)](https://github.com/hyperion-project/hyperion.ng/actions)
[![Documentation](https://img.shields.io/website/https/docs.hyperion-project.org.svg?label=Documentation&down_color=red&down_message=offline&up_color=4bc51d&up_message=online&logo=read-the-docs)](https://docs.hyperion-project.org) [![LGTM](https://img.shields.io/lgtm/alerts/g/hyperion-project/hyperion.ng.svg)](https://lgtm.com/projects/g/hyperion-project/hyperion.ng/alerts/)
[![Discord](https://img.shields.io/discord/785578322167463937?label=Discord&logo=discord&logoColor=white&color=4bc51d)](https://discord.gg/XtVTb3HEKS) [![Documentation](https://codedocs.xyz/hyperion-project/hyperion.ng.svg)](https://codedocs.xyz/hyperion-project/hyperion.ng/)
[![Package-Repository](https://img.shields.io/badge/Package%20Repository-online-4bc51d?logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHdpZHRoPSIxMTZweCIgaGVpZ2h0PSIxMjNweCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIiB4bWxuczpzZXJpZj0iaHR0cDovL3d3dy5zZXJpZi5jb20vIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjI7Ij48cGF0aCBkPSJNNTUuNzYsNzcuMzlMMTcuMTUsNTcuMTNMNy4xOCw2OUMyMS4xOCw3Ni4zOCAzNC4wOCw4My4zNSA0OC4wNCw5MC43M0w1NS43Niw3Ny40NEw1NS43Niw3Ny4zOVpNNjguNDMsMEw2OC40MywyMS40NEw3OC40MywyMS40NEM3OS44MjQsMjEuMzYyIDgxLjE2NywyMS45OSA4MiwyMy4xMUM4My44NiwyNS45MSA4MS4zMSwyOC42OCA3OS41NSwzMC42MkM3NC41NSwzNi4xMyA2My4xOSw0OC40MiA2MC43MSw1MS4zMkM1OS45MzUsNTIuMzAyIDU4Ljc1MSw1Mi44NzUgNTcuNSw1Mi44NzVDNTYuMjQ5LDUyLjg3NSA1NS4wNjUsNTIuMzAyIDU0LjI5LDUxLjMyQzUxLjczLDQ4LjMyIDM5Ljc0LDM1LjQ2IDM0Ljk3LDMwLjA5QzMzLjMyLDI4LjIzIDMxLjI3LDI1LjY5IDMyLjk3LDIzLjA5QzMzLjgwMSwyMS45NzMgMzUuMTQsMjEuMzQ1IDM2LjUzLDIxLjQyTDQ2LjUzLDIxLjQyTDQ2LjUzLDBMNjguNDMsMFpNMzUuNDMsNDYuMzRMMTkuNzcsNTQuMTJMNTguMjYsNzQuMzVMOTYuODIsNTQuMDhMODAuMjgsNDUuNDhMODIuOTgsNDIuNDhMOTcuOTgsNTAuMjJMMTA4Ljg1LDQwTDkyLjM2LDMxQzkyLjk5NCwyOS43NDUgOTMuNDEzLDI4LjM5MyA5My42LDI3TDExNC4yMywzNy45QzExNC4zNjUsMzcuOTcyIDExNC40ODcsMzguMDY3IDExNC41OSwzOC4xOEMxMTQuODY2LDM4LjQ1NiAxMTUuMDIxLDM4LjgzIDExNS4wMjEsMzkuMjJDMTE1LjAyMSwzOS42MSAxMTQuODY2LDM5Ljk4NCAxMTQuNTksNDAuMjZMMTAxLjM0LDUzLjI2TDExNC4xNyw2OC42MkMxMTQuNjksNjkuMjQ0IDExNC42MDksNzAuMTg0IDExMy45OSw3MC43MUMxMTMuODk1LDcwLjc4IDExMy43OTQsNzAuODQ0IDExMy42OSw3MC45TDEwMi4xNCw3N0wxMDIuMTQsOTkuODhDMTAyLjEzOSwxMDAuNDc3IDEwMS43OCwxMDEuMDE4IDEwMS4yMywxMDEuMjVMNTkuNTcsMTIyLjM5QzU5LjI5LDEyMi43IDU4Ljg5MSwxMjIuODc3IDU4LjQ3MywxMjIuODc3QzU3LjkxNCwxMjIuODc3IDU3LjQwMSwxMjIuNTYgNTcuMTUsMTIyLjA2TDE1LjQxLDEwMS4yQzE0LjkxNCwxMDAuOTQ4IDE0LjYsMTAwLjQzNyAxNC42LDk5Ljg4TDE0LjYsNzcuMTZMMi44NSw3MUMyLjc0Niw3MC45NDQgMi42NDUsNzAuODggMi41NSw3MC44MUMxLjkzMSw3MC4yODQgMS44NSw2OS4zNDQgMi4zNyw2OC43MkwxNC44Nyw1My43MkwwLjM2LDQwQzAuMTE3LDM5LjcyNyAtMC4wMTcsMzkuMzc0IC0wLjAxNywzOS4wMDlDLTAuMDE3LDM4LjU3NSAwLjE3MiwzOC4xNjMgMC41LDM3Ljg4QzAuNTksMzcuODA4IDAuNjg3LDM3Ljc0NCAwLjc5LDM3LjY5TDIxLjczLDI1Ljg0QzIxLjgyNywyNy4yODcgMjIuMTM0LDI4LjcxMSAyMi42NCwzMC4wN0w1LjY5LDM5LjcxTDE3LjUyLDUwLjcxTDMyLjYxLDQzLjI0TDM1LjQ2LDQ2LjM1TDM1LjQzLDQ2LjM0Wk05OS41OSw1Ny4yOEw2MS4wNSw3Ny41TDY4LjU2LDkwLjgyTDEwOS4xMSw2OC44Mkw5OS41OSw1Ny4yOFoiIHN0eWxlPSJmaWxsOndoaXRlO2ZpbGwtcnVsZTpub256ZXJvOyIvPjwvc3ZnPg==)](https://releases.hyperion-project.org)
![made-with-love](https://img.shields.io/badge/Made%20With-&#9829;-ff0000.svg)
## About Hyperion ## About Hyperion
[Hyperion](https://github.com/hyperion-project/hyperion.ng) is an opensource [Bias or Ambient Lighting](https://en.wikipedia.org/wiki/Bias_lighting) implementation which you might know from TV manufacturers. It supports many LED devices and video grabbers. [Hyperion](https://github.com/hyperion-project/hyperion.ng) is an opensource [Bias or Ambient Lighting](https://en.wikipedia.org/wiki/Bias_lighting) implementation which you might know from TV manufacturers. It supports many LED devices and video grabbers. The project is still in a beta development stage (no stable release available).
![Screenshot](doc/screenshot.png) ![Screenshot](doc/screenshot.png)
@ -24,55 +18,34 @@
* Low CPU load makes it perfect for SoCs like Raspberry Pi * Low CPU load makes it perfect for SoCs like Raspberry Pi
* Json interface which allows easy integration into scripts * Json interface which allows easy integration into scripts
* A command line utility for testing and integration in automated environment * A command line utility for testing and integration in automated environment
* Priority channels are not coupled to a specific led data provider which means that a provider can post led data and leave without the need to maintain a connection to Hyperion. This is ideal for a remote application (like our former [Android app](https://play.google.com/store/apps/details?id=nl.hyperion.hyperionpro), which is no longer available). * Priority channels are not coupled to a specific led data provider which means that a provider can post led data and leave without the need to maintain a connection to Hyperion. This is ideal for a remote application (like our [Android app](https://play.google.com/store/apps/details?id=nl.hyperion.hyperionpro)).
* Black border detector and processor * Black border detector and processor
* A scriptable (Python) effect engine with 39 build-in effects for your inspiration * A scriptable (Python) effect engine
* A multi language web interface to configure and remote control hyperion * A multi language web interface to configure and remote control hyperion
### Supported Hardware If you need further support please open a topic at the forum!
[![Hyperion webpage/forum](https://img.shields.io/website/https/hyperion-project.org.svg?down_color=red&down_message=offline&up_color=green&up_message=online)](https://www.hyperion-project.org)
You can find a list of supported hardware [here](https://docs.hyperion-project.org/user/leddevices/Overview.html). ## Contributing
If you need further support please open a topic at the forum!<br> Contributions are welcome! Feel free to join us! We are looking always for people who wants to participate.
[![Forum](https://img.shields.io/website/https/hyperion-project.org.svg?label=Forum&down_color=red&down_message=offline&up_color=4bc51d&up_message=online&logo=homeadvisor&logoColor=white)](https://www.hyperion-project.org) [![Contributors](https://img.shields.io/github/contributors/hyperion-project/hyperion.ng.svg)](https://github.com/hyperion-project/hyperion.ng/graphs/contributors)
## Contributing For an example, you can participate in the translation.
[![Join Translation](https://img.shields.io/badge/POEditor-translate-green.svg)](https://poeditor.com/join/project/Y4F6vHRFjA)
Contributions are welcome! Feel free to join us! We are looking always for people who wants to participate.<br> ## Requirements
[![Contributors](https://img.shields.io/github/contributors/hyperion-project/hyperion.ng.svg?label=Contributors&logo=github&logoColor=white)](https://github.com/hyperion-project/hyperion.ng/graphs/contributors) Debian 9, Ubuntu 16.04 or higher. Windows is not supported currently.
For an example, you can participate in the translation.<br> We provide a macOS Build but we can not support this.
[![Join Translation](https://img.shields.io/badge/POEditor-4bc51d.svg?label=Join%20Translation)](https://poeditor.com/join/project/Y4F6vHRFjA)
## Supported Platforms
Find here more details on [supported platforms and configuration sets](doc/development/SupportedPlatforms.md).
## Documentation
Covers these topics:
- [Getting Started and Installation](https://docs.hyperion-project.org/user/GettingStarted.html)
- [Configuration](https://docs.hyperion-project.org/user/Configuration.html)
- [Effect development](https://docs.hyperion-project.org/effects/Effects.html)
- [JSON API](https://docs.hyperion-project.org/json/JSON.html)
[![Visit Documentation](https://img.shields.io/website/https/docs.hyperion-project.org.svg?label=Documentation&down_color=red&down_message=offline&up_color=4bc51d&up_message=online&logo=read-the-docs)](https://docs.hyperion-project.org)
## Changelog
Released and unreleased changes at [CHANGELOG.md](CHANGELOG.md).
## Building ## Building
See [CompileHowto.md](doc/development/CompileHowto.md). See [CompileHowto](CompileHowto.md) and [CrossCompileHowto](CrossCompileHowto.md).
## Installation
See [Getting Started](https://docs.hyperion-project.org/user/GettingStarted.html) or on the [Release Repository](https://releases.hyperion-project.org).
## Download ## Download
GitHub Releases are available on the [Hyperion release page](https://github.com/hyperion-project/hyperion.ng/releases). **Please be patient. The first release is coming soon.**
## Privacy Policy
See [PRIVACY.md](PRIVACY.md).
## License ## License
The source is released under MIT-License (see https://opensource.org/licenses/MIT).<br> The source is released under MIT-License (see http://opensource.org/licenses/MIT).
[![GitHub license](https://img.shields.io/badge/License-MIT-yellow.svg)](https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/LICENSE) [![GitHub license](https://img.shields.io/badge/License-MIT-yellow.svg)](https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/LICENSE)

View File

@ -1,655 +0,0 @@
#include <NeoPixelBus.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////// CONFIG SECTION STARTS /////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
#define THIS_IS_RGBW // RGBW SK6812, otherwise comment it
#define COLD_WHITE // for RGBW (THIS_IS_RGBW enabled) select COLD version, comment it if NEUTRAL
const bool skipFirstLed = false; // if set the first led in the strip will be set to black (for level shifters using sacrifice LED)
const int serialSpeed = 2000000; // serial port speed
#define DATA_PIN 2 // PIN: data output for LED strip
const bool reportStats = false; // Send back processing statistics
const int reportStatInterval_s = 10; // Send back processing every interval in seconds
/* Statistics breakdown:
FPS: Updates to the LEDs per second
F-FPS: Frames identified per second
S: Shown (Done) updates to the LEDs per given interval
F: Frames identified per interval (garbled grames cannot be counted)
G: Good frames identified per interval
B: Total bad frames of all types identified per interval
BF: Bad frames identified per interval
BS: Skipped incomplete frames
BC: Frames failing CRC check per interval
BFL Frames failing Fletcher content validation per interval
*/
//Developer configs
#define ENABLE_STRIP
#define ENABLE_CHECK_FLETCHER
const int SERIAL_SIZE_RX = 4096;
#ifndef ENABLE_STRIP
const int serial2Speed = 460800;
const bool reportInput = false;
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////// CONFIG SECTION ENDS /////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
const String version = "8.0";
#ifdef THIS_IS_RGBW
float whiteLimit = 1.0f;
#ifdef COLD_WHITE
uint8_t rCorrection = 0xA0; // adjust red -> white in 0-0xFF range
uint8_t gCorrection = 0xA0; // adjust green -> white in 0-0xFF range
uint8_t bCorrection = 0xA0; // adjust blue -> white in 0-0xFF range
#else
uint8_t rCorrection = 0xB0; // adjust red -> white in 0-0xFF range
uint8_t gCorrection = 0xB0; // adjust green -> white in 0-0xFF range
uint8_t bCorrection = 0x70; // adjust blue -> white in 0-0xFF range
#endif
#endif
int ledCount = 0; // This is dynamic, don't change it
int pixelCount = 0; // This is dynamic, don't change it
#ifdef THIS_IS_RGBW
#define LED_TYPE NeoGrbwFeature
#if defined(ARDUINO_LOLIN_S2_MINI)
#define LED_METHOD NeoEsp32I2s0Sk6812Method
#else
#define LED_METHOD NeoEsp32I2s1Sk6812Method
#endif
#else
#define LED_TYPE NeoGrbFeature
#if defined(ARDUINO_LOLIN_S2_MINI)
#define LED_METHOD NeoEsp32I2s0Ws2812xMethod
#else
#define LED_METHOD NeoEsp32I2s1Ws2812xMethod
#endif
#endif
#define LED_DRIVER NeoPixelBus<LED_TYPE, LED_METHOD>
uint8_t* ledBuffer;
int ledBufferSize;
#ifdef ENABLE_STRIP
LED_DRIVER* strip = NULL;
#endif
enum class AwaProtocol
{
HEADER_A,
HEADER_w,
HEADER_a,
HEADER_HI,
HEADER_LO,
HEADER_CRC,
CHANNELCALIB_GAIN,
CHANNELCALIB_RED,
CHANNELCALIB_GREEN,
CHANNELCALIB_BLUE,
PIXEL,
FLETCHER1,
FLETCHER2,
FLETCHER_EXT
};
AwaProtocol state = AwaProtocol::HEADER_A;
const int headerSize = 6;
const int trailerSize = 3;
const int calibInfoSize = 4;
int bytesRead = 0;
bool isVersion2 = false;
bool isChannelCalib = false;
uint8_t CRC = 0;
int count = 0;
int currentPixel = 0;
uint16_t fletcher1 = 0;
uint16_t fletcher2 = 0;
uint16_t fletcherExt = 0;
#ifdef THIS_IS_RGBW
RgbwColor inputColor;
uint8_t wChannel[256];
uint8_t rChannel[256];
uint8_t gChannel[256];
uint8_t bChannel[256];
#else
RgbColor inputColor;
#endif
bool ledsComplete = false;
// statistics
const int reportStatInterval_ms = reportStatInterval_s * 1000;
unsigned long curTime;
unsigned long stat_start = 0;
uint16_t stat_shown = 0;
uint16_t stat_frames = 0;
uint16_t stat_good = 0;
uint16_t stat_bad = 0;
uint16_t stat_bad_frame = 0;
uint16_t stat_bad_skip = 0;
uint16_t stat_bad_crc = 0;
uint16_t stat_bad_fletcher = 0;
uint16_t stat_final_shown = 0;
uint16_t stat_final_frames = 0;
uint16_t stat_final_good = 0;
uint16_t stat_final_bad = 0;
uint16_t stat_final_bad_frame = 0;
uint16_t stat_final_bad_skip = 0;
uint16_t stat_final_bad_crc = 0;
uint16_t stat_final_bad_fletcher = 0;
//Debugging
String inputString;
String inputErrorString;
String debugString;
void printStringHex(String string)
{
#ifndef ENABLE_STRIP
Serial2.println(string.length());
for (int i = 0; i < string.length(); ++i)
{
if (i % 36 == 0)
{
Serial2.println();
Serial2.print("[");
Serial2.print(i);
Serial2.print("] ");
}
if (string[i] < 16)
Serial2.print("0");
Serial2.print(string[i], HEX);
Serial2.print(":");
}
#endif
}
inline void showMe()
{
#ifdef ENABLE_STRIP
if (strip != NULL && strip->CanShow())
{
stat_shown++;
strip->Show();
}
#endif
}
// statistics
inline void showStats()
{
if (reportStats)
{
if (stat_frames > 0)
{
stat_final_shown = stat_shown;
stat_final_frames = stat_frames;
stat_final_good = stat_good;
stat_final_bad = stat_bad;
stat_final_bad_frame = stat_bad_frame;
stat_final_bad_skip = stat_bad_skip;
stat_final_bad_crc = stat_bad_crc;
stat_final_bad_fletcher = stat_bad_fletcher;
}
stat_start = curTime;
stat_shown = 0;
stat_frames = 0;
stat_good = 0;
stat_bad = 0;
stat_bad_frame = 0;
stat_bad_skip = 0;
stat_bad_crc = 0;
stat_bad_fletcher = 0;
String summary = String("FPS: ") + (stat_final_shown / reportStatInterval_s) +
" F-FPS: " + (stat_final_frames / reportStatInterval_s) +
" S: " + stat_final_shown +
" F: " + stat_final_frames +
" G: " + stat_final_good +
" B: " + stat_final_bad +
" (BF: " + stat_final_bad_frame +
" BS: " + stat_final_bad_skip +
" BC: " + stat_final_bad_crc +
" BFL: " + stat_final_bad_fletcher +
")";
#ifdef ENABLE_STRIP
Serial.println(summary);
#else
Serial2.println(summary);
#endif
}
}
void InitLeds(uint16_t ledCount, int pixelCount, bool channelCalibration = false)
{
if (ledBuffer != NULL)
delete ledBuffer;
ledBufferSize = pixelCount + (channelCalibration ? calibInfoSize : 0);
ledBuffer = new uint8_t[ledBufferSize];
#ifdef ENABLE_STRIP
if (strip != NULL)
delete strip;
strip = new LED_DRIVER(ledCount, DATA_PIN);
strip->Begin();
#endif
}
inline void processSerialData()
{
while (Serial.available()) {
char input = Serial.read();
++bytesRead;
#ifndef ENABLE_STRIP
if (reportInput)
inputString += input;
#endif
switch (state)
{
case AwaProtocol::HEADER_A:
if (input == 'A')
{
state = AwaProtocol::HEADER_w;
}
break;
case AwaProtocol::HEADER_w:
if (input == 'w')
state = AwaProtocol::HEADER_a;
else
{
state = AwaProtocol::HEADER_A;
}
break;
case AwaProtocol::HEADER_a:
if (input == 'a')
{
isVersion2 = false;
state = AwaProtocol::HEADER_HI;
}
else if (input == 'A')
{
state = AwaProtocol::HEADER_HI;
isVersion2 = true;
}
else
{
state = AwaProtocol::HEADER_A;
}
break;
case AwaProtocol::HEADER_HI:
stat_frames++;
count = input << 8;
CRC = input;
fletcher1 = 0;
fletcher2 = 0;
fletcherExt = 0;
state = AwaProtocol::HEADER_LO;
break;
case AwaProtocol::HEADER_LO:
count += input + 1;
if (ledCount != count || isChannelCalib != isVersion2)
{
ledCount = count;
isChannelCalib = isVersion2;
pixelCount = ledCount * 3;
if (isChannelCalib)
prepareCalibration();
InitLeds(ledCount, pixelCount, isChannelCalib);
}
CRC = CRC ^ input ^ 0x55;
state = AwaProtocol::HEADER_CRC;
break;
case AwaProtocol::HEADER_CRC:
// Check, if incomplete package information was skipped, set bytesread to headersize and skip wrong input
if (bytesRead != headerSize)
{
stat_bad_skip++;
bytesRead = headerSize;
}
currentPixel = 0;
if (CRC == input)
{
state = AwaProtocol::PIXEL;
}
else
{
// CRC failure
stat_bad++;
stat_bad_crc++;
state = AwaProtocol::HEADER_A;
}
break;
case AwaProtocol::PIXEL:
ledBuffer[currentPixel++] = input;
if (currentPixel == pixelCount)
{
if (isChannelCalib)
state = AwaProtocol::CHANNELCALIB_GAIN;
else
state = AwaProtocol::FLETCHER1;
}
break;
case AwaProtocol::CHANNELCALIB_GAIN:
ledBuffer[currentPixel++] = input;
state = AwaProtocol::CHANNELCALIB_RED;
break;
case AwaProtocol::CHANNELCALIB_RED:
ledBuffer[currentPixel++] = input;
state = AwaProtocol::CHANNELCALIB_GREEN;
break;
case AwaProtocol::CHANNELCALIB_GREEN:
ledBuffer[currentPixel++] = input;
state = AwaProtocol::CHANNELCALIB_BLUE;
break;
case AwaProtocol::CHANNELCALIB_BLUE:
ledBuffer[currentPixel++] = input;
state = AwaProtocol::FLETCHER1;
break;
case AwaProtocol::FLETCHER1:
fletcher1 = input;
state = AwaProtocol::FLETCHER2;
break;
case AwaProtocol::FLETCHER2:
fletcher2 = input;
state = AwaProtocol::FLETCHER_EXT;
break;
case AwaProtocol::FLETCHER_EXT:
fletcherExt = input;
ledsComplete = true;
state = AwaProtocol::HEADER_A;
break;
}
}
}
void setup()
{
// Init serial port
int bufSize = Serial.setRxBufferSize(SERIAL_SIZE_RX);
Serial.begin(serialSpeed);
Serial.setTimeout(50);
#ifndef ENABLE_STRIP
Serial2.begin(serial2Speed);
Serial2.println();
Serial2.println("Welcome!");
Serial2.println("Hyperion Awa driver " + version);
Serial2.println("!!! Debug Output !!!");
#endif
// Display config
Serial.println();
Serial.println("Welcome!");
Serial.println("Hyperion Awa driver " + version);
Serial.print("(Build: ");
Serial.print(__DATE__);
Serial.print(" ");
Serial.print(__TIME__);
Serial.println(")");
// first LED info
if (skipFirstLed)
Serial.println("First LED: disabled");
else
Serial.println("First LED: enabled");
// RGBW claibration info
#ifdef THIS_IS_RGBW
#ifdef COLD_WHITE
Serial.println("Default color mode: RGBW cold");
#else
Serial.println("Default color mode: RGBW neutral");
#endif
prepareCalibration();
#else
Serial.println("Color mode: RGB");
#endif
InitLeds(ledCount, pixelCount);
}
void prepareCalibration()
{
#ifdef THIS_IS_RGBW
// prepare LUT calibration table, cold white is much better than "neutral" white
for (uint32_t i = 0; i < 256; i++)
{
// color calibration
float red = rCorrection * i; // adjust red
float green = gCorrection * i; // adjust green
float blue = bCorrection * i; // adjust blue
wChannel[i] = (uint8_t)round(min(whiteLimit * i, 255.0f));
rChannel[i] = (uint8_t)round(min(red / 0xFF, 255.0f));
gChannel[i] = (uint8_t)round(min(green / 0xFF, 255.0f));
bChannel[i] = (uint8_t)round(min(blue / 0xFF, 255.0f));
}
Serial.write("RGBW calibration. White limit(%): ");
Serial.print(whiteLimit * 100.0f);
Serial.write(" %, red: ");
Serial.print(rCorrection);
Serial.write(" , green: ");
Serial.print(gCorrection);
Serial.write(" , blue: ");
Serial.print(bCorrection);
Serial.println();
#endif
}
void loop()
{
curTime = millis();
#ifdef __AVR__
// nothing , USART Interrupt is implemented
ESPserialEvent();
#else
// ESP8266 polling
ESPserialEvent();
#endif
if (ledsComplete)
{
#ifndef ENABLE_STRIP
if (reportInput)
{
Serial2.println();
Serial2.print("<input> L: ");
printStringHex(inputString);
Serial2.println("<\input>");
inputString = "";
Serial2.print("bytesRead: ");
Serial2.print(bytesRead);
Serial2.print(" , currentPixel: ");
Serial2.print(currentPixel);
Serial2.print(" ,pixelCount: ");
Serial2.print(pixelCount);
Serial2.println();
}
#endif
int frameSize = headerSize + ledBufferSize + trailerSize;
if (bytesRead > frameSize)
{
//Add number of frames ignored on top of frame
int frames = bytesRead / frameSize;
stat_frames += frames;
//Count frame plus frames ignored as bad frames
int badFrames = frames + 1;
stat_bad += badFrames;
stat_bad_frame += badFrames;
}
else
{
#ifdef ENABLE_CHECK_FLETCHER
//Test if content is valid
uint16_t item = 0;
uint16_t fletch1 = 0;
uint16_t fletch2 = 0;
uint16_t fletchExt = 0;
while (item < ledBufferSize)
{
fletch1 = (fletch1 + (uint16_t)ledBuffer[item]) % 255;
fletch2 = (fletch2 + fletch1) % 255;
fletcherExt = (fletcherExt + ((uint16_t)ledBuffer[item] ^ (item))) % 255;
++item;
}
if ((fletch1 == fletcher1) && (fletch2 == fletcher2) && (ledBuffer[item-1] == (fletcherExt != 0x41) ? fletcherExt : 0xaa))
{
#endif
stat_good++;
uint16_t startLed = 0;
if (skipFirstLed)
{
#ifdef ENABLE_STRIP
#ifdef THIS_IS_RGBW
strip->SetPixelColor(startLed, RgbwColor(0, 0, 0, 0));
#else
strip->SetPixelColor(startLed, RgbColor(0, 0, 0));
#endif
#endif
startLed = 1;
}
for (uint16_t led = startLed; led < ledCount; ++led)
{
inputColor.R = ledBuffer[led * 3];
inputColor.G = ledBuffer[led * 3 + 1];
inputColor.B = ledBuffer[led * 3 + 2];
#ifdef THIS_IS_RGBW
inputColor.W = min(rChannel[inputColor.R],
min(gChannel[inputColor.G],
bChannel[inputColor.B]));
inputColor.R -= rChannel[inputColor.W];
inputColor.G -= gChannel[inputColor.W];
inputColor.B -= bChannel[inputColor.W];
inputColor.W = wChannel[inputColor.W];
#endif
#ifdef ENABLE_STRIP
strip->SetPixelColor(led, inputColor);
#endif
}
showMe();
yield();
#ifdef THIS_IS_RGBW
if (isChannelCalib)
{
uint8_t incoming_gain = ledBuffer[pixelCount];
uint8_t incoming_red = ledBuffer[pixelCount + 1];
uint8_t incoming_green = ledBuffer[pixelCount + 2];
uint8_t incoming_blue = ledBuffer[pixelCount + 3];
float final_limit = (incoming_gain != 255) ? incoming_gain / 255.0f : 1.0f;
if (rCorrection != incoming_red || gCorrection != incoming_green || bCorrection != incoming_blue || whiteLimit != final_limit)
{
rCorrection = incoming_red;
gCorrection = incoming_green;
bCorrection = incoming_blue;
whiteLimit = final_limit;
prepareCalibration();
}
}
#endif
#ifdef ENABLE_CHECK_FLETCHER
}
else
{
stat_bad++;
stat_bad_fletcher++;
}
#endif
}
bytesRead = 0;
state = AwaProtocol::HEADER_A;
ledsComplete = false;
}
if ((curTime - stat_start > reportStatInterval_ms))
{
if (stat_frames > 0)
{
showStats();
}
}
}
#ifdef __AVR__
void serialEvent()
{
processSerialData();
}
#elif defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
void ESPserialEvent()
{
processSerialData();
}
#endif

View File

@ -1,646 +0,0 @@
#include <NeoPixelBus.h>
////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////// CONFIG SECTION STARTS /////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
#define THIS_IS_RGBW // RGBW SK6812, otherwise comment it
#define COLD_WHITE // for RGBW (THIS_IS_RGBW enabled) select COLD version, comment it if NEUTRAL
const bool skipFirstLed = false; // if set the first led in the strip will be set to black (for level shifters using sacrifice LED)
const int serialSpeed = 2000000; // serial port speed
const bool reportStats = false; // Send back processing statistics
const int reportStatInterval_s = 10; // Send back processing every interval in seconds
/* Statistics breakdown:
FPS: Updates to the LEDs per second
F-FPS: Frames identified per second
S: Shown (Done) updates to the LEDs per given interval
F: Frames identified per interval (garbled grames cannot be counted)
G: Good frames identified per interval
B: Total bad frames of all types identified per interval
BF: Bad frames identified per interval
BS: Skipped incomplete frames
BC: Frames failing CRC check per interval
BFL Frames failing Fletcher content validation per interval
*/
//Developer configs
#define ENABLE_STRIP
#define ENABLE_CHECK_FLETCHER
const int SERIAL_SIZE_RX = 4096;
#ifndef ENABLE_STRIP
const int serial2Speed = 460800;
const bool reportInput = false;
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////// CONFIG SECTION ENDS /////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
const String version = "8.0";
#ifdef THIS_IS_RGBW
float whiteLimit = 1.0f;
#ifdef COLD_WHITE
uint8_t rCorrection = 0xA0; // adjust red -> white in 0-0xFF range
uint8_t gCorrection = 0xA0; // adjust green -> white in 0-0xFF range
uint8_t bCorrection = 0xA0; // adjust blue -> white in 0-0xFF range
#else
uint8_t rCorrection = 0xB0; // adjust red -> white in 0-0xFF range
uint8_t gCorrection = 0xB0; // adjust green -> white in 0-0xFF range
uint8_t bCorrection = 0x70; // adjust blue -> white in 0-0xFF range
#endif
#endif
int ledCount = 0; // This is dynamic, don't change it
int pixelCount = 0; // This is dynamic, don't change it
#ifdef THIS_IS_RGBW
#define LED_TYPE NeoGrbwFeature
#define LED_METHOD NeoEsp8266Uart1Sk6812Method
#else
#define LED_TYPE NeoGrbFeature
#define LED_METHOD NeoEsp8266Uart1Ws2812xMethod
#endif
#define LED_DRIVER NeoPixelBus<LED_TYPE, LED_METHOD>
uint8_t* ledBuffer;
int ledBufferSize;
#ifdef ENABLE_STRIP
LED_DRIVER* strip = NULL;
#endif
enum class AwaProtocol
{
HEADER_A,
HEADER_w,
HEADER_a,
HEADER_HI,
HEADER_LO,
HEADER_CRC,
CHANNELCALIB_GAIN,
CHANNELCALIB_RED,
CHANNELCALIB_GREEN,
CHANNELCALIB_BLUE,
PIXEL,
FLETCHER1,
FLETCHER2,
FLETCHER_EXT
};
AwaProtocol state = AwaProtocol::HEADER_A;
const int headerSize = 6;
const int trailerSize = 3;
const int calibInfoSize = 4;
int bytesRead = 0;
bool isVersion2 = false;
bool isChannelCalib = false;
uint8_t CRC = 0;
int count = 0;
int currentPixel = 0;
uint16_t fletcher1 = 0;
uint16_t fletcher2 = 0;
uint16_t fletcherExt = 0;
#ifdef THIS_IS_RGBW
RgbwColor inputColor;
uint8_t wChannel[256];
uint8_t rChannel[256];
uint8_t gChannel[256];
uint8_t bChannel[256];
#else
RgbColor inputColor;
#endif
bool ledsComplete = false;
// statistics
const int reportStatInterval_ms = reportStatInterval_s * 1000;
unsigned long curTime;
unsigned long stat_start = 0;
uint16_t stat_shown = 0;
uint16_t stat_frames = 0;
uint16_t stat_good = 0;
uint16_t stat_bad = 0;
uint16_t stat_bad_frame = 0;
uint16_t stat_bad_skip = 0;
uint16_t stat_bad_crc = 0;
uint16_t stat_bad_fletcher = 0;
uint16_t stat_final_shown = 0;
uint16_t stat_final_frames = 0;
uint16_t stat_final_good = 0;
uint16_t stat_final_bad = 0;
uint16_t stat_final_bad_frame = 0;
uint16_t stat_final_bad_skip = 0;
uint16_t stat_final_bad_crc = 0;
uint16_t stat_final_bad_fletcher = 0;
//Debugging
String inputString;
String inputErrorString;
String debugString;
void printStringHex(String string)
{
#ifndef ENABLE_STRIP
Serial2.println(string.length());
for (int i = 0; i < string.length(); ++i)
{
if (i % 36 == 0)
{
Serial2.println();
Serial2.print("[");
Serial2.print(i);
Serial2.print("] ");
}
if (string[i] < 16)
Serial2.print("0");
Serial2.print(string[i], HEX);
Serial2.print(":");
}
#endif
}
inline void showMe()
{
#ifdef ENABLE_STRIP
if (strip != NULL && strip->CanShow())
{
stat_shown++;
strip->Show();
}
#endif
}
// statistics
inline void showStats()
{
if (reportStats)
{
if (stat_frames > 0)
{
stat_final_shown = stat_shown;
stat_final_frames = stat_frames;
stat_final_good = stat_good;
stat_final_bad = stat_bad;
stat_final_bad_frame = stat_bad_frame;
stat_final_bad_skip = stat_bad_skip;
stat_final_bad_crc = stat_bad_crc;
stat_final_bad_fletcher = stat_bad_fletcher;
}
stat_start = curTime;
stat_shown = 0;
stat_frames = 0;
stat_good = 0;
stat_bad = 0;
stat_bad_frame = 0;
stat_bad_skip = 0;
stat_bad_crc = 0;
stat_bad_fletcher = 0;
String summary = String("FPS: ") + (stat_final_shown / reportStatInterval_s) +
" F-FPS: " + (stat_final_frames / reportStatInterval_s) +
" S: " + stat_final_shown +
" F: " + stat_final_frames +
" G: " + stat_final_good +
" B: " + stat_final_bad +
" (BF: " + stat_final_bad_frame +
" BS: " + stat_final_bad_skip +
" BC: " + stat_final_bad_crc +
" BFL: " + stat_final_bad_fletcher +
")";
#ifdef ENABLE_STRIP
Serial.println(summary);
#else
Serial2.println(summary);
#endif
}
}
void InitLeds(uint16_t ledCount, int pixelCount, bool channelCalibration = false)
{
if (ledBuffer != NULL)
delete ledBuffer;
ledBufferSize = pixelCount + (channelCalibration ? calibInfoSize : 0);
ledBuffer = new uint8_t[ledBufferSize];
#ifdef ENABLE_STRIP
if (strip != NULL)
delete strip;
strip = new LED_DRIVER(ledCount);
strip->Begin();
#endif
}
inline void processSerialData()
{
while (Serial.available()) {
char input = Serial.read();
++bytesRead;
#ifndef ENABLE_STRIP
if (reportInput)
inputString += input;
#endif
switch (state)
{
case AwaProtocol::HEADER_A:
if (input == 'A')
{
state = AwaProtocol::HEADER_w;
}
break;
case AwaProtocol::HEADER_w:
if (input == 'w')
state = AwaProtocol::HEADER_a;
else
{
state = AwaProtocol::HEADER_A;
}
break;
case AwaProtocol::HEADER_a:
if (input == 'a')
{
isVersion2 = false;
state = AwaProtocol::HEADER_HI;
}
else if (input == 'A')
{
state = AwaProtocol::HEADER_HI;
isVersion2 = true;
}
else
{
state = AwaProtocol::HEADER_A;
}
break;
case AwaProtocol::HEADER_HI:
stat_frames++;
count = input << 8;
CRC = input;
fletcher1 = 0;
fletcher2 = 0;
fletcherExt = 0;
state = AwaProtocol::HEADER_LO;
break;
case AwaProtocol::HEADER_LO:
count += input + 1;
if (ledCount != count || isChannelCalib != isVersion2)
{
ledCount = count;
isChannelCalib = isVersion2;
pixelCount = ledCount * 3;
if (isChannelCalib)
prepareCalibration();
InitLeds(ledCount, pixelCount, isChannelCalib);
}
CRC = CRC ^ input ^ 0x55;
state = AwaProtocol::HEADER_CRC;
break;
case AwaProtocol::HEADER_CRC:
// Check, if incomplete package information was skipped, set bytesread to headersize and skip wrong input
if (bytesRead != headerSize)
{
stat_bad_skip++;
bytesRead = headerSize;
}
currentPixel = 0;
if (CRC == input)
{
state = AwaProtocol::PIXEL;
}
else
{
// CRC failure
stat_bad++;
stat_bad_crc++;
state = AwaProtocol::HEADER_A;
}
break;
case AwaProtocol::PIXEL:
ledBuffer[currentPixel++] = input;
if (currentPixel == pixelCount)
{
if (isChannelCalib)
state = AwaProtocol::CHANNELCALIB_GAIN;
else
state = AwaProtocol::FLETCHER1;
}
break;
case AwaProtocol::CHANNELCALIB_GAIN:
ledBuffer[currentPixel++] = input;
state = AwaProtocol::CHANNELCALIB_RED;
break;
case AwaProtocol::CHANNELCALIB_RED:
ledBuffer[currentPixel++] = input;
state = AwaProtocol::CHANNELCALIB_GREEN;
break;
case AwaProtocol::CHANNELCALIB_GREEN:
ledBuffer[currentPixel++] = input;
state = AwaProtocol::CHANNELCALIB_BLUE;
break;
case AwaProtocol::CHANNELCALIB_BLUE:
ledBuffer[currentPixel++] = input;
state = AwaProtocol::FLETCHER1;
break;
case AwaProtocol::FLETCHER1:
fletcher1 = input;
state = AwaProtocol::FLETCHER2;
break;
case AwaProtocol::FLETCHER2:
fletcher2 = input;
state = AwaProtocol::FLETCHER_EXT;
break;
case AwaProtocol::FLETCHER_EXT:
fletcherExt = input;
ledsComplete = true;
state = AwaProtocol::HEADER_A;
break;
}
}
}
void setup()
{
// Init serial port
int bufSize = Serial.setRxBufferSize(SERIAL_SIZE_RX);
Serial.begin(serialSpeed);
Serial.setTimeout(50);
#ifndef ENABLE_STRIP
Serial2.begin(serial2Speed);
Serial2.println();
Serial2.println("Welcome!");
Serial2.println("Hyperion Awa driver " + version);
Serial2.println("!!! Debug Output !!!");
#endif
// Display config
Serial.println();
Serial.println("Welcome!");
Serial.println("Hyperion Awa driver " + version);
Serial.print("(Build: ");
Serial.print(__DATE__);
Serial.print(" ");
Serial.print(__TIME__);
Serial.println(")");
// first LED info
if (skipFirstLed)
Serial.println("First LED: disabled");
else
Serial.println("First LED: enabled");
// RGBW claibration info
#ifdef THIS_IS_RGBW
#ifdef COLD_WHITE
Serial.println("Default color mode: RGBW cold");
#else
Serial.println("Default color mode: RGBW neutral");
#endif
prepareCalibration();
#else
Serial.println("Color mode: RGB");
#endif
InitLeds(ledCount, pixelCount);
}
void prepareCalibration()
{
#ifdef THIS_IS_RGBW
// prepare LUT calibration table, cold white is much better than "neutral" white
for (uint32_t i = 0; i < 256; i++)
{
// color calibration
float red = rCorrection * i; // adjust red
float green = gCorrection * i; // adjust green
float blue = bCorrection * i; // adjust blue
wChannel[i] = (uint8_t)round(min(whiteLimit * i, 255.0f));
rChannel[i] = (uint8_t)round(min(red / 0xFF, 255.0f));
gChannel[i] = (uint8_t)round(min(green / 0xFF, 255.0f));
bChannel[i] = (uint8_t)round(min(blue / 0xFF, 255.0f));
}
Serial.write("RGBW calibration. White limit(%): ");
Serial.print(whiteLimit * 100.0f);
Serial.write(" %, red: ");
Serial.print(rCorrection);
Serial.write(" , green: ");
Serial.print(gCorrection);
Serial.write(" , blue: ");
Serial.print(bCorrection);
Serial.println();
#endif
}
void loop()
{
curTime = millis();
#ifdef __AVR__
// nothing , USART Interrupt is implemented
ESPserialEvent();
#else
// ESP8266 polling
ESPserialEvent();
#endif
if (ledsComplete)
{
#ifndef ENABLE_STRIP
if (reportInput)
{
Serial2.println();
Serial2.print("<input> L: ");
printStringHex(inputString);
Serial2.println("<\input>");
inputString = "";
Serial2.print("bytesRead: ");
Serial2.print(bytesRead);
Serial2.print(" , currentPixel: ");
Serial2.print(currentPixel);
Serial2.print(" ,pixelCount: ");
Serial2.print(pixelCount);
Serial2.println();
}
#endif
int frameSize = headerSize + ledBufferSize + trailerSize;
if (bytesRead > frameSize)
{
//Add number of frames ignored on top of frame
int frames = bytesRead / frameSize;
stat_frames += frames;
//Count frame plus frames ignored as bad frames
int badFrames = frames + 1;
stat_bad += badFrames;
stat_bad_frame += badFrames;
}
else
{
#ifdef ENABLE_CHECK_FLETCHER
//Test if content is valid
uint16_t item = 0;
uint16_t fletch1 = 0;
uint16_t fletch2 = 0;
uint16_t fletchExt = 0;
while (item < ledBufferSize)
{
fletch1 = (fletch1 + (uint16_t)ledBuffer[item]) % 255;
fletch2 = (fletch2 + fletch1) % 255;
fletcherExt = (fletcherExt + ((uint16_t)ledBuffer[item] ^ (item))) % 255;
++item;
}
if ((fletch1 == fletcher1) && (fletch2 == fletcher2) && (ledBuffer[item-1] == (fletcherExt != 0x41) ? fletcherExt : 0xaa))
{
#endif
stat_good++;
uint16_t startLed = 0;
if (skipFirstLed)
{
#ifdef ENABLE_STRIP
#ifdef THIS_IS_RGBW
strip->SetPixelColor(startLed, RgbwColor(0, 0, 0, 0));
#else
strip->SetPixelColor(startLed, RgbColor(0, 0, 0));
#endif
#endif
startLed = 1;
}
for (uint16_t led = startLed; led < ledCount; ++led)
{
inputColor.R = ledBuffer[led * 3];
inputColor.G = ledBuffer[led * 3 + 1];
inputColor.B = ledBuffer[led * 3 + 2];
#ifdef THIS_IS_RGBW
inputColor.W = min(rChannel[inputColor.R],
min(gChannel[inputColor.G],
bChannel[inputColor.B]));
inputColor.R -= rChannel[inputColor.W];
inputColor.G -= gChannel[inputColor.W];
inputColor.B -= bChannel[inputColor.W];
inputColor.W = wChannel[inputColor.W];
#endif
#ifdef ENABLE_STRIP
strip->SetPixelColor(led, inputColor);
#endif
}
showMe();
yield();
#ifdef THIS_IS_RGBW
if (isChannelCalib)
{
uint8_t incoming_gain = ledBuffer[pixelCount];
uint8_t incoming_red = ledBuffer[pixelCount + 1];
uint8_t incoming_green = ledBuffer[pixelCount + 2];
uint8_t incoming_blue = ledBuffer[pixelCount + 3];
float final_limit = (incoming_gain != 255) ? incoming_gain / 255.0f : 1.0f;
if (rCorrection != incoming_red || gCorrection != incoming_green || bCorrection != incoming_blue || whiteLimit != final_limit)
{
rCorrection = incoming_red;
gCorrection = incoming_green;
bCorrection = incoming_blue;
whiteLimit = final_limit;
prepareCalibration();
}
}
#endif
#ifdef ENABLE_CHECK_FLETCHER
}
else
{
stat_bad++;
stat_bad_fletcher++;
}
#endif
}
bytesRead = 0;
state = AwaProtocol::HEADER_A;
ledsComplete = false;
}
if ((curTime - stat_start > reportStatInterval_ms))
{
if (stat_frames > 0)
{
showStats();
}
}
}
#ifdef __AVR__
void serialEvent()
{
processSerialData();
}
#elif defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
void ESPserialEvent()
{
processSerialData();
}
#endif

View File

@ -139,7 +139,7 @@ void setup() {
} }
int ledCount = MAX_LEDS; int ledCount = MAX_LEDS;
if (ANALOG_OUTPUT_ENABLED == true && ANALOG_MODE == ANALOG_MODE_LAST_LED) { if (ANALOG_MODE == ANALOG_MODE_LAST_LED) {
ledCount--; ledCount--;
} }
@ -170,7 +170,7 @@ void setup() {
showColor(CRGB(0, 0, 0)); showColor(CRGB(0, 0, 0));
Serial.print("Ada\n"); // Send "Magic Word" string to host Serial.print("Ada\n"); // Send "Magic Word" string to host
Serial.println("Ada: LED num: " + String(FastLED.size())); //Return number of LEDs configured
boolean transmissionSuccess; boolean transmissionSuccess;
unsigned long sum_r, sum_g, sum_b; unsigned long sum_r, sum_g, sum_b;
@ -254,3 +254,4 @@ void setup() {
void loop() { void loop() {
// Not used. See note in setup() function. // Not used. See note in setup() function.
} }

View File

@ -21,7 +21,6 @@ import socket
import serial import serial
import serial.threaded import serial.threaded
from __future__ import division
class SerialToNet(serial.threaded.Protocol): class SerialToNet(serial.threaded.Protocol):
"""serial->socket""" """serial->socket"""
@ -138,7 +137,7 @@ to this service over the network.
sys.stderr.write( sys.stderr.write(
'--- UDP to Serial redirector\n' '--- UDP to Serial redirector\n'
'--- listening on udp port {a.localport}\n' '--- listening on udp port {a.localport}\n'
'--- sending to {p.name} {p.baudrate},{p.bytesize}{p.parity}{p.stopbits}\n' '--- sending to {p.name} {p.baudrate},{p.bytesize}{p.parity}{p.stopbits}\n'
'--- type Ctrl-C / BREAK to quit\n'.format(p=ser, a=args)) '--- type Ctrl-C / BREAK to quit\n'.format(p=ser, a=args))
try: try:
@ -153,9 +152,10 @@ to this service over the network.
srv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) srv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(('0.0.0.0', args.localport)) srv.bind(('', args.localport))
try: try:
intentional_exit = False
while True: while True:
try: try:
while True: while True:
@ -164,14 +164,14 @@ to this service over the network.
if not data: if not data:
break break
if args.ada: if args.ada:
numleds = len(data)/3 numleds = len(data)/3
hi = (numleds-1)/256 hi = (numleds-1)/256
lo = (numleds-1)&255 lo = (numleds-1)&255
sum = hi^lo^0x55 sum = hi^lo^0x55
ser.write ("Ada"+ chr(hi) + chr(lo) + chr(sum)) ser.write ("Ada"+ chr(hi) + chr(lo) + chr(sum))
ser.write(data) # get a bunch of bytes and send them ser.write(data) # get a bunch of bytes and send them
except socket.error as msg: except socket.error as msg:
if args.develop: if args.develop:
raise raise
@ -179,7 +179,7 @@ to this service over the network.
# probably got disconnected # probably got disconnected
break break
except KeyboardInterrupt: except KeyboardInterrupt:
# intentional_exit intentional_exit = True
raise raise
except socket.error as msg: except socket.error as msg:
if args.develop: if args.develop:
@ -189,7 +189,6 @@ to this service over the network.
ser_to_net.socket = None ser_to_net.socket = None
sys.stderr.write('Disconnected\n') sys.stderr.write('Disconnected\n')
except KeyboardInterrupt: except KeyboardInterrupt:
# do not handle exceptions
pass pass
sys.stderr.write('\n--- exit ---\n') sys.stderr.write('\n--- exit ---\n')

View File

@ -1,354 +0,0 @@
// AtmoOrb by Lightning303 & Rick164, Additions by Lord-Grey
//
// ESP8266 Standalone Version
//
//
// You may change the settings that are commented
#define FASTLED_ALLOW_INTERRUPTS 0
// To make sure that all leds get changed 100% of the time, we need to allow FastLED to disabled interrupts for a short while.
// If you experience problems, please set this value to 1.
// This is only needed for 3 wire (1 data line + Vcc and GND) chips (e.g. WS2812B). If you are using WS2801, APA102 or similar chipsets, you can set the value back to 1.
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <FastLED.h>
#define NUM_LEDS 24 // Number of leds
#define DATA_PIN D7 // Data pin for leds (the default pin 7 might correspond to pin 13 on some boards)
#define SERIAL_DEBUG 0 // Serial debugging (0=Off, 1=On)
#define ID 1 // Id of this lamp
// Smoothing
#define SMOOTH_STEPS 20 // Steps to take for smoothing colors
#define SMOOTH_DELAY 10 // Delay between smoothing steps
#define SMOOTH_BLOCK 0 // Block incoming colors while smoothing
// Startup color
#define STARTUP_RED 255 // Color shown directly after power on
#define STARTUP_GREEN 175 // Color shown directly after power on
#define STARTUP_BLUE 100 // Color shown directly after power on
// White adjustment
#define RED_CORRECTION 220 // Color Correction
#define GREEN_CORRECTION 255 // Color Correction
#define BLUE_CORRECTION 180 // Color Correction
// RC Switch
#define RC_SWITCH 0 // RF transmitter to swtich remote controlled power sockets (0=Off, 1=On)
#if RC_SWITCH == 1
#include <RCSwitch.h>
#define RC_PIN 2 // Data pin for RF transmitter
#define RC_SLEEP_DELAY 900000 // Delay until RF transmitter send signals
char* rcCode0 = "10001"; // First part of the transmission code
char* rcCode1 = "00010"; // Second part of the transmission code
RCSwitch mySwitch = RCSwitch();
boolean remoteControlled = false;
#endif
// Network settings
const char* ssid = "***"; // WiFi SSID
const char* password = "***"; // WiFi password
const IPAddress multicastIP(239,255,255,250); // Multicast IP address
const int multicastPort = 49692; // Multicast port number
IPAddress ip_null(0,0,0,0);
IPAddress local_IP(0,0,0,0);
WiFiUDP Udp;
int timeout = 20000; // wait 20 sec for successfull login
boolean is_connect = false; // ... not yet connected
CRGB leds[NUM_LEDS];
byte nextColor[3];
byte prevColor[3];
byte currentColor[3];
byte smoothStep = SMOOTH_STEPS;
unsigned long smoothMillis;
void setColor(byte red, byte green, byte blue);
void setSmoothColor(byte red, byte green, byte blue);
void smoothColor();
void clearSmoothColors();
void setup()
{
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
//FastLED.setCorrection(TypicalSMD5050);
FastLED.setCorrection(CRGB(RED_CORRECTION, GREEN_CORRECTION, BLUE_CORRECTION));
FastLED.showColor(CRGB(STARTUP_RED, STARTUP_GREEN, STARTUP_BLUE));
#if RC_SWITCH == 1
mySwitch.enableTransmit(RC_PIN);
#endif
#if SERIAL_DEBUG == 1
Serial.begin(115200);
#endif
#if SERIAL_DEBUG == 1
Serial.printf("Connecting to %s ", ssid);
#endif
// .... wait for WiFi gets valid !!!
unsigned long tick = millis(); // get start-time for login
WiFi.begin(ssid, password);
while ( (!is_connect) && ((millis() - tick) < timeout) )
{
yield(); // ... for safety
is_connect = WiFi.status(); // connected ?
if (!is_connect) // only if not yet connected !
{
#if SERIAL_DEBUG == 1
Serial.print("."); // print a dot while waiting
#endif
delay(50);
}
}
if (is_connect)
{
#if SERIAL_DEBUG == 1
Serial.print("after ");
Serial.print(millis() - tick);
Serial.println(" ms");
#endif
// .... wait for local_IP becomes valid !!!
is_connect = false;
tick = millis(); // get start-time for login
while ( (!is_connect) && ((millis() - tick) < timeout) )
{
yield(); // ... for safety
local_IP = WiFi.localIP();
is_connect = local_IP != ip_null; // connected ?
if (!is_connect) // only if not yet connected !
{
#if SERIAL_DEBUG == 1
Serial.print("."); // print a dot while waiting
#endif
delay(50);
}
}
if (is_connect)
{
#if SERIAL_DEBUG == 1
Serial.print("local_IP valid after ");
Serial.print(millis() - tick);
Serial.println(" ms");
Serial.println("");
Serial.print(F("Connected to "));
Serial.println(ssid);
#endif
// ... now start UDP and check the result:
is_connect = Udp.beginMulticast(local_IP, multicastIP, multicastPort);
if (is_connect)
{
#if SERIAL_DEBUG == 1
Serial.print("Listening to Multicast at ");
Serial.print(multicastIP);
Serial.println(":" + String(multicastPort));
#endif
}
else
{
#if SERIAL_DEBUG == 1
Serial.println(" - ERROR beginMulticast !");
#endif
}
}
else
{
#if SERIAL_DEBUG == 1
Serial.println("local_IP invalid after timeout !");
#endif
}
}
else
{
#if SERIAL_DEBUG == 1
Serial.println("- invalid after timeout !");
#endif
}
}
void loop()
{
#if SERIAL_DEBUG == 1
if (WiFi.status() != WL_CONNECTED)
{
Serial.print(F("Lost connection to "));
Serial.print(ssid);
Serial.println(F("."));
Serial.println(F("Trying to reconnect."));
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(F("."));
}
Serial.println("");
Serial.println(F("Reconnected."));
}
#endif
if (Udp.parsePacket())
{
byte len = Udp.available();
byte rcvd[len];
Udp.read(rcvd, len);
#if SERIAL_DEBUG == 1
Serial.print(F("UDP Packet from "));
Serial.print(Udp.remoteIP());
Serial.print(F(":"));
Serial.print(Udp.remotePort());
Serial.print(F(" to "));
Serial.println(Udp.destinationIP());
for (byte i = 0; i < len; i++)
{
Serial.print(rcvd[i]);
Serial.print(F(" "));
}
Serial.println("");
#endif
if (len >= 8 && rcvd[0] == 0xC0 && rcvd[1] == 0xFF && rcvd[2] == 0xEE && (rcvd[4] == ID || rcvd[4] == 0))
{
switch (rcvd[3])
{
case 1:
smoothStep = SMOOTH_STEPS;
forceLedsOFF();
break;
case 2:
default:
setSmoothColor(rcvd[5], rcvd[6], rcvd[7]);
break;
case 4:
setColor(rcvd[5], rcvd[6], rcvd[7]);
smoothStep = SMOOTH_STEPS;
break;
case 8:
#if SERIAL_DEBUG == 1
Serial.print(F("Announce myself. OrbID: "));
Serial.println(ID);
#endif
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ID);
Udp.endPacket();
break;
case 9:
#if SERIAL_DEBUG == 1
Serial.print(F("Identify myself. OrbID: "));
Serial.println(ID);
#endif
identify();
break;
}
}
}
if (smoothStep < SMOOTH_STEPS && millis() >= (smoothMillis + (SMOOTH_DELAY * (smoothStep + 1))))
{
smoothColor();
}
#if RC_SWITCH == 1
if (remoteControlled && currentColor[0] == 0 && currentColor[1] == 0 && currentColor[2] == 0 && millis() >= smoothMillis + RC_SLEEP_DELAY)
{
// Send this signal only once every seconds
smoothMillis += 1000;
mySwitch.switchOff(rcCode0, rcCode1);
}
#endif
}
// Display color on leds
void setColor(byte red, byte green, byte blue)
{
// Is the new color already active?
if (currentColor[0] == red && currentColor[1] == green && currentColor[2] == blue)
{
return;
}
currentColor[0] = red;
currentColor[1] = green;
currentColor[2] = blue;
FastLED.showColor(CRGB(red, green, blue));
}
// Set a new color to smooth to
void setSmoothColor(byte red, byte green, byte blue)
{
if (smoothStep == SMOOTH_STEPS || SMOOTH_BLOCK == 0)
{
// Is the new color the same as the one we already are smoothing towards?
// If so dont do anything.
if (nextColor[0] == red && nextColor[1] == green && nextColor[2] == blue)
{
return;
}
// Is the new color the same as we have right now?
// If so stop smoothing and keep the current color.
else if (currentColor[0] == red && currentColor[1] == green && currentColor[2] == blue)
{
smoothStep = SMOOTH_STEPS;
return;
}
prevColor[0] = currentColor[0];
prevColor[1] = currentColor[1];
prevColor[2] = currentColor[2];
nextColor[0] = red;
nextColor[1] = green;
nextColor[2] = blue;
smoothMillis = millis();
smoothStep = 0;
#if RC_SWITCH == 1
if (!remoteControlled)
{
remoteControlled = true;
}
#endif
}
}
// Display one step to the next color
void smoothColor()
{
smoothStep++;
byte red = prevColor[0] + (((nextColor[0] - prevColor[0]) * smoothStep) / SMOOTH_STEPS);
byte green = prevColor[1] + (((nextColor[1] - prevColor[1]) * smoothStep) / SMOOTH_STEPS);
byte blue = prevColor[2] + (((nextColor[2] - prevColor[2]) * smoothStep) / SMOOTH_STEPS);
setColor(red, green, blue);
}
// Force all leds OFF
void forceLedsOFF()
{
setColor(0,0,0);
clearSmoothColors();
}
// Clear smooth color byte arrays
void clearSmoothColors()
{
memset(prevColor, 0, sizeof(prevColor));
memset(currentColor, 0, sizeof(nextColor));
memset(nextColor, 0, sizeof(nextColor));
}
void identify()
{
for (byte i = 0; i < 3; i++)
{
FastLED.showColor(CRGB::LemonChiffon);
delay(500);
FastLED.showColor(CRGB::Black);
delay(500);
}
}

View File

@ -1,313 +0,0 @@
#include <FastLED.h>
FASTLED_USING_NAMESPACE;
SYSTEM_THREAD(ENABLED);
#if FASTLED_VERSION < 3001000
#error "Requires FastLED 3.1 or later; check github for latest code."
#endif
// WiFi
#define timeout 30000
#define reconnect_delay 5000
// UDP
#define SERVER_PORT 49692
#define DISCOVERY_PORT 49692
UDP client;
IPAddress multicastIP(239, 15, 18, 2);
// ORB
unsigned int orbID = 1;
#define SERIAL_DEBUG 0 // Serial debugging (0=Off, 1=On)
// LED
#define DATA_PIN 6
#define NUM_LEDS 24
CRGB leds[NUM_LEDS];
// UDP
#define BUFFER_SIZE 8 // 5 + 3 channels for 1 LED
#define BUFFER_SIZE_DISCOVERY 5
#define TIMEOUT_MS 500
uint8_t buffer[BUFFER_SIZE];
uint8_t bufferDiscovery[BUFFER_SIZE_DISCOVERY];
unsigned long lastWiFiCheck = 0;
// SMOOTHING
#define SMOOTH_STEPS 50 // Steps to take for smoothing colors
#define SMOOTH_DELAY 4 // Delay between smoothing steps
#define SMOOTH_BLOCK 0 // Block incoming colors while smoothing
byte nextColor[3];
byte prevColor[3];
byte currentColor[3];
byte smoothStep = SMOOTH_STEPS;
unsigned long smoothMillis;
// CUSTOM COLOR CORRECTIONS
#define RED_CORRECTION 255
#define GREEN_CORRECTION 255
#define BLUE_CORRECTION 255
#include "Particle.h"
void setup()
{
// Leds - choose one correction method
// 1 - Custom color correction
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS).setCorrection(CRGB(RED_CORRECTION, GREEN_CORRECTION, BLUE_CORRECTION));
// Set color
//setColor(40, 21, 0);
// Uncomment the below lines to dim the single built-in led to 2%
::RGB.control(true);
::RGB.brightness(2);
::RGB.control(false);
// WiFi
lastWiFiCheck = millis();
initWiFi();
// 2 - FastLED predefined color correction
//FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS).setCorrection(TypicalSMD5050);
}
void initWiFi()
{
// Delays added UDP client creation, required for WiFi reconnects as takes a bit for resources to be full available
// Wait for WiFi connection
delay(500);
waitFor(WiFi.ready, timeout);
delay(reconnect_delay);
// Multicast UDP
if(WiFi.ready())
{
#if SERIAL_DEBUG == 1
Serial.println("");
Serial.print(F("Connected to "));
Serial.println(WiFi.SSID());
Serial.print(F("IP address: "));
Serial.println(WiFi.localIP());
#endif
client.begin(SERVER_PORT);
delay(reconnect_delay);
client.joinMulticast(multicastIP);
#if SERIAL_DEBUG == 1
Serial.print(F("Listening to Multicast at "));
Serial.print(multicastIP);
Serial.print(F(":"));
Serial.println(SERVER_PORT);
#endif
}
}
void loop(){
if (Network.listening())
{
// If we are in listening mode (blinking dark blue), don't
// output by USB serial, because it can conflict with
// serial commands.
return;
}
if(WiFi.ready() == false) {
#if SERIAL_DEBUG == 1
Serial.print(F("Lost connection to "));
Serial.print(WiFi.SSID());
Serial.println(F("."));
Serial.println(F("Trying to reconnect."));
#endif
initWiFi();
}
int packetSize = client.parsePacket();
if(packetSize == BUFFER_SIZE){
#if SERIAL_DEBUG == 1
Serial.print(F("Packet size: "));
Serial.println(packetSize);
#endif
client.read(buffer, BUFFER_SIZE);
//client.flush();
#if SERIAL_DEBUG == 1
Serial.print(F("UDP Packet from "));
Serial.println(client.remoteIP());
for (int i = 0; i < BUFFER_SIZE; i++)
{
Serial.print(buffer[i]);
Serial.print(F(" "));
}
Serial.println("");
#endif
unsigned int i = 0;
// Look for 0xC0FFEE
if(buffer[i++] == 0xC0 && buffer[i++] == 0xFF && buffer[i++] == 0xEE)
{
byte commandOptions = buffer[i++];
byte rcvOrbID = buffer[i++];
byte red = buffer[i++];
byte green = buffer[i++];
byte blue = buffer[i++];
// Command options
// 1 = force off
// 2 = use lamp smoothing and validate by Orb ID
// 4 = validate by Orb ID
// 8 = discovery
// 9 = light-up Orb to identify by Orb ID
if(commandOptions == 1)
{
// Orb ID 0 = turn off all lights
// Otherwise turn off selectively
if(rcvOrbID == 0 || rcvOrbID == orbID)
{
smoothStep = SMOOTH_STEPS;
forceLedsOFF();
}
return;
}
else if(commandOptions == 2)
{
if(rcvOrbID != orbID)
{
return;
}
setSmoothColor(red, green, blue);
}
else if(commandOptions == 4)
{
if(rcvOrbID != orbID)
{
return;
}
smoothStep = SMOOTH_STEPS;
setColor(red, green, blue);
setSmoothColor(red, green, blue);
return;
}
else if(commandOptions == 8)
{
#if SERIAL_DEBUG == 1
Serial.print(F("Announce myself. OrbID: "));
Serial.println(orbID);
#endif
// Respond to remote IP address with Orb ID
IPAddress remoteIP = client.remoteIP();
bufferDiscovery[0] = orbID;
client.sendPacket(bufferDiscovery, BUFFER_SIZE_DISCOVERY, remoteIP, DISCOVERY_PORT);
// Clear buffer
memset(bufferDiscovery, 0, sizeof(bufferDiscovery));
return;
}
else if(commandOptions == 9)
{
if(rcvOrbID == 0 || rcvOrbID == orbID)
{
#if SERIAL_DEBUG == 1
Serial.print(F("Identify myself. OrbID: "));
Serial.println(orbID);
#endif
identify();
}
return;
}
}
}else if(packetSize > 0){
// Got malformed packet
}
if (smoothStep < SMOOTH_STEPS && millis() >= (smoothMillis + (SMOOTH_DELAY * (smoothStep + 1))))
{
smoothColor();
}
}
// Set color
void setColor(byte red, byte green, byte blue)
{
for (byte i = 0; i < NUM_LEDS; i++)
{
leds[i] = CRGB(red, green, blue);
}
FastLED.show();
}
// Set a new color to smooth to
void setSmoothColor(byte red, byte green, byte blue)
{
if (smoothStep == SMOOTH_STEPS || SMOOTH_BLOCK == 0)
{
if (nextColor[0] == red && nextColor[1] == green && nextColor[2] == blue)
{
return;
}
prevColor[0] = currentColor[0];
prevColor[1] = currentColor[1];
prevColor[2] = currentColor[2];
nextColor[0] = red;
nextColor[1] = green;
nextColor[2] = blue;
smoothMillis = millis();
smoothStep = 0;
}
}
// Display one step to the next color
void smoothColor()
{
smoothStep++;
currentColor[0] = prevColor[0] + (((nextColor[0] - prevColor[0]) * smoothStep) / SMOOTH_STEPS);
currentColor[1] = prevColor[1] + (((nextColor[1] - prevColor[1]) * smoothStep) / SMOOTH_STEPS);
currentColor[2] = prevColor[2] + (((nextColor[2] - prevColor[2]) * smoothStep) / SMOOTH_STEPS);
setColor(currentColor[0], currentColor[1], currentColor[2]);
}
// Force all leds OFF
void forceLedsOFF()
{
setColor(0,0,0);
clearSmoothColors();
}
// Clear smooth color byte arrays
void clearSmoothColors()
{
memset(prevColor, 0, sizeof(prevColor));
memset(currentColor, 0, sizeof(nextColor));
memset(nextColor, 0, sizeof(nextColor));
}
void identify()
{
for (byte i = 0; i < 3; i++)
{
FastLED.showColor(CRGB::LemonChiffon);
delay(500);
FastLED.showColor(CRGB::Black);
delay(500);
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -1,75 +1,89 @@
<div class="container-fluid"> <div class="container-fluid">
<h3 class="page-header"> <h3 class="page-header"><i class="fa fa-info-circle fa-fw"></i><span data-i18n="main_menu_about_token">About
<i class="fa fa-info-circle fa-fw"></i><span data-i18n="main_menu_about_token"> Hyperion</span></h3>
About <div class="row">
Hyperion <div class="col-lg-12">
</span> <div id="about_cont"></div>
</h3>
<div class="row">
<div class="col-lg-12">
<div id="about_cont"></div>
</div> </div>
<div id="danger_act" class="col-lg-6" style="display:none;padding-top:20px"> <div id="danger_act" class="col-lg-6" style="display:none;padding-top:20px">
<h4>You found a hidden service menu!</h4> <h4>You found a hidden service menu!</h4>
<button id="reset_cache" class="btn btn-danger">Reset Browser Cache</button> <button id="reset_cache" class="btn btn-danger">Reset Browser Cache</button>
<button id="hyp_restart" class="btn btn-danger">Force Hyperion Restart</button> <button id="hyp_restart" class="btn btn-danger">Force Hyperion Restart</button>
</div> </div>
</div> </div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
performTranslation(); performTranslation();
var si = window.sysInfo.hyperion; var si = sysInfo.hyperion;
var libs = { "Bootstrap 3": "https://getbootstrap.com/", "JQuery": "https://jquery.com/", "Bootstrap Colorpicker": "https://itsjavi.com/bootstrap-colorpicker/", "Bootstrap Toggle": "https://www.bootstraptoggle.com/", "Bootstrap Select": "https://developer.snapappointments.com/bootstrap-select/", "JSON-Editor": "https://www.jeremydorn.com/json-editor", "jQuery.i18n": "https://github.com/wikimedia/jquery.i18n", "metisMenu": "https://mm.onokumus.com/index.html", "download.js": "https://github.com/rndme/download", "Gijgo": "https://gijgo.com/", "DOMPurify" : "https://github.com/cure53/DOMPurify", "Marked": "https://github.com/markedjs/marked", "PlainDraggable": "https://github.com/anseki/plain-draggable", "LeaderLine": "https://github.com/anseki/leader-line", "Animate.css": "https://github.com/animate-css/animate.css"}; var libs = { "Bootstrap 3": "http://getbootstrap.com/", "JQuery": "https://jquery.com/", "Bootstrap Colorpicker": "https://itsjavi.com/bootstrap-colorpicker/", "JSON-Editor": "http://jeremydorn.com/json-editor/", "jQuery.i18n": "https://github.com/wikimedia/jquery.i18n", "metisMenu": "http://mm.onokumus.com/index.html", "download.js": "http://danml.com/download.html", "gijgo": "http://gijgo.com/" };
var libh = ""; var libh = "";
var lang = []; var lang = [];
var dcount = 0; var dcount = 0;
for (var i = 0; i < availLang.length; i++) for (var i = 0; i < availLang.length; i++)
lang.push($.i18n('general_speech_' + availLang[i])); lang.push($.i18n('general_speech_' + availLang[i]));
lang.sort(); for (key in libs)
for (key in libs) libh += '<a href="' + libs[key] + '" target="_blank">' + key + '</a>, ';
libh += '<a href="' + libs[key] + '" target="_blank">' + key + '</a>, '; libh += "<br/>" + $.i18n("about_credits");
libh += "<br/>" + $.i18n("about_credits"); lang = lang.toString().replace(/,/g, ", ");
lang = lang.toString().replace(/,/g, ", ");
var info = '<pre>' + getSystemInfo() + '</pre>'; // Github Issue bugreport infos
var sys = window.sysInfo.system;
var shy = window.sysInfo.hyperion;
var info = "<pre>Hyperion Server: \n";
info += '- Build: ' + shy.build + '\n';
info += '- Build time: ' + shy.time + '\n';
info += '- Git Remote: ' + shy.gitremote + '\n';
info += '- Version: ' + shy.version + '\n';
info += '- UI Lang: ' + storedLang + ' (BrowserLang: ' + navigator.language + ')\n';
info += '- UI Access: ' + storedAccess + '\n';
//info += 'Log lvl: ' + window.serverConfig.logger.level + '\n';
info += '- Avail Capt: ' + window.serverInfo.grabbers.available + '\n\n';
info += 'Hyperion Server OS: \n';
info += '- Distribution: ' + sys.prettyName + '\n';
info += '- Arch: ' + sys.architecture + '\n';
info += '- Kernel: ' + sys.kernelType + ' (' + sys.kernelVersion + ' (WS: ' + sys.wordSize + '))\n';
info += '- Browser: ' + navigator.userAgent + ' </pre>';
var fc = ['<span id="danger_trig">' + $.i18n("about_version") + '<span>', $.i18n("about_build"), $.i18n("about_builddate"), $.i18n("about_translations"), $.i18n("about_resources", $.i18n("general_webui_title")), "System info (Github Issue)", $.i18n("about_3rd_party_licenses")]; var fc = ['<span id="danger_trig">' + $.i18n("about_version") + '<span>', $.i18n("about_build"), $.i18n("about_builddate"), $.i18n("about_translations"), $.i18n("about_resources", $.i18n("general_webui_title")), "System info (Github Issue)", $.i18n("about_3rd_party_licenses")];
var sc = [currentVersion, si.build, si.time, '(' + availLang.length + ')<p>' + lang + '</p><p><a href="https://github.com/hyperion-project/hyperion.ng" target="_blank">' + $.i18n("about_contribute") + '</a></p>', libh, info, '<pre><div id="3rdpartylicenses" style="overflow:scroll;max-height:400px"></div></pre>']; var sc = [currentVersion, si.build, si.time, '(' + availLang.length + ')<p>' + lang + '</p><p><a href="https://github.com/hyperion-project/hyperion.ng" target="_blank">' + $.i18n("about_contribute") + '</a></p>', libh, info, '<pre><div id="3rdpartylicenses" style="overflow:scroll;max-height:400px"></div></pre>'];
createTable("", "atb", "about_cont"); createTable("", "atb", "about_cont");
for (var i = 0; i < fc.length; i++) for (var i = 0; i < fc.length; i++)
$('.atb').append(createTableRow([fc[i], sc[i]], "atb", false)); $('.atb').append(createTableRow([fc[i], sc[i]], "atb", false));
$('#danger_trig').off().on('click', function () { $('#danger_trig').off().on('click', function () {
dcount++; dcount++;
if (dcount > 2) if (dcount > 2)
$('#danger_act').toggle(true); $('#danger_act').toggle(true);
}); });
$('#reset_cache').off().on('click', function () { $('#reset_cache').off().on('click', function () {
localStorage.clear(); localStorage.clear();
}); });
$('#hyp_restart').off().on('click', function () { $('#hyp_restart').off().on('click', function () {
initRestart(); initRestart();
}); });
$.ajax({ var url = 'https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/3RD_PARTY_LICENSES';
url:'3RD_PARTY_LICENSES', fetch(url)
dataType: "text", .then(function (response) {
success: function(data) if (!response.ok) {
{ $("#3rdpartylicenses").html('<a href="' + url + '">' + $.i18n("about_3rd_party_licenses_error") + '</a>');
$("#3rdpartylicenses").html('<code>' + data + '</code>'); }
}, else {
error: function() response.text().then(function (text) {
{ $("#3rdpartylicenses").html('<code>' + text + '</code>');
$("#3rdpartylicenses").html('<a href="https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/3RD_PARTY_LICENSES">' + $.i18n("about_3rd_party_licenses_error") + '</a>'); });
} }
}); })
.catch(function (rejected) {
$("#3rdpartylicenses").html('<a href="' + url + '">' + $.i18n("about_3rd_party_licenses_error") + '</a>');
});
removeOverlay(); removeOverlay();
</script> </script>

View File

@ -2,23 +2,11 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-photo fa-fw"></i><span data-i18n="main_menu_colors_conf_token">Image Processing</span></h3> <h3 class="page-header"><i class="fa fa-photo fa-fw"></i><span data-i18n="main_menu_colors_conf_token">Image Processing</span></h3>
<div id="conf_cont"></div>
<div class="panel panel-default" style="border:0px;">
<div class="panel-heading panel-instance" style="border-radius:3px; border-bottom:0px;">
<div class="dropdown">
<a id="active_instance_dropdown" class="dropdown-toggle" data-toggle="dropdown" href="#" style="text-decoration:none;display:flex;align-items:center;">
<div id="active_instance_friendly_name"></div>
<div id="btn_hypinstanceswitch" style="white-space:nowrap;"><span class="mdi mdi-lightbulb-group mdi-24px" style="margin-right:0; margin-left:5px;"></span><span class="mdi mdi-menu-down mdi-24px"></span></div>
</a>
<ul id="hyp_inst_listing" class="dropdown-menu dropdown-alerts" style="cursor:pointer;"></ul>
</div>
</div>
</div>
<div id="conf_cont"></div>
</div> </div>
</div> </div>
</div> </div>
<script src="/js/content_colors.js"></script> <script src="/js/content_colors.js"></script>

View File

@ -2,19 +2,6 @@
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-spinner fa-fw"></i><span data-i18n="main_menu_effect_conf_token">Effects</span></h3> <h3 class="page-header"><i class="fa fa-spinner fa-fw"></i><span data-i18n="main_menu_effect_conf_token">Effects</span></h3>
<div class="panel panel-default" style="border:0px;">
<div class="panel-heading panel-instance" style="border-radius:3px; border-bottom:0px;">
<div class="dropdown">
<a id="active_instance_dropdown" class="dropdown-toggle" data-toggle="dropdown" href="#" style="text-decoration:none;display:flex;align-items:center;">
<div id="active_instance_friendly_name"></div>
<div id="btn_hypinstanceswitch" style="white-space:nowrap;"><span class="mdi mdi-lightbulb-group mdi-24px" style="margin-right:0; margin-left:5px;"></span><span class="mdi mdi-menu-down mdi-24px"></span></div>
</a>
<ul id="hyp_inst_listing" class="dropdown-menu dropdown-alerts" style="cursor:pointer;"></ul>
</div>
</div>
</div>
<div id="conf_cont"></div> <div id="conf_cont"></div>
</div> </div>
</div> </div>

View File

@ -1,11 +0,0 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-server fa-fw"></i><span data-i18n="main_menu_events">Event Services</span></h3>
<div id="conf_cont">
</div>
</div>
</div>
</div>
<script src="/js/content_events.js"></script>

View File

@ -6,7 +6,7 @@
<div class="row"> <div class="row">
<div class="col-lg-6" id="inst_desc"> <div class="col-lg-6" id="inst_desc">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading panel-instance"><i class="mdi mdi-lightbulb-group mdi-24px"></i><span data-i18n="conf_general_inst_title"></span></div> <div class="panel-heading"><i class="fa fa-plus fa-fw"></i><span data-i18n="conf_general_inst_title"></span></div>
<div class="panel-body"> <div class="panel-body">
<div id="inst_desc_cont"></div> <div id="inst_desc_cont"></div>
<div id="itable"></div> <div id="itable"></div>
@ -28,20 +28,17 @@
</div> </div>
</div> </div>
</div> </div>
<!-- Instance(s) --> <div class="col-lg-6" id="conf_imp">
<div class="row instances"> <div class="panel panel-default">
<div class="col-lg-6" id="conf_imp"> <div class="panel-heading"><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_general_impexp_title"></span></div>
<div class="panel panel-default"> <div class="panel-body">
<div class="panel-heading"><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_general_impexp_title"></span></div> <p data-i18n="conf_general_impexp_l1" style="font-weight:bold"></p>
<div class="panel-body"> <p data-i18n="conf_general_impexp_l2" style="font-weight:bold"></p>
<p data-i18n="conf_general_impexp_l1" style="font-weight:bold"></p> <input type="file" id="select_import_conf" accept=".json">
<p data-i18n="conf_general_impexp_l2" style="font-weight:bold"></p> </div>
<input type="file" id="select_import_conf" accept=".json"> <div class="panel-footer" style="text-align:right">
</div> <button type="file" class="btn btn-primary" id="btn_import_conf" data-i18n="conf_general_impexp_impbtn" disabled>Import</button>
<div class="panel-footer" style="text-align:right"> <button class="btn btn-primary" id="btn_export_conf" data-i18n="conf_general_impexp_expbtn">Export</button>
<button type="file" class="btn btn-primary" id="btn_import_conf" data-i18n="conf_general_impexp_impbtn" disabled>Import</button>
<button class="btn btn-primary" id="btn_export_conf" data-i18n="conf_general_impexp_expbtn">Export</button>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -51,4 +48,3 @@
</div> </div>
<script src="/js/content_general.js"></script> <script src="/js/content_general.js"></script>

View File

@ -2,7 +2,7 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-camera fa-fw"></i><span data-i18n="main_menu_grabber_conf_token">Capturing Hardware</span></h3> <h3 class="page-header"><i class="fa fa-camera fa-fw"></i><span data-i18n="main_menu_grabber_conf_token">Capturing Hardware</span></h3>
<div id="conf_cont"></div> <div id="conf_cont"></div>
</div> </div>
</div> </div>

View File

@ -1,24 +0,0 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-camera fa-fw"></i><span data-i18n="main_menu_instcapture_conf_token">Capturing Hardware</span></h3>
<div class="panel panel-default" style="border:0px;">
<div class="panel-heading panel-instance" style="border-radius:3px; border-bottom:0px;">
<div class="dropdown">
<a id="active_instance_dropdown" class="dropdown-toggle" data-toggle="dropdown" href="#" style="text-decoration:none;display:flex;align-items:center;">
<div id="active_instance_friendly_name"></div>
<div id="btn_hypinstanceswitch" style="white-space:nowrap;"><span class="mdi mdi-lightbulb-group mdi-24px" style="margin-right:0; margin-left:5px;"></span><span class="mdi mdi-menu-down mdi-24px"></span></div>
</a>
<ul id="hyp_inst_listing" class="dropdown-menu dropdown-alerts" style="cursor:pointer;"></ul>
</div>
</div>
</div>
<div id="conf_cont"></div>
</div>
</div>
</div>
<script src="/js/content_instcapture.js"></script>

775
assets/webconfig/content/conf_leds.html Executable file → Normal file
View File

@ -1,486 +1,309 @@
<!DOCTYPE html>
<html>
<head>
<title>Hyperion - LED Device Configuration</title>
</head>
<div class="container-fluid"> <div class="container-fluid">
<h3 class="page-header"><i class="mdi mdi-lightbulb-on fa-fw"></i><span data-i18n="main_menu_leds_conf_token">LED Hardware</span></h3> <h3 class="page-header"><i class="fa fa-lightbulb-o fa-fw"></i><span data-i18n="main_menu_leds_conf_token">LED Hardware</span></h3>
<ul id="leds_cfg_nav" class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#menu_controller" data-i18n="conf_leds_nav_label_ledcontroller">LED Controller</a></li>
<li><a data-toggle="tab" href="#menu_gencfg" data-i18n="conf_leds_nav_label_ledlayout">LED Layout</a></li>
</ul>
<div class="panel panel-default" style="border:0px;"> <div class="tab-content">
<div class="panel-heading panel-instance" style="border-radius:3px; border-bottom:0px;">
<div class="dropdown">
<a id="active_instance_dropdown" class="dropdown-toggle" data-toggle="dropdown" href="#" style="text-decoration:none;display:flex;align-items:center;">
<div id="active_instance_friendly_name"></div>
<div id="btn_hypinstanceswitch" style="white-space:nowrap;"><span class="mdi mdi-lightbulb-group mdi-24px" style="margin-right:0; margin-left:5px;"></span><span class="mdi mdi-menu-down mdi-24px"></span></div>
</a>
<ul id="hyp_inst_listing" class="dropdown-menu dropdown-alerts" style="cursor:pointer;"></ul>
</div>
</div>
</div>
<ul id="leds_cfg_nav" class="nav nav-tabs"> <div id="menu_controller" class="tab-pane fade in active" style="padding-top:10px">
<li class="active"><a data-toggle="tab" href="#menu_controller" data-i18n="conf_leds_nav_label_ledcontroller">LED Controller</a></li> <div class="row">
<li><a data-toggle="tab" href="#menu_gencfg" data-i18n="conf_leds_nav_label_ledlayout">LED Layout</a></li> <div class="col-lg-12" id="leddevice_intro"></div>
</ul> <div class="col-lg-6">
<div class="panel panel-default">
<div class="panel-heading form-group">
<label for="leddevices" class="panel-title" data-i18n="conf_leds_contr_label_contrtype">Controller type:</label>
<select id="leddevices" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" />
</div>
<div class="tab-content"> <div class="panel-body">
<div id="menu_controller" class="tab-pane fade in active" style="padding-top:10px"> <div id="btn_wiz_holder"></div>
<div class="row"> <div id="ledDeviceOptions"> <div id='editor_container'></div> </div>
<div class="col-lg-12" id="leddevice_intro"></div> </div>
<div class="col-lg-6"> <div class="panel-footer" style="text-align:right">
<div class="panel panel-default"> <button id='btn_submit_controller' class="btn btn-primary"><i class="fa fa-fw fa-save" /><span data-i18n="general_button_savesettings">Save Settings</span></button>
<div class="panel-heading form-group"> </div>
<label for="leddevices" class="panel-title" data-i18n="conf_leds_contr_label_contrtype">Controller type:</label> </div>
<select id="leddevices" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block"></select> </div>
</div> </div>
</div>
<div class="panel-body"> <div id="menu_gencfg" class="tab-pane fade" style="padding-top:10px">
<div id="btn_wiz_holder"></div>
<div id='editor_container_leddevice'></div>
<div id='info_container' class="bs-callout bs-callout-info" style="margin-top:0px">
<h4 data-i18n="dashboard_infobox_label_title">Information</h4>
<div id='info_container_text'>
<span data-i18n="conf_leds_device_info_log"> In case your LEDs do not work, check here for errors: </span>
<a onclick="SwitchToMenuItem('MenuItemLogging')" data-i18n="main_menu_logging_token" style="cursor:pointer"></a>
</div>
</div>
</div>
<div class="panel-footer" style="text-align:right">
<button id='btn_layout_controller' class="btn btn-primary" disabled data-toggle="tooltip" data-placement="top" title="Generate a layout for the configured device">
<i class="fa fa-fw fa-save"></i><span data-i18n="wiz_layout">Generate Layout</span>
</button>
<button id='btn_test_controller' class="btn btn-primary" disabled data-toggle="tooltip" data-placement="top" title="Identify configured device by lighting it up">
<i class="fa fa-fw fa-save"></i><span data-i18n="wiz_identify">Identify/Test</span>
</button>
<button id='btn_submit_controller' class="btn btn-primary" data-toggle="tooltip" data-placement="top" title="Save the device's connectivity configuration">
<i class="fa fa-fw fa-save"></i><span data-i18n="general_button_savesettings">Save Settings</span>
</button>
</div>
</div>
</div>
</div>
</div>
<div id="menu_gencfg" class="tab-pane fade" style="padding-top:10px"> <div class="row">
<div class="col-lg-12" id="layout_intro"></div>
<div class="col-lg-6 col-md-12">
<div class="panel-group" id="accordion">
<div class="panel panel-primary">
<div class="panel-heading headcollapse" data-toggle="collapse" data-parent="#accordion" data-target="#collapse1">
<h4 class="panel-title">
<a><i class="fa fa-television fa-fw"></i><span data-i18n="conf_leds_layout_frame">Classic Layout (LED Frame)</span></a>
</h4>
</div>
<div id="collapse1" class="panel-collapse collapse in">
<div class="panel-body">
<table class="table borderless">
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_top" data-i18n="conf_leds_layout_cl_top">Top</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr " id="ip_cl_top" type="number" value="10" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_bottom" data-i18n="conf_leds_layout_cl_bottom">Bottom</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_bottom" type="number" value="10" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_left" data-i18n="conf_leds_layout_cl_left">Left</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_left" type="number" value="6" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_right" data-i18n="conf_leds_layout_cl_right">Right</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_right" type="number" value="6" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_glength" data-i18n="conf_leds_layout_cl_gaglength">Gap length</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_glength" type="number" value="0" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_gpos" data-i18n="conf_leds_layout_cl_gappos">Gap position</label>
</td>
<td class="itd">
<input class="form-control ledCLconstr" id="ip_cl_gpos" type="number" value="0" min="0" step="1">
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_position" data-i18n="conf_leds_layout_cl_inppos">Input position</label>
</td>
<td class="itd">
<input class="form-control ledCLconstr" id="ip_cl_position" type="number" value="0" min="0" step="1">
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_reverse" data-i18n="conf_leds_layout_cl_reversdir">Reverse direction</label>
</td>
<td class="itd">
<div class="checkbox">
<input class="ledCLconstr" id="ip_cl_reverse" type="checkbox" value="false"></input>
<label></label>
</div>
</td>
</tr>
</tbody>
</table>
<div class="panel panel-default">
<div class="panel-heading headcollapse" data-toggle="collapse" data-target="#collapse3">
<h4 class="panel-title">
<a><span data-i18n="conf_leds_layout_advanced">Advanced settings</span></a>
</h4>
</div>
<div id="collapse3" class="panel-collapse collapse">
<div class="panel-body ">
<table class="tableform borderless">
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_hdepth" data-i18n="conf_leds_layout_cl_hleddepth">Horizontal LED depth</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_hdepth" type="number" value="8" min="1" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_vdepth" data-i18n="conf_leds_layout_cl_vleddepth">Vertical LED depth</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_vdepth" type="number" value="5" min="1" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_overlap" data-i18n="conf_leds_layout_cl_overlap">Edge Gap</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_overlap" type="number" value="0" min="0" max="200" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_edgegap" data-i18n="conf_leds_layout_cl_edgegap">Edge Gap</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_edgegap" type="number" value="0" min="0" max="50" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<!-- <tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_cornergap" data-i18n="conf_leds_layout_cl_cornergap">Corner Gap</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr " id="ip_cl_cornergap" type="number" value="0" min="0" max="50" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
-->
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="panel-footer" style="text-align:right;">
<button id="btn_cl_save" class="btn btn-primary"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
<div class="panel panel-primary">
<div class="panel-heading headcollapse" data-toggle="collapse" data-parent="#accordion" data-target="#collapse2">
<h4 class="panel-title">
<a><i class="fa fa-th fa-fw"></i><span data-i18n="conf_leds_layout_matrix">Matrix Configuration (LED wall)</span></a>
</h4>
</div>
<div id="collapse2" class="panel-collapse collapse">
<div class="panel-body">
<table>
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_ledshoriz" data-i18n="conf_leds_layout_ma_horiz">Horizontal</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_ledshoriz" type="number" value="10" min="1" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_ledsvert" data-i18n="conf_leds_layout_ma_vert">Vertical</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_ledsvert" type="number" value="10" min="1" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_cabling" data-i18n="conf_leds_layout_ma_cabling">Cabling</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_cabling">
<option value="snake" data-i18n="conf_leds_layout_ma_optsnake">Snake</option>
<option value="parallel" data-i18n="conf_leds_layout_ma_optparallel">Parallel</option>
</select>
</td>
</tr>
<!--- <tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_order" data-i18n="conf_leds_layout_ma_order">Order</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_order">
<option value="horizontal" data-i18n="conf_leds_layout_ma_opthoriz">Horizontal</option>
<option value="vertical" data-i18n="conf_leds_layout_ma_optvert">Vertical</option>
</select>
</td>
</tr>
--->
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_start" data-i18n="conf_leds_layout_ma_position">Input</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_start">
<option value="top-left" data-i18n="conf_leds_layout_ma_opttopleft">Top left</option>
<option value="top-right" data-i18n="conf_leds_layout_ma_opttopright">Top right</option>
<option value="bottom-left" data-i18n="conf_leds_layout_ma_optbottomleft">Bottom left</option>
<option value="bottom-right" data-i18n="conf_leds_layout_ma_optbottomright">Bottom right</option>
</select>
</td>
</tr>
</tbody>
</table>
</div>
<div class="panel-footer" style="text-align:right;">
<button id="btn_ma_save" class="btn btn-primary"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
<div id="texfield_panel" class="panel panel-primary">
<div class="panel-heading headcollapse" data-toggle="collapse" data-parent="#accordion" data-target="#collapse4">
<h4 class="panel-title">
<a><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_leds_layout_generatedconf">Generated/Actual LED Configuration</span></a>
</h4>
</div>
<div id="collapse4" class="panel-collapse collapse">
<div class="panel-body">
<p id="leds_wl" data-i18n="conf_leds_layout_textf1">This textfield shows by default your current loaded layout and will be overwritten if you generate a new one above. Optional you could perform further edits.</p>
<div id="aceedit" style="width:100%;height:500px"></div>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-warning" id="leds_custom_updsim"><i class="fa fa-search fa-fw"></i><span data-i18n="conf_leds_layout_button_updsim">Update preview</span></button>
<button type="button" class="btn btn-primary pull-right" id="leds_custom_save"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
</div>
</div> <!-- accordion -->
<div class="col-lg-6 col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title"><i class="fa fa-search fa-fw"></i><span data-i18n="conf_leds_layout_peview">LED Layout preview</span></h4>
</div>
<div class="panel-body">
<p id="previewcreator" style="font-weight:bold"></p>
<p id="previewledcount" style="font-weight:bold"></p>
<p id="previewledpower" style="font-weight:bold"></p>
<div id="led_vis_help"></div>
<div class="col-lg-12 st_helper" style="padding-left:0px; padding-right:0px">
<div id="leds_preview"></div>
</div>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-danger" id="leds_prev_toggle_num"><i class="fa fa-info fa-fw"></i><span data-i18n="main_ledsim_btn_togglelednumber">toggle led numbers</span></button>
<button type="button" class="btn btn-primary" id="leds_prev_checklist"><i class="fa fa-info-circle fa-fw"></i><span data-i18n="conf_leds_layout_btn_checklist">toggle led numbers</span></button>
</div>
</div>
</div>
</div>
</div> <!-- row layout -->
</div>
</div>
<div class="row">
<div class="col-lg-12" id="layout_intro"></div> </div> <!-- tab content -->
<div class="col-lg-6 col-md-12" id="layout_type">
<div class="panel-group" id="accordion">
<div class="panel panel-primary">
<div class="panel-heading headcollapse" id="classic_panel" data-toggle="collapse" data-parent="#accordion" data-target="#collapse1">
<h4 class="panel-title">
<a><i class="fa fa-television fa-fw"></i><span data-i18n="conf_leds_layout_frame">Classic Layout (LED Frame)</span></a>
</h4>
</div>
<div id="collapse1" class="panel-collapse collapse">
<div class="panel-body">
<table class="table borderless">
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_top" data-i18n="conf_leds_layout_cl_top">Top</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr " id="ip_cl_top" type="number" value="1" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_bottom" data-i18n="conf_leds_layout_cl_bottom">Bottom</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_bottom" type="number" value="0" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_left" data-i18n="conf_leds_layout_cl_left">Left</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_left" type="number" value="0" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_right" data-i18n="conf_leds_layout_cl_right">Right</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_right" type="number" value="0" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_glength" data-i18n="conf_leds_layout_cl_gaglength">Gap length</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_glength" type="number" value="0" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_gpos" data-i18n="conf_leds_layout_cl_gappos">Gap position</label>
</td>
<td class="itd">
<input class="form-control ledCLconstr" id="ip_cl_gpos" type="number" value="0" min="0" step="1">
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_position" data-i18n="conf_leds_layout_cl_inppos">Input position</label>
</td>
<td class="itd">
<input class="form-control ledCLconstr" id="ip_cl_position" type="number" value="0" min="0" step="1">
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_reverse" data-i18n="conf_leds_layout_cl_reversdir">Reverse direction</label>
</td>
<td class="itd">
<div class="checkbox">
<input class="ledCLconstr" id="ip_cl_reverse" type="checkbox" value="false"></input>
<label></label>
</div>
</td>
</tr>
</tbody>
</table>
<div class="panel panel-default">
<div class="panel-heading headcollapse" data-toggle="collapse" data-target="#collapse3" id="advanced_settings">
<h4 class="panel-title">
<a>
<i class="fa fa-fw fa-cogs"></i>
<span data-i18n="conf_leds_layout_advanced">Advanced settings</span>
<i class="fa fa-angle-down pull-right" id="advanced_settings_right_icon"></i>
</a>
</h4>
</div>
<div id="collapse3" class="panel-collapse collapse">
<div class="panel-body ">
<table class="tableform borderless">
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_hdepth" data-i18n="conf_leds_layout_cl_hleddepth">Horizontal LED depth</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_hdepth" type="number" value="8" min="1" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_vdepth" data-i18n="conf_leds_layout_cl_vleddepth">Vertical LED depth</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_vdepth" type="number" value="5" min="1" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_overlap" data-i18n="conf_leds_layout_cl_overlap">Edge Gap</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_overlap" type="number" value="0" min="0" max="200" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_edgegap" data-i18n="conf_leds_layout_cl_edgegap">Edge Gap</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_edgegap" type="number" value="0" min="0" max="50" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_ptl" data-i18n="conf_leds_layout_ptl">Point Top Left</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_ptlh" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent_h">%h</div>
</td>
</tr>
<tr>
<td class="ltd"></td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_ptlv" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent_v">%v</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_ptr" data-i18n="conf_leds_layout_ptr">Point Top Right</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_ptrh" type="number" value="100" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent_h">%</div>
</td>
</tr>
<tr>
<td class="ltd"></td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_ptrv" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent_v">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_pbr" data-i18n="conf_leds_layout_pbr">Point Bottom Right</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_pbrh" type="number" value="100" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent_h">%</div>
</td>
</tr>
<tr>
<td class="ltd"></td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_pbrv" type="number" value="100" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent_v">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_pbl" data-i18n="conf_leds_layout_pbl">Point Bottom Left</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_pblh" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent_h">%</div>
</td>
</tr>
<tr>
<td class="ltd"></td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_pblv" type="number" value="100" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent_v">%</div>
</td>
</tr>
<!-- <tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_cornergap" data-i18n="conf_leds_layout_cl_cornergap">Corner Gap</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr " id="ip_cl_cornergap" type="number" value="0" min="0" max="50" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
-->
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="panel-footer" style="text-align:right;">
<button id="btn_cl_save" class="btn btn-primary"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
<div class="panel panel-primary">
<div class="panel-heading headcollapse" id="matrix_panel" data-toggle="collapse" data-parent="#accordion" data-target="#collapse2">
<h4 class="panel-title">
<a><i class="fa fa-th fa-fw"></i><span data-i18n="conf_leds_layout_matrix">Matrix Configuration (LED wall)</span></a>
</h4>
</div>
<div id="collapse2" class="panel-collapse collapse">
<div class="panel-body">
<table>
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_ledshoriz" data-i18n="conf_leds_layout_ma_horiz">Horizontal</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_ledshoriz" type="number" value="1" min="1" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_ledsvert" data-i18n="conf_leds_layout_ma_vert">Vertical</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_ledsvert" type="number" value="1" min="1" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_cabling" data-i18n="conf_leds_layout_ma_cabling">Cabling</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_cabling">
<option value="snake" data-i18n="conf_leds_layout_ma_optsnake">Snake</option>
<option value="parallel" data-i18n="conf_leds_layout_ma_optparallel">Parallel</option>
</select>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_direction" data-i18n="conf_leds_layout_ma_direction">Direction</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_direction">
<option value="horizontal" data-i18n="conf_leds_layout_ma_opthoriz">Horizontal</option>
<option value="vertical" data-i18n="conf_leds_layout_ma_optvert">Vertical</option>
</select>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_start" data-i18n="conf_leds_layout_ma_position">Input</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_start">
<option value="top-left" data-i18n="conf_leds_layout_ma_opttopleft">Top left</option>
<option value="top-right" data-i18n="conf_leds_layout_ma_opttopright">Top right</option>
<option value="bottom-left" data-i18n="conf_leds_layout_ma_optbottomleft">Bottom left</option>
<option value="bottom-right" data-i18n="conf_leds_layout_ma_optbottomright">Bottom right</option>
</select>
</td>
</tr>
</tbody>
</table>
</div>
<div class="panel panel-default">
<div class="panel-heading headcollapse" data-toggle="collapse" data-target="#collapse-maadv" id="ma_advanced_settings">
<h4 class="panel-title">
<a>
<i class="fa fa-fw fa-cogs"></i>
<span data-i18n="conf_leds_layout_advanced">Advanced settings</span>
<i class="fa fa-angle-down pull-right" id="ma_advanced_settings_right_icon"></i>
</a>
</h4>
</div>
<div id="collapse-maadv" class="panel-collapse collapse">
<div class="panel-body ">
<table class="tableform borderless">
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_gapleft" data-i18n="conf_leds_layout_gapleft">Gap Left</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_gapleft" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%h</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_gapright" data-i18n="conf_leds_layout_gapright">Gap Right</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_gapright" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%v</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_gaptop" data-i18n="conf_leds_layout_gaptop">Gap Left</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_gaptop" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%h</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_gapbottom" data-i18n="conf_leds_layout_gapbottom">Gap Right</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_gapbottom" type="number" value="0" min="0" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%v</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="panel-footer" style="text-align:right;">
<button id="btn_ma_save" class="btn btn-primary"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
<div id="blacklist_panel" class="panel panel-primary">
<div class="panel-heading headcollapse" id="blacklist_config_panel" data-toggle="collapse" data-parent="#accordion" data-target="#collapse4">
<h4 class="panel-title">
<a><i class="fa fa-ban fa-fw"></i><span data-i18n="conf_leds_layout_blacklistleds_title">Blacklist LEDs</span></a>
</h4>
</div>
<div id="collapse4" class="panel-collapse collapse">
<div class="panel-body">
<div id="editor_container_blacklist_conf"></div>
</div>
<div class="panel-footer" style="text-align:right;">
<button id="btn_bl_save" class="btn btn-primary"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
<div id="texfield_panel" class="panel panel-primary">
<div class="panel-heading headcollapse" id="current_config_panel" data-toggle="collapse" data-parent="#accordion" data-target="#collapse5">
<h4 class="panel-title">
<a><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_leds_layout_generatedconf">Generated/Actual LED Configuration</span></a>
</h4>
</div>
<div id="collapse5" class="panel-collapse collapse in">
<div class="panel-body">
<p id="leds_wl" data-i18n="conf_leds_layout_textf1">This textfield shows by default your current loaded layout and will be overwritten if you generate a new one above. Optional you could perform further edits.</p>
<div id="aceedit" style="width:100%;height:500px"></div>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-warning" id="leds_custom_updsim"><i class="fa fa-search fa-fw"></i><span data-i18n="conf_leds_layout_button_updsim">Update preview</span></button>
<button type="button" class="btn btn-primary pull-right" id="leds_custom_save"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
</div>
</div> <!-- accordion -->
<div class="col-lg-6 col-md-12" id="layout_preview">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<i class="fa fa-search fa-fw"></i>
<span data-i18n="conf_leds_layout_peview">LED Layout preview</span>
<a href="#" class='fullscreen-btn' role="button" title="Toggle fullscreen">
<i class="fa fa-expand fa-fw pull-right"></i>
</a>
</h4>
</div>
<div class="panel-body">
<p id="previewcreator" style="font-weight:bold"></p>
<p id="previewledcount" style="font-weight:bold"></p>
<p id="previewledpower" style="font-weight:bold"></p>
<div id="led_vis_help"></div>
<div class="col-lg-12 st_helper" style="position:relative; padding-left:0px; padding-right:0px">
<canvas id="image_preview" style="position:absolute; z-index:0"></canvas>
<div id="keystone_correction_area" style="position: absolute; z-index: 20;"></div>
<div id="leds_preview"></div>
</div>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-danger" id="leds_prev_toggle_num"><i class="fa fa-info fa-fw"></i><span data-i18n="main_ledsim_btn_togglelednumber">toggle led numbers</span></button>
<button type="button" class="btn btn-danger" id="leds_prev_toggle_live_video"><i class="fa fa-fw fa-television"></i><span data-i18n="main_ledsim_btn_togglelivevideo">toggle live video</span></button>
<button type="button" class="btn btn-danger" id="leds_prev_toggle_keystone_correction_area" style="display:none;"><i class="mdi mdi-vector-square" style="margin-right:5px;"></i><span data-i18n="conf_leds_layout_btn_keystone">toggle keystone correction</span></button>
<button type="button" class="btn btn-primary pull-right" id="leds_prev_checklist"><i class="fa fa-info-circle fa-fw"></i><span data-i18n="conf_leds_layout_btn_checklist">show checklist</span></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
<script src="/js/content_leds.js"></script> <script src="/js/content_leds.js"></script>

View File

@ -1,30 +1,21 @@
<div class="container-fluid" id="trans_conf_logging"> <div class="container-fluid" id="trans_conf_logging">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-reorder fa-fw"></i><span data-i18n="main_menu_logging_token">Log</span></h3> <h3 class="page-header"><i class="fa fa-reorder fa-fw"></i><span data-i18n="main_menu_logging_token">Log</span></h3>
<div id="log_head"></div> <div id="log_head"></div>
<div class="row" id='conf_cont'></div> <div class="row" id='conf_cont'></div>
</div> <hr />
<div class="col-lg-12"> <div id="log_content"><span style="font-weight:bold;font-size:17px" data-i18n="conf_logging_nomessage"></span></div>
<div class="panel panel-default"> <hr>
<div class="panel-heading"> <div style="display:none">
<h4 class="panel-title"> <h4 style="font-weight:bold"><i class="fa fa-reorder fa-fw"></i><span data-i18n="conf_logging_report">Bericht</span></h4>
<i class="fa fa-book fa-fw"></i> <button class="btn btn-primary" id="btn_logupload"><i class="fa fa-upload fa-fw"></i><span data-i18n="conf_logging_btn_pbupload"></span></button>
<span data-i18n="conf_logging_logoutput"></span> <div id="log_upl_pol"></div>
<a href="#" class='fullscreen-btn' role="button" title="Toggle fullscreen"> <div id="upl_link" style="margin-top:10px;font-weight:bold;"></div>
<i class="fa fa-expand fa-fw pull-right"></i> <div id="prev_reports"></div>
</a> </div>
</h4> </div>
</div> </div>
<div class="panel-body">
<div id="log_content"><span style="font-weight:bold;font-size:17px" data-i18n="conf_logging_nomessage"></span></div>
</div>
<div class="panel-footer" id="log_footer">
</div>
</div>
</div>
</div>
</div> </div>
<script src="/js/content_logging.js"></script> <script src="/js/content_logging.js"></script>

View File

@ -1,12 +1,12 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-sitemap fa-fw"></i><span data-i18n="main_menu_network_conf_token">Network Services</span></h3> <h3 class="page-header"><i class="fa fa-sitemap fa-fw"></i><span data-i18n="main_menu_network_conf_token">Network Services</span></h3>
<div id="conf_cont"> <div id="conf_cont">
<div class="row" id="conf_cont_tok"> <div class="row" id="conf_cont_tok">
<div class="col-lg-6" id="tok_desc"> <div class="col-lg-6" id="tok_desc">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading panel-system"><i class="fa fa-key fa-fw"></i><span data-i18n="conf_network_tok_title"></span></div> <div class="panel-heading"><i class="fa fa-key fa-fw"></i><span data-i18n="conf_network_tok_title"></span></div>
<div class="panel-body"> <div class="panel-body">
<div id="tok_desc_cont"></div> <div id="tok_desc_cont"></div>
<div id="tktable"></div> <div id="tktable"></div>
@ -34,4 +34,4 @@
</div> </div>
</div> </div>
<script src="/js/content_network.js"></script> <script src="/js/content_network.js"></script>

File diff suppressed because one or more lines are too long

View File

@ -1,149 +1,98 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-dashboard fa-fw"></i><span data-i18n="main_menu_dashboard_token">Dashboard</span></h3> <h3 class="page-header"><i class="fa fa-dashboard fa-fw"></i><span data-i18n="main_menu_dashboard_token">Dashboard</span></h3>
<div id="dash_intro">
<div class="row">
<div class="col-md-6 col-xxl-4">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-info-circle fa-fw"></i>
<span data-i18n="dashboard_infobox_label_title">Information</span>
</div>
<div class="panel-body">
<table class="table borderless">
<tbody>
<tr>
<td data-i18n="dashboard_infobox_label_statush"></td>
<td id="dash_statush" style="font-weight:bold">unknown</td>
</tr>
<tr>
<td data-i18n="dashboard_infobox_label_platform">Platform:</td>
<td id="dash_platform"></td>
</tr>
<tr>
<td data-i18n="conf_leds_contr_label_contrtype">LED type:</td>
<td id="dash_leddevice"></td>
</tr>
<tr>
<td data-i18n="dashboard_infobox_label_instance">Instance</td>
<td id="dash_instance"></td>
</tr>
<tr>
<td data-i18n="dashboard_infobox_label_ports">Ports</td>
<td id="dash_ports"></td>
</tr>
<tr>
<td data-i18n="dashboard_infobox_label_currenthyp">Hyperion version:</td>
<td id="dash_currv">unknown</td>
</tr>
<tr>
<td data-i18n="dashboard_infobox_label_watchedversionbranch">Watched version branch:</td>
<td id="dash_watchedversionbranch">unknown</td>
</tr>
<tr>
<td data-i18n="dashboard_infobox_label_latesthyp">Latest version:</td>
<td id="dash_latev">unknown</td>
</tr>
</tbody>
</table>
<hr>
<p style="font-weight:bold" data-i18n="dashboard_infobox_label_smartacc">Smart Access<p>
<span id="btn_hsc"></span>
<hr>
<span id="versioninforesult"></span>
</div>
</div>
</div>
<div class="col-md-6 col-xxl-3">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-eye fa-fw"></i>
<span data-i18n="dashboard_componentbox_label_title">Components status</span>
</div>
<div class="panel-body">
<table class="table">
<thead>
<tr>
<th data-i18n="dashboard_componentbox_label_comp">Component</th>
<th data-i18n="dashboard_componentbox_label_status">Status</th>
</tr>
</thead>
<tbody id="tab_components">
</tbody>
</table>
</div>
</div>
</div>
<div class="col-md-12 col-xxl-5" style="display:none">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-newspaper-o fa-fw"></i>
<span data-i18n="dashboard_newsbox_label_title">Visit Hyperion Blog</span>
</div>
<div class="panel-body">
<div id="dash_news" style="margin-bottom:7px"></div>
<a href="https://hyperion-project.org/blog/?pk_campaign=WebUI&pk_kwd=visitblog" target="_blank" data-i18n="dashboard_newsbox_visitblog"></a>
</div>
</div>
</div>
</div>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
</div>
<!-- /.container-fluid -->
<!-- Infobox --> <script src="/js/content_dashboard.js"></script>
<div id="dash_intro">
<!-- Instance(s) -->
<div class="row instances">
<!-- Config status -->
<div class="col-md-6 col-xxl-4">
<div class="panel panel-default">
<div class="panel-heading panel-system">
<span id="dash_config_status">Status</span>
</div>
<div class="panel-body">
<table id="dash_capture_hw" class="table borderless">
<thead>
<tr>
<th colspan="3">
<i class="mdi mdi-camera"></i>
<span data-i18n="main_menu_grabber_conf_token">Capturing Hardware</span>
</th>
</tr>
</thead>
<tbody>
<tr id="dash_screen_grabber_row">
<td></td>
<td data-i18n="edt_conf_fg_heading_title">Screen-Grabber</td>
<td style="text-align: right; padding-right: 0">
<span id="dash_screen_grabber">disabled</span>
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemGrabber', 'editor_container_screengrabber')" style="text-decoration: none; cursor: pointer"></a>
</td>
</tr>
<tr id="dash_video_grabber_row">
<td></td>
<td data-i18n="edt_conf_v4l2_heading_title">Video-Grabber</td>
<td style="text-align: right; padding-right: 0">
<span id="dash_video_grabber">disabled</span>
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemGrabber', 'editor_container_videograbber')" style="text-decoration: none; cursor: pointer"></a>
</td>
</tr>
<tr id="dash_audio_grabber_row">
<td></td>
<td data-i18n="edt_conf_audio_heading_title">Audio-Grabber</td>
<td style="text-align: right; padding-right: 0">
<span id="dash_audio_grabber">disabled</span>
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemGrabber', 'editor_container_audiograbber')" style="text-decoration: none; cursor: pointer"></a>
</td>
</tr>
</tbody>
</table>
<table id="dash_ports" class="table borderless">
<thead>
<tr>
<th colspan="3">
<i class="mdi mdi-lan"></i>
<span data-i18n="dashboard_infobox_label_ports">Ports</span>
</th>
</tr>
</thead>
<tbody>
<tr id="dash_ports_flat_row">
<td></td>
<td data-i18n="dashboard_infobox_label_port_flat">flat</td>
<td style="text-align: right; padding-right: 0">
<span id="dash_fbPort">unknown</span>
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemNetwork', 'editor_container_fbserver')" style="text-decoration: none; cursor: pointer"></a>
</td>
</tr>
<tr id="dash_ports_proto_row">
<td></td>
<td data-i18n="dashboard_infobox_label_port_proto">proto</td>
<td style="text-align: right; padding-right: 0">
<span id="dash_pbPort">unknown</span>
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemNetwork', 'editor_container_protoserver')" style="text-decoration: none; cursor: pointer"></a>
</td>
</tr>
<tr id="dash_ports_boblight_row">
<td></td>
<td data-i18n="dashboard_infobox_label_port_boblight">proto</td>
<td style="text-align: right; padding-right: 0">
<span id="dash_boblightPort">unknown</span>
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemInstCapture', 'editor_container_boblightserver')" style="text-decoration: none; cursor: pointer"></a>
</td>
</tr>
<tr>
<td></td>
<td data-i18n="dashboard_infobox_label_port_json">json</td>
<td style="text-align: right; padding-right: 0">
<span id="dash_jsonPort">unknown</span>
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemNetwork', 'editor_container_jsonserver')" style="text-decoration: none; cursor: pointer"></a>
</td>
</tr>
<tr>
<td></td>
<td data-i18n="dashboard_infobox_label_ports_websocket">websocket</td>
<td style="text-align: right; padding-right: 0">
<span id="dash_wsPorts">unknown</span>
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemWeb')" style="text-decoration: none; cursor: pointer"></a>
</td>
</tr>
</tbody>
</table>
<table class="table borderless">
<thead>
<tr>
<th colspan="3">
<i class="mdi mdi-numeric"></i>
<span data-i18n="about_version">Version</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td data-i18n="dashboard_infobox_label_currenthyp">Hyperion version:</td>
<td id="dash_currv" style="text-align: right">unknown</td>
</tr>
<tr>
<td></td>
<td data-i18n="dashboard_infobox_label_watchedversionbranch">Watched version branch:</td>
<td id="dash_watchedversionbranch" style="text-align: right">unknown</td>
</tr>
<tr>
<td></td>
<td data-i18n="dashboard_infobox_label_latesthyp">Latest version:</td>
<td id="dash_latev" style="text-align: right">unknown</td>
</tr>
</tbody>
</table>
<hr>
<span id="versioninforesult"></span>
</div>
</div>
</div>
</div>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
</div>
</div>
<!-- /.container-fluid -->
<script src="/js/content_dashboard.js"></script>

View File

@ -1,65 +1,51 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-cogs fa-fw"></i><span data-i18n="main_menu_effectsconfigurator_token">Effects Configurator</span></h3> <h3 class="page-header"><i class="fa fa-cogs fa-fw"></i><span data-i18n="main_menu_effectsconfigurator_token">Effects Configurator</span></h3>
<div id="intro_effc">
<div class="panel panel-default" style="border:0px;"> </div>
<div class="panel-heading panel-instance" style="border-radius:3px; border-bottom:0px;"> <div class="row">
<div class="dropdown"> <div class="col-lg-6">
<a id="active_instance_dropdown" class="dropdown-toggle" data-toggle="dropdown" href="#" style="text-decoration:none;display:flex;align-items:center;"> <div class="panel panel-default" >
<div id="active_instance_friendly_name"></div> <div class="panel-heading">
<div id="btn_hypinstanceswitch" style="white-space:nowrap;"><span class="mdi mdi-lightbulb-group mdi-24px" style="margin-right:0; margin-left:5px;"></span><span class="mdi mdi-menu-down mdi-24px"></span></div> <label for="effectslist" data-i18n="effectsconfigurator_label_chooseeff">Choose Base-Effect:</label>
</a> <select id="effectslist" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" />
<ul id="hyp_inst_listing" class="dropdown-menu dropdown-alerts" style="cursor:pointer;"></ul> </div>
</div> <div class="panel-body">
</div> <div id="eff_desc"></div>
</div> <table style="margin-bottom:8px" id="effc_nametable">
<tbody>
<div id="intro_effc"> <tr>
</div> <td class="ltd"><label for="name-input" data-i18n="effectsconfigurator_label_effectname">Effect name:</label></td>
<div class="row"> <td class="itd"><input class="form-control" type="text" id="name-input" /></td>
<div class="col-lg-6"> </tr>
<div class="panel panel-default"> </tbody>
<div class="panel-heading"> </table>
<label for="effectslist" data-i18n="effectsconfigurator_label_chooseeff">Choose Base-Effect:</label> <div id="editor_container" />
<select id="effectslist" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block"></select> </div>
</div> <div class="panel-footer" id="eff_footer">
<div class="panel-body"> <button class="btn btn-warning" id='btn_start_test' data-i18n="effectsconfigurator_button_starttest">Start Effecttest</button>
<div id="eff_desc"></div> <button class="btn btn-warning" id='btn_stop_test' data-i18n="effectsconfigurator_button_stoptest">Stop Effecttest</button>
<table style="margin-bottom:8px" id="effc_nametable"> <button class="btn btn-danger" id='btn_cont_test' data-i18n="effectsconfigurator_button_conttest">Toggle continuous testing</button>
<tbody> <button class="btn btn-primary" id='btn_write' data-i18n="effectsconfigurator_button_saveeffect">Save Effect</button>
<tr> </div>
<td class="ltd"><label for="name-input" data-i18n="effectsconfigurator_label_effectname">Effect name:</label></td> </div>
<td class="itd"><input class="form-control" type="text" id="name-input"></td> </div>
</tr> <div class="col-lg-6">
</tbody> <div class="panel panel-default" >
</table> <div class="panel-heading">
<div id="editor_container"></div> <label for="effectsdellist" data-i18n="effectsconfigurator_editdeleff"></label>
</div> <select id="effectsdellist" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" />
<div class="panel-footer" id="eff_footer"> </div>
<button class="btn btn-warning" id='btn_start_test' data-i18n="effectsconfigurator_button_starttest">Start Effecttest</button> <div class="panel-body">
<button class="btn btn-warning" id='btn_stop_test' data-i18n="effectsconfigurator_button_stoptest">Stop Effecttest</button> <button class="btn btn-primary" id='btn_delete' data-i18n="effectsconfigurator_button_deleffect">Delete Effect</button>
<button class="btn btn-danger" id='btn_cont_test' data-i18n="effectsconfigurator_button_conttest">Toggle continuous testing</button> <button class="btn btn-primary" id='btn_edit' data-i18n="effectsconfigurator_button_editeffect"></button>
<button class="btn btn-primary" id='btn_write' data-i18n="effectsconfigurator_button_saveeffect">Save Effect</button> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-6"> </div>
<div class="panel panel-default"> </div>
<div class="panel-heading">
<label for="effectsdellist" data-i18n="effectsconfigurator_editdeleff"></label>
<select id="effectsdellist" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block"></select>
</div>
<div class="panel-body">
<button class="btn btn-primary" id='btn_delete' data-i18n="effectsconfigurator_button_deleffect">Delete Effect</button>
<button class="btn btn-primary" id='btn_edit' data-i18n="effectsconfigurator_button_editeffect"></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div> </div>
<script src="/js/content_effectsconfigurator.js"></script> <script src="/js/content_effectsconfigurator.js"></script>

View File

@ -5,7 +5,7 @@
<style> body {margin:auto; padding:2%; text-align:center; font-family:arial;}</style> <style> body {margin:auto; padding:2%; text-align:center; font-family:arial;}</style>
</head> </head>
<body> <body>
<img src="../img/hyperion/logo_positiv.png" alt="Redefine ambient light!" style="margin-bottom:20px;"> <img src="../img/hyperion/hyperionlogo.png" alt="Redefine ambient light!" style="margin-bottom:20px;">
<h2><span style="color:red">We are sorry, Internet Explorer is not supported!</span><br /><br /> Please use recent versions of Firefox, Chrome, Safari or MS Edge.</h2> <h2><span style="color:red">We are sorry, Internet Explorer is not supported!</span><br /><br /> Please use recent versions of Firefox, Chrome, Safari or MS Edge.</h2>
</body> </body>
</html> </html>

View File

@ -1,40 +1,35 @@
<div class="container" style="margin:20px auto;max-width:500px;"> <div class="container" style="margin:20px auto;max-width:500px;">
<center> <center>
<div> <div>
<div class="panel panel-danger"> <div class="panel panel-danger">
<div class="panel-heading panel-system"> <div class="panel-heading">
<h3 class="panel-title">Login</h3> <h3 class="panel-title">Login</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<form> <form>
<div class="form-group"> <div class="form-group">
<input type="name="username" class="form-control" type="text" id="username" value="Hyperion" disabled/></br> <input name="password" class="form-control" type="password" id="password" placeholder="Password" autocomplete="off"/>
<input name="password" class="form-control" type="password" id="password" placeholder="Password" autocomplete="off"/> <input name="show_pw" type="checkbox" id="show_pw"/><label for="show_pw">Show/Hide Password</label>
<input name="show_pw" type="checkbox" id="show_pw" /><label for="show_pw">Show/Hide Password</label> </div>
</div> <div class="form-group">
<div class="form-group"> <button type="submit" class="btn btn-sm btn-success" id="btn_password" onclick="requestAuthorization(document.getElementById('password').value); return false;" disabled><i class="fa fa-fw fa-unlock"></i>Login</button>
<button type="submit" class="btn btn-sm btn-success" id="btn_password" onclick="requestAuthorization(document.getElementById('password').value); return false;"><i class="fa fa-fw fa-unlock"></i>Login</button> </div>
</div> </form>
</form> </div>
</div> </div>
</div> </div>
</div> </center>
</center>
</div> </div>
<script> <script>
removeOverlay(); removeOverlay();
$('#password').off().on('input', function (e) { $('#password').off().on('input',function(e) {
if (e.currentTarget.value.length >= 8) { if(e.currentTarget.value.length >= 8)
$('#btn_password').prop('disabled', false); $('#btn_password').removeAttr('disabled');
} });
else {
$('#btn_password').prop('disabled', true);
}
});
$('#show_pw').off().on('change', function (e) { $('#show_pw').off().on('change',function(e) {
(e.currentTarget.checked ? $('#password').attr('type', 'text') : $('#password').attr('type', 'password')) (e.currentTarget.checked ? $('#password').attr('type', 'text') : $('#password').attr('type', 'password'))
}); });
</script> </script>

View File

@ -1,107 +1,91 @@
<div class="container-fluid"> <div class="container-fluid">
<h3 class="page-header"><i class="fa fa-wifi fa-fw"></i><span data-i18n="main_menu_remotecontrol_token">Remote Control</span></h3> <h3 class="page-header"><i class="fa fa-wifi fa-fw"></i><span data-i18n="main_menu_remotecontrol_token">Remote Control</span></h3>
<div class="row">
<div class="col-md-12 col-lg-8 col-xxl-7">
<div class="panel panel-default" >
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_input_label">Source selection</span></div>
<div class="panel-body">
<div id="sstcont"></div>
<div id="auto_btn"></div>
</div>
</div>
</div>
<div class="panel panel-default" style="border:0px;"> <div class="col-md-6 col-lg-4 col-xxl-5">
<div class="panel-heading panel-instance" style="border-radius:3px; border-bottom:0px;"> <div class="panel panel-default" >
<div class="dropdown"> <div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_components_label">Components control</span></div>
<a id="active_instance_dropdown" class="dropdown-toggle" data-toggle="dropdown" href="#" style="text-decoration:none;display:flex;align-items:center;"> <div class="panel-body" id="comp_intro">
<div id="active_instance_friendly_name"></div> <div id="componentsbutton"></div>
<div id="btn_hypinstanceswitch" style="white-space:nowrap;"><span class="mdi mdi-lightbulb-group mdi-24px" style="margin-right:0; margin-left:5px;"></span><span class="mdi mdi-menu-down mdi-24px"></span></div> </div>
</a> </div>
<ul id="hyp_inst_listing" class="dropdown-menu dropdown-alerts" style="cursor:pointer;"></ul> </div>
</div>
</div>
</div>
<div class="row"> <div class="col-md-6 col-lg-6 col-xxl-4">
<div class="col-md-12 col-lg-8 col-xxl-8"> <div class="panel panel-default" >
<div class="panel panel-default"> <div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_color_label">Colors/Effects</span></div>
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_input_label">Source selection</span></div> <div class="panel-body" id="color_intro">
<div class="panel-body"> <table class="table borderless">
<div id="sstcont"></div> <tbody>
<div id="auto_btn"></div> <tr>
</div> <td style="vertical-align:middle"><label for="cpeff" data-i18n="remote_color_label_color"></label></td>
</div> <td>
</div> <div id="cp2" class="colorpicker-component input-group">
<input type="text" id="cpeff" class="form-control"/>
<div class="col-md-6 col-lg-4 col-xxl-4"> <span class="input-group-addon"><i></i></span>
<div class="panel panel-default"> <span class="input-group-addon" id="remote_input_rescol" title="Repeat Color" style="cursor:pointer"><i class="fa fa-repeat"></i></span>
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_components_label">Components control</span></div> </div>
<div class="panel-body" id="comp_intro"> </td>
<div id="componentsbutton"></div> </tr>
</div> <tr>
</div> <td style="vertical-align:middle"><label for="effect_select" data-i18n="remote_effects_label_effects">Effect:</label></td>
</div> <td class="input-group">
</div> <select id="effect_select" class="form-control"></select>
<span class="input-group-addon" id="remote_input_reseff" title="Repeat Effect" style="cursor:pointer"><i class="fa fa-repeat"></i></span>
<div class="row"> </td>
<div class="col-md-6 col-lg-6 col-xxl-4"> </tr>
<div class="panel panel-default"> <tr>
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_color_label">Colors/Effects</span></div> <td style="vertical-align:middle"><label for="remote_input_img" data-i18n="remote_effects_label_picture" >Picture:</label></td>
<div class="panel-body" id="color_intro"> <td class="input-group custom-file">
<table class="table borderless"> <input class="form-control" id="remote_input_img" type="file" accept="image/*" />
<tbody> <span class="input-group-addon" id="remote_input_repimg" title="Repeat Image" style="cursor:pointer"><i class="fa fa-repeat"></i></span>
<tr> </td>
<td style="vertical-align:middle"><label for="cpeff" data-i18n="remote_color_label_color"></label></td> </tr>
<td> <tr>
<div id="cp2" class="colorpicker-component input-group"> <td style="vertical-align:middle"><label for="remote_duration" data-i18n="remote_input_duration"></label></td>
<input type="text" id="cpeff" class="form-control" /> <td class="input-group">
<span class="input-group-addon"><i></i></span> <input id="remote_duration" type="number" class="form-control" value="0" min="0"/>
<span class="input-group-addon" id="remote_input_rescol" title="Repeat Color" style="cursor:pointer"><i class="fa fa-repeat"></i></span> <span class="input-group-addon" data-i18n="edt_append_s"></span>
</div> </td>
</td> </tr>
</tr> </tbody>
<tr id="effect_row"> </table>
<td style="vertical-align:middle"><label for="effect_select" data-i18n="remote_effects_label_effects">Effect:</label></td> <button data-i18n="remote_color_button_reset" type="button" class="btn btn-primary" id="reset_color" style="margin-top:10px;">Reset Color/Effect</button>
<td class="input-group"> </div>
<select id="effect_select" class="form-control"></select> </div>
<span class="input-group-addon" id="remote_input_reseff" title="Repeat Effect" style="cursor:pointer"><i class="fa fa-repeat"></i></span> </div>
</td> <div class="col-md-6 col-lg-6 col-xxl-3">
</tr> <div class="panel panel-default" >
<tr> <div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_maptype_label">Mapping types</span></div>
<td style="vertical-align:middle"><label for="remote_input_img" data-i18n="remote_effects_label_picture">Picture:</label></td> <div class="panel-body" id="maptype_intro">
<td class="input-group custom-file"> <div id="mappingsbutton"></div>
<input class="form-control" id="remote_input_img" type="file" accept="image/*" /> </div>
<span class="input-group-addon" id="remote_input_repimg" title="Repeat Image" style="cursor:pointer"><i class="fa fa-repeat"></i></span> </div>
</td> </div>
</tr> <div class="col-md-6 col-lg-6 col-xxl-5">
<tr> <div class="panel panel-default" >
<td style="vertical-align:middle"><label for="remote_duration" data-i18n="remote_input_duration"></label></td> <div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_videoMode_label"></span></div>
<td class="input-group"> <div class="panel-body" id="videomode_intro">
<input id="remote_duration" type="number" class="form-control" value="0" min="0" /> <div id="videomodebtns"></div>
<span class="input-group-addon" data-i18n="edt_append_s"></span> </div>
</td> </div>
</tr> </div>
</tbody> <div class="col-md-6 col-lg-6 col-xxl-5">
</table> <div class="panel panel-default" >
<button data-i18n="remote_color_button_reset" type="button" class="btn btn-primary" id="reset_color" style="margin-top:10px;">Reset Color/Effect</button> <div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_adjustment_label"></span></div>
</div> <div class="panel-body" id="adjust_content">
</div> </div>
</div> </div>
<div class="col-md-6 col-lg-6 col-xxl-3"> </div>
<div class="panel panel-default"> </div>
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_maptype_label">Mapping types</span></div>
<div class="panel-body" id="maptype_intro">
<div id="mappingsbutton"></div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-6 col-xxl-5">
<div class="panel panel-default">
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_videoMode_label"></span></div>
<div class="panel-body" id="videomode_intro">
<div id="videomodebtns"></div>
</div>
</div>
</div>
<div class="col-md-6 col-lg-6 col-xxl-5">
<div class="panel panel-default">
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_adjustment_label"></span></div>
<div class="panel-body" id="adjust_content">
</div>
</div>
</div>
</div>
</div> </div>
<script src="/js/content_remote.js"></script> <script src="/js/content_remote.js" ></script>

View File

@ -5,7 +5,7 @@
<h3 data-i18n="info_restart_title"></h3> <h3 data-i18n="info_restart_title"></h3>
<h4 data-i18n="info_restart_rightback"></h4> <h4 data-i18n="info_restart_rightback"></h4>
<p data-i18n="info_restart_contus"></p> <p data-i18n="info_restart_contus"></p>
<a href="https://hyperion-project.org/forum/" data-i18n="info_restart_contusa"></a> <a href="https://forum.hyperion-project.org?pk_campaign=WebUI&pk_kwd=failedrestart" data-i18n="info_restart_contusa"></a>
</div> </div>
</center> </center>
</div> </div>

View File

@ -3,24 +3,110 @@
<div class="col-xs-12"> <div class="col-xs-12">
<h3 class="page-header"><i class="fa fa-info fa-fw"></i><span data-i18n="support_label_title">Support Hyperion</span></h3> <h3 class="page-header"><i class="fa fa-info fa-fw"></i><span data-i18n="support_label_title">Support Hyperion</span></h3>
<div id="supp_intro"></div> <div id="supp_intro"></div>
<div style="display:none">
<h4 style="font-weight: bold" data-i18n="support_label_spreadtheword">Spread the word</h4>
<a href="https://www.facebook.com/Hyperion-1415088231896140/" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-facebook bg-color-fb"></i>
<h4>Facebook</h4>
<p data-i18n="support_label_fbtext">Share our Hyperion Facebook page and get a notice when new updates are released</p>
</div>
</a>
<a href="https://twitter.com/HyperionAmbient" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-twitter bg-color-tw"></i>
<h4>Twitter</h4>
<p data-i18n="support_label_twtext">Share and follow on Twitter, be always up to date with latest post about the Hyperion development</p>
</div>
</a>
<a href="https://plus.google.com/103082579494653418604" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-google-plus bg-color-g"></i>
<h4>Google+</h4>
<p data-i18n="support_label_ggtext">Circle us on Google +!</p>
</div>
</a>
<a href="https://www.youtube.com/channel/UCCah_idbSMqgo4UwP6R9H-A" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-youtube bg-color-g"></i>
<h4>Youtube</h4>
<p data-i18n="support_label_yttext">Bored from pictures? Checkout our Youtube channel!</p>
</div>
</a>
<a href="https://www.instagram.com/hyperionambient/" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-instagram bg-color-ig"></i>
<h4>Instagram</h4>
<p data-i18n="support_label_igtext"></p>
</div>
</a>
</div>
</div>
<div class="col-xs-12" style="display:none">
<hr>
<h4 style="font-weight: bold" data-i18n="support_label_donate">Donate or use our affiliate links</h4>
<ol>
<li data-i18n="support_label_affinstr1">Click on the appropriate link of your country</li>
<li data-i18n="support_label_affinstr2">Everything you buy (doesnt matter what) we get a small fee based on your turnover</li>
<li data-i18n="support_label_affinstr3">You ALWAYS pay the same price, there is absolutely no difference. Try it out!</li>
</ol>
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-amazon bg-color-am"></i>
<h4>Amazon</h4>
<ul>
<li><a href="http://www.amazon.de/?tag=hyperionproje-21" target="_blank" data-i18n="general_country_de">Germany</a></li>
<li><a href="http://www.amazon.com/?tag=hyperionpro05-20" target="_blank" data-i18n="general_country_us">United States</a></li>
<li><a href="http://www.amazon.co.uk/?tag=hyperionpro02-21" target="_blank" data-i18n="general_country_uk">United Kingdom</a></li>
<li><a href="http://www.amazon.fr/?tag=hyperionpro0c-21" target="_blank" data-i18n="general_country_fr">France</a></li>
<li><a href="http://www.amazon.es/?tag=hyperionpro07-21" target="_blank" data-i18n="general_country_es">Spain</a></li>
<li><a href="http://www.amazon.it/?tag=hyperionpro00-21" target="_blank" data-i18n="general_country_it">Italy</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-shopping-cart bg-color-am"></i>
<h4>ebay</h4>
<ul>
<li><a href="http://rover.ebay.com/rover/1/707-53477-19255-0/1?pub=5575174930&toolid=10001&campid=707-53477-19255-0&customid=&mpt=9592320&mpre=http%3A%2F%2Fwww.ebay.de" target="_blank" data-i18n="general_country_de">Germany</a></li>
<li><a href="http://rover.ebay.com/rover/1/711-53200-19255-0/1?pub=5575174930&toolid=10001&campid=711-53200-19255-0&customid=&mpt=8091563&mpre=http%3A%2F%2Fwww.ebay.com" target="_blank" data-i18n="general_country_us">United States</a></li>
<li><a href="http://rover.ebay.com/rover/1/710-53481-19255-0/1?pub=5575174930&toolid=10001&campid=710-53481-19255-0&customid=&mpt=9837178&mpre=http%3A%2F%2Fwww.ebay.co.uk" target="_blank" data-i18n="general_country_uk">United Kingdom</a></li>
<li><a href="http://rover.ebay.com/rover/1/1346-53482-19255-0/1?pub=5575174930&toolid=10001&campid=1346-53482-19255-0&customid=&mpt=9890408&mpre=http%3A%2F%2Fwww.ebay.nl" target="_blank" data-i18n="general_country_nl">Netherlands</a></li>
<li><a href="http://rover.ebay.com/rover/1/709-53476-19255-0/1?pub=5575174930&toolid=10001&campid=709-53476-19255-0&customid=&mpt=9865977&mpre=http%3A%2F%2Fwww.ebay.fr" target="_blank" data-i18n="general_country_fr">France</a></li>
<li><a href="http://rover.ebay.com/rover/1/1185-53479-19255-0/1?pub=5575174930&toolid=10001&campid=1185-53479-19255-0&customid=&mpt=1016300&mpre=http%3A%2F%2Fwww.ebay.es" target="_blank" data-i18n="general_country_es">Spain</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-paypal bg-color-pp"></i>
<h4>Paypal</h4>
<p data-i18n="support_label_donationpp">Donation:</p><a href="https://www.paypal.me/hyperionproject/10" target="_blank">Paypal</a>
</div>
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-btc bg-color-btc"></i>
<h4>Bitcoin</h4>
<p data-i18n="support_label_btctext">Address:</p>
<p style="word-break: break-all;">1GGZbsT6fH3cGq25H5HS2PfisPfDnffSJR</p>
</div>
</div>
<div class="col-xs-12"> <div class="col-xs-12">
<hr> <hr>
<h4 style="font-weight: bold" data-i18n="support_label_webrestitle">Information and help ressources</h4> <h4 style="font-weight: bold" data-i18n="support_label_webrestitle">Information and help ressources</h4>
<a href="https://hyperion-project.org" target="_blank" class="unlink"> <a href="https://www.hyperion-project.org?pk_campaign=WebUI&pk_kwd=support_webpage" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container"> <div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-globe bg-color-wf"></i> <i class="fa fa-globe bg-color-wf"></i>
<h4 data-i18n="support_label_webpagetitle">Webpage</h4> <h4 data-i18n="support_label_webpagetitle">Webpage</h4>
<p data-i18n="support_label_webpagetext">Home of Hyperion</p> <p data-i18n="support_label_webpagetext">Home of Hyperion</p>
</div> </div>
</a> </a>
<a href="https://docs.hyperion-project.org" target="_blank" class="unlink"> <a href="https://wiki.hyperion-project.org?pk_campaign=WebUI&pk_kwd=support_wiki" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container"> <div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-book bg-color-wf"></i> <i class="fa fa-book bg-color-wf"></i>
<h4 data-i18n="support_label_wikititle">Documentation</h4> <h4 data-i18n="support_label_wikititle">Wiki</h4>
<p data-i18n="support_label_wikitext">The A to Z source for almost everything Hyperion related</p> <p data-i18n="support_label_wikitext">The A to Z source for almost everything Hyperion related</p>
</div> </div>
</a> </a>
<a href="https://hyperion-project.org/forum/" target="_blank" class="unlink"> <a href="https://forum.hyperion-project.org?pk_campaign=WebUI&pk_kwd=support_forum" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container"> <div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-comments bg-color-wf"></i> <i class="fa fa-comments bg-color-wf"></i>
<h4 data-i18n="support_label_forumtitle">Forum</h4> <h4 data-i18n="support_label_forumtitle">Forum</h4>

View File

@ -1,70 +1,44 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-download fa-fw"></i><span data-i18n="main_menu_update_token">Update</span></h3> <h3 class="page-header"><i class="fa fa-download fa-fw"></i><span data-i18n="main_menu_update_token">Update</span></h3>
<div class="introd"> <div class="introd">
<h4 data-i18n="update_label_intro">Overview about all available Hyperion versions. On top you could update or downgrade your version of Hyperion whenever you want. Sorted from newest to oldest</h4> <h4 data-i18n="update_label_intro">Overview about all available Hyperion versions. On top you could update or downgrade your version of Hyperion whenever you want. Sorted from newest to oldest</h4>
<h4> At the moment the respective install button is disabled. Development is still ongoing here. </h4> <h4> At the moment the install buttons are not working. Development is still ongoing here. </h4>
<hr /> <hr />
</div> </div>
<h4 id="update_currver"></h4> <h4 id="update_currver"></h4>
<hr> <hr>
<div class="col-lg-12" id="versionlist"> <div class="col-lg-12" id="versionlist">
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script> <script>
$(document).ready(function (error) { $(document).ready( function(error) {
performTranslation(); performTranslation();
getReleases(function (callback) { getReleases(function (callback){
if (callback) { if(callback)
var matches = 0; {
for (var key in window.gitHubVersionList) { for (var key in window.gitHubVersionList)
{
if (window.gitHubVersionList[key].name == null || if(window.gitHubVersionList[key].name == null || (window.serverConfig.general.watchedVersionBranch == "Stable" && window.gitHubVersionList[key].prerelease == true))
window.gitHubVersionList[key].tag_name.includes('rc') || {
(window.serverConfig.general.watchedVersionBranch == "Stable" && continue;
(window.gitHubVersionList[key].tag_name.includes('beta') || }
window.gitHubVersionList[key].tag_name.includes('alpha')
)
) ||
(window.serverConfig.general.watchedVersionBranch == "Beta"
&& window.gitHubVersionList[key].tag_name.includes('Alpha')
)) {
continue;
}
var danger; $('#versionlist').append('<div class="col-lg-6"><div class="panel panel-'+ (window.gitHubVersionList[key].prerelease == true ? "danger" : "default") +'"><div class="panel-heading"><i class="fa fa-television fa-fw"></i>Hyperion V'+window.gitHubVersionList[key].tag_name+'</div><div class="panel-body"><p><span style="font-weight:bold;">'+$.i18n('update_label_type') + '</span> ' + (window.gitHubVersionList[key].prerelease == true ? "Beta" : "Stable") + '</p><p><span style="font-weight:bold;">'+$.i18n('update_label_description')+'</span> '+window.gitHubVersionList[key].body+'</p><hr><a class="btn btn-primary" href="'+ window.gitHubVersionList[key].html_url +'" target="_blank"><i class="fa fa-list fa-fw"></i><span style="font-weight:bold;">'+$.i18n('update_button_changelog')+'</span></a><button type="button" class="btn btn-warning pull-right" ' + (window.gitHubVersionList[key].tag_name == window.currentVersion ? "disabled":"") + '><i class="fa fa-download fa-fw"></i>'+$.i18n('update_button_install')+'</button></div></div></div>');
var type; }
$('#update_currver').append($.i18n('update_versreminder', currentVersion));
if (window.gitHubVersionList[key].tag_name.includes('beta')) { }
danger = 'warning'; else
type = 'Beta'; {
} $('#versionlist').append($.i18n('update_error_getting_versions'));
else if (window.gitHubVersionList[key].tag_name.includes('alpha')) { }
danger = 'danger'; });
type = 'Alpha'; removeOverlay();
} });
else {
danger = 'default';
type = 'Stable';
}
matches++;
$('#versionlist').append('<div class="col-lg-6"><div class="panel panel-' + danger + '"><div class="panel-heading"><i class="fa fa-television fa-fw"></i>Hyperion V' + window.gitHubVersionList[key].tag_name + '</div><div class="panel-body"><p><span style="font-weight:bold;">' + $.i18n('update_label_type') + '</span> ' + type + '</p><p><span id="desc" style="font-weight:bold;">' + $.i18n('update_label_description') + '</span> ' + DOMPurify.sanitize(marked.parse(window.gitHubVersionList[key].body)) + '</p><hr><a class="btn btn-primary" href="' + window.gitHubVersionList[key].html_url + '" target="_blank"><i class="fa fa-list fa-fw"></i><span style="font-weight:bold;">' + $.i18n('update_button_changelog') + '</span></a><button type="button" class="btn btn-warning pull-right" ' + (window.gitHubVersionList[key].tag_name == window.currentVersion ? "disabled" : "disabled") + '><i class="fa fa-download fa-fw"></i>' + $.i18n('update_button_install') + '</button></div></div></div>');
}
$('#update_currver').append($.i18n('update_versreminder', currentVersion));
if (matches == 0)
$('#versionlist').append($.i18n('update_no_updates_for_branch'));
}
else {
$('#versionlist').append($.i18n('update_error_getting_versions'));
}
});
removeOverlay();
});
</script> </script>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,28 +0,0 @@
/*! ========================================================================
* Bootstrap Toggle: bootstrap-toggle.css v2.2.0
* http://www.bootstraptoggle.com
* ========================================================================
* Copyright 2014 Min Hur, The New York Times Company
* Licensed under MIT
* ======================================================================== */
.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px}
.toggle{position:relative;overflow:hidden}
.toggle input[type=checkbox]{display:none}
.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none}
.toggle.off .toggle-group{left:-100%}
.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}
.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}
.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px}
.toggle.btn{min-width:59px;min-height:34px}
.toggle-on.btn{padding-right:24px}
.toggle-off.btn{padding-left:24px}
.toggle.btn-lg{min-width:79px;min-height:45px}
.toggle-on.btn-lg{padding-right:31px}
.toggle-off.btn-lg{padding-left:31px}
.toggle-handle.btn-lg{width:40px}
.toggle.btn-sm{min-width:50px;min-height:30px}
.toggle-on.btn-sm{padding-right:20px}
.toggle-off.btn-sm{padding-left:20px}
.toggle.btn-xs{min-width:35px;min-height:22px}
.toggle-on.btn-xs{padding-right:12px}
.toggle-off.btn-xs{padding-left:12px}

View File

@ -1,467 +0,0 @@
/*General Elements*/
body {
background-color: #212121;
color: #DDDDDD;
}
#page-wrapper {
background-color: #333;
border-left: none;
}
.navbar-default {
background-color: #212121;
border-color: #212121;
}
.navbar-default li a {
color: #C6C6C6 !important;
}
.panel-body {
background-color: #424242;
}
hr {
border-top: 1px solid #DDDDDD;
}
a {
color: #337ab7;
}
a:hover {
color: #5db6ff;
}
a:focus {
color: #5db6ff;
}
a:active {
color: #5db6ff
}
p {
color: #DDDDDD;
}
h4 {
color: #DDDDDD;
}
/*Buttons*/
.btn-transparent:hover {
color: #5db6ff;
}
.btn-transparent:focus{
color: #5db6ff;
}
.btn-default {
color: #DDDDDD;
background-color: #212121;
border-color: #424242;
}
.btn-default:hover {
color: #DDDDDD;
background-color: #333;
border-color: #616161;
}
.btn-default:focus{
color: #DDDDDD;
background-color: #333;
border-color: #616161;
}
.btn-primary {
background-color: #155fa0;
border-color: #5db6ff;
}
.btn-primary:hover{
background-color: #337ab7;
border-color: #82B1FF;
}
.btn-primary:focus{
background-color: #337ab7;
border-color: #82B1FF;
}
.btn-primary[disabled]:hover {
background-color: #337ab7;
border-color: #82B1FF;
}
.btn-warning {
background-color: #bc7410;
border-color: #f0ad4e;
}
.btn-warning:hover {
background-color: #ec971f;
border-color: #f3bd72;
}
.btn-warning:focus {
background-color: #ec971f;
border-color: #f3bd72;
}
.btn-danger {
background-color: #861c30;
border-color: #d43f3a;
}
.btn-danger:hover {
background-color: #b4102d;
border-color: #F44336;
}
.btn-danger:focus {
background-color: #b4102d;
border-color: #F44336;
}
.btn-success {
background-color: darkgreen;
border-color: #4cae4c;
}
.btn-success:hover {
background-color: green;
border-color: #a1eea1;
}
.btn-wizard {
background-color: #602060;
border-color: #993399;
}
.btn-wizard:hover {
background-color: #993399;
border-color: #cc66cc;
}
.btn-wizard:focus {
background-color: #993399;
border-color: #cc66cc;
}
/*Tables*/
tr:hover td {
background-color: #2e6da4;
}
/*Navigation Sidebar*/
.sidebar ul li {
border-bottom: 1px solid #424242;
}
.sidebar ul li a.active{
background-color: #424242;
}
.sidebar ul li a:hover{
background-color: #424242;
}
.sidebar ul li a:focus{
background-color: #424242;
}
/*Navigation Topbar*/
.navbar-top-links li a:hover {
background-color: #424242;
}
.navbar-top-links li a:focus {
background-color: #424242;
}
.nav .open>a, .nav .open>a:hover, .nav .open>a:focus {
background-color: #424242;
}
.dropdown-menu {
background-color: #212121;
border-color: #424242;
}
.dropdown-menu>li>a {
color: #DDDDDD;
}
/*Panels*/
.panel-default {
background-color: #424242!important;
border-color: #424242 !important;
box-shadow: 0px 2px 10px 0px rgba(18, 18, 18, 0.4);
}
.panel-primary {
background-color: #424242!important;
border-color: #424242 !important;
box-shadow: 0px 2px 10px 0px rgba(18, 18, 18, 0.4);
}
.panel-primary>.panel-heading {
background-color: #424242!important;
border-color: #424242 !important;
}
.panel-primary>.panel-heading+.panel-collapse>.panel-body {
border-top-color: #616161;
}
.panel-default>.panel-heading{
background-color: #424242 !important;
border-color: #212121 !important;
color: #DDDDDD;
}
.panel-default>.panel-system{
background-color: #0E83E7 !important;
border-color: #212121 !important;
color: #fff ;
}
.panel-default>.panel-instance{
background-color:#E18300 !important;
border-color: #212121 !important;
color: #DDDDDD;
}
.panel-footer {
background-color: #424242 !important;
border-top: 1px solid #616161 !important;
}
/*JSON Editor Inputs*/
[id^=editor_container] .well {
background-color: #424242 !important;
}
/* Froms */
.form-control {
border-color: #616161;
background-color: #212121;
color: #DDDDDD !important;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none;
}
select.form-control {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4.95 10'%3E%3Cpath fill='%23212121' d='M0 0h4.95v10H0z'/%3E%3Cpath fill='%23ddd' d='M1.41 4.67l1.07-1.49 1.06 1.49H1.41zm2.13.66L2.48 6.82 1.41 5.33h2.13z'/%3E%3C/svg%3E") !important;
background-repeat: no-repeat;
background-position: right 5px center;
}
.input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child>.btn, .input-group-btn:last-child>.btn-group>.btn, .input-group-btn:last-child>.dropdown-toggle, .input-group-btn:first-child>.btn:not(:first-child), .input-group-btn:first-child>.btn-group:not(:first-child)>.btn {
border-color: #616161;
background-color: #333;
color: #DDDDDD;
}
.input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child>.btn, .input-group-btn:first-child>.btn-group>.btn, .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child>.btn-group:not(:last-child)>.btn {
border-color: #616161;
background-color: #212121;
color: #DDDDDD;
}
.keystone_correction_corners {
border:1px solid white;
}
.checkbox label::before {
border-color: #616161;
background-color: #212121;
color: #DDDDDD;
}
.checkbox label::after
{
left: 1px;
color: #DDDDDD;
}
.checklist li::before {
color: #DDDDDD;
}
.checkbox input[type="checkbox"]:checked + label::before, .checkbox-success input[type="checkbox"]:checked + label::before, .checkbox-success input[type="radio"]:checked + label::before {
border-color: #616161;
background-color: #212121;
}
.checkbox input[type="checkbox"]:checked + label::after, .checkbox-success input[type="checkbox"]:checked + label::after, .checkbox-success input[type="radio"]:checked + label::after {
color: #DDDDDD;
}
.radio__field:checked ~ .radio__icon::before {
background: #fff;
}
.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) {
border-bottom-right-radius: 4px;
border-top-right-radius: 4px;
}
.input-group-addon {
background-color: #333;
border: 1px solid #616161;
border-left: none;
}
/* Tabs Buttons */
.nav-tabs {
border-bottom: 1px solid #616161;
}
.nav-tabs>li.active>a, .nav-tabs>li.active>a:hover, .nav-tabs>li.active>a:focus {
color: #DDDDDD;
border: 1px solid #424242;
border-bottom-color: transparent;
border-top-color: #5db6ff;
background-color: #333;
}
.nav-tabs>li>a {
color: #999999;
border: 1px solid #424242;
border-bottom-color: #616161;
background-color: #424242;
}
.nav-tabs>li>a:hover, .nav-tabs>li>a:focus {
color: #DDDDDD;
border: 1px solid #424242;
border-bottom-color: transparent;
background-color: #333;
}
/*Modals*/
.modal-content {
background-color: #212121;
}
.modal-header {
border-bottom: 1px solid #616161;
}
button.close {
color: #DDDDDD;
}
button.close:hover {
color: #ffffff;
}
/*Bootstrap Notify*/
[data-notify="container"] {
background-color: #212121;
}
.support-container:hover .fa {
background-color: #2e6da4;
}
/*Burger Button*/
.navbar-default .navbar-toggle {
border-color: #2e6da4;
background-color: #1e1e1e;
}
.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
border-color: #2e6da4;
background-color: #424242;
}
.navbar-top-links .dropdown-menu li a:hover{
background-color: #424242;
color: #5db6ff;
}
/*navbar fixes*/
.navbar-top-links {
display: table;
}
.navbar-top-links>li {
display: table-cell;
}
.navbar-top-links li a {
text-align: center;
}
.navbar-top-links li ul a {
text-align: left;
}
.navbar-default .navbar-toggle > .icon-bar {
background-color: #DDDDDD !important;
}
.navbar-top-links .dropdown-alerts {
position: fixed;
top: auto;
margin: 0 auto;
}
/* additinal changes + fixes */
.component-on,
.component-on ~ span {
color: greenyellow;
}
.support-container {
color: #DDDDDD;
}
.bs-callout {
border-top: none;
border-right: none;
border-bottom: none;
background-color: #424242;
}
.page-header {
border-bottom: 1px solid #616161;
}
#page-content .bs-callout {
background-color: #333;
}
.bs-callout-success {
border-left-color: #67FF01;
}
.bs-callout-success h4 {
color: greenyellow;
}
tr:hover td {
background-color: #616161;
}
#dash_statush span[style="color:green"] {
color: greenyellow !important;
}
#dash_statush span[style="color:red"] {
color:#861c30 !important;
}
pre {
background-color: #424242 !important;
border-color: #424242 !important;
box-shadow: 0px 2px 10px 0px rgba(18, 18, 18, 0.4);
color: #DDD;
}

View File

@ -1,244 +0,0 @@
/*General Elements*/
body {
background-color: #080808;
color: #D3D3D3;
}
#page-wrapper {
background-color:#080808;
}
.navbar-default {
background-color:#080808;
}
.panel-body {
background-color: #121212;
}
hr {
border-top: 1px solid #D3D3D3;
}
a {
color: #005d5c;
}
a:hover {
color: #018786;
}
a:focus {
color: #018786;
}
a:active {
color: #018786
}
p {
color: #D3D3D3;
}
h4 {
color: #D3D3D3;
}
/*Buttons*/
.btn-primary {
background-color: #005d5c;
border-color: #D3D3D3;
}
.btn-primary:hover{
background-color: #018786;
border-color: #D3D3D3;
}
.btn-primary:focus{
background-color: #018786;
border-color: #D3D3D3;
}
.btn-primary[disabled]:hover {
background-color: #018786;
border-color: #D3D3D3;
}
.btn-warning {
background-color: #ec971f;
border-color: #D3D3D3;
}
.btn-warning:hover {
background-color: #f0ad4e;
border-color: #D3D3D3;
}
.btn-warning:focus {
background-color: #f0ad4e;
border-color: #D3D3D3;
}
.btn-danger {
background-color: #ca2f4bd4;
border-color: #D3D3D3;
}
.btn-danger:hover {
background-color: #cf6679;
border-color: #D3D3D3;
}
.btn-danger:focus {
background-color: #cf6679;
border-color: #D3D3D3;
}
/*Tables*/
tr:hover td {
background-color: #018786;
}
/*Navigation Sidebar*/
.sidebar ul li {
background-color: #080808;
}
.sidebar ul li a.active{
background-color: #121212;
}
.sidebar ul li a:hover{
background-color: #121212;
}
.sidebar ul li a:focus{
background-color: #121212;
}
/*Navigation Topbar*/
.navbar-top-links li a:hover {
background-color: #121212;
}
.navbar-top-links li a:focus {
background-color: #121212;
}
.nav .open>a, .nav .open>a:hover, .nav .open>a:focus {
background-color: #121212;
}
.dropdown-menu {
background-color: #080808;
border-color: #D3D3D3;
}
.dropdown-menu>li>a {
color: #018786;
}
/*Panels*/
.panel-default {
background-color:#121212 !important;
border-color:#D3D3D3 !important;
}
.panel-primary {
background-color:#121212 !important;
border-color:#D3D3D3 !important;
}
.panel-primary>.panel-heading {
background-color:#121212 !important;
border-color:#D3D3D3 !important;
}
.panel-primary>.panel-heading+.panel-collapse>.panel-body {
border-top-color: #D3D3D3;
}
.panel-default>.panel-heading{
background-color:#121212 !important;
border-color:#D3D3D3 !important;
color: #D3D3D3;
}
.panel-footer {
background-color:#121212 !important;
}
/*JSON Editor Inputs*/
[id^=editor_container] .well {
background-color: #121212 !important;
}
.input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child>.btn, .input-group-btn:last-child>.btn-group>.btn, .input-group-btn:last-child>.dropdown-toggle, .input-group-btn:first-child>.btn:not(:first-child), .input-group-btn:first-child>.btn-group:not(:first-child)>.btn {
border-color: #D3D3D3;
}
.input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child>.btn, .input-group-btn:first-child>.btn-group>.btn, .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child>.btn-group:not(:last-child)>.btn {
border-color: #D3D3D3;
}
.introd h4 {
border-left: 5px solid #03dac6;
}
.bs-callout-primary h4 {
color: #03dac6;
}
.bs-callout-primary {
border-left-color: #03dac6;
}
/* Tabs Buttons */
.nav-tabs>li.active>a, .nav-tabs>li.active>a:hover, .nav-tabs>li.active>a:focus {
color: #D3D3D3;
background-color: #018786;
}
.nav-tabs>li>a, .nav-tabs>li>a:hover, .nav-tabs>li>a:focus {
color: #D3D3D3;
background-color: #005d5c;
}
/*Modals*/
.modal-content {
background-color: #121212;
}
button.close {
color: #D3D3D3;
}
button.close:hover {
color: #ffffff;
}
/*Bootstrap Notify*/
[data-notify="container"] {
background-color: #121212;
}
.support-container:hover .fa {
background-color: #005d5c;
}
.navbar-top-links .dropdown-menu li a:hover{
background-color: #121212;
color: #03dac6;
}
/*Burger Button*/
.navbar-default .navbar-toggle {
border-color: #005d5c;
background-color: #080808;
}
.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
border-color: #005d5c;
background-color: #080808;
}

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
.gj-draggable{cursor:move}.gj-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none;z-index:1203}.gj-dialog-bootstrap [data-role=title],.gj-dialog-bootstrap4 [data-role=title]{display:inline}.gj-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.gj-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.gj-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.gj-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.gj-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.gj-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.gj-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.gj-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.gj-dialog-footer{position:absolute;bottom:0;width:100%;margin-top:0}.gj-dialog-scrollable [data-role=body]{overflow-x:hidden;overflow-y:scroll}.gj-dialog-bootstrap,.gj-dialog-bootstrap4,.gj-dialog-md{overflow:hidden;z-index:1202}.gj-dialog-bootstrap [data-role=close]{line-height:1.42857143}.gj-dialog-bootstrap4 [data-role=close]{line-height:1.5}.gj-dialog-md{background-color:#FFF;border:none;box-shadow:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12);box-sizing:border-box;position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.gj-dialog-md-header{padding:24px 24px 0;font-family:Roboto,Helvetica,Arial,sans-serif}.gj-dialog-md-title{margin:0;font-weight:400;display:inline;line-height:28px;font-size:20px}.gj-dialog-md-close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0;float:right;line-height:28px;font-size:28px}.gj-dialog-md-body{padding:20px 24px 24px;color:rgba(0,0,0,.54);font-family:Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:20px}.gj-dialog-md-footer{padding:8px 8px 8px 24px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;box-sizing:border-box}.gj-dialog-md-footer>:first-child{margin-right:0}.gj-dialog-md-footer>*{margin-right:8px;height:36px}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,64 @@
/*
* metismenu - v1.1.3
* Easy menu jQuery plugin for Twitter Bootstrap 3
* https://github.com/onokumus/metisMenu
*
* Made by Osman Nuri Okumus
* Under MIT License
*/
.arrow {
float: right;
line-height: 1.42857;
}
.glyphicon.arrow:before {
content: "\e079";
}
.active > a > .glyphicon.arrow:before {
content: "\e114";
}
/*
* Require Font-Awesome
* http://fortawesome.github.io/Font-Awesome/
*/
.fa.arrow:before {
content: "\f104";
}
.active > a > .fa.arrow:before {
content: "\f107";
}
.plus-times {
float: right;
}
.fa.plus-times:before {
content: "\f067";
}
.active > a > .fa.plus-times {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
.plus-minus {
float: right;
}
.fa.plus-minus:before {
content: "\f067";
}
.active > a > .fa.plus-minus:before {
content: "\f068";
}

View File

@ -1,7 +0,0 @@
/*!
* metismenu https://github.com/onokumus/metismenu#readme
* A collapsible jQuery menu plugin
* @version 3.0.6
* @author Osman Nuri Okumus <onokumus@gmail.com> (https://github.com/onokumus)
* @license: MIT
*/.metismenu .arrow{float:right;line-height:1.42857}*[dir=rtl] .metismenu .arrow{float:left}.metismenu .glyphicon.arrow:before{content:""}.metismenu .mm-active>a>.glyphicon.arrow:before{content:""}.metismenu .fa.arrow:before{content:""}.metismenu .mm-active>a>.fa.arrow:before{content:""}.metismenu .ion.arrow:before{content:""}.metismenu .mm-active>a>.ion.arrow:before{content:""}.metismenu .plus-times{float:right}*[dir=rtl] .metismenu .plus-times{float:left}.metismenu .fa.plus-times:before{content:""}.metismenu .mm-active>a>.fa.plus-times{transform:rotate(45deg)}.metismenu .plus-minus{float:right}*[dir=rtl] .metismenu .plus-minus{float:left}.metismenu .fa.plus-minus:before{content:""}.metismenu .mm-active>a>.fa.plus-minus:before{content:""}.metismenu .mm-collapse:not(.mm-show){display:none}.metismenu .mm-collapsing{position:relative;height:0;overflow:hidden;transition-timing-function:ease;transition-duration:.35s;transition-property:height,visibility}.metismenu .has-arrow{position:relative}.metismenu .has-arrow::after{position:absolute;content:"";width:.5em;height:.5em;border-width:1px 0 0 1px;border-style:solid;border-color:initial;right:1em;transform:rotate(-45deg) translate(0, -50%);transform-origin:top;top:50%;transition:all .3s ease-out}*[dir=rtl] .metismenu .has-arrow::after{right:auto;left:1em;transform:rotate(135deg) translate(0, -50%)}.metismenu .mm-active>.has-arrow::after,.metismenu .has-arrow[aria-expanded=true]::after{transform:rotate(-135deg) translate(0, -50%)}*[dir=rtl] .metismenu .mm-active>.has-arrow::after,*[dir=rtl] .metismenu .has-arrow[aria-expanded=true]::after{transform:rotate(225deg) translate(0, -50%)}/*# sourceMappingURL=metisMenu.min.css.map */

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 377 KiB

After

Width:  |  Height:  |  Size: 382 KiB

View File

@ -1,93 +0,0 @@
{
"conf_effect_path_intro": "Заредете ефекти от дефинираните пътища. Освен това можете да деактивирате отделни ефекти по име, за да ги скриете от всички списъци с ефекти.",
"conf_general_impexp_expbtn": "Експортиране",
"conf_general_impexp_impbtn": "Импортиране",
"conf_general_impexp_l1": "Импортирайте конфигурация, като изберете конфигурационен файл по-долу и щракнете върху „Импортиране“.",
"conf_general_impexp_l2": "Експортирайте конфигурация, като щракнете върху „Експортиране“. Вашият браузър започва изтегляне.",
"conf_general_impexp_title": "Импортиране/Експортиране на Конфигурация",
"conf_general_intro": "Основни настройки около Hyperion и WebUI, които не се вписват в друга категория.",
"conf_general_label_title": "Общи настройки",
"conf_helptable_expl": "Обяснение",
"conf_helptable_option": "Опции",
"conf_leds_layout_checkp1": "Черният светодиод е вашият първи светодиод, първият светодиод е точката, в която въвеждате вашия сигнал с данни.",
"conf_leds_layout_checkp2": "Оформлението винаги е изгледът отпред на вашия телевизор, никога отзад.",
"conf_leds_layout_checkp3": "Уверете се, че посоката е правилна. Сивите светодиоди показват светодиод номер 2 и 3 за визуализиране на посоката на данните.",
"conf_leds_optgroup_network": "Мрежа",
"dashboard_alert_message_confedit": "Вашата конфигурация на Hyperion е променена. За да го приложите, рестартирайте Hyperion.",
"dashboard_alert_message_confedit_t": "Конфигурацията е променена",
"dashboard_alert_message_confsave_success": "Вашата конфигурация на Hyperion е запазена успешно. Вашите промени вече са активни.",
"dashboard_alert_message_confsave_success_t": "Конфигурацията е запаметена",
"dashboard_alert_message_disabled": "Тази инстанция в момента е деактивирана! За да я използвате отново, активирайте я на таблото за управление.",
"dashboard_alert_message_disabled_t": "ЛЕД хардуерна инстанция е деактивирана",
"dashboard_componentbox_label_comp": "Компонент",
"dashboard_componentbox_label_status": "Статус",
"dashboard_componentbox_label_title": "Статус на компонентите",
"dashboard_infobox_label_currenthyp": "Вашата версия на Hyperion:",
"dashboard_infobox_label_instance": "Инстанция:",
"dashboard_infobox_label_latesthyp": "Последната версия на Hyperion:",
"dashboard_infobox_label_platform": "Платформа:",
"dashboard_infobox_label_ports": "Портове",
"dashboard_infobox_label_statush": "Hyperion статус:",
"dashboard_infobox_label_title": "Информация",
"dashboard_infobox_message_updatesuccess": "Вие използвате най-новата версия на Hyperion.",
"dashboard_infobox_message_updatewarning": "Нова версия на Hyperion е налична! ($1)",
"dashboard_newsbox_label_title": "Hyperion-Блог",
"dashboard_newsbox_noconn": "Не можете да се свържете с Hyperion Server, за да извлечете най-новите публикации, вашата интернет връзка работи ли?",
"dashboard_newsbox_readmore": "Прочети повече",
"dashboard_newsbox_visitblog": "Посети Hyperion-Блог",
"edt_conf_webc_port_title": "HTTP порт",
"general_access_default": "По подразбиране",
"general_btn_back": "Назад",
"general_btn_cancel": "Откажи",
"general_btn_continue": "Продължи",
"general_btn_next": "Следващ",
"general_btn_off": "Изключване",
"general_btn_ok": "ОК",
"general_btn_on": "Включване",
"general_btn_restarthyperion": "Рестартирай Hyperion",
"general_btn_save": "Запази",
"general_btn_saveandreload": "Запази и презареди",
"general_btn_yes": "Да",
"general_button_savesettings": "Запази настройките",
"general_col_blue": "синьо",
"general_col_green": "зелено",
"general_col_red": "червено",
"general_comp_LEDDEVICE": "ЛЕД Изход",
"general_country_de": "Германия",
"general_country_es": "Испания",
"general_country_fr": "Франция",
"general_country_it": "Италия",
"general_country_nl": "Холандия",
"general_country_uk": "Англия",
"general_country_us": "САЩ",
"general_speech_cs": "Чешки",
"general_speech_de": "Немски",
"general_speech_en": "Английски",
"general_speech_es": "Испански",
"general_speech_he": "Иврит",
"general_speech_id": "Индонезийски",
"general_speech_it": "Италиански",
"general_speech_uk": "Украински",
"general_webui_title": "Hyperion - Уеб Конфигурация",
"main_ledsim_btn_togglelednumber": "Брой ЛЕД",
"main_ledsim_btn_toggleleds": "Показване на светодиоди",
"main_ledsim_btn_togglelivevideo": "Видео на живо",
"main_ledsim_text": "Визуализация на живо на LED цветове и по избор текущия видео поток на вашето устройство за прихващане.",
"main_ledsim_title": "ЛЕД Визуализация",
"main_menu_about_token": "Относно Hyperion",
"main_menu_colors_conf_token": "Обработка на изображение",
"main_menu_configuration_token": "ЛЕД Инстанции",
"main_menu_dashboard_token": "Табло за управление",
"main_menu_effect_conf_token": "Ефекти",
"main_menu_effectsconfigurator_token": "Конфигуратор на ефекти",
"main_menu_general_conf_token": "Общи",
"main_menu_input_selection_token": "Ибор на вход",
"main_menu_leds_conf_token": "ЛЕД Изход",
"main_menu_logging_token": "Дневник",
"main_menu_network_conf_token": "Мрежови услуги",
"main_menu_remotecontrol_token": "Дистанционно управление",
"main_menu_support_token": "Поддръжка",
"main_menu_system_token": "Система",
"main_menu_update_token": "Актуализация",
"main_menu_webconfig_token": "Уеб конфигурация"
}

View File

@ -1,61 +0,0 @@
{
"dashboard_alert_message_confedit": "La teva configuració d'Hyperion s'ha modificat. Per aplicar-la, reinicia Hyperion.",
"dashboard_alert_message_confedit_t": "Configuració modificada",
"dashboard_alert_message_confsave_success_t": "Configuració guardada",
"dashboard_alert_message_disabled_t": "Instància de maquinari LED deshabilitada",
"dashboard_componentbox_label_comp": "Component",
"dashboard_componentbox_label_status": "Estat",
"dashboard_componentbox_label_title": "Estat del component",
"dashboard_infobox_label_currenthyp": "La teva versió d'Hyperion:",
"dashboard_infobox_label_disableh": "Desactivar instància: 1 $",
"dashboard_infobox_label_enableh": "Activar instància: 1 $",
"dashboard_infobox_label_instance": "Instànica:",
"dashboard_infobox_label_latesthyp": "La darrera versió d'Hyperion:",
"dashboard_infobox_label_platform": "Plataforma:",
"dashboard_infobox_label_ports": "Ports:",
"dashboard_infobox_label_smartacc": "Accés intel·ligent",
"dashboard_infobox_label_statush": "Estat d'Hyperion:",
"dashboard_infobox_label_title": "Informació",
"dashboard_infobox_message_updatesuccess": "Estàs executant la darrera versió d'Hyperion.",
"dashboard_infobox_message_updatewarning": "Hi ha una nova versió d'Hyperion disponible! (1 $)",
"dashboard_label_intro": "El panell de control et dona una vista ràpida de l'estat d'Hyperion",
"dashboard_newsbox_label_title": "Bloc d'Hyperion",
"dashboard_newsbox_readmore": "Llegeix més",
"dashboard_newsbox_visitblog": "Visita el bloc d'Hyperion",
"general_access_advanced": "Avançat",
"general_access_default": "Per defecte",
"general_access_expert": "Expert",
"general_btn_back": "Tornar",
"general_btn_cancel": "Cancel.la",
"general_btn_continue": "Continuar",
"general_btn_next": "Següent",
"general_btn_off": "Off",
"general_btn_ok": "OK",
"general_btn_on": "On",
"general_btn_restarthyperion": "Reinicia Hyperion",
"general_btn_save": "Guarda",
"general_btn_saveandreload": "Guarda i recarrega",
"general_btn_yes": "Sí",
"general_button_savesettings": "Guarda la configuració",
"general_col_blue": "blau",
"general_col_green": "verd",
"general_col_red": "vermell",
"general_comp_BLACKBORDER": "Bandes fosques",
"general_comp_GRABBER": "Captura Pantalla",
"general_comp_LEDDEVICE": "Sortida LED",
"general_comp_SMOOTHING": "Suavitzat",
"general_comp_V4L": "Captura l'entrada USB",
"general_country_de": "Alemany",
"general_country_es": "Espanya",
"general_country_fr": "França",
"general_country_it": "Itàlia",
"general_country_nl": "Països Baixos",
"general_country_uk": "Regne Unit",
"general_country_us": "Estats Units",
"general_speech_cs": "Txec",
"general_speech_de": "Alemany",
"general_speech_en": "Anglès",
"general_speech_es": "Espanyol",
"general_speech_it": "Italià",
"general_webui_title": "Hyperion - Configuració Web"
}

File diff suppressed because it is too large Load Diff

View File

@ -1,49 +0,0 @@
{
"dashboard_infobox_label_currenthyp": "Din Hyperion version:",
"dashboard_infobox_label_latesthyp": "Seneste Hyperion version:",
"dashboard_infobox_label_platform": "Platform:",
"dashboard_infobox_label_title": "Information",
"dashboard_label_intro": "Dashboardet giver dig en hurtig oversigt over status af Hyperion",
"general_access_advanced": "Avanceret",
"general_access_default": "Standart",
"general_access_expert": "Ekspert",
"general_btn_back": "Tilbage",
"general_btn_cancel": "Annullere",
"general_btn_continue": "Fortsæt",
"general_btn_iswitch": "Skift",
"general_btn_next": "Næste",
"general_btn_off": "Fra",
"general_btn_ok": "OK",
"general_btn_on": "Til",
"general_btn_restarthyperion": "Genstart Hyperion",
"general_btn_save": "Gem",
"general_btn_saveandreload": "Gem og genindlæs",
"general_btn_yes": "Ja",
"general_button_savesettings": "Gem indstillinger",
"general_col_blue": "blå",
"general_col_green": "grøn",
"general_col_red": "rød",
"general_comp_BLACKBORDER": "Blackbar Detektion",
"general_comp_BOBLIGHTSERVER": "Boblight Server",
"general_comp_FLATBUFSERVER": "Flatbuffers Server",
"general_comp_FORWARDER": "Forwarder",
"general_comp_GRABBER": "Optag skærm",
"general_comp_LEDDEVICE": "LED output",
"general_comp_PROTOSERVER": "Protocol Buffers Server",
"general_comp_SMOOTHING": "Udjævning",
"general_comp_V4L": "Optag USB-input",
"general_country_de": "Tyskland",
"general_country_es": "Spanien",
"general_country_fr": "Frankrig",
"general_country_it": "Italien",
"general_country_nl": "Holland",
"general_country_uk": "England",
"general_country_us": "USA",
"general_speech_cs": "Tjekkisk",
"general_speech_de": "Tysk",
"general_speech_en": "Engelsk",
"general_speech_es": "Spansk",
"general_speech_it": "Italiensk",
"general_webui_title": "Hyperion - Webkonfiguration",
"general_wiki_moreto": "Mere information om \"$1\" på vores Wiki"
}

File diff suppressed because it is too large Load Diff

View File

@ -1,725 +0,0 @@
{
"InfoDialog_access_text": "Ανάλογα με το επίπεδο ρυθμίσεων, μπορείτε να προσαρμόσετε περισσότερες επιλογές ή να αποκτήσετε πρόσβαση σε περισσότερες δυνατότητες. Συνιστάται το επίπεδο \"Προεπιλογή\".",
"InfoDialog_access_title": "Επίπεδα Ρυθμίσεων",
"InfoDialog_changePassword_success": "Ο κωδικός πρόσβασης αποθηκεύτηκε με επιτυχία!",
"InfoDialog_changePassword_title": "Αλλαγή κωδικού",
"InfoDialog_iswitch_text": "Εάν εκτελείτε το Hyperion περισσότερες από μία φορές στο τοπικό σας δίκτυο, μπορείτε να κάνετε εναλλαγή μεταξύ των διαμορφώσεων ιστού. Επιλέξτε την παρουσία Hyperion παρακάτω και αλλάξτε!",
"InfoDialog_iswitch_title": "Επιλογέας Hyperion",
"InfoDialog_nostorage_text": "Το πρόγραμμα περιήγησής σας δεν υποστηρίζει τοπική αποθήκευση. Δεν μπορείτε να αποθηκεύσετε μια συγκεκριμένη ρύθμιση γλώσσας (επιστροφή στην «αυτόματη ανίχνευση») και επίπεδο πρόσβασης (επιστροφή στην «προεπιλογή»). Μερικοί μάγοι μπορεί να είναι κρυφοί. Θα μπορούσατε ακόμα να χρησιμοποιήσετε τη διεπαφή ιστού χωρίς περαιτέρω προβλήματα",
"InfoDialog_nowrite_foottext": "Το WebUI θα ξεκλειδωθεί αυτόματα μόλις λύσετε το πρόβλημα!",
"InfoDialog_nowrite_text": "Το Hyperion δεν μπορεί να γράψει στο τρέχον φορτωμένο αρχείο διαμόρφωσης. Επιδιορθώστε τα δικαιώματα του αρχείου για να συνεχίσετε.",
"InfoDialog_nowrite_title": "Σφάλμα άδειας εγγραφής!",
"about_3rd_party_licenses": "Άδεια τρίτου μέρους",
"about_build": "Κατασκευή",
"about_builddate": "Ημερομηνία κατασκευής",
"about_contribute": "Αναπτύξτε το Hyperion περαιτέρω με εμάς!",
"about_credits": "Πιστώσεις σε όλους αυτούς τους προγραμματιστές!",
"about_resources": "$1 βιβλιοθήκες",
"about_translations": "Μεταφράσεις",
"about_version": "Έκδοση",
"conf_colors_blackborder_intro": "Παραλείψτε τις μαύρες μπάρες όπου κι αν βρίσκονται. Κάθε λειτουργία χρησιμοποιεί έναν άλλο αλγόριθμο ανίχνευσης που είναι συντονισμένος για ειδικές καταστάσεις. Αυξήστε το όριο αν δεν λειτουργεί για εσάς.",
"conf_colors_color_intro": "Δημιουργήστε ένα ή περισσότερα προφίλ βαθμονόμησης, προσαρμόστε κάθε χρώμα, φωτεινότητα, γραμμικοποίηση και άλλα.",
"conf_colors_smoothing_intro": "Η εξομάλυνση ομαλοποιεί τις αλλαγές σε χρώμα/φωτεινότητα και μειώνει τις ενοχλητικές αποσπάσεις.",
"conf_effect_bgeff_intro": "Καθορίστε ένα εφέ/χρώμα παρασκηνίου, για να εμφανίζεται όταν το Hyperion είναι σε \"αδρανοποιημένο\". Εκκινείται πάντα με προτεραιότητα στο κανάλι 255.",
"conf_effect_fgeff_intro": "Καθορίστε ένα εφέ εκκίνησης ή ένα χρώμα, το οποίο εμφανίζεται κατά την εκκίνηση του Hyperion για την καθορισμένη διάρκεια.",
"conf_effect_path_intro": "Φόρτωση εφέ από τις καθορισμένες διαδρομές. Επιπλέον, μπορείτε να απενεργοποιήσετε μεμονωμένα εφέ ονομαστικά για να τα αποκρύψετε από όλες τις λίστες εφέ.",
"conf_general_impexp_expbtn": "Εξαγωγή",
"conf_general_impexp_impbtn": "Εισαγωγή",
"conf_general_impexp_l1": "Εισαγάγετε μια διαμόρφωση επιλέγοντας ένα αρχείο διαμόρφωσης παρακάτω και κάντε κλικ στο \"Εισαγωγή\".",
"conf_general_impexp_l2": "Εξάγετε μια διαμόρφωση κάνοντας κλικ στο \"Εξαγωγή\". Το πρόγραμμα περιήγησής σας ξεκινά μια λήψη.",
"conf_general_impexp_title": "Εισαγωγή/Εξαγωγή διαρύθμισης",
"conf_general_inst_actionhead": "Ενέργεια",
"conf_general_inst_desc": "Χρησιμοποιήστε διαφορετικό υλικό LED ταυτόχρονα. Κάθε στιγμιότυπο εκτελείται ανεξάρτητα το ένα από το άλλο, γεγονός που επιτρέπει διαφορετικές διατάξεις LED και ρυθμίσεις βαθμονόμησης. Οι εμφανίσεις που εκτελούνται είναι διαθέσιμες στην επάνω γραμμή εικονιδίων",
"conf_general_intro": "Βασικές ρυθμίσεις γύρω από το Hyperion και το WebUI που δεν ταιριάζουν σε άλλη κατηγορία.",
"conf_general_label_title": "Γενικές ρυθμίσεις",
"conf_grabber_fg_intro": "Η καταγραφή οθόνης είναι η λήψη του τοπικού σας συστήματος ως πηγή εισόδου, στο οποίο είναι εγκατεστημένο το Hyperion.",
"conf_grabber_v4l_intro": "Η λήψη USB είναι μια συσκευή (λήψης) που συνδέεται μέσω USB και χρησιμοποιείται για την εισαγωγή εικόνων πηγής για επεξεργασία.",
"conf_helptable_expl": "Εξήγηση",
"conf_helptable_option": "Επιλογή",
"conf_leds_contr_label_contrtype": "Είδος χειριστή:",
"conf_leds_device_intro": "Το Hyperion υποστηρίζει πολλούς ελεγκτές για τη μετάδοση δεδομένων στη συσκευή-στόχο σας. Επιλέξτε έναν ελεγκτή LED από την ταξινομημένη λίστα και διαμορφώστε τον. Έχουμε επιλέξει τις καλύτερες προεπιλεγμένες ρυθμίσεις για κάθε συσκευή.",
"conf_leds_error_get_properties_text": "Αποτυχία λήψης των ιδιοτήτων της συσκευής. Ελέγξτε τα στοιχεία διαμόρφωσης.",
"conf_leds_error_get_properties_title": "Ιδιότητες συσκευής",
"conf_leds_layout_advanced": "Προχωρημένες Ρυθμίσεις",
"conf_leds_layout_blacklist_num_title": "Αριθμός LED",
"conf_leds_layout_blacklist_start_title": "Εκκίνηση LED",
"conf_leds_layout_btn_checklist": "Δείξε λίστα ελέγχου",
"conf_leds_layout_button_savelay": "Αποθήκευση Διάταξης",
"conf_leds_layout_button_updsim": "Ενημέρωση Προεπισκόπησης",
"conf_leds_layout_checkp1": "Το μαύρο LED είναι το πρώτο LED, το πρώτο LED είναι το σημείο όπου εισέρχεται το σήμα",
"conf_leds_layout_checkp2": "Η διάταξη είναι πάντα η μπροστινή όψη της τηλεόρασής σας, ποτέ η πίσω όψη.",
"conf_leds_layout_checkp3": "Βεβαιωθείτε ότι η κατεύθυνση είναι σωστή. Τα γκρι LED υποδεικνύουν τον αριθμό LED 2 και 3 για οπτικοποίηση της κατεύθυνσης των δεδομένων.",
"conf_leds_layout_checkp4": "Κενό θήκης: Για να δημιουργήσετε ένα κενό, αγνοήστε το πρώτα όταν ορίζετε Πάνω/Κάτω/Αριστερά/Δεξιά και στη συνέχεια ορίστε το μήκος του διακένου σας για να αφαιρέσετε μια ποσότητα led. Τροποποιήστε τη θέση του κενού μέχρι να ταιριάζει.",
"conf_leds_layout_cl_bottom": "Κάτω",
"conf_leds_layout_cl_bottomleft": "Κάτω αριστερά (Γωνία)",
"conf_leds_layout_cl_bottomright": "Κάτω Δεξιά (Γωνία)",
"conf_leds_layout_cl_cornergap": "Διάκενο γωνιών",
"conf_leds_layout_cl_edgegap": "Διάκενο περιθωρίου",
"conf_leds_layout_cl_gaglength": "Μήκος κενού",
"conf_leds_layout_cl_gappos": "θέση κενού",
"conf_leds_layout_cl_hleddepth": "Οριζόντιο βάθος LED",
"conf_leds_layout_cl_inppos": "Θέση Εισαγωγής",
"conf_leds_layout_cl_left": "Αριστερά",
"conf_leds_layout_cl_leftbottom": "Αριστερά 50% - 100% Κάτω",
"conf_leds_layout_cl_leftmiddle": "Αριστερά 25% - 75% Μέση",
"conf_leds_layout_cl_lefttop": "Αριστερά 0% - 50% Πάνω",
"conf_leds_layout_cl_lightPosBottomLeft11": "Κάτω: 75 - 100% από Αριστερά",
"conf_leds_layout_cl_lightPosBottomLeft112": "Κάτω: 0 - 50% από Αριστερά",
"conf_leds_layout_cl_lightPosBottomLeft12": "Κάτω: 25 - 50% από Αριστερά",
"conf_leds_layout_cl_lightPosBottomLeft121": "Κάτω: 50 - 100% από Αριστερά",
"conf_leds_layout_cl_lightPosBottomLeft14": "Κάτω: 0 - 25% από Αριστερά",
"conf_leds_layout_cl_lightPosBottomLeft34": "Κάτω: 50 - 75% από Αριστερά",
"conf_leds_layout_cl_lightPosBottomLeftNewMid": "Κάτω: 25 - 75% από Αριστερά",
"conf_leds_layout_cl_lightPosTopLeft112": "Πάνω: 0 - 50% από Αριστερά",
"conf_leds_layout_cl_lightPosTopLeft121": "Πάνω: 50 - 100% από Αριστερά",
"conf_leds_layout_cl_lightPosTopLeftNewMid": "Πάνω: 25 - 75% από Αριστερά",
"conf_leds_layout_cl_overlap": "Αλληλοεπικάλυψη",
"conf_leds_layout_cl_reversdir": "Αντίστροφη κατεύθυνση",
"conf_leds_layout_cl_right": "Δεξιά",
"conf_leds_layout_cl_rightbottom": "Δεξιά 50% - 100% Κάτω",
"conf_leds_layout_cl_rightmiddle": "Δεξιά 25% - 75% Μέση",
"conf_leds_layout_cl_righttop": "Δεξιά 0% - 50% Πάνω",
"conf_leds_layout_cl_top": "Πάνω",
"conf_leds_layout_cl_topleft": "Πάνω αριστερά (Γωνία)",
"conf_leds_layout_cl_topright": "Πάνω Δεξιά (Γωνία)",
"conf_leds_layout_cl_vleddepth": "Κάθετο βάθος LED",
"conf_leds_layout_frame": "Κλασική διάταξη (Κορνίζα LED)",
"conf_leds_layout_generatedconf": "Δημιουργία/Τρέχουσα διαμόρφωση LED",
"conf_leds_layout_intro": "Χρειάζεστε επίσης μια διάταξη LED, η οποία αντικατοπτρίζει τις θέσεις LED σας. Η κλασική διάταξη είναι το συνήθως χρησιμοποιούμενο πλαίσιο τηλεόρασης, αλλά υποστηρίζουμε επίσης τη δημιουργία LED matrix (LED walls). Η προβολή αυτής της διάταξης είναι ΠΑΝΤΑ από το ΜΠΡΟΣΤΑ της τηλεόρασής σας.",
"conf_leds_layout_ma_cabling": "Καλωδίωση",
"conf_leds_layout_ma_direction": "Διεύθυνση",
"conf_leds_layout_ma_horiz": "Οριζόντια",
"conf_leds_layout_ma_optbottomleft": "Κάτω Αριστερά",
"conf_leds_layout_ma_optbottomright": "Κάτω Δεξιά",
"conf_leds_layout_ma_opthoriz": "Οριζόντια",
"conf_leds_layout_ma_optparallel": "Παράλληλα",
"conf_leds_layout_ma_optsnake": "Φιδάκι",
"conf_leds_layout_ma_opttopleft": "Πάνω Αριστερά",
"conf_leds_layout_ma_opttopright": "Πάνω Δεξιά",
"conf_leds_layout_ma_optvert": "Κάθετα",
"conf_leds_layout_ma_order": "Σειρά",
"conf_leds_layout_ma_position": "Εισαγωγή",
"conf_leds_layout_ma_vert": "Κάθετα",
"conf_leds_layout_matrix": "Διάταξη Μήτρας (Τοίχος LED)",
"conf_leds_layout_pbl": "Δείξτε κάτω Αριστερά",
"conf_leds_layout_pbr": "Δείξτε κάτω Δεξιά",
"conf_leds_layout_peview": "Προεπισκόπηση διάταξης LED",
"conf_leds_layout_preview_l1": "Αυτό είναι το πρώτο σας LED (θέση εισόδου)",
"conf_leds_layout_preview_l2": "Αυτό οπτικοποιεί την κατεύθυνση των δεδομένων (δεύτερο/τρίτο LED)",
"conf_leds_layout_preview_ledpower": "Μέγιστη κατανάλωση ενέργειας: $1 Α",
"conf_leds_layout_preview_originCL": "Δημιουργήθηκε από: Κλασική διάταξη (πλαίσιο LED)",
"conf_leds_layout_preview_originMA": "Δημιουργήθηκε από: Διάταξη Μήτρας (τείχος LED)",
"conf_leds_layout_preview_originTEXT": "Δημιουργήθηκε από: Πλαίσιο κειμένου",
"conf_leds_layout_preview_totalleds": "Πλήθος LED: $1",
"conf_leds_layout_ptl": "Δείξτε πάνω Αριστερά",
"conf_leds_layout_ptlh": "Οριζόντια",
"conf_leds_layout_ptln": "Τριπλό σημείο",
"conf_leds_layout_ptlv": "Κάθετα",
"conf_leds_layout_ptr": "Δείξτε πάνω Δεξιά",
"conf_leds_layout_textf1": "Αυτό το πεδίο κειμένου εμφανίζει από προεπιλογή την τρέχουσα φορτωμένη διάταξη και θα αντικατασταθεί εάν δημιουργήσετε μια νέα με τις παραπάνω επιλογές. Προαιρετικά, μπορείτε να πραγματοποιήσετε περαιτέρω επεξεργασίες.",
"conf_leds_nav_label_ledcontroller": "Χειριστής LED",
"conf_leds_nav_label_ledlayout": "Διάταξη LED",
"conf_leds_optgroup_RPiGPIO": "RPi GPIO",
"conf_leds_optgroup_RPiPWM": "PRI PWM",
"conf_leds_optgroup_RPiSPI": "RPi SPI",
"conf_leds_optgroup_network": "Δίκτυο",
"conf_leds_optgroup_other": "Άλλο",
"conf_leds_optgroup_usb": "USB/Serial",
"conf_logging_btn_autoscroll": "Αυτόματη κύλιση",
"conf_logging_btn_pbupload": "Μεταφόρτωση αναφοράς για αιτήματα υποστήριξης",
"conf_logging_contpolicy": "Αναφορά Πολιτικής Απορρήτου",
"conf_logging_label_intro": "Περιοχή ελέγχου αρχείων καταγραφών συστήματος, θα βλέπετε περισσότερα ή λιγότερα ανάλογα την ρύθμιση του επίπεδου των καταγραφών.",
"conf_logging_lastreports": "Προηγούμενες αναφορές",
"conf_logging_nomessage": "Μη διαθέσιμα αρχεία καταγραφής συστήματος.",
"conf_logging_report": "Αναφορά",
"conf_logging_uplfailed": "Η μεταφόρτωση απέτυχε! Ελέγξτε τη σύνδεσή σας στο Διαδίκτυο!",
"conf_logging_uploading": "Προετοιμασία δεδομένων...",
"conf_logging_uplpolicy": "Κάνοντας κλικ σε αυτό το κουμπί αποδέχεστε το",
"conf_logging_yourlink": "Σύνδεσμος στην αναφορά σας",
"conf_network_bobl_intro": "Δέκτης για το Boblight",
"conf_network_fbs_intro": "Δέκτης για Flatbuffers της Google. Χρησιμοποιείται για γρήγορη αποστολή της εικόνας.",
"conf_network_forw_intro": "Προωθήστε όλες τις εισόδους σε μια δεύτερη εγκατάσταση Hyperion που θα μπορούσε να οδηγηθεί με άλλο ελεγκτή LED",
"conf_network_json_intro": "Η JSON-RPC θύρα για όλες τις διεργασίες του Hyperion, χρησιμοποιείται για απομακρυσμένο χειρισμό.",
"conf_network_proto_intro": "Η θύρα PROTO για όλες τις διεργασίες Hyperion, χρησιμοποιείται για μεταδώσεις εικόνας (HyperionScreenCap, πρόσθετο Kodi, Android Hyperion Grabber, ...)",
"conf_network_tok_cidhead": "Περιγραφή",
"conf_network_tok_desc": "Τα διακριτικά παρέχουν σε άλλες εφαρμογές πρόσβαση στο Hyperion API, μια εφαρμογή μπορεί να ζητήσει ένα διακριτικό όπου πρέπει να το αποδεχτείτε ή να τις δημιουργήσετε μόνοι σας παρακάτω. Αυτά τα διακριτικά απαιτούνται απλώς όταν η \"Εξουσιοδότηση API\" είναι ενεργοποιημένη στις ρυθμίσεις δικτύου.",
"conf_network_tok_grantMsg": "Μια εφαρμογή ζήτησε ένα διακριτικό για να αποκτήσει πρόσβαση στο Hyperion API. Θέλετε να παραχωρήσετε πρόσβαση; Επαληθεύστε τις παρεχόμενες πληροφορίες!",
"conf_network_tok_lastuse": "Τελευταία χρήση",
"conf_network_tok_title": "Διαχείρηση Διακριτικών",
"conf_webconfig_label_intro": "Ρυθμίσεις Webconfiguration. Επεξεργαστείτε με σύνεση.",
"dashboard_alert_message_confedit": "Η διαμόρφωση του Hyperion έχει τροποποιηθεί. Για να το εφαρμόσετε, επανεκκινήστε το Hyperion.",
"dashboard_alert_message_confedit_t": "Τροποποιημένη διαμόρφωση",
"dashboard_alert_message_confsave_success": "Η διαμόρφωσή σας στο Hyperion αποθηκεύτηκε επιτυχώς. Οι αλλαγές σας είναι πλέον ενεργές.",
"dashboard_alert_message_confsave_success_t": "Η διαμόρφωση αποθηκεύτηκε",
"dashboard_alert_message_disabled": "Η διαδικασία είναι απενεργοποιημένη! Για να την χρησιμοποιήσετε ξανά, ενεργοποιήστε την από τον πίνακα ελέγχου.",
"dashboard_alert_message_disabled_t": "Απενεργοποιημένη η διαδικασία για το υλισμικό LED",
"dashboard_componentbox_label_comp": "Στοιχείο",
"dashboard_componentbox_label_status": "Κατάσταση",
"dashboard_componentbox_label_title": "Κατάσταση στοιχείου",
"dashboard_infobox_label_currenthyp": "Η έκδοση Hyperion σας:",
"dashboard_infobox_label_disableh": "Απενεργοποίηση Περίπτωσης: $1",
"dashboard_infobox_label_enableh": "Ενεργοποίηση Περίπτωσης: $1",
"dashboard_infobox_label_instance": "Περίπτωση:",
"dashboard_infobox_label_latesthyp": "Η τελευταία έκδοση Hyperion:",
"dashboard_infobox_label_platform": "Πλατφόρμα",
"dashboard_infobox_label_ports": "Θύρες",
"dashboard_infobox_label_smartacc": "Έξυπνη πρόσβαση",
"dashboard_infobox_label_statush": "Κατάσταση Hyperion:",
"dashboard_infobox_label_title": "Πληροφορίες",
"dashboard_infobox_message_updatesuccess": "Τρέχεται την τελευταία έκδοση Hyperion.",
"dashboard_infobox_message_updatewarning": "Μια νεότερη έκδοση του Hyperion είναι διαθέσιμη! (1$)",
"dashboard_label_intro": "Ο πίνακας ελέγχου σας δίνει μια σύντομη περιγραφή για τη κατάσταση του Hyperion",
"dashboard_newsbox_label_title": "Hyperion-Blog",
"dashboard_newsbox_noconn": "Δεν μπορείτε να συνδεθείτε με το Hyperion Server για να ανακτήσετε τις τελευταίες δημοσιεύσεις, λειτουργεί το διαδύκτιο σας;",
"dashboard_newsbox_readmore": "Διαβάστε παραπάνω",
"dashboard_newsbox_visitblog": "Επισκεφτείτε Hyperion-Blog ",
"edt_append_degree": "°",
"edt_append_frames": "καρέ",
"edt_append_hz": "Hz",
"edt_append_leds": "LED",
"edt_append_ms": "ms",
"edt_append_ns": "ns",
"edt_append_percent": "%",
"edt_append_percent_h": "% hori",
"edt_append_percent_v": "% vert",
"edt_append_pixel": "Πίξελ",
"edt_append_s": "s",
"edt_append_sdegree": "s/μοίρα",
"edt_conf_bb_blurRemoveCnt_title": "Θόλωσε πίξελ",
"edt_conf_bb_heading_title": "Ανίχνευση μαύρων μπαρών",
"edt_conf_bb_mode_title": "Τρόπο",
"edt_conf_bb_threshold_title": "Κατώφλι",
"edt_conf_color_black_expl": "Η βαθμονομημένη τιμή μαύρου.",
"edt_conf_color_black_title": "Μαύρο",
"edt_conf_color_blue_expl": "Η βαθμονομημένη τιμή μπλε.",
"edt_conf_color_blue_title": "Μπλε",
"edt_conf_color_brightness_title": "Φωτεινότητα",
"edt_conf_color_channelAdjustment_header_expl": "Δημιουργήστε προφίλ χρωμάτων που θα μπορούσαν να αντιστοιχιστούν σε ένα συγκεκριμένο στοιχείο. Προσαρμόστε χρώμα, γάμμα, φωτεινότητα, αντιστάθμιση και πολλά άλλα.",
"edt_conf_color_channelAdjustment_header_itemtitle": "Προφίλ",
"edt_conf_color_channelAdjustment_header_title": "Διόρθωση κανάλι χρώματος",
"edt_conf_color_cyan_expl": "Η βαθμονομημένη τιμή κυανού.",
"edt_conf_color_cyan_title": "Κυανό",
"edt_conf_color_green_expl": "Η βαθμονομημένη τιμή πράσινου.",
"edt_conf_color_green_title": "Πράσινο",
"edt_conf_color_heading_title": "Βαθμονόμηση Χρώματος",
"edt_conf_color_id_title": "ID",
"edt_conf_color_imageToLedMappingType_expl": "Αντικαθιστά την εκχώρηση περιοχής LED της διάταξης LED εάν δεν είναι \"πολύχρωμη\"",
"edt_conf_color_imageToLedMappingType_title": "Ανάθεση επιφάνειας LED",
"edt_conf_color_leds_expl": "Αντιστοιχίστε αυτήν τη ρύθμιση σε όλα τα LED (*) ή μόνο σε μερικά (0-24).",
"edt_conf_color_leds_title": "Δείκτης LED",
"edt_conf_color_magenta_expl": "Η βαθμονομημένη τιμή ματζέντας.",
"edt_conf_color_magenta_title": "Ματζέντα",
"edt_conf_color_red_expl": "Η βαθμονομημένη τιμή κόκκινου.",
"edt_conf_color_red_title": "Κόκκινο",
"edt_conf_color_saturationGain_expl": "Ρυθμίζει τον κορεσμό των χρωμάτων. 1,0 σημαίνει καμία αλλαγή, πάνω από 1,0 αυξάνει τον κορεσμό, κάτω από 1,0 αποκορεσμένα.",
"edt_conf_color_white_expl": "Η βαθμονομημένη τιμή λευκού.",
"edt_conf_color_white_title": "Λευκό",
"edt_conf_color_yellow_expl": "Η βαθμονομημένη τιμή κίτρινου.",
"edt_conf_color_yellow_title": "Κίτρινο",
"edt_conf_enum_BOTH": "Οριζόντια & Κάθετα",
"edt_conf_enum_HORIZONTAL": "Οριζόντια",
"edt_conf_enum_NO_CHANGE": "Αυτόματο",
"edt_conf_enum_NTSC": "NTSC",
"edt_conf_enum_PAL": "PAL",
"edt_conf_enum_SECAM": "SECAM",
"edt_conf_enum_VERTICAL": "Κάθετα",
"edt_conf_enum_automatic": "Αυτόματο",
"edt_conf_enum_bbclassic": "Κλασσικό",
"edt_conf_enum_bbdefault": "Προεπιλεγμένο",
"edt_conf_enum_bbletterbox": "Γραμματοκιβώτιο",
"edt_conf_enum_bbosd": "OSD",
"edt_conf_enum_bgr": "BGR",
"edt_conf_enum_brg": "BRG",
"edt_conf_enum_color": "Χρώμα",
"edt_conf_enum_decay": "Αποσύνθεση",
"edt_conf_enum_dl_error": "Σφάλμα",
"edt_conf_enum_dl_verbose1": "Επίπεδο πολυγλωσσίας 1",
"edt_conf_enum_dl_verbose2": "Επίπεδο πολυγλωσσίας 2",
"edt_conf_enum_dl_verbose3": "Επίπεδο πολυγλωσσίας 3",
"edt_conf_enum_effect": "Εφέ",
"edt_conf_enum_gbr": "GBR",
"edt_conf_enum_grb": "GRB",
"edt_conf_enum_hsv": "HSV",
"edt_conf_enum_linear": "Γραμμικό",
"edt_conf_enum_logdebug": "Αποσφαλμάτωση",
"edt_conf_enum_logsilent": "Αθόρυβο",
"edt_conf_enum_logverbose": "Αναλυτικά",
"edt_conf_enum_logwarn": "Προειδοποίση",
"edt_conf_enum_multicolor_mean": "Πολύχρωμο",
"edt_conf_enum_please_select": "Παρακαλώ Επιλέξτε",
"edt_conf_enum_rbg": "RBG",
"edt_conf_enum_rgb": "RGB",
"edt_conf_enum_transeffect_smooth": "Λείο",
"edt_conf_enum_transeffect_sudden": "Απότομο",
"edt_conf_enum_udp_ddp": "DDP",
"edt_conf_enum_udp_raw": "RAW",
"edt_conf_enum_unicolor_mean": "Μονοχρωματικό",
"edt_conf_fg_display_title": "Απεικόνηση",
"edt_conf_fg_frequency_Hz_title": "Συχνότητα καταγραφής",
"edt_conf_fg_heading_title": "Καταγραφή Οθόνης",
"edt_conf_fg_height_expl": "Συρρικνώστε την εικόνα σε αυτό το ύψος, καθώς η ακατέργαστη εικόνα χρειάζεται πολύ χρόνο cpu.",
"edt_conf_fg_height_title": "Ύψος",
"edt_conf_fg_type_title": "Είδος",
"edt_conf_fg_width_expl": "Συρρικνώστε την εικόνα σε αυτό το πλάτος, καθώς η ακατέργαστη εικόνα χρειάζεται πολύ χρόνο cpu.",
"edt_conf_fg_width_title": "Πλάτος",
"edt_conf_fge_color_expl": "Εάν ο τύπος είναι \"Χρώμα\", ορίστε ένα χρώμα της επιλογής σας εδώ.",
"edt_conf_fge_color_title": "Χρώμα",
"edt_conf_fge_duration_ms_title": "Διάρκεια.",
"edt_conf_fge_effect_expl": "Εάν ο τύπος είναι \"Εφέ\", ορίστε ένα εφέ της επιλογής σας εδώ.",
"edt_conf_fge_effect_title": "Εφέ",
"edt_conf_fge_type_expl": "Επιλέξτε ανάμεσα σε χρώμα ή εφέ.",
"edt_conf_fge_type_title": "Είδος",
"edt_conf_fw_remote_service_discovered_none": "Δεν ανακαλύφθηκαν απομακρυσμένες υπηρεσίες",
"edt_conf_fw_service_name_expl": "Όνομα του παρόχου υπηρεσιών",
"edt_conf_fw_service_name_title": "Όνομα υπηρεσίας",
"edt_conf_gen_configVersion_title": "Έκδοση διαμόρφωσης",
"edt_conf_gen_heading_title": "Γενικές Ρυθμίσεις",
"edt_conf_gen_name_expl": "Ένα όνομα καθορισμένο από το χρήστη που χρησιμοποιείται για τον εντοπισμό του Hyperion. (Χρήσιμο με περισσότερες από μία περιπτώσεις Hyperion)",
"edt_conf_gen_name_title": "Όνομα διαμόρφωσης",
"edt_conf_gen_showOptHelp_expl": "Εμφάνιση όλων των διαθέσιμων επεξηγήσεων σε κάθε ενότητα. Συνιστάται ανεπιφύλακτα για αρχάριους!",
"edt_conf_gen_showOptHelp_title": "Δείξε παραδείγματα",
"edt_conf_general_enable_expl": "Αν είναι επιλεγμένο, η συνιστώσα είναι ενεργοποιημένη.",
"edt_conf_general_enable_title": "Ενεργοποίηση",
"edt_conf_general_port_expl": "Η θύρα που χρησιμοποιείται.",
"edt_conf_general_port_title": "Θύρα",
"edt_conf_general_priority_expl": "Η προτεραιότητα αυτής της συνιστώσας",
"edt_conf_general_priority_title": "Κανάλι προτεραιότητας",
"edt_conf_instC_systemEnable_title": "Ενεργοποίηση καταγραφής οθόνης",
"edt_conf_instC_v4lEnable_title": "Ενεργοποίηση συσκευής καταγραφής μέσω USB",
"edt_conf_instCapture_heading_title": "Συσκευές καταγραφής",
"edt_conf_net_apiAuth_expl": "Επιβολή όλων των εφαρμογών που χρησιμοποιούν το Hyperion API για έλεγχο ταυτότητας έναντι του Hyperion (Εξαίρεση: βλ. \"Τοπικός έλεγχος ταυτότητας API\"). Υψηλότερη ασφάλεια, καθώς ελέγχετε την πρόσβαση και την ανακαλείτε ανά πάσα στιγμή.",
"edt_conf_net_apiAuth_title": "Αυθεντικοποίηση ΑΡΙ",
"edt_conf_net_heading_title": "Δίκτυο",
"edt_conf_net_ip_itemtitle": "ΙΡ",
"edt_conf_smooth_decay_expl": "Η ταχύτητα της αποσύνθεσης. Το 1 είναι γραμμικό, οι μεγαλύτερες τιμές έχουν ισχυρότερο αποτέλεσμα.",
"edt_conf_smooth_decay_title": "Αποσύνθεση-Δύναμη",
"edt_conf_smooth_dithering_title": "Χρωματική αντιπαράθεση",
"edt_conf_smooth_heading_title": "Λείανση",
"edt_conf_smooth_interpolationRate_expl": "Ταχύτητα υπολογισμού λείων ενδιάμεσων πλαισίων.",
"edt_conf_smooth_interpolationRate_title": "Ρυθμός Παρεμβολής",
"edt_conf_smooth_time_ms_title": "Χρόνος",
"edt_conf_smooth_type_expl": "Είδος λείανσης.",
"edt_conf_smooth_type_title": "Είδος",
"edt_conf_smooth_updateFrequency_title": "Ρυθμός ανανέωσης",
"edt_conf_v4l2_cecDetection_expl": "Εάν είναι ενεργοποιημένο, η λήψη USB θα απενεργοποιηθεί προσωρινά όταν ληφθεί συμβάν αναμονής CEC από το δίαυλο HDMI.",
"edt_conf_v4l2_cecDetection_title": "Ανίχνευση CEC",
"edt_conf_v4l2_cropBottom_title": "Περικοπή κάτω",
"edt_conf_v4l2_cropHeightValidation_error": "Περικοπή πάνω + Περικοπή κάτω δεν μπορεί να είναι μεγαλύτερη από το πλάτος ($1)",
"edt_conf_v4l2_cropLeft_title": "Περικοπή αριστερά",
"edt_conf_v4l2_cropRight_title": "Περικοπή δεξιά",
"edt_conf_v4l2_cropTop_title": "Περικοπή πάνω",
"edt_conf_v4l2_cropWidthValidation_error": "Περικοπή αριστερά + Περικοπή δεξιά δεν μπορεί να είναι μεγαλύτερη από το πλάτος ($1)",
"edt_conf_v4l2_device_title": "Συσκευή",
"edt_conf_v4l2_flip_expl": "Αυτό σας επιτρέπει να αναστρέψετε την εικόνα οριζόντια, κάθετα ή και τα δύο.",
"edt_conf_v4l2_flip_title": "Αναστροφή εικόνας",
"edt_conf_v4l2_framerate_title": "Καρέ ανά δευτερόλεπτο",
"edt_conf_v4l2_heading_title": "Λήψη εισόδου USB",
"edt_conf_v4l2_resolution_title": "Ανάλυση Συσκευής",
"edt_conf_v4l2_signalDetection_title": "Ανίχνευση σήματος",
"edt_conf_webc_keyPassPhrase_expl": "Προαιρετικό: Το κλειδί μπορεί να προστατεύεται με κωδικό πρόσβασης",
"edt_conf_webc_keyPassPhrase_title": "Κωδικός πρόσβασης",
"edt_conf_webc_sslport_title": "Θύρα HTTPS",
"edt_dev_enum_sub_min_cool_adjust": "Αφαίρεσε ψυχρό λευκό",
"edt_dev_enum_sub_min_warm_adjust": "Αφαίρεσε θερμό λευκό",
"edt_dev_enum_subtract_minimum": "Αφαίρεση ελάχιστου",
"edt_dev_enum_white_off": "Απενεργοποίηση Λευκού",
"edt_dev_general_autostart_title": "Αυτόματη Εκκίνηση",
"edt_dev_general_colorOrder_title": "Διάταξη RGB byte",
"edt_dev_general_enableAttemptsInterval_title": "Διάστημα Επανάληψης",
"edt_dev_general_enableAttempts_title": "Προσπάθεια Σύνδεσης",
"edt_dev_general_enableAttempts_title_info": "Αριθμός προσπαθειών σύνδεσης μιας συσκευής προτού μεταβεί σε κατάσταση σφάλματος.",
"edt_dev_general_heading_title": "Γενικές Ρυθμίσεις",
"edt_dev_general_name_title": "Όνομα διαμόρφωσης",
"edt_dev_general_rewriteTime_title": "Χρόνος Ανανέωσης",
"edt_dev_spec_baudrate_title": "Ρυθμός επικοινωνίας",
"edt_dev_spec_brightnessFactor_title": "Συντελεστής φωτεινότητας",
"edt_dev_spec_brightnessMax_title": "Μέγιστη Φωτεινότητα",
"edt_dev_spec_brightnessMin_title": "Ελάχιστη Φωτεινότητα",
"edt_dev_spec_brightness_title": "Φωτεινότητα",
"edt_dev_spec_cid_title": "CID",
"edt_dev_spec_colorComponent_title": "Συνιστώσες χρώματος",
"edt_dev_spec_delayAfterConnect_title": "Καθυστέρηση μετά την σύνδεση",
"edt_dev_spec_dithering_title": "Χρωματική αντιπαράθεση",
"edt_dev_spec_dmaNumber_title": "Κανάλι DMA",
"edt_dev_spec_gamma_title": "Gamma",
"edt_dev_spec_globalBrightnessControlMaxLevel_title": "Μέγιστο επίπεδο Έντασης",
"edt_dev_spec_gpioMap_title": "Χαρτογράφηση GPIO",
"edt_dev_spec_gpioNumber_title": "Αριθμός GPIO",
"edt_dev_spec_header_title": "Συγκεκριμένες ρυθμίσεις",
"edt_dev_spec_intervall_title": "Διάστημα",
"edt_dev_spec_invert_title": "Αναστροφή σήματος",
"edt_dev_spec_ledIndex_title": "Δείκτης LED",
"edt_dev_spec_ledType_title": "Είδος LED",
"edt_dev_spec_lightid_itemtitle": "ID",
"edt_dev_spec_lights_itemtitle": "Φως",
"edt_dev_spec_lights_name": "Όνομα",
"edt_dev_spec_lights_title": "Φώτα",
"edt_dev_spec_maximumLedCount_title": "Μέγιστος αριθμός LED",
"edt_dev_spec_networkDevicePort_title": "Θύρα",
"edt_dev_spec_numberOfLeds_title": "Αριθμός LED",
"edt_dev_spec_order_left_right_title": "2.",
"edt_dev_spec_order_top_down_title": "1.",
"edt_dev_spec_pid_title": "PID",
"edt_dev_spec_port_title": "Θύρα",
"edt_dev_spec_razer_device_title": "Συσκευή RΛΖΞR Chroma",
"edt_dev_spec_serial_title": "Σειριακός Αριθμός",
"edt_dev_spec_spipath_title": "Συσκευή SPI",
"edt_dev_spec_switchOffOnBlack_title": "Απενεργοποίηση στο μαύρο",
"edt_dev_spec_targetIpHost_title": "Hostname/Διεύθυνση ΙΡ",
"edt_dev_spec_targetIp_title": "Διεύθυνση ΙΡ",
"edt_dev_spec_transistionTime_title": "Χρόνος Μετάβασης",
"edt_dev_spec_uid_title": "UID",
"edt_dev_spec_useRgbwProtocol_title": "Χρησιμοπίησε πρωτόκολο RGBW",
"edt_dev_spec_username_title": "Όνομα Χρήστη",
"edt_dev_spec_vid_title": "VID",
"edt_eff_blobcount": "Αριθμός σταγώνων",
"edt_eff_candle_header": "Κερί",
"edt_eff_candle_header_desc": "Λαμπερά κεριά",
"edt_eff_centerx": "Κέντρο Χ-άξονα",
"edt_eff_centery": "Κέντρο Υ-άξονα",
"edt_eff_color": "Χρώμα",
"edt_eff_colorHour": "Χρώμα ώρας",
"edt_eff_colorMinute": "Χρώμα λεπτού",
"edt_eff_colorSecond": "Χρώμα δευτερολέπτου",
"edt_eff_colorcount": "Μήκος χρώματος",
"edt_eff_colorend": "Τέλους χρώματος",
"edt_eff_colorevel": "Επίπεδο χρώματος",
"edt_eff_colorone": "Χρώμα ένα",
"edt_eff_colorrandom": "Τυχαίο χρώμα",
"edt_eff_colorshift": "Μετάβαση Χρώματος",
"edt_eff_colorstart": "Αρχή χρώματος",
"edt_eff_colortwo": "Χρώμα δύο",
"edt_eff_count": "Αριθμός",
"edt_eff_countries": "Χώρες",
"edt_eff_enableSecondSwirl": "Δεύτερος Στροβιλισμός",
"edt_eff_enum_all": "Όλα",
"edt_eff_enum_all-together": "Όλα μαζί",
"edt_eff_enum_list": "Λίστα LED",
"edt_eff_fade_header": "Σβήσιμο",
"edt_eff_fade_header_desc": "Σβήσιμο ανάμεσα σε χρώματα",
"edt_eff_flag_header": "Σημαίες",
"edt_eff_flag_header_desc": "Αφήστε τα LED σας να λάμπουν στα χρώματα της χώρας σας. Μπορείτε να επιλέξετε περισσότερες από μία σημαίες και θα αλλάξουν με βάση το χρονικό διάστημα.",
"edt_eff_fps": "Καρέ ανά δευτερόλεπτο",
"edt_eff_frequency": "Συχνότητα",
"edt_eff_gif_header": "GIF's",
"edt_eff_gif_header_desc": "Αυτό το εφέ αναπαράγει αρχεία .gif, παρέχει ένα απλό βίντεο όπως βρόχο ως εφέ.",
"edt_eff_height": "Ύψος",
"edt_eff_huechange": "Αλλαγή χρώματος",
"edt_eff_image_source_url": "URL",
"edt_eff_knightrider_header": "Knight Rider",
"edt_eff_knightrider_header_desc": "O K.I.T.T επέστρεψε! Ο μπροστινός σαρωτής του γνωστού αυτοκινήτου, αυτή τη φορά όχι μόνο στο κόκκινο.",
"edt_eff_ledlist": "Λίστα LED",
"edt_eff_ledtest_header": "Δοκιμή LED",
"edt_eff_length": "Μήκος",
"edt_eff_lightclock_header_desc": "Ένα πραγματικό ρολόι σαν φως! Προσαρμόστε τα χρώματα των ωρών, λεπτών, και δευτερολέπτων. Διατίθεται επίσης προαιρετικός δείκτης ώρας 3/6/9/12. Σε περίπτωση που το ρολόι είναι λάθος, πρέπει να ελέγξετε το ρολόι του συστήματός σας.",
"edt_eff_max_len": "Μέγιστο μήκος",
"edt_eff_min_len": "Ελάχιστο μήκος",
"edt_eff_moodblobs_header_desc": "Χαλαρώστε το βράδυ με αργή κίνηση και σταγόνες που αλλάζουν χρώμα.",
"edt_eff_pacman_header": "Πακ-Μαν",
"edt_eff_pacman_header_desc": "Μικρό, πεινασμένο και κίτρινο. Ποιος θα επιβιώσει;",
"edt_eff_plasma_header": "Πλάσμα",
"edt_eff_police_header": "Αστυνομία",
"edt_eff_police_header_desc": "Φώτα σαν αστινομικό όχημα σε δράση",
"edt_eff_randomCenter": "Τυχαίο Κέντρο",
"edt_eff_random_header": "Τυχαίο",
"edt_eff_repeat": "Επανάληψη",
"edt_eff_reverseRandomTime": "Ανέστρεψε κάθε",
"edt_eff_reversedirection": "Ανάστροφη κίνηση",
"edt_eff_rotationtime": "Χρόνος περιστροφής",
"edt_eff_showseconds": "Δείξε δευτερόλεπτα",
"edt_eff_snake_header": "Φιδάκι",
"edt_eff_snake_header_desc": "Που υπάρχει κάτι να φάω;",
"edt_eff_sparks_header": "Σπίθες",
"edt_eff_sparks_header_desc": "Αστερική-σπίθα, επιλέξτε ανάμεσα σε ένα στατικό χρώμα ή ένα τυχαίο. Θα μπορούσατε επίσης να ρυθμίσετε τη φωτεινότητα, τον κορεσμό και την ταχύτητα.",
"edt_eff_speed": "Ταχύτητα",
"edt_eff_swirl_header": "στροβιλισμός χρωμάτων",
"edt_eff_swirl_header_desc": "Ένας στροβιλισμός με προσαρμοσμένα χρώματα. Τα χρώματα απλώνονται ακόμη και στις 360°, θα υπολογίζονται οι μετατοπίσεις μεταξύ των χρωμάτων. Επιπλέον, μπορείτε να προσθέσετε ένα δεύτερο στροβιλισμό από πάνω, να γνωρίζετε ότι χρειάζεστε μερική διαφάνεια! Συμβουλή: Η επανάληψη του ίδιου χρώματος έχει ως αποτέλεσμα μια \"υψηλότερη\" περιοχή χρώματος και μια μειωμένη περιοχή μετατόπισης χρώματος.",
"edt_eff_trails_header": "Πεφταστέρι",
"edt_eff_trails_header_desc": "Χρωματιστά αστέρια που πέφτουν από τη κορυφή",
"edt_eff_waves_header": "Κύματα",
"edt_eff_whichleds": "Ποια LEDs",
"edt_eff_whitelevel": "Επίπεδο λευκού",
"edt_eff_x-mas_header": "Χριστούγεννα",
"edt_eff_x-mas_header_desc": "Άγγιγμα Χριστουγέννων",
"edt_msg_button_add_row_title": "Προσθήκη $1",
"edt_msg_button_collapse": "Σύμπτηξη",
"edt_msg_button_delete_all": "Όλα",
"edt_msg_button_delete_all_title": "Διαγραφή Όλων",
"edt_msg_button_delete_last": "Τουλάχιστον $1",
"edt_msg_button_delete_last_title": "Διαγραφή Τελευταίων $1",
"edt_msg_button_delete_row_title": "Διαγραφή $1",
"edt_msg_button_delete_row_title_short": "Διαγραφή",
"edt_msg_button_expand": "Ανέπτυξε",
"edt_msg_button_move_down_title": "Μετακίνησε κάτω",
"edt_msg_button_move_up_title": "Μετακίνησε πάνω",
"edt_msg_error_additionalItems": "Δεν επιτρέπονται επιπλέον στοιχεία σε αυτόν τον πίνακα",
"edt_msg_error_additional_properties": "Δεν επιτρέπονται πρόσθετες ιδιότητες, αλλά η ιδιότητα $1 έχει οριστεί",
"edt_msg_error_dependency": "Πρέπει να έχει την ιδιότητα $1",
"edt_msg_error_disallow": "Η τιμή δεν πρέπει να είναι τύπου $1",
"edt_msg_error_disallow_union": "Η τιμή δεν πρέπει να είναι ένας από τους παρεχόμενους μη επιτρεπόμενους τύπους",
"edt_msg_error_maxItems": "Η τιμή πρέπει να έχει το πολύ $1 αντικείμενα",
"edt_msg_error_maxLength": "Η τιμή πρέπει να έχει το πολύ $1 μήκος χαρακτήρων",
"edt_msg_error_maxProperties": "Το αντικείμενο πρέπει να έχει το πολύ $1 ιδιότητες",
"edt_msg_error_maximum_excl": "Η τιμή πρέπει να είναι λιγότερο του $1",
"edt_msg_error_maximum_incl": "Η τιμή πρέπει να είναι το πολύ $1",
"edt_msg_error_minItems": "Η τιμή πρέπει να έχει τουλάχιστον $1 αντικείμενα",
"edt_msg_error_minLength": "Η τιμή πρέπει να έχει τουλάχιστον $1 μήκος χαρακτήρων",
"edt_msg_error_minProperties": "Το αντικείμενο πρέπει να έχει τουλάχιστον $1 ιδιότητες",
"edt_msg_error_minimum_excl": "Η τιμή πρέπει να είναι μεγαλύτερη του $1",
"edt_msg_error_minimum_incl": "Η τιμή πρέπει να είναι τουλάχιστον $1",
"edt_msg_error_multipleOf": "Η τιμή πρέπει να είναι πολλαπλάσιο του $1",
"edt_msg_error_pattern": "Η τιμή πρέπει να μοιάζει με το μοτίβο",
"edt_msg_error_required": "Από το αντικείμενο λείπει η απαιτούμενη ιδιότητα '$1'",
"edt_msg_error_type": "Η τιμή πρέπει να είναι τύπου $1",
"edt_msg_error_uniqueItems": "Ο πίνακας πρέπει να έχει μοναδικά στοιχεία",
"effectsconfigurator_button_conttest": "Συνεχές τεστ",
"effectsconfigurator_button_deleffect": "Διαγραφή Εφέ",
"effectsconfigurator_button_editeffect": "Φόρτωση Εφέ",
"effectsconfigurator_button_saveeffect": "Αποθήκευση Εφέ",
"effectsconfigurator_button_starttest": "Εκκίνηση τεστ",
"effectsconfigurator_button_stoptest": "Τερματισμός τεστ",
"effectsconfigurator_editdeleff": "Διαγραφή/Φόρτωση εφέ",
"effectsconfigurator_label_chooseeff": "Επιλέξτε Πρότυπο",
"effectsconfigurator_label_effectname": "Όνομα Εφέ",
"effectsconfigurator_label_intro": "Δημιουργήστε από τα βασικά εφέ νέα εφέ που είναι συντονισμένα σύμφωνα με τις προτιμήσεις σας. Ανάλογα με το Εφέ, υπάρχουν διαθέσιμες επιλογές όπως χρώμα, ταχύτητα, κατεύθυνση και άλλα.",
"general_access_advanced": "Προχωρημένο",
"general_access_default": "Προεπιλεγμένο",
"general_access_expert": "Ειδικό",
"general_btn_back": "Πίσω",
"general_btn_cancel": "Ακύρωση",
"general_btn_continue": "Συνέχεια",
"general_btn_delete": "Διαγραφή",
"general_btn_denyAccess": "Απόρριψη πρόσβασης",
"general_btn_grantAccess": "Παραχώρηση πρόσβασης",
"general_btn_iswitch": "Διακόπτης",
"general_btn_next": "Επόμενο",
"general_btn_off": "Απενεργοποίηση",
"general_btn_ok": "ΟΚ",
"general_btn_on": "Εκκίνηση",
"general_btn_overwrite": "Αντικατάσταση",
"general_btn_rename": "Μεταονόμασε",
"general_btn_restarthyperion": "Επανεκκίνηση Hyperion",
"general_btn_save": "Αποθήκευση",
"general_btn_saveandreload": "Αποθήκευση και επαναφόρτωση",
"general_btn_saverestart": "Αποθήκευση και επανεκκίνηση",
"general_btn_start": "Εκκίνηση",
"general_btn_stop": "Τερματισμός",
"general_btn_yes": "Ναι",
"general_button_savesettings": "Αποθήκευση ρυθμίσεων",
"general_chars_needed": "χρειάζονται περισσότεροι χαρακτήρες",
"general_col_blue": "Μπλε",
"general_col_green": "Πράσινο",
"general_col_red": "Κόκκινο",
"general_comp_BLACKBORDER": "Ανίχνευση μαύρης μπάρας",
"general_comp_BOBLIGHTSERVER": "Διακομιστής Boblight",
"general_comp_FLATBUFSERVER": "Διακομιστής Flatbuffers",
"general_comp_GRABBER": "Λήψη Οθόνης",
"general_comp_LEDDEVICE": "Έξοδος LED",
"general_comp_SMOOTHING": "Εξομάλυνση",
"general_comp_V4L": "Λήψη εισόδου-USB",
"general_country_cn": "Κίνα",
"general_country_de": "Γερμανία",
"general_country_es": "Ισπανία",
"general_country_fr": "Γαλλία",
"general_country_it": "Ιταλία",
"general_country_nl": "Ολλανδία",
"general_country_ru": "Ρωσία",
"general_country_uk": "Ηνωμένο Βασίλειο",
"general_country_us": "ΗΠΑ",
"general_disabled": "Απενεργοποιημένο",
"general_enabled": "Ενεργοποιημένο",
"general_speech_cs": "Τσέχικα",
"general_speech_da": "Δανέζικα",
"general_speech_de": "Γερμανικά",
"general_speech_en": "Αγγλικά",
"general_speech_es": "Ισπανικά",
"general_speech_fr": "Γαλλικά",
"general_speech_hu": "Ουγγαρικά",
"general_speech_it": "Ιταλικά",
"general_speech_ja": "Ιαπωνικά",
"general_speech_nb": "Νορβηγικά (Bokmål)",
"general_speech_nl": "Ολλανδικά",
"general_speech_pl": "Πολωνικά",
"general_speech_pt": "Πορτογαλικά",
"general_speech_ro": "Ρουμάνικα",
"general_speech_ru": "Ρωσικά",
"general_speech_sv": "Σουηδικά",
"general_speech_tr": "Τούρκικα",
"general_speech_vi": "Βιετναμέζικα",
"general_speech_zh-CN": "Κινέζικα (απλοποιημένα)",
"general_webui_title": "Hyperion - Διαμόρφωση Ιστού",
"general_wiki_moreto": "Περισσότερες πληροφορίες για \"$1\" στο Wiki μας",
"infoDialog_effconf_created_text": "Το εφέ \"$1\" κατασκευάστηκε επιτυχώς!",
"infoDialog_effconf_deleted_text": "Το εφέ \"$1\" διαγράφτηκε επιτυχώς!",
"infoDialog_general_error_title": "Σφάλμα",
"infoDialog_general_success_title": "Επιτυχία",
"infoDialog_general_warning_title": "Προειδοπίηση",
"infoDialog_import_comperror_text": "Λυπητερό! Το πρόγραμμα περιήγησής σας δεν υποστηρίζει την εισαγωγή. Δοκιμάστε ξανά με άλλο πρόγραμμα περιήγησης.",
"infoDialog_import_confirm_text": "Είστε βέβαιοι ότι θα εισαγάγετε το \"$1\"; Δεν είναι δυνατή η επαναφορά αυτής της διαδικασίας!",
"infoDialog_import_confirm_title": "Συμφωνήστε στην εισαγωγή",
"infoDialog_import_hyperror_text": "Δεν είναι δυνατή η εισαγωγή του επιλεγμένου αρχείου διαμόρφωσης \"$1\". Δεν είναι συμβατό με Hyperion 2.0 και νεότερη έκδοση!",
"infoDialog_import_jsonerror_text": "Το επιλεγμένο αρχείο διαμόρφωσης \"$1\" δεν είναι αρχείο .json ή είναι κατεστραμμένο. Μήνυμα σφάλματος: ($2)",
"infoDialog_password_current_text": "Τωρινός κωδικός",
"infoDialog_password_new_text": "Νέος κωδικός",
"infoDialog_username_text": "Όνομα Χρήστη",
"infoDialog_wizrgb_text": "Η διάταξη του RGB Byte έχει ήδη ρυθμιστεί σωστά.",
"infoDialog_writeconf_error_text": "Η αποθήκευση της διαμόρφωσής σας απέτυχε.",
"infoDialog_writeimage_error_text": "Το επιλεγμένο αρχείο \"$1\" δεν είναι αρχείο εικόνας ή είναι κατεστραμμένο! Επιλέξτε άλλο αρχείο εικόνας.",
"info_404": "Η σελίδα που ζητήσατε δεν είναι διαθέσιμη!",
"info_conlost_label_autorecon": "Θα επανασυνδεθείτε ξανά αφού το Hyperion είναι διαθέσιμο.",
"info_conlost_label_autorefresh": "Αυτή η σελίδα θα ανανεωθεί αυτόματα.",
"info_conlost_label_reason": "Πιθανές αιτίες:",
"info_conlost_label_reason1": "- Κακή σύνδεση WLAN",
"info_conlost_label_reason2": "- Πραγματοποιήσατε αναβάθμιση",
"info_conlost_label_reason3": "- Το Hyperion δεν τρέχει",
"info_conlost_label_reload": "Η αυτόματη επανασύνδεση διακόπηκε - υπέρβαση του ορίου. Ανανεώστε τη σελίδα ή κάντε κλικ σε εμένα!",
"info_conlost_label_title": "Χάθηκε η σύνδεση με την υπηρεσία Hyperion!",
"info_restart_contus": "Εάν εξακολουθείτε να μένετε εδώ μετά από 20 δευτερόλεπτα και δεν έχετε ιδέα γιατί ανοίξτε ένα νέο θέμα στο φόρουμ υποστήριξής μας...",
"info_restart_contusa": "...με τα τελευταία σου βήματα. Ευχαριστώ!",
"info_restart_rightback": "Ο Hyperion θα επιστρέψει αμέσως!",
"info_restart_title": "Αυτήν τη στιγμή γίνεται επανεκκίνηση...",
"main_ledsim_btn_togglelednumber": "Αριθμός LED",
"main_ledsim_btn_toggleleds": "Δείξε LED",
"main_ledsim_btn_togglelivevideo": "Ζωντανό βίντεο",
"main_ledsim_text": "Ζωντανή απεικόνιση χρωμάτων LED και προαιρετική η τρέχουσα ροή βίντεο της συσκευής λήψης.",
"main_ledsim_title": "Οπτικοποίηση LED",
"main_menu_about_token": "Σχετικά με το Hyperion",
"main_menu_colors_conf_token": "Επεξεργασία εικόνας",
"main_menu_configuration_token": "LED διαδικασία",
"main_menu_dashboard_token": "Πίνακας Ελέγχου",
"main_menu_effect_conf_token": "Εφέ",
"main_menu_effectsconfigurator_token": "Παραμετροποιητής εφέ",
"main_menu_general_conf_token": "Γενικά",
"main_menu_grabber_conf_token": "Υλισμικό καταγραφής",
"main_menu_input_selection_token": "Επιλογή εισόδου",
"main_menu_instcapture_conf_token": "Πηγές",
"main_menu_leds_conf_token": "Έξοδος LED",
"main_menu_logging_token": "Καταγράψτε",
"main_menu_network_conf_token": "Υπηρεσίες δικτύου",
"main_menu_remotecontrol_token": "Ασύρματος χειρισμός",
"main_menu_support_token": "Υποστήριξη",
"main_menu_system_token": "Σύστημα",
"main_menu_update_token": "Αναβάθμιση",
"main_menu_webconfig_token": "Διαμόρφωση Ιστού",
"remote_adjustment_intro": "Παραμετροποίηση χρώματος/φωτεινότητας/εξομάλυνσης κατά την εκτέλεση. $1",
"remote_adjustment_label": "Ρύθμιση χρώματος",
"remote_color_button_reset": "Επαναφορά Χρώματος/Εφέ",
"remote_color_intro": "Ορίστε ένα εφέ ή χρώμα. Επίσης παρατίθενται τα εφέ που δημιουργήσατε εσείς (εάν είναι διαθέσιμα). $1",
"remote_color_label": "Χρώματα/Εφέ",
"remote_color_label_color": "Χρώμα:",
"remote_components_intro": "Ενεργοποίηση και απενεργοποίηση στοιχείων του Hyperion κατά τη διάρκεια του χρόνου εκτέλεσης. $1",
"remote_components_label": "Έλεγχος συνιστωσών",
"remote_effects_label_effects": "Εφέ:",
"remote_effects_label_picture": "Εικόνα:",
"remote_input_clearall": "Καθαρισμός όλων των Χρωμάτων/Εφέ",
"remote_input_duration": "Διάρκεια:",
"remote_input_intro": "Το Hyperion χρησιμοποιεί ένα σύστημα προτεραιότητας για να επιλέξει μια πηγή. Ό,τι ορίζετε έχει προτεραιότητα (Εφέ/Χρώμα/Λήψη οθόνης/Λήψη USB και πηγές δικτύου). Από προεπιλογή, το Hyperion επιλέγει πηγές ανάλογα με την προτεραιότητα (ο χαμηλότερος αριθμός αντικατοπτρίζει την τρέχουσα ενεργή πηγή). Τώρα έχετε την ευκαιρία να επιλέξετε μόνοι σας πηγές. $1",
"remote_input_ip": "ΙΡ:",
"remote_input_label": "Επιλογή πηγής",
"remote_input_label_autoselect": "Αυτόματη Επιλογή",
"remote_input_origin": "Προέλευση",
"remote_input_owner": "Είδος",
"remote_input_priority": "Προτεραιότητα",
"remote_input_setsource_btn": "Επιλέξτε Πηγή",
"remote_input_sourceactiv_btn": "Πηγή ενεργή",
"remote_input_status": "Κατάσταση/Ενέργεια",
"remote_losthint": "Σημείωση: Όλες οι αλλαγές θα χαθούν μετά από επανεκκίνηση.",
"remote_maptype_intro": "Συνήθως η διάταξη LED καθορίζει ποια LED καλύπτει μια συγκεκριμένη περιοχή εικόνας. Μπορείτε να το αλλάξετε εδώ: $1.",
"remote_maptype_label": "Είδος Χαρτογράφισης",
"remote_maptype_label_multicolor_mean": "Πολύχρωμο",
"remote_maptype_label_unicolor_mean": "Μονοχρωματικό",
"remote_optgroup_syseffets": "Ρυθμίσης Συστήματος",
"remote_optgroup_templates_custom": "Πρότυπα Χρήστη",
"remote_optgroup_templates_system": "Πρότυπα Συστήματος",
"remote_optgroup_usreffets": "Εφέ Χρήστη",
"remote_videoMode_2D": "2D",
"remote_videoMode_3DSBS": "3DSBS",
"remote_videoMode_3DTAB": "3DTAB",
"remote_videoMode_intro": "Εναλλαγή μεταξύ διαφορετικών επιλογών βίντεο για να απολαύσετε ταινίες 3D! Όλες οι συσκευές καταγραφής υποστηρίζονται. $1",
"remote_videoMode_label": "Λειτουργία βίντεο",
"support_label_affinstr1": "Κάντε κλικ στον κατάλληλο σύνδεσμο της χώρας σας",
"support_label_affinstr2": "Ό,τι αγοράζετε (δεν έχει σημασία τι) παίρνουμε μια μικρή χρέωση με βάση τον τζίρο σας",
"support_label_affinstr3": "Πληρώνετε ΠΑΝΤΑ το ίδιο, δεν υπάρχει καμία απολύτως διαφορά. Δοκίμασέ το!",
"support_label_btctext": "Διεύθυνση:",
"support_label_donate": "Δωρίστε ή χρησιμοποιήστε τους συνδέσμους συνεργατών μας",
"support_label_donationpp": "Δωρεά:",
"support_label_fbtext": "Μοιραστείτε τη σελίδα μας στο Hyperion στο Facebook και λάβετε ειδοποίηση όταν κυκλοφορούν νέες ενημερώσεις",
"support_label_forumtext": "Προθήκες, συζητήσεις, βοήθεια και πολλά άλλα",
"support_label_forumtitle": "Φόρουμ",
"support_label_ggtext": "Κυκλώστε μας στο Google+!",
"support_label_ghtext": "Επισκευτείτε μας στο GitHub",
"support_label_igtext": "Επισκεφθείτε μας στο Instagram για να παρακολουθήσετε τις τελευταίες φωτογραφίες του Hyperion!",
"support_label_intro": "Το Hyperion είναι ένα δωρεάν, μη-κερδοσκοπικό λογισμικό. Μια μικρή ομάδα εργάζεται πάνω σε αυτό και γι' αυτό χρειαζόμαστε τη σταθερή υποστήριξή σας.",
"support_label_spreadtheword": "Διέδωσέ το",
"support_label_title": "Υποστήριξη Hyperion",
"support_label_twtext": "Μοιραστείτε και ακολουθήστε μας στο Twitter, για να είστε πάντα ενημερωμένοι με την τελευταία ανάρτηση σχετικά με την ανάπτυξη του Hyperion",
"support_label_webpagetext": "Αρχική σελίδα του Hyperion",
"support_label_webpagetitle": "Ιστοσελίδα",
"support_label_webrestitle": "Πληροφορίες και βοηθιτικό υλικό",
"support_label_wikitext": "Το Α έως Ω για σχεδόν οτιδήποτε σχετίζεται με το Hyperion",
"support_label_wikititle": "Βιβλιογραφία",
"support_label_yttext": "Βαρεθήκατε τις φωτογραφίες; Δείτε το κανάλι μας στο YouTube!",
"update_button_changelog": "Πλήρες αρχείο αλλαγών",
"update_button_install": "Εγκατάσταση",
"update_error_getting_versions": "Παρουσιάστηκε πρόβλημα με τον προσδιορισμό της πιο πρόσφατης διαθέσιμης έκδοσης.",
"update_label_description": "Περιγραφή:",
"update_label_intro": "Επισκόπηση όλων των διαθέσιμων εκδόσεων Hyperion. Επιπλέον, θα μπορούσατε να ενημερώσετε ή να υποβαθμίσετε την έκδοση του Hyperion όποτε θέλετε. Ταξινόμηση από το νεότερο στο παλαιότερο",
"update_label_type": "Τύπος:",
"update_versreminder": "Η έκδοση σας: $1",
"wiz_cc_adjustgamma": "Gamma: Αυτό που πρέπει να κάνετε είναι να προσαρμόσετε τα επίπεδα γάμμα κάθε καναλιού μέχρι να έχετε την ίδια αντιληπτή ποσότητα για κάθε κανάλι. Υπόδειξη: Το ουδέτερο είναι 1,0! Για παράδειγμα, εάν το Γκρι σας είναι λίγο κοκκινωπό, σημαίνει ότι πρέπει να αυξήσετε το κόκκινο γάμμα για να μειώσετε την ποσότητα του κόκκινου (όσο περισσότερο γάμμα, τόσο μικρότερη ποσότητα χρώματος).",
"wiz_cc_adjustit": "Προσαρμόστε το \"$1\" σας, μέχρι να τα καταφέρετε. Λάβετε υπόψη: Όσο περισσότερο προσαρμόζετε μακριά από την προεπιλεγμένη τιμή, το φάσμα χρωμάτων θα είναι περιορισμένο (Επίσης για όλα τα ενδιάμεσα χρώματα). Ανάλογα με το χρωματικό φάσμα της τηλεόρασης/LED, τα αποτελέσματα θα διαφέρουν.",
"wiz_cc_backlight": "Επιπλέον, θα μπορούσατε να ορίσετε έναν οπίσθιο φωτισμό για να ταξινομήσετε τα \"κακά χρώματα\" σε σχεδόν σκοτεινές περιοχές ή εάν δεν σας αρέσει η εναλλαγή μεταξύ χρώματος και απενεργοποίησης κατά την παρακολούθηση. Επιπλέον, θα μπορούσατε να ορίσετε εάν πρέπει να υπάρχει κάποιο χρώμα σε αυτό ή απλώς λευκό. Αυτό είναι απενεργοποιημένο κατά την κατάσταση \"Απενεργοποίηση\" \"Χρώμα\" και \"Εφέ\".",
"wiz_cc_btn_stop": "Σταματήστε το βίντεο",
"wiz_cc_btn_switchpic": "Αλλαγή εικόνας",
"wiz_cc_chooseid": "Ορίστε ένα όνομα για αυτό το προφίλ χρώματος.",
"wiz_cc_kodicon": "Βρέθηκε το Kodi, προχωρήστε με την υποστήριξη του Kodi.",
"wiz_cc_kodidiscon": "Το Kodi δεν βρέθηκε, προχωρήστε χωρίς υποστήριξη Kodi (ελέγξτε εάν είναι ενεργοποιημένος ο τηλεχειρισμός από άλλα συστήματα).",
"wiz_cc_kodimsg_start": "Επιτυχία δοκιμής - ώρα να προχωρήσετε!",
"wiz_cc_kodishould": "Το Kodi θα πρέπει να δείχνει την ακόλουθη εικόνα: $1",
"wiz_cc_kwebs": "Kodi webserver (Hostname ή IP)\n",
"wiz_cc_lettvshow": "Αφήστε την τηλεόρασή σας να εμφανίσει την ακόλουθη εικόνα: $1",
"wiz_cc_lettvshowm": "Ελέγξτε αυτό με τις παρακάτω εικόνες: $1",
"wiz_cc_link": "Πάτα με!",
"wiz_cc_morethanone": "Έχετε περισσότερα από ένα προφίλ, επιλέξτε το προφίλ που θέλετε να βαθμονομήσετε.",
"wiz_cc_summary": "Συμπέρασμα των ρυθμίσεών σας. Κατά τη διάρκεια της αναπαραγωγής βίντεο, μπορείτε να αλλάξετε ή να δοκιμάσετε ξανά τις τιμές. Εάν τελειώσετε, κάντε κλικ στην αποθήκευση.",
"wiz_cc_testintro": "Ώρα για ένα πραγματικό τεστ",
"wiz_cc_testintrok": "Πατήστε ένα κουμπί παρακάτω για να ξεκινήσετε ένα δοκιμαστικό βίντεο.",
"wiz_cc_testintrowok": "Δείτε τον παρακάτω σύνδεσμο για να κατεβάσετε δοκιμαστικά βίντεο:",
"wiz_cc_title": "Οδηγός ρύθμισης βαθμονόμησης χρωμάτων",
"wiz_cc_try_connect": "Σύνδεση...",
"wiz_cololight_desc2": "Τώρα επιλέξτε ποια Cololights θα προστεθούν. Για να αναγνωρίσετε μεμονωμένα φώτα, πατήστε το κουμπί στα δεξιά.",
"wiz_cololight_noprops": "Δεν είναι δυνατή η λήψη των ιδιοτήτων της συσκευής - Ορίστε τον αριθμό των LED υλικού με μη αυτόματο τρόπο",
"wiz_guideyou": "Το $1 θα σας καθοδηγήσει στις ρυθμίσεις. Απλά πατήστε το κουμπί!",
"wiz_hue_blinkblue": "Εγένετο φως",
"wiz_hue_create_user": "Δημιουργία νέου Χρήστη",
"wiz_hue_desc1": "1. Το Hyperion αναζητά αυτόματα ένα Hue-Bridge, σε περίπτωση που δεν μπορεί να βρει, πρέπει να δώσετε το όνομα κεντρικού υπολογιστή ή τη διεύθυνση IP και να πατήσετε το κουμπί επαναφόρτωσης. <br> 2. Δώστε ένα αναγνωριστικό χρήστη, εάν δεν έχετε, δημιουργήστε ένα νέο.",
"wiz_hue_desc2": "3. Τώρα επιλέξτε ποιοι λαμπτήρες πρέπει να προστεθούν. Η θέση αντιστοιχίζει τη λάμπα σε μια συγκεκριμένη θέση στην \"εικόνα\" σας. Δεν θα προστεθούν απενεργοποιημένες λάμπες. Για να αναγνωρίσετε μεμονωμένους λαμπτήρες πατήστε το κουμπί στα δεξιά.",
"wiz_hue_e_desc1": "1. Το Hyperion αναζητά αυτόματα ένα Hue-Bridge, σε περίπτωση που δεν μπορεί να βρει, πρέπει να δώσετε το όνομα κεντρικού υπολογιστή ή τη διεύθυνση IP και να πατήσετε το κουμπί επαναφόρτωσης. <br> 2. Δώστε ένα αναγνωριστικό χρήστη και το κλειδί πελάτη, εάν δεν έχετε και τα δύο, δημιουργήστε νέα.",
"wiz_hue_e_noapisupport": "Ο Wizard έχει απενεργοποιήσει την υποστήριξη API ψυχαγωγίας και θα συνεχίσει σε κλασική λειτουργία.",
"wiz_hue_e_title": "Wizard ψυχαγωγίας Philips Hue",
"wiz_hue_failure_connection": "Τέλος χρόνου: Παρακαλώ πατήστε το κουμπί (bridge) μέσα σε διάστημα 30 δευτερολέπτων",
"wiz_hue_failure_ip": "Δεν βρέθηκε καμία γέφυρα δικτύου (bridge), παρακαλείστε να παρέχετε έγκυρο όνομα διακομιστή ή διεύθυνση IP",
"wiz_hue_failure_user": "Ο χρήστης δεν βρέθηκε, δημιουργήστε έναν νέο με το κουμπί παρακάτω ή εισάγετε ένα έγκυρο όνομα χρήστη και πατήστε το σύμβολο της \"επαναφόρτωσης\".",
"wiz_hue_intro1": "Αυτός ο βοηθός ρυθμίζει το Hyperion για το γνωστό σύστημα Philips Hue. Χαρακτηριστικά όπως την αυτόματη αναγνώριση του Hue Bridge, δημιουργίες χρήστη, τοποθέτηση κάθε Hue συσκευής σε συγκεκριμένη θέση στην εικόνα σας ή απενεργοποίηση της και ρύθμιση των επιλογών του Hyperion αυτόματα! Στα γρήγορα: Το μόνο που χρειάζεται είναι μερικά κλικ και είστε έτοιμοι!",
"wiz_hue_ip": "Hostname ή ΙΡ",
"wiz_hue_press_link": "Παρακαλώ πατήστε το κουμπί σύζευξης στη Hue γέφυρα (bridge).",
"wiz_hue_searchb": "Αναζήτηση για γέφυρα (bridge)...",
"wiz_hue_title": "Philips Hue Wizard",
"wiz_hue_username": "ID Χρήστη",
"wiz_identify": "Αναγνώρισε",
"wiz_identify_light": "Αναγνώρισε $1",
"wiz_ids_disabled": "Απενεργοποίηση",
"wiz_ids_entire": "Πλήρη εικόνα",
"wiz_noLights": "Δεν βρέθηκε το $1! Συνδέστε τα φώτα στο δίκτυο ή διαμορφώστε τα με μη αυτόματο τρόπο.",
"wiz_pos": "Θέση/Κατάσταση",
"wiz_rgb_expl": "Η χρωματική κουκκίδα αλλάζει κάθε x δευτερόλεπτα το χρώμα (κόκκινο, πράσινο), την ίδια στιγμή που τα LED σας αλλάζουν και το χρώμα. Απαντήστε στις ερωτήσεις στο κάτω μέρος για να ελέγξετε/διορθώσετε τη σειρά των byte.",
"wiz_rgb_intro1": "Αυτός ο βοηθός ρύθμισης θα σας οδηγήσει μέσα από την διαδικασία εύρεσης της σωστής σειράς χρωμάτων των Led σας. Κάντε κλικ στο κουμπί συνέχεια για να ξεκινήσετε.",
"wiz_rgb_intro2": "Πότε χρειάζεται αυτός ο βοηθός ρύθμισης; Παράδειγμα: όταν έχετε θέσει το χρώμα κόκκινο, αλλά εμφανίζει πράσινο ή μπλε. Μπορείτε επίσης να τον χρησιμοποιήσετε για την πρώτη παραμετροποίηση.",
"wiz_rgb_q": "Ποιο χρώμα δείχνουν τα LED σας, όταν η έγχρωμη κουκκίδα παραπάνω δείχνει...",
"wiz_rgb_qgend": "...πράσινο;",
"wiz_rgb_qrend": "...κόκινο;",
"wiz_rgb_switchevery": "Αλάξτε χρώμα κάθε...",
"wiz_rgb_title": "Βοηθός ρύθμισης διάταξης RGB Byte",
"wiz_wizavail": "Βοηθός ρύθμισης διαθέσιμος",
"wiz_yeelight_unsupported": "Μη-υποστηριζόμενο"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,155 +0,0 @@
{
"InfoDialog_access_text": "בהתאם לרמת ההגדרות תוכל להתאים אפשרויות נוספות או לקבל גישה לתכונות נוספות. רמת \"ברירת המחדל\" המומלצת היא.",
"InfoDialog_iswitch_text": "אם אתה מפעיל את Hyperion יותר מפעם אחת ברשת המקומית שלך, תוכל לעבור בין תצורות האינטרנט. בחר את המופע של Hyperion למטה והחלף!",
"InfoDialog_nostorage_text": "הדפדפן שלך אינו תומך ב-localStorage. לא ניתן לשמור הגדרת שפה מסוימת (חזרה ל'זיהוי אוטומטי') ורמת גישה (חזרה ל'ברירת מחדל'). קוסמים מסוימים עשויים להיות מוסתרים. אתה עדיין יכול להשתמש בממשק האינטרנט ללא בעיות נוספות",
"InfoDialog_nowrite_text": "Hyperion לא יכול לכתוב לקובץ התצורה הנטען הנוכחי שלך. אנא תקן את הרשאות הקובץ כדי להמשיך.",
"conf_colors_blackborder_intro": "דלג על פסים שחורים באשר הם. כל מצב משתמש באלגוריתם זיהוי אחר המכוון למצבים מיוחדים. תעלה את הסף אם זה לא עובד לך.",
"conf_colors_color_intro": "צור פרופיל כיול אחד או יותר, התאם כל צבע, בהירות, ליניאריזציה ועוד.",
"conf_colors_smoothing_intro": "החלקה משטחת שינויי צבע/בהירות כדי להפחית הסחת דעת מעצבנת.",
"conf_effect_bgeff_intro": "הגדר אפקט/צבע רקע, המוצג בזמן \"בטלה\" של Hyperion. מתחיל תמיד בערוץ עדיפות 255.",
"conf_effect_fgeff_intro": "הגדר אפקט אתחול או צבע, שיוצג במהלך האתחול של Hyperion למשך הזמן שהוגדר.",
"conf_effect_path_intro": "טען אפקטים מהנתיבים המוגדרים. בנוסף, אתה יכול להשבית אפקטים בודדים לפי שם כדי להסתיר אותם מכל רשימות האפקטים.",
"conf_general_impexp_expbtn": "ייצא",
"conf_general_impexp_impbtn": "ייבא",
"conf_general_impexp_l1": "ייבא הגדרה על ידי בחירת קובץ הגדרות למטה ולחץ על \"ייבוא\".",
"conf_general_impexp_l2": "ייצא הגדרה על ידי בחירת קובץ הגדרות למטה ולחץ על \"ייצוא\".",
"conf_general_impexp_title": "תצורת ייבוא/ייצוא",
"conf_general_intro": "הגדרות בסיסיות סביב Hyperion ו-WebUI שאינן מתאימות לקטגוריה אחרת.",
"conf_general_label_title": "הגדרות כלליות",
"conf_grabber_fg_intro": "לכידת מסך היא לכידת המערכת המקומית שלך כמקור קלט, Hyperion מותקן על.",
"conf_grabber_v4l_intro": "לכידת USB היא התקן (לכידה) המחובר באמצעות USB המשמש להזנת תמונות מקור לעיבוד.",
"conf_helptable_expl": "הֶסבֵּר",
"conf_helptable_option": "אפשרות",
"conf_leds_contr_label_contrtype": "סוג בקר",
"conf_leds_device_intro": "Hyperion תומך בהרבה בקרים להעברת נתונים למכשיר היעד שלך. בחר בקר LED מתוך הרשימה הממוינת והגדר אותו. בחרנו את הגדרות ברירת המחדל הטובות ביותר עבור כל מכשיר.",
"conf_leds_layout_btn_checklist": "הצג רשימת בדיקה",
"conf_leds_layout_checkp1": "ה-LED השחור הוא ה-LED הראשון שלך, LED הראשון הוא הנקודה שבה אתה מזין את אות הנתונים שלך.",
"conf_leds_layout_checkp2": "הפריסה היא תמיד המראה הקדמי של הטלוויזיה שלך, לעולם לא התצוגה האחורית.",
"conf_leds_layout_checkp3": "ודא שהכיוון נכון. הנוריות האפורות מציינות את מספר LED 2 ו-3 כדי להמחיש את כיוון הנתונים.",
"conf_leds_layout_checkp4": "בחר פער: בכדי ליצור פער, התעלם ממנו תחילה כאשר אתה מגדיר עליון/תחתון/שמאל/ימין והגדר לאחר מכן את אורך הפער כדי להסיר כמות לדים. שנה את מיקום הפער עד שיתאים.",
"conf_leds_layout_frame": "פריסה קלאסית (מסגרת LED)",
"conf_leds_layout_generatedconf": "תצורת LED שנוצרה/נוכחית",
"conf_leds_layout_intro": "אתה גם צריך פריסת LED, המשקפת את עמדות LED שלך. הפריסה הקלאסית היא מסגרת הטלוויזיה המשמשת בדרך כלל, אך אנו תומכים גם ביצירת מטריצות LED (קירות LED). התצוגה על פריסה זו היא תמיד מחזית הטלוויזיה שלך.",
"conf_leds_layout_matrix": "פריסת מטריצה (קיר LED)",
"conf_leds_layout_textf1": "שדה טקסט זה מציג כברירת מחדל את הפריסה הנטענת הנוכחית שלך וייחלף אם תיצור פריסה חדשה עם האפשרויות שלמעלה. לחלופין, תוכל לבצע עריכות נוספות.",
"conf_leds_nav_label_ledcontroller": "בקר LED",
"conf_leds_nav_label_ledlayout": "פריסת LED",
"conf_leds_optgroup_network": "רשת",
"conf_logging_label_intro": "אזור לבדיקת הודעות יומן, תראה יותר או פחות מידע בהתאם לרמת הרישום שנקבעה.",
"conf_network_forw_intro": "העבר את כל הקלט להתקנה שנייה של Hyperion שניתן להניע עם בקר LED אחר",
"conf_network_proto_intro": "ה-PROTO-Port של כל המופעים של Hyperion, המשמש עבור זרמי תמונות (HyperionScreenCap, Kodi Addon, Android Hyperion Grabber, ...)",
"dashboard_alert_message_confedit": "תצורת ה-Hyperion שלך שונתה. כדי להחיל אותו, הפעל מחדש את Hyperion.",
"dashboard_alert_message_confedit_t": "התצורה השתנתה",
"dashboard_alert_message_confsave_success": "תצורת ה-Hyperion שלך נשמרה בהצלחה. השינויים שלך פעילים כעת.",
"dashboard_alert_message_confsave_success_t": "התצורה נשמרה",
"dashboard_componentbox_label_comp": "רְכִיב",
"dashboard_componentbox_label_status": "מצב",
"dashboard_componentbox_label_title": "מצב הרכיבים",
"dashboard_infobox_label_currenthyp": "גרסת ה-Hyperion שלך:",
"dashboard_infobox_label_instance": "למשל:",
"dashboard_infobox_label_latesthyp": "הגרסה האחרונה של Hyperion:",
"dashboard_infobox_label_platform": "פלטפורמה:",
"dashboard_infobox_label_ports": "יציאות",
"dashboard_infobox_label_smartacc": "גישה חכמה",
"dashboard_infobox_label_statush": "מצב ה-Hyperion:",
"dashboard_infobox_label_title": "מידע",
"dashboard_infobox_message_updatesuccess": "הינך מריץ את הגרסה האחרונה של Hyperion.",
"dashboard_infobox_message_updatewarning": "גרסה חדשה יותר של Hyperion זמינה! ($1)",
"dashboard_label_intro": "לוח המחוונים נותן לך סקירה מהירה על מצב ה- Hyperion",
"dashboard_newsbox_label_title": "בלוג ה-Hyperion",
"dashboard_newsbox_noconn": "לא ניתן להתחבר לשרת Hyperion כדי לאחזר את הפוסטים האחרונים, האם חיבור האינטרנט שלך תקין?",
"dashboard_newsbox_readmore": "קרא עוד",
"dashboard_newsbox_visitblog": "בקר ב-Hyperion בלוג ",
"edt_conf_color_brightnessComp_expl": "מפצה על הבדלי בהירות בין אדום ירוק כחול, ציאן מגנטה צהוב ולבן. 100 פירושו פיצוי מלא, 0 אין פיצוי",
"edt_conf_color_channelAdjustment_header_expl": "צור פרופילי צבע שניתן להקצות לרכיב מסוים. התאם צבע, גמא, בהירות, פיצוי ועוד.",
"edt_conf_v4l2_fpsSoftwareDecimation_expl": "כדי לחסוך במשאבים כל מסגרת n' תעובד בלבד. למשל. אם ה-grabber מוגדר ל-30fps עם אפשרות זו מוגדרת ל-5, התוצאה הסופית תהיה בסביבות 6fps",
"edt_conf_v4l2_signalDetection_expl": "אם מופעל, לכידת USB תושבת זמנית כאשר לא נמצא אות. זה יקרה כאשר התמונה תרד מתחת לערך הסף למשך תקופה של 4 שניות.",
"effectsconfigurator_label_intro": "צור מתוך האפקטים הבסיסיים אפקטים חדשים המותאמים לטעמך. בהתאם לאפקט יש אפשרויות כמו צבע, מהירות, כיוון ועוד.",
"general_access_advanced": "מתקדם",
"general_access_default": "ברירת מחדל",
"general_access_expert": "מומחה",
"general_btn_back": "חזור",
"general_btn_cancel": "בטל",
"general_btn_continue": "המשך",
"general_btn_iswitch": "החלף",
"general_btn_next": "הבא",
"general_btn_off": "כיבוי",
"general_btn_ok": "בסדר",
"general_btn_on": "הדלקה",
"general_btn_restarthyperion": "הפעל מחדש את Hyperion",
"general_btn_save": "שמור",
"general_btn_saveandreload": "שמור וטען מחדש",
"general_btn_yes": "כן",
"general_button_savesettings": "שמור הגדרות",
"general_col_blue": "כחול",
"general_col_green": "ירוק",
"general_col_red": "אדום",
"general_comp_BLACKBORDER": "Blackbar זיהוי",
"general_comp_BOBLIGHTSERVER": "שרת Boblight",
"general_comp_FLATBUFSERVER": "שרת ",
"general_comp_FORWARDER": "שילוח",
"general_comp_GRABBER": "לכידת מסך",
"general_comp_LEDDEVICE": "פלט LED",
"general_comp_PROTOSERVER": "שרת מאגר פרוטוקול",
"general_comp_SMOOTHING": "חלק",
"general_comp_V4L": "לכידת כניסת USB",
"general_country_de": "גרמניה",
"general_country_es": "ספרד",
"general_country_fr": "צרפת",
"general_country_it": "איטליה",
"general_country_nl": "הולנד",
"general_country_uk": "בריטניה",
"general_country_us": "ארצות הברית",
"general_speech_cs": "צ'כית",
"general_speech_de": "גרמנית",
"general_speech_en": "אנגלית",
"general_speech_es": "ספרדית",
"general_speech_it": "איטלקית",
"general_webui_title": "Hyperion - תצורת אינטרנט",
"general_wiki_moreto": "מידע נוסף על \"$1\" בוויקי שלנו",
"info_restart_contus": "אם אתה עדיין משוטט כאן לאחר 20 שניות ואין לך מושג למה, בבקשה פתח נושא חדש בפורום התמיכה שלנו...",
"main_ledsim_btn_togglelednumber": "מספר נורות LED",
"main_ledsim_btn_toggleleds": "הצג אורות",
"main_ledsim_btn_togglelivevideo": "וידאו חי",
"main_ledsim_text": "הדמיה חיה של צבעי LED ואפשרות הזרמת הווידאו הנוכחי של מכשיר הלכידה שלך.",
"main_ledsim_title": "חזותיות LED",
"main_menu_about_token": "אודות Hyperion",
"main_menu_colors_conf_token": "עיבוד תמונה",
"main_menu_dashboard_token": "לוּחַ מַחווָנִים",
"main_menu_effect_conf_token": "אפקטים",
"main_menu_effectsconfigurator_token": "הגדרת אפקטים",
"main_menu_general_conf_token": "כללי",
"main_menu_grabber_conf_token": "לכידת חומרה",
"main_menu_input_selection_token": "בחירת קלט",
"main_menu_leds_conf_token": "יצאת LED",
"main_menu_network_conf_token": "שירותי אינטרנט",
"main_menu_remotecontrol_token": "שלט רחוק",
"main_menu_support_token": "תמיכה",
"main_menu_system_token": "מערכת",
"main_menu_update_token": "עדכון",
"main_menu_webconfig_token": "תצורת אינטרנט",
"remote_input_intro": "Hyperion משתמש במערכת עדיפות לבחירת מקור. לכל מה שתגדירו יש עדיפות (אפקט/צבע/צילום מסך/לכידת USB ומקורות רשת). כברירת מחדל, Hyperion בוחר מקורות בהתאם לעדיפות (המספר הנמוך ביותר משקף את המקור הפעיל הנוכחי). כעת יש לך הזדמנות לבחור מקורות בעצמך. $1",
"support_label_intro": "Hyperion היא תוכנה חינמית ללא מטרות רווח. צוות קטן עובד על זה וזו הסיבה שאנחנו צריכים את התמיכה הקבועה שלכם.",
"update_label_intro": "סקירה כללית על כל גרסאות Hyperion הזמינות. בנוסף, תוכל לעדכן או לשדרג לאחור את הגרסה שלך של Hyperion מתי שתרצה. ממוין מהחדש להכי ישן",
"wiz_atmoorb_desc2": "כעת בחר אילו כדורים יש להוסיף. המיקום מקצה את המנורה למיקום מסוים ב\"תמונה\" שלך. מנורות מושבתות לא יתווספו. לזיהוי מנורות בודדות לחץ על הכפתור בצד ימין.",
"wiz_atmoorb_intro1": "אשף זה מגדיר את Hyperion עבור AtmoOrbs. התכונות הן הזיהוי האוטומטי של AtmoOrb, הגדרת כל אור למיקום ספציפי בתמונה שלך או השבתה וביצוע אופטימיזציה של הגדרות Hyperion באופן אוטומטי! אז בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!",
"wiz_cc_adjustgamma": "גמא: מה שאתה צריך לעשות הוא, להתאים את רמות הגמא של כל ערוץ עד שתהיה לך אותה כמות נתפסת של כל ערוץ. רמז: ניטרלי הוא 1.0! לדוגמה, אם האפור שלך קצת אדמדם, זה אומר שאתה צריך להגדיל את הגמא האדום כדי להפחית את כמות האדום (ככל שיותר גמא, כך פחות צבע).",
"wiz_cc_adjustit": "התאם את ה-\"$1\" שלך עד שתסתדר עם זה. שימו לב: ככל שתתרחקו מערך ברירת המחדל, ספקטרום הצבעים יהיה מוגבל (גם עבור כל הצבעים שביניהם). תלוי בקול הטלוויזיה/LED",
"wiz_cc_backlight": "בנוסף, אתה יכול להגדיר תאורה אחורית כדי למיין \"צבעים רעים\" באזורים כמעט כהים או אם אתה לא אוהב את המעבר בין צבע לכבוי במהלך הצפייה. בנוסף אתה יכול להגדיר אם צריך להיות בו קצת צבע או רק לבן. זה מושבת במצב \"כבוי\", \"צבע\" ו\"אפקט\".",
"wiz_cc_intro1": "אשף זה ידריך אותך בכיול ה-LED שלך. אם אתה משתמש בקודי, ניתן לשלוח את תמונות הכיול וסרטוני הווידאו ישירות אליו. תנאי מוקדם: עליך להפעיל את \"אפשר שליטה מרחוק מיישומים במערכות אחרות\" בקודי.<br />לחלופין, ייתכן שתרצה להוריד את הקבצים האלה בעצמך ולהציג אותם כשהאשף יבקש ממך להתאים את ההגדרה.",
"wiz_cc_kodidiscon": "Kodi לא נמצא, המשך ללא תמיכת Kodi (אנא בדוק אם שלט רחוק על ידי מערכות אחרות מופעלת).",
"wiz_cc_summary": "מסקנה של ההגדרות שלך. במהלך הפעלת וידאו, תוכל לשנות או לבדוק שוב ערכים. אם סיימת, לחץ על שמור.",
"wiz_cololight_intro1": "אשף זה מגדיר את Hyperion עבור מערכת Cololight. התכונות הן הזיהוי האוטומטי של Cololight וכוונון את הגדרות Hyperion באופן אוטומטי! בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!<br />הערה: במקרה של Cololight Strip, ייתכן שיהיה עליך לתקן ידנית את ספירת ה-LED ואת הפריסה.",
"wiz_hue_desc1": "1. Hyperion מחפש אוטומטית עבור Hue-Bridge, במקרה שהוא לא יכול למצוא אחד, עליך לספק את שם המארח או כתובת ה-IP וללחוץ על כפתור הטעינה מחדש. \n2. ספק מזהה משתמש, אם אין לך צור אחד חדש.",
"wiz_hue_desc2": "3. כעת בחרו אילו מנורות יש להוסיף. המיקום מקצה את המנורה למיקום מסוים ב\"תמונה\" שלך. מנורות מושבתות לא יתווספו. לזיהוי מנורות בודדות לחץ על הכפתור בצד ימין",
"wiz_hue_e_desc1": "1. Hyperion מחפש אוטומטית עבור Hue-Bridge, במקרה שהוא לא יכול למצוא אחד, עליך לספק את שם המארח או כתובת ה-IP וללחוץ על כפתור הטעינה מחדש. <br>2. ספק מזהה משתמש ומפתח הלקוח, אם אין לך את שניהם, צור חדשים.",
"wiz_hue_e_desc3": "4. בחר באיזה מיקום המנורה המתאימה צריכה להיות \"בתמונה\". בחירה מראש של העמדה נעשתה בהתבסס על המיקומים המוגדרים של האורות בקבוצת הבידור. זו רק המלצה וניתן להתאים אישית לפי הרצון. לכן אתה יכול להדגיש אותם בקצרה על ידי לחיצה על הכפתור הימני כדי לשפר את הבחירה.",
"wiz_hue_e_intro1": "אשף זה מגדיר את Hyperion עבור מערכת Philips Hue Entertainment הידועה. התכונות הן: זיהוי אוטומטי של Hue Bridge, יצירת מפתחות משתמש ולקוח, בחירת קבוצת בידור, הגדרת אורות קבוצה למיקום ספציפי בתמונה שלך ואופטימיזציה של הגדרות Hyperion באופן אוטומטי! אז בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!",
"wiz_hue_failure_user": "המשתמש לא נמצא, צור אחד חדש עם הכפתור למטה או הזן מזהה משתמש חוקי ולחץ על הסמל \"טען מחדש\".",
"wiz_hue_intro1": "אשף זה מגדיר את Hyperion עבור מערכת Philips Hue הידועה. התכונות הן זיהוי אוטומטי של Hue Bridge, יצירת משתמש, הגדר כל אור גוון למיקום מסוים בתמונה שלך או השבת אותו וכוונו את הגדרות Hyperion באופן אוטומטי! אז בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!",
"wiz_rgb_expl": "נקודת הצבע מחליפה כל x שניות את הצבע (אדום, ירוק), ובאותו הזמן גם נוריות ה-LED שלך מחליפות את הצבע. ענה על השאלות בתחתית כדי לבדוק/לתקן את סדר הביטים שלך.",
"wiz_rgb_intro1": "אשף זה ידריך אותך בתהליך מציאת סדר הצבעים הנכון עבור הלדים שלך. לחץ על המשך כדי להתחיל.",
"wiz_rgb_intro2": "מתי אתה צריך את האשף הזה? דוגמה: אתה קובע את הצבע האדום, אבל אתה מקבל ירוק או כחול. אתה יכול גם להשתמש בו עבור תצורה ראשונה.",
"wiz_yeelight_desc2": "כעת בחר אילו מנורות יש להוסיף. המיקום מקצה את המנורה למיקום מסוים ב\"תמונה\" שלך. מנורות מושבתות לא יתווספו. לזיהוי מנורות בודדות לחץ על הכפתור בצד ימין.",
"wiz_yeelight_intro1": "אשף זה מגדיר את Hyperion עבור מערכת Yeelight. התכונות הן הזיהוי האוטומטי של Yeelighs, הגדרת כל אור למיקום מסוים בתמונה שלך או להשבית אותו ולכוון את הגדרות Hyperion באופן אוטומטי! אז בקיצור: כל מה שאתה צריך זה כמה קליקים וסיימת!"
}

File diff suppressed because it is too large Load Diff

View File

@ -1,266 +0,0 @@
{
"conf_colors_blackborder_intro": "Lewati bar hitam di mana pun mereka berada. Setiap mode menggunakan algoritme pendeteksian lain yang disetel untuk situasi khusus. Tinggikan ambang batas jika tidak berhasil untuk Anda.",
"conf_colors_color_intro": "Buat satu atau beberapa profil kalibrasi, sesuaikan setiap warna, kecerahan, linearisasi, dan lainnya.",
"conf_colors_smoothing_intro": "Smoothing meratakan perubahan warna/kecerahan untuk mengurangi gangguan yang mengganggu.",
"conf_effect_bgeff_intro": "Menentukan efek/warna latar belakang, yang ditampilkan selama Hyperion \"idle\". Selalu dimulai dengan channel prioritas 255.",
"conf_effect_fgeff_intro": "Tentukan efek boot atau warna, yang ditampilkan sewaktu Hyperion dinyalakan selama durasi yang ditentukan.",
"conf_effect_path_intro": "Memuat efek dari jalur yang ditentukan. Tambahan Anda dapat menonaktifkan efek tunggal berdasarkan nama untuk menyembunyikannya dari semua daftar efek.",
"conf_general_impexp_expbtn": "Ekspor",
"conf_general_impexp_impbtn": "Impor",
"conf_general_impexp_l1": "Impor konfigurasi dengan memilih file konfigurasi di bawah ini dan klik \"Impor\".",
"conf_general_impexp_l2": "Ekspor konfigurasi dengan mengklik \"Ekspor\". Peramban Anda akan memulai pengunduhan.",
"conf_general_impexp_title": "Konfigurasi Impor/Ekspor",
"conf_general_intro": "Pengaturan dasar di sekitar Hyperion dan WebUI yang tidak sesuai dengan kategori lain.",
"conf_general_label_title": "Pengaturan Umum",
"conf_grabber_fg_intro": "Screen capture adalah tangkapan layar sistem lokal Anda sebagai sumber input, tempat Hyperion diinstal.",
"conf_grabber_v4l_intro": "USB capture adalah perangkat (capture) yang terhubung melalui USB yang digunakan untuk memasukkan gambar sumber untuk diproses.",
"conf_helptable_expl": "Penjelasan",
"conf_helptable_option": "Opsi",
"conf_leds_contr_label_contrtype": "Tipe kontroler:",
"conf_leds_device_intro": "Hyperion mendukung banyak kontroler untuk mengirimkan data ke perangkat target Anda. Pilih kontroler LED dari daftar yang sudah diurutkan dan di konfigurasikan. Kami telah memilih pengaturan default terbaik untuk setiap perangkat.",
"conf_leds_layout_advanced": "Pengaturan Tingkat Lanjut",
"conf_leds_layout_btn_checklist": "Tampilkan checklist",
"conf_leds_layout_button_savelay": "Simpan Layout",
"conf_leds_layout_button_updsim": "Perbarui Preview",
"conf_leds_layout_checkp1": "LED hitam adalah LED pertama Anda, LED pertama adalah titik di mana Anda memasukkan sinyal data Anda.",
"conf_leds_layout_checkp2": "Layout ini selalu tampak dari depan TV Anda, tidak pernah dari belakang.",
"conf_leds_layout_checkp3": "Pastikan arahnya sudah benar. LED abu-abu menunjukkan LED nomor 2 dan 3 untuk memvisualisasikan arah data.",
"conf_leds_layout_checkp4": "Gap: Untuk membuat gap, abaikan terlebih dulu ketika Anda menentukan Atas/Bawah/Kiri/Kanan, kemudian tetapkan panjang gap Anda untuk menghilangkan sejumlah led. Ubah posisi gap sampai sesuai.",
"conf_leds_layout_cl_bottom": " Bawah",
"conf_leds_layout_cl_cornergap": "Gap Sudut",
"conf_leds_layout_cl_edgegap": "Gap Tepi",
"conf_leds_layout_cl_gaglength": "Panjang gap",
"conf_leds_layout_cl_gappos": "posisi gap",
"conf_leds_layout_cl_hleddepth": "Kedalaman LED horizontal",
"conf_leds_layout_cl_inppos": "Posisi input",
"conf_leds_layout_cl_left": "Kiri",
"conf_leds_layout_cl_overlap": "Overlap",
"conf_leds_layout_cl_reversdir": "Membalikkan arah",
"conf_leds_layout_cl_right": "Kanan",
"conf_leds_layout_cl_top": "Atas",
"conf_leds_layout_cl_vleddepth": "Kedalaman LED vertikal",
"conf_leds_layout_frame": "Layout Klasik (Bingkai LED)",
"conf_leds_layout_generatedconf": "Konfigurasi LED yang Dihasilkan/Saat Ini",
"conf_leds_layout_intro": "Anda juga memerlukan tata letak LED, yang mencerminkan posisi LED Anda. Layout klasik yang biasanya dipakai adalah bingkai TV, tetapi kami juga mendukung pembuatan matriks LED (LED Walls). Tampilan pada tata letak ini SELALU dari DEPAN TV Anda.",
"conf_leds_layout_ma_cabling": "Pengkabelan",
"conf_leds_layout_ma_horiz": "Horisontal",
"conf_leds_layout_ma_optbottomleft": "Kiri bawah",
"conf_leds_layout_ma_optbottomright": "Kanan bawah",
"conf_leds_layout_ma_opthoriz": "Horisontal",
"conf_leds_layout_ma_optparallel": "Paralel",
"conf_leds_layout_ma_optsnake": "Snake",
"conf_leds_layout_ma_opttopleft": "Kiri Atas",
"conf_leds_layout_ma_opttopright": "Kanan atas",
"conf_leds_layout_ma_optvert": "Vertikal",
"conf_leds_layout_ma_order": "Order",
"conf_leds_layout_ma_position": "Input",
"conf_leds_layout_ma_vert": "Vertikal",
"conf_leds_layout_matrix": "Layout Matriks (Dinding LED)",
"conf_leds_layout_peview": "Preview Layout LED",
"conf_leds_layout_preview_l1": "Ini adalah LED pertama Anda (posisi input)",
"conf_leds_layout_preview_l2": "Ini memvisualisasikan arah data (LED kedua/ketiga)",
"conf_leds_layout_preview_ledpower": "Maks. konsumsi daya: $1 A",
"conf_leds_layout_preview_originCL": "Dibuat dari: Layout Klasik (Bingkai LED)",
"conf_leds_layout_preview_originMA": "Dibuat dari: Layout Matriks (Dinding LED)",
"conf_leds_layout_preview_originTEXT": "Dibuat dari: Textfield",
"conf_leds_layout_preview_totalleds": "Total LED: $1",
"conf_leds_layout_ptlh": "Horisontal",
"conf_leds_layout_ptlv": "Vertikal",
"conf_leds_layout_textf1": "Kolom teks ini menunjukkan secara default layout yang dimuat saat ini dan akan ditimpa jika Anda membuat layout baru dengan opsi-opsi di atas. Secara opsional, Anda dapat melakukan pengeditan lebih lanjut.",
"conf_leds_nav_label_ledcontroller": "Kontroler LED",
"conf_leds_nav_label_ledlayout": "Tata Letak LED",
"conf_leds_optgroup_RPiGPIO": "RPi GPIO",
"conf_leds_optgroup_RPiPWM": "RPi PWM",
"conf_leds_optgroup_RPiSPI": "RPi SPI",
"conf_leds_optgroup_network": "Jaringan",
"conf_leds_optgroup_usb": "USB/Serial",
"conf_logging_btn_autoscroll": "Scrolling otomatis",
"conf_logging_btn_pbupload": "Unggah laporan untuk permintaan dukungan",
"conf_logging_contpolicy": "Report Privacy Policy",
"conf_logging_label_intro": "Area untuk memeriksa pesan log, Anda akan melihat lebih banyak atau lebih sedikit informasi tergantung pada tingkat logging yang ditetapkan.",
"conf_logging_lastreports": "Laporan sebelumnya",
"conf_logging_nomessage": "Tidak ada pesan log yang tersedia.",
"conf_logging_report": "Laporan",
"conf_logging_uplfailed": "Gagal mengunggah! Silakan periksa koneksi internet Anda!",
"conf_logging_uploading": "Menyiapkan data...",
"conf_logging_uplpolicy": "Dengan mengklik tombol ini, Anda menyetujui",
"conf_logging_yourlink": "Tautan ke laporan Anda",
"conf_network_bobl_intro": "Receiver untuk Boblight",
"conf_network_fbs_intro": "Receiver Google Flatbuffers. Digunakan untuk transmisi gambar yang cepat.",
"conf_network_forw_intro": "Meneruskan semua input ke instalasi Hyperion kedua yang dapat dikendalikan dengan kontroler LED lain",
"conf_network_json_intro": "JSON-RPC-Port dari semua instance Hyperion, yang digunakan untuk kontrol jarak jauh.",
"conf_network_proto_intro": "PROTO-Port dari semua contoh Hyperion, digunakan untuk streaming gambar (HyperionScreenCap, Kodi Addon, Android Hyperion Grabber, ...)",
"conf_webconfig_label_intro": "Pengaturan konfigurasi web. Edit dengan bijak.",
"dashboard_alert_message_confedit": "Konfigurasi Hyperion Anda telah dimodifikasi. Untuk menerapkannya, mulai ulang Hyperion.",
"dashboard_alert_message_confedit_t": "Konfigurasi yang dimodifikasi",
"dashboard_alert_message_confsave_success": "Konfigurasi Hyperion Anda telah berhasil disimpan. Perubahan yang Anda buat sekarang sudah aktif.",
"dashboard_alert_message_confsave_success_t": "Konfigurasi disimpan",
"dashboard_alert_message_disabled": "Instance ini saat ini dinonaktifkan! Untuk menggunakannya lagi, aktifkan di dasbor.",
"dashboard_alert_message_disabled_t": "perangkat keras LED dinonaktifkan",
"dashboard_componentbox_label_comp": "Komponen",
"dashboard_componentbox_label_status": "Status",
"dashboard_componentbox_label_title": "Status komponen",
"dashboard_infobox_label_currenthyp": "Versi Hyperion Anda:",
"dashboard_infobox_label_disableh": "Matikan Instance: $1",
"dashboard_infobox_label_enableh": "Aktifkan Instance: $1",
"dashboard_infobox_label_instance": "Instance:",
"dashboard_infobox_label_latesthyp": "Versi Hyperion Terbaru:",
"dashboard_infobox_label_platform": "Platform:",
"dashboard_infobox_label_ports": "Ports",
"dashboard_infobox_label_smartacc": "Akses Cerdas",
"dashboard_infobox_label_statush": "Status Hyperion:",
"dashboard_infobox_label_title": "Information",
"dashboard_infobox_message_updatesuccess": "Anda menjalankan Hyperion versi terbaru.",
"dashboard_infobox_message_updatewarning": "Versi terbaru dari Hyperion telah tersedia! ($1)",
"dashboard_label_intro": "Dasbor memberi Anda gambaran umum singkat tentang status Hyperion",
"dashboard_newsbox_label_title": "Hyperion-Blog",
"dashboard_newsbox_noconn": "Tidak dapat terhubung ke Server Hyperion untuk mengambil postingan terbaru, apakah koneksi internet Anda berfungsi?",
"dashboard_newsbox_readmore": "Baca lebih lanjut",
"dashboard_newsbox_visitblog": "Kunjungi Hyperion-Blog",
"edt_conf_bobls_heading_title": "Server Boblight",
"edt_conf_color_blue_title": "Biru",
"edt_conf_color_green_title": "Hijau",
"edt_conf_color_red_title": "Merah",
"edt_conf_enum_HORIZONTAL": "Horisontal",
"edt_conf_enum_VERTICAL": "Vertikal",
"edt_conf_enum_bbdefault": "bawaan",
"edt_conf_fbs_heading_title": "Server Flatbuffer",
"edt_conf_fg_type_title": "Tipe",
"edt_conf_fge_type_title": "Tipe",
"edt_conf_fw_heading_title": "Forwarder",
"edt_conf_gen_heading_title": "Pengaturan Umum",
"edt_conf_net_heading_title": "Jaringan",
"edt_conf_pbs_heading_title": "Server Buffer Protokol",
"edt_conf_smooth_heading_title": "Menghaluskan",
"edt_conf_smooth_type_title": "Tipe",
"edt_conf_v4l2_heading_title": "Capture USB-Input",
"edt_conf_v4l2_input_title": "Input",
"edt_conf_webc_heading_title": "Konfigurasi Web",
"edt_dev_general_heading_title": "Pengaturan Umum",
"edt_eff_reversedirection": "Membalikkan arah",
"edt_eff_snake_header": "Snake",
"effectsconfigurator_button_conttest": "Tes terus menerus",
"effectsconfigurator_button_deleffect": "Hapus Efek",
"effectsconfigurator_button_editeffect": "Load Effect",
"effectsconfigurator_button_saveeffect": "Simpan Efek",
"effectsconfigurator_button_starttest": "Mulai tes",
"effectsconfigurator_button_stoptest": "Hentikan tes",
"effectsconfigurator_editdeleff": "Menghapus/Memuat Efek",
"effectsconfigurator_label_chooseeff": "Pilih Template",
"effectsconfigurator_label_effectname": "Nama efek",
"effectsconfigurator_label_intro": "Menciptakan efek baru dari efek dasar yang disesuaikan dengan keinginan Anda. Tergantung pada Efek, tersedia opsi seperti warna, kecepatan, arah dan lainnya.",
"general_access_advanced": "Tingkat lanjut",
"general_access_default": "bawaan",
"general_access_expert": "Ahli",
"general_btn_back": "Kembali",
"general_btn_cancel": "Batal",
"general_btn_continue": "Lanjut",
"general_btn_iswitch": "Saklar",
"general_btn_next": "Berikutnya",
"general_btn_off": "Mati",
"general_btn_ok": "OK",
"general_btn_on": "Hidup",
"general_btn_restarthyperion": "Muat Ulang Hyperion",
"general_btn_save": "Simpan",
"general_btn_saveandreload": "Simpan dan Muat Ulang",
"general_btn_yes": "Iya",
"general_button_savesettings": "Simpan Pengaturan",
"general_col_blue": "Biru",
"general_col_green": "Hijau",
"general_col_red": "Merah",
"general_comp_BLACKBORDER": "Pendeteksi Blackbar",
"general_comp_BOBLIGHTSERVER": "Server Boblight",
"general_comp_FLATBUFSERVER": "Server Flatbuffer",
"general_comp_FORWARDER": "Forwarder",
"general_comp_GRABBER": "Capture Screen",
"general_comp_LEDDEVICE": "Output LED",
"general_comp_PROTOSERVER": "Server Buffer Protokol",
"general_comp_SMOOTHING": "Menghaluskan",
"general_comp_V4L": "Capture USB-Input",
"general_country_de": "German",
"general_country_es": "Spanyol",
"general_country_fr": "Prancis",
"general_country_it": "Itali",
"general_country_nl": "Belanda",
"general_country_uk": "Inggris",
"general_country_us": "Amerika Serikat",
"general_speech_cs": "Ceko",
"general_speech_de": "German",
"general_speech_en": "Inggris",
"general_speech_es": "Spanyol",
"general_speech_it": "Itali",
"general_webui_title": "Hyperion - Konfigurasi Web",
"general_wiki_moreto": "Informasi lebih lanjut tentang \"$1\" di Wiki kami",
"main_ledsim_btn_togglelednumber": "Nomor LED",
"main_ledsim_btn_toggleleds": "Tampilkan LED",
"main_ledsim_btn_togglelivevideo": "Vidio Langsung",
"main_ledsim_text": "Visualisasi langsung warna LED dan opsional stream video saat ini dari capture card Anda.",
"main_ledsim_title": "Visualisasi LED",
"main_menu_about_token": "Tentang Hyperion",
"main_menu_colors_conf_token": "Pemrosesan Gambar",
"main_menu_configuration_token": "Instance LED",
"main_menu_dashboard_token": "Dashboard",
"main_menu_effect_conf_token": "Efek",
"main_menu_effectsconfigurator_token": "Konfigurator Efek",
"main_menu_general_conf_token": "Umum",
"main_menu_grabber_conf_token": "Capturing Hardware",
"main_menu_input_selection_token": "Pilihan Input",
"main_menu_leds_conf_token": "Output LED",
"main_menu_logging_token": "Log",
"main_menu_network_conf_token": "Layanan Jaringan",
"main_menu_remotecontrol_token": "Remote Kontrol",
"main_menu_support_token": "Dukungan",
"main_menu_system_token": "Sistem",
"main_menu_update_token": "Perbarui",
"main_menu_webconfig_token": "Konfigurasi Web",
"remote_adjustment_intro": "Memodifikasi warna/kecerahan/kompensasi pada saat runtime. $1",
"remote_adjustment_label": "Penyesuaian warna",
"remote_color_button_reset": "Reset Warna/Efek",
"remote_color_intro": "Menetapkan efek atau warna. Dan juga, efek yang Anda ciptakan sendiri, juga dicantumkan (jika tersedia). $1",
"remote_color_label": "Warna/Efek",
"remote_color_label_color": "Warna:",
"remote_components_intro": "Mengaktifkan dan menonaktifkan komponen Hyperion selama waktu berjalan. $1",
"remote_components_label": "Kontrol komponen",
"remote_effects_label_effects": "Efek:",
"remote_input_clearall": "Menghapus semua Efek/Warna",
"remote_input_duration": "Durasi:",
"remote_input_intro": "Hyperion menggunakan sistem prioritas untuk memilih source. Semua yang Anda tetapkan memiliki prioritas (Efek/Warna/Tangkapan layar/tangkapan USB dan sumber jaringan). Secara default, Hyperion memilih sumber tergantung pada prioritas (angka terendah mencerminkan sumber yang aktif saat ini). Sekarang Anda memiliki kesempatan untuk memilih sumber sendiri. $1",
"remote_input_ip": "IP:",
"remote_input_label": "Pemilihan Source",
"remote_input_label_autoselect": "Pilihan Otomatis",
"remote_input_origin": "Asal",
"remote_input_owner": "Tipe",
"remote_input_priority": "Priority",
"remote_input_setsource_btn": "Pilih Source",
"remote_input_sourceactiv_btn": "Source aktif",
"remote_input_status": "Status/Tindakan",
"remote_losthint": "Catatan: Semua perubahan akan hilang setelah restart.",
"remote_maptype_intro": "Biasanya tata-letak LED menentukan LED mana yang mencakup area gambar tertentu. Anda dapat mengubahnya di sini: $1.",
"remote_maptype_label": "Jenis pemetaan",
"remote_maptype_label_multicolor_mean": "Berarti Warna Sederhana",
"remote_maptype_label_unicolor_mean": "Berarti Gambar Berwarna",
"remote_optgroup_syseffets": "Efek Sistem",
"remote_optgroup_usreffets": "Efek Pengguna",
"remote_videoMode_2D": "2D",
"remote_videoMode_3DSBS": "3DSBS",
"remote_videoMode_3DTAB": "3DTAB",
"remote_videoMode_intro": "Beralih di antara mode video yang berbeda untuk menikmati film 3D! Semua perangkat perekaman didukung. $1",
"remote_videoMode_label": "Mode video",
"support_label_affinstr1": "Klik tautan yang sesuai dengan negara Anda",
"support_label_affinstr2": "Semua yang Anda beli (apa pun itu), kami akan mendapatkan sedikit biaya berdasarkan turnover Anda",
"support_label_affinstr3": "Anda SELALU membayar dengan harga yang sama, sama sekali tidak ada perbedaan. Cobalah!",
"support_label_btctext": "Alamat:",
"support_label_donate": "Donasi atau gunakan tautan afiliasi kami",
"support_label_donationpp": "Donasi:",
"support_label_fbtext": "Bagikan halaman Facebook Hyperion kami dan dapatkan pemberitahuan ketika pembaruan baru dirilis",
"support_label_ggtext": "Circle us on Google +!",
"support_label_igtext": "Kunjungi kami di Instagram untuk melihat foto-foto Hyperion terbaru!",
"support_label_intro": "Hyperion adalah sebuah software gratis non-profit. Dikembangkan dengan tim yang kecil dan karena itulah kami membutuhkan dukungan Anda.",
"support_label_spreadtheword": "Sebarkan berita",
"support_label_title": "Dukung Hyperion",
"support_label_twtext": "Bagikan dan ikuti di Twitter, selalu dapatkan informasi terbaru tentang perkembangan Hyperion",
"support_label_webpagetext": "Rumah dari Hyperion",
"support_label_webpagetitle": "Halaman web",
"support_label_webrestitle": "Sumber daya informasi dan bantuan",
"support_label_yttext": "Bosan dengan gambar? Lihat saluran YouTube kami!"
}

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More