mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00:00 
			
		
		
		
	Merge remote-tracking branch 'refs/remotes/tvdzwan/master'
Former-commit-id: 59c1c363863c950e91ac57cc2ff39a722359634b
This commit is contained in:
		
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,6 @@ | |||||||
| [submodule "dependencies/external/protobuf"] | [submodule "dependencies/external/protobuf"] | ||||||
| 	path = dependencies/external/protobuf | 	path = dependencies/external/protobuf | ||||||
| 	url = https://github.com/tvdzwan/protobuf.git | 	url = https://github.com/tvdzwan/protobuf.git | ||||||
|  | [submodule "dependencies/external/rpi_ws281x"] | ||||||
|  | 	path = dependencies/external/rpi_ws281x | ||||||
|  | 	url = https://github.com/jgarff/rpi_ws281x | ||||||
|   | |||||||
| @@ -34,6 +34,9 @@ message(STATUS "ENABLE_V4L2 = " ${ENABLE_V4L2}) | |||||||
| option(ENABLE_WS2812BPWM   "Enable the WS2812b-PWM device" OFF) | option(ENABLE_WS2812BPWM   "Enable the WS2812b-PWM device" OFF) | ||||||
| message(STATUS "ENABLE_WS2812BPWM = " ${ENABLE_WS2812BPWM}) | message(STATUS "ENABLE_WS2812BPWM = " ${ENABLE_WS2812BPWM}) | ||||||
|  |  | ||||||
|  | option(ENABLE_WS281XPWM   "Enable the WS281x-PWM device" OFF) | ||||||
|  | message(STATUS "ENABLE_WS281XPWM = " ${ENABLE_WS281XPWM}) | ||||||
|  |  | ||||||
| option(ENABLE_X11 "Enable the X11 grabber" OFF) | option(ENABLE_X11 "Enable the X11 grabber" OFF) | ||||||
| message(STATUS "ENABLE_X11 = " ${ENABLE_X11}) | message(STATUS "ENABLE_X11 = " ${ENABLE_X11}) | ||||||
|  |  | ||||||
| @@ -70,11 +73,11 @@ include_directories("${PROJECT_BINARY_DIR}") | |||||||
| set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) | set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake) | ||||||
|  |  | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| ADD_DEFINITIONS ( -DENABLE_QT5 ) | 	ADD_DEFINITIONS ( -DENABLE_QT5 ) | ||||||
| #find_package(Qt5Widgets) | 	#find_package(Qt5Widgets) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| # Add specific cmake modules to find qt4 (default version finds first available QT which might not be qt4) | 	# Add specific cmake modules to find qt4 (default version finds first available QT which might not be qt4) | ||||||
| set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/qt4) | 	set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/qt4) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| # Define the global output path of binaries | # Define the global output path of binaries | ||||||
| @@ -97,23 +100,23 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall") | |||||||
|  |  | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| #find_package(Qt5Core REQUIRED) | #find_package(Qt5Core REQUIRED) | ||||||
| find_package(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED) | 	find_package(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED) | ||||||
|   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}    ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") | 	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}    ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") | ||||||
| #      set(CMAKE_CXX_FLAGS "-fPIC") | #	set(CMAKE_CXX_FLAGS "-fPIC") | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| # Configure the use of QT4 | 	# Configure the use of QT4 | ||||||
| find_package(Qt4 COMPONENTS QtCore QtGui QtNetwork REQUIRED QUIET) | 	find_package(Qt4 COMPONENTS QtCore QtNetwork QtGui REQUIRED QUIET) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| #add libusb and pthreads | #add libusb and pthreads | ||||||
| find_package(libusb-1.0 REQUIRED) | find_package(libusb-1.0 REQUIRED) | ||||||
| find_package(Threads REQUIRED) | find_package(Threads REQUIRED) | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| #include(${QT_USE_FILE}) | 	#include(${QT_USE_FILE}) | ||||||
| add_definitions(${QT_DEFINITIONS}) | 	add_definitions(${QT_DEFINITIONS}) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| include(${QT_USE_FILE}) | 	include(${QT_USE_FILE}) | ||||||
| add_definitions(${QT_DEFINITIONS}) | 	add_definitions(${QT_DEFINITIONS}) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| # TODO[TvdZ]: This linking directory should only be added if we are cross compiling | # TODO[TvdZ]: This linking directory should only be added if we are cross compiling | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| # Install the required tools and dependencies | # Install the required tools and dependencies | ||||||
| sudo apt-get update | sudo apt-get update | ||||||
| sudo apt-get install git cmake build-essential libQt4-dev libusb-1.0-0-dev python-dev | sudo apt-get install git cmake build-essential libQt4-dev libusb-1.0-0-dev python-dev libxrender-dev | ||||||
|  |  | ||||||
| # RPI ONLY: when you build on the rapberry pi and include the dispmanx grabber (which is the default)  | # RPI ONLY: when you build on the rapberry pi and include the dispmanx grabber (which is the default)  | ||||||
| # you also need the firmware including headers installed. This downloads the firmware from the raspberrypi github | # you also need the firmware including headers installed. This downloads the firmware from the raspberrypi github | ||||||
|   | |||||||
| @@ -1,51 +1,62 @@ | |||||||
| ON TARGET | #!/bin/bash | ||||||
| -------------- | #Updated: 13 March 2016, by TPmodding | ||||||
| sudo apt-get install libQt4-dev libusb-1.0-0-dev python-dev rsync | #Just use a clean Ubunut 14.04 and run this script | ||||||
|  | ############## | ||||||
|  | #ON TARGET | ||||||
|  | #-------------- | ||||||
|  | #sudo apt-get install libQt4-dev libusb-1.0-0-dev python-dev rsync | ||||||
|  | ############# | ||||||
|  |  | ||||||
| ON HOST | #ON HOST | ||||||
| --------- | #--------- | ||||||
| export TARGET_IP=192.168.1.17 | sudo apt-get update | ||||||
|  | sudo apt-get upgrade | ||||||
|  | #TO-DO verify what is really required | ||||||
|  | sudo apt-get install git rsync cmake build-essential libQt4-dev libusb-1.0-0-dev python-dev libxrender-dev protobuf-compiler lib32z1 lib32ncurses5 lib32bz2-1.0 zlib1g-dev | ||||||
|  |  | ||||||
|  | echo 'PATH=$PATH:$HOME/raspberrypi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin' >> .bashrc | ||||||
|  | #--------- | ||||||
|  |  | ||||||
|  |  | ||||||
|  | export TARGET_IP=192.168.0.103 | ||||||
| export TARGET_USER=pi | export TARGET_USER=pi | ||||||
|  |  | ||||||
| export RASCROSS_DIR="$HOME/raspberrypi" | export RASCROSS_DIR="$HOME/raspberrypi" | ||||||
| export ROOTFS_DIR="RASCROSS_DIR/rootfs" | export ROOTFS_DIR="$RASCROSS_DIR/rootfs" | ||||||
| export HYPERION_DIR="$HOME/hyperion" | export HYPERION_DIR="$HOME/hyperion" | ||||||
|  | #export IMX6_DIR="$HOME/hummingboard" | ||||||
| export TOOLCHAIN_FILE="$HYPERION_DIR/Toolchain-RaspberryPi.cmake" | export TOOLCHAIN_FILE="$HYPERION_DIR/Toolchain-RaspberryPi.cmake" | ||||||
|  |  | ||||||
| export NATIVE_BUILD_DIR="$HYPERION_DIR/build" | export NATIVE_BUILD_DIR="$HYPERION_DIR/build" | ||||||
| export TARGET_BUILD_DIR=HYPERION_DIR="$HYPERION_DIR/build-rpi" | export TARGET_BUILD_DIR="$HYPERION_DIR/build-rpi" | ||||||
|  |  | ||||||
| # install required packages |  | ||||||
| sudo apt-get install git rsync cmake build-essential libQt4-dev libusb-1.0-0-dev python-dev |  | ||||||
| sudo apt-get install git rsync cmake ia32-libs protobuf-compiler |  | ||||||
|  |  | ||||||
| # On newer version of Ubuntu (and maybe other distros) the ia32-libs is not available, the following |  | ||||||
| # install solved this for me (TODO: verify what is really required) |  | ||||||
| sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 libstdc++5:i386 libstdc++6:i386 |  | ||||||
|  |  | ||||||
| # create the rootfs by copying it from an target |  | ||||||
| mkdir -p "$ROOTFS_DIR" | mkdir -p "$ROOTFS_DIR" | ||||||
| rsync -rl --delete-after --copy-unsafe-links $TARGET_USER@$TARGET_IP:/{lib,usr} "$ROOTFS_DIR" | rsync -rl --delete-after --copy-unsafe-links $TARGET_USER@$TARGET_IP:/{lib,usr} "$ROOTFS_DIR" | ||||||
|  |  | ||||||
| ######## RPi specific ######### | ######## RPi specific ######### | ||||||
|  |  | ||||||
| # get the raspberry pi firmware and add it to the rootfs | mkdir -p "$RASCROSS_DIR/firmware" | ||||||
| git clone https://github.com/raspberrypi/firmware.git "$RASCROSS_DIR/firmware" | git clone https://github.com/raspberrypi/firmware.git "$RASCROSS_DIR/firmware" | ||||||
| ln -s "$RASCROSS_DIR/firmware/hardfp/opt" "$ROOTFS_DIR/opt" | ln -s "$RASCROSS_DIR/firmware/hardfp/opt" "$ROOTFS_DIR/opt" | ||||||
|  |  | ||||||
| # get the compile tools |  | ||||||
| git clone git://github.com/raspberrypi/tools.git "$RASCROSS_DIR/tools" | git clone git://github.com/raspberrypi/tools.git "$RASCROSS_DIR/tools" | ||||||
|  |  | ||||||
| ##### End of RPi specific ###### | ##### End of RPi specific ###### | ||||||
|  |  | ||||||
|  | ######## NOT TESTED ONLY INFOs ######### | ||||||
|  | ######## IMX6 specific ######### | ||||||
|  | #export IMX6_DIR="$HOME/hummingboard" | ||||||
|  | #mkdir -p "$IMX6_Dir" | ||||||
|  | #cd "$IMX6_Dir" | ||||||
|  | #wget https://launchpad.net/linaro-toolchain-binaries/trunk/2013.10/+download/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux.tar.bz2 | ||||||
|  | #tar -xvjf gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux.tar.bz2 | ||||||
|  | #cd | ||||||
|  | ##### End of IMX6 specific ###### | ||||||
|  | ######## NOT TESTED     ######### | ||||||
|  |  | ||||||
| # get the Hyperion sources | # get the Hyperion sources | ||||||
| git clone --recursive https://github.com/tvdzwan/hyperion.git "$HYPERION_DIR" | git clone --recursive https://github.com/tvdzwan/hyperion.git "$HYPERION_DIR" | ||||||
|  |  | ||||||
| # if you forget the --resursive in above statement or you are updating an existing clone you need |  | ||||||
| # to clone the protobuf submodule by runnning the follwing two statements: |  | ||||||
| git submodule init |  | ||||||
| git submodule update |  | ||||||
|  |  | ||||||
| # do a native build (to build the protobuf compiler for the native platform) | # do a native build (to build the protobuf compiler for the native platform) | ||||||
| mkdir -p "$NATIVE_BUILD_DIR" | mkdir -p "$NATIVE_BUILD_DIR" | ||||||
| cmake -DENABLE_DISPMANX=OFF --build "$NATIVE_BUILD_DIR" "$HYPERION_DIR" | cmake -DENABLE_DISPMANX=OFF --build "$NATIVE_BUILD_DIR" "$HYPERION_DIR" | ||||||
| @@ -55,9 +66,17 @@ cmake -DENABLE_DISPMANX=OFF --build "$NATIVE_BUILD_DIR" "$HYPERION_DIR" | |||||||
| mkdir -p "$TARGET_BUILD_DIR" | mkdir -p "$TARGET_BUILD_DIR" | ||||||
| cmake -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE" -DIMPORT_PROTOC=$NATIVE_BUILD_DIR/protoc_export.cmake --build "$TARGET_BUILD_DIR" "$HYPERION_DIR" | cmake -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE" -DIMPORT_PROTOC=$NATIVE_BUILD_DIR/protoc_export.cmake --build "$TARGET_BUILD_DIR" "$HYPERION_DIR" | ||||||
|  |  | ||||||
| # For hummingboard (imx6) the following package is required | #compile | ||||||
| sudo apt-get install lib32z1 | cd "$HYPERION_DIR/deploy" | ||||||
|  | rm -rf hummingboard_prerelease.tar.gz hyperion.deps.openelec-imx6.tar.gz hyperion.deps.openelec-rpi.tar.gz hyperion_imx6.tar.gz hyperion_rpi.tar.gz hyperion_wetek.tar.gz hyperion_x32.tar.gz hyperion_x64.tar.gz | ||||||
|  | cd | ||||||
|  | cd "$HYPERION_DIR/bin" | ||||||
|  | chmod +x * | ||||||
|  | cp "$HYPERION_DIR/bin/create_all_releases.sh" "$HYPERION_DIR" | ||||||
|  | cd "$HYPERION_DIR" | ||||||
|  | ./create_all_releases.sh | ||||||
|  |  | ||||||
| ------------------------------------------------------------------------------ | ######END | ||||||
| These instructions are based on the guide given by: | #------------------------------------------------------------------------------ | ||||||
| http://airwiki.ws.dei.polimi.it/index.php/Cross-compiling_for_the_RaspberryPi | #These instructions are based on tvdzwan and on the guide given by: | ||||||
|  | #http://airwiki.ws.dei.polimi.it/index.php/Cross-compiling_for_the_RaspberryPi | ||||||
|   | |||||||
| @@ -12,6 +12,9 @@ | |||||||
| // Define to enable the ws2812b-pwm-device | // Define to enable the ws2812b-pwm-device | ||||||
| #cmakedefine ENABLE_WS2812BPWM | #cmakedefine ENABLE_WS2812BPWM | ||||||
|  |  | ||||||
|  | // Define to enable the ws281x-pwm-via-dma-device using jgarff's library | ||||||
|  | #cmakedefine ENABLE_WS281XPWM | ||||||
|  |  | ||||||
| // Define to enable the spi-device | // Define to enable the spi-device | ||||||
| #cmakedefine ENABLE_TINKERFORGE | #cmakedefine ENABLE_TINKERFORGE | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								ISSUE_TEMPLATE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								ISSUE_TEMPLATE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | **Please provide some information that we could help as fast as possible. | ||||||
|  | Please check the wiki in case your problem is already known/feature requested.** | ||||||
|  |  | ||||||
|  | **1.** Used hardware and sofware (Wetek,RPi1,Rpi2,... Ubuntu 14.04(64bit),OSX,OpenELEC,OSMC,XBian,...) | ||||||
|  | **2.** Your LED device and additional hardware (if used) (WS2801,APA102,WS2812B,...  connected through (direct,arduino uno,...)) | ||||||
|  | **3.** Please upload your Hyperion log to pastebin.com and insert the link. Have a look at the wiki how you get one. | ||||||
|  | **4.** Please upload your "Hyperion Configuration File" to www.jsoneditoronline.org and insert the link. | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								PULL_REQUEST_TEMPLATE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								PULL_REQUEST_TEMPLATE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | |||||||
|  | **1.** Tell us something about your changes. | ||||||
|  | **2.** If this changes affect the .conf file. Please provide the changed section | ||||||
|  | **3.** Reference a issue (optional) | ||||||
|  |  | ||||||
| @@ -1,37 +1,37 @@ | |||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  | # create all directly for release with -DCMAKE_BUILD_TYPE=Release -Wno-dev | ||||||
| # Create the x64 build | # Create the x64 build | ||||||
| mkdir build-x64 | mkdir build-x64 | ||||||
| cd build-x64 | cd build-x64 | ||||||
| cmake -DENABLE_DISPMANX=OFF -DENABLE_X11=ON .. | cmake -DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DCMAKE_BUILD_TYPE=Release -Wno-dev .. | ||||||
| make -j 4 | make -j 4 | ||||||
| cd .. | cd .. | ||||||
|  |  | ||||||
| # Create the x32 build | # Create the x32 build | ||||||
| mkdir build-x32 | mkdir build-x32 | ||||||
| cd build-x32 | cd build-x32 | ||||||
| cmake -DIMPORT_PROTOC=../build-x64/protoc_export.cmake -DENABLE_DISPMANX=OFF -DENABLE_X11=ON .. | cmake -DIMPORT_PROTOC=../build-x64/protoc_export.cmake -DENABLE_DISPMANX=OFF -DENABLE_X11=ON -DCMAKE_BUILD_TYPE=Release -Wno-dev .. | ||||||
| make -j 4 | make -j 4 | ||||||
| cd .. | cd .. | ||||||
|  |  | ||||||
| # Create the RPI build | # Create the RPI build | ||||||
| mkdir build-rpi | mkdir build-rpi | ||||||
| cd build-rpi | cd build-rpi | ||||||
| cmake -DCMAKE_TOOLCHAIN_FILE="../Toolchain-rpi.cmake" -DIMPORT_PROTOC=../build-x64/protoc_export.cmake .. | cmake -DCMAKE_TOOLCHAIN_FILE="../Toolchain-rpi.cmake" -DIMPORT_PROTOC=../build-x64/protoc_export.cmake -DCMAKE_BUILD_TYPE=Release -Wno-dev .. | ||||||
| make -j 4 | make -j 4 | ||||||
| cd .. | cd .. | ||||||
|  |  | ||||||
| # Create the WETEK build | # Create the WETEK build | ||||||
| mkdir build-wetek | mkdir build-wetek | ||||||
| cd build-wetek | cd build-wetek | ||||||
| cmake -DCMAKE_TOOLCHAIN_FILE="../Toolchain-rpi.cmake" -DIMPORT_PROTOC=../build-x64/protoc_export.cmake -DENABLE_DISPMANX=OFF -DENABLE_FB=ON -DENABLE_AMLOGIC=ON .. | cmake -DCMAKE_TOOLCHAIN_FILE="../Toolchain-rpi.cmake" -DIMPORT_PROTOC=../build-x64/protoc_export.cmake -DENABLE_DISPMANX=OFF -DENABLE_FB=ON -DENABLE_AMLOGIC=ON -DCMAKE_BUILD_TYPE=Release -Wno-dev .. | ||||||
| make -j 4 | make -j 4 | ||||||
| cd .. | cd .. | ||||||
|  |  | ||||||
| # Create the IMX6 build | # Create the IMX6 build | ||||||
| mkdir build-imx6 | mkdir build-imx6 | ||||||
| cd build-imx6 | cd build-imx6 | ||||||
| cmake -DCMAKE_TOOLCHAIN_FILE="../Toolchain-imx6.cmake" -DIMPORT_PROTOC=../build-x64/protoc_export.cmake -DENABLE_DISPMANX=OFF -DENABLE_FB=ON .. | cmake -DCMAKE_TOOLCHAIN_FILE="../Toolchain-imx6.cmake" -DIMPORT_PROTOC=../build-x64/protoc_export.cmake -DENABLE_DISPMANX=OFF -DENABLE_FB=ON -DCMAKE_BUILD_TYPE=Release -Wno-dev .. | ||||||
| make -j 4 | make -j 4 | ||||||
| cd .. | cd .. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -8,10 +8,4 @@ stop on (runlevel [!2345]) | |||||||
|  |  | ||||||
| respawn | respawn | ||||||
|  |  | ||||||
| pre-start script |  | ||||||
| #comment out the following 2 lines for x32/64 |  | ||||||
| modprobe spidev  |  | ||||||
| /usr/bin/gpio2spi |  | ||||||
| end script |  | ||||||
|  |  | ||||||
| exec /usr/bin/hyperiond /etc/hyperion.config.json | exec /usr/bin/hyperiond /etc/hyperion.config.json | ||||||
| @@ -1,105 +1,255 @@ | |||||||
| #!/bin/sh | #!/bin/sh | ||||||
|  | # Script for downloading and installing the latest Hyperion release | ||||||
|  |  | ||||||
| # Make sure /sbin is on the path (for service to find sub scripts) | # Make sure /sbin is on the path (for service to find sub scripts) | ||||||
| PATH="/sbin:$PATH" | PATH="/sbin:$PATH" | ||||||
|  |  | ||||||
| # Script for downloading and installing the latest Hyperion release | #Check if HyperCon is logged in as root | ||||||
|  | if [ $(id -u) != 0 ] && [ "$1" = "HyperConInstall" ]; then | ||||||
|  | 		echo '---> Critical Error: Please connect as user "root" through HyperCon'  | ||||||
|  | 		echo '---> We need admin privileges to install/update your Hyperion! -> abort' | ||||||
|  | 		exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
| # Find out if we are on Raspbmc | #Check, if script is running as root | ||||||
| IS_XBIAN=`cat /etc/issue | grep XBian | wc -l` | if [ $(id -u) != 0 ]; then | ||||||
| IS_RASPBMC=`cat /etc/issue | grep Raspbmc | wc -l` | 		echo '---> Critical Error: Please run the script as root (sudo sh ./install_hyperion.sh) -> abort'  | ||||||
| IS_OPENELEC=`cat /etc/issue | grep -m 1 OpenELEC | wc -l` | 		exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | #Welcome message | ||||||
|  | echo '*******************************************************************************'  | ||||||
|  | echo 'This script will install/update Hyperion and it´s services'  | ||||||
|  | echo 'Version 0.1'  | ||||||
|  | echo '*******************************************************************************' | ||||||
|  |  | ||||||
|  | # Find out if we are on OpenElec / OSMC | ||||||
|  | OS_OPENELEC=`grep -m1 -c OpenELEC /etc/issue` | ||||||
|  | OS_OSMC=`grep -m1 -c OSMC /etc/issue` | ||||||
|  |  | ||||||
| # Find out if its an imx6 device | # Find out if its an imx6 device | ||||||
| IS_IMX6=`cat /proc/cpuinfo | grep i.MX6 | wc -l` | CPU_RPI=`grep -m1 -c 'BCM2708\|BCM2709\|BCM2710' /proc/cpuinfo` | ||||||
|  | CPU_IMX6=`grep -m1 -c i.MX6 /proc/cpuinfo` | ||||||
|  | CPU_WETEK=`grep -m1 -c Amlogic /proc/cpuinfo` | ||||||
|  | CPU_X64=`uname -m | grep x86_64 | wc -l` | ||||||
|  | CPU_X32=`uname -m | grep 'x86_32\|i686' | wc -l` | ||||||
|  | # Check that we have a known configuration | ||||||
|  | if [ $CPU_RPI -ne 1 ] && [ $CPU_IMX6 -ne 1 ] && [ $CPU_WETEK -ne 1 ] && [ $CPU_X64 -ne 1 ] && [ $CPU_X32 -ne 1 ]; then | ||||||
|  | 	echo '---> Critical Error: CPU information does not match any known releases -> abort' | ||||||
|  | 	exit 1 | ||||||
|  | fi | ||||||
|  | #Check, if year equals 1970 | ||||||
|  | DATE=$(date +"%Y") | ||||||
|  | if [ "$DATE" -le "2015" ]; then | ||||||
|  |         echo "---> Critical Error: Please update your systemtime (Year of your system: ${DATE}) -> abort" | ||||||
|  |         exit 1 | ||||||
|  | fi | ||||||
|  |  | ||||||
| # check which init script we should use | # check which init script we should use | ||||||
|  | USE_SYSTEMD=`grep -m1 -c systemd /proc/1/comm` | ||||||
| USE_INITCTL=`which /sbin/initctl | wc -l` | USE_INITCTL=`which /sbin/initctl | wc -l` | ||||||
| USE_SERVICE=`which /usr/sbin/service | wc -l` | USE_SERVICE=`which /usr/sbin/service | wc -l` | ||||||
|  |  | ||||||
| # Make sure that the boblight daemon is no longer running | # Make sure that the boblight daemon is no longer running | ||||||
| BOBLIGHT_PROCNR=$(pidof boblightd | wc -l) | BOBLIGHT_PROCNR=$(pidof boblightd | wc -l) | ||||||
| if [ $BOBLIGHT_PROCNR -eq 1 ]; | if [ $BOBLIGHT_PROCNR -eq 1 ]; then | ||||||
| then | 	echo '---> Critical Error: Found running instance of boblight. Please stop boblight via XBMC menu before installing hyperion -> abort' | ||||||
| 	echo 'Found running instance of boblight. Please stop boblight via XBMC menu before installing hyperion' | 	exit 1 | ||||||
| 	exit |  | ||||||
| fi | fi | ||||||
|  |  | ||||||
| # Stop hyperion daemon if it is running | # Stop hyperion daemon if it is running | ||||||
| # Start the hyperion daemon | echo '---> Stop Hyperion, if necessary' | ||||||
| if [ $USE_INITCTL -eq 1 ]; then | if [ $OS_OPENELEC -eq 1 ]; then | ||||||
| 	/sbin/initctl stop hyperion |     killall hyperiond 2>/dev/null | ||||||
|  | elif [ $USE_INITCTL -eq 1 ]; then | ||||||
|  | 	/sbin/initctl stop hyperion 2>/dev/null | ||||||
| elif [ $USE_SERVICE -eq 1 ]; then | elif [ $USE_SERVICE -eq 1 ]; then | ||||||
| 	/usr/sbin/service hyperion stop | 	/usr/sbin/service hyperion stop 2>/dev/null | ||||||
|  | elif [ $USE_SYSTEMD -eq 1 ]; then | ||||||
|  | 	service hyperion stop 2>/dev/null | ||||||
|  | 	#many people installed with the official script and this just uses service, if both registered -> dead | ||||||
|  | 	/usr/sbin/service hyperion stop 2>/dev/null | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | #Install dependencies for Hyperion | ||||||
|  | if [ $OS_OPENELEC -ne 1 ]; then | ||||||
|  | 	echo '---> Install/Update Hyperion dependencies (This may take a while)' | ||||||
|  | 	apt-get -qq update && apt-get -qq --yes install libqtcore4 libqtgui4 libqt4-network libusb-1.0-0 ca-certificates | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | #Check, if dtparam=spi=on is in place (not for OPENELEC) | ||||||
|  | if [ $CPU_RPI -eq 1 ] && [ $OS_OPENELEC -ne 1 ]; then | ||||||
|  | 	SPIOK=`grep '^\dtparam=spi=on' /boot/config.txt | wc -l` | ||||||
|  | 		if [ $SPIOK -ne 1 ]; then | ||||||
|  | 			echo '---> Raspberry Pi found, but SPI is not ready, we write "dtparam=spi=on" to /boot/config.txt' | ||||||
|  | 			sed -i '$a dtparam=spi=on' /boot/config.txt | ||||||
|  | 			REBOOTMESSAGE="echo Please reboot your Raspberry Pi, we inserted dtparam=spi=on to /boot/config.txt" | ||||||
|  | 	fi | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | #Check, if dtparam=spi=on is in place (just for OPENELEC) | ||||||
|  | if [ $CPU_RPI -eq 1 ] && [ $OS_OPENELEC -eq 1 ]; then | ||||||
|  | 	SPIOK=`grep '^\dtparam=spi=on' /flash/config.txt | wc -l` | ||||||
|  | 		if [ $SPIOK -ne 1 ]; then | ||||||
|  | 			mount -o remount,rw /flash | ||||||
|  | 			echo '---> Raspberry Pi with OpenELEC found, but SPI is not ready, we write "dtparam=spi=on" to /flash/config.txt' | ||||||
|  | 			sed -i '$a dtparam=spi=on' /flash/config.txt | ||||||
|  | 			mount -o remount,ro /flash | ||||||
|  | 			REBOOTMESSAGE="echo Please reboot your OpenELEC, we inserted dtparam=spi=on to /flash/config.txt" | ||||||
|  | 	fi | ||||||
|  | fi | ||||||
|  | #Backup the .conf files, if present | ||||||
|  | echo '---> Backup Hyperion configuration(s), if present' | ||||||
|  | rm -f /tmp/*.json 2>/dev/null | ||||||
|  | if [ $OS_OPENELEC -eq 1 ]; then | ||||||
|  | 	cp -v /storage/.config/*.json /tmp 2>/dev/null | ||||||
|  | else cp -v /opt/hyperion/config/*.json /tmp 2>/dev/null | ||||||
|  | fi | ||||||
|  |   | ||||||
|  | # Select the appropriate release | ||||||
|  | HYPERION_ADDRESS=https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy | ||||||
|  | if [ $CPU_RPI -eq 1 ]; then | ||||||
|  | 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_rpi.tar.gz | ||||||
|  | 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-rpi.tar.gz | ||||||
|  | elif [ $CPU_IMX6 -eq 1 ]; then | ||||||
|  | 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_imx6.tar.gz | ||||||
|  | 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-imx6.tar.gz | ||||||
|  | elif [ $CPU_WETEK -eq 1 ]; then | ||||||
|  | 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_wetek.tar.gz | ||||||
|  | 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-rpi.tar.gz | ||||||
|  | elif [ $CPU_X64 -eq 1 ]; then | ||||||
|  | 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_x64.tar.gz | ||||||
|  | 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-rpi.tar.gz | ||||||
|  | elif [ $CPU_X32 -eq 1 ]; then | ||||||
|  | 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_x32.tar.gz | ||||||
|  | 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-rpi.tar.gz | ||||||
|  | else | ||||||
|  | 	echo "---> Critical Error: Target platform unknown -> abort" | ||||||
|  | 	exit 1 | ||||||
| fi | fi | ||||||
|  |  | ||||||
| # Get and extract the Hyperion binaries and effects | # Get and extract the Hyperion binaries and effects | ||||||
| echo 'Downloading hyperion' | echo '---> Downloading the appropriate Hyperion release' | ||||||
| if [ $IS_OPENELEC -eq 1 ]; then | if [ $OS_OPENELEC -eq 1 ]; then | ||||||
| 	# OpenELEC has a readonly file system. Use alternative location | 	# OpenELEC has a readonly file system. Use alternative location | ||||||
| if [ $IS_IMX6 -eq 1 ]; then | 	echo '---> Downloading Hyperion OpenELEC release' | ||||||
| 	curl -L --get https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion_imx6.tar.gz | tar -C /storage -xz | 	curl -# -L --get $HYPERION_RELEASE | tar -C /storage -xz | ||||||
| else | 	echo '---> Downloading Hyperion OpenELEC dependencies' | ||||||
| 	curl -L --get https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion_rpi.tar.gz | tar -C /storage -xz | 	curl -# -L --get $OE_DEPENDECIES | tar -C /storage/hyperion/bin -xz | ||||||
| fi | 	#set the executen bit (failsave) | ||||||
| 	curl -L --get https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion.deps.openelec-rpi.tar.gz | tar -C /storage/hyperion/bin -xz | 	chmod +x -R /storage/hyperion/bin | ||||||
| 	# modify the default config to have a correct effect path | 	# modify the default config to have a correct effect path | ||||||
| 	sed -i 's:/opt:/storage:g' /storage/hyperion/config/hyperion.config.json | 	sed -i 's:/opt:/storage:g' /storage/hyperion/config/hyperion.config.json | ||||||
| else |  | ||||||
| if [ $IS_IMX6 -eq 1 ]; then |  | ||||||
| 	wget https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion_imx6.tar.gz -O - | tar -C /opt -xz |  | ||||||
| else |  | ||||||
| 	wget https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion_rpi.tar.gz -O - | tar -C /opt -xz |  | ||||||
| fi |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # create links to the binaries |  | ||||||
| if [ $IS_OPENELEC -ne 1 ]; then |  | ||||||
| 	ln -fs /opt/hyperion/bin/hyperiond /usr/bin/hyperiond |  | ||||||
| 	ln -fs /opt/hyperion/bin/hyperion-remote /usr/bin/hyperion-remote |  | ||||||
| 	ln -fs /opt/hyperion/bin/hyperion-v4l2 /usr/bin/hyperion-v4l2 |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # create link to the gpio changer (gpio->spi) |  | ||||||
| if [ $IS_RASPBMC -eq 1 ] && [ $IS_IMX6 -ne 1 ]; then |  | ||||||
| 	ln -fs /opt/hyperion/bin/gpio2spi /usr/bin/gpio2spi |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # Copy a link to the hyperion configuration file to /etc |  | ||||||
| if [ $IS_OPENELEC -eq 1 ]; then |  | ||||||
| 	# copy to alternate location, because of readonly file system |  | ||||||
| 	# /storage/.config is available as samba share. A symbolic link would not be working | 	# /storage/.config is available as samba share. A symbolic link would not be working | ||||||
| 	false | cp -i /storage/hyperion/config/hyperion.config.json /storage/.config/hyperion.config.json 2>/dev/null | 	false | cp -i /storage/hyperion/config/hyperion.config.json /storage/.config/hyperion.config.json 2>/dev/null | ||||||
| else | else | ||||||
| 	ln -s /opt/hyperion/config/hyperion.config.json /etc/hyperion.config.json | 	wget -nv $HYPERION_RELEASE -O - | tar -C /opt -xz | ||||||
|  | 	#set the executen bit (failsave) | ||||||
|  | 	chmod +x -R /opt/hyperion/bin | ||||||
|  | 	# create links to the binaries | ||||||
|  | 	ln -fs /opt/hyperion/bin/hyperiond /usr/bin/hyperiond | ||||||
|  | 	ln -fs /opt/hyperion/bin/hyperion-remote /usr/bin/hyperion-remote | ||||||
|  | 	ln -fs /opt/hyperion/bin/hyperion-v4l2 /usr/bin/hyperion-v4l2 | ||||||
|  | 	ln -fs /opt/hyperion/bin/hyperion-dispmanx /usr/bin/hyperion-dispmanx 2>/dev/null | ||||||
|  | 	ln -fs /opt/hyperion/bin/hyperion-x11 /usr/bin/hyperion-x11 2>/dev/null | ||||||
|  |  | ||||||
|  | # Copy a link to the hyperion configuration file to /etc (-s for people who replaced the symlink with their config) | ||||||
|  | 	ln -s /opt/hyperion/config/hyperion.config.json /etc/hyperion.config.json 2>/dev/null | ||||||
|  | fi | ||||||
|  | 	 | ||||||
|  | # Restore backup of .conf files, if present | ||||||
|  | echo '---> Restore Hyperion configuration(s), if present' | ||||||
|  | if [ $OS_OPENELEC -eq 1 ]; then | ||||||
|  | 	mv -v /tmp/*.json /storage/.config/ 2>/dev/null | ||||||
|  | else mv -v /tmp/*.json /opt/hyperion/config/ 2>/dev/null	 | ||||||
| fi | fi | ||||||
|  |  | ||||||
| # Copy the service control configuration to /etc/int | # Copy the service control configuration to /etc/int (-n to respect user modified scripts) | ||||||
| if [ $USE_INITCTL -eq 1 ]; then | if [ $USE_INITCTL -eq 1 ]; then | ||||||
| 	echo 'Installing initctl script' | 	echo '---> Installing initctl script' | ||||||
| 	if [ $IS_RASPBMC -eq 1 ]; then | 	cp -n /opt/hyperion/init.d/hyperion.initctl.sh /etc/init/hyperion.conf 2>/dev/null | ||||||
| 		wget -N https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion.conf -P /etc/init/ | 	initctl reload-configuration | ||||||
| 	else | elif [ $OS_OPENELEC -eq 1 ]; then | ||||||
| 		wget -N https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion.xbian.conf -O /etc/init/hyperion.conf |  | ||||||
| 	fi |  | ||||||
| elif [ $USE_SERVICE -eq 1 ]; then |  | ||||||
| 	echo 'Installing startup script in init.d' |  | ||||||
| 	# place startup script in init.d and add it to upstart |  | ||||||
| 	ln -fs /opt/hyperion/init.d/hyperion.init.sh /etc/init.d/hyperion |  | ||||||
| 	chmod +x /etc/init.d/hyperion |  | ||||||
| 	update-rc.d hyperion defaults 98 02 |  | ||||||
| elif [ $IS_OPENELEC -eq 1 ]; then |  | ||||||
| 	# only add to start script if hyperion is not present yet | 	# only add to start script if hyperion is not present yet | ||||||
| 	if [ `cat /storage/.config/autostart.sh 2>/dev/null | grep hyperiond | wc -l` -eq 0 ]; then | 	if [ `cat /storage/.config/autostart.sh 2>/dev/null | grep hyperiond | wc -l` -eq 0 ]; then | ||||||
| 		echo 'Adding Hyperion to autostart script' | 		echo '---> Adding Hyperion to OpenELEC autostart.sh' | ||||||
| 		echo "/storage/hyperion/bin/hyperiond.sh /storage/.config/hyperion.config.json > /dev/null 2>&1 &" >> /storage/.config/autostart.sh | 		echo "/storage/hyperion/bin/hyperiond.sh /storage/.config/hyperion.config.json > /dev/null 2>&1 &" >> /storage/.config/autostart.sh | ||||||
| 		chmod +x /storage/.config/autostart.sh | 		chmod +x /storage/.config/autostart.sh | ||||||
| 	fi | 	fi | ||||||
|  | elif [ $USE_SYSTEMD -eq 1 ]; then | ||||||
|  | 	echo '---> Installing systemd script' | ||||||
|  | 	#place startup script for systemd and activate | ||||||
|  | 	#Problem with systemd to enable symlinks - Bug? Workaround cp -n (overwrite never) | ||||||
|  | 	#Bad workaround for Jessie users that used the official script for install | ||||||
|  | 	update-rc.d -f hyperion remove 2>/dev/null | ||||||
|  | 	rm /etc/init.d/hyperion 2>/dev/null | ||||||
|  | 	cp -n /opt/hyperion/init.d/hyperion.systemd.sh /etc/systemd/system/hyperion.service | ||||||
|  | 	systemctl -q enable hyperion.service | ||||||
|  | 		if [ $OS_OSMC -eq 1 ]; then | ||||||
|  | 			echo '---> Modify systemd script for OSMC usage' | ||||||
|  | 			# Wait until kodi is sarted (for xbmc checker) and replace user (for remote control through osmc) | ||||||
|  | 			sed -i '/After = mediacenter.service/d' /etc/systemd/system/hyperion.service | ||||||
|  | 			sed -i '/Unit/a After = mediacenter.service' /etc/systemd/system/hyperion.service | ||||||
|  | 			sed -i 's/User=root/User=osmc/g' /etc/systemd/system/hyperion.service | ||||||
|  | 			sed -i 's/Group=root/Group=osmc/g' /etc/systemd/system/hyperion.service | ||||||
|  | 			systemctl -q daemon-reload | ||||||
|  | 		fi | ||||||
|  | elif [ $USE_SERVICE -eq 1 ]; then | ||||||
|  | 	echo '---> Installing startup script in init.d' | ||||||
|  | 	# place startup script in init.d and add it to upstart (-s to respect user modified scripts) | ||||||
|  | 	ln -s /opt/hyperion/init.d/hyperion.init.sh /etc/init.d/hyperion 2>/dev/null | ||||||
|  | 	chmod +x /etc/init.d/hyperion | ||||||
|  | 	update-rc.d hyperion defaults 98 02 | ||||||
| fi | fi | ||||||
|  |  | ||||||
| # Start the hyperion daemon | # Start the hyperion daemon | ||||||
| if [ $USE_INITCTL -eq 1 ]; then | echo '---> Starting Hyperion' | ||||||
|  | if [ $OS_OPENELEC -eq 1 ]; then | ||||||
|  | 	/storage/.config/autostart.sh | ||||||
|  | elif [ $USE_INITCTL -eq 1 ]; then | ||||||
| 	/sbin/initctl start hyperion | 	/sbin/initctl start hyperion | ||||||
| elif [ $USE_SERVICE -eq 1 ]; then | elif [ $USE_SERVICE -eq 1 ]; then | ||||||
| 	/usr/sbin/service hyperion start | 	/usr/sbin/service hyperion start | ||||||
|  | elif [ $USE_SYSTEMD -eq 1 ]; then | ||||||
|  | 	service hyperion start | ||||||
| fi | fi | ||||||
|  |  | ||||||
|  | #Hint for the user with path to config | ||||||
|  | if [ $OS_OPENELEC -eq 1 ];then | ||||||
|  | 	HINTMESSAGE="echo Path to your configuration -> /storage/.config/hyperion.config.json" | ||||||
|  | else HINTMESSAGE="echo Path to your configuration -> /etc/hyperion.config.json" | ||||||
|  | fi | ||||||
|  | echo '*******************************************************************************'  | ||||||
|  | echo 'Hyperion Installation/Update finished!'  | ||||||
|  | echo 'Please get a new HyperCon version to benefit from the latest features!'  | ||||||
|  | echo 'Create a new config file, if you encounter problems!'  | ||||||
|  | $HINTMESSAGE | ||||||
|  | $REBOOTMESSAGE | ||||||
|  | echo '*******************************************************************************'  | ||||||
|  | ## Force reboot and prevent prompt if spi is added during a HyperCon Install | ||||||
|  | if [ "$1" = "HyperConInstall" ] && [ $CPU_RPI -eq 1 ] && [ $SPIOK -ne 1 ]; then | ||||||
|  | 	echo "Rebooting now, we added dtparam=spi=on to config.txt" | ||||||
|  | 	reboot | ||||||
|  | 	exit 0 | ||||||
|  | fi | ||||||
|  | #Prompt for reboot, if spi added to config.txt | ||||||
|  | if [ $CPU_RPI -eq 1 ] && [ $SPIOK -ne 1 ];then | ||||||
|  |         while true | ||||||
|  |         do | ||||||
|  |         echo -n "---> Do you want to reboot your Raspberry Pi now? (y or n) :" | ||||||
|  |         read CONFIRM | ||||||
|  |         case $CONFIRM in | ||||||
|  |         y|Y|YES|yes|Yes) break ;; | ||||||
|  |         n|N|no|NO|No) | ||||||
|  |         echo "---> No reboot - you entered \"$CONFIRM\"" | ||||||
|  |         exit | ||||||
|  |         ;; | ||||||
|  |         *) echo "-> Please enter only y or n" | ||||||
|  |         esac | ||||||
|  |         done | ||||||
|  |         echo "---> You entered \"$CONFIRM\". Rebooting now..." | ||||||
|  |         reboot | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | exit 0 | ||||||
| @@ -134,18 +134,20 @@ | |||||||
| // 	"forwarder" :  | // 	"forwarder" :  | ||||||
| // 	{ | // 	{ | ||||||
| // 		"proto" : ["127.0.0.1:19447"], | // 		"proto" : ["127.0.0.1:19447"], | ||||||
| // 		"json" : ["127.0.0.1:19446"] | // 		"json"  : ["127.0.0.1:19446"] | ||||||
| // 	}, | // 	}, | ||||||
|  |  | ||||||
| 	///  The configuration for the frame-grabber, contains the following items:  | 	///  The configuration for the frame-grabber, contains the following items:  | ||||||
| 	///   * width        : The width of the grabbed frames [pixels] | 	///   * width        : The width of the grabbed frames [pixels] | ||||||
| 	///   * height       : The height of the grabbed frames [pixels] | 	///   * height       : The height of the grabbed frames [pixels] | ||||||
| 	///   * frequency_Hz : The frequency of the frame grab [Hz] | 	///   * frequency_Hz : The frequency of the frame grab [Hz] | ||||||
|  | 	///   * priority     : The priority | ||||||
| 	"framegrabber" :  | 	"framegrabber" :  | ||||||
| 	{ | 	{ | ||||||
| 		"width" : 80, | 		"width"        : 80, | ||||||
| 		"height" : 45, | 		"height"       : 45, | ||||||
| 		"frequency_Hz" : 10.0 | 		"frequency_Hz" : 10.0, | ||||||
|  | 		"priority"     : 900 | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
| 	/// The configuration of the Kodi connection used to enable and disable the frame-grabber. Contains the following fields:  | 	/// The configuration of the Kodi connection used to enable and disable the frame-grabber. Contains the following fields:  | ||||||
| @@ -187,7 +189,8 @@ | |||||||
| 	///  * port : Port at which the boblight server is started | 	///  * port : Port at which the boblight server is started | ||||||
| // 	"boblightServer" :  | // 	"boblightServer" :  | ||||||
| // 	{ | // 	{ | ||||||
| // 		"port" : 19333 | // 		"port"     : 19333, | ||||||
|  | // 		"priority" : 900 | ||||||
| // 	}, | // 	}, | ||||||
|  |  | ||||||
| 	/// Configuration for the embedded V4L2 grabber | 	/// Configuration for the embedded V4L2 grabber | ||||||
|   | |||||||
| @@ -391,19 +391,20 @@ | |||||||
| 		"color"       : [0,0,0], | 		"color"       : [0,0,0], | ||||||
| 		"effect"      : "Rainbow swirl fast", | 		"effect"      : "Rainbow swirl fast", | ||||||
| 		"duration_ms" : 3000, | 		"duration_ms" : 3000, | ||||||
| 		"priority"    : 900 | 		"priority"    : 990 | ||||||
| 	}, | 	}, | ||||||
|  |  | ||||||
| 	///  The configuration for the frame-grabber, contains the following items:  | 	///  The configuration for the frame-grabber, contains the following items:  | ||||||
| 	///   * width        : The width of the grabbed frames [pixels] | 	///   * width        : The width of the grabbed frames [pixels] | ||||||
| 	///   * height       : The height of the grabbed frames [pixels] | 	///   * height       : The height of the grabbed frames [pixels] | ||||||
| 	///   * frequency_Hz : The frequency of the frame grab [Hz] | 	///   * frequency_Hz : The frequency of the frame grab [Hz] | ||||||
| // 	"framegrabber" :  | ///	"framegrabber" :  | ||||||
| // 	{ | ///	{ | ||||||
| // 		"width" : 64, | ///		"width"        : 64, | ||||||
| // 		"height" : 64, | ///		"height"       : 64, | ||||||
| // 		"frequency_Hz" : 10.0 | ///		"frequency_Hz" : 10.0, | ||||||
| // 	}, | ///		"priority"     : 900 | ||||||
|  | ///	}, | ||||||
|  |  | ||||||
| 	/// The configuration of the XBMC connection used to enable and disable the frame-grabber. Contains the following fields:  | 	/// The configuration of the XBMC connection used to enable and disable the frame-grabber. Contains the following fields:  | ||||||
| 	///  * xbmcAddress       : The IP address of the XBMC-host | 	///  * xbmcAddress       : The IP address of the XBMC-host | ||||||
| @@ -444,7 +445,8 @@ | |||||||
| 	///  * port : Port at which the boblight server is started | 	///  * port : Port at which the boblight server is started | ||||||
| // 	"boblightServer" :  | // 	"boblightServer" :  | ||||||
| // 	{ | // 	{ | ||||||
| // 		"port" : 19333 | // 		"port" : 19333, | ||||||
|  | //		"priority" : 900 | ||||||
| // 	}, | // 	}, | ||||||
|  |  | ||||||
| 	"endOfJson" : "endOfJson" | 	"endOfJson" : "endOfJson" | ||||||
|   | |||||||
							
								
								
									
										7
									
								
								dependencies/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								dependencies/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							| @@ -4,6 +4,13 @@ add_subdirectory(build/jsoncpp) | |||||||
| add_subdirectory(build/serial) | add_subdirectory(build/serial) | ||||||
| add_subdirectory(build/tinkerforge) | add_subdirectory(build/tinkerforge) | ||||||
|  |  | ||||||
|  | if(ENABLE_WS281XPWM) | ||||||
|  | 	add_library(ws281x | ||||||
|  | 		external/rpi_ws281x/mailbox.c external/rpi_ws281x/ws2811.c | ||||||
|  | 		external/rpi_ws281x/pwm.c external/rpi_ws281x/dma.c | ||||||
|  | 		external/rpi_ws281x/rpihw.c) | ||||||
|  | endif(ENABLE_WS281XPWM) | ||||||
|  |  | ||||||
| if(ENABLE_PROTOBUF) | if(ENABLE_PROTOBUF) | ||||||
| 	set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared protobuf library") | 	set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared protobuf library") | ||||||
| 	add_subdirectory(external/protobuf) | 	add_subdirectory(external/protobuf) | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								dependencies/external/rpi_ws281x
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								dependencies/external/rpi_ws281x
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule dependencies/external/rpi_ws281x added at 34c917e250
									
								
							| @@ -1 +0,0 @@ | |||||||
| 0074a4390b1d8d0c87488a3e7a13ec372786d140 |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| ## Hyperion daemon |  | ||||||
|  |  | ||||||
| description "hyperion" |  | ||||||
| author "poljvd & tvdzwan" |  | ||||||
|  |  | ||||||
| start on (runlevel [2345]) |  | ||||||
| stop on (runlevel [!2345]) |  | ||||||
|  |  | ||||||
| respawn |  | ||||||
|  |  | ||||||
| pre-start script |  | ||||||
| modprobe spidev  |  | ||||||
| /usr/bin/gpio2spi |  | ||||||
| end script |  | ||||||
|  |  | ||||||
| exec /usr/bin/hyperiond /etc/hyperion.config.json |  | ||||||
|  |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| 92c1bcf0dedef68c5da16cb9921ba1a56679d5cb |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| ## Hyperion daemon |  | ||||||
|  |  | ||||||
| description "hyperion" |  | ||||||
| author "poljvd & tvdzwan" |  | ||||||
|  |  | ||||||
| start on (runlevel [2345]) |  | ||||||
| stop on (runlevel [!2345]) |  | ||||||
|  |  | ||||||
| respawn |  | ||||||
|  |  | ||||||
| pre-start script |  | ||||||
| modprobe spi-bcm2708 |  | ||||||
| end script |  | ||||||
|  |  | ||||||
| exec /usr/bin/hyperiond /etc/hyperion.config.json |  | ||||||
|  |  | ||||||
| @@ -1 +1 @@ | |||||||
| 44d552b5adb3dc5af38edd5e6fb208a0dc75d63d | 53710fe42ce52c16b82464e0e01ca6ee6df6912c | ||||||
| @@ -1 +1 @@ | |||||||
| 5b0f057a8591d76be009018b302977faeec5159a | 6465f4220aa1a8b4bdfed82492bf3ed079f586c4 | ||||||
| @@ -1 +1 @@ | |||||||
| 7f0d60e7e0c7075cae5cef69ec5408f3087c00df | 752ebb4ffc19892d1c99af0993913eb922195e38 | ||||||
| @@ -1 +1 @@ | |||||||
| 511ab205cce688c5d7151087d8659905402e5015 | f7b19344829d6df11bd624bbf722a5d8ec6b1dbe | ||||||
| @@ -1 +1 @@ | |||||||
| e26ac1a0bf52bcd54ab00c37ff25d01a457eec9d | 294f14bdc79d9d8306432681bf3c8468a4097a48 | ||||||
| @@ -1,114 +0,0 @@ | |||||||
| #!/bin/sh |  | ||||||
|  |  | ||||||
| # Script for downloading and installing the latest Hyperion release |  | ||||||
|  |  | ||||||
| # Make sure /sbin is on the path (for service to find sub scripts) |  | ||||||
| PATH="/sbin:$PATH" |  | ||||||
|  |  | ||||||
| # Find out if we are on OpenElec |  | ||||||
| OS_OPENELEC=`cat /etc/issue | grep -m 1 OpenELEC | wc -l` |  | ||||||
|  |  | ||||||
| # Find out if its an imx6 device |  | ||||||
| CPU_RPI=`cat /proc/cpuinfo | grep RPI | wc -l` |  | ||||||
| CPU_IMX6=`cat /proc/cpuinfo | grep i.MX6 | wc -l` |  | ||||||
| CPU_WETEK=`cat /proc/cpuinfo | grep Amlogic | wc -l` |  | ||||||
| CPU_X64=`uname -m | grep x86_64 | wc -l` |  | ||||||
| CPU_X32=`uname -m | grep x86_32 | wc -l` |  | ||||||
| # Check that we have a known configuration |  | ||||||
| if [[ $CPU_RPI -ne 1 && $CPU_IMX6 -ne 1 && $CPU_WETEK -ne 1 && $CPU_X64 -ne 1 && $CPU_X32 -ne 1 ]]; then |  | ||||||
| 	echo 'CPU information does not match any known releases' |  | ||||||
| 	exit |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # check which init script we should use |  | ||||||
| USE_INITCTL=`which /sbin/initctl | wc -l` |  | ||||||
| USE_SERVICE=`which /usr/sbin/service | wc -l` |  | ||||||
|  |  | ||||||
| # Make sure that the boblight daemon is no longer running |  | ||||||
| BOBLIGHT_PROCNR=$(pidof boblightd | wc -l) |  | ||||||
| if [ $BOBLIGHT_PROCNR -eq 1 ]; then |  | ||||||
| 	echo 'Found running instance of boblight. Please stop boblight via XBMC menu before installing hyperion' |  | ||||||
| 	exit |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # Stop hyperion daemon if it is running |  | ||||||
| # Start the hyperion daemon |  | ||||||
| if [ $USE_INITCTL -eq 1 ]; then |  | ||||||
| 	/sbin/initctl stop hyperion |  | ||||||
| elif [ $USE_SERVICE -eq 1 ]; then |  | ||||||
| 	/usr/sbin/service hyperion stop |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # Select the appropriate release |  | ||||||
| HYPERION_ADDRESS=https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy |  | ||||||
| if [ $CPU_RPI -eq 1 ]; then |  | ||||||
| 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_rpi.tar.gz |  | ||||||
| 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-rpi.tar.gz |  | ||||||
| elif [ $CPU_IMX6 -eq 1 ]; then |  | ||||||
| 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_imx6.tar.gz |  | ||||||
| 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-imx6.tar.gz |  | ||||||
| elif [ $CPU_WETEK -eq 1 ]; then |  | ||||||
| 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_wetek.tar.gz |  | ||||||
| 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-rpi.tar.gz |  | ||||||
| elif [ $CPU_X64 -eq 1 ]; then |  | ||||||
| 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_x64.tar.gz |  | ||||||
| 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-x64.tar.gz |  | ||||||
| elif [ $CPU_X32 -eq 1 ]; then |  | ||||||
| 	HYPERION_RELEASE=$HYPERION_ADDRESS/hyperion_x32.tar.gz |  | ||||||
| 	OE_DEPENDECIES=$HYPERION_ADDRESS/hyperion.deps.openelec-x32.tar.gz |  | ||||||
| else |  | ||||||
| 	echo "Target platform unknown" |  | ||||||
| 	exit |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # Get and extract the Hyperion binaries and effects |  | ||||||
| echo 'Downloading hyperion' |  | ||||||
| if [ $OS_OPENELEC -eq 1 ]; then |  | ||||||
| 	# OpenELEC has a readonly file system. Use alternative location |  | ||||||
| 	curl -L --get $HYPERION_RELEASE | tar -C /storage -xz |  | ||||||
| 	curl -L --get $OE_DEPENDECIES | tar -C /storage/hyperion/bin -xz |  | ||||||
|  |  | ||||||
| 	# modify the default config to have a correct effect path |  | ||||||
| 	sed -i 's:/opt:/storage:g' /storage/hyperion/config/hyperion.config.json |  | ||||||
|  |  | ||||||
| 	# /storage/.config is available as samba share. A symbolic link would not be working |  | ||||||
| 	false | cp -i /storage/hyperion/config/hyperion.config.json /storage/.config/hyperion.config.json 2>/dev/null |  | ||||||
| else |  | ||||||
| 	wget $HYPERION_RELEASE -O - | tar -C /opt -xz |  | ||||||
|  |  | ||||||
| 	# create links to the binaries |  | ||||||
| 	ln -fs /opt/hyperion/bin/hyperiond /usr/bin/hyperiond |  | ||||||
| 	ln -fs /opt/hyperion/bin/hyperion-remote /usr/bin/hyperion-remote |  | ||||||
| 	ln -fs /opt/hyperion/bin/hyperion-v4l2 /usr/bin/hyperion-v4l2 |  | ||||||
|  |  | ||||||
| # Copy a link to the hyperion configuration file to /etc |  | ||||||
| 	ln -s /opt/hyperion/config/hyperion.config.json /etc/hyperion.config.json |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # Copy the service control configuration to /etc/int |  | ||||||
| if [ $USE_INITCTL -eq 1 ]; then |  | ||||||
| 	echo 'Installing initctl script' |  | ||||||
| 	wget -N https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion.conf -P /etc/init/ |  | ||||||
| 	initctl reload-configuration |  | ||||||
| elif [ $USE_SERVICE -eq 1 ]; then |  | ||||||
| 	echo 'Installing startup script in init.d' |  | ||||||
| 	# place startup script in init.d and add it to upstart |  | ||||||
| 	ln -fs /opt/hyperion/init.d/hyperion.init.sh /etc/init.d/hyperion |  | ||||||
| 	chmod +x /etc/init.d/hyperion |  | ||||||
| 	update-rc.d hyperion defaults 98 02 |  | ||||||
| elif [ $OS_OPENELEC -eq 1 ]; then |  | ||||||
| 	# only add to start script if hyperion is not present yet |  | ||||||
| 	if [ `cat /storage/.config/autostart.sh 2>/dev/null | grep hyperiond | wc -l` -eq 0 ]; then |  | ||||||
| 		echo 'Adding Hyperion to autostart script' |  | ||||||
| 		echo "/storage/hyperion/bin/hyperiond.sh /storage/.config/hyperion.config.json > /dev/null 2>&1 &" >> /storage/.config/autostart.sh |  | ||||||
| 		chmod +x /storage/.config/autostart.sh |  | ||||||
| 	fi |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| # Start the hyperion daemon |  | ||||||
| if [ $USE_INITCTL -eq 1 ]; then |  | ||||||
| 	/sbin/initctl start hyperion |  | ||||||
| elif [ $USE_SERVICE -eq 1 ]; then |  | ||||||
| 	/usr/sbin/service hyperion start |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| @@ -25,7 +25,7 @@ public: | |||||||
| 	/// @param hyperion Hyperion instance | 	/// @param hyperion Hyperion instance | ||||||
| 	/// @param port port number on which to start listening for connections | 	/// @param port port number on which to start listening for connections | ||||||
| 	/// | 	/// | ||||||
| 	BoblightServer(Hyperion * hyperion, uint16_t port = 19333); | 	BoblightServer(Hyperion * hyperion, const int priority, uint16_t port = 19333); | ||||||
| 	~BoblightServer(); | 	~BoblightServer(); | ||||||
|  |  | ||||||
| 	/// | 	/// | ||||||
| @@ -54,4 +54,7 @@ private: | |||||||
|  |  | ||||||
| 	/// List with open connections | 	/// List with open connections | ||||||
| 	QSet<BoblightClientConnection *> _openConnections; | 	QSet<BoblightClientConnection *> _openConnections; | ||||||
|  |  | ||||||
|  | 	/// hyperion priority | ||||||
|  | 	const int _priority; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ public: | |||||||
| 	/// @param[in] updateRate_Hz  The image grab rate [Hz] | 	/// @param[in] updateRate_Hz  The image grab rate [Hz] | ||||||
| 	/// @param[in] hyperion  The instance of Hyperion used to write the led values | 	/// @param[in] hyperion  The instance of Hyperion used to write the led values | ||||||
| 	/// | 	/// | ||||||
| 	AmlogicWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, Hyperion * hyperion); | 	AmlogicWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion); | ||||||
|  |  | ||||||
| 	/// | 	/// | ||||||
| 	/// Destructor of this dispmanx frame grabber. Releases any claimed resources. | 	/// Destructor of this dispmanx frame grabber. Releases any claimed resources. | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ public: | |||||||
| 	/// @param[in] updateRate_Hz  The image grab rate [Hz] | 	/// @param[in] updateRate_Hz  The image grab rate [Hz] | ||||||
| 	/// @param[in] hyperion  The instance of Hyperion used to write the led values | 	/// @param[in] hyperion  The instance of Hyperion used to write the led values | ||||||
| 	/// | 	/// | ||||||
| 	DispmanxWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, Hyperion * hyperion); | 	DispmanxWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion); | ||||||
|  |  | ||||||
| 	/// | 	/// | ||||||
| 	/// Destructor of this dispmanx frame grabber. Releases any claimed resources. | 	/// Destructor of this dispmanx frame grabber. Releases any claimed resources. | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ public: | |||||||
| 	/// @param[in] updateRate_Hz  The image grab rate [Hz] | 	/// @param[in] updateRate_Hz  The image grab rate [Hz] | ||||||
| 	/// @param[in] hyperion  The instance of Hyperion used to write the led values | 	/// @param[in] hyperion  The instance of Hyperion used to write the led values | ||||||
| 	/// | 	/// | ||||||
| 	FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, Hyperion * hyperion); | 	FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion); | ||||||
|  |  | ||||||
| 	/// | 	/// | ||||||
| 	/// Destructor of this framebuffer frame grabber. Releases any claimed resources. | 	/// Destructor of this framebuffer frame grabber. Releases any claimed resources. | ||||||
|   | |||||||
| @@ -34,7 +34,7 @@ public: | |||||||
| 	/// @param[in] updateRate_Hz  The image grab rate [Hz] | 	/// @param[in] updateRate_Hz  The image grab rate [Hz] | ||||||
| 	/// @param[in] hyperion  The instance of Hyperion used to write the led values | 	/// @param[in] hyperion  The instance of Hyperion used to write the led values | ||||||
| 	/// | 	/// | ||||||
| 	OsxWrapper(const unsigned display, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, Hyperion * hyperion); | 	OsxWrapper(const unsigned display, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion); | ||||||
|  |  | ||||||
| 	/// | 	/// | ||||||
| 	/// Destructor of this osx frame grabber. Releases any claimed resources. | 	/// Destructor of this osx frame grabber. Releases any claimed resources. | ||||||
|   | |||||||
| @@ -21,14 +21,14 @@ | |||||||
| // project includes | // project includes | ||||||
| #include "BoblightClientConnection.h" | #include "BoblightClientConnection.h" | ||||||
|  |  | ||||||
| BoblightClientConnection::BoblightClientConnection(QTcpSocket *socket, Hyperion * hyperion) : | BoblightClientConnection::BoblightClientConnection(QTcpSocket *socket, const int priority, Hyperion * hyperion) : | ||||||
| 	QObject(), | 	QObject(), | ||||||
| 	_locale(QLocale::C), | 	_locale(QLocale::C), | ||||||
| 	_socket(socket), | 	_socket(socket), | ||||||
| 	_imageProcessor(ImageProcessorFactory::getInstance().newImageProcessor()), | 	_imageProcessor(ImageProcessorFactory::getInstance().newImageProcessor()), | ||||||
| 	_hyperion(hyperion), | 	_hyperion(hyperion), | ||||||
| 	_receiveBuffer(), | 	_receiveBuffer(), | ||||||
| 	_priority(255), | 	_priority(priority), | ||||||
| 	_ledColors(hyperion->getLedCount(), ColorRgb::BLACK) | 	_ledColors(hyperion->getLedCount(), ColorRgb::BLACK) | ||||||
| { | { | ||||||
| 	// initalize the locale. Start with the default C-locale | 	// initalize the locale. Start with the default C-locale | ||||||
|   | |||||||
| @@ -26,7 +26,7 @@ public: | |||||||
| 	/// @param socket The Socket object for this connection | 	/// @param socket The Socket object for this connection | ||||||
| 	/// @param hyperion The Hyperion server | 	/// @param hyperion The Hyperion server | ||||||
| 	/// | 	/// | ||||||
| 	BoblightClientConnection(QTcpSocket * socket, Hyperion * hyperion); | 	BoblightClientConnection(QTcpSocket * socket, const int priority, Hyperion * hyperion); | ||||||
|  |  | ||||||
| 	/// | 	/// | ||||||
| 	/// Destructor | 	/// Destructor | ||||||
|   | |||||||
| @@ -5,11 +5,12 @@ | |||||||
| #include <boblightserver/BoblightServer.h> | #include <boblightserver/BoblightServer.h> | ||||||
| #include "BoblightClientConnection.h" | #include "BoblightClientConnection.h" | ||||||
|  |  | ||||||
| BoblightServer::BoblightServer(Hyperion *hyperion, uint16_t port) : | BoblightServer::BoblightServer(Hyperion *hyperion, const int priority,uint16_t port) : | ||||||
| 	QObject(), | 	QObject(), | ||||||
| 	_hyperion(hyperion), | 	_hyperion(hyperion), | ||||||
| 	_server(), | 	_server(), | ||||||
| 	_openConnections() | 	_openConnections(), | ||||||
|  | 	_priority(priority) | ||||||
| { | { | ||||||
| 	if (!_server.listen(QHostAddress::Any, port)) | 	if (!_server.listen(QHostAddress::Any, port)) | ||||||
| 	{ | 	{ | ||||||
| @@ -39,7 +40,7 @@ void BoblightServer::newConnection() | |||||||
| 	if (socket != nullptr) | 	if (socket != nullptr) | ||||||
| 	{ | 	{ | ||||||
| 		std::cout << "New boblight connection" << std::endl; | 		std::cout << "New boblight connection" << std::endl; | ||||||
| 		BoblightClientConnection * connection = new BoblightClientConnection(socket, _hyperion); | 		BoblightClientConnection * connection = new BoblightClientConnection(socket, _priority, _hyperion); | ||||||
| 		_openConnections.insert(connection); | 		_openConnections.insert(connection); | ||||||
|  |  | ||||||
| 		// register slot for cleaning up after the connection closed | 		// register slot for cleaning up after the connection closed | ||||||
|   | |||||||
| @@ -12,10 +12,10 @@ | |||||||
| #include <grabber/AmlogicGrabber.h> | #include <grabber/AmlogicGrabber.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| AmlogicWrapper::AmlogicWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, Hyperion * hyperion) : | AmlogicWrapper::AmlogicWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion) : | ||||||
| 	_updateInterval_ms(1000/updateRate_Hz), | 	_updateInterval_ms(1000/updateRate_Hz), | ||||||
| 	_timeout_ms(2 * _updateInterval_ms), | 	_timeout_ms(2 * _updateInterval_ms), | ||||||
| 	_priority(999), | 	_priority(priority), | ||||||
| 	_timer(), | 	_timer(), | ||||||
| 	_image(grabWidth, grabHeight), | 	_image(grabWidth, grabHeight), | ||||||
| 	_frameGrabber(new AmlogicGrabber(grabWidth, grabHeight)), | 	_frameGrabber(new AmlogicGrabber(grabWidth, grabHeight)), | ||||||
|   | |||||||
| @@ -12,10 +12,10 @@ | |||||||
| #include <grabber/DispmanxFrameGrabber.h> | #include <grabber/DispmanxFrameGrabber.h> | ||||||
|  |  | ||||||
|  |  | ||||||
| DispmanxWrapper::DispmanxWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, Hyperion * hyperion) : | DispmanxWrapper::DispmanxWrapper(const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion) : | ||||||
| 	_updateInterval_ms(1000/updateRate_Hz), | 	_updateInterval_ms(1000/updateRate_Hz), | ||||||
| 	_timeout_ms(2 * _updateInterval_ms), | 	_timeout_ms(2 * _updateInterval_ms), | ||||||
| 	_priority(1000), | 	_priority(priority), | ||||||
| 	_timer(), | 	_timer(), | ||||||
| 	_image(grabWidth, grabHeight), | 	_image(grabWidth, grabHeight), | ||||||
| 	_frameGrabber(new DispmanxFrameGrabber(grabWidth, grabHeight)), | 	_frameGrabber(new DispmanxFrameGrabber(grabWidth, grabHeight)), | ||||||
|   | |||||||
| @@ -1,39 +1,39 @@ | |||||||
|  |  | ||||||
| # Find the BCM-package (VC control) | # Find the BCM-package (VC control) | ||||||
| # find_package(BCM REQUIRED) | # find_package(BCM REQUIRED) | ||||||
| # include_directories(${BCM_INCLUDE_DIRS}) | # include_directories(${BCM_INCLUDE_DIRS}) | ||||||
|  |  | ||||||
| # Define the current source locations | # Define the current source locations | ||||||
| SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber) | SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber) | ||||||
| SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/framebuffer) | SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/framebuffer) | ||||||
|  |  | ||||||
| # Group the headers that go through the MOC compiler | # Group the headers that go through the MOC compiler | ||||||
| SET(FramebufferGrabberQT_HEADERS | SET(FramebufferGrabberQT_HEADERS | ||||||
| 		${CURRENT_HEADER_DIR}/FramebufferWrapper.h | 		${CURRENT_HEADER_DIR}/FramebufferWrapper.h | ||||||
| ) | ) | ||||||
|  |  | ||||||
| SET(FramebufferGrabberHEADERS | SET(FramebufferGrabberHEADERS | ||||||
| 		${CURRENT_SOURCE_DIR}/FramebufferFrameGrabber.h | 		${CURRENT_HEADER_DIR}/FramebufferFrameGrabber.h | ||||||
| ) | ) | ||||||
|  |  | ||||||
| SET(FramebufferGrabberSOURCES | SET(FramebufferGrabberSOURCES | ||||||
| 		${CURRENT_SOURCE_DIR}/FramebufferWrapper.cpp | 		${CURRENT_SOURCE_DIR}/FramebufferWrapper.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/FramebufferFrameGrabber.cpp | 		${CURRENT_SOURCE_DIR}/FramebufferFrameGrabber.cpp | ||||||
| ) | ) | ||||||
|  |  | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| QT5_WRAP_CPP(FramebufferGrabberHEADERS_MOC ${FramebufferGrabberQT_HEADERS}) | 	QT5_WRAP_CPP(FramebufferGrabberHEADERS_MOC ${FramebufferGrabberQT_HEADERS}) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| QT4_WRAP_CPP(FramebufferGrabberHEADERS_MOC ${FramebufferGrabberQT_HEADERS}) | 	QT4_WRAP_CPP(FramebufferGrabberHEADERS_MOC ${FramebufferGrabberQT_HEADERS}) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| add_library(framebuffer-grabber | add_library(framebuffer-grabber | ||||||
| 		${FramebufferGrabberHEADERS} | 		${FramebufferGrabberHEADERS} | ||||||
| 		${FramebufferGrabberQT_HEADERS} | 		${FramebufferGrabberQT_HEADERS} | ||||||
| 		${FramebufferGrabberHEADERS_MOC} | 		${FramebufferGrabberHEADERS_MOC} | ||||||
| 		${FramebufferGrabberSOURCES} | 		${FramebufferGrabberSOURCES} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| target_link_libraries(framebuffer-grabber | target_link_libraries(framebuffer-grabber | ||||||
| 		hyperion | 		hyperion | ||||||
| 		${QT_LIBRARIES}) | 		${QT_LIBRARIES}) | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
| #include <iostream> | #include <iostream> | ||||||
|  |  | ||||||
| // Local includes | // Local includes | ||||||
| #include "FramebufferFrameGrabber.h" | #include <grabber/FramebufferFrameGrabber.h> | ||||||
|  |  | ||||||
| FramebufferFrameGrabber::FramebufferFrameGrabber(const std::string & device, const unsigned width, const unsigned height) : | FramebufferFrameGrabber::FramebufferFrameGrabber(const std::string & device, const unsigned width, const unsigned height) : | ||||||
| 	_fbfd(0), | 	_fbfd(0), | ||||||
|   | |||||||
| @@ -5,12 +5,12 @@ | |||||||
|  |  | ||||||
| // Framebuffer grabber includes | // Framebuffer grabber includes | ||||||
| #include <grabber/FramebufferWrapper.h> | #include <grabber/FramebufferWrapper.h> | ||||||
| #include "FramebufferFrameGrabber.h" | #include <grabber/FramebufferFrameGrabber.h> | ||||||
|  |  | ||||||
| FramebufferWrapper::FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, Hyperion * hyperion) : | FramebufferWrapper::FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion) : | ||||||
| 	_updateInterval_ms(1000/updateRate_Hz), | 	_updateInterval_ms(1000/updateRate_Hz), | ||||||
| 	_timeout_ms(2 * _updateInterval_ms), | 	_timeout_ms(2 * _updateInterval_ms), | ||||||
| 	_priority(1000), | 	_priority(priority), | ||||||
| 	_timer(), | 	_timer(), | ||||||
| 	_image(grabWidth, grabHeight), | 	_image(grabWidth, grabHeight), | ||||||
| 	_frameGrabber(new FramebufferFrameGrabber(device, grabWidth, grabHeight)), | 	_frameGrabber(new FramebufferFrameGrabber(device, grabWidth, grabHeight)), | ||||||
|   | |||||||
| @@ -1,34 +1,34 @@ | |||||||
| # Define the current source locations | # Define the current source locations | ||||||
| SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber) | SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/grabber) | ||||||
| SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/osx) | SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/grabber/osx) | ||||||
|  |  | ||||||
| # Group the headers that go through the MOC compiler | # Group the headers that go through the MOC compiler | ||||||
| SET(OsxGrabberQT_HEADERS | SET(OsxGrabberQT_HEADERS | ||||||
| 		${CURRENT_HEADER_DIR}/OsxWrapper.h | 		${CURRENT_HEADER_DIR}/OsxWrapper.h | ||||||
| ) | ) | ||||||
|  |  | ||||||
| SET(OsxGrabberHEADERS | SET(OsxGrabberHEADERS | ||||||
| 		${CURRENT_SOURCE_DIR}/OsxFrameGrabber.h | 		${CURRENT_HEADER_DIR}/OsxFrameGrabber.h | ||||||
| ) | ) | ||||||
|  |  | ||||||
| SET(OsxGrabberSOURCES | SET(OsxGrabberSOURCES | ||||||
| 		${CURRENT_SOURCE_DIR}/OsxWrapper.cpp | 		${CURRENT_SOURCE_DIR}/OsxWrapper.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/OsxFrameGrabber.cpp | 		${CURRENT_SOURCE_DIR}/OsxFrameGrabber.cpp | ||||||
| ) | ) | ||||||
|  |  | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| QT5_WRAP_CPP(OsxGrabberHEADERS_MOC ${OsxGrabberQT_HEADERS}) | 	QT5_WRAP_CPP(OsxGrabberHEADERS_MOC ${OsxGrabberQT_HEADERS}) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| QT4_WRAP_CPP(OsxGrabberHEADERS_MOC ${OsxGrabberQT_HEADERS}) | 	QT4_WRAP_CPP(OsxGrabberHEADERS_MOC ${OsxGrabberQT_HEADERS}) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| add_library(osx-grabber | add_library(osx-grabber | ||||||
| 		${OsxGrabberHEADERS} | 		${OsxGrabberHEADERS} | ||||||
| 		${OsxGrabberQT_HEADERS} | 		${OsxGrabberQT_HEADERS} | ||||||
| 		${OsxGrabberHEADERS_MOC} | 		${OsxGrabberHEADERS_MOC} | ||||||
| 		${OsxGrabberSOURCES} | 		${OsxGrabberSOURCES} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| target_link_libraries(osx-grabber | target_link_libraries(osx-grabber | ||||||
| 		hyperion | 		hyperion | ||||||
| 		${QT_LIBRARIES}) | 		${QT_LIBRARIES}) | ||||||
|   | |||||||
| @@ -3,7 +3,7 @@ | |||||||
| #include <iostream> | #include <iostream> | ||||||
|  |  | ||||||
| // Local includes | // Local includes | ||||||
| #include "OsxFrameGrabber.h" | #include <grabber/OsxFrameGrabber.h> | ||||||
|  |  | ||||||
| OsxFrameGrabber::OsxFrameGrabber(const unsigned display, const unsigned width, const unsigned height) : | OsxFrameGrabber::OsxFrameGrabber(const unsigned display, const unsigned width, const unsigned height) : | ||||||
| 	_screenIndex(display), | 	_screenIndex(display), | ||||||
|   | |||||||
| @@ -5,12 +5,12 @@ | |||||||
|  |  | ||||||
| // Osx grabber includes | // Osx grabber includes | ||||||
| #include <grabber/OsxWrapper.h> | #include <grabber/OsxWrapper.h> | ||||||
| #include "OsxFrameGrabber.h" | #include <grabber/OsxFrameGrabber.h> | ||||||
|  |  | ||||||
| OsxWrapper::OsxWrapper(const unsigned display, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, Hyperion * hyperion) : | OsxWrapper::OsxWrapper(const unsigned display, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz, const int priority, Hyperion * hyperion) : | ||||||
| 	_updateInterval_ms(1000/updateRate_Hz), | 	_updateInterval_ms(1000/updateRate_Hz), | ||||||
| 	_timeout_ms(2 * _updateInterval_ms), | 	_timeout_ms(2 * _updateInterval_ms), | ||||||
| 	_priority(1000), | 	_priority(priority), | ||||||
| 	_timer(), | 	_timer(), | ||||||
| 	_image(grabWidth, grabHeight), | 	_image(grabWidth, grabHeight), | ||||||
| 	_frameGrabber(new OsxFrameGrabber(display, grabWidth, grabHeight)), | 	_frameGrabber(new OsxFrameGrabber(display, grabWidth, grabHeight)), | ||||||
|   | |||||||
| @@ -33,9 +33,9 @@ SET(Leddevice_HEADERS | |||||||
| 		${CURRENT_SOURCE_DIR}/LedDevicePaintpack.h | 		${CURRENT_SOURCE_DIR}/LedDevicePaintpack.h | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDevicePiBlaster.h | 		${CURRENT_SOURCE_DIR}/LedDevicePiBlaster.h | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceSedu.h | 		${CURRENT_SOURCE_DIR}/LedDeviceSedu.h | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceTest.h | 		${CURRENT_SOURCE_DIR}/LedDeviceTest.h | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceFadeCandy.h | 		${CURRENT_SOURCE_DIR}/LedDeviceFadeCandy.h | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceUdp.h | 		${CURRENT_SOURCE_DIR}/LedDeviceUdp.h | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.h | 		${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.h | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceTpm2.h | 		${CURRENT_SOURCE_DIR}/LedDeviceTpm2.h | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceAtmo.h | 		${CURRENT_SOURCE_DIR}/LedDeviceAtmo.h | ||||||
| @@ -56,9 +56,9 @@ SET(Leddevice_SOURCES | |||||||
| 		${CURRENT_SOURCE_DIR}/LedDevicePaintpack.cpp | 		${CURRENT_SOURCE_DIR}/LedDevicePaintpack.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDevicePiBlaster.cpp | 		${CURRENT_SOURCE_DIR}/LedDevicePiBlaster.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceSedu.cpp | 		${CURRENT_SOURCE_DIR}/LedDeviceSedu.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceTest.cpp | 		${CURRENT_SOURCE_DIR}/LedDeviceTest.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceFadeCandy.cpp | 		${CURRENT_SOURCE_DIR}/LedDeviceFadeCandy.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceUdp.cpp | 		${CURRENT_SOURCE_DIR}/LedDeviceUdp.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.cpp | 		${CURRENT_SOURCE_DIR}/LedDeviceHyperionUsbasp.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDevicePhilipsHue.cpp | 		${CURRENT_SOURCE_DIR}/LedDevicePhilipsHue.cpp | ||||||
| 		${CURRENT_SOURCE_DIR}/LedDeviceTpm2.cpp | 		${CURRENT_SOURCE_DIR}/LedDeviceTpm2.cpp | ||||||
| @@ -97,6 +97,18 @@ SET(Leddevice_SOURCES | |||||||
| ) | ) | ||||||
| endif(ENABLE_WS2812BPWM) | endif(ENABLE_WS2812BPWM) | ||||||
|  |  | ||||||
|  | if(ENABLE_WS281XPWM) | ||||||
|  | include_directories(../../dependencies/external/rpi_ws281x) | ||||||
|  | SET(Leddevice_HEADERS | ||||||
|  | 		${Leddevice_HEADERS} | ||||||
|  | 		${CURRENT_SOURCE_DIR}/LedDeviceWS281x.h | ||||||
|  | 	) | ||||||
|  | SET(Leddevice_SOURCES | ||||||
|  | 		${Leddevice_SOURCES} | ||||||
|  | 		${CURRENT_SOURCE_DIR}/LedDeviceWS281x.cpp | ||||||
|  | ) | ||||||
|  | endif(ENABLE_WS281XPWM) | ||||||
|  |  | ||||||
| if(ENABLE_TINKERFORGE) | if(ENABLE_TINKERFORGE) | ||||||
| 	SET(Leddevice_HEADERS | 	SET(Leddevice_HEADERS | ||||||
| 			${Leddevice_HEADERS} | 			${Leddevice_HEADERS} | ||||||
| @@ -138,6 +150,10 @@ if(ENABLE_TINKERFORGE) | |||||||
| 	target_link_libraries(leddevice tinkerforge) | 	target_link_libraries(leddevice tinkerforge) | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
|  | if(ENABLE_WS281XPWM) | ||||||
|  | 	target_link_libraries(leddevice ws281x) | ||||||
|  | endif() | ||||||
|  |  | ||||||
| if(APPLE) | if(APPLE) | ||||||
| 	target_link_libraries(leddevice hidapi-mac) | 	target_link_libraries(leddevice hidapi-mac) | ||||||
| else() | else() | ||||||
|   | |||||||
| @@ -42,6 +42,10 @@ | |||||||
| 	#include "LedDeviceWS2812b.h" | 	#include "LedDeviceWS2812b.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifdef ENABLE_WS281XPWM | ||||||
|  | 	#include "LedDeviceWS281x.h" | ||||||
|  | #endif | ||||||
|  |  | ||||||
| LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig) | LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig) | ||||||
| { | { | ||||||
| 	std::cout << "Device configuration: " << deviceConfig << std::endl; | 	std::cout << "Device configuration: " << deviceConfig << std::endl; | ||||||
| @@ -175,7 +179,7 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig) | |||||||
|  |  | ||||||
| 		device = deviceLightpack; | 		device = deviceLightpack; | ||||||
| 	} | 	} | ||||||
| 	else if (type == "multi-lightpack") | 	else if (type == "multi-lightpack" || type == "multi_lightpack") | ||||||
| 	{ | 	{ | ||||||
| 		LedDeviceMultiLightpack* deviceLightpack = new LedDeviceMultiLightpack(); | 		LedDeviceMultiLightpack* deviceLightpack = new LedDeviceMultiLightpack(); | ||||||
| 		deviceLightpack->open(); | 		deviceLightpack->open(); | ||||||
| @@ -285,10 +289,22 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig) | |||||||
| 		LedDeviceWS2812b * ledDeviceWS2812b = new LedDeviceWS2812b(); | 		LedDeviceWS2812b * ledDeviceWS2812b = new LedDeviceWS2812b(); | ||||||
| 		device = ledDeviceWS2812b; | 		device = ledDeviceWS2812b; | ||||||
| 	} | 	} | ||||||
|  | #endif | ||||||
|  | #ifdef ENABLE_WS281XPWM | ||||||
|  | 	else if (type == "ws281x") | ||||||
|  | 	{ | ||||||
|  | 		const int gpio = deviceConfig.get("gpio", 18).asInt(); | ||||||
|  | 		const int leds = deviceConfig.get("leds", 12).asInt(); | ||||||
|  | 		const uint32_t freq = deviceConfig.get("freq", (Json::UInt)800000ul).asInt(); | ||||||
|  | 		const int dmanum = deviceConfig.get("dmanum", 5).asInt(); | ||||||
|  |  | ||||||
|  | 		LedDeviceWS281x * ledDeviceWS281x = new LedDeviceWS281x(gpio, leds, freq, dmanum); | ||||||
|  | 		device = ledDeviceWS281x; | ||||||
|  | 	} | ||||||
| #endif | #endif | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		std::cout << "Unable to create device " << type << std::endl; | 		std::cout << "Error: Unknown/Unimplemented device " << type << std::endl; | ||||||
| 		// Unknown / Unimplemented device | 		// Unknown / Unimplemented device | ||||||
| 	} | 	} | ||||||
| 	return device; | 	return device; | ||||||
|   | |||||||
| @@ -5,10 +5,11 @@ | |||||||
| #include <json/json.h> | #include <json/json.h> | ||||||
|  |  | ||||||
| // qt includes | // qt includes | ||||||
| #include <QtCore/qmath.h> | #include <QtCore/qmath.h> | ||||||
| #include <QEventLoop> | #include <QEventLoop> | ||||||
| #include <QNetworkReply> | #include <QNetworkReply> | ||||||
|  |  | ||||||
|  | #include <stdexcept> | ||||||
| #include <set> | #include <set> | ||||||
|  |  | ||||||
| bool operator ==(CiColor p1, CiColor p2) { | bool operator ==(CiColor p1, CiColor p2) { | ||||||
| @@ -20,33 +21,33 @@ bool operator !=(CiColor p1, CiColor p2) { | |||||||
| } | } | ||||||
|  |  | ||||||
| PhilipsHueLight::PhilipsHueLight(unsigned int id, QString originalState, QString modelId) : | PhilipsHueLight::PhilipsHueLight(unsigned int id, QString originalState, QString modelId) : | ||||||
|                 id(id), originalState(originalState) { | 		id(id), originalState(originalState) { | ||||||
|         // Hue system model ids (http://www.developers.meethue.com/documentation/supported-lights). | 	// Hue system model ids (http://www.developers.meethue.com/documentation/supported-lights). | ||||||
|         // Light strips, color iris, ... | 	// Light strips, color iris, ... | ||||||
|         const std::set<QString> GAMUT_A_MODEL_IDS = { "LLC001", "LLC005", "LLC006", "LLC007", "LLC010", "LLC011", "LLC012", | 	const std::set<QString> GAMUT_A_MODEL_IDS = { "LLC001", "LLC005", "LLC006", "LLC007", "LLC010", "LLC011", "LLC012", | ||||||
|                         "LLC013", "LLC014", "LST001" }; | 			"LLC013", "LLC014", "LST001" }; | ||||||
|         // Hue bulbs, spots, ... | 	// Hue bulbs, spots, ... | ||||||
|         const std::set<QString> GAMUT_B_MODEL_IDS = { "LCT001", "LCT002", "LCT003", "LCT007", "LLM001" }; | 	const std::set<QString> GAMUT_B_MODEL_IDS = { "LCT001", "LCT002", "LCT003", "LCT007", "LLM001" }; | ||||||
|         // Hue Lightstrip plus, go ... | 	// Hue Lightstrip plus, go ... | ||||||
|         const std::set<QString> GAMUT_C_MODEL_IDS = { "LLC020", "LST002" }; | 	const std::set<QString> GAMUT_C_MODEL_IDS = { "LLC020", "LST002" }; | ||||||
|         // Find id in the sets and set the appropiate color space. | 	// Find id in the sets and set the appropiate color space. | ||||||
|         if (GAMUT_A_MODEL_IDS.find(modelId) != GAMUT_A_MODEL_IDS.end()) { | 	if (GAMUT_A_MODEL_IDS.find(modelId) != GAMUT_A_MODEL_IDS.end()) { | ||||||
|                 colorSpace.red = {0.703f, 0.296f}; | 		colorSpace.red = {0.703f, 0.296f}; | ||||||
|                 colorSpace.green = {0.2151f, 0.7106f}; | 		colorSpace.green = {0.2151f, 0.7106f}; | ||||||
|                 colorSpace.blue = {0.138f, 0.08f}; | 		colorSpace.blue = {0.138f, 0.08f}; | ||||||
|         } else if (GAMUT_B_MODEL_IDS.find(modelId) != GAMUT_B_MODEL_IDS.end()) { | 	} else if (GAMUT_B_MODEL_IDS.find(modelId) != GAMUT_B_MODEL_IDS.end()) { | ||||||
|                 colorSpace.red = {0.675f, 0.322f}; | 		colorSpace.red = {0.675f, 0.322f}; | ||||||
|                 colorSpace.green = {0.4091f, 0.518f}; | 		colorSpace.green = {0.4091f, 0.518f}; | ||||||
|                 colorSpace.blue = {0.167f, 0.04f}; | 		colorSpace.blue = {0.167f, 0.04f}; | ||||||
|         } else if (GAMUT_C_MODEL_IDS.find(modelId) != GAMUT_B_MODEL_IDS.end()) { | 	} else if (GAMUT_C_MODEL_IDS.find(modelId) != GAMUT_B_MODEL_IDS.end()) { | ||||||
|                 colorSpace.red = {0.675f, 0.322f}; | 		colorSpace.red = {0.675f, 0.322f}; | ||||||
|                 colorSpace.green = {0.2151f, 0.7106f}; | 		colorSpace.green = {0.2151f, 0.7106f}; | ||||||
|                 colorSpace.blue = {0.167f, 0.04f}; | 		colorSpace.blue = {0.167f, 0.04f}; | ||||||
|         } else { | 	} else { | ||||||
|                 colorSpace.red = {1.0f, 0.0f}; | 		colorSpace.red = {1.0f, 0.0f}; | ||||||
|                 colorSpace.green = {0.0f, 1.0f}; | 		colorSpace.green = {0.0f, 1.0f}; | ||||||
|                 colorSpace.blue = {0.0f, 0.0f}; | 		colorSpace.blue = {0.0f, 0.0f}; | ||||||
|         } | 	} | ||||||
| 	// Initialize black color. | 	// Initialize black color. | ||||||
| 	black = rgbToCiColor(0.0f, 0.0f, 0.0f); | 	black = rgbToCiColor(0.0f, 0.0f, 0.0f); | ||||||
| 	// Initialize color with black | 	// Initialize color with black | ||||||
| @@ -214,8 +215,8 @@ int LedDevicePhilipsHue::switchOff() { | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| void LedDevicePhilipsHue::put(QString route, QString content) { | void LedDevicePhilipsHue::put(QString route, QString content) { | ||||||
| 	QString url = QString("http://%1/api/%2/%3").arg(host).arg(username).arg(route); | 	QString url = QString("http://%1/api/%2/%3").arg(host).arg(username).arg(route); | ||||||
| 	// Perfrom request | 	// Perfrom request | ||||||
| 	QNetworkRequest request(url); | 	QNetworkRequest request(url); | ||||||
| 	QNetworkReply* reply = manager->put(request, content.toLatin1()); | 	QNetworkReply* reply = manager->put(request, content.toLatin1()); | ||||||
| @@ -226,8 +227,8 @@ void LedDevicePhilipsHue::put(QString route, QString content) { | |||||||
| 	loop.exec(); | 	loop.exec(); | ||||||
| } | } | ||||||
|  |  | ||||||
| QByteArray LedDevicePhilipsHue::get(QString route) { | QByteArray LedDevicePhilipsHue::get(QString route) { | ||||||
| 	QString url = QString("http://%1/api/%2/%3").arg(host).arg(username).arg(route); | 	QString url = QString("http://%1/api/%2/%3").arg(host).arg(username).arg(route); | ||||||
| 	// Perfrom request | 	// Perfrom request | ||||||
| 	QNetworkRequest request(url); | 	QNetworkRequest request(url); | ||||||
| 	QNetworkReply* reply = manager->get(request); | 	QNetworkReply* reply = manager->get(request); | ||||||
| @@ -236,8 +237,8 @@ QByteArray LedDevicePhilipsHue::get(QString route) { | |||||||
| 	loop.connect(reply, SIGNAL(finished()), SLOT(quit())); | 	loop.connect(reply, SIGNAL(finished()), SLOT(quit())); | ||||||
| 	// Go into the loop until the request is finished. | 	// Go into the loop until the request is finished. | ||||||
| 	loop.exec(); | 	loop.exec(); | ||||||
| 	// Read all data of the response. | 	// Read all data of the response. | ||||||
| 	return reply->readAll(); | 	return reply->readAll(); | ||||||
| } | } | ||||||
|  |  | ||||||
| QString LedDevicePhilipsHue::getStateRoute(unsigned int lightId) { | QString LedDevicePhilipsHue::getStateRoute(unsigned int lightId) { | ||||||
| @@ -254,11 +255,19 @@ void LedDevicePhilipsHue::saveStates(unsigned int nLights) { | |||||||
| 	// Use json parser to parse reponse. | 	// Use json parser to parse reponse. | ||||||
| 	Json::Reader reader; | 	Json::Reader reader; | ||||||
| 	Json::FastWriter writer; | 	Json::FastWriter writer; | ||||||
| 	// Create light ids if none supplied by the user. | 	// Read light ids if none have been supplied by the user. | ||||||
| 	if (lightIds.size() != nLights) { | 	if (lightIds.size() != nLights) { | ||||||
| 		lightIds.clear(); | 		QByteArray response = get("lights"); | ||||||
| 		for (unsigned int i = 0; i < nLights; i++) { | 		Json::Value json; | ||||||
| 			lightIds.push_back(i + 1); | 		if (!reader.parse(QString(response).toStdString(), json)) { | ||||||
|  | 			throw std::runtime_error("No lights found"); | ||||||
|  | 		} | ||||||
|  | 		// Loop over all children. | ||||||
|  | 		for (Json::ValueIterator it = json.begin(); it != json.end() && lightIds.size() <= nLights; it++) { | ||||||
|  | 			int lightId = atoi(it.key().asCString()); | ||||||
|  | 			lightIds.push_back(lightId); | ||||||
|  | 			std::cout << "LedDevicePhilipsHue::saveStates(nLights=" << nLights << "): found light with id " << lightId | ||||||
|  | 					<< "." << std::endl; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	// Iterate lights. | 	// Iterate lights. | ||||||
| @@ -269,6 +278,8 @@ void LedDevicePhilipsHue::saveStates(unsigned int nLights) { | |||||||
| 		Json::Value json; | 		Json::Value json; | ||||||
| 		if (!reader.parse(QString(response).toStdString(), json)) { | 		if (!reader.parse(QString(response).toStdString(), json)) { | ||||||
| 			// Error occured, break loop. | 			// Error occured, break loop. | ||||||
|  | 			std::cerr << "LedDevicePhilipsHue::saveStates(nLights=" << nLights | ||||||
|  | 					<< "): got invalid response from light with id " << lightIds.at(i) << "." << std::endl; | ||||||
| 			break; | 			break; | ||||||
| 		} | 		} | ||||||
| 		// Get state object values which are subject to change. | 		// Get state object values which are subject to change. | ||||||
|   | |||||||
							
								
								
									
										78
									
								
								libsrc/leddevice/LedDeviceWS281x.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								libsrc/leddevice/LedDeviceWS281x.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | #include <iostream> | ||||||
|  |  | ||||||
|  | #include "LedDeviceWS281x.h" | ||||||
|  |  | ||||||
|  | // Constructor | ||||||
|  | LedDeviceWS281x::LedDeviceWS281x(const int gpio, const int leds, const uint32_t freq, const int dmanum) | ||||||
|  | { | ||||||
|  | 	initialized = false; | ||||||
|  | 	led_string.freq = freq; | ||||||
|  | 	led_string.dmanum = dmanum; | ||||||
|  | 	led_string.channel[0].gpionum = gpio; | ||||||
|  | 	led_string.channel[0].invert = 0; | ||||||
|  | 	led_string.channel[0].count = leds; | ||||||
|  | 	led_string.channel[0].brightness = 255; | ||||||
|  | 	led_string.channel[0].strip_type = WS2811_STRIP_RGB; | ||||||
|  |  | ||||||
|  | 	led_string.channel[1].gpionum = 0; | ||||||
|  | 	led_string.channel[1].invert = 0; | ||||||
|  | 	led_string.channel[1].count = 0; | ||||||
|  | 	led_string.channel[1].brightness = 0; | ||||||
|  | 	led_string.channel[0].strip_type = WS2811_STRIP_RGB; | ||||||
|  | 	if (ws2811_init(&led_string) < 0) { | ||||||
|  | 		std::cout << "Unable to initialize ws281x library." << std::endl; | ||||||
|  | 		throw -1; | ||||||
|  | 	} | ||||||
|  | 	initialized = true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Send new values down the LED chain | ||||||
|  | int LedDeviceWS281x::write(const std::vector<ColorRgb> &ledValues) | ||||||
|  | { | ||||||
|  | 	if (!initialized) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
|  | 	int idx = 0; | ||||||
|  | 	for (const ColorRgb& color : ledValues) | ||||||
|  | 	{ | ||||||
|  | 		if (idx >= led_string.channel[0].count) | ||||||
|  | 			break; | ||||||
|  | 		led_string.channel[0].leds[idx++] = ((uint32_t)color.red << 16) + ((uint32_t)color.green << 8) + color.blue; | ||||||
|  | 	} | ||||||
|  | 	while (idx < led_string.channel[0].count) | ||||||
|  | 		led_string.channel[0].leds[idx++] = 0; | ||||||
|  |  | ||||||
|  | 	if (ws2811_render(&led_string)) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Turn off the LEDs by sending 000000's | ||||||
|  | // TODO Allow optional power switch out another gpio, if this code handles it can | ||||||
|  | // make it more likely we don't accidentally drive data into an off strip | ||||||
|  | int LedDeviceWS281x::switchOff() | ||||||
|  | { | ||||||
|  | 	if (!initialized) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
|  | 	int idx = 0; | ||||||
|  | 	while (idx < led_string.channel[0].count) | ||||||
|  | 		led_string.channel[0].leds[idx++] = 0; | ||||||
|  |  | ||||||
|  | 	if (ws2811_render(&led_string)) | ||||||
|  | 		return -1; | ||||||
|  |  | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Destructor | ||||||
|  | LedDeviceWS281x::~LedDeviceWS281x() | ||||||
|  | { | ||||||
|  | 	if (initialized) | ||||||
|  | 	{ | ||||||
|  | 		std::cout << "Shutdown WS281x PWM and DMA channel" << std::endl; | ||||||
|  | 		ws2811_fini(&led_string); | ||||||
|  | 	} | ||||||
|  | 	initialized = false; | ||||||
|  | } | ||||||
							
								
								
									
										43
									
								
								libsrc/leddevice/LedDeviceWS281x.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								libsrc/leddevice/LedDeviceWS281x.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | #ifndef LEDDEVICEWS281X_H_ | ||||||
|  | #define LEDDEVICEWS281X_H_ | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <leddevice/LedDevice.h> | ||||||
|  | #include <ws2811.h> | ||||||
|  |  | ||||||
|  | class LedDeviceWS281x : public LedDevice | ||||||
|  | { | ||||||
|  | public: | ||||||
|  | 	/// | ||||||
|  | 	/// Constructs the LedDevice for WS281x (one wire 800kHz) | ||||||
|  | 	/// | ||||||
|  | 	/// @param gpio   The gpio pin to use (BCM chip counting, default is 18) | ||||||
|  | 	/// @param leds   The number of leds attached to the gpio pin | ||||||
|  | 	/// @param freq   The target frequency for the data line, default is 800000 | ||||||
|  | 	/// @param dmanum The DMA channel to use, default is 5 | ||||||
|  | 	/// | ||||||
|  | 	LedDeviceWS281x(const int gpio, const int leds, const uint32_t freq, int dmanum); | ||||||
|  |  | ||||||
|  | 	/// | ||||||
|  | 	/// Destructor of the LedDevice, waits for DMA to complete and then cleans up | ||||||
|  | 	/// | ||||||
|  | 	~LedDeviceWS281x(); | ||||||
|  |  | ||||||
|  | 	/// | ||||||
|  | 	/// 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); | ||||||
|  |  | ||||||
|  | 	/// Switch the leds off | ||||||
|  | 	virtual int switchOff(); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | 	ws2811_t led_string; | ||||||
|  | 	bool initialized; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #endif /* LEDDEVICEWS281X_H_ */ | ||||||
| @@ -3,15 +3,15 @@ add_subdirectory(hyperion-remote) | |||||||
|  |  | ||||||
| # The following clients depend on the protobuf library | # The following clients depend on the protobuf library | ||||||
| if(ENABLE_PROTOBUF) | if(ENABLE_PROTOBUF) | ||||||
|  |  | ||||||
| 	if (ENABLE_AMLOGIC) | 	if (ENABLE_AMLOGIC) | ||||||
| 		add_subdirectory(hyperion-aml) | 		add_subdirectory(hyperion-aml) | ||||||
| 	endif() | 	endif() | ||||||
| 	# Add the 'Video 4 Linux' grabber if it is enabled |  | ||||||
| 	if(ENABLE_V4L2) | 	if(ENABLE_V4L2) | ||||||
| 		add_subdirectory(hyperion-v4l2) | 		add_subdirectory(hyperion-v4l2) | ||||||
| 	endif() | 	endif() | ||||||
|  |  | ||||||
| 	# Add the X11 grabber if it is enabled |  | ||||||
| 	if(ENABLE_X11) | 	if(ENABLE_X11) | ||||||
| 		add_subdirectory(hyperion-x11) | 		add_subdirectory(hyperion-x11) | ||||||
| 	endif() | 	endif() | ||||||
| @@ -20,4 +20,12 @@ if(ENABLE_PROTOBUF) | |||||||
| 		add_subdirectory(hyperion-dispmanx) | 		add_subdirectory(hyperion-dispmanx) | ||||||
| 	endif() | 	endif() | ||||||
|  |  | ||||||
|  | 	if(ENABLE_FB) | ||||||
|  | 		add_subdirectory(hyperion-framebuffer) | ||||||
|  | 	endif() | ||||||
|  |  | ||||||
|  | 	if(ENABLE_OSX) | ||||||
|  | 		add_subdirectory(hyperion-osx) | ||||||
|  | 	endif() | ||||||
|  |  | ||||||
| endif() | endif() | ||||||
|   | |||||||
| @@ -4,8 +4,12 @@ cmake_minimum_required(VERSION 2.8) | |||||||
| # Set the project name | # Set the project name | ||||||
| project(hyperion-aml) | project(hyperion-aml) | ||||||
|  |  | ||||||
| # find Qt4 | # find QT | ||||||
| find_package(Qt4 REQUIRED QtCore QtGui QtNetwork) | if(ENABLE_QT5) | ||||||
|  | 	find_package(Qt5Widgets REQUIRED) | ||||||
|  | else(ENABLE_QT5) | ||||||
|  | 	find_package(Qt4 REQUIRED QtCore QtGui QtNetwork) | ||||||
|  | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| include_directories( | include_directories( | ||||||
| 	${CMAKE_CURRENT_BINARY_DIR}/../../libsrc/protoserver | 	${CMAKE_CURRENT_BINARY_DIR}/../../libsrc/protoserver | ||||||
| @@ -31,13 +35,13 @@ else(ENABLE_QT5) | |||||||
| 	QT4_WRAP_CPP(Hyperion_AML_HEADERS_MOC ${Hyperion_AML_QT_HEADERS}) | 	QT4_WRAP_CPP(Hyperion_AML_HEADERS_MOC ${Hyperion_AML_QT_HEADERS}) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| add_executable(hyperion-amlogic | add_executable(${PROJECT_NAME} | ||||||
| 	${Hyperion_AML_HEADERS} | 	${Hyperion_AML_HEADERS} | ||||||
| 	${Hyperion_AML_SOURCES} | 	${Hyperion_AML_SOURCES} | ||||||
| 	${Hyperion_AML_HEADERS_MOC} | 	${Hyperion_AML_HEADERS_MOC} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| target_link_libraries(hyperion-amlogic | target_link_libraries(${PROJECT_NAME} | ||||||
| 	getoptPlusPlus | 	getoptPlusPlus | ||||||
| 	blackborder | 	blackborder | ||||||
| 	hyperion-utils | 	hyperion-utils | ||||||
| @@ -46,7 +50,8 @@ target_link_libraries(hyperion-amlogic | |||||||
| 	pthread | 	pthread | ||||||
| ) | ) | ||||||
|  |  | ||||||
| qt4_use_modules(hyperion-amlogic | if(ENABLE_QT5) | ||||||
| 	Core | 	qt5_use_modules(${PROJECT_NAME} Widgets Core Gui Network) | ||||||
| 	Gui | else(ENABLE_QT5) | ||||||
| 	Network) | 	qt4_use_modules(${PROJECT_NAME} Core Gui Network ) | ||||||
|  | endif(ENABLE_QT5) | ||||||
|   | |||||||
| @@ -30,9 +30,9 @@ int main(int argc, char ** argv) | |||||||
| 		OptionsParser optionParser("X11 capture application for Hyperion"); | 		OptionsParser optionParser("X11 capture application for Hyperion"); | ||||||
| 		ParameterSet & parameters = optionParser.getParameters(); | 		ParameterSet & parameters = optionParser.getParameters(); | ||||||
|  |  | ||||||
| 		IntParameter           & argFps             = parameters.add<IntParameter>          ('f', "framerate",        "Capture frame rate [default=10]"); | 		IntParameter           & argFps             = parameters.add<IntParameter>          ('f', "framerate",        "Capture frame rate [default: 10]"); | ||||||
| 		IntParameter           & argWidth           = parameters.add<IntParameter>          (0x0, "width",       "Width of the captured image [default=128]"); | 		IntParameter           & argWidth           = parameters.add<IntParameter>          (0x0, "width",            "Width of the captured image [default: 128]"); | ||||||
| 		IntParameter           & argHeight          = parameters.add<IntParameter>          (0x0, "height",      "Height of the captured image [default=128]"); | 		IntParameter           & argHeight          = parameters.add<IntParameter>          (0x0, "height",           "Height of the captured image [default: 128]"); | ||||||
| 		SwitchParameter<>      & argScreenshot      = parameters.add<SwitchParameter<>>     (0x0, "screenshot",       "Take a single screenshot, save it to file and quit"); | 		SwitchParameter<>      & argScreenshot      = parameters.add<SwitchParameter<>>     (0x0, "screenshot",       "Take a single screenshot, save it to file and quit"); | ||||||
| 		StringParameter        & argAddress         = parameters.add<StringParameter>       ('a', "address",          "Set the address of the hyperion server [default: 127.0.0.1:19445]"); | 		StringParameter        & argAddress         = parameters.add<StringParameter>       ('a', "address",          "Set the address of the hyperion server [default: 127.0.0.1:19445]"); | ||||||
| 		IntParameter           & argPriority        = parameters.add<IntParameter>          ('p', "priority",         "Use the provided priority channel (the lower the number, the higher the priority) [default: 800]"); | 		IntParameter           & argPriority        = parameters.add<IntParameter>          ('p', "priority",         "Use the provided priority channel (the lower the number, the higher the priority) [default: 800]"); | ||||||
|   | |||||||
| @@ -4,10 +4,10 @@ cmake_minimum_required(VERSION 2.8) | |||||||
| # Set the project name | # Set the project name | ||||||
| project(hyperion-dispmanx) | project(hyperion-dispmanx) | ||||||
|  |  | ||||||
|  | # find QT | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| 	find_package(Qt5Widgets REQUIRED) | 	find_package(Qt5Widgets REQUIRED) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| 	# find Qt4 |  | ||||||
| 	find_package(Qt4 REQUIRED QtCore QtGui QtNetwork ) | 	find_package(Qt4 REQUIRED QtCore QtGui QtNetwork ) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| @@ -55,11 +55,7 @@ target_link_libraries( ${PROJECT_NAME} | |||||||
| ) | ) | ||||||
|  |  | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| 	qt5_use_modules(hyperion-dispmanx Widgets Core Gui Network) | 	qt5_use_modules(${PROJECT_NAME} Widgets Core Gui Network) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| 	qt4_use_modules(hyperion-dispmanx | 	qt4_use_modules(${PROJECT_NAME} Core Gui Network ) | ||||||
| 		Core |  | ||||||
| 		Gui |  | ||||||
| 		Network |  | ||||||
| 	) |  | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|   | |||||||
| @@ -29,7 +29,7 @@ int main(int argc, char ** argv) | |||||||
| 		OptionsParser optionParser("Dispmanx capture application for Hyperion"); | 		OptionsParser optionParser("Dispmanx capture application for Hyperion"); | ||||||
| 		ParameterSet & parameters = optionParser.getParameters(); | 		ParameterSet & parameters = optionParser.getParameters(); | ||||||
|  |  | ||||||
| 		IntParameter           & argFps        = parameters.add<IntParameter>          ('f', "framerate",   "Capture frame rate [default=10]"); | 		IntParameter           & argFps        = parameters.add<IntParameter>          ('f', "framerate",   "Capture frame rate [default: 10]"); | ||||||
| 		IntParameter           & argWidth      = parameters.add<IntParameter>          (0x0, "width",       "The width of the grabbed frames [pixels]"); | 		IntParameter           & argWidth      = parameters.add<IntParameter>          (0x0, "width",       "The width of the grabbed frames [pixels]"); | ||||||
| 		IntParameter           & argHeight     = parameters.add<IntParameter>          (0x0, "height",      "The height of the grabbed frames"); | 		IntParameter           & argHeight     = parameters.add<IntParameter>          (0x0, "height",      "The height of the grabbed frames"); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								src/hyperion-framebuffer/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/hyperion-framebuffer/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | # Configure minimum CMAKE version | ||||||
|  | cmake_minimum_required(VERSION 2.8) | ||||||
|  |  | ||||||
|  | # Set the project name | ||||||
|  | project(hyperion-framebuffer) | ||||||
|  |  | ||||||
|  | # find QT | ||||||
|  | if(ENABLE_QT5) | ||||||
|  | 	find_package(Qt5Widgets REQUIRED) | ||||||
|  | else(ENABLE_QT5) | ||||||
|  | 	find_package(Qt4 REQUIRED QtCore QtGui QtNetwork ) | ||||||
|  | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
|  | include_directories( | ||||||
|  | 	${CMAKE_CURRENT_BINARY_DIR}/../../libsrc/protoserver | ||||||
|  | 	${QT_INCLUDES} | ||||||
|  | 	${PROTOBUF_INCLUDE_DIRS} | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | set(Hyperion_FB_QT_HEADERS | ||||||
|  | 	FramebufferWrapper.h | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | set(Hyperion_FB_HEADERS | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | set(Hyperion_FB_SOURCES | ||||||
|  | 	hyperion-framebuffer.cpp | ||||||
|  | 	FramebufferWrapper.cpp | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | if(ENABLE_QT5) | ||||||
|  | 	QT5_WRAP_CPP(Hyperion_FB_HEADERS_MOC ${Hyperion_FB_QT_HEADERS}) | ||||||
|  | else(ENABLE_QT5) | ||||||
|  | 	QT4_WRAP_CPP(Hyperion_FB_HEADERS_MOC ${Hyperion_FB_QT_HEADERS}) | ||||||
|  | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
|  | add_executable( ${PROJECT_NAME} | ||||||
|  | 	${Hyperion_FB_HEADERS} | ||||||
|  | 	${Hyperion_FB_SOURCES} | ||||||
|  | 	${Hyperion_FB_HEADERS_MOC} | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | target_link_libraries( ${PROJECT_NAME} | ||||||
|  | 	getoptPlusPlus | ||||||
|  | 	blackborder | ||||||
|  | 	hyperion-utils | ||||||
|  | 	protoserver | ||||||
|  | 	framebuffer-grabber | ||||||
|  | 	pthread | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | if(ENABLE_QT5) | ||||||
|  | 	qt5_use_modules(${PROJECT_NAME} Widgets Core Gui Network) | ||||||
|  | else(ENABLE_QT5) | ||||||
|  | 	qt4_use_modules(${PROJECT_NAME} Core Gui Network ) | ||||||
|  | endif(ENABLE_QT5) | ||||||
							
								
								
									
										37
									
								
								src/hyperion-framebuffer/FramebufferWrapper.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/hyperion-framebuffer/FramebufferWrapper.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  |  | ||||||
|  | // Hyperion-AmLogic includes | ||||||
|  | #include "FramebufferWrapper.h" | ||||||
|  |  | ||||||
|  | FramebufferWrapper::FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz) : | ||||||
|  |     _timer(this), | ||||||
|  |     _grabber(device,grabWidth, grabHeight) | ||||||
|  | { | ||||||
|  |     _timer.setSingleShot(false); | ||||||
|  |     _timer.setInterval(updateRate_Hz); | ||||||
|  |  | ||||||
|  |     // Connect capturing to the timeout signal of the timer | ||||||
|  |     connect(&_timer, SIGNAL(timeout()), this, SLOT(capture())); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const Image<ColorRgb> & FramebufferWrapper::getScreenshot() | ||||||
|  | { | ||||||
|  | 	capture(); | ||||||
|  | 	return _screenshot; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void FramebufferWrapper::start() | ||||||
|  | { | ||||||
|  |     _timer.start(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void FramebufferWrapper::stop() | ||||||
|  | { | ||||||
|  |     _timer.stop(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void FramebufferWrapper::capture() | ||||||
|  | { | ||||||
|  | 	_grabber.grabFrame(_screenshot); | ||||||
|  |  | ||||||
|  | 	emit sig_screenshot(_screenshot); | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								src/hyperion-framebuffer/FramebufferWrapper.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/hyperion-framebuffer/FramebufferWrapper.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  |  | ||||||
|  | // QT includes | ||||||
|  | #include <QTimer> | ||||||
|  |  | ||||||
|  | // Hyperion-Dispmanx includes | ||||||
|  | #include <grabber/FramebufferFrameGrabber.h> | ||||||
|  |  | ||||||
|  | class FramebufferWrapper : public QObject | ||||||
|  | { | ||||||
|  | 	Q_OBJECT | ||||||
|  | public: | ||||||
|  | 	FramebufferWrapper(const std::string & device, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz); | ||||||
|  |  | ||||||
|  | 	const Image<ColorRgb> & getScreenshot(); | ||||||
|  |  | ||||||
|  | 	/// | ||||||
|  | 	/// Starts the timed capturing of screenshots | ||||||
|  | 	/// | ||||||
|  | 	void start(); | ||||||
|  |  | ||||||
|  | 	void stop(); | ||||||
|  |  | ||||||
|  | signals: | ||||||
|  | 	void sig_screenshot(const Image<ColorRgb> & screenshot); | ||||||
|  |  | ||||||
|  | private slots: | ||||||
|  | 	/// | ||||||
|  | 	/// Performs a single screenshot capture and publishes the capture screenshot on the screenshot signal. | ||||||
|  | 	/// | ||||||
|  | 	void capture(); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | 	/// The QT timer to generate capture-publish events | ||||||
|  | 	QTimer _timer; | ||||||
|  |  | ||||||
|  | 	/// The grabber for creating screenshots | ||||||
|  | 	FramebufferFrameGrabber   _grabber; | ||||||
|  |  | ||||||
|  | 	// image buffers | ||||||
|  | 	Image<ColorRgb>  _screenshot; | ||||||
|  |  | ||||||
|  | }; | ||||||
							
								
								
									
										101
									
								
								src/hyperion-framebuffer/hyperion-framebuffer.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/hyperion-framebuffer/hyperion-framebuffer.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | // QT includes | ||||||
|  | #include <QCoreApplication> | ||||||
|  | #include <QImage> | ||||||
|  |  | ||||||
|  | // getoptPlusPLus includes | ||||||
|  | #include <getoptPlusPlus/getoptpp.h> | ||||||
|  |  | ||||||
|  | #include <protoserver/ProtoConnectionWrapper.h> | ||||||
|  | #include "FramebufferWrapper.h" | ||||||
|  |  | ||||||
|  | using namespace vlofgren; | ||||||
|  |  | ||||||
|  | // save the image as screenshot | ||||||
|  | void saveScreenshot(const char * filename, const Image<ColorRgb> & image) | ||||||
|  | { | ||||||
|  | 	// store as PNG | ||||||
|  | 	QImage pngImage((const uint8_t *) image.memptr(), image.width(), image.height(), 3*image.width(), QImage::Format_RGB888); | ||||||
|  | 	pngImage.save(filename); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(int argc, char ** argv) | ||||||
|  | { | ||||||
|  | 	QCoreApplication app(argc, argv); | ||||||
|  |  | ||||||
|  | 	try | ||||||
|  | 	{ | ||||||
|  | 		// create the option parser and initialize all parameters | ||||||
|  | 		OptionsParser optionParser("X11 capture application for Hyperion"); | ||||||
|  | 		ParameterSet & parameters = optionParser.getParameters(); | ||||||
|  |  | ||||||
|  | 		StringParameter        & argDevice          = parameters.add<StringParameter>       ('d', "device",           "Set the video device [default: /dev/video0]"); | ||||||
|  | 		IntParameter           & argFps             = parameters.add<IntParameter>          ('f', "framerate",        "Capture frame rate [default: 10]"); | ||||||
|  | 		IntParameter           & argWidth           = parameters.add<IntParameter>          (0x0, "width",            "Width of the captured image [default: 128]"); | ||||||
|  | 		IntParameter           & argHeight          = parameters.add<IntParameter>          (0x0, "height",           "Height of the captured image [default: 128]"); | ||||||
|  | 		SwitchParameter<>      & argScreenshot      = parameters.add<SwitchParameter<>>     (0x0, "screenshot",       "Take a single screenshot, save it to file and quit"); | ||||||
|  | 		StringParameter        & argAddress         = parameters.add<StringParameter>       ('a', "address",          "Set the address of the hyperion server [default: 127.0.0.1:19445]"); | ||||||
|  | 		IntParameter           & argPriority        = parameters.add<IntParameter>          ('p', "priority",         "Use the provided priority channel (the lower the number, the higher the priority) [default: 800]"); | ||||||
|  | 		SwitchParameter<>      & argSkipReply       = parameters.add<SwitchParameter<>>     (0x0, "skip-reply",       "Do not receive and check reply messages from Hyperion"); | ||||||
|  | 		SwitchParameter<>      & argHelp            = parameters.add<SwitchParameter<>>     ('h', "help",             "Show this help message and exit"); | ||||||
|  |  | ||||||
|  | 		// set defaults | ||||||
|  | 		argFps.setDefault(10); | ||||||
|  | 		argWidth.setDefault(160); | ||||||
|  | 		argHeight.setDefault(160); | ||||||
|  | 		argAddress.setDefault("127.0.0.1:19445"); | ||||||
|  | 		argPriority.setDefault(800); | ||||||
|  | 		argDevice.setDefault("/dev/video0"); | ||||||
|  |  | ||||||
|  | 		// parse all options | ||||||
|  | 		optionParser.parse(argc, const_cast<const char **>(argv)); | ||||||
|  |  | ||||||
|  | 		// check if we need to display the usage. exit if we do. | ||||||
|  | 		if (argHelp.isSet()) | ||||||
|  | 		{ | ||||||
|  | 			optionParser.usage(); | ||||||
|  | 			return 0; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		int width  = argWidth.getValue(); | ||||||
|  | 		int height = argHeight.getValue(); | ||||||
|  | 		if (width < 160 || height < 160) | ||||||
|  | 		{ | ||||||
|  | 			std::cout << "Minimum width and height is 160" << std::endl; | ||||||
|  | 			width  = std::max(160, width); | ||||||
|  | 			height = std::max(160, height); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		int grabInterval = 1000 / argFps.getValue(); | ||||||
|  | 		FramebufferWrapper fbWrapper(argDevice.getValue(), argWidth.getValue(), argHeight.getValue(), grabInterval); | ||||||
|  |  | ||||||
|  | 		if (argScreenshot.isSet()) | ||||||
|  | 		{ | ||||||
|  | 			// Capture a single screenshot and finish | ||||||
|  | 			const Image<ColorRgb> & screenshot = fbWrapper.getScreenshot(); | ||||||
|  | 			saveScreenshot("screenshot.png", screenshot); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			// Create the Proto-connection with hyperiond | ||||||
|  | 			ProtoConnectionWrapper protoWrapper(argAddress.getValue(), argPriority.getValue(), 1000, argSkipReply.isSet()); | ||||||
|  |  | ||||||
|  | 			// Connect the screen capturing to the proto processing | ||||||
|  | 			QObject::connect(&fbWrapper, SIGNAL(sig_screenshot(const Image<ColorRgb> &)), &protoWrapper, SLOT(receiveImage(Image<ColorRgb>))); | ||||||
|  |  | ||||||
|  | 			// Start the capturing | ||||||
|  | 			fbWrapper.start(); | ||||||
|  |  | ||||||
|  | 			// Start the application | ||||||
|  | 			app.exec(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	catch (const std::runtime_error & e) | ||||||
|  | 	{ | ||||||
|  | 		// An error occured. Display error and quit | ||||||
|  | 		std::cerr << e.what() << std::endl; | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
							
								
								
									
										57
									
								
								src/hyperion-osx/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/hyperion-osx/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  | # Configure minimum CMAKE version | ||||||
|  | cmake_minimum_required(VERSION 2.8) | ||||||
|  |  | ||||||
|  | # Set the project name | ||||||
|  | project(hyperion-osx) | ||||||
|  |  | ||||||
|  | # find QT | ||||||
|  | if(ENABLE_QT5) | ||||||
|  | 	find_package(Qt5Widgets REQUIRED) | ||||||
|  | else(ENABLE_QT5) | ||||||
|  | 	find_package(Qt4 REQUIRED QtCore QtGui QtNetwork ) | ||||||
|  | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
|  | include_directories( | ||||||
|  | 	${CMAKE_CURRENT_BINARY_DIR}/../../libsrc/protoserver | ||||||
|  | 	${QT_INCLUDES} | ||||||
|  | 	${PROTOBUF_INCLUDE_DIRS} | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | set(Hyperion_OSX_QT_HEADERS | ||||||
|  | 	OsxWrapper.h | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | set(Hyperion_OSX_HEADERS | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | set(Hyperion_OSX_SOURCES | ||||||
|  | 	hyperion-osx.cpp | ||||||
|  | 	OsxWrapper.cpp | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | if(ENABLE_QT5) | ||||||
|  | 	QT5_WRAP_CPP(Hyperion_OSX_HEADERS_MOC ${Hyperion_OSX_QT_HEADERS}) | ||||||
|  | else(ENABLE_QT5) | ||||||
|  | 	QT4_WRAP_CPP(Hyperion_OSX_HEADERS_MOC ${Hyperion_OSX_QT_HEADERS}) | ||||||
|  | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
|  | add_executable( ${PROJECT_NAME} | ||||||
|  | 	${Hyperion_OSX_HEADERS} | ||||||
|  | 	${Hyperion_OSX_SOURCES} | ||||||
|  | 	${Hyperion_OSX_HEADERS_MOC} | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | target_link_libraries( ${PROJECT_NAME} | ||||||
|  | 	getoptPlusPlus | ||||||
|  | 	blackborder | ||||||
|  | 	hyperion-utils | ||||||
|  | 	protoserver | ||||||
|  | 	osx-grabber | ||||||
|  | 	pthread | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | if(ENABLE_QT5) | ||||||
|  | 	qt5_use_modules(${PROJECT_NAME} Widgets Core Gui Network) | ||||||
|  | else(ENABLE_QT5) | ||||||
|  | 	qt4_use_modules(${PROJECT_NAME} Core Gui Network ) | ||||||
|  | endif(ENABLE_QT5) | ||||||
							
								
								
									
										36
									
								
								src/hyperion-osx/OsxWrapper.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/hyperion-osx/OsxWrapper.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  |  | ||||||
|  | // Hyperion-AmLogic includes | ||||||
|  | #include "OsxWrapper.h" | ||||||
|  |  | ||||||
|  | OsxWrapper::OsxWrapper(const unsigned display, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz) : | ||||||
|  |     _timer(this), | ||||||
|  |     _grabber(display,grabWidth, grabHeight) | ||||||
|  | { | ||||||
|  |     _timer.setSingleShot(false); | ||||||
|  |     _timer.setInterval(updateRate_Hz); | ||||||
|  |  | ||||||
|  |     // Connect capturing to the timeout signal of the timer | ||||||
|  |     connect(&_timer, SIGNAL(timeout()), this, SLOT(capture())); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | const Image<ColorRgb> & OsxWrapper::getScreenshot() | ||||||
|  | { | ||||||
|  | 	capture(); | ||||||
|  | 	return _screenshot; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void OsxWrapper::start() | ||||||
|  | { | ||||||
|  | 	_timer.start(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void OsxWrapper::stop() | ||||||
|  | { | ||||||
|  | 	_timer.stop(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void OsxWrapper::capture() | ||||||
|  | { | ||||||
|  | 	_grabber.grabFrame(_screenshot); | ||||||
|  | 	emit sig_screenshot(_screenshot); | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								src/hyperion-osx/OsxWrapper.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/hyperion-osx/OsxWrapper.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  |  | ||||||
|  | // QT includes | ||||||
|  | #include <QTimer> | ||||||
|  |  | ||||||
|  | // Hyperion-Dispmanx includes | ||||||
|  | #include <grabber/OsxFrameGrabber.h> | ||||||
|  |  | ||||||
|  | class OsxWrapper : public QObject | ||||||
|  | { | ||||||
|  | 	Q_OBJECT | ||||||
|  | public: | ||||||
|  | 	OsxWrapper(const unsigned display, const unsigned grabWidth, const unsigned grabHeight, const unsigned updateRate_Hz); | ||||||
|  |  | ||||||
|  | 	const Image<ColorRgb> & getScreenshot(); | ||||||
|  |  | ||||||
|  | 	/// | ||||||
|  | 	/// Starts the timed capturing of screenshots | ||||||
|  | 	/// | ||||||
|  | 	void start(); | ||||||
|  |  | ||||||
|  | 	void stop(); | ||||||
|  |  | ||||||
|  | signals: | ||||||
|  | 	void sig_screenshot(const Image<ColorRgb> & screenshot); | ||||||
|  |  | ||||||
|  | private slots: | ||||||
|  | 	/// | ||||||
|  | 	/// Performs a single screenshot capture and publishes the capture screenshot on the screenshot signal. | ||||||
|  | 	/// | ||||||
|  | 	void capture(); | ||||||
|  |  | ||||||
|  | private: | ||||||
|  | 	/// The QT timer to generate capture-publish events | ||||||
|  | 	QTimer _timer; | ||||||
|  |  | ||||||
|  | 	/// The grabber for creating screenshots | ||||||
|  | 	OsxFrameGrabber   _grabber; | ||||||
|  |  | ||||||
|  | 	// image buffers | ||||||
|  | 	Image<ColorRgb>  _screenshot; | ||||||
|  |  | ||||||
|  | }; | ||||||
							
								
								
									
										101
									
								
								src/hyperion-osx/hyperion-osx.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/hyperion-osx/hyperion-osx.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  | // QT includes | ||||||
|  | #include <QCoreApplication> | ||||||
|  | #include <QImage> | ||||||
|  |  | ||||||
|  | // getoptPlusPLus includes | ||||||
|  | #include <getoptPlusPlus/getoptpp.h> | ||||||
|  |  | ||||||
|  | #include <protoserver/ProtoConnectionWrapper.h> | ||||||
|  | #include "OsxWrapper.h" | ||||||
|  |  | ||||||
|  | using namespace vlofgren; | ||||||
|  |  | ||||||
|  | // save the image as screenshot | ||||||
|  | void saveScreenshot(const char * filename, const Image<ColorRgb> & image) | ||||||
|  | { | ||||||
|  | 	// store as PNG | ||||||
|  | 	QImage pngImage((const uint8_t *) image.memptr(), image.width(), image.height(), 3*image.width(), QImage::Format_RGB888); | ||||||
|  | 	pngImage.save(filename); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(int argc, char ** argv) | ||||||
|  | { | ||||||
|  | 	QCoreApplication app(argc, argv); | ||||||
|  |  | ||||||
|  | 	try | ||||||
|  | 	{ | ||||||
|  | 		// create the option parser and initialize all parameters | ||||||
|  | 		OptionsParser optionParser("X11 capture application for Hyperion"); | ||||||
|  | 		ParameterSet & parameters = optionParser.getParameters(); | ||||||
|  |  | ||||||
|  | 		IntParameter           & argDisplay         = parameters.add<IntParameter>          ('d', "display",          "Set the display to capture [default: 0]"); | ||||||
|  | 		IntParameter           & argFps             = parameters.add<IntParameter>          ('f', "framerate",        "Capture frame rate [default: 10]"); | ||||||
|  | 		IntParameter           & argWidth           = parameters.add<IntParameter>          (0x0, "width",            "Width of the captured image [default: 128]"); | ||||||
|  | 		IntParameter           & argHeight          = parameters.add<IntParameter>          (0x0, "height",           "Height of the captured image [default: 128]"); | ||||||
|  | 		SwitchParameter<>      & argScreenshot      = parameters.add<SwitchParameter<>>     (0x0, "screenshot",       "Take a single screenshot, save it to file and quit"); | ||||||
|  | 		StringParameter        & argAddress         = parameters.add<StringParameter>       ('a', "address",          "Set the address of the hyperion server [default: 127.0.0.1:19445]"); | ||||||
|  | 		IntParameter           & argPriority        = parameters.add<IntParameter>          ('p', "priority",         "Use the provided priority channel (the lower the number, the higher the priority) [default: 800]"); | ||||||
|  | 		SwitchParameter<>      & argSkipReply       = parameters.add<SwitchParameter<>>     (0x0, "skip-reply",       "Do not receive and check reply messages from Hyperion"); | ||||||
|  | 		SwitchParameter<>      & argHelp            = parameters.add<SwitchParameter<>>     ('h', "help",             "Show this help message and exit"); | ||||||
|  |  | ||||||
|  | 		// set defaults | ||||||
|  | 		argFps.setDefault(10); | ||||||
|  | 		argWidth.setDefault(160); | ||||||
|  | 		argHeight.setDefault(160); | ||||||
|  | 		argAddress.setDefault("127.0.0.1:19445"); | ||||||
|  | 		argPriority.setDefault(800); | ||||||
|  | 		argDisplay.setDefault(0); | ||||||
|  |  | ||||||
|  | 		// parse all options | ||||||
|  | 		optionParser.parse(argc, const_cast<const char **>(argv)); | ||||||
|  |  | ||||||
|  | 		// check if we need to display the usage. exit if we do. | ||||||
|  | 		if (argHelp.isSet()) | ||||||
|  | 		{ | ||||||
|  | 			optionParser.usage(); | ||||||
|  | 			return 0; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		int width  = argWidth.getValue(); | ||||||
|  | 		int height = argHeight.getValue(); | ||||||
|  | 		if (width < 160 || height < 160) | ||||||
|  | 		{ | ||||||
|  | 			std::cout << "Minimum width and height is 160" << std::endl; | ||||||
|  | 			width  = std::max(160, width); | ||||||
|  | 			height = std::max(160, height); | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		int grabInterval = 1000 / argFps.getValue(); | ||||||
|  | 		OsxWrapper osxWrapper(argDisplay.getValue(), argWidth.getValue(), argHeight.getValue(), grabInterval); | ||||||
|  |  | ||||||
|  | 		if (argScreenshot.isSet()) | ||||||
|  | 		{ | ||||||
|  | 			// Capture a single screenshot and finish | ||||||
|  | 			const Image<ColorRgb> & screenshot = osxWrapper.getScreenshot(); | ||||||
|  | 			saveScreenshot("screenshot.png", screenshot); | ||||||
|  | 		} | ||||||
|  | 		else | ||||||
|  | 		{ | ||||||
|  | 			// Create the Proto-connection with hyperiond | ||||||
|  | 			ProtoConnectionWrapper protoWrapper(argAddress.getValue(), argPriority.getValue(), 1000, argSkipReply.isSet()); | ||||||
|  |  | ||||||
|  | 			// Connect the screen capturing to the proto processing | ||||||
|  | 			QObject::connect(&osxWrapper, SIGNAL(sig_screenshot(const Image<ColorRgb> &)), &protoWrapper, SLOT(receiveImage(Image<ColorRgb>))); | ||||||
|  |  | ||||||
|  | 			// Start the capturing | ||||||
|  | 			osxWrapper.start(); | ||||||
|  |  | ||||||
|  | 			// Start the application | ||||||
|  | 			app.exec(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	catch (const std::runtime_error & e) | ||||||
|  | 	{ | ||||||
|  | 		// An error occured. Display error and quit | ||||||
|  | 		std::cerr << e.what() << std::endl; | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
| @@ -1,41 +1,43 @@ | |||||||
| cmake_minimum_required(VERSION 2.8) | cmake_minimum_required(VERSION 2.8) | ||||||
|  |  | ||||||
| project(hyperion-remote) | project(hyperion-remote) | ||||||
|  |  | ||||||
| # find Qt4 | # find Qt | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| find_package(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED) | 	find_package(Qt5 COMPONENTS Core Gui Widgets Network REQUIRED) | ||||||
| #  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}    ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") | #	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}    ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") | ||||||
| #      set(CMAKE_CXX_FLAGS "-fPIC") | #	set(CMAKE_CXX_FLAGS "-fPIC") | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| find_package(Qt4 REQUIRED QtCore QtGui QtNetwork) | 	find_package(Qt4 REQUIRED QtCore QtGui QtNetwork) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| # The following I do not undrstand completely... | # The following I do not undrstand completely... | ||||||
| # libQtCore.so uses some hardcoded library path inside which are incorrect after copying the file RPi file system | # libQtCore.so uses some hardcoded library path inside which are incorrect after copying the file RPi file system | ||||||
| # Therefor, an extra path is needed on which to find the required libraries | # Therefor, an extra path is needed on which to find the required libraries | ||||||
| LINK_DIRECTORIES(${LINK_DIRECTORIES} ${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf) | LINK_DIRECTORIES(${LINK_DIRECTORIES} ${CMAKE_FIND_ROOT_PATH}/lib/arm-linux-gnueabihf) | ||||||
|  |  | ||||||
| include_directories(${QT_INCLUDES}) | include_directories(${QT_INCLUDES}) | ||||||
|  |  | ||||||
| set(hyperion-remote_HEADERS | set(hyperion-remote_HEADERS | ||||||
| 	CustomParameter.h | 	CustomParameter.h | ||||||
| 	JsonConnection.h | 	JsonConnection.h | ||||||
| 	ColorTransformValues.h) | 	ColorTransformValues.h) | ||||||
|  |  | ||||||
| set(hyperion-remote_SOURCES | set(hyperion-remote_SOURCES | ||||||
| 	hyperion-remote.cpp | 	hyperion-remote.cpp | ||||||
| 	JsonConnection.cpp) | 	JsonConnection.cpp) | ||||||
|  |  | ||||||
| add_executable(hyperion-remote | add_executable(${PROJECT_NAME} | ||||||
| 	${hyperion-remote_HEADERS} | 	${hyperion-remote_HEADERS} | ||||||
| 	${hyperion-remote_SOURCES}) | 	${hyperion-remote_SOURCES}) | ||||||
|  |  | ||||||
| if(ENABLE_QT5) | target_link_libraries(${PROJECT_NAME} | ||||||
| qt5_use_modules(hyperion-remote Widgets Network) | 	jsoncpp | ||||||
| endif(ENABLE_QT5) | 	getoptPlusPlus | ||||||
|  | 	${QT_LIBRARIES}) | ||||||
| target_link_libraries(hyperion-remote |  | ||||||
| 	jsoncpp | if(ENABLE_QT5) | ||||||
|     getoptPlusPlus | 	qt5_use_modules(${PROJECT_NAME} Widgets Core Network) | ||||||
|     ${QT_LIBRARIES}) | else(ENABLE_QT5) | ||||||
|  | 	qt4_use_modules(${PROJECT_NAME} Core Gui Network ) | ||||||
|  | endif(ENABLE_QT5) | ||||||
|   | |||||||
| @@ -2,13 +2,13 @@ cmake_minimum_required(VERSION 2.8) | |||||||
|  |  | ||||||
| project(hyperion-v4l2) | project(hyperion-v4l2) | ||||||
|  |  | ||||||
| # find Qt4 | # find Qt | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| find_package(Qt5Widgets REQUIRED) | 	find_package(Qt5Widgets REQUIRED) | ||||||
|   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}    ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") | 	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}    ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") | ||||||
| #      set(CMAKE_CXX_FLAGS "-fPIC") | #	set(CMAKE_CXX_FLAGS "-fPIC") | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| find_package(Qt4 REQUIRED QtCore QtGui QtNetwork) | 	find_package(Qt4 REQUIRED QtCore QtGui QtNetwork) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -32,19 +32,19 @@ set(Hyperion_V4L2_SOURCES | |||||||
| 	ScreenshotHandler.cpp | 	ScreenshotHandler.cpp | ||||||
| ) | ) | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| QT5_WRAP_CPP(Hyperion_V4L2_MOC_SOURCES ${Hyperion_V4L2_QT_HEADERS}) | 	QT5_WRAP_CPP(Hyperion_V4L2_MOC_SOURCES ${Hyperion_V4L2_QT_HEADERS}) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| QT4_WRAP_CPP(Hyperion_V4L2_MOC_SOURCES ${Hyperion_V4L2_QT_HEADERS}) | 	QT4_WRAP_CPP(Hyperion_V4L2_MOC_SOURCES ${Hyperion_V4L2_QT_HEADERS}) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| add_executable(hyperion-v4l2 | add_executable(${PROJECT_NAME} | ||||||
| 	${Hyperion_V4L2_HEADERS} | 	${Hyperion_V4L2_HEADERS} | ||||||
| 	${Hyperion_V4L2_SOURCES} | 	${Hyperion_V4L2_SOURCES} | ||||||
| 	${Hyperion_V4L2_QT_HEADERS} | 	${Hyperion_V4L2_QT_HEADERS} | ||||||
| 	${Hyperion_V4L2_MOC_SOURCES} | 	${Hyperion_V4L2_MOC_SOURCES} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| target_link_libraries(hyperion-v4l2 | target_link_libraries(${PROJECT_NAME} | ||||||
| 	v4l2-grabber | 	v4l2-grabber | ||||||
| 	getoptPlusPlus | 	getoptPlusPlus | ||||||
| 	blackborder | 	blackborder | ||||||
| @@ -53,3 +53,9 @@ target_link_libraries(hyperion-v4l2 | |||||||
| 	pthread | 	pthread | ||||||
| 	${QT_LIBRARIES} | 	${QT_LIBRARIES} | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | if(ENABLE_QT5) | ||||||
|  | 	qt5_use_modules(${PROJECT_NAME} Widgets Core Gui Network) | ||||||
|  | else(ENABLE_QT5) | ||||||
|  | 	qt4_use_modules(${PROJECT_NAME} Core Gui Network ) | ||||||
|  | endif(ENABLE_QT5) | ||||||
|   | |||||||
| @@ -51,14 +51,14 @@ int main(int argc, char** argv) | |||||||
|         OptionsParser optionParser("V4L capture application for Hyperion"); |         OptionsParser optionParser("V4L capture application for Hyperion"); | ||||||
|         ParameterSet & parameters = optionParser.getParameters(); |         ParameterSet & parameters = optionParser.getParameters(); | ||||||
|  |  | ||||||
|         StringParameter        & argDevice          = parameters.add<StringParameter>       ('d', "device",           "The device to use [default=/dev/video0]"); |         StringParameter        & argDevice          = parameters.add<StringParameter>       ('d', "device",           "The device to use [default: /dev/video0]"); | ||||||
|         VideoStandardParameter & argVideoStandard   = parameters.add<VideoStandardParameter>('v', "video-standard",   "The used video standard. Valid values are PAL or NTSC (optional)"); |         VideoStandardParameter & argVideoStandard   = parameters.add<VideoStandardParameter>('v', "video-standard",   "The used video standard. Valid values are PAL or NTSC (optional)"); | ||||||
|         PixelFormatParameter   & argPixelFormat     = parameters.add<PixelFormatParameter>  (0x0, "pixel-format",     "The use pixel format. Valid values are YUYV, UYVY, and RGB32 (optional)"); |         PixelFormatParameter   & argPixelFormat     = parameters.add<PixelFormatParameter>  (0x0, "pixel-format",     "The use pixel format. Valid values are YUYV, UYVY, and RGB32 (optional)"); | ||||||
|         IntParameter           & argInput           = parameters.add<IntParameter>          (0x0, "input",            "Input channel (optional)"); |         IntParameter           & argInput           = parameters.add<IntParameter>          (0x0, "input",            "Input channel (optional)"); | ||||||
|         IntParameter           & argWidth           = parameters.add<IntParameter>          (0x0, "width",            "Try to set the width of the video input (optional)"); |         IntParameter           & argWidth           = parameters.add<IntParameter>          (0x0, "width",            "Try to set the width of the video input (optional)"); | ||||||
|         IntParameter           & argHeight          = parameters.add<IntParameter>          (0x0, "height",           "Try to set the height of the video input (optional)"); |         IntParameter           & argHeight          = parameters.add<IntParameter>          (0x0, "height",           "Try to set the height of the video input (optional)"); | ||||||
|         IntParameter           & argCropWidth       = parameters.add<IntParameter>          (0x0, "crop-width",       "Number of pixels to crop from the left and right sides of the picture before decimation [default=0]"); |         IntParameter           & argCropWidth       = parameters.add<IntParameter>          (0x0, "crop-width",       "Number of pixels to crop from the left and right sides of the picture before decimation [default: 0]"); | ||||||
|         IntParameter           & argCropHeight      = parameters.add<IntParameter>          (0x0, "crop-height",      "Number of pixels to crop from the top and the bottom of the picture before decimation [default=0]"); |         IntParameter           & argCropHeight      = parameters.add<IntParameter>          (0x0, "crop-height",      "Number of pixels to crop from the top and the bottom of the picture before decimation [default: 0]"); | ||||||
|         IntParameter           & argCropLeft        = parameters.add<IntParameter>          (0x0, "crop-left",        "Number of pixels to crop from the left of the picture before decimation (overrides --crop-width)"); |         IntParameter           & argCropLeft        = parameters.add<IntParameter>          (0x0, "crop-left",        "Number of pixels to crop from the left of the picture before decimation (overrides --crop-width)"); | ||||||
|         IntParameter           & argCropRight       = parameters.add<IntParameter>          (0x0, "crop-right",       "Number of pixels to crop from the right of the picture before decimation (overrides --crop-width)"); |         IntParameter           & argCropRight       = parameters.add<IntParameter>          (0x0, "crop-right",       "Number of pixels to crop from the right of the picture before decimation (overrides --crop-width)"); | ||||||
|         IntParameter           & argCropTop         = parameters.add<IntParameter>          (0x0, "crop-top",         "Number of pixels to crop from the top of the picture before decimation (overrides --crop-height)"); |         IntParameter           & argCropTop         = parameters.add<IntParameter>          (0x0, "crop-top",         "Number of pixels to crop from the top of the picture before decimation (overrides --crop-height)"); | ||||||
|   | |||||||
| @@ -4,11 +4,11 @@ cmake_minimum_required(VERSION 2.8) | |||||||
| # Set the project name | # Set the project name | ||||||
| project(hyperion-x11) | project(hyperion-x11) | ||||||
|  |  | ||||||
|  | # find QT | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| find_package(Qt5Widgets REQUIRED) | 	find_package(Qt5Widgets REQUIRED) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| # find Qt4 | 	find_package(Qt4 REQUIRED QtCore QtGui QtNetwork) | ||||||
| find_package(Qt4 REQUIRED QtCore QtGui QtNetwork) |  | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| # Find X11 | # Find X11 | ||||||
| @@ -33,18 +33,19 @@ set(Hyperion_X11_SOURCES | |||||||
| ) | ) | ||||||
|  |  | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| QT5_WRAP_CPP(Hyperion_X11_HEADERS_MOC ${Hyperion_X11_QT_HEADERS}) | 	QT5_WRAP_CPP(Hyperion_X11_HEADERS_MOC ${Hyperion_X11_QT_HEADERS}) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| QT4_WRAP_CPP(Hyperion_X11_HEADERS_MOC ${Hyperion_X11_QT_HEADERS}) | 	QT4_WRAP_CPP(Hyperion_X11_HEADERS_MOC ${Hyperion_X11_QT_HEADERS}) | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|  |  | ||||||
| add_executable(hyperion-x11 |  | ||||||
|  | add_executable(${PROJECT_NAME} | ||||||
| 	${Hyperion_X11_HEADERS} | 	${Hyperion_X11_HEADERS} | ||||||
| 	${Hyperion_X11_SOURCES} | 	${Hyperion_X11_SOURCES} | ||||||
| 	${Hyperion_X11_HEADERS_MOC} | 	${Hyperion_X11_HEADERS_MOC} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| target_link_libraries(hyperion-x11 | target_link_libraries(${PROJECT_NAME} | ||||||
| 	getoptPlusPlus | 	getoptPlusPlus | ||||||
| 	blackborder | 	blackborder | ||||||
| 	hyperion-utils | 	hyperion-utils | ||||||
| @@ -55,10 +56,7 @@ target_link_libraries(hyperion-x11 | |||||||
| ) | ) | ||||||
|  |  | ||||||
| if(ENABLE_QT5) | if(ENABLE_QT5) | ||||||
| qt5_use_modules(hyperion-x11 Widgets Core Gui Network) | 	qt5_use_modules(${PROJECT_NAME} Widgets Core Gui Network) | ||||||
| else(ENABLE_QT5) | else(ENABLE_QT5) | ||||||
| qt4_use_modules(hyperion-x11 | 	qt4_use_modules(${PROJECT_NAME} Core Gui Network ) | ||||||
| 	Core |  | ||||||
| 	Gui |  | ||||||
| 	Network) |  | ||||||
| endif(ENABLE_QT5) | endif(ENABLE_QT5) | ||||||
|   | |||||||
| @@ -29,9 +29,9 @@ int main(int argc, char ** argv) | |||||||
|         OptionsParser optionParser("X11 capture application for Hyperion"); |         OptionsParser optionParser("X11 capture application for Hyperion"); | ||||||
|         ParameterSet & parameters = optionParser.getParameters(); |         ParameterSet & parameters = optionParser.getParameters(); | ||||||
|  |  | ||||||
|         IntParameter           & argFps             = parameters.add<IntParameter>          ('f', "framerate",        "Capture frame rate [default=10]"); |         IntParameter           & argFps             = parameters.add<IntParameter>          ('f', "framerate",        "Capture frame rate [default: 10]"); | ||||||
|         IntParameter           & argCropWidth       = parameters.add<IntParameter>          (0x0, "crop-width",       "Number of pixels to crop from the left and right sides of the picture before decimation [default=0]"); |         IntParameter           & argCropWidth       = parameters.add<IntParameter>          (0x0, "crop-width",       "Number of pixels to crop from the left and right sides of the picture before decimation [default: 0]"); | ||||||
|         IntParameter           & argCropHeight      = parameters.add<IntParameter>          (0x0, "crop-height",      "Number of pixels to crop from the top and the bottom of the picture before decimation [default=0]"); |         IntParameter           & argCropHeight      = parameters.add<IntParameter>          (0x0, "crop-height",      "Number of pixels to crop from the top and the bottom of the picture before decimation [default: 0]"); | ||||||
|         IntParameter           & argCropLeft        = parameters.add<IntParameter>          (0x0, "crop-left",        "Number of pixels to crop from the left of the picture before decimation (overrides --crop-width)"); |         IntParameter           & argCropLeft        = parameters.add<IntParameter>          (0x0, "crop-left",        "Number of pixels to crop from the left of the picture before decimation (overrides --crop-width)"); | ||||||
|         IntParameter           & argCropRight       = parameters.add<IntParameter>          (0x0, "crop-right",       "Number of pixels to crop from the right of the picture before decimation (overrides --crop-width)"); |         IntParameter           & argCropRight       = parameters.add<IntParameter>          (0x0, "crop-right",       "Number of pixels to crop from the right of the picture before decimation (overrides --crop-width)"); | ||||||
|         IntParameter           & argCropTop         = parameters.add<IntParameter>          (0x0, "crop-top",         "Number of pixels to crop from the top of the picture before decimation (overrides --crop-height)"); |         IntParameter           & argCropTop         = parameters.add<IntParameter>          (0x0, "crop-top",         "Number of pixels to crop from the top of the picture before decimation (overrides --crop-height)"); | ||||||
|   | |||||||
| @@ -127,47 +127,42 @@ int main(int argc, char** argv) | |||||||
| 		// Get the parameters for the bootsequence | 		// Get the parameters for the bootsequence | ||||||
| 		const std::string effectName = effectConfig["effect"].asString(); | 		const std::string effectName = effectConfig["effect"].asString(); | ||||||
| 		const unsigned duration_ms   = effectConfig["duration_ms"].asUInt(); | 		const unsigned duration_ms   = effectConfig["duration_ms"].asUInt(); | ||||||
| 		const int priority           = effectConfig["priority"].asUInt(); | 		const int priority           = (duration_ms != 0) ? 0 : effectConfig.get("priority",990).asInt(); | ||||||
| 		const int bootcolor_priority = (priority > 990) ? priority+1 : 990; | 		const int bootcolor_priority = (priority > 990) ? priority+1 : 990; | ||||||
|  |  | ||||||
|  | 		// clear the leds | ||||||
|  | 		ColorRgb boot_color = ColorRgb::BLACK; | ||||||
|  | 		hyperion.setColor(bootcolor_priority, boot_color, 0, false); | ||||||
|  |  | ||||||
|  | 		// start boot effect | ||||||
|  | 		if ( ! effectName.empty() ) | ||||||
|  | 		{ | ||||||
|  | 			int result; | ||||||
|  | 			std::cout << "Boot sequence '" << effectName << "' "; | ||||||
|  | 			if (effectConfig.isMember("args")) | ||||||
|  | 			{ | ||||||
|  | 				std::cout << " (with user defined arguments) "; | ||||||
|  | 				const Json::Value effectConfigArgs = effectConfig["args"]; | ||||||
|  | 				result = hyperion.setEffect(effectName, effectConfigArgs, priority, duration_ms); | ||||||
|  | 			} | ||||||
|  | 			else | ||||||
|  | 			{ | ||||||
|  | 				result = hyperion.setEffect(effectName, priority, duration_ms); | ||||||
|  | 			} | ||||||
|  | 			std::cout << ((result == 0) ? "started" : "failed") << std::endl; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// static color | ||||||
| 		if ( ! effectConfig["color"].isNull() && effectConfig["color"].isArray() && effectConfig["color"].size() == 3 ) | 		if ( ! effectConfig["color"].isNull() && effectConfig["color"].isArray() && effectConfig["color"].size() == 3 ) | ||||||
| 		{ | 		{ | ||||||
| 			ColorRgb boot_color = { | 			boot_color = { | ||||||
| 				(uint8_t)effectConfig["color"][0].asUInt(), | 				(uint8_t)effectConfig["color"][0].asUInt(), | ||||||
| 				(uint8_t)effectConfig["color"][1].asUInt(), | 				(uint8_t)effectConfig["color"][1].asUInt(), | ||||||
| 				(uint8_t)effectConfig["color"][2].asUInt() | 				(uint8_t)effectConfig["color"][2].asUInt() | ||||||
| 			}; | 			}; | ||||||
|  |  | ||||||
| 			hyperion.setColor(bootcolor_priority, boot_color, 0, false); |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			hyperion.setColor(bootcolor_priority, ColorRgb::BLACK, duration_ms, false); |  | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if (effectConfig.isMember("args")) | 		hyperion.setColor(bootcolor_priority, boot_color, 0, false); | ||||||
| 		{ |  | ||||||
| 			const Json::Value effectConfigArgs = effectConfig["args"]; |  | ||||||
| 			if (hyperion.setEffect(effectName, effectConfigArgs, priority, duration_ms) == 0) |  | ||||||
| 			{ |  | ||||||
| 				std::cout << "Boot sequence(" << effectName << ") with user-defined arguments created and started" << std::endl; |  | ||||||
| 			} |  | ||||||
| 			else |  | ||||||
| 			{ |  | ||||||
| 				std::cout << "Failed to start boot sequence: " << effectName << " with user-defined arguments" << std::endl; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		else |  | ||||||
| 		{ |  | ||||||
| 			if (hyperion.setEffect(effectName, priority, duration_ms) == 0) |  | ||||||
| 			{ |  | ||||||
| 				std::cout << "Boot sequence(" << effectName << ") created and started" << std::endl; |  | ||||||
| 			} |  | ||||||
| 			else |  | ||||||
| 			{ |  | ||||||
| 				std::cout << "Failed to start boot sequence: " << effectName << std::endl; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// create XBMC video checker if the configuration is present | 	// create XBMC video checker if the configuration is present | ||||||
| @@ -216,7 +211,7 @@ int main(int argc, char** argv) | |||||||
| 	if (config.isMember("boblightServer")) | 	if (config.isMember("boblightServer")) | ||||||
| 	{ | 	{ | ||||||
| 		const Json::Value & boblightServerConfig = config["boblightServer"]; | 		const Json::Value & boblightServerConfig = config["boblightServer"]; | ||||||
| 		boblightServer = new BoblightServer(&hyperion, boblightServerConfig["port"].asUInt()); | 		boblightServer = new BoblightServer(&hyperion, boblightServerConfig.get("priority",900).asInt(), boblightServerConfig["port"].asUInt()); | ||||||
| 		std::cout << "Boblight server created and started on port " << boblightServer->getPort() << std::endl; | 		std::cout << "Boblight server created and started on port " << boblightServer->getPort() << std::endl; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -232,6 +227,7 @@ int main(int argc, char** argv) | |||||||
| 			frameGrabberConfig["width"].asUInt(), | 			frameGrabberConfig["width"].asUInt(), | ||||||
| 			frameGrabberConfig["height"].asUInt(), | 			frameGrabberConfig["height"].asUInt(), | ||||||
| 			frameGrabberConfig["frequency_Hz"].asUInt(), | 			frameGrabberConfig["frequency_Hz"].asUInt(), | ||||||
|  | 			frameGrabberConfig.get("priority",900).asInt(), | ||||||
| 			&hyperion); | 			&hyperion); | ||||||
|  |  | ||||||
| 		if (xbmcVideoChecker != nullptr) | 		if (xbmcVideoChecker != nullptr) | ||||||
| @@ -275,7 +271,7 @@ int main(int argc, char** argv) | |||||||
| 					grabberConfig.get("greenSignalThreshold", 0.0).asDouble(), | 					grabberConfig.get("greenSignalThreshold", 0.0).asDouble(), | ||||||
| 					grabberConfig.get("blueSignalThreshold", 0.0).asDouble(), | 					grabberConfig.get("blueSignalThreshold", 0.0).asDouble(), | ||||||
| 					&hyperion, | 					&hyperion, | ||||||
| 					grabberConfig.get("priority", 800).asInt()); | 					grabberConfig.get("priority", 900).asInt()); | ||||||
| 		v4l2Grabber->set3D(parse3DMode(grabberConfig.get("mode", "2D").asString())); | 		v4l2Grabber->set3D(parse3DMode(grabberConfig.get("mode", "2D").asString())); | ||||||
| 		v4l2Grabber->setCropping( | 		v4l2Grabber->setCropping( | ||||||
| 					grabberConfig.get("cropLeft", 0).asInt(), | 					grabberConfig.get("cropLeft", 0).asInt(), | ||||||
| @@ -308,6 +304,7 @@ int main(int argc, char** argv) | |||||||
| 			grabberConfig["width"].asUInt(), | 			grabberConfig["width"].asUInt(), | ||||||
| 			grabberConfig["height"].asUInt(), | 			grabberConfig["height"].asUInt(), | ||||||
| 			grabberConfig["frequency_Hz"].asUInt(), | 			grabberConfig["frequency_Hz"].asUInt(), | ||||||
|  | 			grabberConfig.get("priority",900).asInt(), | ||||||
| 			&hyperion); | 			&hyperion); | ||||||
|  |  | ||||||
| 		if (xbmcVideoChecker != nullptr) | 		if (xbmcVideoChecker != nullptr) | ||||||
| @@ -341,6 +338,7 @@ int main(int argc, char** argv) | |||||||
| 			grabberConfig["width"].asUInt(), | 			grabberConfig["width"].asUInt(), | ||||||
| 			grabberConfig["height"].asUInt(), | 			grabberConfig["height"].asUInt(), | ||||||
| 			grabberConfig["frequency_Hz"].asUInt(), | 			grabberConfig["frequency_Hz"].asUInt(), | ||||||
|  | 			grabberConfig.get("priority",900).asInt(), | ||||||
| 			&hyperion); | 			&hyperion); | ||||||
|  |  | ||||||
| 		if (xbmcVideoChecker != nullptr) | 		if (xbmcVideoChecker != nullptr) | ||||||
| @@ -376,11 +374,12 @@ int main(int argc, char** argv) | |||||||
| 	{ | 	{ | ||||||
| 		const Json::Value & grabberConfig = config.isMember("osxgrabber")? config["osxgrabber"] : config["framegrabber"]; | 		const Json::Value & grabberConfig = config.isMember("osxgrabber")? config["osxgrabber"] : config["framegrabber"]; | ||||||
| 		osxGrabber = new OsxWrapper( | 		osxGrabber = new OsxWrapper( | ||||||
| 										   grabberConfig.get("display", 0).asUInt(), | 									grabberConfig.get("display", 0).asUInt(), | ||||||
| 										   grabberConfig["width"].asUInt(), | 									grabberConfig["width"].asUInt(), | ||||||
| 										   grabberConfig["height"].asUInt(), | 									grabberConfig["height"].asUInt(), | ||||||
| 										   grabberConfig["frequency_Hz"].asUInt(), | 									grabberConfig["frequency_Hz"].asUInt(), | ||||||
| 										   &hyperion); | 									grabberConfig.get("priority",900).asInt(), | ||||||
|  | 									&hyperion ); | ||||||
|  |  | ||||||
| 		if (xbmcVideoChecker != nullptr) | 		if (xbmcVideoChecker != nullptr) | ||||||
| 		{ | 		{ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user