From 5e1398a7e5b82dadef5e83643e577f077ad08077 Mon Sep 17 00:00:00 2001 From: Paulchen-Panther Date: Sat, 15 Jun 2019 15:46:56 +0200 Subject: [PATCH 01/15] Release preparation OSX packaging is currently broken. CPack is now called individually so that the make process is no longer displayed incorrectly in Travis / Azure. The variable PACKAGES in the build script is no longer overwritten, so in travis / Azure you can globally assign the variable and start a package build process manually. Signed-off-by: Paulchen-Panther --- .azure.yml | 24 ++++++++++++++++++++---- .ci/ci_build.sh | 7 +++++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/.azure.yml b/.azure.yml index 74604fea..a7a19c96 100644 --- a/.azure.yml +++ b/.azure.yml @@ -31,8 +31,16 @@ jobs: DOCKER_TAG: $(dockerTag) DOCKER_NAME: $(dockerName) PLATFORM: $(platform) - - bash: ./.ci/ci_deploy.sh - displayName: 'Upload $(dockerName)' + - task: CopyFiles@2 + displayName: 'Copy Files' + inputs: + contents: '**/deploy/**' + TargetFolder: '$(Build.ArtifactStagingDirectory)' + - task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact: $(dockerName)' + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: $(dockerTag) - job: macOS pool: @@ -44,5 +52,13 @@ jobs: displayName: 'Install dependencies' - bash: ./.ci/ci_build.sh displayName: 'Build macOS 10.13' - - bash: ./.ci/ci_deploy.sh - displayName: 'Upload macOS 10.13' + - task: CopyFiles@2 + displayName: 'Copy Files' + inputs: + contents: '**/deploy/**' + TargetFolder: '$(Build.ArtifactStagingDirectory)' + - task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact: macOS 10.13' + inputs: + pathtoPublish: '$(Build.ArtifactStagingDirectory)' + artifactName: 'macOS' diff --git a/.ci/ci_build.sh b/.ci/ci_build.sh index 016dae6e..5e53f1e5 100755 --- a/.ci/ci_build.sh +++ b/.ci/ci_build.sh @@ -16,7 +16,7 @@ fi # set environment variables BUILD_TYPE="Debug" -PACKAGES="" +[ -z "${PACKAGES}" ] && PACKAGES="" [ -z "${PLATFORM}" ] && PLATFORM="x11" # Detect number of processor cores @@ -50,7 +50,10 @@ if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then mkdir ${CI_BUILD_DIR}/deploy || exit 1 cd build cmake -DPLATFORM=$PLATFORM -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=/usr .. || exit 2 - make -j ${JOBS} ${PACKAGES} || exit 3 + make -j ${JOBS} || exit 3 + if [[ "$PACKAGES" == 'package' ]]; then + sudo cpack + fi echo "---> Copy binaries and packages to folder: ${CI_BUILD_DIR}/deploy" cp -v ${CI_BUILD_DIR}/build/bin/h* ${CI_BUILD_DIR}/deploy/ 2>/dev/null || : && cp -v ${CI_BUILD_DIR}/build/Hyperion-* ${CI_BUILD_DIR}/deploy/ 2>/dev/null || : && From c7922b2fd4a077de2b0df60760c109134fd9afd9 Mon Sep 17 00:00:00 2001 From: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com> Date: Sun, 16 Jun 2019 09:24:01 +0200 Subject: [PATCH 02/15] macOS package creation fixed https://en.wikipedia.org/wiki/System_Integrity_Protection --- .ci/ci_build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/ci_build.sh b/.ci/ci_build.sh index 5e53f1e5..6fb10e44 100755 --- a/.ci/ci_build.sh +++ b/.ci/ci_build.sh @@ -49,7 +49,7 @@ if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then mkdir build || exit 1 mkdir ${CI_BUILD_DIR}/deploy || exit 1 cd build - cmake -DPLATFORM=$PLATFORM -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX=/usr .. || exit 2 + cmake -DPLATFORM=$PLATFORM -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2 make -j ${JOBS} || exit 3 if [[ "$PACKAGES" == 'package' ]]; then sudo cpack From 93b9028b7d39699331a70b5d52fb28891492fc18 Mon Sep 17 00:00:00 2001 From: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com> Date: Wed, 19 Jun 2019 19:04:54 +0200 Subject: [PATCH 03/15] GitHub package creation/upload --- .azure.yml | 127 ++++++++++++++++++++++++++++++++----- .ci/ci_build.sh | 49 ++++---------- .ci/ci_deploy.sh | 67 ------------------- .travis.yml | 2 - CMakeLists.txt | 33 ++++++++-- cmake/packages.cmake | 10 ++- test/jsonchecks/version.py | 9 +++ version.json | 27 ++------ 8 files changed, 173 insertions(+), 151 deletions(-) delete mode 100755 .ci/ci_deploy.sh create mode 100644 test/jsonchecks/version.py diff --git a/.azure.yml b/.azure.yml index a7a19c96..f0f0e928 100644 --- a/.azure.yml +++ b/.azure.yml @@ -1,5 +1,11 @@ jobs: + +###################### +###### Linux ######### +###################### + - job: Linux + timeoutInMinutes: 120 pool: vmImage: 'ubuntu-16.04' strategy: @@ -7,9 +13,11 @@ jobs: 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)' @@ -22,43 +30,130 @@ jobs: dockerTag: 'aarch64' dockerName: 'ARMv8 (Generic AARCH64)' platform: 'amlogic' + steps: - - checkout: self - submodules: recursive + - checkout: self # represents the repo where the initial Pipelines YAML file was found + submodules: recursive # set to 'recursive' to get submodules of submodules + + # build process - bash: ./.ci/ci_build.sh displayName: 'Build $(dockerName)' env: DOCKER_TAG: $(dockerTag) DOCKER_NAME: $(dockerName) PLATFORM: $(platform) - - task: CopyFiles@2 - displayName: 'Copy Files' + + # read version.json and generate pipeline variables + - task: oneLuckiDevJson2Variable@1 inputs: - contents: '**/deploy/**' - TargetFolder: '$(Build.ArtifactStagingDirectory)' + jsonFile: 'version.json' + shouldPrefixVariables: true + variablePrefix: 'json' + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Read and generate pipeline variables' + + # copy files + - bash: 'cp -v deploy/Hyperion.NG-* $(Build.ArtifactStagingDirectory)' + 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 - displayName: 'Publish Artifact: $(dockerName)' inputs: pathtoPublish: '$(Build.ArtifactStagingDirectory)' - artifactName: $(dockerTag) + ArtifactName: $(dockerTag) + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Publish deployables artifacts' + + # assign latest tag variable + - bash: echo "##vso[task.setvariable variable=latestTag]$(git tag | tail -1)" + displayName: "Read latest tag" + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + + # create or update github release + - task: GithubRelease@0 + inputs: + gitHubConnection: Hyperion.NG + repositoryName: $(Build.Repository.Name) + action: edit + target: $(Build.SourceVersion) + tagSource: manual + tag: '$(latestTag)' + title: '# $(latestTag) v$(json.versionnr)' + releaseNotesSource: input + releaseNotes: $(Build.SourceVersionMessage) + assets: '$(Build.ArtifactStagingDirectory)/*' + assetUploadMode: 'replace' + isPreRelease: true + addChangeLog: false + 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 - submodules: recursive + - checkout: self # represents the repo where the initial Pipelines YAML file was found + submodules: recursive # set to 'recursive' to get submodules of submodules + + # install dependencies - bash: ./.ci/ci_install.sh displayName: 'Install dependencies' + + # build process - bash: ./.ci/ci_build.sh displayName: 'Build macOS 10.13' - - task: CopyFiles@2 - displayName: 'Copy Files' + + # read version.json and generate pipeline variables + - task: oneLuckiDevJson2Variable@1 inputs: - contents: '**/deploy/**' - TargetFolder: '$(Build.ArtifactStagingDirectory)' + jsonFile: 'version.json' + shouldPrefixVariables: true + variablePrefix: 'json' + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Read and generate pipeline variables' + + # copy files + - bash: 'cp -v build/Hyperion.NG-* $(Build.ArtifactStagingDirectory)' + 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 - displayName: 'Publish Artifact: macOS 10.13' inputs: pathtoPublish: '$(Build.ArtifactStagingDirectory)' - artifactName: 'macOS' + ArtifactName: 'macos' + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Publish deployables artifacts' + + # generate latest tag variable + - bash: echo "##vso[task.setvariable variable=latestTag]$(git tag | tail -1)" + displayName: "Read latest tag" + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + + # create or update github release + - task: GithubRelease@0 + inputs: + gitHubConnection: Hyperion.NG + repositoryName: $(Build.Repository.Name) + action: edit + target: $(Build.SourceVersion) + tagSource: manual + tag: '$(latestTag)' + title: '# $(latestTag) v$(json.versionnr)' + releaseNotesSource: input + releaseNotes: $(Build.SourceVersionMessage) + assets: '$(Build.ArtifactStagingDirectory)/*' + assetUploadMode: 'replace' + isPreRelease: true + addChangeLog: false + condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: Create/Update GitHub release diff --git a/.ci/ci_build.sh b/.ci/ci_build.sh index 6fb10e44..29a8638d 100755 --- a/.ci/ci_build.sh +++ b/.ci/ci_build.sh @@ -14,50 +14,28 @@ else CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')" fi -# set environment variables -BUILD_TYPE="Debug" -[ -z "${PACKAGES}" ] && PACKAGES="" -[ -z "${PLATFORM}" ] && PLATFORM="x11" - -# Detect number of processor cores -# default is 4 jobs -if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then - JOBS=$(sysctl -n hw.ncpu) - PLATFORM=osx -elif [[ "$CI_NAME" == 'linux' ]]; then - JOBS=$(nproc) -fi -echo "compile jobs: ${JOBS:=4}" +# set environment variables if not exists +[ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug" # Determine cmake build type; tag builds are Release, else Debug -if [ -n "${TRAVIS_TAG:-}" ] || [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then +if [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then BUILD_TYPE=Release fi -# Determine package creation; True for cron/schedule and tag builds -if [ "${TRAVIS_EVENT_TYPE:-}" == 'cron' ] || [ -n "${TRAVIS_TAG:-}" ] || [[ $BUILD_REASON == "Schedule" ]] || [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then - PACKAGES="package" -fi - # Determie -dev appends to platform; # Commented because tests are currently broken # [ "${TRAVIS_EVENT_TYPE:-}" != 'cron' -a -z "${TRAVIS_TAG:-}" ] && PLATFORM=${PLATFORM}-dev -# Build the package on osx or docker for linux +# Build the package on osx or linux if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then # compile prepare mkdir build || exit 1 mkdir ${CI_BUILD_DIR}/deploy || exit 1 cd build - cmake -DPLATFORM=$PLATFORM -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2 - make -j ${JOBS} || exit 3 - if [[ "$PACKAGES" == 'package' ]]; then - sudo cpack - fi - echo "---> Copy binaries and packages to folder: ${CI_BUILD_DIR}/deploy" - cp -v ${CI_BUILD_DIR}/build/bin/h* ${CI_BUILD_DIR}/deploy/ 2>/dev/null || : && - cp -v ${CI_BUILD_DIR}/build/Hyperion-* ${CI_BUILD_DIR}/deploy/ 2>/dev/null || : && + cmake -DPLATFORM="osx" -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2 + make -j $(sysctl -n hw.ncpu) package || exit 3 exit 0; + exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 4; } 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 @@ -68,13 +46,12 @@ elif [[ "$CI_NAME" == 'linux' ]]; then -v "${CI_BUILD_DIR}/deploy:/deploy" \ -v "${CI_BUILD_DIR}:/source:ro" \ hyperionproject/hyperion-ci:$DOCKER_TAG \ - /bin/bash -c "mkdir build && cp -r source/. /build && - cd /build && mkdir build && cd build && - cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} .. || exit 2 && - make -j ${JOBS} ${PACKAGES} || exit 3 && - echo '---> Copy binaries and packages to host folder: ${CI_BUILD_DIR}/deploy' && - cp -v /build/build/bin/h* /deploy/ 2>/dev/null || : && - cp -v /build/build/Hyperion-* /deploy/ 2>/dev/null || : && + /bin/bash -c "mkdir hyperion.ng && cp -r source/. /hyperion.ng && + cd /hyperion.ng && 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.ng/build/bin/h* /deploy/ 2>/dev/null || : && + cp /hyperion.ng/build/Hyperion.NG-* /deploy/ 2>/dev/null || : && exit 0; exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 4; } diff --git a/.ci/ci_deploy.sh b/.ci/ci_deploy.sh deleted file mode 100755 index df3ef780..00000000 --- a/.ci/ci_deploy.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/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" -else - # for executing in non ci environment - CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')" -fi - -# sf_upload -# { -# echo "Uploading following files: ${1} to dir /hyperion-project/${2}" -# -# } - -# append current Date to filename (just packages no binaries) -appendDate() -{ - D=$(date +%Y-%m-%d) - for F in $CI_BUILD_DIR/deploy/Hy* - do - mv "$F" "${F%.*}-$D.${F##*.}" - done -} - -# append friendly name (just packages no binaries) -appendName() -{ - for F in $CI_BUILD_DIR/deploy/Hy* - do - mv "$F" "${F%.*}-($DOCKER_NAME).${F##*.}" - done -} - -# get all files to deploy (just packages no binaries) -getFiles() -{ - FILES="" - for f in $CI_BUILD_DIR/deploy/Hy*; - do FILES+="${f} "; - done; -} - -if [[ $CI_NAME == 'linux' || "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then - if [[ -n $TRAVIS_TAG ]] || [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then - echo "tag upload" - appendName - appendDate - getFiles - # sf_upload $FILES release - elif [[ $TRAVIS_EVENT_TYPE == 'cron' ]] || [[ $BUILD_REASON == "Schedule" ]]; then - echo "cron/schedule upload" - appendName - appendDate - getFiles - # sf_upload $FILES dev/alpha - else - echo "Direct pushed no upload, PRs not possible" - fi -fi diff --git a/.travis.yml b/.travis.yml index 38bd18bb..44ad22bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -60,6 +60,4 @@ jobs: script: - ./.ci/ci_build.sh -after_success: - - ./.ci/ci_deploy.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d030199..3491ce62 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,11 +18,29 @@ if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) endif(CCACHE_FOUND) -SET ( HYPERION_VERSION_STABLE OFF ) -SET ( HYPERION_VERSION_MAJOR 2 ) -SET ( HYPERION_VERSION_MINOR 0 ) -SET ( HYPERION_VERSION_PATCH 0 ) +# Read version from version.json +EXECUTE_PROCESS ( + COMMAND python test/jsonchecks/version.py ${PROJECT_SOURCE_DIR}/version.json + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE RETURN_VERSION +) +SET(VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?") +IF( ${RETURN_VERSION} MATCHES ${VERSION_REGEX} ) + STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${RETURN_VERSION}) + LIST(GET VERSION_PARTS 0 VERSION_MAJOR) + LIST(GET VERSION_PARTS 1 VERSION_MINOR) + LIST(GET VERSION_PARTS 2 VERSION_PATCH) +ELSE( ${RETURN_VERSION} MATCHES ${VERSION_REGEX} ) + message( FATAL_ERROR "Failed to parse version.json string properly. Expect X.Y.Z.") +ENDIF() + +SET ( HYPERION_VERSION_STABLE OFF ) +SET ( HYPERION_VERSION_MAJOR ${VERSION_MAJOR} ) +SET ( HYPERION_VERSION_MINOR ${VERSION_MINOR} ) +SET ( HYPERION_VERSION_PATCH ${VERSION_PATCH} ) + +# Set build variables SET ( DEFAULT_AMLOGIC OFF ) SET ( DEFAULT_DISPMANX OFF ) SET ( DEFAULT_OSX OFF ) @@ -121,9 +139,10 @@ if ( "${PLATFORM}" MATCHES "-dev" ) SET ( DEFAULT_TESTS ON ) endif() -STRING( TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE) -STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" ) -ADD_DEFINITIONS( ${PLATFORM_DEFINE} ) +# is this necessary? +# STRING( TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE) +# STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" ) +# ADD_DEFINITIONS( ${PLATFORM_DEFINE} ) # set the build options option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC} ) diff --git a/cmake/packages.cmake b/cmake/packages.cmake index 5e9765b3..ffc0ac72 100644 --- a/cmake/packages.cmake +++ b/cmake/packages.cmake @@ -24,10 +24,16 @@ ENDIF() # Apply to all packages, some of these can be overwritten with generator specific content # https://cmake.org/cmake/help/v3.5/module/CPack.html -SET ( CPACK_PACKAGE_NAME "Hyperion" ) +SET ( CPACK_PACKAGE_NAME "Hyperion.NG" ) SET ( CPACK_PACKAGE_DESCRIPTION_SUMMARY "Hyperion is an open source ambient light implementation" ) SET ( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md" ) -SET ( CPACK_PACKAGE_FILE_NAME "Hyperion-${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}") + +if ( NOT DEFINED DOCKER_PLATFORM ) + SET ( CPACK_PACKAGE_FILE_NAME "Hyperion.NG-${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}") +else() + SET ( CPACK_PACKAGE_FILE_NAME "Hyperion.NG-${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}-${DOCKER_PLATFORM}") +endif() + SET ( CPACK_PACKAGE_CONTACT "packages@hyperion-project.org") SET ( CPACK_PACKAGE_EXECUTABLES "hyperiond;Hyperion" ) SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/hyperion-icon-32px.png") diff --git a/test/jsonchecks/version.py b/test/jsonchecks/version.py new file mode 100644 index 00000000..4fb1f2a3 --- /dev/null +++ b/test/jsonchecks/version.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +import json, sys + +retval = 0 + +with open(sys.argv[1]) as f: + data = json.load(f) + sys.stdout.write(data['versionnr']) + sys.exit(0) diff --git a/version.json b/version.json index 356934a4..d84a7b78 100644 --- a/version.json +++ b/version.json @@ -1,21 +1,6 @@ -[ - { - "versionnr" : "2.1.0", - "versiondesc": "This version introduces feature x and some small bugfixes at the web configuration", - "versionchangelog":"https://www.hyperion-project.org/blog/id1", - "channel" : "Stable" - }, - { - "versionnr" : "2.0.1", - "versiondesc": "This is a bugfix release for 2.0.0", - "versionchangelog": "https://www.hyperion-project.org/blog/id3", - "channel" : "Stable" - }, - { - "versionnr" : "2.0.0", - "versiondesc": "Version 2.0.0 introduces the succesor of Hyperion 1.0 with plenty new features to discover with a entire code rework and a highly extended JSON RPC!", - "versionchangelog": "https://www.hyperion-project.org/blog/id0", - "channel" : "Stable" - } -] - +{ + "versionnr": "1.0.0", + "versiondesc": "Hyperion.NG introduces the succesor of Hyperion 1.0 with plenty new features to discover with a entire code rework and a highly extended JSON RPC!", + "versionchangelog": "https://www.hyperion-project.org/blog/id0", + "channel": "Beta" +} From 386ebf6eb400c8f6a83b5b85d24b1ca4bcd197aa Mon Sep 17 00:00:00 2001 From: IIIdefconIII Date: Thu, 20 Jun 2019 23:52:47 +0200 Subject: [PATCH 04/15] Update CompileHowto.md --- CompileHowto.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CompileHowto.md b/CompileHowto.md index b181d055..36326948 100644 --- a/CompileHowto.md +++ b/CompileHowto.md @@ -80,6 +80,8 @@ 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) From b2c63ff770f92eeaff8f34e94f041057270f7080 Mon Sep 17 00:00:00 2001 From: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com> Date: Sat, 22 Jun 2019 16:12:09 +0200 Subject: [PATCH 05/15] Pre-Release detection on Azure --- .azure.yml | 64 +++++++++++++++++--------------------- CMakeLists.txt | 28 +++++++++++------ HyperionConfig.h.in | 2 +- cmake/FindGitVersion.cmake | 3 +- cmake/packages.cmake | 4 +-- test/jsonchecks/version.py | 11 +++++-- 6 files changed, 59 insertions(+), 53 deletions(-) diff --git a/.azure.yml b/.azure.yml index f0f0e928..27bacf46 100644 --- a/.azure.yml +++ b/.azure.yml @@ -35,6 +35,14 @@ jobs: - checkout: self # represents the repo where the initial Pipelines YAML file was found submodules: recursive # set to 'recursive' to get submodules of submodules + # read channel tag in version.json + - task: oneLuckiDevJson2Variable@1 + inputs: + jsonFile: 'version.json' + shouldPrefixVariables: true + variablePrefix: 'json' + displayName: 'Read and generate pipeline variables' + # build process - bash: ./.ci/ci_build.sh displayName: 'Build $(dockerName)' @@ -43,15 +51,6 @@ jobs: DOCKER_NAME: $(dockerName) PLATFORM: $(platform) - # read version.json and generate pipeline variables - - task: oneLuckiDevJson2Variable@1 - inputs: - jsonFile: 'version.json' - shouldPrefixVariables: true - variablePrefix: 'json' - condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) - displayName: 'Read and generate pipeline variables' - # copy files - bash: 'cp -v deploy/Hyperion.NG-* $(Build.ArtifactStagingDirectory)' workingDirectory: '$(Build.SourcesDirectory)' @@ -66,10 +65,10 @@ jobs: condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) displayName: 'Publish deployables artifacts' - # assign latest tag variable - - bash: echo "##vso[task.setvariable variable=latestTag]$(git tag | tail -1)" - displayName: "Read latest tag" - condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + # set release to pre-release + - bash: echo '##vso[task.setvariable variable=preRelease;]true' + condition: and(succeeded(), contains(variables['json.channel'], 'beta'), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Mark beta as pre-release' # create or update github release - task: GithubRelease@0 @@ -79,14 +78,11 @@ jobs: action: edit target: $(Build.SourceVersion) tagSource: manual - tag: '$(latestTag)' - title: '# $(latestTag) v$(json.versionnr)' - releaseNotesSource: input - releaseNotes: $(Build.SourceVersionMessage) + tag: $(Build.SourceBranchName) assets: '$(Build.ArtifactStagingDirectory)/*' assetUploadMode: 'replace' - isPreRelease: true addChangeLog: false + isPreRelease: $(preRelease) condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) displayName: Create/Update GitHub release @@ -103,6 +99,14 @@ jobs: - checkout: self # represents the repo where the initial Pipelines YAML file was found submodules: recursive # set to 'recursive' to get submodules of submodules + # read channel tag in version.json + - task: oneLuckiDevJson2Variable@1 + inputs: + jsonFile: 'version.json' + shouldPrefixVariables: true + variablePrefix: 'json' + displayName: 'Read and generate pipeline variables' + # install dependencies - bash: ./.ci/ci_install.sh displayName: 'Install dependencies' @@ -111,15 +115,6 @@ jobs: - bash: ./.ci/ci_build.sh displayName: 'Build macOS 10.13' - # read version.json and generate pipeline variables - - task: oneLuckiDevJson2Variable@1 - inputs: - jsonFile: 'version.json' - shouldPrefixVariables: true - variablePrefix: 'json' - condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) - displayName: 'Read and generate pipeline variables' - # copy files - bash: 'cp -v build/Hyperion.NG-* $(Build.ArtifactStagingDirectory)' workingDirectory: '$(Build.SourcesDirectory)' @@ -134,10 +129,10 @@ jobs: condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) displayName: 'Publish deployables artifacts' - # generate latest tag variable - - bash: echo "##vso[task.setvariable variable=latestTag]$(git tag | tail -1)" - displayName: "Read latest tag" - condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + # set release to pre-release + - bash: echo '##vso[task.setvariable variable=preRelease;]true' + condition: and(succeeded(), contains(variables['json.channel'], 'beta'), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) + displayName: 'Mark beta as pre-release' # create or update github release - task: GithubRelease@0 @@ -147,13 +142,10 @@ jobs: action: edit target: $(Build.SourceVersion) tagSource: manual - tag: '$(latestTag)' - title: '# $(latestTag) v$(json.versionnr)' - releaseNotesSource: input - releaseNotes: $(Build.SourceVersionMessage) + tag: '$(Build.SourceBranchName)' assets: '$(Build.ArtifactStagingDirectory)/*' assetUploadMode: 'replace' - isPreRelease: true addChangeLog: false + isPreRelease: $(preRelease) condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/')) displayName: Create/Update GitHub release diff --git a/CMakeLists.txt b/CMakeLists.txt index 3491ce62..46610df8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,20 +25,28 @@ EXECUTE_PROCESS ( OUTPUT_VARIABLE RETURN_VERSION ) -SET(VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?") -IF( ${RETURN_VERSION} MATCHES ${VERSION_REGEX} ) - STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${RETURN_VERSION}) - LIST(GET VERSION_PARTS 0 VERSION_MAJOR) - LIST(GET VERSION_PARTS 1 VERSION_MINOR) - LIST(GET VERSION_PARTS 2 VERSION_PATCH) +SET( VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?" ) +IF( ${RETURN_VERSION} MATCHES ${VERSION_REGEX}) + STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${RETURN_VERSION} ) + LIST( GET VERSION_PARTS 0 VERSION_MAJOR ) + LIST( GET VERSION_PARTS 1 VERSION_MINOR ) + LIST( GET VERSION_PARTS 2 VERSION_PATCH ) ELSE( ${RETURN_VERSION} MATCHES ${VERSION_REGEX} ) message( FATAL_ERROR "Failed to parse version.json string properly. Expect X.Y.Z.") ENDIF() -SET ( HYPERION_VERSION_STABLE OFF ) -SET ( HYPERION_VERSION_MAJOR ${VERSION_MAJOR} ) -SET ( HYPERION_VERSION_MINOR ${VERSION_MINOR} ) -SET ( HYPERION_VERSION_PATCH ${VERSION_PATCH} ) +SET( HYPERION_VERSION_MAJOR ${VERSION_MAJOR} ) +SET( HYPERION_VERSION_MINOR ${VERSION_MINOR} ) +SET( HYPERION_VERSION_PATCH ${VERSION_PATCH} ) + +# Read channel from version.json +EXECUTE_PROCESS ( + COMMAND python test/jsonchecks/version.py ${PROJECT_SOURCE_DIR}/version.json "channel" + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE RETURN_CHANNEL +) + +SET ( HYPERION_VERSION_CHANNEL ${RETURN_CHANNEL} ) # Set build variables SET ( DEFAULT_AMLOGIC OFF ) diff --git a/HyperionConfig.h.in b/HyperionConfig.h.in index ddb8874e..b121c88a 100644 --- a/HyperionConfig.h.in +++ b/HyperionConfig.h.in @@ -42,6 +42,6 @@ #define HYPERION_VERSION_MAJOR "${HYPERION_VERSION_MAJOR}" #define HYPERION_VERSION_MINOR "${HYPERION_VERSION_MINOR}" #define HYPERION_VERSION_PATCH "${HYPERION_VERSION_PATCH}" -#define HYPERION_VERSION "${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}" +#define HYPERION_VERSION "${HYPERION_VERSION_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}" #define HYPERION_JSON_VERSION "1.0.0" diff --git a/cmake/FindGitVersion.cmake b/cmake/FindGitVersion.cmake index b48f70ca..1cb1a7d0 100644 --- a/cmake/FindGitVersion.cmake +++ b/cmake/FindGitVersion.cmake @@ -7,4 +7,5 @@ STRING ( STRIP "${BUILD_ID}" BUILD_ID ) STRING ( STRIP "${VERSION_ID}" VERSION_ID ) STRING ( STRIP "${GIT_REMOTE_PATH}" GIT_REMOTE_PATH ) SET ( HYPERION_BUILD_ID "${VERSION_ID} (${BUILD_ID}) Git Remote: ${GIT_REMOTE_PATH}" ) -message ( STATUS "Current Version: ${HYPERION_BUILD_ID}" ) +SET ( HYPERION_VERSION "${HYPERION_VERSION_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}" ) +message ( STATUS "Current Version: ${HYPERION_VERSION} (${HYPERION_BUILD_ID})" ) diff --git a/cmake/packages.cmake b/cmake/packages.cmake index ffc0ac72..aaa25fe7 100644 --- a/cmake/packages.cmake +++ b/cmake/packages.cmake @@ -29,9 +29,9 @@ SET ( CPACK_PACKAGE_DESCRIPTION_SUMMARY "Hyperion is an open source ambient ligh SET ( CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md" ) if ( NOT DEFINED DOCKER_PLATFORM ) - SET ( CPACK_PACKAGE_FILE_NAME "Hyperion.NG-${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}") + SET ( CPACK_PACKAGE_FILE_NAME "Hyperion.NG-${HYPERION_VERSION_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}") else() - SET ( CPACK_PACKAGE_FILE_NAME "Hyperion.NG-${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}-${DOCKER_PLATFORM}") + SET ( CPACK_PACKAGE_FILE_NAME "Hyperion.NG-${HYPERION_VERSION_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}-${DOCKER_PLATFORM}") endif() SET ( CPACK_PACKAGE_CONTACT "packages@hyperion-project.org") diff --git a/test/jsonchecks/version.py b/test/jsonchecks/version.py index 4fb1f2a3..06f6e2a7 100644 --- a/test/jsonchecks/version.py +++ b/test/jsonchecks/version.py @@ -4,6 +4,11 @@ import json, sys retval = 0 with open(sys.argv[1]) as f: - data = json.load(f) - sys.stdout.write(data['versionnr']) - sys.exit(0) + if len(sys.argv) < 3: + data = json.load(f) + sys.stdout.write(data['versionnr']) + sys.exit(0) + else: + data = json.load(f) + sys.stdout.write(data['channel']) + sys.exit(0) From d414942e2ead591e8cbb9372ea6a8a6bd115f99f Mon Sep 17 00:00:00 2001 From: Paulchen-Panther Date: Tue, 2 Jul 2019 19:06:36 +0200 Subject: [PATCH 06/15] Bugfix/Hotfix/Update Signed-off-by: Paulchen-Panther --- assets/webconfig/js/content_leds.js | 9 ++- config/hyperion.config.json.commented | 2 +- include/api/JsonAPI.h | 8 +-- include/hyperion/Hyperion.h | 21 ++++-- include/hyperion/ImageProcessor.h | 2 +- include/hyperion/ImageToLedsMap.h | 6 +- include/leddevice/LedDevice.h | 8 +++ include/utils/hyperion.h | 4 +- libsrc/effectengine/EffectEngine.cpp | 1 - libsrc/hyperion/CaptureCont.cpp | 4 +- libsrc/hyperion/Hyperion.cpp | 72 +++++++++---------- libsrc/hyperion/LinearColorSmoothing.h | 1 - libsrc/hyperion/MessageForwarder.cpp | 38 ++++++++-- libsrc/leddevice/LedDevice.cpp | 13 +--- libsrc/leddevice/LedDeviceWrapper.cpp | 33 ++++----- .../leddevice/dev_net/LedDeviceFadeCandy.cpp | 29 ++++---- libsrc/leddevice/dev_net/LedDeviceFadeCandy.h | 9 +-- libsrc/leddevice/dev_net/ProviderUdp.h | 2 +- .../leddevice/schemas/schema-fadecandy.json | 1 + src/hyperiond/hyperiond.cpp | 1 + 20 files changed, 149 insertions(+), 115 deletions(-) diff --git a/assets/webconfig/js/content_leds.js b/assets/webconfig/js/content_leds.js index 041883eb..13a1ae92 100644 --- a/assets/webconfig/js/content_leds.js +++ b/assets/webconfig/js/content_leds.js @@ -193,10 +193,10 @@ function createClassicLeds(){ } } - createLeftLeds(); - createBottomLeds(); - createRightLeds(); createTopLeds(); + createRightLeds(); + createBottomLeds(); + createLeftLeds(); //check led gap pos if (ledsgpos+ledsglength > ledArray.length) @@ -429,6 +429,9 @@ $(document).ready(function() { // create and update editor $("#leddevices").off().on("change", function() { var generalOptions = window.serverSchema.properties.device; + + // Modified schema enty "hardwareLedCount" in generalOptions to minimum LedCount + var specificOptions = window.serverSchema.properties.alldevices[$(this).val()]; conf_editor = createJsonEditor('editor_container', { generalOptions : generalOptions, diff --git a/config/hyperion.config.json.commented b/config/hyperion.config.json.commented index b387dbd0..959c06be 100644 --- a/config/hyperion.config.json.commented +++ b/config/hyperion.config.json.commented @@ -31,7 +31,7 @@ "output" : "/dev/null", "rate" : 1000000, "colorOrder" : "rgb", - "rewriteTime": 0 + "rewriteTime": 5000 }, /// Color manipulation configuration used to tune the output colors to specific surroundings. diff --git a/include/api/JsonAPI.h b/include/api/JsonAPI.h index caeb4742..fd268e0f 100644 --- a/include/api/JsonAPI.h +++ b/include/api/JsonAPI.h @@ -6,7 +6,7 @@ #include #include -// qt includess +// qt includes #include #include #include @@ -63,8 +63,8 @@ private: // true if further callbacks are forbidden (http) bool _noListener; - /// The peer address of the client - QString _peerAddress; + /// The peer address of the client + QString _peerAddress; /// Log instance Logger* _log; @@ -86,7 +86,7 @@ private: /// mutex to determine state of image streaming QMutex _image_stream_mutex; - /// mutex to determine state of image streaming + /// mutex to determine state of led streaming QMutex _led_stream_mutex; /// timeout for live video refresh diff --git a/include/hyperion/Hyperion.h b/include/hyperion/Hyperion.h index 6894b4ff..c0edc66e 100644 --- a/include/hyperion/Hyperion.h +++ b/include/hyperion/Hyperion.h @@ -5,7 +5,6 @@ #include // QT includes -//#include #include #include #include @@ -13,6 +12,7 @@ #include #include #include +#include // hyperion-utils includes #include @@ -410,8 +410,11 @@ signals: /// Signal which is emitted, when a new json message should be forwarded void forwardJsonMessage(QJsonObject); - /// Signal which is emitted, when a new proto image should be forwarded - void forwardProtoMessage(const QString, const Image); + /// Signal which is emitted, when a new system proto image should be forwarded + void forwardSystemProtoMessage(const QString, const Image); + + /// Signal which is emitted, when a new V4l proto image should be forwarded + void forwardV4lProtoMessage(const QString, const Image); /// /// @brief Is emitted from clients who request a videoMode change @@ -474,6 +477,12 @@ private slots: /// void handleSettingsUpdate(const settings::type& type, const QJsonDocument& config); + /// + /// @brief Handle priority updates from Priority Muxer + /// @param priority The new visible priority + /// + void handlePriorityChanges(const quint8 &priority); + private: /// @@ -560,12 +569,12 @@ private: /// Capture control for Daemon native capture CaptureCont* _captureCont; - // lock Hyperion::update() for exec - bool _lockUpdate = false; - /// buffer for leds (with adjustment) std::vector _ledBuffer; /// Boblight instance BoblightServer* _boblightServer; + + /// mutex + QMutex _changes; }; diff --git a/include/hyperion/ImageProcessor.h b/include/hyperion/ImageProcessor.h index d2c16216..2afaba4f 100644 --- a/include/hyperion/ImageProcessor.h +++ b/include/hyperion/ImageProcessor.h @@ -150,7 +150,7 @@ public: // Check black border detection verifyBorder(image); - // Determine the mean-colors of each led (using the existing mapping) + // Determine the mean or uni colors of each led (using the existing mapping) switch (_mappingType) { case 1: _imageToLeds->getUniLedColor(image, ledColors); break; diff --git a/include/hyperion/ImageToLedsMap.h b/include/hyperion/ImageToLedsMap.h index 2314c3ff..f58e19c5 100644 --- a/include/hyperion/ImageToLedsMap.h +++ b/include/hyperion/ImageToLedsMap.h @@ -61,7 +61,7 @@ namespace hyperion unsigned verticalBorder() { return _verticalBorder; }; /// - /// Determines the mean-color for each led using the mapping the image given + /// Determines the mean color for each led using the mapping the image given /// at construction. /// /// @param[in] image The image from which to extract the led colors @@ -104,7 +104,7 @@ namespace hyperion } /// - /// Determines the mean-color for each led using the mapping the image given + /// Determines the uni color for each led using the mapping the image given /// at construction. /// /// @param[in] image The image from which to extract the led colors @@ -120,7 +120,7 @@ namespace hyperion } /// - /// Determines the mean color for each led using the mapping the image given + /// Determines the uni color for each led using the mapping the image given /// at construction. /// /// @param[in] image The image from which to extract the led colors diff --git a/include/leddevice/LedDevice.h b/include/leddevice/LedDevice.h index 7f9c919c..b608283a 100644 --- a/include/leddevice/LedDevice.h +++ b/include/leddevice/LedDevice.h @@ -84,6 +84,14 @@ signals: /// void enableStateChanged(bool newState); + /// + /// PIPER signal for Priority Muxer -> LedDevice + /// + /// @brief Handle priority updates from Priority Muxer + /// @param priority The new visible priority + /// + void visiblePriorityChanged(const quint8 &priority); + protected: virtual bool init(const QJsonObject &deviceConfig); diff --git a/include/utils/hyperion.h b/include/utils/hyperion.h index d70263cb..10a3569b 100644 --- a/include/utils/hyperion.h +++ b/include/utils/hyperion.h @@ -40,12 +40,12 @@ namespace hyperion { (uint8_t)FGCONFIG_ARRAY.at(2).toInt(0) }; hyperion->setColor(FG_PRIORITY, fg_color, fg_duration_ms); - Info(Logger::getInstance("HYPERION"),"Inital foreground color set (%d %d %d)",fg_color.red,fg_color.green,fg_color.blue); + Info(Logger::getInstance("HYPERION"),"Initial foreground color set (%d %d %d)",fg_color.red,fg_color.green,fg_color.blue); } else { int result = hyperion->setEffect(fgEffectConfig, FG_PRIORITY, fg_duration_ms); - Info(Logger::getInstance("HYPERION"),"Inital foreground effect '%s' %s", QSTRING_CSTR(fgEffectConfig), ((result == 0) ? "started" : "failed")); + Info(Logger::getInstance("HYPERION"),"Initial foreground effect '%s' %s", QSTRING_CSTR(fgEffectConfig), ((result == 0) ? "started" : "failed")); } } #undef FGCONFIG_ARRAY diff --git a/libsrc/effectengine/EffectEngine.cpp b/libsrc/effectengine/EffectEngine.cpp index e99c73da..8e781663 100644 --- a/libsrc/effectengine/EffectEngine.cpp +++ b/libsrc/effectengine/EffectEngine.cpp @@ -30,7 +30,6 @@ EffectEngine::EffectEngine(Hyperion * hyperion) { Q_INIT_RESOURCE(EffectEngine); - qRegisterMetaType>("std::vector"); qRegisterMetaType("hyperion::Components"); // connect the Hyperion channel clear feedback diff --git a/libsrc/hyperion/CaptureCont.cpp b/libsrc/hyperion/CaptureCont.cpp index 6c09dda2..262cb61c 100644 --- a/libsrc/hyperion/CaptureCont.cpp +++ b/libsrc/hyperion/CaptureCont.cpp @@ -73,7 +73,7 @@ void CaptureCont::setSystemCaptureEnable(const bool& enable) { _hyperion->registerInput(_systemCaptPrio, hyperion::COMP_GRABBER); connect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, this, &CaptureCont::handleSystemImage); - connect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, _hyperion, &Hyperion::forwardProtoMessage); + connect(GlobalSignals::getInstance(), &GlobalSignals::setSystemImage, _hyperion, &Hyperion::forwardSystemProtoMessage); } else { @@ -94,7 +94,7 @@ void CaptureCont::setV4LCaptureEnable(const bool& enable) { _hyperion->registerInput(_v4lCaptPrio, hyperion::COMP_V4L); connect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, this, &CaptureCont::handleV4lImage); - connect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, _hyperion, &Hyperion::forwardProtoMessage); + connect(GlobalSignals::getInstance(), &GlobalSignals::setV4lImage, _hyperion, &Hyperion::forwardV4lProtoMessage); } else { diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index 769e7348..2f21c326 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -106,8 +106,8 @@ Hyperion::Hyperion(HyperionDaemon* daemon, const quint8& instance, const QString _ledStringColorOrder.insert(_ledStringColorOrder.begin() + led.index, led.colorOrder); } - // connect Hyperion::update with Muxer visible priority changes as muxer updates independent - connect(&_muxer, &PriorityMuxer::visiblePriorityChanged, this, &Hyperion::update); + // connect Hyperion::handlePriorityChanges with Muxer visible priority changes as muxer updates independent + connect(&_muxer, &PriorityMuxer::visiblePriorityChanged, this, &Hyperion::handlePriorityChanges); // listens for ComponentRegister changes of COMP_ALL to perform core enable/disable actions connect(&_componentRegister, &ComponentRegister::updatedComponentState, this, &Hyperion::updatedComponentState); @@ -186,7 +186,6 @@ void Hyperion::freeObjects(bool emitCloseSignal) delete _boblightServer; delete _captureCont; delete _effectEngine; - //delete _deviceSmooth; delete _raw2ledAdjustment; delete _messageForwarder; delete _settingsManager; @@ -209,10 +208,13 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum } else if(type == settings::LEDS) { + QMutexLocker lock(&_changes); + const QJsonArray leds = config.array(); - // lock update() - _lockUpdate = true; +// // lock update() +// _lockUpdate = true; + // stop and cache all running effects, as effects depend heavily on ledlayout _effectEngine->cacheRunningEffects(); @@ -249,12 +251,13 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum // start cached effects _effectEngine->startCachedEffects(); - // unlock - _lockUpdate = false; +// // unlock +// _lockUpdate = false; } else if(type == settings::DEVICE) { - _lockUpdate = true; + QMutexLocker lock(&_changes); +// _lockUpdate = true; QJsonObject dev = config.object(); // handle hwLedCount update @@ -278,7 +281,7 @@ void Hyperion::handleSettingsUpdate(const settings::type& type, const QJsonDocum // do always reinit until the led devices can handle dynamic changes dev["currentLedCount"] = int(_hwLedCount); // Inject led count info _ledDeviceWrapper->createLedDevice(dev); - _lockUpdate = false; +// _lockUpdate = false; } // update once to push single color sets / adjustments/ ledlayout resizes and update ledBuffer color update(); @@ -578,50 +581,25 @@ void Hyperion::updatedComponentState(const hyperion::Components comp, const bool void Hyperion::update() { - if(_lockUpdate) - return; - - // the ledbuffer resize for hwledcount needs to be reverted - if(_hwLedCount > _ledBuffer.size()) - _ledBuffer.resize(getLedCount()); + QMutexLocker lock(&_changes); // Obtain the current priority channel int priority = _muxer.getCurrentPriority(); const PriorityMuxer::InputInfo priorityInfo = _muxer.getInputInfo(priority); - // eval comp change - bool compChanged = false; - if (priorityInfo.componentId != _prevCompId) - { - compChanged = true; - _prevCompId = priorityInfo.componentId; - } - // copy image & process OR copy ledColors from muxer Image image = priorityInfo.image; if(image.size() > 3) { emit currentImage(image); - // disable the black border detector for effects and ledmapping to 0 - if(compChanged) - { - _imageProcessor->setBlackbarDetectDisable((_prevCompId == hyperion::COMP_EFFECT)); - _imageProcessor->setHardLedMappingType((_prevCompId == hyperion::COMP_EFFECT) ? 0 : -1); - } - _imageProcessor->process(image, _ledBuffer); + _ledBuffer = _imageProcessor->process(image); } else - { _ledBuffer = priorityInfo.ledColors; - } // emit rawLedColors before transform emit rawLedColors(_ledBuffer); - // apply adjustments - if(compChanged) - _raw2ledAdjustment->setBacklightEnabled((_prevCompId != hyperion::COMP_COLOR && _prevCompId != hyperion::COMP_EFFECT)); - _raw2ledAdjustment->applyAdjustment(_ledBuffer); // insert cloned leds into buffer @@ -660,7 +638,8 @@ void Hyperion::update() } i++; } - // fill aditional hw leds with black + + // fill additional hw leds with black if ( _hwLedCount > _ledBuffer.size() ) { _ledBuffer.resize(_hwLedCount, ColorRgb::BLACK); @@ -671,7 +650,7 @@ void Hyperion::update() { _deviceSmooth->selectConfig(priorityInfo.smooth_cfg); - // feed smoothing in pause mode to maintain a smooth transistion back to smoth mode + // feed smoothing in pause mode to maintain a smooth transistion back to smooth mode if (_deviceSmooth->enabled() || _deviceSmooth->pause()) _deviceSmooth->setLedValues(_ledBuffer); @@ -679,3 +658,20 @@ void Hyperion::update() emit ledDeviceData(_ledBuffer); } } + +void Hyperion::handlePriorityChanges(const quint8 &priority) +{ + QMutexLocker lock(&_changes); + + // Obtain the current priority channel + const PriorityMuxer::InputInfo priorityInfo = _muxer.getInputInfo(priority); + + // evaluate comp change + if (priorityInfo.componentId != _prevCompId) + { + _imageProcessor->setBlackbarDetectDisable((_prevCompId == hyperion::COMP_EFFECT)); + _imageProcessor->setHardLedMappingType((_prevCompId == hyperion::COMP_EFFECT) ? 0 : -1); + _prevCompId = priorityInfo.componentId; + _raw2ledAdjustment->setBacklightEnabled((_prevCompId != hyperion::COMP_COLOR && _prevCompId != hyperion::COMP_EFFECT)); + } +} diff --git a/libsrc/hyperion/LinearColorSmoothing.h b/libsrc/hyperion/LinearColorSmoothing.h index e84b0384..a0d3a4b4 100644 --- a/libsrc/hyperion/LinearColorSmoothing.h +++ b/libsrc/hyperion/LinearColorSmoothing.h @@ -3,7 +3,6 @@ // STL includes #include - // Qt includes #include diff --git a/libsrc/hyperion/MessageForwarder.cpp b/libsrc/hyperion/MessageForwarder.cpp index ef1423f7..22bb0c3d 100644 --- a/libsrc/hyperion/MessageForwarder.cpp +++ b/libsrc/hyperion/MessageForwarder.cpp @@ -83,9 +83,12 @@ void MessageForwarder::handleSettingsUpdate(const settings::type &type, const QJ if (!_protoSlaves.isEmpty() && obj["enable"].toBool() && _forwarder_enabled) { InfoIf(obj["enable"].toBool(true), _log, "Forward now to proto targets '%s'", QSTRING_CSTR(_protoSlaves.join(", "))); - connect(_hyperion, &Hyperion::forwardProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection); +// connect(_hyperion, &Hyperion::forwardProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection); } else if ( _protoSlaves.isEmpty() || ! obj["enable"].toBool() || !_forwarder_enabled) - disconnect(_hyperion, &Hyperion::forwardProtoMessage, 0, 0); + { + disconnect(_hyperion, &Hyperion::forwardSystemProtoMessage, 0, 0); + disconnect(_hyperion, &Hyperion::forwardV4lProtoMessage, 0, 0); + } // update comp state _hyperion->getComponentRegister().componentStateChanged(hyperion::COMP_FORWARDER, obj["enable"].toBool(true)); @@ -112,8 +115,8 @@ void MessageForwarder::handlePriorityChanges(const quint8 &priority) while (!_forwardClients.isEmpty()) delete _forwardClients.takeFirst(); - hyperion::Components activePrio = _hyperion->getPriorityInfo(priority).componentId; - if (activePrio == hyperion::COMP_GRABBER || activePrio == hyperion::COMP_V4L) + hyperion::Components activeCompId = _hyperion->getPriorityInfo(priority).componentId; + if (activeCompId == hyperion::COMP_GRABBER || activeCompId == hyperion::COMP_V4L) { if ( !obj["proto"].isNull() ) { @@ -123,10 +126,33 @@ void MessageForwarder::handlePriorityChanges(const quint8 &priority) addProtoSlave(entry.toString()); } } - connect(_hyperion, &Hyperion::forwardProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection); + + switch(activeCompId) + { + case hyperion::COMP_GRABBER: + { + disconnect(_hyperion, &Hyperion::forwardV4lProtoMessage, 0, 0); + connect(_hyperion, &Hyperion::forwardSystemProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection); + } + break; + case hyperion::COMP_V4L: + { + disconnect(_hyperion, &Hyperion::forwardSystemProtoMessage, 0, 0); + connect(_hyperion, &Hyperion::forwardV4lProtoMessage, this, &MessageForwarder::forwardProtoMessage, Qt::UniqueConnection); + } + break; + default: + { + disconnect(_hyperion, &Hyperion::forwardSystemProtoMessage, 0, 0); + disconnect(_hyperion, &Hyperion::forwardV4lProtoMessage, 0, 0); + } + } } else - disconnect(_hyperion, &Hyperion::forwardProtoMessage, 0, 0); + { + disconnect(_hyperion, &Hyperion::forwardSystemProtoMessage, 0, 0); + disconnect(_hyperion, &Hyperion::forwardV4lProtoMessage, 0, 0); + } } } diff --git a/libsrc/leddevice/LedDevice.cpp b/libsrc/leddevice/LedDevice.cpp index 410c85cb..16193ec7 100644 --- a/libsrc/leddevice/LedDevice.cpp +++ b/libsrc/leddevice/LedDevice.cpp @@ -10,6 +10,8 @@ #include "hyperion/Hyperion.h" #include +#include + LedDevice::LedDevice(const QJsonObject& config, QObject* parent) : QObject(parent) , _devConfig(config) @@ -43,21 +45,12 @@ void LedDevice::setEnable(bool enable) { // emit signal when state changed if (_enabled != enable) - { emit enableStateChanged(enable); - } // set black to leds when they should go off if ( _enabled && !enable) - { switchOff(); - } - else { - if ( !_enabled && enable) - { - switchOn(); - } - } + _enabled = enable; } diff --git a/libsrc/leddevice/LedDeviceWrapper.cpp b/libsrc/leddevice/LedDeviceWrapper.cpp index ee6a1d54..3e7eb86b 100644 --- a/libsrc/leddevice/LedDeviceWrapper.cpp +++ b/libsrc/leddevice/LedDeviceWrapper.cpp @@ -41,25 +41,26 @@ LedDeviceWrapper::~LedDeviceWrapper() void LedDeviceWrapper::createLedDevice(const QJsonObject& config) { if(_ledDevice != nullptr) - { - stopDeviceThread(); - } + { + stopDeviceThread(); + } - // create thread and device - QThread* thread = new QThread(this); - _ledDevice = LedDeviceFactory::construct(config); - _ledDevice->moveToThread(thread); - // setup thread management - connect(thread, &QThread::started, _ledDevice, &LedDevice::start); - connect(thread, &QThread::finished, thread, &QObject::deleteLater); - connect(thread, &QThread::finished, _ledDevice, &QObject::deleteLater); + // create thread and device + QThread* thread = new QThread(this); + _ledDevice = LedDeviceFactory::construct(config); + _ledDevice->moveToThread(thread); + // setup thread management + connect(thread, &QThread::started, _ledDevice, &LedDevice::start); + connect(thread, &QThread::finished, thread, &QObject::deleteLater); + connect(thread, &QThread::finished, _ledDevice, &QObject::deleteLater); - // further signals - connect(this, &LedDeviceWrapper::write, _ledDevice, &LedDevice::write); - connect(_ledDevice, &LedDevice::enableStateChanged, this, &LedDeviceWrapper::handleInternalEnableState); + // further signals + connect(this, &LedDeviceWrapper::write, _ledDevice, &LedDevice::write); + connect(_hyperion->getMuxerInstance(), &PriorityMuxer::visiblePriorityChanged, _ledDevice, &LedDevice::visiblePriorityChanged); + connect(_ledDevice, &LedDevice::enableStateChanged, this, &LedDeviceWrapper::handleInternalEnableState); - // start the thread - thread->start(); + // start the thread + thread->start(); } const QJsonObject LedDeviceWrapper::getLedDeviceSchemas() diff --git a/libsrc/leddevice/dev_net/LedDeviceFadeCandy.cpp b/libsrc/leddevice/dev_net/LedDeviceFadeCandy.cpp index e5ada501..cb01fcab 100644 --- a/libsrc/leddevice/dev_net/LedDeviceFadeCandy.cpp +++ b/libsrc/leddevice/dev_net/LedDeviceFadeCandy.cpp @@ -5,17 +5,17 @@ static const unsigned OPC_SET_PIXELS = 0; // OPC command codes static const unsigned OPC_SYS_EX = 255; // OPC command codes static const unsigned OPC_HEADER_SIZE = 4; // OPC header size - LedDeviceFadeCandy::LedDeviceFadeCandy(const QJsonObject &deviceConfig) -: LedDevice() + : LedDevice() + , _client(nullptr) { _deviceReady = init(deviceConfig); + _client = new QTcpSocket(this); } - LedDeviceFadeCandy::~LedDeviceFadeCandy() { - _client.close(); + _client->close(); } LedDevice* LedDeviceFadeCandy::construct(const QJsonObject &deviceConfig) @@ -23,10 +23,9 @@ LedDevice* LedDeviceFadeCandy::construct(const QJsonObject &deviceConfig) return new LedDeviceFadeCandy(deviceConfig); } - bool LedDeviceFadeCandy::init(const QJsonObject &deviceConfig) { - _client.close(); + LedDevice::init(deviceConfig); if (_ledCount > MAX_NUM_LEDS) { @@ -67,15 +66,14 @@ bool LedDeviceFadeCandy::init(const QJsonObject &deviceConfig) bool LedDeviceFadeCandy::isConnected() { - return _client.state() == QAbstractSocket::ConnectedState; + return _client->state() == QAbstractSocket::ConnectedState; } - bool LedDeviceFadeCandy::tryConnect() { - if ( _client.state() == QAbstractSocket::UnconnectedState ) { - _client.connectToHost( _host, _port); - if ( _client.waitForConnected(1000) ) + if ( _client->state() == QAbstractSocket::UnconnectedState ) { + _client->connectToHost( _host, _port); + if ( _client->waitForConnected(1000) ) { Info(_log,"fadecandy/opc: connected to %s:%i on channel %i", QSTRING_CSTR(_host), _port, _channel); if (_setFcConfig) @@ -88,7 +86,6 @@ bool LedDeviceFadeCandy::tryConnect() return isConnected(); } - int LedDeviceFadeCandy::write( const std::vector & ledValues ) { uint idx = OPC_HEADER_SIZE; @@ -103,11 +100,11 @@ int LedDeviceFadeCandy::write( const std::vector & ledValues ) return ( transferData()<0 ? -1 : 0 ); } - int LedDeviceFadeCandy::transferData() { - if ( isConnected() || tryConnect() ) - return _client.write( _opc_data, _opc_data.size() ); + if (LedDevice::enabled()) + if ( isConnected() || tryConnect() ) + return _client->write( _opc_data, _opc_data.size() ); return -2; } @@ -131,7 +128,7 @@ int LedDeviceFadeCandy::sendSysEx(uint8_t systemId, uint8_t commandId, QByteArra sysExData += msg; - return _client.write( sysExData, sysExData.size() ); + return _client->write( sysExData, sysExData.size() ); } return -1; } diff --git a/libsrc/leddevice/dev_net/LedDeviceFadeCandy.h b/libsrc/leddevice/dev_net/LedDeviceFadeCandy.h index 11cd6f68..7d8318ad 100644 --- a/libsrc/leddevice/dev_net/LedDeviceFadeCandy.h +++ b/libsrc/leddevice/dev_net/LedDeviceFadeCandy.h @@ -56,17 +56,18 @@ public: /// @return true if success bool init(const QJsonObject &deviceConfig); +private: /// /// Writes the led color values to the led-device /// /// @param ledValues The color-value per led /// @return Zero on succes else negative /// - virtual int write(const std::vector & ledValues); + virtual int write(const std::vector& ledValues); -private: - QTcpSocket _client; - QString _host; +protected: + QTcpSocket* _client; + QString _host; uint16_t _port; unsigned _channel; QByteArray _opc_data; diff --git a/libsrc/leddevice/dev_net/ProviderUdp.h b/libsrc/leddevice/dev_net/ProviderUdp.h index 316902bd..b1532593 100644 --- a/libsrc/leddevice/dev_net/ProviderUdp.h +++ b/libsrc/leddevice/dev_net/ProviderUdp.h @@ -41,7 +41,7 @@ public: protected: /// - /// Writes the given bytes/bits to the SPI-device and sleeps the latch time to ensure that the + /// Writes the given bytes/bits to the UDP-device and sleeps the latch time to ensure that the /// values are latched. /// /// @param[in] size The length of the data diff --git a/libsrc/leddevice/schemas/schema-fadecandy.json b/libsrc/leddevice/schemas/schema-fadecandy.json index 78ef8241..e159d1f5 100644 --- a/libsrc/leddevice/schemas/schema-fadecandy.json +++ b/libsrc/leddevice/schemas/schema-fadecandy.json @@ -77,6 +77,7 @@ "gamma" : { "type" : "number", "title" : "edt_dev_spec_gamma_title", + "default": 1.0, "minimum" : 0.1, "maximum": 5.0, "options": { diff --git a/src/hyperiond/hyperiond.cpp b/src/hyperiond/hyperiond.cpp index b116c655..071b1530 100644 --- a/src/hyperiond/hyperiond.cpp +++ b/src/hyperiond/hyperiond.cpp @@ -75,6 +75,7 @@ HyperionDaemon::HyperionDaemon(QString configFile, const QString rootPath, QObje qRegisterMetaType("settings::type"); qRegisterMetaType("VideoMode"); qRegisterMetaType>("QMap"); + qRegisterMetaType>("std::vector"); // init settings _settingsManager = new SettingsManager(0,configFile); From 16b9bd7baa485dbc563e8c483e4a1e6a4945324c Mon Sep 17 00:00:00 2001 From: Paulchen-Panther Date: Tue, 2 Jul 2019 20:53:14 +0200 Subject: [PATCH 07/15] Fix Uni-/Multicolor assignment Signed-off-by: Paulchen-Panther --- include/hyperion/Hyperion.h | 6 ------ libsrc/hyperion/Hyperion.cpp | 41 ++++++++++-------------------------- 2 files changed, 11 insertions(+), 36 deletions(-) diff --git a/include/hyperion/Hyperion.h b/include/hyperion/Hyperion.h index c0edc66e..1c80fc06 100644 --- a/include/hyperion/Hyperion.h +++ b/include/hyperion/Hyperion.h @@ -477,12 +477,6 @@ private slots: /// void handleSettingsUpdate(const settings::type& type, const QJsonDocument& config); - /// - /// @brief Handle priority updates from Priority Muxer - /// @param priority The new visible priority - /// - void handlePriorityChanges(const quint8 &priority); - private: /// diff --git a/libsrc/hyperion/Hyperion.cpp b/libsrc/hyperion/Hyperion.cpp index 2f21c326..a2536000 100644 --- a/libsrc/hyperion/Hyperion.cpp +++ b/libsrc/hyperion/Hyperion.cpp @@ -106,9 +106,6 @@ Hyperion::Hyperion(HyperionDaemon* daemon, const quint8& instance, const QString _ledStringColorOrder.insert(_ledStringColorOrder.begin() + led.index, led.colorOrder); } - // connect Hyperion::handlePriorityChanges with Muxer visible priority changes as muxer updates independent - connect(&_muxer, &PriorityMuxer::visiblePriorityChanged, this, &Hyperion::handlePriorityChanges); - // listens for ComponentRegister changes of COMP_ALL to perform core enable/disable actions connect(&_componentRegister, &ComponentRegister::updatedComponentState, this, &Hyperion::updatedComponentState); @@ -565,18 +562,19 @@ const QString & Hyperion::getActiveDevice() void Hyperion::updatedComponentState(const hyperion::Components comp, const bool state) { - if(comp == hyperion::COMP_ALL) + QMutexLocker lock(&_changes); + + // evaluate comp change + if (comp != _prevCompId) { - if(state) - { - // first muxer to update all inputs - _muxer.setEnable(state); - } - else - { - _muxer.setEnable(state); - } + _imageProcessor->setBlackbarDetectDisable((_prevCompId == hyperion::COMP_EFFECT)); + _imageProcessor->setHardLedMappingType((_prevCompId == hyperion::COMP_EFFECT) ? 0 : -1); + _prevCompId = comp; + _raw2ledAdjustment->setBacklightEnabled((_prevCompId != hyperion::COMP_COLOR && _prevCompId != hyperion::COMP_EFFECT)); } + + if(comp == hyperion::COMP_ALL) + _muxer.setEnable(state); // first muxer to update all inputs } void Hyperion::update() @@ -658,20 +656,3 @@ void Hyperion::update() emit ledDeviceData(_ledBuffer); } } - -void Hyperion::handlePriorityChanges(const quint8 &priority) -{ - QMutexLocker lock(&_changes); - - // Obtain the current priority channel - const PriorityMuxer::InputInfo priorityInfo = _muxer.getInputInfo(priority); - - // evaluate comp change - if (priorityInfo.componentId != _prevCompId) - { - _imageProcessor->setBlackbarDetectDisable((_prevCompId == hyperion::COMP_EFFECT)); - _imageProcessor->setHardLedMappingType((_prevCompId == hyperion::COMP_EFFECT) ? 0 : -1); - _prevCompId = priorityInfo.componentId; - _raw2ledAdjustment->setBacklightEnabled((_prevCompId != hyperion::COMP_COLOR && _prevCompId != hyperion::COMP_EFFECT)); - } -} From 5c632b59357faeff98cab2242687d1a6009f278b Mon Sep 17 00:00:00 2001 From: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com> Date: Sat, 6 Jul 2019 14:45:30 +0200 Subject: [PATCH 08/15] The copy process has been corrected because the package names have changed --- bin/scripts/docker-compile.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bin/scripts/docker-compile.sh b/bin/scripts/docker-compile.sh index 86915d25..a804d6ad 100644 --- a/bin/scripts/docker-compile.sh +++ b/bin/scripts/docker-compile.sh @@ -81,8 +81,8 @@ mkdir $SCRIPT_PATH/deploy >/dev/null 2>&1 # get Hyperion source, cleanup previous folder echo "---> Downloading Hyperion source code from ${GIT_REPO_URL}" -sudo rm -fr $SCRIPT_PATH/hyperion >/dev/null 2>&1 -git clone --recursive --depth 1 -q $GIT_REPO_URL $SCRIPT_PATH/hyperion || { echo "---> Failed to download Hyperion source code! Abort"; exit 1; } +sudo rm -fr $SCRIPT_PATH/hyperion.ng >/dev/null 2>&1 +git clone --recursive --depth 1 -q $GIT_REPO_URL $SCRIPT_PATH/hyperion.ng || { echo "---> Failed to download Hyperion source code! Abort"; exit 1; } # start compilation # Remove container after stop @@ -93,15 +93,15 @@ git clone --recursive --depth 1 -q $GIT_REPO_URL $SCRIPT_PATH/hyperion || { echo echo "---> Startup docker..." $DOCKER run --rm \ -v "${SCRIPT_PATH}/deploy:/deploy" \ - -v "${SCRIPT_PATH}/hyperion:/source:ro" \ + -v "${SCRIPT_PATH}/hyperion.ng:/source:ro" \ hyperionproject/hyperion-ci:$BUILD_TARGET \ - /bin/bash -c "mkdir build && cp -r /source/. /build && - cd /build && mkdir build && cd build && + /bin/bash -c "mkdir hyperion.ng && cp -r /source/. /hyperion.ng && + cd /hyperion.ng && mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} .. || exit 2 && make -j $(nproc) ${PACKAGES} || exit 3 && echo '---> Copy binaries and packages to host folder: ${SCRIPT_PATH}/deploy' && - cp -v /build/build/bin/h* /deploy/ 2>/dev/null || : && - cp -v /build/build/Hyperion-* /deploy/ 2>/dev/null || : && + cp -v /hyperion.ng/build/bin/h* /deploy/ 2>/dev/null || : && + cp -v /hyperion.ng/build/Hyperion.NG-* /deploy/ 2>/dev/null || : && exit 0; exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 4; } From c574be7b751734c8c5abf22a41751a8bcbc6b0b8 Mon Sep 17 00:00:00 2001 From: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com> Date: Sun, 7 Jul 2019 10:47:43 +0200 Subject: [PATCH 09/15] [Hotfix] Led threads are now terminated correctly --- libsrc/leddevice/LedDeviceWrapper.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libsrc/leddevice/LedDeviceWrapper.cpp b/libsrc/leddevice/LedDeviceWrapper.cpp index 3e7eb86b..c11e6bda 100644 --- a/libsrc/leddevice/LedDeviceWrapper.cpp +++ b/libsrc/leddevice/LedDeviceWrapper.cpp @@ -51,13 +51,13 @@ void LedDeviceWrapper::createLedDevice(const QJsonObject& config) _ledDevice->moveToThread(thread); // setup thread management connect(thread, &QThread::started, _ledDevice, &LedDevice::start); - connect(thread, &QThread::finished, thread, &QObject::deleteLater); - connect(thread, &QThread::finished, _ledDevice, &QObject::deleteLater); + connect(thread, &QThread::finished, thread, &QThread::deleteLater); + connect(thread, &QThread::finished, _ledDevice, &LedDevice::deleteLater); // further signals - connect(this, &LedDeviceWrapper::write, _ledDevice, &LedDevice::write); - connect(_hyperion->getMuxerInstance(), &PriorityMuxer::visiblePriorityChanged, _ledDevice, &LedDevice::visiblePriorityChanged); - connect(_ledDevice, &LedDevice::enableStateChanged, this, &LedDeviceWrapper::handleInternalEnableState); + connect(this, &LedDeviceWrapper::write, _ledDevice, &LedDevice::write, Qt::QueuedConnection); + connect(_hyperion->getMuxerInstance(), &PriorityMuxer::visiblePriorityChanged, _ledDevice, &LedDevice::visiblePriorityChanged, Qt::QueuedConnection); + connect(_ledDevice, &LedDevice::enableStateChanged, this, &LedDeviceWrapper::handleInternalEnableState, Qt::QueuedConnection); // start the thread thread->start(); @@ -143,9 +143,17 @@ void LedDeviceWrapper::handleInternalEnableState(bool newState) void LedDeviceWrapper::stopDeviceThread() { + // turns the leds off _ledDevice->switchOff(); + + // get current thread QThread* oldThread = _ledDevice->thread(); - delete _ledDevice; // fast desctruction - oldThread->quit(); // non blocking - oldThread->wait(); + disconnect(oldThread, 0, 0, 0); + oldThread->quit(); + oldThread->deleteLater(); + oldThread = nullptr; + + disconnect(_ledDevice, 0, 0, 0); + _ledDevice->deleteLater(); + _ledDevice = nullptr; } From 5225be11727567d5b3e484f601b98480aa442890 Mon Sep 17 00:00:00 2001 From: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com> Date: Sun, 7 Jul 2019 16:32:25 +0200 Subject: [PATCH 10/15] Added POEditor badges to join translation of Hyperion --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 82a67f44..082015fd 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,9 @@ GitHub license + + Join Translation

This is a pre alpha development repository for the next major version of hyperion

From e0e0a84d0fce46d347dd545b59a741db8f66cb52 Mon Sep 17 00:00:00 2001 From: Paulchen Panther <16664240+Paulchen-Panther@users.noreply.github.com> Date: Sun, 7 Jul 2019 16:38:35 +0200 Subject: [PATCH 11/15] Update de.json (POEditor.com) --- assets/webconfig/i18n/de.json | 1510 +++++++++++++++++---------------- 1 file changed, 757 insertions(+), 753 deletions(-) diff --git a/assets/webconfig/i18n/de.json b/assets/webconfig/i18n/de.json index 4df08d03..94eace38 100644 --- a/assets/webconfig/i18n/de.json +++ b/assets/webconfig/i18n/de.json @@ -1,754 +1,758 @@ { - "general_webui_title" : "Hyperion - Web Konfiguration", - "general_country_de" : "Deutschland", - "general_country_us" : "Amerika", - "general_country_uk" : "England", - "general_country_fr" : "Frankreich", - "general_country_es" : "Spanien", - "general_country_it" : "Italien", - "general_country_nl" : "Niederlande", - "general_speech_de" : "Deutsch", - "general_speech_en" : "Englisch", - "general_speech_es" : "Spanisch", - "general_speech_it" : "Italienisch", - "general_speech_cs" : "Tschechisch", - "general_access_default" : "Standard", - "general_access_advanced" : "Fortgeschritten", - "general_access_expert" : "Experte", - "general_comp_SMOOTHING" : "Glättung", - "general_comp_BLACKBORDER" : "Schwarze Balken Erkennung", - "general_comp_FORWARDER" : "Weiterleitung", - "general_comp_UDPLISTENER" : "UDP Listener", - "general_comp_BOBLIGHTSERVER" : "Boblight Server", - "general_comp_FLATBUFSERVER" : "Flatbuffers Server", - "general_comp_PROTOSERVER" : "Protocol Buffers Server", - "general_comp_GRABBER" : "Plattform Aufnahme", - "general_comp_V4L" : "USB Aufnahme", - "general_comp_LEDDEVICE" : "LED Hardware", - "general_col_red" : "rot", - "general_col_green" : "grün", - "general_col_blue" : "blau", - "general_button_savesettings" : "Einstellungen speichern", - "general_btn_yes" : "Ja", - "general_btn_ok" : "OK", - "general_btn_cancel" : "Abbrechen", - "general_btn_continue" : "Fortfahren", - "general_btn_save" : "Speichern", - "general_btn_saverestart" : "Speichern und neustarten", - "general_btn_saveandreload" : "Speichern und neu laden", - "general_btn_restarthyperion" : "Hyperion neustarten", - "general_btn_off" : "Aus", - "general_btn_on" : "An", - "general_btn_next" : "Weiter", - "general_btn_back" : "Zurück", - "general_btn_iswitch" : "Switch", - "general_wiki_moreto" : "Mehr Informationen zu \"$1\" findest du in unserem Wiki", - "dashboard_label_intro" : "Das Dashboard zeigt dir Informationen zum Systemstatus, ob Updates verfügbar sind, den Komponentenstatus sowie die letzten Blog-Posts vom Hyperion Team.", - "dashboard_infobox_label_title" : "Information", - "dashboard_infobox_label_currenthyp" : "Deine Hyperion Version:", - "dashboard_infobox_label_latesthyp" : "Aktuellste Hyperion Version:", - "dashboard_infobox_label_platform" : "Plattform:", - "dashboard_infobox_label_instance" : "Instanz:", - "dashboard_infobox_label_ports" : "Ports (flat|proto):", - "dashboard_infobox_label_versionbranch" : "Versionszweig:", - "dashboard_infobox_message_updatewarning" : "Eine aktuellere Version von Hyperion ist verfügbar! (V$1)", - "dashboard_infobox_message_updatesuccess" : "Du nutzt die aktuellste Version von Hyperion.", - "dashboard_infobox_label_statush" : "Hyperion Status:", - "dashboard_infobox_label_smartacc" : "Schnellzugriff", - "dashboard_infobox_label_enableh" : "Aktiviere Hyperion", - "dashboard_infobox_label_disableh" : "Deaktiviere Hyperion", - "dashboard_componentbox_label_title" : "Komponenten Status", - "dashboard_componentbox_label_comp" : "Komponente", - "dashboard_componentbox_label_status" : "Status", - "dashboard_newsbox_label_title" : "Hyperion-Blog", - "dashboard_newsbox_visitblog" : "Besuche den Hyperion-Blog", - "dashboard_newsbox_noconn" : "Fehler bei dem Versuch die letzten Blog-Posts zu laden, funtkioniert dein Internet?", - "dashboard_newsbox_readmore" : "Weiterlesen", - "dashboard_alert_message_confedit_t" : "Konfiguration geändert", - "dashboard_alert_message_confedit" : "Deine Hyperion Konfiguration wurde verändert. Um die Änderungen anzuwenden, starte Hyperion neu.", - "dashboard_alert_message_disabled_t" : "Hyperion deaktiviert", - "dashboard_alert_message_disabled" : "Hyperion ist momentan deaktiviert! Um Hyperion zu nutzen, musst du es zuerst wieder im Dashboard aktivieren.", - "dashboard_alert_message_confsave_success_t" : "Konfiguration gespeichert", - "dashboard_alert_message_confsave_success" : "Deine Hyperion Konfiguration wurde erfolgreich gespeichert. Deine Änderungen sind somit übernommen.", - "main_menu_dashboard_token" : "Dashboard", - "main_menu_configuration_token" : "Konfiguration", - "main_menu_general_conf_token" : "Allgemein", - "main_menu_leds_conf_token" : "LED Hardware", - "main_menu_grabber_conf_token" : "Aufnahme Hardware", - "main_menu_effect_conf_token" : "Effekte", - "main_menu_colors_conf_token" : "Bildverarbeitung", - "main_menu_network_conf_token" : "Netzwerk", - "main_menu_remotecontrol_token" : "Fernbedienung", - "main_menu_effectsconfigurator_token" : "Effekt Konfigurator", - "main_menu_support_token" : "Hilfe", - "main_menu_update_token" : "Update", - "main_menu_system_token" : "System", - "main_menu_input_selection_token" : "Eingabeauswahl", - "main_menu_logging_token" : "Protokoll", - "main_menu_webconfig_token" : "Web Konfiguration", - "main_menu_about_token" : "Über Hyperion", - "main_ledsim_title" : "LED Visualisierung", - "main_ledsim_text" : "Eine live Visualisierung deiner LED Farben, sofern verfügbar kann ein live Video dazugeschalten werden.", - "main_ledsim_btn_toggleleds" : "Zeige LEDs", - "main_ledsim_btn_togglelednumber" : "LED Nummern", - "main_ledsim_btn_togglelivevideo" : "Live Video", - "conf_general_label_title" : "Allgemeine Einstellungen", - "conf_general_intro" : "Grundsätzliche Einstellungen zu Hyperion oder WebUI, die in keine andere Kategorie passen.", - "conf_general_impexp_title" : "Importiere/Exportiere Konfiguration", - "conf_general_impexp_l1" : "Importiere eine bestehende Konfiguration, indem du unten eine Datei auswählst und anschließend auf \"Importieren\" klickst.", - "conf_general_impexp_l2" : "Exportiere eine Konfiguration, indem du auf \"Exportieren\" klickst. Dein Browser startet einen Download.", - "conf_general_impexp_impbtn" : "Importieren", - "conf_general_impexp_expbtn" : "Exportieren", - "conf_helptable_option" : "Option", - "conf_helptable_expl" : "Erklärung", - "conf_effect_path_intro" : "Hier kannst du Ordner angeben, die beim Laden von Effekten berücksichtig werden sollen. Zusätzlich können Effekte anhand ihres Namens deaktiviert werden um sie aus Listen zu löschen.", - "conf_effect_fgeff_intro" : "Definiere einen Start Effekt/Farbe, dieser wird angezeigt, wenn Hyperion startet für die angegebene Dauer.", - "conf_effect_bgeff_intro" : "Definiere einen Hintergrund Effekt/Farbe. Dieser wird aktiv, wenn Hyperion sich im Leerlauf befindet. Wird immer mit Priorität 255 gestartet.", - "conf_leds_device_intro" : "Wähle eine Methode zur Steuerung deiner LEDs aus, sie sind unterteilt in verschiedene Kategorien. Neben den allgemeinen Optionen die für alle gültig sind, gibt es auch spezfische die sich unterscheiden je nach Wahl.", - "conf_leds_layout_intro" : "Du benötigst ebenfalls ein LED Layout, welches deine LED-Positionen wiederspiegelt. Das klassische Layout wird für gewöhnlichen für TVs verwendet, Hyperion unterstützt aber auch LED Wände (Matrix). Die Ansicht des LAYOUTS ist die perspektive VOR dem Fernseher, nicht dahinter.", - "conf_leds_nav_label_ledcontroller" : "LED Steuerung", - "conf_leds_nav_label_ledlayout" : "LED Layout", - "conf_leds_contr_label_contrtype" : "Steuerungstyp:", - "conf_leds_optgroup_RPiSPI" : "RPi SPI", - "conf_leds_optgroup_RPiPWM" : "RPi PWM", - "conf_leds_optgroup_RPiGPIO" : "RPi GPIO", - "conf_leds_optgroup_network" : "Netzwerk", - "conf_leds_optgroup_usb" : "USB", - "conf_leds_optgroup_debug" : "Debug", - "conf_leds_layout_btn_checklist" : "Zeige Checkliste", - "conf_leds_layout_checkp1" : "Die schwarze eingefärbte LED ist die erste LED. Das ist der Punkt, an dem die Daten eingespeist werden.", - "conf_leds_layout_checkp2" : "Das Layout ist die Ansicht vor dem Fernseher stehend, nicht dahinter.", - "conf_leds_layout_checkp3" : "Stelle sicher, dass die Richtung richtig eingestellt ist, dazu ist die zweite und dritte LED grau markiert um den Datenfluss anzuzeigen.", - "conf_leds_layout_checkp4" : "Vorgang Lücke: Solltest du eine Lücke benötigen, ignoriere diese bei der LED Angabe Oben/Unten/Rechts/Links und gebe anschließend unter Lückenlänge an, wieviel LEDs du abziehen möchtest. Verändere jetzt die Lückenposition, um die Lücke an die richtige Stelle zu rücken.", - "conf_leds_layout_frame" : "Klassisches Layout (Rahmen)", - "conf_leds_layout_matrix" : "Matrix Layout (LED Wand)", - "conf_leds_layout_generatedconf" : "Generierte/Aktuelle LED Konfiguration", - "conf_leds_layout_button_savelay" : "Speichere Layout", - "conf_leds_layout_button_updsim" : "Aktualisiere Vorschau", - "conf_leds_layout_peview" : "LED Layout Vorschau", - "conf_leds_layout_advanced" : "Erweiterte Optionen", - "conf_leds_layout_preview_originCL" : "Erstellt von: Klassisches Layout (Rahmen)", - "conf_leds_layout_preview_originTEXT" : "Erstellt von: Textfeld", - "conf_leds_layout_preview_originMA" : "Erstellt von: Matrix Layout (LED Wand)", - "conf_leds_layout_preview_totalleds" : "LEDs gesamt: $1", - "conf_leds_layout_preview_ledpower" : "Max. Stromstärke: $1 A", - "conf_leds_layout_preview_l1" : "Das ist die erste LED (Einspeisung)", - "conf_leds_layout_preview_l2" : "Das visualisiert die Richtung des Datenstroms (zweite/dritte LED)", - "conf_leds_layout_cl_top" : "Oben", - "conf_leds_layout_cl_bottom" : "Unten", - "conf_leds_layout_cl_left" : "Links", - "conf_leds_layout_cl_right" : "Rechts", - "conf_leds_layout_cl_gaglength" : "Lückenlänge", - "conf_leds_layout_cl_gappos" : "Lückenposition", - "conf_leds_layout_cl_inppos" : "Einspeisepunkt", - "conf_leds_layout_cl_reversdir" : "Richtung umkehren", - "conf_leds_layout_cl_hleddepth" : "Horizontale LED Tiefe", - "conf_leds_layout_cl_vleddepth" : "Vertikale LED Tiefe", - "conf_leds_layout_cl_generate" : "Generiere LED Konfiguration", - "conf_leds_layout_cl_edgegap" : "Rahmenabstand", - "conf_leds_layout_cl_cornergap" : "Eckabstand", - "conf_leds_layout_cl_overlap" : "Überlappung", - "conf_leds_layout_ma_horiz" : "Horizontal", - "conf_leds_layout_ma_vert" : "Vertikal", - "conf_leds_layout_ma_cabling" : "Verkabelung", - "conf_leds_layout_ma_optsnake" : "Schlange", - "conf_leds_layout_ma_optparallel" : "Parallel", - "conf_leds_layout_ma_order" : "Reihenfolge", - "conf_leds_layout_ma_opthoriz" : "Horizontal", - "conf_leds_layout_ma_optvert" : "Vertikal", - "conf_leds_layout_ma_position" : "Einpeisepunkt", - "conf_leds_layout_ma_opttopleft" : "Oben links", - "conf_leds_layout_ma_opttopright" : "Oben rechts", - "conf_leds_layout_ma_optbottomleft" : "Unten links", - "conf_leds_layout_ma_optbottomright" : "Unten rechts", - "conf_leds_layout_textf1" : "Das Textfeld zeigt dir dein aktuell geladenes Layout, sofern du kein neues Layout mit den Optionen oben erstellt hast. Optional kann man die Werte hier weiter bearbeiten.", - "conf_grabber_fg_intro" : "Plattform Aufnahme ist das lokale System auf dem Hyperion installiert wurde, welches als Bildquelle dient.", - "conf_grabber_v4l_intro" : "USB Aufnahme ist ein Gerät, welches via USB angeschlossen ist und als Bildquelle dient.", - "conf_colors_color_intro" : "Erstelle Kalibrierungsprofile die einzelnen Komponenten zugewisen werden können. Passe dabei Farben, Gamma, Helligkeit, Kompensation und mehr an.", - "conf_colors_smoothing_intro" : "Glätte den Farbverlauf und Helligkeitsänderungen um nicht von schnellen Übergängen abgelenkt zu werden.", - "conf_colors_blackborder_intro" : "Ignoriere schwarze Balken, jeder Modus nutzt einen anderen Algorithmus um diese zu erkennen. Erhöhe die Schwelle, sollte es nicht funktionieren.", - "conf_network_json_intro" : "Der JSON-RPC-Port dieser Hyperion-Instanz, wird genutzt zur Fernsteuerung.", - "conf_network_bobl_intro" : "Boblight Empfänger", - "conf_network_udpl_intro" : "UDP Empfänger", - "conf_network_fbs_intro" : "Google Flatbuffers Empfänger. Wird genutzt für schnellen Bildempfang.", - "conf_network_proto_intro" : "Der PROTO-Port dieser Hyperion-Instanz, wird genutzt für \"Bildstreams\" (HyperionScreenCap, Kodi Addon, ...)", - "conf_network_forw_intro" : "Leite alles an eine zweite Hyperion Instanz weiter, diese kann dann mit einer anderen LED Steuerung genutzt werden", - "conf_logging_label_intro" : "Überprüfe die Meldungen im Prokotoll um zu erfahren was Hyperion gerade beschäftigt. Je nach eingestellter Protokoll-Stufe siehst du mehr oder weniger Informationen.", - "conf_logging_btn_pbupload" : "Bericht für Supportanfrage hochladen", - "conf_logging_btn_autoscroll" : "Automatisch scrollen", - "conf_logging_nomessage" : "Keine Einträge vorhanden.", - "conf_logging_uploading" : "Aufbereitung der Daten...", - "conf_logging_yourlink" : "Link zu deinem Bericht", - "conf_logging_uplfailed" : "Hochladen fehlgeschlagen! Überprüfe deine Internetverbindung!", - "conf_logging_report" : "Bericht", - "conf_logging_lastreports" : "Frühere Berichte", - "conf_logging_uplpolicy" : "Hiermit akzeptierst du die", - "conf_logging_contpolicy" : "Berichts-Datenschutzerklärung", - "conf_webconfig_label_intro" : "Einstellungen zur Webkonfiguration. Änderungen können die Erreichbarkeit des Webinterfaces beeinflussen.", - "remote_losthint" : "Notiz: Alle Änderungen gehen nach einem Neustart verloren.", - "remote_color_label" : "Farbe/Effekt", - "remote_color_intro" : "Setze einen Effekt oder eine Farbe. Auch deine selbst erstellten Effekte sind gelistet (sofern verfügbar). $1", - "remote_color_button_reset" : "Farbe/Effekt zurücksetzen", - "remote_color_label_color" : "Farbe:", - "remote_effects_label_effects" : "Effekt:", - "remote_adjustment_label" : "Farbanpassung", - "remote_adjustment_intro" : "Verändere live Farbe/Helligkeit/Kompensation. $1", - "remote_videoMode_label" : "Video Modus", - "remote_videoMode_intro" : "Wähle zwischen verschiedenen Video Modi um neben 2D auch 3D Filme zu genießen. Unterstützt werden alle Aufnahmearten. $1", - "remote_videoMode_3DSBS" : "3DSBS", - "remote_videoMode_3DTAB" : "3DTAB", - "remote_videoMode_2D" : "2D", - "remote_input_label" : "Quellenauswahl", - "remote_input_intro" : "Hyperion nutzt ein Prioritätensystem um die Quelle zu wählen. Alles was du setzt hat eine Priorität (Effekte/Farben/Plattform Aufnahme/USB Aufnahme und Netzwerkquellen). Standardmäßig nutzt Hyperion die Quelle mit der niedrigsten Priorität. Hier kannst du aktiv Einfluss darauf nehmen. $1", - "remote_input_label_autoselect" : "Automatische Auswahl", - "remote_input_setsource_btn" : "Wähle Quelle", - "remote_input_sourceactiv_btn" : "Quelle aktiv", - "remote_input_origin" : "Ursprung", - "remote_input_owner" : "Typ", - "remote_input_priority" : "Priorität", - "remote_input_status" : "Status/Aktion", - "remote_input_duration" : "Dauer:", - "remote_input_ip" : "IP:", - "remote_input_clearall" : "Lösche alle Effekte/Farben", - "remote_components_label" : "Komponentensteuerung", - "remote_components_intro" : "Starte und stoppe Komponenten von Hyperion. $1", - "remote_optgroup_usreffets" : "Benutzer Effekte", - "remote_optgroup_syseffets" : "Mitgelieferte Effekte", - "remote_maptype_label" : "LED-Bereich Zuordnung", - "remote_maptype_intro" : "Für gewöhnlich entscheidet dein LED Layout welchen Bildbereich welche LED bekommt, dies kann hier geändert werden. $1", - "remote_maptype_label_multicolor_mean" : "Mehrfarbig", - "remote_maptype_label_unicolor_mean" : "Einfarbig", - "effectsconfigurator_label_intro" : "Erstelle auf Grundlage der Basiseffekte neue Effekt die nach deinen Wünschen angepasst sind. Je nach Effekt stehen Optionen wie Farbe, Geschwindigkeit, oder Richtung und vieles mehr zur Auswahl.", - "effectsconfigurator_label_chooseeff" : "Template auswählen", - "effectsconfigurator_editdeleff" : "Entferne/Lade Effekt", - "effectsconfigurator_button_saveeffect" : "Effekt speichern", - "effectsconfigurator_label_effectname" : "Effektname", - "effectsconfigurator_button_starttest" : "Starte Test", - "effectsconfigurator_button_stoptest" : "Stoppe Test", - "effectsconfigurator_button_conttest" : "Fortlaufender Test", - "effectsconfigurator_button_deleffect" : "Effekt entfernen", - "effectsconfigurator_button_editeffect" : "Effekt laden", - "support_label_title" : "Unterstütze Hyperion", - "support_label_intro" : "Hyperion ist ein kostenloses Open Source Projekt und ein kleines Team arbeitet an seiner Weiterentwicklung. Darum benötigen wir DEINE Unterstützung um weiter in bessere Infrastruktur und Weiterentwicklung investieren zu können.", - "support_label_spreadtheword" : "Weitersagen!", - "support_label_fbtext" : "Teile Inhalte in Facebook und halte dich und andere auf dem Laufenden", - "support_label_twtext" : "Nutze die 140 Zeichen und bleibe auf dem Laufenden auch auf Twitter", - "support_label_ggtext" : "Platziere uns in deinen Kreisen auf Google+", - "support_label_yttext" : "Gelangweilt von Bildern? Werfe einen Blick auf unsere Youtube Videos", - "support_label_igtext" : "Schau doch mal bei Instagram vorbei!", - "support_label_donate" : "Spende oder nutze unsere Affiliate Links", - "support_label_affinstr1" : "Klicke auf den Link deines Landes", - "support_label_affinstr2" : "Kaufe wie gewohnt ein, abhängig von deinem Umsatz bekommen wir eine kleine Provision", - "support_label_affinstr3" : "Du zahlst immer den selben Preis. Teste es!", - "support_label_btctext" : "Adresse:", - "support_label_donationpp" : "Spende:", - "support_label_webrestitle" : "Informationsquellen und Hilfe", - "support_label_webpagetitle" : "Internetseite", - "support_label_webpagetext" : "Das Zuhause von Hyperion", - "support_label_wikititle" : "Wiki", - "support_label_wikitext" : "Von A bis Z - Alles wissenwerte zu Hyperion", - "support_label_forumtitle" : "Forum", - "support_label_forumtext" : "Diskussion und Hilfestellung von der Community", - "support_label_ghtext" : "Besuche uns auf Github", - "update_label_intro" : "Diese Seite zeigt dir alle verfügbaren Versionen von Hyperion, du kannst nach Belieben eine aktuellere Version installieren oder eine Ältere. Die aktuellsten Versionen befinden sich immer oben.", - "update_label_description" : "Beschreibung:", - "update_button_install" : "Installieren", - "update_button_changelog" : "Zeige Änderungsprotokoll", - "update_label_type" : "Art:", - "update_versreminder" : "Deine Version: $1", - "update_error_getting_versions" : "Wir hatten Probleme die verfügbaren Versionen zu ermitteln.", - "about_version" : "Version", - "about_build" : "Build", - "about_builddate" : "Build Datum", - "about_translations" : "Übersetzungen", - "about_resources" : "$1 Bibliotheken", - "about_contribute" : "Entwickel Hyperion mit uns weiter!", - "about_credits" : "Einen Dank an alle Entwickler!", - "info_conlost_label_title" : "Verbindung zum Hyperion Service unterbrochen!", - "info_conlost_label_reason" : "Mögliche Ursachen:", - "info_conlost_label_reason1" : "- Schlechte WLAN Verbindung", - "info_conlost_label_reason2" : "- Ein Update wird durchgeführt", - "info_conlost_label_reason3" : "- Hyperion wird nicht mehr ausgeführt", - "info_conlost_label_autorecon" : "Du wirst verbunden, sobald Hyperion wieder verfügbar ist.", - "info_conlost_label_autorefresh" : "Diese Seite wird automatisch aktualisiert.", - "info_conlost_label_reload" : "Automatisches verbinden gestoppt - limit überschritten. Lade die Seite neu oder klick mich.", - "info_restart_title" : "Startet gerade neu...", - "info_restart_rightback" : "Hyperion ist gleich wieder für dich da!", - "info_restart_contus" : "Solltest du nach 20 Sekunden immer noch hier sein, ist etwas schief gelaufen. Öffne bitte in unserem Support Forum ein neues Thema...", - "info_restart_contusa" : "...mit deinen letztes Schritten. Danke!", - "info_404" : "Die angeforderte Seite ist nicht verfügbar!", - "infoDialog_general_success_title" : "Erfolg", - "infoDialog_general_error_title" : "Fehler", - "infoDialog_general_warning_title" : "Warnung", - "infoDialog_checklist_title" : "Checkliste!", - "infoDialog_effconf_deleted_text" : "Der Effekt \"$1\" wurde erfolgreich entfernt!", - "infoDialog_effconf_created_text" : "Der Effekt \"$1\" wurde erfolgreich erstellt!", - "InfoDialog_lang_title" : "Spracheinstellung", - "InfoDialog_lang_text" : "Sollte dir die Vorauswahl der automatischen Spracherkennung nicht gefallen, kannst du die Sprache hier manuell festlegen.", - "InfoDialog_access_title" : "Einstellungsstufe", - "InfoDialog_access_text" : "Je höher die Stufe je mehr Einstellungen und Funktionen stehen zur Verfügung. Empfohlen ist \"Standard\".", - "InfoDialog_nowrite_title" : "Fehler beim Schreibzugriff!", - "InfoDialog_nowrite_text" : "Hyperion hat keinen Schreibzugriff auf die aktuell geladene Konfiguration. Bitte korrigiere die Dateizugriffsrechte um fortzufahren.", - "InfoDialog_nowrite_foottext" : "Die Webkonfiguration wird automatisch wieder freigegeben, sobald das Problem behoben wurde!", - "infoDialog_wizrgb_text" : "Deine RGB Byte Reihenfolge ist bereits richtig eingestellt.", - "infoDialog_writeimage_error_text": "Die ausgewählte Datei \"$1\" ist keine Bilddatei oder ist beschädigt! Bitte wähle eine andere Bilddatei aus.", - "infoDialog_writeconf_error_text" : "Das speichern der Konfiguration ist fehlgeschlagen.", - "infoDialog_import_jsonerror_text" : "Die ausgewählte Konfigurations-Datei \"$1\" ist keine .json Datei oder ist beschädigt! Fehlermeldung: ($2)", - "infoDialog_import_hyperror_text" : "Die ausgewählte Konfigurations-Datei \"$1\" kann nicht importiert werden. Sie ist nicht kompatibel mit Hyperion 2.0 und höher!", - "infoDialog_import_comperror_text" : "Dein Browser unterstützt leider keinen Import. Bitte versuche es mit einem anderen Browser erneut.", - "infoDialog_import_confirm_title" : "Bestätige Import", - "infoDialog_import_confirm_text" : "Bist du sicher, dass du die Konfigurations-Datei \"$1\" importieren möchtest? Diese Aktion kann nicht rückgängig gemacht werden!", - "InfoDialog_iswitch_title" : "Hyperion switcher", - "InfoDialog_iswitch_text" : "Sollte in deinem lokalen Netzwerk Hyperion mehr als einmal laufen, kannst du hier zwischen den Web Konfigurationen hin und her schalten. Wähle dazu die Instanz unten aus und switche!", - "wiz_wizavail" : "Assistent verfügbar", - "wiz_guideyou" : "Der $1 wird dich durch die Konfiguration leiten, drücke dazu einfach den Button!", - "wiz_rgb_title" : "RGB Byte Reihenfolge Assistent", - "wiz_rgb_intro1" : "Dieser Assisent wird dir dabei helfen die richtige Byte Reihenfolge für deine leds zu finden. Klicke auf Fortfahren um zu beginnen.", - "wiz_rgb_intro2" : "Wann benötigt man diesen Assistenten? Zur Erstkonfiguration oder wenn deine LEDs zb rot leuchten sollten, sie aber blau oder grün sind.", - "wiz_rgb_expl" : "Der Farbpunkt ändert alle x Sekunden die Farbe (rot, grün), zur selben Zeit ändern deine LEDs die Farbe ebenfalls. Beantworte die Fragen unten, um deine RGB Byte Reihenfolge zu überprüfen/korrigieren.", - "wiz_rgb_switchevery" : "Ändere Farbe alle...", - "wiz_rgb_q" : "Welche Farbe zeigen deine LEDs, wenn der Farbpunkt oben...", - "wiz_rgb_qrend" : "...rot ist?", - "wiz_rgb_qgend" : "...grün ist?", - "wiz_hue_title" : "Philips Hue Assistent", - "wiz_hue_intro1" : "Dieser Assistent hilft dir bei der Konfiguration von Hyperion für Philips Hue. Zu den Funktionen zählen ein automatisches finden der Hue Bridge, einen neuen Benutzer erstellen, die einzelnen Lampen unterschiedlichen Bereichen im Bild zuzuordnen und weitere Einstellungen von Hyperion automatisch anzupassen. Kurz gesagt: Komplette Einrichtung mit ein paar Klicks.", - "wiz_hue_desc1" : "Es wird automatisch nach der Hue Bridge gesucht, solltest sie nicht gefunden werden, gebe die IP an und drücke den \"neu laden\" Button. Danach benötigst du eine gültige Benutzer ID, diese kann auch erstellt werden.", - "wiz_hue_desc2" : "Nun kannst du auswählen, welche der Lampen (IDs) hinzugefügt werden sollen. Mit der Position wählst du aus, wo die jeweilige Lampe \"im Bild\" sitzen soll. Deaktivierte Lampen werden nicht hinzugefügt. Als Hilfe zur Identifizierung kannst du sie mit einem Klick auf den rechten Button kurz aufleuchten lassen.", - "wiz_hue_ip" : "Hue Bridge IP:", - "wiz_hue_username" : "Benutzer ID:", - "wiz_hue_create_user" : "Neuen Benutzer erstellen", - "wiz_hue_failure_ip" : "Keine Hue Bridge gefunden, bitte überprüfe die IP", - "wiz_hue_failure_connection" : "Zeitüberschreitung. Bitte drücke die Taste auf deiner Hue Bridge rechtzeitig", - "wiz_hue_failure_user" : "Benutzer ID wurde nicht gefunden, erstelle eine Neue oder gib eine bereits registrierte an.", - "wiz_hue_press_link" : "Bitte \"Link\" Taste auf der Hue Bridge drücken.", - "wiz_hue_ids_disabled" : "Deaktiviert", - "wiz_hue_ids_entire" : "Ganzes Bild", - "wiz_hue_noids" : "Diese Hue Bridge hat keine verbundenen Lampen, bitte verbinde diese zuerst mit deiner Hue Bridge (Nutze die Hue Apps dafür)", - "wiz_hue_pos": "Position/Status", - "wiz_hue_searchb": "Suche nach Hue Bridge...", - "wiz_hue_blinkblue": "Lasse ID $1 blau aufleuchten", - "wiz_hue_ident" : "Identifiziere", - "wiz_cc_title" : "Farbkalibrierungs Assistent", - "wiz_cc_intro1" : "Der Assistent wird dich durch die Kalibrierung deiner LEDs leiten. Sofern du Kodi nutzt, können die Bilder und Testvideos direkt an Kodi geschickt werden. Andernfalls musst du das Material selbst herunterladen und anwenden.", - "wiz_cc_kwebs" : "Kodi Webserver (IP:Port)", - "wiz_cc_kodidiscon" : "Kodi Webserver nicht gefunden, fahre ohne Kodi-Unterstützung fort.", - "wiz_cc_kodidisconlink" : "Download Link Bilder:", - "wiz_cc_kodicon" : "Kodi Webserver gefunden, fahre mit Kodi-Unterstützung fort.", - "wiz_cc_kodimsg_start" : "Test bestanden - Zeit zu beginnen", - "wiz_cc_kodishould" : "Kodi sollte jetzt folgendes Bild anzeigen: $1", - "wiz_cc_lettvshow" : "Lass dabei deinen Fernseher folgendes Bild anzeigen: $1", - "wiz_cc_lettvshowm" : "Überprüfe dies mithilfe folgender Bildern: $1", - "wiz_cc_adjustit" : "Verändere dein \"$1\", bis du zufrieden bist. Beachte: Je mehr du reduzierst bzw von dem Standardwert abweichst, je mehr veränderst du den maximalen Farbraum, was alle Farben die daraus abgeleitet werden ebenfalls betrifft. Je nach TV/LED Farbspektrum sind die Ergebnisse unterschiedlich.", - "wiz_cc_adjustgamma" : "Gamma: Was du jetzt tun musst ist, jeden Gamma-Kanal so einstellen, dass der \"Grauverlauf\" auf den LEDs nicht grünlich/rötlich/bläulich aussieht. Neutral ist übrigens 1.0. Beispiel: Sollte dein grau etwas rötlich sein bedeutet dies, dass du dein Gamma für Rot erhöhen musst um den Rot-Anteil zu verringern (Je mehr Gamma, desto weniger Farbe).", - "wiz_cc_chooseid" : "Wähle einen Namen für dieses Farb-Profil.", - "wiz_cc_btn_switchpic" : "Testbild ändern", - "wiz_cc_backlight" : "Zusätzlich kannst du eine Hintergrundbeluchtung einstellen, um \"irritierende Farben\" bei fast schwarzem Bild zu vermeiden oder du den Wechsel zwischen Farbe und Aus als zu anstrengend empfindest. Zusätzlich kann bestimmt werden, ob diese farbig oder nur weiß sein soll. Wird automatisch deaktiviert im Zustand \"Aus\" sowie bei \"Farbe\" und \"Effekt\".", - "wiz_cc_testintro" : "Nun ist es an der Zeit für einen Testlauf.", - "wiz_cc_testintrok" : "Klicke auf einen Button, um eines der Testvideos abzuspielen.", - "wiz_cc_testintrowok" : "Unter folgendem Link findest du ein paar Testvideos zum herunterladen und abspielen:", - "wiz_cc_link" : "Klick mich", - "wiz_cc_morethanone" : "Du hast mehr als 1 Profil, bitte wähle das zu kalibrierende Profil", - "wiz_cc_btn_stop" : "Stoppe Video", - "wiz_cc_summary" : "Im folgenden eine Zusammenfassung deiner Einstellungen. Während du ein Video abspielst, kannst du hier weiter ausprobieren. Wenn du fertig bist, klicke auf speichern.", - "edt_dev_auth_key_title" : "Authentisierungstoken", - "edt_dev_enum_subtract_minimum" : "Subtrahiere minimum", - "edt_dev_enum_sub_min_cool_adjust" : "Minimale Anpassung: cool", - "edt_dev_enum_sub_min_warm_adjust" : "Minimale Anpassung: warm", - "edt_dev_enum_white_off" : "Weiß ist aus", - "edt_dev_general_heading_title" : "Allgemeine Einstellungen", - "edt_dev_general_hardwareLedCount_title" : "Anzahl Hardware LEDs", - "edt_dev_general_colorOrder_title" : "RGB Byte Reihenfolge", - "edt_dev_general_rewriteTime_title" : "Aktualisierungszeit", - "edt_dev_spec_header_title" : "Spezifische Einstellungen", - "edt_dev_spec_baudrate_title" : "Baudrate", - "edt_dev_spec_spipath_title" : "SPI Pfad", - "edt_dev_spec_invert_title" : "Invertiere Signal", - "edt_dev_spec_multicastGroup_title" : "Multicast Gruppe", - "edt_dev_spec_numberOfLeds_title" : "Anzahl der LEDs", - "edt_dev_spec_port_title" : "Port", - "edt_dev_spec_orbIds_title" : "Orb ID(s)", - "edt_dev_spec_useOrbSmoothing_title" : "Nutze Orb Glättung", - "edt_dev_spec_targetIp_title" : "Ziel IP", - "edt_dev_spec_targetIpHost_title" : "Ziel IP/hostname", - "edt_dev_spec_outputPath_title" : "Ausgabepfad", - "edt_dev_spec_delayAfterConnect_title" : "Verzögerung nach Verbindung", - "edt_dev_spec_FCsetConfig_title" : "Wende fadecandy Konfiguration an", - "edt_dev_spec_FCmanualControl_title" : "Manuelle Steuerung der fadecandy LEDs", - "edt_dev_spec_FCledToOn_title" : "Fadecandy LEDs set to on", - "edt_dev_spec_interpolation_title" : "Interpolation", - "edt_dev_spec_dithering_title" : "Dithering", - "edt_dev_spec_gamma_title" : "Gamma", - "edt_dev_spec_whitepoint_title" : "Weißpunkt", - "edt_dev_spec_username_title" : "Benutzername", - "edt_dev_spec_lightid_title" : "Lampen ID(s)", - "edt_dev_spec_lightid_itemtitle" : "ID", - "edt_dev_spec_transistionTime_title" : "Übergangszeit", - "edt_dev_spec_switchOffOnBlack_title" : "Aus bei schwarz", - "edt_dev_spec_brightnessFactor_title" : "Helligkeitsfaktor", - "edt_dev_spec_uid_title" : "UID", - "edt_dev_spec_intervall_title" : "Intervall", - "edt_dev_spec_latchtime_title" : "Sperrzeit", - "edt_dev_spec_maxPacket_title" : "Paketgröße", - "edt_dev_spec_serial_title" : "Seriennummer", - "edt_dev_spec_vid_title" : "VID", - "edt_dev_spec_pid_title" : "PID", - "edt_dev_spec_cid_title" : "CID", - "edt_dev_spec_LBap102Mode_title" : "LightBerry APA102 Modus", - "edt_dev_spec_universe_title" : "Universum", - "edt_dev_spec_whiteLedAlgor_title" : "Weiß Algorithmus", - "edt_dev_spec_useRgbwProtocol_title" : "Nutze RGBW Protokoll", - "edt_dev_spec_maximumLedCount_title" : "Maximale Anzahl LEDs", - "edt_dev_spec_gpioNumber_title" : "GPIO Nummer", - "edt_dev_spec_gpioMap_title" : "GPIO Zuweisung", - "edt_dev_spec_PBFiFo_title" : "Pi-Blaster FiFo", - "edt_dev_spec_gpioBcm_title" : "GPIO Pin", - "edt_dev_spec_ledIndex_title" : "LED index", - "edt_dev_spec_colorComponent_title" : "Farbkomponente", - "edt_dev_spec_ledType_title" : "LED typ", - "edt_dev_spec_dmaNumber_title" : "DMA Kanal", - "edt_conf_general_enable_title" : "Aktiviert", - "edt_conf_general_enable_expl" : "Wenn aktiviert, ist die Komponente aktiv.", - "edt_conf_general_priority_title" : "Priorität", - "edt_conf_general_priority_expl" : "Die Priorität dieser Komponente.", - "edt_conf_general_port_title" : "Port", - "edt_conf_general_port_expl" : "Der genutzte Port.", - "edt_conf_enum_color" : "Farbe", - "edt_conf_enum_effect" : "Effekt", - "edt_conf_enum_multicolor_mean" : "Mehrfarbig", - "edt_conf_enum_unicolor_mean" : "Einfarbig", - "edt_conf_enum_rgb" : "RGB", - "edt_conf_enum_bgr" : "BGR", - "edt_conf_enum_rbg" : "RBG", - "edt_conf_enum_brg" : "BRG", - "edt_conf_enum_gbr" : "GBR", - "edt_conf_enum_grb" : "GRB", - "edt_conf_enum_linear" : "Linear", - "edt_conf_enum_PAL" : "PAL", - "edt_conf_enum_NTSC" : "NTSC", - "edt_conf_enum_SECAM" : "SECAM", - "edt_conf_enum_NO_CHANGE" : "Auto", - "edt_conf_enum_logsilent" : "Stille", - "edt_conf_enum_logwarn" : "Warnung", - "edt_conf_enum_logverbose" : "Ausführlich", - "edt_conf_enum_logdebug" : "Debug", - "edt_conf_enum_bbdefault" : "Standard", - "edt_conf_enum_bbclassic" : "Klassisch", - "edt_conf_enum_bbosd" : "OSD", - "edt_conf_enum_automatic" : "Automatisch", - "edt_conf_gen_heading_title" : "Allgemeine Einstellungen", - "edt_conf_gen_name_title" : "Name der Konfiguration", - "edt_conf_gen_name_expl" : "Der Name wird verwendet, um Hyperion besser zu identifizieren. (Hilfreich bei mehreren Instanzen)", - "edt_conf_gen_showOptHelp_title" : "Zeige Erklärungen", - "edt_conf_gen_showOptHelp_expl" : "Zeige alle verfügbaren Options-Erklärungen. Empfohlen für Anfänger", - "edt_conf_gen_versionBranch_title" : "Versionszweig", - "edt_conf_gen_versionBranch_expl" : "Gibt an, welcher Versionszweig für die Suche von neuen Hyperion Versionen genutzt werden soll.", - "edt_conf_color_heading_title" : "Farbkalibrierung", - "edt_conf_color_channelAdjustment_header_title" : "Anpassung Farbkanäle", - "edt_conf_color_channelAdjustment_header_itemtitle" : "Profil", - "edt_conf_color_channelAdjustment_header_expl" : "Passe die Farbkanäle deinen LEDs an", - "edt_conf_color_imageToLedMappingType_title" : "LED-Bereich Zuordnungstyp", - "edt_conf_color_imageToLedMappingType_expl" : "Sofern nicht \"Mehrfarbig\", wird dein LED Layout mit einer anderen Bildzuweisung überschrieben", - "edt_conf_color_id_title" : "ID", - "edt_conf_color_id_expl" : "Eine vom Benutzer frei angegebene ID.", - "edt_conf_color_leds_title" : "LED index", - "edt_conf_color_leds_expl" : "Zugewiesen zu allen (*) LEDs oder nur zu bestimmten LED Nummern (0-17).", - "edt_conf_color_black_title" : "Schwarz", - "edt_conf_color_black_expl" : "Kalibrierter Schwarzwert.", - "edt_conf_color_white_title" : "Weiß", - "edt_conf_color_white_expl" : "Kalibrierter Weißwert.", - "edt_conf_color_red_title" : "Rot", - "edt_conf_color_red_expl" : "Kalibrierter Rotwert.", - "edt_conf_color_green_title" : "Grün", - "edt_conf_color_green_expl" : "Kalibrierter Grünwert.", - "edt_conf_color_blue_title" : "Blau", - "edt_conf_color_blue_expl" : "Kalibrierter Blauwert.", - "edt_conf_color_cyan_title" : "Cyan", - "edt_conf_color_cyan_expl" : "Kalibrierter Cyanwert.", - "edt_conf_color_magenta_title" : "Magenta", - "edt_conf_color_magenta_expl" : "Kalibrierter Magentawert.", - "edt_conf_color_yellow_title" : "Gelb", - "edt_conf_color_yellow_expl" : "Kalibrierter Gelbwert.", - "edt_conf_color_gammaRed_title" : "Gamma Rot", - "edt_conf_color_gammaRed_expl" : "Gamma von rot. 1.0 ist neutral. Über 1.0 wird rot reduziert, unter 1.0 wird rot erhöht.", - "edt_conf_color_gammaGreen_title" : "Gamma Grün", - "edt_conf_color_gammaGreen_expl" : "Gamma von grün. 1.0 ist neutral. Über 1.0 wird grün reduziert, unter 1.0 wird grün erhöht.", - "edt_conf_color_gammaBlue_title" : "Gamma Blau", - "edt_conf_color_gammaBlue_expl" : "Gamma von blau. 1.0 ist neutral. Über 1.0 wird blau reduziert, unter 1.0 wird blau erhöht.", - "edt_conf_color_backlightThreshold_title" : "Hintergrund - beleuchtung", - "edt_conf_color_backlightThreshold_expl" : "Eine Beleuchtung die dauerhaft aktiv ist. (Automatisch deaktiviert bei Effekten, Farben oder im Zustand \"Aus\")", - "edt_conf_color_backlightColored_title" : "Farbige Hintergrund - beleuchtung", - "edt_conf_color_backlightColored_expl" : "Die Hintergrundbeleuchtung kann mit oder ohne Farbanteile genutzt werden.", - "edt_conf_color_brightness_title" : "Helligkeit", - "edt_conf_color_brightness_expl" : "Die gesamte Helligkeit", - "edt_conf_color_brightnessComp_title" : "Helligkeits Kompensation", - "edt_conf_color_brightnessComp_expl" : "Kompensiert unterschiede in der Helligkeit zwischen Rot Grün Blau, Cyan Magenta Gelb und weiß. 100 ist volle Kompensation, 0 keine Kompensation", - "edt_conf_smooth_heading_title" : "Glättung", - "edt_conf_smooth_type_title" : "Art", - "edt_conf_smooth_type_expl" : "Algorithmus der Glättung.", - "edt_conf_smooth_time_ms_title" : "Zeit", - "edt_conf_smooth_time_ms_expl" : "Wie lange soll die Glättung Bilder sammeln?", - "edt_conf_smooth_updateFrequency_title" : "Aktualisierungsfrequenz", - "edt_conf_smooth_updateFrequency_expl" : "Die Geschwindigkeit der Datenausgabe an die LED Steuerung.", - "edt_conf_smooth_updateDelay_title" : "Aktualisierungsverzögerung", - "edt_conf_smooth_updateDelay_expl" : "Verzögere die Ausgabe, sollte dein ambient light schneller sein als dein TV.", - "edt_conf_smooth_continuousOutput_title" : "Fortlaufende Ausgabe", - "edt_conf_smooth_continuousOutput_expl" : "Aktualisiere die LEDs, auch wenn das Bild sich nicht geändert hat.", - "edt_conf_v4l2_heading_title" : "USB Aufnahme", - "edt_conf_v4l2_device_title" : "Gerät", - "edt_conf_v4l2_device_expl" : "Der Pfad zum USB (v4l) Aufnahmegerät. Wähle 'auto' für automatische Erkennung. Beispiel: '/dev/video0'", - "edt_conf_v4l2_standard_title" : "Videoformat", - "edt_conf_v4l2_standard_expl" : "Wähle das passende Videoformat deiner Region. Auf 'Auto' wird der gewählte Modus vom v4l interface beibehalten.", - "edt_conf_v4l2_sizeDecimation_title" : "Bildverkleinerung Faktor", - "edt_conf_v4l2_sizeDecimation_expl" : "Der Faktor der Bildverkleinerung ausgehend von der ursprünglichen Größe, 1 bedeutet keine Änderung (originales Bild).", - "edt_conf_v4l2_cropLeft_title" : "Entferne links", - "edt_conf_v4l2_cropLeft_expl" : "Anzahl der Pixel auf der linken Seite die vom Bild entfernt werden.", - "edt_conf_v4l2_cropRight_title" : "Entferne rechts", - "edt_conf_v4l2_cropRight_expl" : "Anzahl der Pixel auf der rechten Seite die vom Bild entfernt werden.", - "edt_conf_v4l2_cropTop_title" : "Entferne oben", - "edt_conf_v4l2_cropTop_expl" : "Anzahl der Pixel auf der oberen Seite die vom Bild entfernt werden.", - "edt_conf_v4l2_cropBottom_title" : "Entferne unten", - "edt_conf_v4l2_cropBottom_expl" : "Anzahl der Pixel auf der unteren Seite die vom Bild entfernt werden.", - "edt_conf_v4l2_signalDetection_title" : "Signal Erkennung", - "edt_conf_v4l2_signalDetection_expl" : "Wenn aktiviert, wird die USB Aufnahme temporär bei \"kein Signal\" abgeschalten. Das Bild muss dazu 4 Sekunden lang unter die Schwellwerte fallen.", - "edt_conf_v4l2_redSignalThreshold_title" : "Rote Signalschwelle", - "edt_conf_v4l2_redSignalThreshold_expl" : "Je höher die rote Schwelle je eher wird abgeschalten bei entsprechendem rot-Anteil.", - "edt_conf_v4l2_greenSignalThreshold_title" : "Grüne Signalschwelle", - "edt_conf_v4l2_greenSignalThreshold_expl" : "Je höher die grüne Schwelle je eher wird abgeschalten bei entsprechendem grün-Anteil.", - "edt_conf_v4l2_blueSignalThreshold_title" : "Blaue Signalschwelle", - "edt_conf_v4l2_blueSignalThreshold_expl" : "Je höher die blaue Schwelle je eher wird abgeschalten bei entsprechendem blau-Anteil.", - "edt_conf_v4l2_sDVOffsetMin_title" : "Signal Erkennung VMin", - "edt_conf_v4l2_sDVOffsetMin_expl" : "Signal Erkennungs-Bereich vertikal minimum (0.0-1.0)", - "edt_conf_v4l2_sDHOffsetMin_title" : "Signal Erkennung HMin", - "edt_conf_v4l2_sDHOffsetMin_expl" : "Signal Erkennungs-Bereich horizontal minimum (0.0-1.0)", - "edt_conf_v4l2_sDVOffsetMax_title" : "Signal Erkennung VMax", - "edt_conf_v4l2_sDVOffsetMax_expl" : "Signal Erkennungs-Bereich vertikal maximum (0.0-1.0)", - "edt_conf_v4l2_sDHOffsetMax_title" : "Signal Erkennung HMax", - "edt_conf_v4l2_sDHOffsetMax_expl" : "Signal Erkennungs-Bereich horizontal maximum (0.0-1.0)", - "edt_conf_instCapture_heading_title" : "Instance Aufnahme", - "edt_conf_instC_systemEnable_title" : "Aktiviere Plattform Aufnahme", - "edt_conf_instC_systemEnable_expl" : "Aktiviert die Plattform Aufnahme für diese LED Hardware Instanz", - "edt_conf_instC_v4lEnable_title" : "Aktiviere USB Aufnahme", - "edt_conf_instC_v4lEnable_expl" : "Aktiviert die USB Aufnahme für diese LED Hardware Instanz", - "edt_conf_fg_heading_title" : "Plattform Aufnahme", - "edt_conf_fg_type_title" : "Typ", - "edt_conf_fg_type_expl" : "Art der Plattform Aufnahme, standard ist 'auto'", - "edt_conf_fg_frequency_Hz_title" : "Aufnahmefrequenz", - "edt_conf_fg_frequency_Hz_expl" : "Wie schnell neue Bilder aufgenommen werden.", - "edt_conf_fg_width_title" : "Breite", - "edt_conf_fg_width_expl" : "Verkleinere Bild auf dieser Breite, da das Rohmaterial viel Leistung benötigen würde.", - "edt_conf_fg_height_title" : "Höhe", - "edt_conf_fg_height_expl" : "Verkleinere Bild auf dieser Höhe, da das Rohmaterial viel Leistung benötigen würde.", - "edt_conf_fg_pixelDecimation_title" : "Bildverkleinerung Faktor", - "edt_conf_fg_pixelDecimation_expl" : "Bildverkleinerung (Faktor) ausgehend von der original Größe. 1 für unveränderte/originale Größe.", - "edt_conf_fg_device_title" : "Device", - "edt_conf_fg_display_title" : "Display", - "edt_conf_fg_display_expl" : "Gebe an von welchem Desktop aufgenommen werden soll. (Multi Monitor Setup)", - "edt_conf_bb_heading_title" : "Schwarze Balken Erkennung", - "edt_conf_bb_threshold_title" : "Schwelle", - "edt_conf_bb_threshold_expl" : "Wenn die Erkennung nicht funktioniert, erhöhe die Schwelle um auf 'graues' schwarz zu reagieren.", - "edt_conf_bb_unknownFrameCnt_title" : "Unbekannte Bilder", - "edt_conf_bb_unknownFrameCnt_expl" : "Anzahl an Bildern die negativ sind, welche den Rand auf 0 zurücksetzen.", - "edt_conf_bb_borderFrameCnt_title" : "Randbilder", - "edt_conf_bb_borderFrameCnt_expl" : "Anzahl an Bildern bis ein neuer Rand festgelegt wird.", - "edt_conf_bb_maxInconsistentCnt_title" : "Inkosistente Bilder", - "edt_conf_bb_maxInconsistentCnt_expl" : "Anzahl der zu ignorierenden Bilder bis ein neuer Rand überprüft wird.", - "edt_conf_bb_blurRemoveCnt_title" : "Unscharfe Pixel", - "edt_conf_bb_blurRemoveCnt_expl" : "Anzahl an Pixeln, die zusätzlich vom Rand abgeschnitten werden.", - "edt_conf_bb_mode_title" : "Modus", - "edt_conf_bb_mode_expl" : "Algorithmus zur Auswertung. (siehe Wiki)", - "edt_conf_fge_heading_title" : "Start Effekt/Farbe", - "edt_conf_fge_type_title" : "Typ", - "edt_conf_fge_type_expl" : "Wähle zwischen einem Effekt oder einer Farbe.", - "edt_conf_fge_color_title" : "Farbe", - "edt_conf_fge_color_expl" : "Sofern der Typ \"Farbe\" ist, stelle hier eine Farbe deiner Wahl sein.", - "edt_conf_fge_effect_title" : "Effekt", - "edt_conf_fge_effect_expl" : "Sofern der Typ \"Effekt\" ist, wähle hier einen Effekt deiner Wahl. (Gilt auch für selbst erstellte)", - "edt_conf_fge_duration_ms_title" : "Dauer", - "edt_conf_fge_duration_ms_expl" : "Dauer des Effekts/Farbe beim Hyperion Start.", - "edt_conf_bge_heading_title" : "Hintergrund Effekt/Farbe", - "edt_conf_fw_heading_title" : "Weiterleitung", - "edt_conf_fw_json_title" : "Liste von Json zielen", - "edt_conf_fw_json_expl" : "Ein Json Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19446)", - "edt_conf_fw_json_itemtitle" : "Json Ziel", - "edt_conf_fw_proto_title" : "Liste von Proto zielen", - "edt_conf_fw_proto_expl" : "Ein Proto Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19401)", - "edt_conf_fw_proto_itemtitle" : "Proto Ziel", - "edt_conf_js_heading_title" : "JSON Server", - "edt_conf_fbs_heading_title" : "Flatbuffers Server", - "edt_conf_fbs_timeout_title" : "Zeitüberschreitung", - "edt_conf_fbs_timeout_expl" : "Wenn für die angegebene Zeit keine Daten empfangen werden, wird die Komponente (vorübergehend) deaktiviert", - "edt_conf_pbs_heading_title" : "Protocol Buffers Server", - "edt_conf_pbs_timeout_title" : "Zeitüberschreitung", - "edt_conf_pbs_timeout_expl" : "Wenn für die angegebene Zeit keine Daten empfangen werden, wird die Komponente (vorübergehend) deaktiviert", - "edt_conf_bobls_heading_title" : "Boblight Server", - "edt_conf_udpl_heading_title" : "UDP Listener", - "edt_conf_udpl_address_title" : "Adresse", - "edt_conf_udpl_address_expl" : "Die Adresse auf der UDP Pakete akzeptiert werden.", - "edt_conf_udpl_timeout_title" : "Zeitüberschreitung", - "edt_conf_udpl_timeout_expl" : "Wenn für die angegebene Zeit keine UDP Pakete empfangen werden, wird die Komponente (vorübergehend) deaktiviert", - "edt_conf_udpl_shared_title" : "Gemeinsam genutzt", - "edt_conf_udpl_shared_expl" : "Wird gemeinsam über alle Hyperion Instanzen genutzt.", - "edt_conf_webc_heading_title" : "Web Konfiguration", - "edt_conf_webc_docroot_title" : "Verzeichnis", - "edt_conf_webc_docroot_expl" : "Lokaler Pfad zum WebUI Wurzelverzeichnis (Nur für WebUI Entwickler)", - "edt_conf_effp_heading_title" : "Effekt Pfade", - "edt_conf_effp_paths_title" : "Effekt Pfad(e)", - "edt_conf_effp_paths_expl" : "Es können mehrere Ordner definiert werden die Effekte enthalten. Der Effekt Konfigurator speichert immer im Ersten Ordner.", - "edt_conf_effp_paths_itemtitle" : "Pfad", - "edt_conf_effp_disable_title" : "Deaktivierte Effekte", - "edt_conf_effp_disable_expl" : "Trage hier die Namen der Effekte ein, die in Effektlisten nicht mehr zur Auswahl stehen sollen.", - "edt_conf_effp_disable_itemtitle" : "Effekt", - "edt_conf_log_heading_title" : "Protokoll", - "edt_conf_log_level_title" : "Protokollstufe", - "edt_conf_log_level_expl" : "Abhängig der Stufe sind weniger oder mehr Meldungen sichtbar.", - "edt_eff_smooth_custom" : "Aktivere Glättung", - "edt_eff_smooth_time_ms" : "Glättung: Zeit", - "edt_eff_smooth_updateFrequency" : "Glättung: Aktualisierungsfrequenz", - "edt_eff_candle_header" : "Kerze", - "edt_eff_candle_header_desc" : "Flackerndes Kerzenlicht", - "edt_eff_waves_header" : "Wellen", - "edt_eff_waves_header_desc" : "Gestalte Wellen aus Farbe! Mische dazu deine lieblings Farben und wähle einen Mittelpunkt.", - "edt_eff_gif_header" : "GIF's", - "edt_eff_gif_header_desc" : "Dieser Effekt spielt .gif Dateien ab. Bietet die Möglichkeit kleine GIF-Videos abzuspielen.", - "edt_eff_police_header" : "Polizei", - "edt_eff_police_header_desc" : "Lights like a police car in action", - "edt_eff_fade_header" : "Farbübergang", - "edt_eff_fade_header_desc" : "Farbübergange für alle LED's", - "edt_eff_rainbowmood_header" : "Regenbogen", - "edt_eff_rainbowmood_header_desc" : "Alle LEDs Regenbogen Farbübergang", - "edt_eff_knightrider_header" : "Knight Rider", - "edt_eff_knightrider_header_desc" : "K.I.T.T ist zurück! Der Front-Scanner des bekannten Autos, diesmal nicht nur in rot.", - "edt_eff_lightclock_header" : "Lichtuhr", - "edt_eff_lightclock_header_desc" : "Eine echte Uhr als Licht! Passe die Farben von Stunden, Minuten, Sekunden deinen Vorstellungen an. Optional können 3/6/9/12 Uhr Markierungen aktiviert werden. Sollte die Uhr eine falsche Zeit anzeigen, überprüfe die Uhrzeit deines Systems.", - "edt_eff_pacman_header" : "Pac-Man", - "edt_eff_pacman_header_desc" : "Klein gefräßig und gelb, wer wird überleben?", - "edt_eff_moodblobs_header" : "Stimmungskugeln", - "edt_eff_moodblobs_header_desc" : "Entspannt den Abend beginnen mit langsam bewegenden Farbkugeln die ebenso sanft ihre Farbe verändern.", - "edt_eff_swirl_header" : "Farbwirbel", - "edt_eff_swirl_header_desc" : "Ein Wirbel mit frei wählbaren Farben. Die Farben werden gleichmäßig auf 360° aufgeteilt, dazwischen werden Farbübergänge berechnet. Zusätzlich kann ein zweiter Wirbel über den Ersten gelegt werden (Transparenz beachten!). Tipp: Eine Widerholung der selben Farbe erhöht deren \"größe\" und verringert den Bereich des Farbübergangs zu benachbarten Farben.", - "edt_eff_random_header" : "Zufällig", - "edt_eff_random_header_desc" : "Pixel-Farb-Mix", - "edt_eff_systemshutdown_header" : "Herunterfahren", - "edt_eff_systemshutdown_header_desc" : "Eine kurze Animation gefolgt von einem möglicherweise echten Herunterfahren des Systems", - "edt_eff_snake_header" : "Schlange", - "edt_eff_snake_header_desc" : "Wo ist das Futter?", - "edt_eff_sparks_header" : "Funken", - "edt_eff_sparks_header_desc" : "Ein Sternenfunkeln, wahlweise in festgelegter Farbe oder zufällig. Passe Helligkeit, Sättigung und Geschwindigkeit an.", - "edt_eff_traces_header" : "Farbspuren", - "edt_eff_x-mas_header" : "Weihnachten", - "edt_eff_x-mas_header_desc" : "Ein Hauch von Weihnachten", - "edt_eff_trails_header" : "Sternschnuppen", - "edt_eff_trails_header_desc" : "In verschiedenen Farben, wünsch dir was!", - "edt_eff_flag_header" : "Flaggen", - "edt_eff_flag_header_desc" : "Verpasse deinen LEDs die Farben deines Landes. Du kannst mehr als eine Flagge auswählen, je nach Intervall werden diese dann abwechselnd angezeigt.", - "edt_eff_enum_all" : "Alle", - "edt_eff_enum_all-together" : "Alle zusammen", - "edt_eff_enum_list" : "LED Liste", - "edt_eff_count" : "Anzahl", - "edt_eff_color" : "Farbe", - "edt_eff_colorrandom" : "Zufällige Farbe", - "edt_eff_colorone" : "Farbe eins", - "edt_eff_colortwo" : "Farbe zwei", - "edt_eff_colorcount" : "Farblänge", - "edt_eff_rotationtime" : "Rotationszeit", - "edt_eff_sleeptime" : "Schlafzeit", - "edt_eff_reversedirection" : "Richtung umkehren", - "edt_eff_fadeintime" : "Zeit für Einblendung", - "edt_eff_fadeouttime" : "Zeit für Ausblendung", - "edt_eff_repeat" : "Wiederholung", - "edt_eff_colorendtime" : "Zeit für Start-Farbe", - "edt_eff_colorstarttime" : "Zeit für End-Farbe", - "edt_eff_colorstart" : "Farbe Start", - "edt_eff_colorend" : "Farbe Ende", - "edt_eff_repeatcount" : "Anzahl Wiederholung", - "edt_eff_maintain_end_color" : "Behalte Endfarbe", - "edt_eff_colorshift" : "Farbverschiebung", - "edt_eff_whichleds" : "Welche LEDs", - "edt_eff_ledlist" : "LED Liste", - "edt_eff_speed" : "Geschwindigkeit", - "edt_eff_fadefactor" : "Verblass Faktor", - "edt_eff_showseconds" : "Zeige Sekunden", - "edt_eff_blobcount" : "Kugelanzahl", - "edt_eff_huechange" : "Farbänderung", - "edt_eff_basecolorchange" : "Basisfarben verändern", - "edt_eff_basecolorchangerate" : "BF Geschwindigkeit", - "edt_eff_basecolorrangeleft" : "BF Bereich links", - "edt_eff_basecolorrangeright" : "BF Bereich rechts", - "edt_eff_brightness" : "Helligkeit", - "edt_eff_centerx" : "Mittelpunkt X-Achse", - "edt_eff_centery" : "Mittelpunkt Y-Achse", - "edt_eff_saturation" : "Sättigung", - "edt_eff_colorevel" : "Farbstufe", - "edt_eff_whitelevel" : "Weißstufe", - "edt_eff_alarmcolor" : "Alarm Farbe", - "edt_eff_postcolor" : "Startfarbe", - "edt_eff_enableshutdown" : "Echtes herunterfahren", - "edt_eff_length" : "Länge", - "edt_eff_frequency" : "Frequenz", - "edt_eff_min_len" : "Minimale Länge", - "edt_eff_max_len" : "Maximale Länge", - "edt_eff_height" : "Höhe", - "edt_eff_offset" : "Verschiebung", - "edt_eff_colorHour" : "Farbe Stunde", - "edt_eff_colorMinute" : "Farbe Minute", - "edt_eff_colorSecond" : "Farbe Sekunde", - "edt_eff_colorMarker" : "Marker Farbe", - "edt_eff_markerDepth" : "Marker Tiefe", - "edt_eff_markerWidth" : "Marker Breite", - "edt_eff_markerEnable" : "Zeige Marker", - "edt_eff_backgroundColor" : "Hintergrundfarbe", - "edt_eff_countries" : "Länder", - "edt_eff_interval" : "Intervall", - "edt_eff_margin" : "Abstand", - "edt_eff_customColor" : "Benutzerdefinierte Farbe", - "edt_eff_randomCenter" : "Zufälliger Mittelpunkt", - "edt_eff_enableSecondSwirl":"Zweiter Wirbel", - "edt_eff_reverseRandomTime":"Richtungswechsel alle", - "edt_append_ns" : "ns", - "edt_append_ms" : "ms", - "edt_append_s" : "s", - "edt_append_hz" : "Hz", - "edt_append_pixel" : "Pixel", - "edt_append_percent" : "%", - "edt_append_degree" : "°", - "edt_append_sdegree" : "s/grad", - "edt_append_leds" : "LEDs", - "edt_msg_error_notset" : "Attribut muss gesetzt sein", - "edt_msg_error_notempty" : "Eingabe benötigt", - "edt_msg_error_enum" : "Die Eingabe muss einem der aufgeführten Werte entsprechen", - "edt_msg_error_anyOf" : "Die Eingabe muss gegen mindestens eines der gegebenen Schemata validiert werden können", - "edt_msg_error_oneOf" : "Die Eingabe muss gegen genau eines der gegebenen Schemata validiert werden können. Momentan können $1 Schemata validiert werden", - "edt_msg_error_not" : "Die Eingabe darf nicht gegen das gegebene Schema validiert werden können", - "edt_msg_error_type_union" : "Die Eingabe muss einem der gegebenen Typen entsprechen", - "edt_msg_error_type" : "Die Eingabe muss vom Typ $1 sein", - "edt_msg_error_disallow_union" : "Die Eingabe darf nicht einem der gegebenen Werte entsprechen", - "edt_msg_error_disallow" : "Die Eingabe muss vom Typ $1 sein", - "edt_msg_error_multipleOf" : "Die Eingabe muss ein Vielfaches von $1 sein", - "edt_msg_error_maximum_excl" : "Der Wert muss kleiner als $1 sein", - "edt_msg_error_maximum_incl" : "Der Wert darf höchstens $1 sein", - "edt_msg_error_minimum_excl" : "Der Wert muss größer als $1 sein", - "edt_msg_error_minimum_incl" : "Der Wert muss mindestens $1 sein", - "edt_msg_error_maxLength" : "Die Eingabe darf höchstens $1 Zeichen lang sein", - "edt_msg_error_minLength" : "Die Eingabe muss mindestens $1 Zeichen lang sein", - "edt_msg_error_pattern" : "Die Eingabe muss dem gegebenen Muster entsprechen", - "edt_msg_error_additionalItems" : "In diesem Feld sind keine weiteren Elemente erlaubt", - "edt_msg_error_maxItems" : "Das Feld darf höchstens $1 Element(e) beinhalten", - "edt_msg_error_minItems" : "Das Feld muss mindestens $1 Element(e) beinhalten", - "edt_msg_error_uniqueItems" : "Das Feld darf nur einzigartige Elemente beinhalten", - "edt_msg_error_maxProperties" : "Das Objekt darf höchstens $1 Attribute habe", - "edt_msg_error_minProperties" : "Das Objekt muss mindestens $1 Attribute haben", - "edt_msg_error_required" : "Das Objekt beinhaltet nicht das benötigte Attribut '$1'", - "edt_msg_error_additional_properties" : "Es sind keine weiteren Attribute erlaubt. $1 muss entfernt werden", - "edt_msg_error_dependency" : "Das Attribut $1 ist zwingend erforderlich", - "edt_msg_button_delete_all" : "Alle", - "edt_msg_button_delete_all_title" : "Alle löschen", - "edt_msg_button_delete_last" : "Letzes $1-Element", - "edt_msg_button_delete_last_title" : "Letzes $1-Element löschen", - "edt_msg_button_add_row_title" : "$1 Hinzufügen", - "edt_msg_button_move_down_title" : "Nach unten verschieben", - "edt_msg_button_move_up_title" : "Nach oben verschieben", - "edt_msg_button_delete_row_title" : "$1 Löschen", - "edt_msg_button_delete_row_title_short" : "Löschen", - "edt_msg_button_collapse" : "Einklappen", - "edt_msg_button_expand" : "Ausklappen" -} + "general_webui_title": "Hyperion - Web Konfiguration", + "general_country_de": "Deutschland", + "general_country_us": "Amerika", + "general_country_uk": "England", + "general_country_fr": "Frankreich", + "general_country_es": "Spanien", + "general_country_it": "Italien", + "general_country_nl": "Niederlande", + "general_speech_de": "Deutsch", + "general_speech_en": "Englisch", + "general_speech_es": "Spanisch", + "general_speech_it": "Italienisch", + "general_speech_cs": "Tschechisch", + "general_access_default": "Standard", + "general_access_advanced": "Fortgeschritten", + "general_access_expert": "Experte", + "general_comp_SMOOTHING": "Glättung", + "general_comp_BLACKBORDER": "Schwarze Balken Erkennung", + "general_comp_FORWARDER": "Weiterleitung", + "general_comp_UDPLISTENER": "UDP Listener", + "general_comp_BOBLIGHTSERVER": "Boblight Server", + "general_comp_FLATBUFSERVER": "Flatbuffers Server", + "general_comp_PROTOSERVER": "Protocol Buffers Server", + "general_comp_GRABBER": "Plattform Aufnahme", + "general_comp_V4L": "USB Aufnahme", + "general_comp_LEDDEVICE": "LED Hardware", + "general_col_red": "rot", + "general_col_green": "grün", + "general_col_blue": "blau", + "general_button_savesettings": "Einstellungen speichern", + "general_btn_yes": "Ja", + "general_btn_ok": "OK", + "general_btn_cancel": "Abbrechen", + "general_btn_continue": "Fortfahren", + "general_btn_save": "Speichern", + "general_btn_saverestart": "Speichern und neustarten", + "general_btn_saveandreload": "Speichern und neu laden", + "general_btn_restarthyperion": "Hyperion neustarten", + "general_btn_off": "Aus", + "general_btn_on": "An", + "general_btn_next": "Weiter", + "general_btn_back": "Zurück", + "general_btn_iswitch": "Switch", + "general_wiki_moreto": "Mehr Informationen zu \"$1\" findest du in unserem Wiki", + "dashboard_label_intro": "Das Dashboard zeigt dir Informationen zum Systemstatus, ob Updates verfügbar sind, den Komponentenstatus sowie die letzten Blog-Posts vom Hyperion Team.", + "dashboard_infobox_label_title": "Information", + "dashboard_infobox_label_currenthyp": "Deine Hyperion Version:", + "dashboard_infobox_label_latesthyp": "Aktuellste Hyperion Version:", + "dashboard_infobox_label_platform": "Plattform:", + "dashboard_infobox_label_instance": "Instanz:", + "dashboard_infobox_label_ports": "Ports (flat|proto):", + "dashboard_infobox_label_versionbranch": "Versionszweig:", + "dashboard_infobox_message_updatewarning": "Eine aktuellere Version von Hyperion ist verfügbar! (V$1)", + "dashboard_infobox_message_updatesuccess": "Du nutzt die aktuellste Version von Hyperion.", + "dashboard_infobox_label_statush": "Hyperion Status:", + "dashboard_infobox_label_smartacc": "Schnellzugriff", + "dashboard_infobox_label_enableh": "Aktiviere Hyperion", + "dashboard_infobox_label_disableh": "Deaktiviere Hyperion", + "dashboard_componentbox_label_title": "Komponenten Status", + "dashboard_componentbox_label_comp": "Komponente", + "dashboard_componentbox_label_status": "Status", + "dashboard_newsbox_label_title": "Hyperion-Blog", + "dashboard_newsbox_visitblog": "Besuche den Hyperion-Blog", + "dashboard_newsbox_noconn": "Fehler bei dem Versuch die letzten Blog-Posts zu laden, funtkioniert dein Internet?", + "dashboard_newsbox_readmore": "Weiterlesen", + "dashboard_alert_message_confedit_t": "Konfiguration geändert", + "dashboard_alert_message_confedit": "Deine Hyperion Konfiguration wurde verändert. Um die Änderungen anzuwenden, starte Hyperion neu.", + "dashboard_alert_message_disabled_t": "Hyperion deaktiviert", + "dashboard_alert_message_disabled": "Hyperion ist momentan deaktiviert! Um Hyperion zu nutzen, musst du es zuerst wieder im Dashboard aktivieren.", + "dashboard_alert_message_confsave_success_t": "Konfiguration gespeichert", + "dashboard_alert_message_confsave_success": "Deine Hyperion Konfiguration wurde erfolgreich gespeichert. Deine Änderungen sind somit übernommen.", + "main_menu_dashboard_token": "Dashboard", + "main_menu_configuration_token": "Konfiguration", + "main_menu_general_conf_token": "Allgemein", + "main_menu_leds_conf_token": "LED Hardware", + "main_menu_grabber_conf_token": "Aufnahme Hardware", + "main_menu_effect_conf_token": "Effekte", + "main_menu_colors_conf_token": "Bildverarbeitung", + "main_menu_network_conf_token": "Netzwerk", + "main_menu_remotecontrol_token": "Fernbedienung", + "main_menu_effectsconfigurator_token": "Effekt Konfigurator", + "main_menu_support_token": "Hilfe", + "main_menu_update_token": "Update", + "main_menu_system_token": "System", + "main_menu_input_selection_token": "Eingabeauswahl", + "main_menu_logging_token": "Protokoll", + "main_menu_webconfig_token": "Web Konfiguration", + "main_menu_about_token": "Über Hyperion", + "main_ledsim_title": "LED Visualisierung", + "main_ledsim_text": "Eine live Visualisierung deiner LED Farben, sofern verfügbar kann ein live Video dazugeschalten werden.", + "main_ledsim_btn_toggleleds": "Zeige LEDs", + "main_ledsim_btn_togglelednumber": "LED Nummern", + "main_ledsim_btn_togglelivevideo": "Live Video", + "conf_general_label_title": "Allgemeine Einstellungen", + "conf_general_intro": "Grundsätzliche Einstellungen zu Hyperion oder WebUI, die in keine andere Kategorie passen.", + "conf_general_impexp_title": "Importiere/Exportiere Konfiguration", + "conf_general_impexp_l1": "Importiere eine bestehende Konfiguration, indem du unten eine Datei auswählst und anschließend auf \"Importieren\" klickst.", + "conf_general_impexp_l2": "Exportiere eine Konfiguration, indem du auf \"Exportieren\" klickst. Dein Browser startet einen Download.", + "conf_general_impexp_impbtn": "Importieren", + "conf_general_impexp_expbtn": "Exportieren", + "conf_helptable_option": "Option", + "conf_helptable_expl": "Erklärung", + "conf_effect_path_intro": "Hier kannst du Ordner angeben, die beim Laden von Effekten berücksichtig werden sollen. Zusätzlich können Effekte anhand ihres Namens deaktiviert werden um sie aus Listen zu löschen.", + "conf_effect_fgeff_intro": "Definiere einen Start Effekt/Farbe, dieser wird angezeigt, wenn Hyperion startet für die angegebene Dauer.", + "conf_effect_bgeff_intro": "Definiere einen Hintergrund Effekt/Farbe. Dieser wird aktiv, wenn Hyperion sich im Leerlauf befindet. Wird immer mit Priorität 255 gestartet.", + "conf_leds_device_intro": "Wähle eine Methode zur Steuerung deiner LEDs aus, sie sind unterteilt in verschiedene Kategorien. Neben den allgemeinen Optionen die für alle gültig sind, gibt es auch spezfische die sich unterscheiden je nach Wahl.", + "conf_leds_layout_intro": "Du benötigst ebenfalls ein LED Layout, welches deine LED-Positionen wiederspiegelt. Das klassische Layout wird für gewöhnlichen für TVs verwendet, Hyperion unterstützt aber auch LED Wände (Matrix). Die Ansicht des LAYOUTS ist die perspektive VOR dem Fernseher, nicht dahinter.", + "conf_leds_nav_label_ledcontroller": "LED Steuerung", + "conf_leds_nav_label_ledlayout": "LED Layout", + "conf_leds_contr_label_contrtype": "Steuerungstyp:", + "conf_leds_optgroup_RPiSPI": "RPi SPI", + "conf_leds_optgroup_RPiPWM": "RPi PWM", + "conf_leds_optgroup_RPiGPIO": "RPi GPIO", + "conf_leds_optgroup_network": "Netzwerk", + "conf_leds_optgroup_usb": "USB", + "conf_leds_optgroup_debug": "Debug", + "conf_leds_layout_btn_checklist": "Zeige Checkliste", + "conf_leds_layout_checkp1": "Die schwarze eingefärbte LED ist die erste LED. Das ist der Punkt, an dem die Daten eingespeist werden.", + "conf_leds_layout_checkp2": "Das Layout ist die Ansicht vor dem Fernseher stehend, nicht dahinter.", + "conf_leds_layout_checkp3": "Stelle sicher, dass die Richtung richtig eingestellt ist, dazu ist die zweite und dritte LED grau markiert um den Datenfluss anzuzeigen.", + "conf_leds_layout_checkp4": "Vorgang Lücke: Solltest du eine Lücke benötigen, ignoriere diese bei der LED Angabe Oben/Unten/Rechts/Links und gebe anschließend unter Lückenlänge an, wieviel LEDs du abziehen möchtest. Verändere jetzt die Lückenposition, um die Lücke an die richtige Stelle zu rücken.", + "conf_leds_layout_frame": "Klassisches Layout (Rahmen)", + "conf_leds_layout_matrix": "Matrix Layout (LED Wand)", + "conf_leds_layout_generatedconf": "Generierte/Aktuelle LED Konfiguration", + "conf_leds_layout_button_savelay": "Speichere Layout", + "conf_leds_layout_button_updsim": "Aktualisiere Vorschau", + "conf_leds_layout_peview": "LED Layout Vorschau", + "conf_leds_layout_advanced": "Erweiterte Optionen", + "conf_leds_layout_preview_originCL": "Erstellt von: Klassisches Layout (Rahmen)", + "conf_leds_layout_preview_originTEXT": "Erstellt von: Textfeld", + "conf_leds_layout_preview_originMA": "Erstellt von: Matrix Layout (LED Wand)", + "conf_leds_layout_preview_totalleds": "LEDs gesamt: $1", + "conf_leds_layout_preview_ledpower": "Max. Stromstärke: $1 A", + "conf_leds_layout_preview_l1": "Das ist die erste LED (Einspeisung)", + "conf_leds_layout_preview_l2": "Das visualisiert die Richtung des Datenstroms (zweite/dritte LED)", + "conf_leds_layout_cl_top": "Oben", + "conf_leds_layout_cl_bottom": "Unten", + "conf_leds_layout_cl_left": "Links", + "conf_leds_layout_cl_right": "Rechts", + "conf_leds_layout_cl_gaglength": "Lückenlänge", + "conf_leds_layout_cl_gappos": "Lückenposition", + "conf_leds_layout_cl_inppos": "Einspeisepunkt", + "conf_leds_layout_cl_reversdir": "Richtung umkehren", + "conf_leds_layout_cl_hleddepth": "Horizontale LED Tiefe", + "conf_leds_layout_cl_vleddepth": "Vertikale LED Tiefe", + "conf_leds_layout_cl_generate": "Generiere LED Konfiguration", + "conf_leds_layout_cl_edgegap": "Rahmenabstand", + "conf_leds_layout_cl_cornergap": "Eckabstand", + "conf_leds_layout_cl_overlap": "Überlappung", + "conf_leds_layout_ma_horiz": "Horizontal", + "conf_leds_layout_ma_vert": "Vertikal", + "conf_leds_layout_ma_cabling": "Verkabelung", + "conf_leds_layout_ma_optsnake": "Schlange", + "conf_leds_layout_ma_optparallel": "Parallel", + "conf_leds_layout_ma_order": "Reihenfolge", + "conf_leds_layout_ma_opthoriz": "Horizontal", + "conf_leds_layout_ma_optvert": "Vertikal", + "conf_leds_layout_ma_position": "Einpeisepunkt", + "conf_leds_layout_ma_opttopleft": "Oben links", + "conf_leds_layout_ma_opttopright": "Oben rechts", + "conf_leds_layout_ma_optbottomleft": "Unten links", + "conf_leds_layout_ma_optbottomright": "Unten rechts", + "conf_leds_layout_textf1": "Das Textfeld zeigt dir dein aktuell geladenes Layout, sofern du kein neues Layout mit den Optionen oben erstellt hast. Optional kann man die Werte hier weiter bearbeiten.", + "conf_grabber_fg_intro": "Plattform Aufnahme ist das lokale System auf dem Hyperion installiert wurde, welches als Bildquelle dient.", + "conf_grabber_v4l_intro": "USB Aufnahme ist ein Gerät, welches via USB angeschlossen ist und als Bildquelle dient.", + "conf_colors_color_intro": "Erstelle Kalibrierungsprofile die einzelnen Komponenten zugewisen werden können. Passe dabei Farben, Gamma, Helligkeit, Kompensation und mehr an.", + "conf_colors_smoothing_intro": "Glätte den Farbverlauf und Helligkeitsänderungen um nicht von schnellen Übergängen abgelenkt zu werden.", + "conf_colors_blackborder_intro": "Ignoriere schwarze Balken, jeder Modus nutzt einen anderen Algorithmus um diese zu erkennen. Erhöhe die Schwelle, sollte es nicht funktionieren.", + "conf_network_json_intro": "Der JSON-RPC-Port dieser Hyperion-Instanz, wird genutzt zur Fernsteuerung.", + "conf_network_bobl_intro": "Boblight Empfänger", + "conf_network_udpl_intro": "UDP Empfänger", + "conf_network_fbs_intro": "Google Flatbuffers Empfänger. Wird genutzt für schnellen Bildempfang.", + "conf_network_proto_intro": "Der PROTO-Port dieser Hyperion-Instanz, wird genutzt für \"Bildstreams\" (HyperionScreenCap, Kodi Addon, ...)", + "conf_network_forw_intro": "Leite alles an eine zweite Hyperion Instanz weiter, diese kann dann mit einer anderen LED Steuerung genutzt werden", + "conf_logging_label_intro": "Überprüfe die Meldungen im Prokotoll um zu erfahren was Hyperion gerade beschäftigt. Je nach eingestellter Protokoll-Stufe siehst du mehr oder weniger Informationen.", + "conf_logging_btn_pbupload": "Bericht für Supportanfrage hochladen", + "conf_logging_btn_autoscroll": "Automatisch scrollen", + "conf_logging_nomessage": "Keine Einträge vorhanden.", + "conf_logging_uploading": "Aufbereitung der Daten...", + "conf_logging_yourlink": "Link zu deinem Bericht", + "conf_logging_uplfailed": "Hochladen fehlgeschlagen! Überprüfe deine Internetverbindung!", + "conf_logging_report": "Bericht", + "conf_logging_lastreports": "Frühere Berichte", + "conf_logging_uplpolicy": "Hiermit akzeptierst du die", + "conf_logging_contpolicy": "Berichts-Datenschutzerklärung", + "conf_webconfig_label_intro": "Einstellungen zur Webkonfiguration. Änderungen können die Erreichbarkeit des Webinterfaces beeinflussen.", + "remote_losthint": "Notiz: Alle Änderungen gehen nach einem Neustart verloren.", + "remote_color_label": "Farbe/Effekt", + "remote_color_intro": "Setze einen Effekt oder eine Farbe. Auch deine selbst erstellten Effekte sind gelistet (sofern verfügbar). $1", + "remote_color_button_reset": "Farbe/Effekt zurücksetzen", + "remote_color_label_color": "Farbe:", + "remote_effects_label_effects": "Effekt:", + "remote_adjustment_label": "Farbanpassung", + "remote_adjustment_intro": "Verändere live Farbe/Helligkeit/Kompensation. $1", + "remote_videoMode_label": "Video Modus", + "remote_videoMode_intro": "Wähle zwischen verschiedenen Video Modi um neben 2D auch 3D Filme zu genießen. Unterstützt werden alle Aufnahmearten. $1", + "remote_videoMode_3DSBS": "3DSBS", + "remote_videoMode_3DTAB": "3DTAB", + "remote_videoMode_2D": "2D", + "remote_input_label": "Quellenauswahl", + "remote_input_intro": "Hyperion nutzt ein Prioritätensystem um die Quelle zu wählen. Alles was du setzt hat eine Priorität (Effekte/Farben/Plattform Aufnahme/USB Aufnahme und Netzwerkquellen). Standardmäßig nutzt Hyperion die Quelle mit der niedrigsten Priorität. Hier kannst du aktiv Einfluss darauf nehmen. $1", + "remote_input_label_autoselect": "Automatische Auswahl", + "remote_input_setsource_btn": "Wähle Quelle", + "remote_input_sourceactiv_btn": "Quelle aktiv", + "remote_input_origin": "Ursprung", + "remote_input_owner": "Typ", + "remote_input_priority": "Priorität", + "remote_input_status": "Status/Aktion", + "remote_input_duration": "Dauer:", + "remote_input_ip": "IP:", + "remote_input_clearall": "Lösche alle Effekte/Farben", + "remote_components_label": "Komponentensteuerung", + "remote_components_intro": "Starte und stoppe Komponenten von Hyperion. $1", + "remote_optgroup_usreffets": "Benutzer Effekte", + "remote_optgroup_syseffets": "Mitgelieferte Effekte", + "remote_maptype_label": "LED-Bereich Zuordnung", + "remote_maptype_intro": "Für gewöhnlich entscheidet dein LED Layout welchen Bildbereich welche LED bekommt, dies kann hier geändert werden. $1", + "remote_maptype_label_multicolor_mean": "Mehrfarbig", + "remote_maptype_label_unicolor_mean": "Einfarbig", + "effectsconfigurator_label_intro": "Erstelle auf Grundlage der Basiseffekte neue Effekt die nach deinen Wünschen angepasst sind. Je nach Effekt stehen Optionen wie Farbe, Geschwindigkeit, oder Richtung und vieles mehr zur Auswahl.", + "effectsconfigurator_label_chooseeff": "Template auswählen", + "effectsconfigurator_editdeleff": "Entferne/Lade Effekt", + "effectsconfigurator_button_saveeffect": "Effekt speichern", + "effectsconfigurator_label_effectname": "Effektname", + "effectsconfigurator_button_starttest": "Starte Test", + "effectsconfigurator_button_stoptest": "Stoppe Test", + "effectsconfigurator_button_conttest": "Fortlaufender Test", + "effectsconfigurator_button_deleffect": "Effekt entfernen", + "effectsconfigurator_button_editeffect": "Effekt laden", + "support_label_title": "Unterstütze Hyperion", + "support_label_intro": "Hyperion ist ein kostenloses Open Source Projekt und ein kleines Team arbeitet an seiner Weiterentwicklung. Darum benötigen wir DEINE Unterstützung um weiter in bessere Infrastruktur und Weiterentwicklung investieren zu können.", + "support_label_spreadtheword": "Weitersagen!", + "support_label_fbtext": "Teile Inhalte in Facebook und halte dich und andere auf dem Laufenden", + "support_label_twtext": "Nutze die 140 Zeichen und bleibe auf dem Laufenden auch auf Twitter", + "support_label_ggtext": "Platziere uns in deinen Kreisen auf Google+", + "support_label_yttext": "Gelangweilt von Bildern? Werfe einen Blick auf unsere Youtube Videos", + "support_label_igtext": "Schau doch mal bei Instagram vorbei!", + "support_label_donate": "Spende oder nutze unsere Affiliate Links", + "support_label_affinstr1": "Klicke auf den Link deines Landes", + "support_label_affinstr2": "Kaufe wie gewohnt ein, abhängig von deinem Umsatz bekommen wir eine kleine Provision", + "support_label_affinstr3": "Du zahlst immer den selben Preis. Teste es!", + "support_label_btctext": "Adresse:", + "support_label_donationpp": "Spende:", + "support_label_webrestitle": "Informationsquellen und Hilfe", + "support_label_webpagetitle": "Internetseite", + "support_label_webpagetext": "Das Zuhause von Hyperion", + "support_label_wikititle": "Wiki", + "support_label_wikitext": "Von A bis Z - Alles wissenwerte zu Hyperion", + "support_label_forumtitle": "Forum", + "support_label_forumtext": "Diskussion und Hilfestellung von der Community", + "support_label_ghtext": "Besuche uns auf Github", + "update_label_intro": "Diese Seite zeigt dir alle verfügbaren Versionen von Hyperion, du kannst nach Belieben eine aktuellere Version installieren oder eine Ältere. Die aktuellsten Versionen befinden sich immer oben.", + "update_label_description": "Beschreibung:", + "update_button_install": "Installieren", + "update_button_changelog": "Zeige Änderungsprotokoll", + "update_label_type": "Art:", + "update_versreminder": "Deine Version: $1", + "update_error_getting_versions": "Wir hatten Probleme die verfügbaren Versionen zu ermitteln.", + "about_version": "Version", + "about_build": "Build", + "about_builddate": "Build Datum", + "about_translations": "Übersetzungen", + "about_resources": "$1 Bibliotheken", + "about_contribute": "Entwickel Hyperion mit uns weiter!", + "about_credits": "Einen Dank an alle Entwickler!", + "info_conlost_label_title": "Verbindung zum Hyperion Service unterbrochen!", + "info_conlost_label_reason": "Mögliche Ursachen:", + "info_conlost_label_reason1": "- Schlechte WLAN Verbindung", + "info_conlost_label_reason2": "- Ein Update wird durchgeführt", + "info_conlost_label_reason3": "- Hyperion wird nicht mehr ausgeführt", + "info_conlost_label_autorecon": "Du wirst verbunden, sobald Hyperion wieder verfügbar ist.", + "info_conlost_label_autorefresh": "Diese Seite wird automatisch aktualisiert.", + "info_conlost_label_reload": "Automatisches verbinden gestoppt - limit überschritten. Lade die Seite neu oder klick mich.", + "info_restart_title": "Startet gerade neu...", + "info_restart_rightback": "Hyperion ist gleich wieder für dich da!", + "info_restart_contus": "Solltest du nach 20 Sekunden immer noch hier sein, ist etwas schief gelaufen. Öffne bitte in unserem Support Forum ein neues Thema...", + "info_restart_contusa": "...mit deinen letztes Schritten. Danke!", + "info_404": "Die angeforderte Seite ist nicht verfügbar!", + "infoDialog_general_success_title": "Erfolg", + "infoDialog_general_error_title": "Fehler", + "infoDialog_general_warning_title": "Warnung", + "infoDialog_checklist_title": "Checkliste!", + "infoDialog_effconf_deleted_text": "Der Effekt \"$1\" wurde erfolgreich entfernt!", + "infoDialog_effconf_created_text": "Der Effekt \"$1\" wurde erfolgreich erstellt!", + "InfoDialog_lang_title": "Spracheinstellung", + "InfoDialog_lang_text": "Sollte dir die Vorauswahl der automatischen Spracherkennung nicht gefallen, kannst du die Sprache hier manuell festlegen.", + "InfoDialog_access_title": "Einstellungsstufe", + "InfoDialog_access_text": "Je höher die Stufe je mehr Einstellungen und Funktionen stehen zur Verfügung. Empfohlen ist \"Standard\".", + "InfoDialog_nowrite_title": "Fehler beim Schreibzugriff!", + "InfoDialog_nowrite_text": "Hyperion hat keinen Schreibzugriff auf die aktuell geladene Konfiguration. Bitte korrigiere die Dateizugriffsrechte um fortzufahren.", + "InfoDialog_nowrite_foottext": "Die Webkonfiguration wird automatisch wieder freigegeben, sobald das Problem behoben wurde!", + "infoDialog_wizrgb_text": "Deine RGB Byte Reihenfolge ist bereits richtig eingestellt.", + "infoDialog_writeimage_error_text": "Die ausgewählte Datei \"$1\" ist keine Bilddatei oder ist beschädigt! Bitte wähle eine andere Bilddatei aus.", + "infoDialog_writeconf_error_text": "Das speichern der Konfiguration ist fehlgeschlagen.", + "infoDialog_import_jsonerror_text": "Die ausgewählte Konfigurations-Datei \"$1\" ist keine .json Datei oder ist beschädigt! Fehlermeldung: ($2)", + "infoDialog_import_hyperror_text": "Die ausgewählte Konfigurations-Datei \"$1\" kann nicht importiert werden. Sie ist nicht kompatibel mit Hyperion 2.0 und höher!", + "infoDialog_import_comperror_text": "Dein Browser unterstützt leider keinen Import. Bitte versuche es mit einem anderen Browser erneut.", + "infoDialog_import_confirm_title": "Bestätige Import", + "infoDialog_import_confirm_text": "Bist du sicher, dass du die Konfigurations-Datei \"$1\" importieren möchtest? Diese Aktion kann nicht rückgängig gemacht werden!", + "InfoDialog_iswitch_title": "Hyperion switcher", + "InfoDialog_iswitch_text": "Sollte in deinem lokalen Netzwerk Hyperion mehr als einmal laufen, kannst du hier zwischen den Web Konfigurationen hin und her schalten. Wähle dazu die Instanz unten aus und switche!", + "wiz_wizavail": "Assistent verfügbar", + "wiz_guideyou": "Der $1 wird dich durch die Konfiguration leiten, drücke dazu einfach den Button!", + "wiz_rgb_title": "RGB Byte Reihenfolge Assistent", + "wiz_rgb_intro1": "Dieser Assisent wird dir dabei helfen die richtige Byte Reihenfolge für deine leds zu finden. Klicke auf Fortfahren um zu beginnen.", + "wiz_rgb_intro2": "Wann benötigt man diesen Assistenten? Zur Erstkonfiguration oder wenn deine LEDs zb rot leuchten sollten, sie aber blau oder grün sind.", + "wiz_rgb_expl": "Der Farbpunkt ändert alle x Sekunden die Farbe (rot, grün), zur selben Zeit ändern deine LEDs die Farbe ebenfalls. Beantworte die Fragen unten, um deine RGB Byte Reihenfolge zu überprüfen/korrigieren.", + "wiz_rgb_switchevery": "Ändere Farbe alle...", + "wiz_rgb_q": "Welche Farbe zeigen deine LEDs, wenn der Farbpunkt oben...", + "wiz_rgb_qrend": "...rot ist?", + "wiz_rgb_qgend": "...grün ist?", + "wiz_hue_title": "Philips Hue Assistent", + "wiz_hue_intro1": "Dieser Assistent hilft dir bei der Konfiguration von Hyperion für Philips Hue. Zu den Funktionen zählen ein automatisches finden der Hue Bridge, einen neuen Benutzer erstellen, die einzelnen Lampen unterschiedlichen Bereichen im Bild zuzuordnen und weitere Einstellungen von Hyperion automatisch anzupassen. Kurz gesagt: Komplette Einrichtung mit ein paar Klicks.", + "wiz_hue_desc1": "Es wird automatisch nach der Hue Bridge gesucht, solltest sie nicht gefunden werden, gebe die IP an und drücke den \"neu laden\" Button. Danach benötigst du eine gültige Benutzer ID, diese kann auch erstellt werden.", + "wiz_hue_desc2": "Nun kannst du auswählen, welche der Lampen (IDs) hinzugefügt werden sollen. Mit der Position wählst du aus, wo die jeweilige Lampe \"im Bild\" sitzen soll. Deaktivierte Lampen werden nicht hinzugefügt. Als Hilfe zur Identifizierung kannst du sie mit einem Klick auf den rechten Button kurz aufleuchten lassen.", + "wiz_hue_ip": "Hue Bridge IP:", + "wiz_hue_username": "Benutzer ID:", + "wiz_hue_create_user": "Neuen Benutzer erstellen", + "wiz_hue_failure_ip": "Keine Hue Bridge gefunden, bitte überprüfe die IP", + "wiz_hue_failure_connection": "Zeitüberschreitung. Bitte drücke die Taste auf deiner Hue Bridge rechtzeitig", + "wiz_hue_failure_user": "Benutzer ID wurde nicht gefunden, erstelle eine Neue oder gib eine bereits registrierte an.", + "wiz_hue_press_link": "Bitte \"Link\" Taste auf der Hue Bridge drücken.", + "wiz_hue_ids_disabled": "Deaktiviert", + "wiz_hue_ids_entire": "Ganzes Bild", + "wiz_hue_noids": "Diese Hue Bridge hat keine verbundenen Lampen, bitte verbinde diese zuerst mit deiner Hue Bridge (Nutze die Hue Apps dafür)", + "wiz_hue_pos": "Position/Status", + "wiz_hue_searchb": "Suche nach Hue Bridge...", + "wiz_hue_blinkblue": "Lasse ID $1 blau aufleuchten", + "wiz_hue_ident": "Identifiziere", + "wiz_cc_title": "Farbkalibrierungs Assistent", + "wiz_cc_intro1": "Der Assistent wird dich durch die Kalibrierung deiner LEDs leiten. Sofern du Kodi nutzt, können die Bilder und Testvideos direkt an Kodi geschickt werden. Andernfalls musst du das Material selbst herunterladen und anwenden.", + "wiz_cc_kwebs": "Kodi Webserver (IP:Port)", + "wiz_cc_kodidiscon": "Kodi Webserver nicht gefunden, fahre ohne Kodi-Unterstützung fort.", + "wiz_cc_kodidisconlink": "Download Link Bilder:", + "wiz_cc_kodicon": "Kodi Webserver gefunden, fahre mit Kodi-Unterstützung fort.", + "wiz_cc_kodimsg_start": "Test bestanden - Zeit zu beginnen", + "wiz_cc_kodishould": "Kodi sollte jetzt folgendes Bild anzeigen: $1", + "wiz_cc_lettvshow": "Lass dabei deinen Fernseher folgendes Bild anzeigen: $1", + "wiz_cc_lettvshowm": "Überprüfe dies mithilfe folgender Bildern: $1", + "wiz_cc_adjustit": "Verändere dein \"$1\", bis du zufrieden bist. Beachte: Je mehr du reduzierst bzw von dem Standardwert abweichst, je mehr veränderst du den maximalen Farbraum, was alle Farben die daraus abgeleitet werden ebenfalls betrifft. Je nach TV/LED Farbspektrum sind die Ergebnisse unterschiedlich.", + "wiz_cc_adjustgamma": "Gamma: Was du jetzt tun musst ist, jeden Gamma-Kanal so einstellen, dass der \"Grauverlauf\" auf den LEDs nicht grünlich/rötlich/bläulich aussieht. Neutral ist übrigens 1.0. Beispiel: Sollte dein grau etwas rötlich sein bedeutet dies, dass du dein Gamma für Rot erhöhen musst um den Rot-Anteil zu verringern (Je mehr Gamma, desto weniger Farbe).", + "wiz_cc_chooseid": "Wähle einen Namen für dieses Farb-Profil.", + "wiz_cc_btn_switchpic": "Testbild ändern", + "wiz_cc_backlight": "Zusätzlich kannst du eine Hintergrundbeluchtung einstellen, um \"irritierende Farben\" bei fast schwarzem Bild zu vermeiden oder du den Wechsel zwischen Farbe und Aus als zu anstrengend empfindest. Zusätzlich kann bestimmt werden, ob diese farbig oder nur weiß sein soll. Wird automatisch deaktiviert im Zustand \"Aus\" sowie bei \"Farbe\" und \"Effekt\".", + "wiz_cc_testintro": "Nun ist es an der Zeit für einen Testlauf.", + "wiz_cc_testintrok": "Klicke auf einen Button, um eines der Testvideos abzuspielen.", + "wiz_cc_testintrowok": "Unter folgendem Link findest du ein paar Testvideos zum herunterladen und abspielen:", + "wiz_cc_link": "Klick mich", + "wiz_cc_morethanone": "Du hast mehr als 1 Profil, bitte wähle das zu kalibrierende Profil", + "wiz_cc_btn_stop": "Stoppe Video", + "wiz_cc_summary": "Im folgenden eine Zusammenfassung deiner Einstellungen. Während du ein Video abspielst, kannst du hier weiter ausprobieren. Wenn du fertig bist, klicke auf speichern.", + "edt_dev_auth_key_title": "Authentisierungstoken", + "edt_dev_enum_subtract_minimum": "Subtrahiere minimum", + "edt_dev_enum_sub_min_cool_adjust": "Minimale Anpassung: cool", + "edt_dev_enum_sub_min_warm_adjust": "Minimale Anpassung: warm", + "edt_dev_enum_white_off": "Weiß ist aus", + "edt_dev_general_heading_title": "Allgemeine Einstellungen", + "edt_dev_general_name_title": "Name der Konfiguration", + "edt_dev_general_hardwareLedCount_title": "Anzahl Hardware LEDs", + "edt_dev_general_colorOrder_title": "RGB Byte Reihenfolge", + "edt_dev_general_rewriteTime_title": "Aktualisierungszeit", + "edt_dev_spec_header_title": "Spezifische Einstellungen", + "edt_dev_spec_baudrate_title": "Baudrate", + "edt_dev_spec_spipath_title": "SPI Pfad", + "edt_dev_spec_invert_title": "Invertiere Signal", + "edt_dev_spec_multicastGroup_title": "Multicast Gruppe", + "edt_dev_spec_numberOfLeds_title": "Anzahl der LEDs", + "edt_dev_spec_port_title": "Port", + "edt_dev_spec_orbIds_title": "Orb ID(s)", + "edt_dev_spec_useOrbSmoothing_title": "Nutze Orb Glättung", + "edt_dev_spec_targetIp_title": "Ziel IP", + "edt_dev_spec_targetIpHost_title": "Ziel IP/hostname", + "edt_dev_spec_outputPath_title": "Ausgabepfad", + "edt_dev_spec_delayAfterConnect_title": "Verzögerung nach Verbindung", + "edt_dev_spec_FCsetConfig_title": "Wende fadecandy Konfiguration an", + "edt_dev_spec_FCmanualControl_title": "Manuelle Steuerung der fadecandy LEDs", + "edt_dev_spec_FCledToOn_title": "Fadecandy LEDs set to on", + "edt_dev_spec_interpolation_title": "Interpolation", + "edt_dev_spec_dithering_title": "Dithering", + "edt_dev_spec_gamma_title": "Gamma", + "edt_dev_spec_whitepoint_title": "Weißpunkt", + "edt_dev_spec_username_title": "Benutzername", + "edt_dev_spec_lightid_title": "Lampen ID(s)", + "edt_dev_spec_lightid_itemtitle": "ID", + "edt_dev_spec_transistionTime_title": "Übergangszeit", + "edt_dev_spec_switchOffOnBlack_title": "Aus bei schwarz", + "edt_dev_spec_brightnessFactor_title": "Helligkeitsfaktor", + "edt_dev_spec_ledType_title": "LED typ", + "edt_dev_spec_uid_title": "UID", + "edt_dev_spec_intervall_title": "Intervall", + "edt_dev_spec_latchtime_title": "Sperrzeit", + "edt_dev_spec_maxPacket_title": "Paketgröße", + "edt_dev_spec_serial_title": "Seriennummer", + "edt_dev_spec_vid_title": "VID", + "edt_dev_spec_pid_title": "PID", + "edt_dev_spec_cid_title": "CID", + "edt_dev_spec_LBap102Mode_title": "LightBerry APA102 Modus", + "edt_dev_spec_universe_title": "Universum", + "edt_dev_spec_whiteLedAlgor_title": "Weiß Algorithmus", + "edt_dev_spec_useRgbwProtocol_title": "Nutze RGBW Protokoll", + "edt_dev_spec_maximumLedCount_title": "Maximale Anzahl LEDs", + "edt_dev_spec_gpioNumber_title": "GPIO Nummer", + "edt_dev_spec_dmaNumber_title": "DMA Kanal", + "edt_dev_spec_gpioMap_title": "GPIO Zuweisung", + "edt_dev_spec_PBFiFo_title": "Pi-Blaster FiFo", + "edt_dev_spec_gpioBcm_title": "GPIO Pin", + "edt_dev_spec_ledIndex_title": "LED index", + "edt_dev_spec_colorComponent_title": "Farbkomponente", + "edt_conf_general_enable_title": "Aktiviert", + "edt_conf_general_enable_expl": "Wenn aktiviert, ist die Komponente aktiv.", + "edt_conf_general_priority_title": "Priorität", + "edt_conf_general_priority_expl": "Die Priorität dieser Komponente.", + "edt_conf_general_port_title": "Port", + "edt_conf_general_port_expl": "Der genutzte Port.", + "edt_conf_enum_color": "Farbe", + "edt_conf_enum_effect": "Effekt", + "edt_conf_enum_multicolor_mean": "Mehrfarbig", + "edt_conf_enum_unicolor_mean": "Einfarbig", + "edt_conf_enum_rgb": "RGB", + "edt_conf_enum_bgr": "BGR", + "edt_conf_enum_rbg": "RBG", + "edt_conf_enum_brg": "BRG", + "edt_conf_enum_gbr": "GBR", + "edt_conf_enum_grb": "GRB", + "edt_conf_enum_linear": "Linear", + "edt_conf_enum_PAL": "PAL", + "edt_conf_enum_NTSC": "NTSC", + "edt_conf_enum_SECAM": "SECAM", + "edt_conf_enum_NO_CHANGE": "Auto", + "edt_conf_enum_logsilent": "Stille", + "edt_conf_enum_logwarn": "Warnung", + "edt_conf_enum_logverbose": "Ausführlich", + "edt_conf_enum_logdebug": "Debug", + "edt_conf_enum_bbdefault": "Standard", + "edt_conf_enum_bbclassic": "Klassisch", + "edt_conf_enum_bbosd": "OSD", + "edt_conf_enum_automatic": "Automatisch", + "edt_conf_gen_heading_title": "Allgemeine Einstellungen", + "edt_conf_gen_name_title": "Name der Konfiguration", + "edt_conf_gen_name_expl": "Der Name wird verwendet, um Hyperion besser zu identifizieren. (Hilfreich bei mehreren Instanzen)", + "edt_conf_gen_showOptHelp_title": "Zeige Erklärungen", + "edt_conf_gen_showOptHelp_expl": "Zeige alle verfügbaren Options-Erklärungen. Empfohlen für Anfänger", + "edt_conf_gen_versionBranch_title": "Versionszweig", + "edt_conf_gen_versionBranch_expl": "Gibt an, welcher Versionszweig für die Suche von neuen Hyperion Versionen genutzt werden soll.", + "edt_conf_color_heading_title": "Farbkalibrierung", + "edt_conf_color_channelAdjustment_header_itemtitle": "Profil", + "edt_conf_color_channelAdjustment_header_title": "Anpassung Farbkanäle", + "edt_conf_color_channelAdjustment_header_expl": "Passe die Farbkanäle deinen LEDs an", + "edt_conf_color_imageToLedMappingType_title": "LED-Bereich Zuordnungstyp", + "edt_conf_color_imageToLedMappingType_expl": "Sofern nicht \"Mehrfarbig\", wird dein LED Layout mit einer anderen Bildzuweisung überschrieben", + "edt_conf_color_id_title": "ID", + "edt_conf_color_id_expl": "Eine vom Benutzer frei angegebene ID.", + "edt_conf_color_leds_title": "LED index", + "edt_conf_color_leds_expl": "Zugewiesen zu allen (*) LEDs oder nur zu bestimmten LED Nummern (0-17).", + "edt_conf_color_black_title": "Schwarz", + "edt_conf_color_black_expl": "Kalibrierter Schwarzwert.", + "edt_conf_color_white_title": "Weiß", + "edt_conf_color_white_expl": "Kalibrierter Weißwert.", + "edt_conf_color_red_title": "Rot", + "edt_conf_color_red_expl": "Kalibrierter Rotwert.", + "edt_conf_color_green_title": "Grün", + "edt_conf_color_green_expl": "Kalibrierter Grünwert.", + "edt_conf_color_blue_title": "Blau", + "edt_conf_color_blue_expl": "Kalibrierter Blauwert.", + "edt_conf_color_cyan_title": "Cyan", + "edt_conf_color_cyan_expl": "Kalibrierter Cyanwert.", + "edt_conf_color_magenta_title": "Magenta", + "edt_conf_color_magenta_expl": "Kalibrierter Magentawert.", + "edt_conf_color_yellow_title": "Gelb", + "edt_conf_color_yellow_expl": "Kalibrierter Gelbwert.", + "edt_conf_color_gammaRed_title": "Gamma Rot", + "edt_conf_color_gammaRed_expl": "Gamma von rot. 1.0 ist neutral. Über 1.0 wird rot reduziert, unter 1.0 wird rot erhöht.", + "edt_conf_color_gammaGreen_title": "Gamma Grün", + "edt_conf_color_gammaGreen_expl": "Gamma von grün. 1.0 ist neutral. Über 1.0 wird grün reduziert, unter 1.0 wird grün erhöht.", + "edt_conf_color_gammaBlue_title": "Gamma Blau", + "edt_conf_color_gammaBlue_expl": "Gamma von blau. 1.0 ist neutral. Über 1.0 wird blau reduziert, unter 1.0 wird blau erhöht.", + "edt_conf_color_backlightThreshold_title": "Hintergrund - beleuchtung", + "edt_conf_color_backlightThreshold_expl": "Eine Beleuchtung die dauerhaft aktiv ist. (Automatisch deaktiviert bei Effekten, Farben oder im Zustand \"Aus\")", + "edt_conf_color_backlightColored_title": "Farbige Hintergrund - beleuchtung", + "edt_conf_color_backlightColored_expl": "Die Hintergrundbeleuchtung kann mit oder ohne Farbanteile genutzt werden.", + "edt_conf_color_brightness_title": "Helligkeit", + "edt_conf_color_brightness_expl": "Die gesamte Helligkeit", + "edt_conf_color_brightnessComp_title": "Helligkeits Kompensation", + "edt_conf_color_brightnessComp_expl": "Kompensiert unterschiede in der Helligkeit zwischen Rot Grün Blau, Cyan Magenta Gelb und weiß. 100 ist volle Kompensation, 0 keine Kompensation", + "edt_conf_smooth_heading_title": "Glättung", + "edt_conf_smooth_type_title": "Art", + "edt_conf_smooth_type_expl": "Algorithmus der Glättung.", + "edt_conf_smooth_time_ms_title": "Zeit", + "edt_conf_smooth_time_ms_expl": "Wie lange soll die Glättung Bilder sammeln?", + "edt_conf_smooth_updateFrequency_title": "Aktualisierungsfrequenz", + "edt_conf_smooth_updateFrequency_expl": "Die Geschwindigkeit der Datenausgabe an die LED Steuerung.", + "edt_conf_smooth_updateDelay_title": "Aktualisierungsverzögerung", + "edt_conf_smooth_updateDelay_expl": "Verzögere die Ausgabe, sollte dein ambient light schneller sein als dein TV.", + "edt_conf_smooth_continuousOutput_title": "Fortlaufende Ausgabe", + "edt_conf_smooth_continuousOutput_expl": "Aktualisiere die LEDs, auch wenn das Bild sich nicht geändert hat.", + "edt_conf_v4l2_heading_title": "USB Aufnahme", + "edt_conf_v4l2_device_title": "Gerät", + "edt_conf_v4l2_device_expl": "Der Pfad zum USB (v4l) Aufnahmegerät. Wähle 'auto' für automatische Erkennung. Beispiel: '/dev/video0'", + "edt_conf_v4l2_standard_title": "Videoformat", + "edt_conf_v4l2_standard_expl": "Wähle das passende Videoformat deiner Region. Auf 'Auto' wird der gewählte Modus vom v4l interface beibehalten.", + "edt_conf_v4l2_sizeDecimation_title": "Bildverkleinerung Faktor", + "edt_conf_v4l2_sizeDecimation_expl": "Der Faktor der Bildverkleinerung ausgehend von der ursprünglichen Größe, 1 bedeutet keine Änderung (originales Bild).", + "edt_conf_v4l2_cropLeft_title": "Entferne links", + "edt_conf_v4l2_cropLeft_expl": "Anzahl der Pixel auf der linken Seite die vom Bild entfernt werden.", + "edt_conf_v4l2_cropRight_title": "Entferne rechts", + "edt_conf_v4l2_cropRight_expl": "Anzahl der Pixel auf der rechten Seite die vom Bild entfernt werden.", + "edt_conf_v4l2_cropTop_title": "Entferne oben", + "edt_conf_v4l2_cropTop_expl": "Anzahl der Pixel auf der oberen Seite die vom Bild entfernt werden.", + "edt_conf_v4l2_cropBottom_title": "Entferne unten", + "edt_conf_v4l2_cropBottom_expl": "Anzahl der Pixel auf der unteren Seite die vom Bild entfernt werden.", + "edt_conf_v4l2_signalDetection_title": "Signal Erkennung", + "edt_conf_v4l2_signalDetection_expl": "Wenn aktiviert, wird die USB Aufnahme temporär bei \"kein Signal\" abgeschalten. Das Bild muss dazu 4 Sekunden lang unter die Schwellwerte fallen.", + "edt_conf_v4l2_redSignalThreshold_title": "Rote Signalschwelle", + "edt_conf_v4l2_redSignalThreshold_expl": "Je höher die rote Schwelle je eher wird abgeschalten bei entsprechendem rot-Anteil.", + "edt_conf_v4l2_greenSignalThreshold_title": "Grüne Signalschwelle", + "edt_conf_v4l2_greenSignalThreshold_expl": "Je höher die grüne Schwelle je eher wird abgeschalten bei entsprechendem grün-Anteil.", + "edt_conf_v4l2_blueSignalThreshold_title": "Blaue Signalschwelle", + "edt_conf_v4l2_blueSignalThreshold_expl": "Je höher die blaue Schwelle je eher wird abgeschalten bei entsprechendem blau-Anteil.", + "edt_conf_v4l2_sDVOffsetMin_title": "Signal Erkennung VMin", + "edt_conf_v4l2_sDVOffsetMin_expl": "Signal Erkennungs-Bereich vertikal minimum (0.0-1.0)", + "edt_conf_v4l2_sDHOffsetMin_title": "Signal Erkennung HMin", + "edt_conf_v4l2_sDHOffsetMin_expl": "Signal Erkennungs-Bereich horizontal minimum (0.0-1.0)", + "edt_conf_v4l2_sDVOffsetMax_title": "Signal Erkennung VMax", + "edt_conf_v4l2_sDVOffsetMax_expl": "Signal Erkennungs-Bereich vertikal maximum (0.0-1.0)", + "edt_conf_v4l2_sDHOffsetMax_title": "Signal Erkennung HMax", + "edt_conf_v4l2_sDHOffsetMax_expl": "Signal Erkennungs-Bereich horizontal maximum (0.0-1.0)", + "edt_conf_instCapture_heading_title": "Instance Aufnahme", + "edt_conf_instC_systemEnable_title": "Aktiviere Plattform Aufnahme", + "edt_conf_instC_systemEnable_expl": "Aktiviert die Plattform Aufnahme für diese LED Hardware Instanz", + "edt_conf_instC_v4lEnable_title": "Aktiviere USB Aufnahme", + "edt_conf_instC_v4lEnable_expl": "Aktiviert die USB Aufnahme für diese LED Hardware Instanz", + "edt_conf_fg_heading_title": "Plattform Aufnahme", + "edt_conf_fg_type_title": "Typ", + "edt_conf_fg_type_expl": "Art der Plattform Aufnahme, standard ist 'auto'", + "edt_conf_fg_frequency_Hz_title": "Aufnahmefrequenz", + "edt_conf_fg_frequency_Hz_expl": "Wie schnell neue Bilder aufgenommen werden.", + "edt_conf_fg_width_title": "Breite", + "edt_conf_fg_width_expl": "Verkleinere Bild auf dieser Breite, da das Rohmaterial viel Leistung benötigen würde.", + "edt_conf_fg_height_title": "Höhe", + "edt_conf_fg_height_expl": "Verkleinere Bild auf dieser Höhe, da das Rohmaterial viel Leistung benötigen würde.", + "edt_conf_fg_pixelDecimation_title": "Bildverkleinerung Faktor", + "edt_conf_fg_pixelDecimation_expl": "Bildverkleinerung (Faktor) ausgehend von der original Größe. 1 für unveränderte/originale Größe.", + "edt_conf_fg_device_title": "Device", + "edt_conf_fg_display_title": "Display", + "edt_conf_fg_display_expl": "Gebe an von welchem Desktop aufgenommen werden soll. (Multi Monitor Setup)", + "edt_conf_bb_heading_title": "Schwarze Balken Erkennung", + "edt_conf_bb_threshold_title": "Schwelle", + "edt_conf_bb_threshold_expl": "Wenn die Erkennung nicht funktioniert, erhöhe die Schwelle um auf 'graues' schwarz zu reagieren.", + "edt_conf_bb_unknownFrameCnt_title": "Unbekannte Bilder", + "edt_conf_bb_unknownFrameCnt_expl": "Anzahl an Bildern die negativ sind, welche den Rand auf 0 zurücksetzen.", + "edt_conf_bb_borderFrameCnt_title": "Randbilder", + "edt_conf_bb_borderFrameCnt_expl": "Anzahl an Bildern bis ein neuer Rand festgelegt wird.", + "edt_conf_bb_maxInconsistentCnt_title": "Inkosistente Bilder", + "edt_conf_bb_maxInconsistentCnt_expl": "Anzahl der zu ignorierenden Bilder bis ein neuer Rand überprüft wird.", + "edt_conf_bb_blurRemoveCnt_title": "Unscharfe Pixel", + "edt_conf_bb_blurRemoveCnt_expl": "Anzahl an Pixeln, die zusätzlich vom Rand abgeschnitten werden.", + "edt_conf_bb_mode_title": "Modus", + "edt_conf_bb_mode_expl": "Algorithmus zur Auswertung. (siehe Wiki)", + "edt_conf_fge_heading_title": "Start Effekt/Farbe", + "edt_conf_fge_type_title": "Typ", + "edt_conf_fge_type_expl": "Wähle zwischen einem Effekt oder einer Farbe.", + "edt_conf_fge_color_title": "Farbe", + "edt_conf_fge_color_expl": "Sofern der Typ \"Farbe\" ist, stelle hier eine Farbe deiner Wahl sein.", + "edt_conf_fge_effect_title": "Effekt", + "edt_conf_fge_effect_expl": "Sofern der Typ \"Effekt\" ist, wähle hier einen Effekt deiner Wahl. (Gilt auch für selbst erstellte)", + "edt_conf_fge_duration_ms_title": "Dauer", + "edt_conf_fge_duration_ms_expl": "Dauer des Effekts/Farbe beim Hyperion Start.", + "edt_conf_bge_heading_title": "Hintergrund Effekt/Farbe", + "edt_conf_fw_heading_title": "Weiterleitung", + "edt_conf_fw_json_title": "Liste von Json zielen", + "edt_conf_fw_json_expl": "Ein Json Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19446)", + "edt_conf_fw_json_itemtitle": "Json Ziel", + "edt_conf_fw_proto_title": "Liste von Proto zielen", + "edt_conf_fw_proto_expl": "Ein Proto Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19401)", + "edt_conf_fw_proto_itemtitle": "Proto Ziel", + "edt_conf_js_heading_title": "JSON Server", + "edt_conf_fbs_heading_title": "Flatbuffers Server", + "edt_conf_fbs_timeout_title": "Zeitüberschreitung", + "edt_conf_fbs_timeout_expl": "Wenn für die angegebene Zeit keine Daten empfangen werden, wird die Komponente (vorübergehend) deaktiviert", + "edt_conf_pbs_heading_title": "Protocol Buffers Server", + "edt_conf_pbs_timeout_title": "Zeitüberschreitung", + "edt_conf_pbs_timeout_expl": "Wenn für die angegebene Zeit keine Daten empfangen werden, wird die Komponente (vorübergehend) deaktiviert", + "edt_conf_bobls_heading_title": "Boblight Server", + "edt_conf_udpl_heading_title": "UDP Listener", + "edt_conf_udpl_address_title": "Adresse", + "edt_conf_udpl_address_expl": "Die Adresse auf der UDP Pakete akzeptiert werden.", + "edt_conf_udpl_timeout_title": "Zeitüberschreitung", + "edt_conf_udpl_timeout_expl": "Wenn für die angegebene Zeit keine UDP Pakete empfangen werden, wird die Komponente (vorübergehend) deaktiviert", + "edt_conf_udpl_shared_title": "Gemeinsam genutzt", + "edt_conf_udpl_shared_expl": "Wird gemeinsam über alle Hyperion Instanzen genutzt.", + "edt_conf_webc_heading_title": "Web Konfiguration", + "edt_conf_webc_docroot_title": "Verzeichnis", + "edt_conf_webc_docroot_expl": "Lokaler Pfad zum WebUI Wurzelverzeichnis (Nur für WebUI Entwickler)", + "edt_conf_effp_heading_title": "Effekt Pfade", + "edt_conf_effp_paths_title": "Effekt Pfad(e)", + "edt_conf_effp_paths_expl": "Es können mehrere Ordner definiert werden die Effekte enthalten. Der Effekt Konfigurator speichert immer im Ersten Ordner.", + "edt_conf_effp_paths_itemtitle": "Pfad", + "edt_conf_effp_disable_title": "Deaktivierte Effekte", + "edt_conf_effp_disable_expl": "Trage hier die Namen der Effekte ein, die in Effektlisten nicht mehr zur Auswahl stehen sollen.", + "edt_conf_effp_disable_itemtitle": "Effekt", + "edt_conf_log_heading_title": "Protokoll", + "edt_conf_log_level_title": "Protokollstufe", + "edt_conf_log_level_expl": "Abhängig der Stufe sind weniger oder mehr Meldungen sichtbar.", + "edt_eff_smooth_custom": "Aktivere Glättung", + "edt_eff_smooth_time_ms": "Glättung: Zeit", + "edt_eff_smooth_updateFrequency": "Glättung: Aktualisierungsfrequenz", + "edt_eff_waves_header": "Wellen", + "edt_eff_waves_header_desc": "Gestalte Wellen aus Farbe! Mische dazu deine lieblings Farben und wähle einen Mittelpunkt.", + "edt_eff_gif_header": "GIF's", + "edt_eff_gif_header_desc": "Dieser Effekt spielt .gif Dateien ab. Bietet die Möglichkeit kleine GIF-Videos abzuspielen.", + "edt_eff_candle_header": "Kerze", + "edt_eff_candle_header_desc": "Flackerndes Kerzenlicht", + "edt_eff_police_header": "Polizei", + "edt_eff_police_header_desc": "Lights like a police car in action", + "edt_eff_fade_header": "Farbübergang", + "edt_eff_fade_header_desc": "Farbübergange für alle LED's", + "edt_eff_rainbowmood_header": "Regenbogen", + "edt_eff_rainbowmood_header_desc": "Alle LEDs Regenbogen Farbübergang", + "edt_eff_knightrider_header": "Knight Rider", + "edt_eff_knightrider_header_desc": "K.I.T.T ist zurück! Der Front-Scanner des bekannten Autos, diesmal nicht nur in rot.", + "edt_eff_lightclock_header": "Lichtuhr", + "edt_eff_lightclock_header_desc": "Eine echte Uhr als Licht! Passe die Farben von Stunden, Minuten, Sekunden deinen Vorstellungen an. Optional können 3/6/9/12 Uhr Markierungen aktiviert werden. Sollte die Uhr eine falsche Zeit anzeigen, überprüfe die Uhrzeit deines Systems.", + "edt_eff_pacman_header": "Pac-Man", + "edt_eff_pacman_header_desc": "Klein gefräßig und gelb, wer wird überleben?", + "edt_eff_moodblobs_header": "Stimmungskugeln", + "edt_eff_moodblobs_header_desc": "Entspannt den Abend beginnen mit langsam bewegenden Farbkugeln die ebenso sanft ihre Farbe verändern.", + "edt_eff_swirl_header": "Farbwirbel", + "edt_eff_swirl_header_desc": "Ein Wirbel mit frei wählbaren Farben. Die Farben werden gleichmäßig auf 360° aufgeteilt, dazwischen werden Farbübergänge berechnet. Zusätzlich kann ein zweiter Wirbel über den Ersten gelegt werden (Transparenz beachten!). Tipp: Eine Widerholung der selben Farbe erhöht deren \"größe\" und verringert den Bereich des Farbübergangs zu benachbarten Farben.", + "edt_eff_random_header": "Zufällig", + "edt_eff_random_header_desc": "Pixel-Farb-Mix", + "edt_eff_systemshutdown_header": "Herunterfahren", + "edt_eff_systemshutdown_header_desc": "Eine kurze Animation gefolgt von einem möglicherweise echten Herunterfahren des Systems", + "edt_eff_snake_header": "Schlange", + "edt_eff_snake_header_desc": "Wo ist das Futter?", + "edt_eff_sparks_header": "Funken", + "edt_eff_sparks_header_desc": "Ein Sternenfunkeln, wahlweise in festgelegter Farbe oder zufällig. Passe Helligkeit, Sättigung und Geschwindigkeit an.", + "edt_eff_traces_header": "Farbspuren", + "edt_eff_traces_header_desc": "Erfordert eine Neugestaltung", + "edt_eff_x-mas_header": "Weihnachten", + "edt_eff_x-mas_header_desc": "Ein Hauch von Weihnachten", + "edt_eff_trails_header": "Sternschnuppen", + "edt_eff_trails_header_desc": "In verschiedenen Farben, wünsch dir was!", + "edt_eff_flag_header": "Flaggen", + "edt_eff_flag_header_desc": "Verpasse deinen LEDs die Farben deines Landes. Du kannst mehr als eine Flagge auswählen, je nach Intervall werden diese dann abwechselnd angezeigt.", + "edt_eff_enum_all": "Alle", + "edt_eff_enum_all-together": "Alle zusammen", + "edt_eff_enum_list": "LED Liste", + "edt_eff_count": "Anzahl", + "edt_eff_color": "Farbe", + "edt_eff_colorrandom": "Zufällige Farbe", + "edt_eff_colorone": "Farbe eins", + "edt_eff_colortwo": "Farbe zwei", + "edt_eff_colorcount": "Farblänge", + "edt_eff_rotationtime": "Rotationszeit", + "edt_eff_sleeptime": "Schlafzeit", + "edt_eff_image": "Bilddatei", + "edt_eff_fps": "Bilder pro Sekunde", + "edt_eff_reversedirection": "Richtung umkehren", + "edt_eff_fadeintime": "Zeit für Einblendung", + "edt_eff_fadeouttime": "Zeit für Ausblendung", + "edt_eff_repeat": "Wiederholung", + "edt_eff_repeatcount": "Anzahl Wiederholung", + "edt_eff_colorendtime": "Zeit für Start-Farbe", + "edt_eff_colorstarttime": "Zeit für End-Farbe", + "edt_eff_colorstart": "Farbe Start", + "edt_eff_colorend": "Farbe Ende", + "edt_eff_maintain_end_color": "Behalte Endfarbe", + "edt_eff_colorshift": "Farbverschiebung", + "edt_eff_whichleds": "Welche LEDs", + "edt_eff_ledlist": "LED Liste", + "edt_eff_speed": "Geschwindigkeit", + "edt_eff_fadefactor": "Verblass Faktor", + "edt_eff_showseconds": "Zeige Sekunden", + "edt_eff_blobcount": "Kugelanzahl", + "edt_eff_huechange": "Farbänderung", + "edt_eff_basecolorchange": "Basisfarben verändern", + "edt_eff_basecolorchangerate": "BF Geschwindigkeit", + "edt_eff_basecolorrangeleft": "BF Bereich links", + "edt_eff_basecolorrangeright": "BF Bereich rechts", + "edt_eff_brightness": "Helligkeit", + "edt_eff_centerx": "Mittelpunkt X-Achse", + "edt_eff_centery": "Mittelpunkt Y-Achse", + "edt_eff_saturation": "Sättigung", + "edt_eff_colorevel": "Farbstufe", + "edt_eff_whitelevel": "Weißstufe", + "edt_eff_alarmcolor": "Alarm Farbe", + "edt_eff_postcolor": "Startfarbe", + "edt_eff_enableshutdown": "Echtes herunterfahren", + "edt_eff_length": "Länge", + "edt_eff_frequency": "Frequenz", + "edt_eff_min_len": "Minimale Länge", + "edt_eff_max_len": "Maximale Länge", + "edt_eff_height": "Höhe", + "edt_eff_offset": "Verschiebung", + "edt_eff_colorHour": "Farbe Stunde", + "edt_eff_colorMinute": "Farbe Minute", + "edt_eff_colorSecond": "Farbe Sekunde", + "edt_eff_colorMarker": "Marker Farbe", + "edt_eff_markerWidth": "Marker Breite", + "edt_eff_markerDepth": "Marker Tiefe", + "edt_eff_markerEnable": "Zeige Marker", + "edt_eff_backgroundColor": "Hintergrundfarbe", + "edt_eff_countries": "Länder", + "edt_eff_interval": "Intervall", + "edt_eff_margin": "Abstand", + "edt_eff_customColor": "Benutzerdefinierte Farbe", + "edt_eff_randomCenter": "Zufälliger Mittelpunkt", + "edt_eff_enableSecondSwirl": "Zweiter Wirbel", + "edt_eff_reverseRandomTime": "Richtungswechsel alle", + "edt_append_ns": "ns", + "edt_append_ms": "ms", + "edt_append_s": "s", + "edt_append_hz": "Hz", + "edt_append_pixel": "Pixel", + "edt_append_percent": "%", + "edt_append_degree": "°", + "edt_append_sdegree": "s/grad", + "edt_append_leds": "LEDs", + "edt_msg_error_notset": "Attribut muss gesetzt sein", + "edt_msg_error_notempty": "Eingabe benötigt", + "edt_msg_error_enum": "Die Eingabe muss einem der aufgeführten Werte entsprechen", + "edt_msg_error_anyOf": "Die Eingabe muss gegen mindestens eines der gegebenen Schemata validiert werden können", + "edt_msg_error_oneOf": "Die Eingabe muss gegen genau eines der gegebenen Schemata validiert werden können. Momentan können $1 Schemata validiert werden", + "edt_msg_error_not": "Die Eingabe darf nicht gegen das gegebene Schema validiert werden können", + "edt_msg_error_type_union": "Die Eingabe muss einem der gegebenen Typen entsprechen", + "edt_msg_error_type": "Die Eingabe muss vom Typ $1 sein", + "edt_msg_error_disallow_union": "Die Eingabe darf nicht einem der gegebenen Werte entsprechen", + "edt_msg_error_disallow": "Die Eingabe muss vom Typ $1 sein", + "edt_msg_error_multipleOf": "Die Eingabe muss ein Vielfaches von $1 sein", + "edt_msg_error_maximum_excl": "Der Wert muss kleiner als $1 sein", + "edt_msg_error_maximum_incl": "Der Wert darf höchstens $1 sein", + "edt_msg_error_minimum_excl": "Der Wert muss größer als $1 sein", + "edt_msg_error_minimum_incl": "Der Wert muss mindestens $1 sein", + "edt_msg_error_maxLength": "Die Eingabe darf höchstens $1 Zeichen lang sein", + "edt_msg_error_minLength": "Die Eingabe muss mindestens $1 Zeichen lang sein", + "edt_msg_error_pattern": "Die Eingabe muss dem gegebenen Muster entsprechen", + "edt_msg_error_additionalItems": "In diesem Feld sind keine weiteren Elemente erlaubt", + "edt_msg_error_maxItems": "Das Feld darf höchstens $1 Element(e) beinhalten", + "edt_msg_error_minItems": "Das Feld muss mindestens $1 Element(e) beinhalten", + "edt_msg_error_uniqueItems": "Das Feld darf nur einzigartige Elemente beinhalten", + "edt_msg_error_maxProperties": "Das Objekt darf höchstens $1 Attribute habe", + "edt_msg_error_minProperties": "Das Objekt muss mindestens $1 Attribute haben", + "edt_msg_error_required": "Das Objekt beinhaltet nicht das benötigte Attribut '$1'", + "edt_msg_error_additional_properties": "Es sind keine weiteren Attribute erlaubt. $1 muss entfernt werden", + "edt_msg_error_dependency": "Das Attribut $1 ist zwingend erforderlich", + "edt_msg_button_delete_all": "Alle", + "edt_msg_button_delete_all_title": "Alle löschen", + "edt_msg_button_delete_last": "Letzes $1-Element", + "edt_msg_button_delete_last_title": "Letzes $1-Element löschen", + "edt_msg_button_add_row_title": "$1 Hinzufügen", + "edt_msg_button_move_down_title": "Nach unten verschieben", + "edt_msg_button_move_up_title": "Nach oben verschieben", + "edt_msg_button_delete_row_title": "$1 Löschen", + "edt_msg_button_delete_row_title_short": "Löschen", + "edt_msg_button_collapse": "Einklappen", + "edt_msg_button_expand": "Ausklappen" +} \ No newline at end of file From e6c2e7ebf9453ca88a1c102ea712382e8324a4d5 Mon Sep 17 00:00:00 2001 From: Paulchen-Panther Date: Mon, 8 Jul 2019 15:04:38 +0200 Subject: [PATCH 12/15] [HOTFIX] Python Interpreter - added native RPi docker image instruction to CompileHowto.md - version channel is received from JsonAPI instead of reading from the configuration file Signed-off-by: Paulchen-Panther --- CMakeLists.txt | 39 +++++++++++++--------- CompileHowto.md | 23 +++++++++---- HyperionConfig.h.in | 9 ++--- assets/webconfig/js/content_dashboard.js | 2 +- assets/webconfig/js/content_index.js | 1 + assets/webconfig/js/hyperion.js | 1 + config/hyperion.config.json.default | 1 - libsrc/api/JsonAPI.cpp | 1 + libsrc/hyperion/schema/schema-general.json | 13 -------- 9 files changed, 49 insertions(+), 41 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 46610df8..b1b73c0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,33 +7,36 @@ set(CMAKE_AUTOMOC ON) # auto prepare .qrc files set(CMAKE_AUTORCC ON) -IF ( POLICY CMP0026 ) +if ( POLICY CMP0026 ) CMAKE_POLICY( SET CMP0026 OLD ) -ENDIF() +endif() # Configure CCache if available 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_LINK ccache) endif(CCACHE_FOUND) +find_package( PythonInterp 3.5 REQUIRED ) + # Read version from version.json EXECUTE_PROCESS ( - COMMAND python test/jsonchecks/version.py ${PROJECT_SOURCE_DIR}/version.json + COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/version.py version.json WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE error_code OUTPUT_VARIABLE RETURN_VERSION ) SET( VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?" ) -IF( ${RETURN_VERSION} MATCHES ${VERSION_REGEX}) +if ( ${RETURN_VERSION} MATCHES ${VERSION_REGEX} ) STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${RETURN_VERSION} ) LIST( GET VERSION_PARTS 0 VERSION_MAJOR ) LIST( GET VERSION_PARTS 1 VERSION_MINOR ) LIST( GET VERSION_PARTS 2 VERSION_PATCH ) -ELSE( ${RETURN_VERSION} MATCHES ${VERSION_REGEX} ) - message( FATAL_ERROR "Failed to parse version.json string properly. Expect X.Y.Z.") -ENDIF() +else ( ${RETURN_VERSION} MATCHES ${VERSION_REGEX} ) + message( FATAL_ERROR "Failed to parse version.json string properly. ${error_code}" ) +endif() SET( HYPERION_VERSION_MAJOR ${VERSION_MAJOR} ) SET( HYPERION_VERSION_MINOR ${VERSION_MINOR} ) @@ -41,11 +44,16 @@ SET( HYPERION_VERSION_PATCH ${VERSION_PATCH} ) # Read channel from version.json EXECUTE_PROCESS ( - COMMAND python test/jsonchecks/version.py ${PROJECT_SOURCE_DIR}/version.json "channel" + COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/version.py version.json "channel" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + RESULT_VARIABLE error_code OUTPUT_VARIABLE RETURN_CHANNEL ) +if ( error_code ) + message( FATAL_ERROR "Failed to parse version.json string properly. ${error_code}" ) +endif() + SET ( HYPERION_VERSION_CHANNEL ${RETURN_CHANNEL} ) # Set build variables @@ -147,10 +155,9 @@ if ( "${PLATFORM}" MATCHES "-dev" ) SET ( DEFAULT_TESTS ON ) endif() -# is this necessary? -# STRING( TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE) -# STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" ) -# ADD_DEFINITIONS( ${PLATFORM_DEFINE} ) +STRING( TOUPPER "-DPLATFORM_${PLATFORM}" PLATFORM_DEFINE) +STRING( REPLACE "-DEV" "" PLATFORM_DEFINE "${PLATFORM_DEFINE}" ) +ADD_DEFINITIONS( ${PLATFORM_DEFINE} ) # set the build options option(ENABLE_AMLOGIC "Enable the AMLOGIC video grabber" ${DEFAULT_AMLOGIC} ) @@ -209,7 +216,7 @@ SET( JSON_FILES ${HYPERION_SCHEMAS} ) EXECUTE_PROCESS ( - COMMAND python test/jsonchecks/checkjson.py ${JSON_FILES} + COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkjson.py ${JSON_FILES} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} RESULT_VARIABLE CHECK_JSON_FAILED ) @@ -218,7 +225,7 @@ IF ( ${CHECK_JSON_FAILED} ) ENDIF () EXECUTE_PROCESS ( - COMMAND python test/jsonchecks/checkeffects.py effects effects/schema + COMMAND ${PYTHON_EXECUTABLE} test/jsonchecks/checkeffects.py effects effects/schema WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} RESULT_VARIABLE CHECK_EFFECTS_FAILED ) @@ -226,6 +233,7 @@ IF ( ${CHECK_EFFECTS_FAILED} ) MESSAGE (FATAL_ERROR "check of json effect files failed" ) ENDIF () +# for python 3 the checkschema.py file must be rewritten EXECUTE_PROCESS ( COMMAND python test/jsonchecks/checkschema.py config/hyperion.config.json.default libsrc/hyperion/hyperion.schema.json WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} @@ -367,3 +375,4 @@ add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_D # enable make package - no code after this line ! include (${CMAKE_CURRENT_SOURCE_DIR}/cmake/packages.cmake) + diff --git a/CompileHowto.md b/CompileHowto.md index 36326948..9aadfcec 100644 --- a/CompileHowto.md +++ b/CompileHowto.md @@ -1,24 +1,33 @@ # 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 compilation for Raspberry Pi (Debian Stretch) +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. -To compile Hyperion for Debain Stretch (x64 architecture) or higher just execute the following command +The compiled binaries and packages will be available at the deploy folder next to the script +Note: call the script with `./docker-compile.sh -h` for more options + +## Native compiling on Raspberry Pi + +``` +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 +``` + +## 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 ``` -To compile Hyperion for i386 architecture +**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 ``` -To compile Hyperion for Raspberry Pi v1 & ZERO +**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 ``` -To compile Hyperion for Raspberry Pi 2 & 3 +**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 compiled binaries and packages will be available at the deploy folder next to the script -Note: call the script with `./docker-compile.sh -h` for more options # The usual way diff --git a/HyperionConfig.h.in b/HyperionConfig.h.in index b121c88a..a56cebee 100644 --- a/HyperionConfig.h.in +++ b/HyperionConfig.h.in @@ -39,9 +39,10 @@ // the hyperion build id string #define HYPERION_BUILD_ID "${HYPERION_BUILD_ID}" -#define HYPERION_VERSION_MAJOR "${HYPERION_VERSION_MAJOR}" -#define HYPERION_VERSION_MINOR "${HYPERION_VERSION_MINOR}" -#define HYPERION_VERSION_PATCH "${HYPERION_VERSION_PATCH}" -#define HYPERION_VERSION "${HYPERION_VERSION_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}" +#define HYPERION_VERSION_MAJOR "${HYPERION_VERSION_MAJOR}" +#define HYPERION_VERSION_MINOR "${HYPERION_VERSION_MINOR}" +#define HYPERION_VERSION_PATCH "${HYPERION_VERSION_PATCH}" +#define HYPERION_VERSION "${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}" +#define HYPERION_VERSION_CHANNEL "${HYPERION_VERSION_CHANNEL}" #define HYPERION_JSON_VERSION "1.0.0" diff --git a/assets/webconfig/js/content_dashboard.js b/assets/webconfig/js/content_dashboard.js index cafb3bdd..47eae059 100644 --- a/assets/webconfig/js/content_dashboard.js +++ b/assets/webconfig/js/content_dashboard.js @@ -78,7 +78,7 @@ $(document).ready( function() { $('#dash_currv').html(window.currentVersion); $('#dash_instance').html(window.serverConfig.general.name); $('#dash_ports').html(window.serverConfig.flatbufServer.port+' | '+window.serverConfig.protoServer.port); - $('#dash_versionbranch').html(window.serverConfig.general.versionBranch); + $('#dash_versionbranch').html(window.currentChannel); getReleases(function(callback){ if(callback) diff --git a/assets/webconfig/js/content_index.js b/assets/webconfig/js/content_index.js index acc33d74..59dd580b 100644 --- a/assets/webconfig/js/content_index.js +++ b/assets/webconfig/js/content_index.js @@ -39,6 +39,7 @@ $(document).ready( function() { window.sysInfo = event.response.info; window.currentVersion = window.sysInfo.hyperion.version; + window.currentChannel = window.sysInfo.hyperion.channel; }); $(window.hyperion).one("cmd-config-getschema", function(event) { diff --git a/assets/webconfig/js/hyperion.js b/assets/webconfig/js/hyperion.js index 90c2dcb6..912e5f84 100644 --- a/assets/webconfig/js/hyperion.js +++ b/assets/webconfig/js/hyperion.js @@ -3,6 +3,7 @@ window.webPrio = 1; window.webOrigin = "Web Configuration"; window.showOptHelp = true; window.gitHubReleaseApiUrl = "https://api.github.com/repos/hyperion-project/hyperion.ng/releases"; +window.currentChannel = null; window.currentVersion = null; window.latestVersion = null; window.latestStableVersion = null; diff --git a/config/hyperion.config.json.default b/config/hyperion.config.json.default index 30224989..d863fb0d 100644 --- a/config/hyperion.config.json.default +++ b/config/hyperion.config.json.default @@ -2,7 +2,6 @@ "general" : { "name" : "My Hyperion Config", - "versionBranch" : "Stable", "showOptHelp" : true }, "logger" : diff --git a/libsrc/api/JsonAPI.cpp b/libsrc/api/JsonAPI.cpp index 786fd3cc..84fc31d6 100644 --- a/libsrc/api/JsonAPI.cpp +++ b/libsrc/api/JsonAPI.cpp @@ -248,6 +248,7 @@ void JsonAPI::handleSysInfoCommand(const QJsonObject&, const QString& command, c QJsonObject hyperion; hyperion["jsonrpc_version" ] = QString(HYPERION_JSON_VERSION); hyperion["version" ] = QString(HYPERION_VERSION); + hyperion["channel" ] = QString(HYPERION_VERSION_CHANNEL); hyperion["build" ] = QString(HYPERION_BUILD_ID); hyperion["time" ] = QString(__DATE__ " " __TIME__); hyperion["id" ] = _hyperion->getId(); diff --git a/libsrc/hyperion/schema/schema-general.json b/libsrc/hyperion/schema/schema-general.json index fff7a320..bbb07d0a 100644 --- a/libsrc/hyperion/schema/schema-general.json +++ b/libsrc/hyperion/schema/schema-general.json @@ -14,19 +14,6 @@ "required" : true, "propertyOrder" : 1 }, - "versionBranch" : - { - "type" : "string", - "title" : "edt_conf_gen_versionBranch_title", - "enum" : ["Stable", "Beta"], - "required" : true, - "access" : "expert", - "default" : "Stable", - "options" : { - "enum_titles" : ["Stable", "Beta"] - }, - "propertyOrder" : 2 - }, "showOptHelp" : { "type" : "boolean", From d40aa71aa9ab2944d1e4c811133bd68aa7e91cbe Mon Sep 17 00:00:00 2001 From: Paulchen-Panther Date: Mon, 8 Jul 2019 16:22:28 +0200 Subject: [PATCH 13/15] changes in LEDDeviceWrapper::stopDeviceThread() reversed Signed-off-by: Paulchen-Panther --- config/hyperion.config.json.commented | 2 -- libsrc/leddevice/LedDeviceWrapper.cpp | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/config/hyperion.config.json.commented b/config/hyperion.config.json.commented index 3213951d..959c06be 100644 --- a/config/hyperion.config.json.commented +++ b/config/hyperion.config.json.commented @@ -6,12 +6,10 @@ { /// general Settings /// * 'name' : The user friendly name of the hyperion instance (used for network things) - /// * 'versionBranch' : Which branch should be used for hyperion version /// * 'showOptHelp' : Show option expanations at the webui. Highly recommended for beginners. "general" : { "name" : "MyHyperionConfig", - "versionBranch" : "Stable", "showOptHelp" : true }, /// set log level: silent warn verbose debug diff --git a/libsrc/leddevice/LedDeviceWrapper.cpp b/libsrc/leddevice/LedDeviceWrapper.cpp index c11e6bda..a49700c2 100644 --- a/libsrc/leddevice/LedDeviceWrapper.cpp +++ b/libsrc/leddevice/LedDeviceWrapper.cpp @@ -150,10 +150,10 @@ void LedDeviceWrapper::stopDeviceThread() QThread* oldThread = _ledDevice->thread(); disconnect(oldThread, 0, 0, 0); oldThread->quit(); - oldThread->deleteLater(); - oldThread = nullptr; + oldThread->wait(); + delete oldThread; disconnect(_ledDevice, 0, 0, 0); - _ledDevice->deleteLater(); + delete _ledDevice; _ledDevice = nullptr; } From ff93dd3b2545cfe7af3b92fcc8e667a8070abc56 Mon Sep 17 00:00:00 2001 From: Paulchen-Panther Date: Tue, 9 Jul 2019 23:07:31 +0200 Subject: [PATCH 14/15] Tests are running again Revised Readme.md Signed-off-by: Paulchen-Panther --- .azure.yml | 6 +- .ci/ci_build.sh | 17 +++-- .travis.yml | 3 + CMakeLists.txt | 12 ++-- README.md | 75 ++++++++--------------- doc/screenshot.png | Bin 0 -> 230913 bytes include/utils/RgbTransform.h | 30 ++++----- libsrc/hyperion/CaptureCont.cpp | 2 + libsrc/hyperion/MultiColorAdjustment.cpp | 2 +- test/CMakeLists.txt | 28 +++++---- test/TestBlackBorderDetector.cpp | 17 +++-- test/TestConfigFile.cpp | 17 ++--- test/TestQtScreenshot.cpp | 4 +- test/dispmanx2png/CMakeLists.txt | 3 + test/testrunner.sh | 17 ++--- 15 files changed, 116 insertions(+), 117 deletions(-) create mode 100644 doc/screenshot.png diff --git a/.azure.yml b/.azure.yml index 27bacf46..dbe65e63 100644 --- a/.azure.yml +++ b/.azure.yml @@ -45,7 +45,7 @@ jobs: # build process - bash: ./.ci/ci_build.sh - displayName: 'Build $(dockerName)' + displayName: 'Build $(dockerName) packages' env: DOCKER_TAG: $(dockerTag) DOCKER_NAME: $(dockerName) @@ -113,7 +113,9 @@ jobs: # build process - bash: ./.ci/ci_build.sh - displayName: 'Build macOS 10.13' + displayName: 'Build macOS 10.13 packages' + env: + PLATFORM: 'osx' # copy files - bash: 'cp -v build/Hyperion.NG-* $(Build.ArtifactStagingDirectory)' diff --git a/.ci/ci_build.sh b/.ci/ci_build.sh index 29a8638d..e2344f5b 100755 --- a/.ci/ci_build.sh +++ b/.ci/ci_build.sh @@ -17,25 +17,23 @@ fi # set environment variables if not exists [ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug" -# Determine cmake build type; tag builds are Release, else Debug +# Determine cmake build type; tag builds are Release, else Debug (-dev appends to platform) if [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then BUILD_TYPE=Release +else + PLATFORM=${PLATFORM}-dev fi -# Determie -dev appends to platform; -# Commented because tests are currently broken -# [ "${TRAVIS_EVENT_TYPE:-}" != 'cron' -a -z "${TRAVIS_TAG:-}" ] && PLATFORM=${PLATFORM}-dev - # Build the package on osx or linux if [[ "$CI_NAME" == 'osx' || "$CI_NAME" == 'darwin' ]]; then # compile prepare mkdir build || exit 1 - mkdir ${CI_BUILD_DIR}/deploy || exit 1 cd build - cmake -DPLATFORM="osx" -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2 + cmake -DPLATFORM=${PLATFORM} -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DCMAKE_INSTALL_PREFIX:PATH=/usr/local ../ || exit 2 make -j $(sysctl -n hw.ncpu) package || exit 3 + cd ${CI_BUILD_DIR} && source /${CI_BUILD_DIR}/test/testrunner.sh || exit 4 exit 0; - exit 1 || { echo "---> Hyperion compilation failed! Abort"; exit 4; } + 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 @@ -52,8 +50,9 @@ elif [[ "$CI_NAME" == 'linux' ]]; then make -j $(nproc) package || exit 3 && cp /hyperion.ng/build/bin/h* /deploy/ 2>/dev/null || : && cp /hyperion.ng/build/Hyperion.NG-* /deploy/ 2>/dev/null || : && + cd /hyperion.ng && source /hyperion.ng/test/testrunner.sh || exit 4 && exit 0; - exit 1 " || { echo "---> Hyperion compilation failed! Abort"; exit 4; } + 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 diff --git a/.travis.yml b/.travis.yml index 44ad22bf..9861fc63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,11 +24,13 @@ jobs: 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 # //////////////////////////////////////////////////////////////// @@ -57,6 +59,7 @@ jobs: name: "macOS 10.12 (Xcode 8.3.3)" env: - HOMEBREW_CACHE=$HOME/brew-cache + - PLATFORM="osx" script: - ./.ci/ci_build.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index b1b73c0d..189ab92d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,14 +80,6 @@ ELSE() SET ( DEFAULT_USB_HID OFF ) ENDIF() -if (APPLE) - SET( PLATFORM "osx") -endif() - -if (WIN32) - SET( PLATFORM "windows") -endif() - if ( NOT DEFINED PLATFORM ) if ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86" ) SET( PLATFORM "x11") @@ -100,6 +92,10 @@ if ( NOT DEFINED PLATFORM ) 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() + elseif ( APPLE ) + SET( PLATFORM "osx") + elseif ( WIN32 ) + SET( PLATFORM "windows") endif() if ( PLATFORM ) message( STATUS "PLATFORM is not defined, evaluated platform: ${PLATFORM}") diff --git a/README.md b/README.md index 082015fd..0428e475 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,47 @@ -

- -

+![Hyperion.NG](https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/assets/webconfig/img/hyperion/hyperionlogo.png) -

- - - - - - - - - - - - Total alerts - - GitHub license - - Join Translation -

+[![Dependencies](https://img.shields.io/librariesio/github/hyperion-project/hyperion.ng.svg)](https://github.com/hyperion-project/hyperion.ng/tree/master/dependencies/external) +[![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) +[![Travis-CI](https://travis-ci.org/hyperion-project/hyperion.ng.svg?branch=master)](https://travis-ci.org/hyperion-project/hyperion.ng) +[![LGTM](https://img.shields.io/lgtm/alerts/g/hyperion-project/hyperion.ng.svg)](https://lgtm.com/projects/g/hyperion-project/hyperion.ng/alerts/) -

This is a pre alpha development repository for the next major version of hyperion

+## About Hyperion --------- -## **Important notice!** +[Hyperion.NG](https://github.com/hyperion-project/hyperion.ng) is an opensource '[AmbiLight](https://de.wikipedia.org/wiki/Ambilight)' implementation with support for many LED devices and video grabbers. The project is still in a beta development stage (no stable release available). -Hyperion.NG is under heavy development. This version is currently _only for development_ purpose. -Please do not use it for your 'productiv' setup! +![Screenshot](doc/screenshot.png) -If you want to use hyperion as 'normal user', please use [current stable version](https://github.com/hyperion-project/hyperion) +### Features: -Besides of that .... Feel free to join us! We are looking always for people who wants to participate. - --------- -## About - -Hyperion is an opensource 'AmbiLight' implementation with support for many LED devices and video grabbers. - -The main features of Hyperion are: * Low CPU load makes it perfect for SoCs like Raspberry Pi * Json interface which allows easy integration into scripts * A command line utility to 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 Android app). -* Black border detector. +* 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 * A scriptable (Python) effect engine -* A web ui to configure and remote control hyperion +* A multi language web interface to configure and remote control hyperion -More information can be found on the official Hyperion [Wiki](https://wiki.hyperion-project.org) +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) -If you need further support please open a topic at the our new forum! -[Hyperion webpage/forum](https://www.hyperion-project.org). +## Contributing + +Contributions are welcome! Feel free to join us! We are looking always for people who wants to participate. +[![Contributors](https://img.shields.io/github/contributors/hyperion-project/hyperion.ng.svg)](https://github.com/hyperion-project/hyperion.ng/graphs/contributors) + +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) ## Requirements -* Debian 9, Ubuntu 16.04 or higher. Windows is not supported currently. +Debian 9, Ubuntu 16.04 or higher. Windows is not supported currently. ## Building -See [Compilehowto](CompileHowto.md) and [CrossCompileHowto](CrossCompileHowto.txt). +See [CompileHowto](CompileHowto.md) and [CrossCompileHowto](CrossCompileHowto.txt). ## Download -A download isn't available, you need to compile your own version see "Building" +**Please be patient. The first release is coming soon.** ## License -The source is released under MIT-License (see http://opensource.org/licenses/MIT). +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) + diff --git a/doc/screenshot.png b/doc/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..571421d194a8299afe2452afffa8a109cce46063 GIT binary patch literal 230913 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

c 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

n2Qf4ZE6_cU;i&w9LLNxDe`=Z#>bC+zxL9FR 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%0DIIWNC*BD2 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 literal 0 HcmV?d00001 diff --git a/include/utils/RgbTransform.h b/include/utils/RgbTransform.h index 0cb45b8e..14f1093e 100644 --- a/include/utils/RgbTransform.h +++ b/include/utils/RgbTransform.h @@ -117,25 +117,25 @@ private: void updateBrightnessComponents(); /// backlight variables - bool _backLightEnabled; - bool _backlightColored; - double _backlightThreshold; - double _sumBrightnessLow; + bool _backLightEnabled + , _backlightColored; + double _backlightThreshold + , _sumBrightnessLow; /// gamma variables - double _gammaR; - double _gammaG; - double _gammaB; + double _gammaR + , _gammaG + , _gammaB; /// The mapping from input color to output color - uint8_t _mappingR[256]; - uint8_t _mappingG[256]; - uint8_t _mappingB[256]; + uint8_t _mappingR[256] + , _mappingG[256] + , _mappingB[256]; /// brightness variables - uint8_t _brightness; - uint8_t _brightnessCompensation; - uint8_t _brightness_rgb; - uint8_t _brightness_cmy; - uint8_t _brightness_w; + uint8_t _brightness + , _brightnessCompensation + , _brightness_rgb + , _brightness_cmy + , _brightness_w; }; diff --git a/libsrc/hyperion/CaptureCont.cpp b/libsrc/hyperion/CaptureCont.cpp index 262cb61c..89eae882 100644 --- a/libsrc/hyperion/CaptureCont.cpp +++ b/libsrc/hyperion/CaptureCont.cpp @@ -13,9 +13,11 @@ CaptureCont::CaptureCont(Hyperion* hyperion) : QObject() , _hyperion(hyperion) , _systemCaptEnabled(false) + , _systemCaptPrio(0) , _systemCaptName() , _systemInactiveTimer(new QTimer(this)) , _v4lCaptEnabled(false) + , _v4lCaptPrio(0) , _v4lCaptName() , _v4lInactiveTimer(new QTimer(this)) { diff --git a/libsrc/hyperion/MultiColorAdjustment.cpp b/libsrc/hyperion/MultiColorAdjustment.cpp index 1c5ff16c..f7afad46 100644 --- a/libsrc/hyperion/MultiColorAdjustment.cpp +++ b/libsrc/hyperion/MultiColorAdjustment.cpp @@ -106,7 +106,7 @@ void MultiColorAdjustment::applyAdjustment(std::vector& ledColors) uint8_t ored = color.red; uint8_t ogreen = color.green; uint8_t oblue = color.blue; - uint8_t B_RGB, B_CMY, B_W; + uint8_t B_RGB = 0, B_CMY = 0, B_W = 0; adjustment->_rgbTransform.transform(ored,ogreen,oblue); adjustment->_rgbTransform.getBrightnessComponents(B_RGB, B_CMY, B_W); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 82a62165..fc37a03f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,4 +1,4 @@ - # Needed for testing non-public components +# Needed for testing non-public components include_directories(../libsrc) find_package(Qt5Widgets REQUIRED) @@ -10,7 +10,7 @@ ENDMACRO() if(ENABLE_SPIDEV) # Add the simple test executable 'TestSpi' add_executable(test_spi TestSpi.cpp) - link_to_hyperion(test_spi) + target_link_libraries( test_spi leddevice hyperion-utils hyperion ) add_executable(spidev_test spidev_test.c) add_executable(gpio2spi switchPinCtrl.c) endif(ENABLE_SPIDEV) @@ -21,19 +21,9 @@ link_to_hyperion(test_configfile) add_executable(test_ImageRgb TestRgbImage.cpp) link_to_hyperion(test_ImageRgb) -add_executable(test_image2ledsmap TestImage2LedsMap.cpp) -link_to_hyperion(test_image2ledsmap) - -if (ENABLE_DISPMANX) - add_subdirectory(dispmanx2png) -endif (ENABLE_DISPMANX) - add_executable(test_blackborderdetector TestBlackBorderDetector.cpp) link_to_hyperion(test_blackborderdetector) -add_executable(test_blackborderprocessor TestBlackBorderProcessor.cpp) -link_to_hyperion(test_blackborderprocessor) - add_executable(test_qregexp TestQRegExp.cpp) target_link_libraries(test_qregexp Qt5::Widgets) @@ -45,3 +35,17 @@ if(ENABLE_X11) add_executable(test_x11performance TestX11Performance.cpp) target_link_libraries(test_x11performance ${X11_LIBRARIES} Qt5::Widgets) endif(ENABLE_X11) + +######### These tests are broken. May they fix someone ########## + +# add_executable(test_image2ledsmap TestImage2LedsMap.cpp) +# link_to_hyperion(test_image2ledsmap) + +# if (ENABLE_DISPMANX) +# add_subdirectory(dispmanx2png) +# endif (ENABLE_DISPMANX) + +# add_executable(test_blackborderprocessor TestBlackBorderProcessor.cpp) +# link_to_hyperion(test_blackborderprocessor) + +################################################### diff --git a/test/TestBlackBorderDetector.cpp b/test/TestBlackBorderDetector.cpp index 018cebf0..8bd767e2 100644 --- a/test/TestBlackBorderDetector.cpp +++ b/test/TestBlackBorderDetector.cpp @@ -53,6 +53,7 @@ int TC_NO_BORDER() std::cerr << "Failed to correctly detect no border" << std::endl; result = -1; } + else std::cout << "Correctly detected no border" << std::endl; } return result; @@ -67,11 +68,12 @@ int TC_TOP_BORDER() { Image image = createImage(64, 64, 12, 0); BlackBorder border = detector.process(image); - if (border.unknown != false && border.horizontalSize != 12 && border.verticalSize != 0) + if (border.unknown != false && border.horizontalSize == 12 && border.verticalSize != 0) { std::cerr << "Failed to correctly detect horizontal border with correct size" << std::endl; result = -1; } + else std::cout << "Correctly detected horizontal border with correct size" << std::endl; } return result; @@ -86,11 +88,12 @@ int TC_LEFT_BORDER() { Image image = createImage(64, 64, 0, 12); BlackBorder border = detector.process(image); - if (border.unknown != false && border.horizontalSize != 0 && border.verticalSize != 12) + if (border.unknown != false && border.horizontalSize != 0 && border.verticalSize == 12) { - std::cerr << "Failed to detected vertical border with correct size" << std::endl; + std::cerr << "Failed to correctly detect vertical border with correct size" << std::endl; result = -1; } + else std::cout << "Correctly detected vertical border with correct size" << std::endl; } return result; @@ -105,11 +108,12 @@ int TC_DUAL_BORDER() { Image image = createImage(64, 64, 12, 12); BlackBorder border = detector.process(image); - if (border.unknown != false && border.horizontalSize != 12 && border.verticalSize != 12) + if (border.unknown != false && border.horizontalSize == 12 && border.verticalSize == 12) { - std::cerr << "Failed to detected two-sided border" << std::endl; + std::cerr << "Failed to correctly detect two-sided border" << std::endl; result = -1; } + else std::cout << "Correctly detected two-sided border" << std::endl; } return result; } @@ -125,9 +129,10 @@ int TC_UNKNOWN_BORDER() BlackBorder border = detector.process(image); if (border.unknown != true) { - std::cerr << "Failed to detected unknown border" << std::endl; + std::cerr << "Failed to correctly detect unknown border" << std::endl; result = -1; } + else std::cout << "Correctly detected unknown border" << std::endl; } return result; } diff --git a/test/TestConfigFile.cpp b/test/TestConfigFile.cpp index e7c3c6d2..3baae4d5 100644 --- a/test/TestConfigFile.cpp +++ b/test/TestConfigFile.cpp @@ -19,7 +19,7 @@ bool loadConfig(const QString & configFile, bool correct, bool ignore) //////////////////////////////////////////////////////////// QJsonObject schemaJson; - + try { schemaJson = QJsonFactory::readSchema(":/hyperion-schema"); @@ -28,14 +28,14 @@ bool loadConfig(const QString & configFile, bool correct, bool ignore) { throw std::runtime_error(error.what()); } - + QJsonSchemaChecker schemaChecker; schemaChecker.setSchema(schemaJson); - + //////////////////////////////////////////////////////////// // read and validate the configuration file from the command line //////////////////////////////////////////////////////////// - + QJsonObject jsonConfig = QJsonFactory::readConfig(configFile); if (!correct) @@ -47,7 +47,7 @@ bool loadConfig(const QString & configFile, bool correct, bool ignore) { qDebug() << "config write validation: " << schemaError; } - + qDebug() << "FAILED"; exit(1); return false; @@ -82,7 +82,8 @@ int main(int argc, char** argv) QString option = argv[1]; QString configFile; - if (option == "--ac" || option == "--ac-ignore-required") + if (option == "--ac" || option == "--ac-ignore-required") + { if (argc > 2) configFile = argv[2]; else @@ -90,8 +91,8 @@ int main(int argc, char** argv) usage(); return 0; } - else - configFile = argv[1]; + } + else configFile = argv[1]; qDebug() << "Configuration file selected: " << configFile; qDebug() << "Attemp to load..."; diff --git a/test/TestQtScreenshot.cpp b/test/TestQtScreenshot.cpp index 51500c77..20128cfe 100644 --- a/test/TestQtScreenshot.cpp +++ b/test/TestQtScreenshot.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -21,7 +22,8 @@ void createScreenshot(const int cropHorizontal, const int cropVertical, const in const QRect screenSize = QApplication::desktop()->screenGeometry(); const int croppedWidth = screenSize.width() - 2*cropVertical; const int croppedHeight = screenSize.height() - 2*cropHorizontal; - const QPixmap fullSizeScreenshot = QPixmap::grabWindow(QApplication::desktop()->winId(), cropVertical, cropHorizontal, croppedWidth, croppedHeight); + QScreen *screen = QApplication::primaryScreen(); + const QPixmap fullSizeScreenshot = screen->grabWindow(QApplication::desktop()->winId(), cropVertical, cropHorizontal, croppedWidth, croppedHeight); // Scale the screenshot to the required size const int width = fullSizeScreenshot.width()/decimation; diff --git a/test/dispmanx2png/CMakeLists.txt b/test/dispmanx2png/CMakeLists.txt index 4ee6f38f..59999c7a 100644 --- a/test/dispmanx2png/CMakeLists.txt +++ b/test/dispmanx2png/CMakeLists.txt @@ -3,6 +3,9 @@ IF ( "${PLATFORM}" MATCHES rpi) # Find the BCM-package (VC control) find_package(Qt5Widgets REQUIRED) + find_package(BCM REQUIRED) + include_directories(${BCM_INCLUDE_DIRS}) + add_definitions(${QT_DEFINITIONS}) link_directories(${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf) diff --git a/test/testrunner.sh b/test/testrunner.sh index 4b6d1607..66d5ddfb 100755 --- a/test/testrunner.sh +++ b/test/testrunner.sh @@ -1,11 +1,12 @@ #!/bin/bash +[ "${BUILD_TYPE}" == "Release" ] && exit 0 + STATS_FAILED=0 STATS_SUCCESS=0 STATS_SKIPPED=0 STATS_TOTAL=0 - # exec_test "test name" test_exec --with --args function exec_test() { @@ -33,7 +34,9 @@ function exec_test() } ###################################### -## EXEC TESTS +############# EXEC TESTS ############# +###################################### + cd build || exit 1 echo @@ -41,7 +44,7 @@ echo "Hyperion test execution" echo exec_test "hyperiond is executable and show version" bin/hyperiond --version -for cfg in ../config/*json* +for cfg in ../config/*json.default do exec_test "test $(basename $cfg)" bin/test_configfile $cfg done @@ -50,10 +53,10 @@ echo echo echo "TEST SUMMARY" echo "============" -echo " total: $STATS_TOTAL" -echo " success: $STATS_SUCCESS" -echo " skipped: $STATS_SKIPPED" -echo " failed: $STATS_FAILED" +echo " total: $STATS_TOTAL" +echo "success: $STATS_SUCCESS" +echo "skipped: $STATS_SKIPPED" +echo " failed: $STATS_FAILED" sleep 2 From bea8345e4b45843b24959a463961ec5fd3c3abae Mon Sep 17 00:00:00 2001 From: Paulchen-Panther Date: Wed, 10 Jul 2019 10:24:40 +0200 Subject: [PATCH 15/15] Fixed build warnings and undo changes - Build problems: - Qt 5.13 obsoleted some calls that were used in our Qt library. - The PhilipsHueLight and PhilipsHueBridge classes did not use the private logger class - Undo changes: - In Commit e6c2e7e, I made changes that were not covered. An apology goes to @b1rdhous3 Signed-off-by: Paulchen-Panther --- assets/webconfig/js/content_dashboard.js | 4 +-- config/hyperion.config.json.commented | 2 ++ config/hyperion.config.json.default | 1 + include/commandline/Option.h | 4 +-- libsrc/effectengine/EffectFileHandler.cpp | 2 +- libsrc/hyperion/schema/schema-general.json | 13 ++++++++ .../leddevice/dev_net/LedDevicePhilipsHue.cpp | 30 +++++++++---------- .../leddevice/dev_net/LedDevicePhilipsHue.h | 4 +-- test/TestQtScreenshot.cpp | 4 +-- 9 files changed, 40 insertions(+), 24 deletions(-) diff --git a/assets/webconfig/js/content_dashboard.js b/assets/webconfig/js/content_dashboard.js index 47eae059..daf355a3 100644 --- a/assets/webconfig/js/content_dashboard.js +++ b/assets/webconfig/js/content_dashboard.js @@ -75,10 +75,10 @@ $(document).ready( function() { // add more info $('#dash_leddevice').html(window.serverInfo.ledDevices.active); - $('#dash_currv').html(window.currentVersion); + $('#dash_currv').html(window.currentChannel+' '+window.currentVersion); $('#dash_instance').html(window.serverConfig.general.name); $('#dash_ports').html(window.serverConfig.flatbufServer.port+' | '+window.serverConfig.protoServer.port); - $('#dash_versionbranch').html(window.currentChannel); + $('#dash_versionbranch').html(window.serverConfig.general.versionBranch); getReleases(function(callback){ if(callback) diff --git a/config/hyperion.config.json.commented b/config/hyperion.config.json.commented index 959c06be..3213951d 100644 --- a/config/hyperion.config.json.commented +++ b/config/hyperion.config.json.commented @@ -6,10 +6,12 @@ { /// general Settings /// * 'name' : The user friendly name of the hyperion instance (used for network things) + /// * 'versionBranch' : Which branch should be used for hyperion version /// * 'showOptHelp' : Show option expanations at the webui. Highly recommended for beginners. "general" : { "name" : "MyHyperionConfig", + "versionBranch" : "Stable", "showOptHelp" : true }, /// set log level: silent warn verbose debug diff --git a/config/hyperion.config.json.default b/config/hyperion.config.json.default index d863fb0d..30224989 100644 --- a/config/hyperion.config.json.default +++ b/config/hyperion.config.json.default @@ -2,6 +2,7 @@ "general" : { "name" : "My Hyperion Config", + "versionBranch" : "Stable", "showOptHelp" : true }, "logger" : diff --git a/include/commandline/Option.h b/include/commandline/Option.h index 0981bc3d..b6525393 100644 --- a/include/commandline/Option.h +++ b/include/commandline/Option.h @@ -15,13 +15,13 @@ class Option: public QCommandLineOption public: Option(const QString &name, const QString &description = QString(), - const QString &valueName = QString::null, + const QString &valueName = QString(), const QString &defaultValue = QString() ); Option(const QStringList &names, const QString &description = QString(), - const QString &valueName = QString::null, + const QString &valueName = QString(), const QString &defaultValue = QString() ); diff --git a/libsrc/effectengine/EffectFileHandler.cpp b/libsrc/effectengine/EffectFileHandler.cpp index 906b726f..6e355a1d 100644 --- a/libsrc/effectengine/EffectFileHandler.cpp +++ b/libsrc/effectengine/EffectFileHandler.cpp @@ -246,7 +246,7 @@ void EffectFileHandler::updateEffects() // collect effect schemas efxCount = 0; - directory = path.endsWith("/") ? (path + "schema/") : (path + "/schema/"); + directory.setPath(path.endsWith("/") ? (path + "schema/") : (path + "/schema/")); QStringList pynames = directory.entryList(QStringList() << "*.json", QDir::Files, QDir::Name | QDir::IgnoreCase); for (const QString & pyname : pynames) { diff --git a/libsrc/hyperion/schema/schema-general.json b/libsrc/hyperion/schema/schema-general.json index bbb07d0a..fff7a320 100644 --- a/libsrc/hyperion/schema/schema-general.json +++ b/libsrc/hyperion/schema/schema-general.json @@ -14,6 +14,19 @@ "required" : true, "propertyOrder" : 1 }, + "versionBranch" : + { + "type" : "string", + "title" : "edt_conf_gen_versionBranch_title", + "enum" : ["Stable", "Beta"], + "required" : true, + "access" : "expert", + "default" : "Stable", + "options" : { + "enum_titles" : ["Stable", "Beta"] + }, + "propertyOrder" : 2 + }, "showOptHelp" : { "type" : "boolean", diff --git a/libsrc/leddevice/dev_net/LedDevicePhilipsHue.cpp b/libsrc/leddevice/dev_net/LedDevicePhilipsHue.cpp index d3fcc215..fe453894 100644 --- a/libsrc/leddevice/dev_net/LedDevicePhilipsHue.cpp +++ b/libsrc/leddevice/dev_net/LedDevicePhilipsHue.cpp @@ -125,7 +125,7 @@ float CiColor::getDistanceBetweenTwoPoints(CiColor p1, CiColor p2) PhilipsHueBridge::PhilipsHueBridge(Logger* log, QString host, QString username) : QObject() - , log(log) + , _log(log) , host(host) , username(username) { @@ -141,12 +141,12 @@ void PhilipsHueBridge::bConnect(void) { if(username.isEmpty() || host.isEmpty()) { - Error(log,"Username or IP Address is empty!"); + Error(_log,"Username or IP Address is empty!"); } else { QString url = QString("http://%1/api/%2").arg(host).arg(username); - Debug(log, "Connect to bridge %s", QSTRING_CSTR(url)); + Debug(_log, "Connect to bridge %s", QSTRING_CSTR(url)); QNetworkRequest request(url); manager.get(request); @@ -164,13 +164,13 @@ void PhilipsHueBridge::resolveReply(QNetworkReply* reply) QJsonDocument doc = QJsonDocument::fromJson(response, &error); if (error.error != QJsonParseError::NoError) { - Error(log, "Got invalid response from bridge"); + Error(_log, "Got invalid response from bridge"); return; } // check for authorization if(doc.isArray()) { - Error(log, "Authorization failed, username invalid"); + Error(_log, "Authorization failed, username invalid"); return; } @@ -178,7 +178,7 @@ void PhilipsHueBridge::resolveReply(QNetworkReply* reply) if(obj.isEmpty()) { - Error(log, "Bridge has no registered bulbs/stripes"); + Error(_log, "Bridge has no registered bulbs/stripes"); return; } @@ -193,7 +193,7 @@ void PhilipsHueBridge::resolveReply(QNetworkReply* reply) } else { - Error(log,"Network Error: %s", QSTRING_CSTR(reply->errorString())); + Error(_log,"Network Error: %s", QSTRING_CSTR(reply->errorString())); bTimer.start(); } } @@ -202,7 +202,7 @@ void PhilipsHueBridge::resolveReply(QNetworkReply* reply) void PhilipsHueBridge::post(QString route, QString content) { - //Debug(log, "Post %s: %s", QSTRING_CSTR(QString("http://IP/api/USR/%1").arg(route)), QSTRING_CSTR(content)); + //Debug(_log, "Post %s: %s", QSTRING_CSTR(QString("http://IP/api/USR/%1").arg(route)), QSTRING_CSTR(content)); QNetworkRequest request(QString("http://%1/api/%2/%3").arg(host).arg(username).arg(route)); manager.put(request, content.toLatin1()); @@ -216,14 +216,14 @@ const std::set PhilipsHueLight::GAMUT_C_MODEL_IDS = { "LLC020", "LST002", "LCT011", "LCT012", "LCT010", "LCT014", "LCT015", "LCT016", "LCT024" }; PhilipsHueLight::PhilipsHueLight(Logger* log, PhilipsHueBridge* bridge, unsigned int id, QJsonObject values) - : log(log) + : _log(log) , bridge(bridge) , id(id) { // Get state object values which are subject to change. if (!values["state"].toObject().contains("on")) { - Error(log, "Got invalid state object from light ID %d", id); + Error(_log, "Got invalid state object from light ID %d", id); } QJsonObject state; state["on"] = values["state"].toObject()["on"]; @@ -248,7 +248,7 @@ PhilipsHueLight::PhilipsHueLight(Logger* log, PhilipsHueBridge* bridge, unsigned // Find id in the sets and set the appropriate color space. if (GAMUT_A_MODEL_IDS.find(modelId) != GAMUT_A_MODEL_IDS.end()) { - Debug(log, "Recognized model id %s of light ID %d as gamut A", modelId.toStdString().c_str(), id); + Debug(_log, "Recognized model id %s of light ID %d as gamut A", modelId.toStdString().c_str(), id); colorSpace.red = { 0.704f, 0.296f}; colorSpace.green = @@ -258,7 +258,7 @@ PhilipsHueLight::PhilipsHueLight(Logger* log, PhilipsHueBridge* bridge, unsigned } else if (GAMUT_B_MODEL_IDS.find(modelId) != GAMUT_B_MODEL_IDS.end()) { - Debug(log, "Recognized model id %s of light ID %d as gamut B", modelId.toStdString().c_str(), id); + Debug(_log, "Recognized model id %s of light ID %d as gamut B", modelId.toStdString().c_str(), id); colorSpace.red = { 0.675f, 0.322f}; colorSpace.green = @@ -268,7 +268,7 @@ PhilipsHueLight::PhilipsHueLight(Logger* log, PhilipsHueBridge* bridge, unsigned } else if (GAMUT_C_MODEL_IDS.find(modelId) != GAMUT_C_MODEL_IDS.end()) { - Debug(log, "Recognized model id %s of light ID %d as gamut C", modelId.toStdString().c_str(), id); + Debug(_log, "Recognized model id %s of light ID %d as gamut C", modelId.toStdString().c_str(), id); colorSpace.red = { 0.6915f, 0.3083f}; colorSpace.green = @@ -278,7 +278,7 @@ PhilipsHueLight::PhilipsHueLight(Logger* log, PhilipsHueBridge* bridge, unsigned } else { - Warning(log, "Did not recognize model id %s of light ID %d", modelId.toStdString().c_str(), id); + Warning(_log, "Did not recognize model id %s of light ID %d", modelId.toStdString().c_str(), id); colorSpace.red = { 1.0f, 0.0f}; colorSpace.green = @@ -287,7 +287,7 @@ PhilipsHueLight::PhilipsHueLight(Logger* log, PhilipsHueBridge* bridge, unsigned { 0.0f, 0.0f}; } - Info(log,"Light ID %d created", id); + Info(_log,"Light ID %d created", id); } PhilipsHueLight::~PhilipsHueLight() diff --git a/libsrc/leddevice/dev_net/LedDevicePhilipsHue.h b/libsrc/leddevice/dev_net/LedDevicePhilipsHue.h index 0403b388..d42407bc 100644 --- a/libsrc/leddevice/dev_net/LedDevicePhilipsHue.h +++ b/libsrc/leddevice/dev_net/LedDevicePhilipsHue.h @@ -92,7 +92,7 @@ class PhilipsHueBridge : public QObject Q_OBJECT private: - Logger* log; + Logger* _log; /// QNetworkAccessManager for sending requests. QNetworkAccessManager manager; /// Ip address of the bridge @@ -138,7 +138,7 @@ public: class PhilipsHueLight { private: - Logger* log; + Logger* _log; PhilipsHueBridge* bridge; /// light id unsigned int id; diff --git a/test/TestQtScreenshot.cpp b/test/TestQtScreenshot.cpp index 20128cfe..7fe5cf8f 100644 --- a/test/TestQtScreenshot.cpp +++ b/test/TestQtScreenshot.cpp @@ -19,10 +19,10 @@ void createScreenshot(const int cropHorizontal, const int cropVertical, const int decimation, Image & image) { // Create the full size screenshot - const QRect screenSize = QApplication::desktop()->screenGeometry(); + QScreen *screen = QApplication::primaryScreen(); + const QRect screenSize = screen->availableGeometry(); const int croppedWidth = screenSize.width() - 2*cropVertical; const int croppedHeight = screenSize.height() - 2*cropHorizontal; - QScreen *screen = QApplication::primaryScreen(); const QPixmap fullSizeScreenshot = screen->grabWindow(QApplication::desktop()->winId(), cropVertical, cropHorizontal, croppedWidth, croppedHeight); // Scale the screenshot to the required size