mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
commit
846ffb5955
125
.azure.yml
125
.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,27 +30,124 @@ 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
|
||||
|
||||
# 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)'
|
||||
displayName: 'Build $(dockerName) packages'
|
||||
env:
|
||||
DOCKER_TAG: $(dockerTag)
|
||||
DOCKER_NAME: $(dockerName)
|
||||
PLATFORM: $(platform)
|
||||
- bash: ./.ci/ci_deploy.sh
|
||||
displayName: 'Upload $(dockerName)'
|
||||
|
||||
# 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
|
||||
inputs:
|
||||
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: $(dockerTag)
|
||||
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
|
||||
displayName: 'Publish deployables artifacts'
|
||||
|
||||
# set release to pre-release
|
||||
- bash: echo '##vso[task.setvariable variable=preRelease;]true'
|
||||
condition: and(succeeded(), 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
|
||||
inputs:
|
||||
gitHubConnection: Hyperion.NG
|
||||
repositoryName: $(Build.Repository.Name)
|
||||
action: edit
|
||||
target: $(Build.SourceVersion)
|
||||
tagSource: manual
|
||||
tag: $(Build.SourceBranchName)
|
||||
assets: '$(Build.ArtifactStagingDirectory)/*'
|
||||
assetUploadMode: 'replace'
|
||||
addChangeLog: false
|
||||
isPreRelease: $(preRelease)
|
||||
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
|
||||
displayName: Create/Update GitHub release
|
||||
|
||||
######################
|
||||
###### macOS #########
|
||||
######################
|
||||
|
||||
- job: macOS
|
||||
timeoutInMinutes: 120
|
||||
pool:
|
||||
vmImage: 'macOS-10.13'
|
||||
|
||||
steps:
|
||||
- checkout: self
|
||||
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
|
||||
|
||||
# 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'
|
||||
|
||||
# build process
|
||||
- bash: ./.ci/ci_build.sh
|
||||
displayName: 'Build macOS 10.13'
|
||||
- bash: ./.ci/ci_deploy.sh
|
||||
displayName: 'Upload macOS 10.13'
|
||||
displayName: 'Build macOS 10.13 packages'
|
||||
env:
|
||||
PLATFORM: 'osx'
|
||||
|
||||
# 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
|
||||
inputs:
|
||||
pathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: 'macos'
|
||||
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
|
||||
displayName: 'Publish deployables artifacts'
|
||||
|
||||
# set release to pre-release
|
||||
- bash: echo '##vso[task.setvariable variable=preRelease;]true'
|
||||
condition: and(succeeded(), 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
|
||||
inputs:
|
||||
gitHubConnection: Hyperion.NG
|
||||
repositoryName: $(Build.Repository.Name)
|
||||
action: edit
|
||||
target: $(Build.SourceVersion)
|
||||
tagSource: manual
|
||||
tag: '$(Build.SourceBranchName)'
|
||||
assets: '$(Build.ArtifactStagingDirectory)/*'
|
||||
assetUploadMode: 'replace'
|
||||
addChangeLog: false
|
||||
isPreRelease: $(preRelease)
|
||||
condition: and(succeeded(), ne(variables['system.pullrequest.isfork'], true), startsWith(variables['Build.SourceBranch'], 'refs/tags/'))
|
||||
displayName: Create/Update GitHub release
|
||||
|
@ -14,47 +14,26 @@ else
|
||||
CI_NAME="$(uname -s | tr '[:upper:]' '[:lower:]')"
|
||||
fi
|
||||
|
||||
# set environment variables
|
||||
BUILD_TYPE="Debug"
|
||||
PACKAGES=""
|
||||
[ -z "${PLATFORM}" ] && PLATFORM="x11"
|
||||
# set environment variables if not exists
|
||||
[ -z "${BUILD_TYPE}" ] && BUILD_TYPE="Debug"
|
||||
|
||||
# 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}"
|
||||
|
||||
# Determine cmake build type; tag builds are Release, else Debug
|
||||
if [ -n "${TRAVIS_TAG:-}" ] || [[ $BUILD_SOURCEBRANCH == *"refs/tags"* ]]; then
|
||||
# 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
|
||||
|
||||
# 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=/usr .. || exit 2
|
||||
make -j ${JOBS} ${PACKAGES} || exit 3
|
||||
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=${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 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
|
||||
@ -65,15 +44,15 @@ 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 || : &&
|
||||
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
|
||||
|
@ -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 <FILES> <sf_dir>
|
||||
# {
|
||||
# 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
|
@ -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,9 +59,8 @@ jobs:
|
||||
name: "macOS 10.12 (Xcode 8.3.3)"
|
||||
env:
|
||||
- HOMEBREW_CACHE=$HOME/brew-cache
|
||||
- PLATFORM="osx"
|
||||
|
||||
script:
|
||||
- ./.ci/ci_build.sh
|
||||
after_success:
|
||||
- ./.ci/ci_deploy.sh
|
||||
|
||||
|
@ -7,22 +7,56 @@ 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)
|
||||
|
||||
SET ( HYPERION_VERSION_STABLE OFF )
|
||||
SET ( HYPERION_VERSION_MAJOR 2 )
|
||||
SET ( HYPERION_VERSION_MINOR 0 )
|
||||
SET ( HYPERION_VERSION_PATCH 0 )
|
||||
find_package( PythonInterp 3.5 REQUIRED )
|
||||
|
||||
# Read version from version.json
|
||||
EXECUTE_PROCESS (
|
||||
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} )
|
||||
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. ${error_code}" )
|
||||
endif()
|
||||
|
||||
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_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
|
||||
SET ( DEFAULT_AMLOGIC OFF )
|
||||
SET ( DEFAULT_DISPMANX OFF )
|
||||
SET ( DEFAULT_OSX OFF )
|
||||
@ -46,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")
|
||||
@ -66,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}")
|
||||
@ -182,7 +212,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
|
||||
)
|
||||
@ -191,7 +221,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
|
||||
)
|
||||
@ -199,6 +229,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}
|
||||
@ -340,3 +371,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)
|
||||
|
||||
|
@ -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
|
||||
|
||||
@ -80,6 +89,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)
|
||||
|
@ -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_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"
|
||||
|
72
README.md
72
README.md
@ -1,65 +1,47 @@
|
||||
<p align="center">
|
||||
<img src="./assets/webconfig/img/hyperion/hyperionlogo.png" height="130">
|
||||
</p>
|
||||
![Hyperion.NG](https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/assets/webconfig/img/hyperion/hyperionlogo.png)
|
||||
|
||||
<p align="center">
|
||||
<a href="https://www.hyperion-project.org" alt="Forum">
|
||||
<img src="https://img.shields.io/website/https/hyperion-project.org.svg?down_color=red&down_message=offline&up_color=green&up_message=online" /></a>
|
||||
<a href="https://github.com/hyperion-project/hyperion.ng/graphs/contributors" alt="Contributors">
|
||||
<img src="https://img.shields.io/github/contributors/hyperion-project/hyperion.ng.svg" /></a>
|
||||
<a href="https://github.com/hyperion-project/hyperion.ng/tree/master/dependencies/external" alt="Dependencies">
|
||||
<img src="https://img.shields.io/librariesio/github/hyperion-project/hyperion.ng.svg" /></a>
|
||||
<a href="https://dev.azure.com/Hyperion-Project/Hyperion.NG/_build/latest?definitionId=7&branchName=master" alt="Azure-Pipeline">
|
||||
<img src="https://dev.azure.com/Hyperion-Project/Hyperion.NG/_apis/build/status/Hyperion.NG?branchName=master" /></a>
|
||||
<a href="https://travis-ci.org/hyperion-project/hyperion.ng" alt="Travis-CI">
|
||||
<img src="https://travis-ci.org/hyperion-project/hyperion.ng.svg?branch=master" /></a>
|
||||
<a href="https://lgtm.com/projects/g/hyperion-project/hyperion.ng/alerts/">
|
||||
<img src="https://img.shields.io/lgtm/alerts/g/hyperion-project/hyperion.ng.svg"
|
||||
alt="Total alerts"/></a>
|
||||
<a href="https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/LICENSE">
|
||||
<img src="https://img.shields.io/badge/License-MIT-yellow.svg"
|
||||
alt="GitHub license"></a>
|
||||
</p>
|
||||
[![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/)
|
||||
|
||||
<p align="center">This is a pre alpha development repository for the next major version of hyperion</p>
|
||||
## 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)
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -75,7 +75,7 @@ $(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.serverConfig.general.versionBranch);
|
||||
|
@ -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) {
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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; }
|
||||
|
||||
|
@ -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})" )
|
||||
|
@ -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_CHANNEL}.${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}")
|
||||
else()
|
||||
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")
|
||||
SET ( CPACK_PACKAGE_EXECUTABLES "hyperiond;Hyperion" )
|
||||
SET ( CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/hyperion-icon-32px.png")
|
||||
|
@ -33,7 +33,7 @@
|
||||
"output" : "/dev/null",
|
||||
"rate" : 1000000,
|
||||
"colorOrder" : "rgb",
|
||||
"rewriteTime": 0
|
||||
"rewriteTime": 5000
|
||||
},
|
||||
|
||||
/// Color manipulation configuration used to tune the output colors to specific surroundings.
|
||||
|
BIN
doc/screenshot.png
Normal file
BIN
doc/screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 226 KiB |
@ -6,7 +6,7 @@
|
||||
#include <utils/Components.h>
|
||||
#include <hyperion/Hyperion.h>
|
||||
|
||||
// qt includess
|
||||
// qt includes
|
||||
#include <QJsonObject>
|
||||
#include <QMutex>
|
||||
#include <QString>
|
||||
@ -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
|
||||
|
@ -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()
|
||||
);
|
||||
|
||||
|
@ -5,7 +5,6 @@
|
||||
#include <QMap>
|
||||
|
||||
// QT includes
|
||||
//#include <QObject>
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QSize>
|
||||
@ -13,6 +12,7 @@
|
||||
#include <QJsonValue>
|
||||
#include <QJsonArray>
|
||||
#include <QFileSystemWatcher>
|
||||
#include <QMutex>
|
||||
|
||||
// hyperion-utils includes
|
||||
#include <utils/Image.h>
|
||||
@ -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<ColorRgb>);
|
||||
/// Signal which is emitted, when a new system proto image should be forwarded
|
||||
void forwardSystemProtoMessage(const QString, const Image<ColorRgb>);
|
||||
|
||||
/// Signal which is emitted, when a new V4l proto image should be forwarded
|
||||
void forwardV4lProtoMessage(const QString, const Image<ColorRgb>);
|
||||
|
||||
///
|
||||
/// @brief Is emitted from clients who request a videoMode change
|
||||
@ -560,12 +563,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<ColorRgb> _ledBuffer;
|
||||
|
||||
/// Boblight instance
|
||||
BoblightServer* _boblightServer;
|
||||
|
||||
/// mutex
|
||||
QMutex _changes;
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
@ -30,7 +30,6 @@ EffectEngine::EffectEngine(Hyperion * hyperion)
|
||||
{
|
||||
|
||||
Q_INIT_RESOURCE(EffectEngine);
|
||||
qRegisterMetaType<std::vector<ColorRgb>>("std::vector<ColorRgb>");
|
||||
qRegisterMetaType<hyperion::Components>("hyperion::Components");
|
||||
|
||||
// connect the Hyperion channel clear feedback
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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))
|
||||
{
|
||||
@ -73,7 +75,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 +96,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
|
||||
{
|
||||
|
@ -106,9 +106,6 @@ 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);
|
||||
|
||||
// listens for ComponentRegister changes of COMP_ALL to perform core enable/disable actions
|
||||
connect(&_componentRegister, &ComponentRegister::updatedComponentState, this, &Hyperion::updatedComponentState);
|
||||
|
||||
@ -186,7 +183,6 @@ void Hyperion::freeObjects(bool emitCloseSignal)
|
||||
delete _boblightServer;
|
||||
delete _captureCont;
|
||||
delete _effectEngine;
|
||||
//delete _deviceSmooth;
|
||||
delete _raw2ledAdjustment;
|
||||
delete _messageForwarder;
|
||||
delete _settingsManager;
|
||||
@ -209,10 +205,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 +248,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 +278,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();
|
||||
@ -562,66 +562,42 @@ 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()
|
||||
{
|
||||
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<ColorRgb> 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 +636,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 +648,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);
|
||||
|
||||
|
@ -3,7 +3,6 @@
|
||||
// STL includes
|
||||
#include <vector>
|
||||
|
||||
|
||||
// Qt includes
|
||||
#include <QVector>
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -106,7 +106,7 @@ void MultiColorAdjustment::applyAdjustment(std::vector<ColorRgb>& 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);
|
||||
|
@ -10,6 +10,8 @@
|
||||
#include "hyperion/Hyperion.h"
|
||||
#include <utils/JsonUtils.h>
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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, &QThread::deleteLater);
|
||||
connect(thread, &QThread::finished, _ledDevice, &LedDevice::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, 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();
|
||||
// start the thread
|
||||
thread->start();
|
||||
}
|
||||
|
||||
const QJsonObject LedDeviceWrapper::getLedDeviceSchemas()
|
||||
@ -142,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
|
||||
disconnect(oldThread, 0, 0, 0);
|
||||
oldThread->quit();
|
||||
oldThread->wait();
|
||||
delete oldThread;
|
||||
|
||||
disconnect(_ledDevice, 0, 0, 0);
|
||||
delete _ledDevice;
|
||||
_ledDevice = nullptr;
|
||||
}
|
||||
|
@ -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<ColorRgb> & ledValues )
|
||||
{
|
||||
uint idx = OPC_HEADER_SIZE;
|
||||
@ -103,11 +100,11 @@ int LedDeviceFadeCandy::write( const std::vector<ColorRgb> & 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;
|
||||
}
|
||||
|
@ -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<ColorRgb> & ledValues);
|
||||
virtual int write(const std::vector<ColorRgb>& ledValues);
|
||||
|
||||
private:
|
||||
QTcpSocket _client;
|
||||
QString _host;
|
||||
protected:
|
||||
QTcpSocket* _client;
|
||||
QString _host;
|
||||
uint16_t _port;
|
||||
unsigned _channel;
|
||||
QByteArray _opc_data;
|
||||
|
@ -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<QString> 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()
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -77,6 +77,7 @@
|
||||
"gamma" : {
|
||||
"type" : "number",
|
||||
"title" : "edt_dev_spec_gamma_title",
|
||||
"default": 1.0,
|
||||
"minimum" : 0.1,
|
||||
"maximum": 5.0,
|
||||
"options": {
|
||||
|
@ -75,6 +75,7 @@ HyperionDaemon::HyperionDaemon(QString configFile, const QString rootPath, QObje
|
||||
qRegisterMetaType<settings::type>("settings::type");
|
||||
qRegisterMetaType<VideoMode>("VideoMode");
|
||||
qRegisterMetaType<QMap<quint8,QJsonObject>>("QMap<quint8,QJsonObject>");
|
||||
qRegisterMetaType<std::vector<ColorRgb>>("std::vector<ColorRgb>");
|
||||
|
||||
// init settings
|
||||
_settingsManager = new SettingsManager(0,configFile);
|
||||
|
@ -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)
|
||||
|
||||
###################################################
|
||||
|
@ -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<ColorRgb> 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<ColorRgb> 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<ColorRgb> 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;
|
||||
}
|
||||
|
@ -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...";
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <QPixmap>
|
||||
#include <QFile>
|
||||
#include <QRgb>
|
||||
#include <QScreen>
|
||||
|
||||
#include <QElapsedTimer>
|
||||
|
||||
@ -18,10 +19,11 @@
|
||||
void createScreenshot(const int cropHorizontal, const int cropVertical, const int decimation, Image<ColorRgb> & 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;
|
||||
const QPixmap fullSizeScreenshot = QPixmap::grabWindow(QApplication::desktop()->winId(), cropVertical, cropHorizontal, croppedWidth, croppedHeight);
|
||||
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;
|
||||
|
@ -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)
|
||||
|
||||
|
14
test/jsonchecks/version.py
Normal file
14
test/jsonchecks/version.py
Normal file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env python
|
||||
import json, sys
|
||||
|
||||
retval = 0
|
||||
|
||||
with open(sys.argv[1]) as f:
|
||||
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)
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user