mirror of
				https://github.com/hyperion-project/hyperion.ng.git
				synced 2025-03-01 10:33:28 +00:00 
			
		
		
		
	Merge branch 'master' into support_for_philips_hue
Former-commit-id: ee3816fde708fa2f9f9e6ad50ec1e6d2ff552b23
This commit is contained in:
		@@ -34,13 +34,13 @@ fi
 | 
			
		||||
echo 'Downloading hyperion'
 | 
			
		||||
if [ $IS_OPENELEC -eq 1 ]; then
 | 
			
		||||
	# OpenELEC has a readonly file system. Use alternative location
 | 
			
		||||
	curl --get https://raw.github.com/tvdzwan/hyperion/master/deploy/hyperion.tar.gz | tar -C /storage -xz
 | 
			
		||||
	curl --get https://raw.github.com/tvdzwan/hyperion/master/deploy/hyperion.deps.openelec-rpi.tar.gz | tar -C /storage/hyperion/bin -xz
 | 
			
		||||
	curl -L --get https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion.tar.gz | tar -C /storage -xz
 | 
			
		||||
	curl -L --get https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion.deps.openelec-rpi.tar.gz | 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
 | 
			
		||||
else
 | 
			
		||||
	wget https://raw.github.com/tvdzwan/hyperion/master/deploy/hyperion.tar.gz -O - | tar -C /opt -xz
 | 
			
		||||
	wget https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion.tar.gz -O - | tar -C /opt -xz
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# create links to the binaries
 | 
			
		||||
@@ -68,9 +68,9 @@ fi
 | 
			
		||||
if [ $USE_INITCTL -eq 1 ]; then
 | 
			
		||||
	echo 'Installing initctl script'
 | 
			
		||||
	if [ $IS_RASPBMC -eq 1 ]; then
 | 
			
		||||
		wget -N https://raw.github.com/tvdzwan/hyperion/master/deploy/hyperion.conf -P /etc/init/
 | 
			
		||||
		wget -N https://raw.githubusercontent.com/tvdzwan/hyperion/master/deploy/hyperion.conf -P /etc/init/
 | 
			
		||||
	else
 | 
			
		||||
		wget -N https://raw.github.com/tvdzwan/hyperion/master/deploy/hyperion.xbian.conf -O /etc/init/hyperion.conf
 | 
			
		||||
		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'
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
d61b685eca164580cb39eb5bc3cf65b89afad410
 | 
			
		||||
e3e4ea5204c555e64aa909d5bbbd6ac95ebec0dc
 | 
			
		||||
@@ -37,6 +37,9 @@ public:
 | 
			
		||||
	///
 | 
			
		||||
	void setSize(const unsigned width, const unsigned height);
 | 
			
		||||
 | 
			
		||||
	/// Enable or disable the black border detector
 | 
			
		||||
	void enableBalckBorderDetector(bool enable);
 | 
			
		||||
 | 
			
		||||
	///
 | 
			
		||||
	/// Processes the image to a list of led colors. This will update the size of the buffer-image
 | 
			
		||||
	/// if required and call the image-to-leds mapping to determine the mean color per led.
 | 
			
		||||
@@ -142,7 +145,7 @@ private:
 | 
			
		||||
	const LedString _ledString;
 | 
			
		||||
 | 
			
		||||
	/// Flag the enables(true)/disabled(false) blackborder detector
 | 
			
		||||
	const bool _enableBlackBorderRemoval;
 | 
			
		||||
	bool _enableBlackBorderRemoval;
 | 
			
		||||
 | 
			
		||||
	/// The processor for black border detection
 | 
			
		||||
	hyperion::BlackBorderProcessor * _borderProcessor;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								include/utils/Sleep.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								include/utils/Sleep.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <QThread>
 | 
			
		||||
 | 
			
		||||
class Sleep : protected QThread {
 | 
			
		||||
public:
 | 
			
		||||
   static inline void msleep(unsigned long msecs) {
 | 
			
		||||
	   QThread::msleep(msecs);
 | 
			
		||||
   }
 | 
			
		||||
};
 | 
			
		||||
@@ -38,7 +38,7 @@ public:
 | 
			
		||||
	/// @param grabPhoto Whether or not to grab when the XBMC photo player is playing
 | 
			
		||||
	/// @param grabAudio Whether or not to grab when the XBMC audio player is playing
 | 
			
		||||
	/// @param grabMenu Whether or not to grab when nothing is playing (in XBMC menu)
 | 
			
		||||
	/// @param grabScreensaver 	Whether or not to grab when the XBMC screensaver is activated
 | 
			
		||||
	/// @param grabScreensaver Whether or not to grab when the XBMC screensaver is activated
 | 
			
		||||
	/// @param enable3DDetection Wheter or not to enable the detection of 3D movies playing
 | 
			
		||||
	///
 | 
			
		||||
	XBMCVideoChecker(const std::string & address, uint16_t port, bool grabVideo, bool grabPhoto, bool grabAudio, bool grabMenu, bool grabScreensaver, bool enable3DDetection);
 | 
			
		||||
@@ -96,6 +96,12 @@ private:
 | 
			
		||||
	/// The JSON-RPC message to check the screensaver
 | 
			
		||||
	const QString _checkScreensaverRequest;
 | 
			
		||||
 | 
			
		||||
	/// The JSON-RPC message to check the active stereoscopicmode
 | 
			
		||||
	const QString _getStereoscopicMode;
 | 
			
		||||
 | 
			
		||||
	/// The JSON-RPC message to check the xbmc version
 | 
			
		||||
	const QString _getXbmcVersion;
 | 
			
		||||
 | 
			
		||||
	/// The QT TCP Socket with connection to XBMC
 | 
			
		||||
	QTcpSocket _socket;
 | 
			
		||||
 | 
			
		||||
@@ -111,7 +117,7 @@ private:
 | 
			
		||||
	/// Flag indicating whether or not to grab when XBMC is playing nothing (in menu)
 | 
			
		||||
	const bool _grabMenu;
 | 
			
		||||
 | 
			
		||||
	/// Flag inidcating whether or not to grab when the XBMC screensaver is activated
 | 
			
		||||
	/// Flag indicating whether or not to grab when the XBMC screensaver is activated
 | 
			
		||||
	const bool _grabScreensaver;
 | 
			
		||||
 | 
			
		||||
	/// Flag indicating wheter or not to enable the detection of 3D movies playing
 | 
			
		||||
@@ -125,4 +131,7 @@ private:
 | 
			
		||||
 | 
			
		||||
	/// Previous emitted video mode
 | 
			
		||||
	VideoMode _previousVideoMode;
 | 
			
		||||
 | 
			
		||||
	/// XBMC version number
 | 
			
		||||
	int _xbmcVersion;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,9 @@ Effect::Effect(PyThreadState * mainThreadState, int priority, int timeout, const
 | 
			
		||||
{
 | 
			
		||||
	_colors.resize(_imageProcessor->getLedCount(), ColorRgb::BLACK);
 | 
			
		||||
 | 
			
		||||
	// disable the black border detector for effects
 | 
			
		||||
	_imageProcessor->enableBalckBorderDetector(false);
 | 
			
		||||
 | 
			
		||||
	// connect the finished signal
 | 
			
		||||
	connect(this, SIGNAL(finished()), this, SLOT(effectFinished()));
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -43,6 +43,11 @@ void ImageProcessor::setSize(const unsigned width, const unsigned height)
 | 
			
		||||
	_imageToLeds = new ImageToLedsMap(width, height, 0, 0, _ledString.leds());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ImageProcessor::enableBalckBorderDetector(bool enable)
 | 
			
		||||
{
 | 
			
		||||
	_enableBlackBorderRemoval = enable;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ImageProcessor::getScanParameters(size_t led, double &hscanBegin, double &hscanEnd, double &vscanBegin, double &vscanEnd) const
 | 
			
		||||
{
 | 
			
		||||
	if (led < _ledString.leds().size())
 | 
			
		||||
 
 | 
			
		||||
@@ -35,15 +35,16 @@ ImageToLedsMap::ImageToLedsMap(
 | 
			
		||||
		// skip leds without area
 | 
			
		||||
		if ((led.maxX_frac-led.minX_frac) < 1e-6 || (led.maxY_frac-led.minY_frac) < 1e-6)
 | 
			
		||||
		{
 | 
			
		||||
			mColorsMap.emplace_back();
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		// Compute the index boundaries for this led
 | 
			
		||||
		unsigned minX_idx = xOffset + unsigned(std::round(actualWidth  * led.minX_frac));
 | 
			
		||||
		unsigned maxX_idx = xOffset + unsigned(std::round(actualWidth  * led.maxX_frac));
 | 
			
		||||
		unsigned minY_idx = yOffset + unsigned(std::round(actualHeight * led.minY_frac));
 | 
			
		||||
		unsigned maxY_idx = yOffset + unsigned(std::round(actualHeight * led.maxY_frac));
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		// make sure that the area is at least a single led large
 | 
			
		||||
		minX_idx = std::min(minX_idx, xOffset + actualWidth - 1);
 | 
			
		||||
		if (minX_idx == maxX_idx)
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ include_directories(
 | 
			
		||||
 | 
			
		||||
# Group the headers that go through the MOC compiler
 | 
			
		||||
SET(Leddevice_QT_HEADERS
 | 
			
		||||
		${CURRENT_SOURCE_DIR}/LedRs232Device.h
 | 
			
		||||
		${CURRENT_SOURCE_DIR}/LedDeviceAdalight.h
 | 
			
		||||
		${CURRENT_SOURCE_DIR}/LedDevicePhilipsHue.h
 | 
			
		||||
)
 | 
			
		||||
@@ -21,8 +22,6 @@ SET(Leddevice_HEADERS
 | 
			
		||||
		${CURRENT_HEADER_DIR}/LedDevice.h
 | 
			
		||||
		${CURRENT_HEADER_DIR}/LedDeviceFactory.h
 | 
			
		||||
 | 
			
		||||
		${CURRENT_SOURCE_DIR}/LedRs232Device.h
 | 
			
		||||
 | 
			
		||||
		${CURRENT_SOURCE_DIR}/LedDeviceLightpack.h
 | 
			
		||||
		${CURRENT_SOURCE_DIR}/LedDeviceMultiLightpack.h
 | 
			
		||||
		${CURRENT_SOURCE_DIR}/LedDevicePaintpack.h
 | 
			
		||||
 
 | 
			
		||||
@@ -11,8 +11,8 @@
 | 
			
		||||
// hyperion local includes
 | 
			
		||||
#include "LedDeviceAdalight.h"
 | 
			
		||||
 | 
			
		||||
LedDeviceAdalight::LedDeviceAdalight(const std::string& outputDevice, const unsigned baudrate) :
 | 
			
		||||
	LedRs232Device(outputDevice, baudrate),
 | 
			
		||||
LedDeviceAdalight::LedDeviceAdalight(const std::string& outputDevice, const unsigned baudrate, int delayAfterConnect_ms) :
 | 
			
		||||
	LedRs232Device(outputDevice, baudrate, delayAfterConnect_ms),
 | 
			
		||||
	_ledBuffer(0),
 | 
			
		||||
	_timer()
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
///
 | 
			
		||||
/// Implementation of the LedDevice interface for writing to an Adalight led device.
 | 
			
		||||
///
 | 
			
		||||
class LedDeviceAdalight : public QObject, public LedRs232Device
 | 
			
		||||
class LedDeviceAdalight : public LedRs232Device
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
 | 
			
		||||
@@ -23,7 +23,7 @@ public:
 | 
			
		||||
	/// @param outputDevice The name of the output device (eg '/dev/ttyS0')
 | 
			
		||||
	/// @param baudrate The used baudrate for writing to the output device
 | 
			
		||||
	///
 | 
			
		||||
	LedDeviceAdalight(const std::string& outputDevice, const unsigned baudrate);
 | 
			
		||||
	LedDeviceAdalight(const std::string& outputDevice, const unsigned baudrate, int delayAfterConnect_ms);
 | 
			
		||||
 | 
			
		||||
	///
 | 
			
		||||
	/// Writes the led color values to the led-device
 | 
			
		||||
 
 | 
			
		||||
@@ -43,8 +43,9 @@ LedDevice * LedDeviceFactory::construct(const Json::Value & deviceConfig)
 | 
			
		||||
	{
 | 
			
		||||
		const std::string output = deviceConfig["output"].asString();
 | 
			
		||||
		const unsigned rate      = deviceConfig["rate"].asInt();
 | 
			
		||||
		const int delay_ms       = deviceConfig["delayAfterConnect"].asInt();
 | 
			
		||||
 | 
			
		||||
		LedDeviceAdalight* deviceAdalight = new LedDeviceAdalight(output, rate);
 | 
			
		||||
		LedDeviceAdalight* deviceAdalight = new LedDeviceAdalight(output, rate, delay_ms);
 | 
			
		||||
		deviceAdalight->open();
 | 
			
		||||
 | 
			
		||||
		device = deviceAdalight;
 | 
			
		||||
 
 | 
			
		||||
@@ -14,11 +14,13 @@
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Implementation for the Philips Hue system.
 | 
			
		||||
 * 
 | 
			
		||||
 *
 | 
			
		||||
 * To use set the device to "philipshue".
 | 
			
		||||
 * Uses the official Philips Hue API (http://developers.meethue.com).
 | 
			
		||||
 * Framegrabber must be limited to 10 Hz / numer of lights to avoid rate limitation by the hue bridge.
 | 
			
		||||
 * Create a new API user name "newdeveloper" on the bridge (http://developers.meethue.com/gettingstarted.html)
 | 
			
		||||
 *
 | 
			
		||||
 * @author ntim (github)
 | 
			
		||||
 */
 | 
			
		||||
class LedDevicePhilipsHue: public QObject, public LedDevice {
 | 
			
		||||
Q_OBJECT
 | 
			
		||||
 
 | 
			
		||||
@@ -4,17 +4,21 @@
 | 
			
		||||
#include <cstdio>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
// Qt includes
 | 
			
		||||
#include <QTimer>
 | 
			
		||||
 | 
			
		||||
// Serial includes
 | 
			
		||||
#include <serial/serial.h>
 | 
			
		||||
 | 
			
		||||
// Local Hyperion includes
 | 
			
		||||
#include "LedRs232Device.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
LedRs232Device::LedRs232Device(const std::string& outputDevice, const unsigned baudrate) :
 | 
			
		||||
	mDeviceName(outputDevice),
 | 
			
		||||
	mBaudRate_Hz(baudrate),
 | 
			
		||||
	_rs232Port()
 | 
			
		||||
LedRs232Device::LedRs232Device(const std::string& outputDevice, const unsigned baudrate, int delayAfterConnect_ms) :
 | 
			
		||||
	_deviceName(outputDevice),
 | 
			
		||||
	_baudRate_Hz(baudrate),
 | 
			
		||||
	_delayAfterConnect_ms(delayAfterConnect_ms),
 | 
			
		||||
	_rs232Port(),
 | 
			
		||||
	_blockedForDelay(false)
 | 
			
		||||
{
 | 
			
		||||
	// empty
 | 
			
		||||
}
 | 
			
		||||
@@ -31,10 +35,17 @@ int LedRs232Device::open()
 | 
			
		||||
{
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		std::cout << "Opening UART: " << mDeviceName << std::endl;
 | 
			
		||||
		_rs232Port.setPort(mDeviceName);
 | 
			
		||||
		_rs232Port.setBaudrate(mBaudRate_Hz);
 | 
			
		||||
		std::cout << "Opening UART: " << _deviceName << std::endl;
 | 
			
		||||
		_rs232Port.setPort(_deviceName);
 | 
			
		||||
		_rs232Port.setBaudrate(_baudRate_Hz);
 | 
			
		||||
		_rs232Port.open();
 | 
			
		||||
 | 
			
		||||
		if (_delayAfterConnect_ms > 0)
 | 
			
		||||
		{
 | 
			
		||||
			_blockedForDelay = true;
 | 
			
		||||
			QTimer::singleShot(_delayAfterConnect_ms, this, SLOT(unblockAfterDelay()));
 | 
			
		||||
			std::cout << "Device blocked for " << _delayAfterConnect_ms << " ms" << std::endl;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	catch (const std::exception& e)
 | 
			
		||||
	{
 | 
			
		||||
@@ -47,6 +58,11 @@ int LedRs232Device::open()
 | 
			
		||||
 | 
			
		||||
int LedRs232Device::writeBytes(const unsigned size, const uint8_t * data)
 | 
			
		||||
{
 | 
			
		||||
	if (_blockedForDelay)
 | 
			
		||||
	{
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!_rs232Port.isOpen())
 | 
			
		||||
	{
 | 
			
		||||
		return -1;
 | 
			
		||||
@@ -95,3 +111,9 @@ int LedRs232Device::writeBytes(const unsigned size, const uint8_t * data)
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void LedRs232Device::unblockAfterDelay()
 | 
			
		||||
{
 | 
			
		||||
	std::cout << "Device unblocked" << std::endl;
 | 
			
		||||
	_blockedForDelay = false;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <QObject>
 | 
			
		||||
 | 
			
		||||
// Serial includes
 | 
			
		||||
#include <serial/serial.h>
 | 
			
		||||
 | 
			
		||||
@@ -9,8 +11,10 @@
 | 
			
		||||
///
 | 
			
		||||
/// The LedRs232Device implements an abstract base-class for LedDevices using a RS232-device.
 | 
			
		||||
///
 | 
			
		||||
class LedRs232Device : public LedDevice
 | 
			
		||||
class LedRs232Device : public QObject, public LedDevice
 | 
			
		||||
{
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	///
 | 
			
		||||
	/// Constructs the LedDevice attached to a RS232-device
 | 
			
		||||
@@ -18,7 +22,7 @@ public:
 | 
			
		||||
	/// @param[in] outputDevice The name of the output device (eg '/etc/ttyS0')
 | 
			
		||||
	/// @param[in] baudrate The used baudrate for writing to the output device
 | 
			
		||||
	///
 | 
			
		||||
	LedRs232Device(const std::string& outputDevice, const unsigned baudrate);
 | 
			
		||||
	LedRs232Device(const std::string& outputDevice, const unsigned baudrate, int delayAfterConnect_ms = 0);
 | 
			
		||||
 | 
			
		||||
	///
 | 
			
		||||
	/// Destructor of the LedDevice; closes the output device if it is open
 | 
			
		||||
@@ -43,12 +47,22 @@ protected:
 | 
			
		||||
	 */
 | 
			
		||||
	int writeBytes(const unsigned size, const uint8_t *data);
 | 
			
		||||
 | 
			
		||||
private slots:
 | 
			
		||||
	/// Unblock the device after a connection delay
 | 
			
		||||
	void unblockAfterDelay();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	/// The name of the output device
 | 
			
		||||
	const std::string mDeviceName;
 | 
			
		||||
	const std::string _deviceName;
 | 
			
		||||
 | 
			
		||||
	/// The used baudrate of the output device
 | 
			
		||||
	const int mBaudRate_Hz;
 | 
			
		||||
	const int _baudRate_Hz;
 | 
			
		||||
 | 
			
		||||
	/// Sleep after the connect before continuing
 | 
			
		||||
	const int _delayAfterConnect_ms;
 | 
			
		||||
 | 
			
		||||
	/// The RS232 serial-device
 | 
			
		||||
	serial::Serial _rs232Port;
 | 
			
		||||
 | 
			
		||||
	bool _blockedForDelay;
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ add_library(hyperion-utils
 | 
			
		||||
		${CURRENT_HEADER_DIR}/ColorRgba.h
 | 
			
		||||
		${CURRENT_SOURCE_DIR}/ColorRgba.cpp
 | 
			
		||||
		${CURRENT_HEADER_DIR}/Image.h
 | 
			
		||||
		${CURRENT_HEADER_DIR}/Sleep.h
 | 
			
		||||
 | 
			
		||||
		${CURRENT_HEADER_DIR}/HsvTransform.h
 | 
			
		||||
		${CURRENT_SOURCE_DIR}/HsvTransform.cpp
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,10 @@
 | 
			
		||||
// {"id":668,"jsonrpc":"2.0","method":"XBMC.GetInfoBooleans","params":{"booleans":["System.ScreenSaverActive"]}}
 | 
			
		||||
// {"id":668,"jsonrpc":"2.0","result":{"System.ScreenSaverActive":false}}
 | 
			
		||||
 | 
			
		||||
// Request stereoscopicmode example:
 | 
			
		||||
// {"jsonrpc":"2.0","method":"GUI.GetProperties","params":{"properties":["stereoscopicmode"]},"id":669}
 | 
			
		||||
// {"id":669,"jsonrpc":"2.0","result":{"stereoscopicmode":{"label":"Nebeneinander","mode":"split_vertical"}}}
 | 
			
		||||
 | 
			
		||||
XBMCVideoChecker::XBMCVideoChecker(const std::string & address, uint16_t port, bool grabVideo, bool grabPhoto, bool grabAudio, bool grabMenu, bool grabScreensaver, bool enable3DDetection) :
 | 
			
		||||
	QObject(),
 | 
			
		||||
	_address(QString::fromStdString(address)),
 | 
			
		||||
@@ -24,6 +28,8 @@ XBMCVideoChecker::XBMCVideoChecker(const std::string & address, uint16_t port, b
 | 
			
		||||
	_activePlayerRequest(R"({"id":666,"jsonrpc":"2.0","method":"Player.GetActivePlayers"})"),
 | 
			
		||||
	_currentPlayingItemRequest(R"({"id":667,"jsonrpc":"2.0","method":"Player.GetItem","params":{"playerid":%1,"properties":["file"]}})"),
 | 
			
		||||
	_checkScreensaverRequest(R"({"id":668,"jsonrpc":"2.0","method":"XBMC.GetInfoBooleans","params":{"booleans":["System.ScreenSaverActive"]}})"),
 | 
			
		||||
	_getStereoscopicMode(R"({"jsonrpc":"2.0","method":"GUI.GetProperties","params":{"properties":["stereoscopicmode"]},"id":669})"),
 | 
			
		||||
	_getXbmcVersion(R"({"jsonrpc":"2.0","method":"Application.GetProperties","params":{"properties":["version"]},"id":670})"),
 | 
			
		||||
	_socket(),
 | 
			
		||||
	_grabVideo(grabVideo),
 | 
			
		||||
	_grabPhoto(grabPhoto),
 | 
			
		||||
@@ -33,7 +39,8 @@ XBMCVideoChecker::XBMCVideoChecker(const std::string & address, uint16_t port, b
 | 
			
		||||
	_enable3DDetection(enable3DDetection),
 | 
			
		||||
	_previousScreensaverMode(false),
 | 
			
		||||
	_previousGrabbingMode(GRABBINGMODE_INVALID),
 | 
			
		||||
	_previousVideoMode(VIDEO_2D)
 | 
			
		||||
	_previousVideoMode(VIDEO_2D),
 | 
			
		||||
	_xbmcVersion(0)
 | 
			
		||||
{
 | 
			
		||||
	// setup socket
 | 
			
		||||
	connect(&_socket, SIGNAL(readyRead()), this, SLOT(receiveReply()));
 | 
			
		||||
@@ -116,24 +123,32 @@ void XBMCVideoChecker::receiveReply()
 | 
			
		||||
	}
 | 
			
		||||
	else if (reply.contains("\"id\":667"))
 | 
			
		||||
	{
 | 
			
		||||
		// result of Player.GetItem
 | 
			
		||||
		// TODO: what if the filename contains a '"'. In Json this should have been escaped
 | 
			
		||||
		QRegExp regex("\"file\":\"((?!\").)*\"");
 | 
			
		||||
		int pos = regex.indexIn(reply);
 | 
			
		||||
		if (pos > 0)
 | 
			
		||||
		if (_xbmcVersion >= 13)
 | 
			
		||||
		{
 | 
			
		||||
			QStringRef filename = QStringRef(&reply, pos+8, regex.matchedLength()-9);
 | 
			
		||||
			if (filename.contains("3DSBS", Qt::CaseInsensitive) || filename.contains("HSBS", Qt::CaseInsensitive))
 | 
			
		||||
			// check of active stereoscopicmode
 | 
			
		||||
			_socket.write(_getStereoscopicMode.toUtf8());
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			// result of Player.GetItem
 | 
			
		||||
			// TODO: what if the filename contains a '"'. In Json this should have been escaped
 | 
			
		||||
			QRegExp regex("\"file\":\"((?!\").)*\"");
 | 
			
		||||
			int pos = regex.indexIn(reply);
 | 
			
		||||
			if (pos > 0)
 | 
			
		||||
			{
 | 
			
		||||
				setVideoMode(VIDEO_3DSBS);
 | 
			
		||||
			}
 | 
			
		||||
			else if (filename.contains("3DTAB", Qt::CaseInsensitive) || filename.contains("HTAB", Qt::CaseInsensitive))
 | 
			
		||||
			{
 | 
			
		||||
				setVideoMode(VIDEO_3DTAB);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				setVideoMode(VIDEO_2D);
 | 
			
		||||
				QStringRef filename = QStringRef(&reply, pos+8, regex.matchedLength()-9);
 | 
			
		||||
				if (filename.contains("3DSBS", Qt::CaseInsensitive) || filename.contains("HSBS", Qt::CaseInsensitive))
 | 
			
		||||
				{
 | 
			
		||||
					setVideoMode(VIDEO_3DSBS);
 | 
			
		||||
				}
 | 
			
		||||
				else if (filename.contains("3DTAB", Qt::CaseInsensitive) || filename.contains("HTAB", Qt::CaseInsensitive))
 | 
			
		||||
				{
 | 
			
		||||
					setVideoMode(VIDEO_3DTAB);
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					setVideoMode(VIDEO_2D);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -142,6 +157,41 @@ void XBMCVideoChecker::receiveReply()
 | 
			
		||||
		// result of System.ScreenSaverActive
 | 
			
		||||
		bool active = reply.contains("\"System.ScreenSaverActive\":true");
 | 
			
		||||
		setScreensaverMode(!_grabScreensaver && active);
 | 
			
		||||
 | 
			
		||||
		// check here xbmc version
 | 
			
		||||
		if (_socket.state() == QTcpSocket::ConnectedState)
 | 
			
		||||
		{
 | 
			
		||||
			if (_xbmcVersion == 0)
 | 
			
		||||
			{
 | 
			
		||||
				_socket.write(_getXbmcVersion.toUtf8());
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if (reply.contains("\"id\":669"))
 | 
			
		||||
	{
 | 
			
		||||
		QRegExp regex("\"mode\":\"(split_vertical|split_horizontal)\"");
 | 
			
		||||
		int pos = regex.indexIn(reply);
 | 
			
		||||
		if (pos > 0)
 | 
			
		||||
		{
 | 
			
		||||
			QString sMode = regex.cap(1);
 | 
			
		||||
			if (sMode == "split_vertical")
 | 
			
		||||
			{
 | 
			
		||||
				setVideoMode(VIDEO_3DSBS);
 | 
			
		||||
			}
 | 
			
		||||
			else if (sMode == "split_horizontal")
 | 
			
		||||
			{
 | 
			
		||||
				setVideoMode(VIDEO_3DTAB);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if (reply.contains("\"id\":670"))
 | 
			
		||||
	{
 | 
			
		||||
		QRegExp regex("\"major\":(\\d+)");
 | 
			
		||||
		int pos = regex.indexIn(reply);
 | 
			
		||||
		if (pos > 0)
 | 
			
		||||
		{
 | 
			
		||||
			_xbmcVersion = regex.cap(1).toInt();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -112,14 +112,31 @@ int main(int argc, char** argv)
 | 
			
		||||
		const std::string effectName = effectConfig["effect"].asString();
 | 
			
		||||
		const unsigned duration_ms   = effectConfig["duration_ms"].asUInt();
 | 
			
		||||
		const int priority = 0;
 | 
			
		||||
 | 
			
		||||
		if (hyperion.setEffect(effectName, priority, duration_ms) == 0)
 | 
			
		||||
		
 | 
			
		||||
		if (effectConfig.isMember("args"))
 | 
			
		||||
		{
 | 
			
		||||
			std::cout << "Boot sequence(" << effectName << ") created and started" << std::endl;
 | 
			
		||||
			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
 | 
			
		||||
		{
 | 
			
		||||
			std::cout << "Failed to start boot sequence: " << effectName << std::endl;
 | 
			
		||||
 | 
			
		||||
			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;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user