From c4eb7155921c344f20aa464a539f6bcda7f0e3e6 Mon Sep 17 00:00:00 2001 From: johan Date: Fri, 23 Aug 2013 20:44:53 +0200 Subject: [PATCH] XBMC video checker added --- include/xbmcvideochecker/XBMCVideoChecker.h | 43 ++++++++++++++ libsrc/CMakeLists.txt | 1 + libsrc/xbmcvideochecker/CMakeLists.txt | 29 ++++++++++ libsrc/xbmcvideochecker/XBMCVideoChecker.cpp | 59 ++++++++++++++++++++ src/hyperiond/CMakeLists.txt | 1 + src/hyperiond/hyperiond.cpp | 6 ++ 6 files changed, 139 insertions(+) create mode 100644 include/xbmcvideochecker/XBMCVideoChecker.h create mode 100644 libsrc/xbmcvideochecker/CMakeLists.txt create mode 100644 libsrc/xbmcvideochecker/XBMCVideoChecker.cpp diff --git a/include/xbmcvideochecker/XBMCVideoChecker.h b/include/xbmcvideochecker/XBMCVideoChecker.h new file mode 100644 index 00000000..61e7ac19 --- /dev/null +++ b/include/xbmcvideochecker/XBMCVideoChecker.h @@ -0,0 +1,43 @@ + +#pragma once + +// system includes +#include +#include + +// QT includes +#include +#include +#include +#include +#include + +// Hyperion includes +#include + +class XBMCVideoChecker : public QObject +{ +Q_OBJECT + +public: + XBMCVideoChecker(QString address, uint64_t interval, Hyperion * hyperion, int priority); + + void start(); + +private slots: + void sendRequest(); + + void receiveReply(QNetworkReply * reply); + +private: + QTimer _timer; + + QNetworkAccessManager _networkManager; + + QNetworkRequest _request; + + Hyperion * _hyperion; + + int _priority; +}; + diff --git a/libsrc/CMakeLists.txt b/libsrc/CMakeLists.txt index 02094d61..af63b296 100644 --- a/libsrc/CMakeLists.txt +++ b/libsrc/CMakeLists.txt @@ -8,3 +8,4 @@ add_subdirectory(dispmanx-grabber) add_subdirectory(hyperion) add_subdirectory(jsonserver) add_subdirectory(utils) +add_subdirectory(xbmcvideochecker) diff --git a/libsrc/xbmcvideochecker/CMakeLists.txt b/libsrc/xbmcvideochecker/CMakeLists.txt new file mode 100644 index 00000000..77ee2f34 --- /dev/null +++ b/libsrc/xbmcvideochecker/CMakeLists.txt @@ -0,0 +1,29 @@ + +# Define the current source locations +SET(CURRENT_HEADER_DIR ${CMAKE_SOURCE_DIR}/include/xbmcvideochecker) +SET(CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/libsrc/xbmcvideochecker) + +# Group the headers that go through the MOC compiler +SET(XBMCVideoChecker_QT_HEADERS + ${CURRENT_HEADER_DIR}/XBMCVideoChecker.h +) + +SET(XBMCVideoChecker_HEADERS +) + +SET(XBMCVideoChecker_SOURCES + ${CURRENT_SOURCE_DIR}/XBMCVideoChecker.cpp +) + +QT4_WRAP_CPP(XBMCVideoChecker_HEADERS_MOC ${XBMCVideoChecker_QT_HEADERS}) + +add_library(xbmcvideochecker + ${XBMCVideoChecker_HEADERS} + ${XBMCVideoChecker_QT_HEADERS} + ${XBMCVideoChecker_HEADERS_MOC} + ${XBMCVideoChecker_SOURCES} +) + +target_link_libraries(xbmcvideochecker + hyperion + ${QT_LIBRARIES}) diff --git a/libsrc/xbmcvideochecker/XBMCVideoChecker.cpp b/libsrc/xbmcvideochecker/XBMCVideoChecker.cpp new file mode 100644 index 00000000..2d4a16bf --- /dev/null +++ b/libsrc/xbmcvideochecker/XBMCVideoChecker.cpp @@ -0,0 +1,59 @@ +// Qt includes +#include + +#include + +XBMCVideoChecker::XBMCVideoChecker(QString address, uint64_t interval_ms, Hyperion * hyperion, int priority) : + QObject(), + _timer(), + _networkManager(), + _request(QUrl(QString("http://%1/jsonrpc?request={\"jsonrpc\":\"2.0\",\"method\":\"Player.GetActivePlayers\",\"id\":1}").arg(address))), + _hyperion(hyperion), + _priority(priority) +{ + // setup timer + _timer.setSingleShot(false); + _timer.setInterval(interval_ms); + connect(&_timer, SIGNAL(timeout()), this, SLOT(sendRequest())); + + //setup network manager + connect(&_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(receiveReply(QNetworkReply*))); +} + +void XBMCVideoChecker::start() +{ + _timer.start(); +} + +void XBMCVideoChecker::sendRequest() +{ + _networkManager.get(_request); +} + +void XBMCVideoChecker::receiveReply(QNetworkReply * reply) +{ + if (reply->error() != QNetworkReply::NoError) + { + std::cerr << "Error while requesting XBMC video info: " << reply->errorString().toStdString() << std::endl; + } + else + { + const QString jsonReply(reply->readAll()); + if (jsonReply.contains("playerid")) + { + // something is playing. check for "video" to check if a video is playing + // clear our priority channel to allow the grabbed vido colors to be shown + _hyperion->clear(_priority); + } + else + { + // Nothing is playing. set our priority channel completely to black + // The timeout is used to have the channel cleared after 30 seconds of connection problems... + _hyperion->setColor(_priority, RgbColor::BLACK, 30000); + } + } + + // close reply + reply->close(); +} + diff --git a/src/hyperiond/CMakeLists.txt b/src/hyperiond/CMakeLists.txt index 3dbde26b..92f7d83b 100644 --- a/src/hyperiond/CMakeLists.txt +++ b/src/hyperiond/CMakeLists.txt @@ -6,4 +6,5 @@ target_link_libraries(hyperiond bootsequence hyperion dispmanx-grabber + xbmcvideochecker jsonserver) diff --git a/src/hyperiond/hyperiond.cpp b/src/hyperiond/hyperiond.cpp index 83aed771..dc42115e 100644 --- a/src/hyperiond/hyperiond.cpp +++ b/src/hyperiond/hyperiond.cpp @@ -15,6 +15,9 @@ // Dispmanx grabber includes #include +// XBMC Video checker includes +#include + // JsonServer includes #include @@ -48,6 +51,9 @@ int main(int argc, char** argv) RainbowBootSequence bootSequence(&hyperion); bootSequence.start(); + XBMCVideoChecker xbmcVideoChecker("127.0.0.1", 1000, &hyperion, 127); + xbmcVideoChecker.start(); + DispmanxWrapper dispmanx(64, 64, 10, &hyperion); dispmanx.start(); std::cout << "Frame grabber created and started" << std::endl;