refactor: Address (Windows) compile warnings (#840)

* Windows compile errors and (Qt 5.15 deprecation) warnings

* Usability - Enable/Disable Instance button

Co-authored-by: brindosch <edeltraud70@gmx.de>
This commit is contained in:
LordGrey 2020-06-28 23:05:32 +02:00 committed by GitHub
parent e365a2839d
commit bfb50b8d91
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
61 changed files with 530 additions and 365 deletions

View File

@ -52,8 +52,8 @@
"dashboard_infobox_message_updatesuccess": "Spusťte nejnovější verzi Hyperionu.", "dashboard_infobox_message_updatesuccess": "Spusťte nejnovější verzi Hyperionu.",
"dashboard_infobox_label_statush": "Stav Hyperionu:", "dashboard_infobox_label_statush": "Stav Hyperionu:",
"dashboard_infobox_label_smartacc": "Inteligentní přístup", "dashboard_infobox_label_smartacc": "Inteligentní přístup",
"dashboard_infobox_label_enableh": "Zapnout Hyperion", "dashboard_infobox_label_enableh": "Povolit Instance: $1",
"dashboard_infobox_label_disableh": "Vypnout Hyperion", "dashboard_infobox_label_disableh": "Vypnout Instance $1",
"dashboard_componentbox_label_title": "Stav komponent", "dashboard_componentbox_label_title": "Stav komponent",
"dashboard_componentbox_label_comp": "Komponenty", "dashboard_componentbox_label_comp": "Komponenty",
"dashboard_componentbox_label_status": "Status", "dashboard_componentbox_label_status": "Status",

View File

@ -68,8 +68,8 @@
"dashboard_infobox_message_updatesuccess": "Du nutzt die aktuellste Version von Hyperion.", "dashboard_infobox_message_updatesuccess": "Du nutzt die aktuellste Version von Hyperion.",
"dashboard_infobox_label_statush": "Hyperion Status:", "dashboard_infobox_label_statush": "Hyperion Status:",
"dashboard_infobox_label_smartacc": "Schnellzugriff", "dashboard_infobox_label_smartacc": "Schnellzugriff",
"dashboard_infobox_label_enableh": "Aktiviere Hyperion", "dashboard_infobox_label_enableh" : "Aktiviere Instanz: $1",
"dashboard_infobox_label_disableh": "Deaktiviere Hyperion", "dashboard_infobox_label_disableh" : "Deaktiviere Instanz: $1",
"dashboard_componentbox_label_title": "Komponenten Status", "dashboard_componentbox_label_title": "Komponenten Status",
"dashboard_componentbox_label_comp": "Komponente", "dashboard_componentbox_label_comp": "Komponente",
"dashboard_componentbox_label_status": "Status", "dashboard_componentbox_label_status": "Status",

View File

@ -68,8 +68,8 @@
"dashboard_infobox_message_updatesuccess" : "You run the latest version of Hyperion.", "dashboard_infobox_message_updatesuccess" : "You run the latest version of Hyperion.",
"dashboard_infobox_label_statush" : "Hyperion status:", "dashboard_infobox_label_statush" : "Hyperion status:",
"dashboard_infobox_label_smartacc" : "Smart Access", "dashboard_infobox_label_smartacc" : "Smart Access",
"dashboard_infobox_label_enableh" : "Enable Hyperion", "dashboard_infobox_label_enableh" : "Enable Instance: $1",
"dashboard_infobox_label_disableh" : "Disable Hyperion", "dashboard_infobox_label_disableh" : "Disable Instance: $1",
"dashboard_componentbox_label_title" : "Components status", "dashboard_componentbox_label_title" : "Components status",
"dashboard_componentbox_label_comp" : "Component", "dashboard_componentbox_label_comp" : "Component",
"dashboard_componentbox_label_status" : "Status", "dashboard_componentbox_label_status" : "Status",

View File

@ -52,8 +52,8 @@
"dashboard_infobox_message_updatesuccess": "Ejecutas la última versión de Hyperion.", "dashboard_infobox_message_updatesuccess": "Ejecutas la última versión de Hyperion.",
"dashboard_infobox_label_statush": "Estado de Hyperion:", "dashboard_infobox_label_statush": "Estado de Hyperion:",
"dashboard_infobox_label_smartacc": "Acceso Inteligente", "dashboard_infobox_label_smartacc": "Acceso Inteligente",
"dashboard_infobox_label_enableh": "Habilitar Hyperion", "dashboard_infobox_label_enableh": "Habilitar Instancia: $1",
"dashboard_infobox_label_disableh": "Deshabilitar Hyperion", "dashboard_infobox_label_disableh": "Deshabilitar Instancia: $1",
"dashboard_componentbox_label_title": "Estado de los componentes", "dashboard_componentbox_label_title": "Estado de los componentes",
"dashboard_componentbox_label_comp": "Estado de los componentes", "dashboard_componentbox_label_comp": "Estado de los componentes",
"dashboard_componentbox_label_status": "Estado", "dashboard_componentbox_label_status": "Estado",

View File

@ -52,8 +52,8 @@
"dashboard_infobox_message_updatesuccess": "Stai eseguendo l'ultima versione di Hyperion.", "dashboard_infobox_message_updatesuccess": "Stai eseguendo l'ultima versione di Hyperion.",
"dashboard_infobox_label_statush": "Status Hyperion:", "dashboard_infobox_label_statush": "Status Hyperion:",
"dashboard_infobox_label_smartacc": "Accesso Smart", "dashboard_infobox_label_smartacc": "Accesso Smart",
"dashboard_infobox_label_enableh": "Abilita Hyperion", "dashboard_infobox_label_enableh": "Abilita Istanza: $1",
"dashboard_infobox_label_disableh": "Disabilita Hyperion", "dashboard_infobox_label_disableh": "Disabilita Istanza: $1",
"dashboard_componentbox_label_title": "Status componenti", "dashboard_componentbox_label_title": "Status componenti",
"dashboard_componentbox_label_comp": "Componente", "dashboard_componentbox_label_comp": "Componente",
"dashboard_componentbox_label_status": "Status", "dashboard_componentbox_label_status": "Status",

View File

@ -52,8 +52,8 @@
"dashboard_infobox_message_updatesuccess": "Je draait de laatste versie van Hyperion", "dashboard_infobox_message_updatesuccess": "Je draait de laatste versie van Hyperion",
"dashboard_infobox_label_statush": "Hyperion status:", "dashboard_infobox_label_statush": "Hyperion status:",
"dashboard_infobox_label_smartacc": "Slimme toegang", "dashboard_infobox_label_smartacc": "Slimme toegang",
"dashboard_infobox_label_enableh": "Schakel Hyperion in", "dashboard_infobox_label_enableh": "Schakel Instantie $1 in",
"dashboard_infobox_label_disableh": "Schakel Hyperion uit", "dashboard_infobox_label_disableh": "Schakel Instantie $1 uit",
"dashboard_componentbox_label_title": "Componenten status", "dashboard_componentbox_label_title": "Componenten status",
"dashboard_componentbox_label_comp": "Component", "dashboard_componentbox_label_comp": "Component",
"dashboard_componentbox_label_status": "Status", "dashboard_componentbox_label_status": "Status",

View File

@ -52,8 +52,8 @@
"dashboard_infobox_message_updatesuccess": "Du använder den senaste versionen av Hyperion.", "dashboard_infobox_message_updatesuccess": "Du använder den senaste versionen av Hyperion.",
"dashboard_infobox_label_statush": "Hyperion-status:", "dashboard_infobox_label_statush": "Hyperion-status:",
"dashboard_infobox_label_smartacc": "Smart Åtkomst", "dashboard_infobox_label_smartacc": "Smart Åtkomst",
"dashboard_infobox_label_enableh": "Aktivera Hyperion", "dashboard_infobox_label_enableh": "Aktivera Instans: $1",
"dashboard_infobox_label_disableh": "Inaktivera Hyperion", "dashboard_infobox_label_disableh": "Inaktivera Instans: $1",
"dashboard_componentbox_label_title": "Komponentstatus", "dashboard_componentbox_label_title": "Komponentstatus",
"dashboard_componentbox_label_comp": "Komponent", "dashboard_componentbox_label_comp": "Komponent",
"dashboard_componentbox_label_status": "Status", "dashboard_componentbox_label_status": "Status",

View File

@ -69,8 +69,11 @@ $(document).ready( function() {
} }
}); });
var instancename = window.currentHyperionInstanceName;
console.log ("instancename: ",instancename);
$('#dash_statush').html(hyperion_enabled ? '<span style="color:green">'+$.i18n('general_btn_on')+'</span>' : '<span style="color:red">'+$.i18n('general_btn_off')+'</span>'); $('#dash_statush').html(hyperion_enabled ? '<span style="color:green">'+$.i18n('general_btn_on')+'</span>' : '<span style="color:red">'+$.i18n('general_btn_off')+'</span>');
$('#btn_hsc').html(hyperion_enabled ? '<button class="btn btn-sm btn-danger" onClick="requestSetComponentState(\'ALL\',false)">'+$.i18n('dashboard_infobox_label_disableh')+'</button>' : '<button class="btn btn-sm btn-success" onClick="requestSetComponentState(\'ALL\',true)">'+$.i18n('dashboard_infobox_label_enableh')+'</button>'); $('#btn_hsc').html(hyperion_enabled ? '<button class="btn btn-sm btn-danger" onClick="requestSetComponentState(\'ALL\',false)">'+$.i18n('dashboard_infobox_label_disableh', instancename)+'</button>' : '<button class="btn btn-sm btn-success" onClick="requestSetComponentState(\'ALL\',true)">'+$.i18n('dashboard_infobox_label_enableh', instancename)+'</button>');
} }
// add more info // add more info

View File

@ -3,11 +3,11 @@
/** /**
* Enumeration of the possible video standards the grabber can be set to * Enumeration of the possible video standards the grabber can be set to
*/ */
enum VideoStandard { enum class VideoStandard {
VIDEOSTANDARD_PAL, PAL,
VIDEOSTANDARD_NTSC, NTSC,
VIDEOSTANDARD_SECAM, SECAM,
VIDEOSTANDARD_NO_CHANGE NO_CHANGE
}; };
inline VideoStandard parseVideoStandard(QString videoStandard) inline VideoStandard parseVideoStandard(QString videoStandard)
@ -17,17 +17,17 @@ inline VideoStandard parseVideoStandard(QString videoStandard)
if (videoStandard == "pal") if (videoStandard == "pal")
{ {
return VIDEOSTANDARD_PAL; return VideoStandard::PAL;
} }
else if (videoStandard == "ntsc") else if (videoStandard == "ntsc")
{ {
return VIDEOSTANDARD_NTSC; return VideoStandard::NTSC;
} }
else if (videoStandard == "secam") else if (videoStandard == "secam")
{ {
return VIDEOSTANDARD_SECAM; return VideoStandard::SECAM;
} }
// return the default NO_CHANGE // return the default NO_CHANGE
return VIDEOSTANDARD_NO_CHANGE; return VideoStandard::NO_CHANGE;
} }

View File

@ -552,7 +552,7 @@ private:
/// buffer for leds (with adjustment) /// buffer for leds (with adjustment)
std::vector<ColorRgb> _ledBuffer; std::vector<ColorRgb> _ledBuffer;
VideoMode _currVideoMode = VIDEO_2D; VideoMode _currVideoMode = VideoMode::VIDEO_2D;
/// Boblight instance /// Boblight instance
BoblightServer* _boblightServer; BoblightServer* _boblightServer;

View File

@ -15,7 +15,7 @@
namespace Json { class Value; } namespace Json { class Value; }
/// Enumeration containing the possible orders of device color byte data /// Enumeration containing the possible orders of device color byte data
enum ColorOrder enum class ColorOrder
{ {
ORDER_RGB, ORDER_RBG, ORDER_GRB, ORDER_BRG, ORDER_GBR, ORDER_BGR ORDER_RGB, ORDER_RBG, ORDER_GRB, ORDER_BRG, ORDER_GBR, ORDER_BGR
}; };
@ -24,17 +24,17 @@ inline QString colorOrderToString(const ColorOrder colorOrder)
{ {
switch (colorOrder) switch (colorOrder)
{ {
case ORDER_RGB: case ColorOrder::ORDER_RGB:
return "rgb"; return "rgb";
case ORDER_RBG: case ColorOrder::ORDER_RBG:
return "rbg"; return "rbg";
case ORDER_GRB: case ColorOrder::ORDER_GRB:
return "grb"; return "grb";
case ORDER_BRG: case ColorOrder::ORDER_BRG:
return "brg"; return "brg";
case ORDER_GBR: case ColorOrder::ORDER_GBR:
return "gbr"; return "gbr";
case ORDER_BGR: case ColorOrder::ORDER_BGR:
return "bgr"; return "bgr";
default: default:
return "not-a-colororder"; return "not-a-colororder";
@ -44,31 +44,31 @@ inline ColorOrder stringToColorOrder(const QString & order)
{ {
if (order == "rgb") if (order == "rgb")
{ {
return ORDER_RGB; return ColorOrder::ORDER_RGB;
} }
else if (order == "bgr") else if (order == "bgr")
{ {
return ORDER_BGR; return ColorOrder::ORDER_BGR;
} }
else if (order == "rbg") else if (order == "rbg")
{ {
return ORDER_RBG; return ColorOrder::ORDER_RBG;
} }
else if (order == "brg") else if (order == "brg")
{ {
return ORDER_BRG; return ColorOrder::ORDER_BRG;
} }
else if (order == "gbr") else if (order == "gbr")
{ {
return ORDER_GBR; return ColorOrder::ORDER_GBR;
} }
else if (order == "grb") else if (order == "grb")
{ {
return ORDER_GRB; return ColorOrder::ORDER_GRB;
} }
std::cout << "Unknown color order defined (" << order.toStdString() << "). Using RGB." << std::endl; std::cout << "Unknown color order defined (" << order.toStdString() << "). Using RGB." << std::endl;
return ORDER_RGB; return ColorOrder::ORDER_RGB;
} }
/// ///

View File

@ -7,6 +7,7 @@
#include <QJsonArray> #include <QJsonArray>
#include <QJsonDocument> #include <QJsonDocument>
#include <QTimer> #include <QTimer>
#include <QDateTime>
// STL includes // STL includes
#include <vector> #include <vector>
@ -179,8 +180,8 @@ protected:
QTimer* _refresh_timer; QTimer* _refresh_timer;
int _refresh_timer_interval; int _refresh_timer_interval;
/// timestamp of last write /// Timestamp of last write
qint64 _last_write_time; QDateTime _lastWriteTime;
/// Time a device requires mandatorily between two writes /// Time a device requires mandatorily between two writes
int _latchTime_ms; int _latchTime_ms;

View File

@ -5,51 +5,59 @@
class QUdpSocket; class QUdpSocket;
enum searchType{ enum class searchType{
STY_WEBSERVER, STY_WEBSERVER,
STY_FLATBUFSERVER, STY_FLATBUFSERVER,
STY_JSONSERVER STY_JSONSERVER
}; };
/// ///
/// @brief Search for SSDP sessions, used by standalone capture binaries /// @brief Search for SSDP sessions, used by stand-alone capture binaries
/// ///
class SSDPDiscover : public QObject class SSDPDiscover : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
SSDPDiscover(QObject* parent = nullptr); SSDPDiscover(QObject* parent = nullptr);
/// ///
/// @brief Search for specified service, results will be returned by signal newService(). Calling this method again will reset all found usns and search again /// @brief Search for specified service, results will be returned by signal newService(). Calling this method again will reset all found urns and search again
/// @param st The service to search for /// @param st The service to search for
/// ///
void searchForService(const QString &st = "urn:hyperion-project.org:device:basic:1"); void searchForService(const QString &st = "urn:hyperion-project.org:device:basic:1");
/// ///
/// @brief Search for specified searchTarget, the method will block until a server has been found or a timeout happend /// @brief Search for specified searchTarget, the method will block until a server has been found or a timeout happened
/// @param type The address type one of struct searchType /// @param type The address type one of struct searchType
/// @param st The service to search for /// @param st The service to search for
/// @param timeout_ms The timeout in ms /// @param timeout_ms The timeout in ms
/// @return The address+port of webserver or empty if timed out /// @return The address+port of web-server or empty if timed out
/// ///
const QString getFirstService(const searchType& type = STY_WEBSERVER,const QString& st = "urn:hyperion-project.org:device:basic:1", const int& timeout_ms = 3000); const QString getFirstService(const searchType &type = searchType::STY_WEBSERVER,const QString &st = "urn:hyperion-project.org:device:basic:1", const int &timeout_ms = 3000);
signals: signals:
/// ///
/// @brief Emits whenever a new service has ben found, search started with searchForService() /// @brief Emits whenever a new service has been found, search started with searchForService()
/// @param webServer The address+port of webserver "192.168.0.10:8090"
/// ///
void newService(const QString webServer); /// @param webServer The address+port of web-server "192.168.0.10:8090"
///
void newService(const QString &webServer);
private slots: private slots:
void readPendingDatagrams(); void readPendingDatagrams();
private: private:
///
/// @brief Execute ssdp discovery request
///
/// @param[in] st Search Target
///
void sendSearch(const QString &st); void sendSearch(const QString &st);
private: private:
Logger* _log; Logger* _log;
QUdpSocket* _udpSocket; QUdpSocket* _udpSocket;
QString _searchTarget; QString _searchTarget;

View File

@ -4,6 +4,8 @@
#include <cstdint> #include <cstdint>
#include <iostream> #include <iostream>
#include <QTextStream>
struct ColorRgb; struct ColorRgb;
/// ///
@ -49,6 +51,19 @@ inline std::ostream& operator<<(std::ostream& os, const ColorRgb& color)
return os; return os;
} }
///
/// Stream operator to write ColorRgb to a QTextStream (format "'{'[red]','[green]','[blue]'}'")
///
/// @param os The output stream
/// @param color The color to write
/// @return The output stream (with the color written to it)
///
inline QTextStream& operator<<(QTextStream &os, const ColorRgb& color)
{
os << "{" << unsigned(color.red) << "," << unsigned(color.green) << "," << unsigned(color.blue) << "}";
return os;
}
/// Compare operator to check if a color is 'smaller' than another color /// Compare operator to check if a color is 'smaller' than another color
inline bool operator<(const ColorRgb & lhs, const ColorRgb & rhs) inline bool operator<(const ColorRgb & lhs, const ColorRgb & rhs)
{ {

View File

@ -5,17 +5,17 @@
/** /**
* Enumeration of the possible pixel formats the grabber can be set to * Enumeration of the possible pixel formats the grabber can be set to
*/ */
enum PixelFormat { enum class PixelFormat {
PIXELFORMAT_YUYV, YUYV,
PIXELFORMAT_UYVY, UYVY,
PIXELFORMAT_BGR16, BGR16,
PIXELFORMAT_BGR24, BGR24,
PIXELFORMAT_RGB32, RGB32,
PIXELFORMAT_BGR32, BGR32,
#ifdef HAVE_JPEG_DECODER #ifdef HAVE_JPEG_DECODER
PIXELFORMAT_MJPEG, MJPEG,
#endif #endif
PIXELFORMAT_NO_CHANGE NO_CHANGE
}; };
inline PixelFormat parsePixelFormat(QString pixelFormat) inline PixelFormat parsePixelFormat(QString pixelFormat)
@ -23,37 +23,37 @@ inline PixelFormat parsePixelFormat(QString pixelFormat)
// convert to lower case // convert to lower case
pixelFormat = pixelFormat.toLower(); pixelFormat = pixelFormat.toLower();
if (pixelFormat == "yuyv") if (pixelFormat.compare("yuyv") )
{ {
return PIXELFORMAT_YUYV; return PixelFormat::YUYV;
} }
else if (pixelFormat == "uyvy") else if (pixelFormat.compare("uyvy") )
{ {
return PIXELFORMAT_UYVY; return PixelFormat::UYVY;
} }
else if (pixelFormat == "bgr16") else if (pixelFormat.compare("bgr16") )
{ {
return PIXELFORMAT_BGR16; return PixelFormat::BGR16;
} }
else if (pixelFormat == "bgr24") else if (pixelFormat.compare("bgr24") )
{ {
return PIXELFORMAT_BGR24; return PixelFormat::BGR24;
} }
else if (pixelFormat == "rgb32") else if (pixelFormat.compare("rgb32") )
{ {
return PIXELFORMAT_RGB32; return PixelFormat::RGB32;
} }
else if (pixelFormat == "bgr32") else if (pixelFormat.compare("bgr32") )
{ {
return PIXELFORMAT_BGR32; return PixelFormat::BGR32;
} }
#ifdef HAVE_JPEG_DECODER #ifdef HAVE_JPEG_DECODER
else if (pixelFormat == "mjpeg") else if (pixelFormat.compare("mjpeg") )
{ {
return PIXELFORMAT_MJPEG; return PixelFormat::MJPEG;
} }
#endif #endif
// return the default NO_CHANGE // return the default NO_CHANGE
return PIXELFORMAT_NO_CHANGE; return PixelFormat::NO_CHANGE;
} }

View File

@ -6,7 +6,7 @@
namespace RGBW { namespace RGBW {
enum WhiteAlgorithm { enum class WhiteAlgorithm {
INVALID, INVALID,
SUBTRACT_MINIMUM, SUBTRACT_MINIMUM,
SUB_MIN_WARM_ADJUST, SUB_MIN_WARM_ADJUST,

View File

@ -5,7 +5,7 @@
/** /**
* Enumeration of the possible modes in which video can be playing (2D, 3D) * Enumeration of the possible modes in which video can be playing (2D, 3D)
*/ */
enum VideoMode enum class VideoMode
{ {
VIDEO_2D, VIDEO_2D,
VIDEO_3DSBS, VIDEO_3DSBS,
@ -19,24 +19,24 @@ inline VideoMode parse3DMode(QString videoMode)
if (videoMode == "3DTAB") if (videoMode == "3DTAB")
{ {
return VIDEO_3DTAB; return VideoMode::VIDEO_3DTAB;
} }
else if (videoMode == "3DSBS") else if (videoMode == "3DSBS")
{ {
return VIDEO_3DSBS; return VideoMode::VIDEO_3DSBS;
} }
// return the default 2D // return the default 2D
return VIDEO_2D; return VideoMode::VIDEO_2D;
} }
inline QString videoMode2String(VideoMode mode) inline QString videoMode2String(VideoMode mode)
{ {
switch(mode) switch(mode)
{ {
case VIDEO_3DTAB: return "3DTAB"; case VideoMode::VIDEO_3DTAB: return "3DTAB";
case VIDEO_3DSBS: return "3DSBS"; case VideoMode::VIDEO_3DSBS: return "3DSBS";
case VIDEO_2D: return "2D"; case VideoMode::VIDEO_2D: return "2D";
default: return "INVALID"; default: return "INVALID";
} }
} }

View File

@ -90,8 +90,11 @@ void BoblightClientConnection::socketClosed()
void BoblightClientConnection::handleMessage(const QString & message) void BoblightClientConnection::handleMessage(const QString & message)
{ {
//std::cout << "boblight message: " << message.toStdString() << std::endl; //std::cout << "boblight message: " << message.toStdString() << std::endl;
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList messageParts = message.split(" ", Qt::SkipEmptyParts);
#else
QStringList messageParts = message.split(" ", QString::SkipEmptyParts); QStringList messageParts = message.split(" ", QString::SkipEmptyParts);
#endif
if (messageParts.size() > 0) if (messageParts.size() > 0)
{ {

View File

@ -159,7 +159,7 @@ int AmlogicGrabber::grabFrame_amvideocap(Image<ColorRgb> & image)
} }
_useImageResampler = true; _useImageResampler = true;
_imageResampler.processImage((const uint8_t*)_image_ptr, _width, _height, (_width << 1) + _width, PIXELFORMAT_BGR24, image); _imageResampler.processImage((const uint8_t*)_image_ptr, _width, _height, (_width << 1) + _width, PixelFormat::BGR24, image);
_lastError = 0; _lastError = 0;
return 0; return 0;

View File

@ -114,15 +114,15 @@ int DispmanxFrameGrabber::grabFrame(Image<ColorRgb> & image)
// calculate final image dimensions and adjust top/left cropping in 3D modes // calculate final image dimensions and adjust top/left cropping in 3D modes
switch (_videoMode) switch (_videoMode)
{ {
case VIDEO_3DSBS: case VideoMode::VIDEO_3DSBS:
imageWidth /= 2; imageWidth /= 2;
cropLeft /= 2; cropLeft /= 2;
break; break;
case VIDEO_3DTAB: case VideoMode::VIDEO_3DTAB:
imageHeight /= 2; imageHeight /= 2;
cropTop /= 2; cropTop /= 2;
break; break;
case VIDEO_2D: case VideoMode::VIDEO_2D:
default: default:
break; break;
} }

View File

@ -44,12 +44,12 @@ int FramebufferFrameGrabber::grabFrame(Image<ColorRgb> & image)
switch (vinfo.bits_per_pixel) switch (vinfo.bits_per_pixel)
{ {
case 16: pixelFormat = PIXELFORMAT_BGR16; break; case 16: pixelFormat = PixelFormat::BGR16; break;
case 24: pixelFormat = PIXELFORMAT_BGR24; break; case 24: pixelFormat = PixelFormat::BGR24; break;
#ifdef ENABLE_AMLOGIC #ifdef ENABLE_AMLOGIC
case 32: pixelFormat = PIXELFORMAT_RGB32; break; case 32: pixelFormat = PixelFormat::PIXELFORMAT_RGB32; break;
#else #else
case 32: pixelFormat = PIXELFORMAT_BGR32; break; case 32: pixelFormat = PixelFormat::BGR32; break;
#endif #endif
default: default:
Error(_log, "Unknown pixel format: %d bits per pixel", vinfo.bits_per_pixel); Error(_log, "Unknown pixel format: %d bits per pixel", vinfo.bits_per_pixel);

View File

@ -50,7 +50,7 @@ int OsxFrameGrabber::grabFrame(Image<ColorRgb> & image)
dspWidth, dspWidth,
dspHeight, dspHeight,
CGImageGetBytesPerRow(dispImage), CGImageGetBytesPerRow(dispImage),
PIXELFORMAT_BGR32, PixelFormat::BGR32,
image); image);
CFRelease(imgData); CFRelease(imgData);

View File

@ -146,7 +146,7 @@ int QtGrabber::updateScreenDimensions(const bool& force)
// calculate final image dimensions and adjust top/left cropping in 3D modes // calculate final image dimensions and adjust top/left cropping in 3D modes
switch (_videoMode) switch (_videoMode)
{ {
case VIDEO_3DSBS: case VideoMode::VIDEO_3DSBS:
_width = width /2; _width = width /2;
_height = height; _height = height;
_src_x = _cropLeft / 2; _src_x = _cropLeft / 2;
@ -154,7 +154,7 @@ int QtGrabber::updateScreenDimensions(const bool& force)
_src_x_max = (_screenWidth / 2) - _cropRight; _src_x_max = (_screenWidth / 2) - _cropRight;
_src_y_max = _screenHeight - _cropBottom; _src_y_max = _screenHeight - _cropBottom;
break; break;
case VIDEO_3DTAB: case VideoMode::VIDEO_3DTAB:
_width = width; _width = width;
_height = height / 2; _height = height / 2;
_src_x = _cropLeft; _src_x = _cropLeft;
@ -162,7 +162,7 @@ int QtGrabber::updateScreenDimensions(const bool& force)
_src_x_max = _screenWidth - _cropRight; _src_x_max = _screenWidth - _cropRight;
_src_y_max = (_screenHeight / 2) - _cropBottom; _src_y_max = (_screenHeight / 2) - _cropBottom;
break; break;
case VIDEO_2D: case VideoMode::VIDEO_2D:
default: default:
_width = width; _width = width;
_height = height; _height = height;

View File

@ -591,7 +591,7 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
{ {
switch (videoStandard) switch (videoStandard)
{ {
case VIDEOSTANDARD_PAL: case VideoStandard::PAL:
{ {
standard.id = V4L2_STD_PAL; standard.id = V4L2_STD_PAL;
if (-1 == xioctl(VIDIOC_S_STD, &standard.id)) if (-1 == xioctl(VIDIOC_S_STD, &standard.id))
@ -603,7 +603,7 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
} }
break; break;
case VIDEOSTANDARD_NTSC: case VideoStandard::NTSC:
{ {
standard.id = V4L2_STD_NTSC; standard.id = V4L2_STD_NTSC;
if (-1 == xioctl(VIDIOC_S_STD, &standard.id)) if (-1 == xioctl(VIDIOC_S_STD, &standard.id))
@ -615,7 +615,7 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
} }
break; break;
case VIDEOSTANDARD_SECAM: case VideoStandard::SECAM:
{ {
standard.id = V4L2_STD_SECAM; standard.id = V4L2_STD_SECAM;
if (-1 == xioctl(VIDIOC_S_STD, &standard.id)) if (-1 == xioctl(VIDIOC_S_STD, &standard.id))
@ -627,7 +627,7 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
} }
break; break;
case VIDEOSTANDARD_NO_CHANGE: case VideoStandard::NO_CHANGE:
default: default:
// No change to device settings // No change to device settings
break; break;
@ -648,20 +648,20 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
// set the requested pixel format // set the requested pixel format
switch (_pixelFormat) switch (_pixelFormat)
{ {
case PIXELFORMAT_UYVY: case PixelFormat::UYVY:
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY;
break; break;
case PIXELFORMAT_YUYV: case PixelFormat::YUYV:
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
break; break;
case PIXELFORMAT_RGB32: case PixelFormat::RGB32:
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB32; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB32;
break; break;
#ifdef HAVE_JPEG_DECODER #ifdef HAVE_JPEG_DECODER
case PIXELFORMAT_MJPEG: case PixelFormat::MJPEG:
{ {
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
fmt.fmt.pix.field = V4L2_FIELD_ANY; fmt.fmt.pix.field = V4L2_FIELD_ANY;
@ -669,7 +669,7 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
break; break;
#endif #endif
case PIXELFORMAT_NO_CHANGE: case PixelFormat::NO_CHANGE:
default: default:
// No change to device settings // No change to device settings
break; break;
@ -723,7 +723,7 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
{ {
case V4L2_PIX_FMT_UYVY: case V4L2_PIX_FMT_UYVY:
{ {
_pixelFormat = PIXELFORMAT_UYVY; _pixelFormat = PixelFormat::UYVY;
_frameByteSize = _width * _height * 2; _frameByteSize = _width * _height * 2;
Debug(_log, "Pixel format=UYVY"); Debug(_log, "Pixel format=UYVY");
} }
@ -731,7 +731,7 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
case V4L2_PIX_FMT_YUYV: case V4L2_PIX_FMT_YUYV:
{ {
_pixelFormat = PIXELFORMAT_YUYV; _pixelFormat = PixelFormat::YUYV;
_frameByteSize = _width * _height * 2; _frameByteSize = _width * _height * 2;
Debug(_log, "Pixel format=YUYV"); Debug(_log, "Pixel format=YUYV");
} }
@ -739,7 +739,7 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
case V4L2_PIX_FMT_RGB32: case V4L2_PIX_FMT_RGB32:
{ {
_pixelFormat = PIXELFORMAT_RGB32; _pixelFormat = PixelFormat::RGB32;
_frameByteSize = _width * _height * 4; _frameByteSize = _width * _height * 4;
Debug(_log, "Pixel format=RGB32"); Debug(_log, "Pixel format=RGB32");
} }
@ -748,7 +748,7 @@ void V4L2Grabber::init_device(VideoStandard videoStandard)
#ifdef HAVE_JPEG_DECODER #ifdef HAVE_JPEG_DECODER
case V4L2_PIX_FMT_MJPEG: case V4L2_PIX_FMT_MJPEG:
{ {
_pixelFormat = PIXELFORMAT_MJPEG; _pixelFormat = PixelFormat::MJPEG;
Debug(_log, "Pixel format=MJPEG"); Debug(_log, "Pixel format=MJPEG");
} }
break; break;
@ -1016,7 +1016,7 @@ bool V4L2Grabber::process_image(const void *p, int size)
{ {
// We do want a new frame... // We do want a new frame...
#ifdef HAVE_JPEG_DECODER #ifdef HAVE_JPEG_DECODER
if (size < _frameByteSize && _pixelFormat != PIXELFORMAT_MJPEG) if (size < _frameByteSize && _pixelFormat != PixelFormat::MJPEG)
#else #else
if (size < _frameByteSize) if (size < _frameByteSize)
#endif #endif
@ -1041,7 +1041,7 @@ void V4L2Grabber::process_image(const uint8_t * data, int size)
* --------------------------------------------------------*/ * --------------------------------------------------------*/
#ifdef HAVE_JPEG_DECODER #ifdef HAVE_JPEG_DECODER
if (_pixelFormat == PIXELFORMAT_MJPEG) if (_pixelFormat == PixelFormat::MJPEG)
{ {
#endif #endif
#ifdef HAVE_JPEG #ifdef HAVE_JPEG

View File

@ -184,7 +184,7 @@ int X11Grabber::grabFrame(Image<ColorRgb> & image, bool forceUpdate)
return -1; return -1;
} }
_imageResampler.processImage(reinterpret_cast<const uint8_t *>(_xImage->data), _xImage->width, _xImage->height, _xImage->bytes_per_line, PIXELFORMAT_BGR32, image); _imageResampler.processImage(reinterpret_cast<const uint8_t *>(_xImage->data), _xImage->width, _xImage->height, _xImage->bytes_per_line, PixelFormat::BGR32, image);
return 0; return 0;
} }
@ -244,19 +244,19 @@ int X11Grabber::updateScreenDimensions(bool force)
// calculate final image dimensions and adjust top/left cropping in 3D modes // calculate final image dimensions and adjust top/left cropping in 3D modes
switch (_videoMode) switch (_videoMode)
{ {
case VIDEO_3DSBS: case VideoMode::VIDEO_3DSBS:
_width = width /2; _width = width /2;
_height = height; _height = height;
_src_x = _cropLeft / 2; _src_x = _cropLeft / 2;
_src_y = _cropTop; _src_y = _cropTop;
break; break;
case VIDEO_3DTAB: case VideoMode::VIDEO_3DTAB:
_width = width; _width = width;
_height = height / 2; _height = height / 2;
_src_x = _cropLeft; _src_x = _cropLeft;
_src_y = _cropTop / 2; _src_y = _cropTop / 2;
break; break;
case VIDEO_2D: case VideoMode::VIDEO_2D:
default: default:
_width = width; _width = width;
_height = height; _height = height;

View File

@ -4,7 +4,7 @@
Grabber::Grabber(QString grabberName, int width, int height, int cropLeft, int cropRight, int cropTop, int cropBottom) Grabber::Grabber(QString grabberName, int width, int height, int cropLeft, int cropRight, int cropTop, int cropBottom)
: _imageResampler() : _imageResampler()
, _useImageResampler(true) , _useImageResampler(true)
, _videoMode(VIDEO_2D) , _videoMode(VideoMode::VIDEO_2D)
, _width(width) , _width(width)
, _height(height) , _height(height)
, _fps(15) , _fps(15)
@ -16,7 +16,7 @@ Grabber::Grabber(QString grabberName, int width, int height, int cropLeft, int c
, _enabled(true) , _enabled(true)
, _log(Logger::getInstance(grabberName)) , _log(Logger::getInstance(grabberName))
{ {
Grabber::setVideoMode(VIDEO_2D); Grabber::setVideoMode(VideoMode::VIDEO_2D);
Grabber::setCropping(cropLeft, cropRight, cropTop, cropBottom); Grabber::setCropping(cropLeft, cropRight, cropTop, cropBottom);
} }

View File

@ -568,24 +568,24 @@ void Hyperion::update()
// correct the color byte order // correct the color byte order
switch (_ledStringColorOrder.at(i)) switch (_ledStringColorOrder.at(i))
{ {
case ORDER_RGB: case ColorOrder::ORDER_RGB:
// leave as it is // leave as it is
break; break;
case ORDER_BGR: case ColorOrder::ORDER_BGR:
std::swap(color.red, color.blue); std::swap(color.red, color.blue);
break; break;
case ORDER_RBG: case ColorOrder::ORDER_RBG:
std::swap(color.green, color.blue); std::swap(color.green, color.blue);
break; break;
case ORDER_GRB: case ColorOrder::ORDER_GRB:
std::swap(color.red, color.green); std::swap(color.red, color.green);
break; break;
case ORDER_GBR: case ColorOrder::ORDER_GBR:
std::swap(color.red, color.green); std::swap(color.red, color.green);
std::swap(color.green, color.blue); std::swap(color.green, color.blue);
break; break;
case ORDER_BRG: case ColorOrder::ORDER_BRG:
std::swap(color.red, color.blue); std::swap(color.red, color.blue);
std::swap(color.green, color.blue); std::swap(color.green, color.blue);
break; break;

View File

@ -14,6 +14,7 @@ MultiColorAdjustment::~MultiColorAdjustment()
for (ColorAdjustment * adjustment : _adjustment) for (ColorAdjustment * adjustment : _adjustment)
{ {
delete adjustment; delete adjustment;
// BUG: Calling pop_back while iterating is invalid
_adjustment.pop_back(); _adjustment.pop_back();
} }
} }

View File

@ -8,6 +8,7 @@
#include <QDateTime> #include <QDateTime>
#include <QEventLoop> #include <QEventLoop>
#include <QTimer> #include <QTimer>
#include <QDateTime>
#include "hyperion/Hyperion.h" #include "hyperion/Hyperion.h"
#include <utils/JsonUtils.h> #include <utils/JsonUtils.h>
@ -21,7 +22,7 @@ LedDevice::LedDevice(const QJsonObject& config, QObject* parent)
, _deviceInError(false) , _deviceInError(false)
, _refresh_timer(new QTimer(this)) , _refresh_timer(new QTimer(this))
, _refresh_timer_interval(0) , _refresh_timer_interval(0)
, _last_write_time(QDateTime::currentMSecsSinceEpoch()) , _lastWriteTime(QDateTime::currentDateTime())
, _latchTime_ms(0) , _latchTime_ms(0)
, _componentRegistered(false) , _componentRegistered(false)
, _enabled(false) , _enabled(false)
@ -140,7 +141,7 @@ bool LedDevice::init(const QJsonObject &deviceConfig)
//Debug(_log, "Refresh interval = %dms",_refresh_timer_interval ); //Debug(_log, "Refresh interval = %dms",_refresh_timer_interval );
_refresh_timer->setInterval( _refresh_timer_interval ); _refresh_timer->setInterval( _refresh_timer_interval );
_last_write_time = QDateTime::currentMSecsSinceEpoch(); _lastWriteTime = QDateTime::currentDateTime();
this->startRefreshTimer(); this->startRefreshTimer();
} }
@ -170,12 +171,12 @@ int LedDevice::updateLeds(const std::vector<ColorRgb>& ledValues)
} }
else else
{ {
qint64 elapsedTime = QDateTime::currentMSecsSinceEpoch() - _last_write_time; qint64 elapsedTimeMs = _lastWriteTime.msecsTo(QDateTime::currentDateTime());
if (_latchTime_ms == 0 || elapsedTime >= _latchTime_ms) if (_latchTime_ms == 0 || elapsedTimeMs >= _latchTime_ms)
{ {
//std::cout << "LedDevice::updateLeds(), Elapsed time since last write (" << elapsedTime << ") ms > _latchTime_ms (" << _latchTime_ms << ") ms" << std::endl; //std::cout << "LedDevice::updateLeds(), Elapsed time since last write (" << elapsedTimeMs << ") ms > _latchTime_ms (" << _latchTime_ms << ") ms" << std::endl;
retval = write(ledValues); retval = write(ledValues);
_last_write_time = QDateTime::currentMSecsSinceEpoch(); _lastWriteTime = QDateTime::currentDateTime();
// if device requires refreshing, save Led-Values and restart the timer // if device requires refreshing, save Led-Values and restart the timer
if ( _refresh_enabled ) if ( _refresh_enabled )
@ -186,7 +187,7 @@ int LedDevice::updateLeds(const std::vector<ColorRgb>& ledValues)
} }
else else
{ {
//std::cout << "LedDevice::updateLeds(), Skip write. _latchTime_ms (" << _latchTime_ms << ") ms > elapsedTime (" << elapsedTime << ") ms" << std::endl; //std::cout << "LedDevice::updateLeds(), Skip write. elapsedTime (" << elapsedTimeMs << ") ms < _latchTime_ms (" << _latchTime_ms << ") ms" << std::endl;
if ( _refresh_enabled ) if ( _refresh_enabled )
{ {
//Stop timer to allow for next non-refresh update //Stop timer to allow for next non-refresh update
@ -242,16 +243,16 @@ int LedDevice::rewriteLeds()
if ( _deviceReady ) if ( _deviceReady )
{ {
// qint64 elapsedTime = QDateTime::currentMSecsSinceEpoch() - _last_write_time; // qint64 elapsedTimeMs = _lastWriteTime.msecsTo(QDateTime::currentDateTime());
// std::cout << "LedDevice::rewriteLeds(): Rewrite Leds now, elapsedTime [" << elapsedTime << "] ms" << std::endl; // std::cout << "LedDevice::rewriteLEDs(): Rewrite LEDs now, elapsedTime [" << elapsedTimeMs << "] ms" << std::endl;
// //:TESTING: Inject "white" output records to differentiate from normal writes // //:TESTING: Inject "white" output records to differentiate from normal writes
// _last_ledValues.clear(); // _last_ledValues.clear();
// _last_ledValues.resize(static_cast<unsigned long>(_ledCount), ColorRgb::WHITE); // _last_ledValues.resize(static_cast<unsigned long>(_ledCount), ColorRgb::WHITE);
// printLedValues(_last_ledValues); // printLedValues(_last_ledValues);
// //:TESTING: //:TESTING:
retval = write(_last_ledValues); retval = write(_last_ledValues);
_last_write_time = QDateTime::currentMSecsSinceEpoch(); _lastWriteTime = QDateTime::currentDateTime();
} }
else else
{ {

View File

@ -2,18 +2,20 @@
#include "LedDeviceAtmoOrb.h" #include "LedDeviceAtmoOrb.h"
// qt includes // qt includes
#include <QtNetwork> #include <QUdpSocket>
const quint16 MULTICAST_GROUPL_DEFAULT_PORT = 49692;
const int LEDS_DEFAULT_NUMBER = 24;
LedDeviceAtmoOrb::LedDeviceAtmoOrb(const QJsonObject &deviceConfig) LedDeviceAtmoOrb::LedDeviceAtmoOrb(const QJsonObject &deviceConfig)
: LedDevice() : LedDevice()
, _networkmanager (nullptr)
, _udpSocket (nullptr) , _udpSocket (nullptr)
, _multiCastGroupPort (49692) , _multiCastGroupPort (MULTICAST_GROUPL_DEFAULT_PORT)
, joinedMulticastgroup (false) , _joinedMulticastgroup (false)
, _useOrbSmoothing (false) , _useOrbSmoothing (false)
, _transitiontime (0) , _transitiontime (0)
, _skipSmoothingDiff (0) , _skipSmoothingDiff (0)
, _numLeds (24) , _numLeds (LEDS_DEFAULT_NUMBER)
{ {
_devConfig = deviceConfig; _devConfig = deviceConfig;
@ -27,25 +29,32 @@ LedDevice* LedDeviceAtmoOrb::construct(const QJsonObject &deviceConfig)
LedDeviceAtmoOrb::~LedDeviceAtmoOrb() LedDeviceAtmoOrb::~LedDeviceAtmoOrb()
{ {
_networkmanager->deleteLater(); if ( _udpSocket != nullptr )
{
_udpSocket->deleteLater(); _udpSocket->deleteLater();
} }
}
bool LedDeviceAtmoOrb::init(const QJsonObject &deviceConfig) bool LedDeviceAtmoOrb::init(const QJsonObject &deviceConfig)
{ {
bool isInitOK = LedDevice::init(deviceConfig); bool isInitOK = false;
if ( isInitOK ) if ( LedDevice::init(deviceConfig) )
{ {
_multicastGroup = deviceConfig["output"].toString().toStdString().c_str(); _multicastGroup = deviceConfig["output"].toString().toStdString().c_str();
_useOrbSmoothing = deviceConfig["useOrbSmoothing"].toBool(false); _useOrbSmoothing = deviceConfig["useOrbSmoothing"].toBool(false);
_transitiontime = deviceConfig["transitiontime"].toInt(0); _transitiontime = deviceConfig["transitiontime"].toInt(0);
_skipSmoothingDiff = deviceConfig["skipSmoothingDiff"].toInt(0); _skipSmoothingDiff = deviceConfig["skipSmoothingDiff"].toInt(0);
_multiCastGroupPort = static_cast<quint16>(deviceConfig["port"].toInt(49692)); _multiCastGroupPort = static_cast<quint16>(deviceConfig["port"].toInt(MULTICAST_GROUPL_DEFAULT_PORT));
_numLeds = deviceConfig["numLeds"].toInt(24); _numLeds = deviceConfig["numLeds"].toInt(LEDS_DEFAULT_NUMBER);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
const QStringList orbIds = deviceConfig["orbIds"].toString().simplified().remove(" ").split(",", Qt::SkipEmptyParts);
#else
const QStringList orbIds = deviceConfig["orbIds"].toString().simplified().remove(" ").split(",", QString::SkipEmptyParts); const QStringList orbIds = deviceConfig["orbIds"].toString().simplified().remove(" ").split(",", QString::SkipEmptyParts);
#endif
_orbIds.clear(); _orbIds.clear();
foreach(auto & id_str, orbIds) foreach(auto & id_str, orbIds)
@ -53,7 +62,12 @@ bool LedDeviceAtmoOrb::init(const QJsonObject &deviceConfig)
bool ok; bool ok;
int id = id_str.toInt(&ok); int id = id_str.toInt(&ok);
if (ok) if (ok)
{
if ( id < 1 || id > 255 )
Warning(_log, "Skip orb id '%d'. IDs must be in range 1-255", id);
else
_orbIds.append(id); _orbIds.append(id);
}
else else
Error(_log, "orb id '%s' is not a number", QSTRING_CSTR(id_str)); Error(_log, "orb id '%s' is not a number", QSTRING_CSTR(id_str));
} }
@ -63,22 +77,12 @@ bool LedDeviceAtmoOrb::init(const QJsonObject &deviceConfig)
this->setInError("No valid OrbIds found!"); this->setInError("No valid OrbIds found!");
isInitOK = false; isInitOK = false;
} }
} else
return isInitOK;
}
bool LedDeviceAtmoOrb::initNetwork()
{ {
bool isInitOK = true;
// TODO: Add Network-Error handling
_networkmanager = new QNetworkAccessManager();
_groupAddress = QHostAddress(_multicastGroup);
_udpSocket = new QUdpSocket(this); _udpSocket = new QUdpSocket(this);
_udpSocket->bind(QHostAddress::AnyIPv4, _multiCastGroupPort, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); isInitOK = true;
}
joinedMulticastgroup = _udpSocket->joinMulticastGroup(_groupAddress); }
return isInitOK; return isInitOK;
} }
@ -89,24 +93,56 @@ int LedDeviceAtmoOrb::open()
if ( init(_devConfig) ) if ( init(_devConfig) )
{ {
if ( !initNetwork() ) // Try to bind the UDP-Socket
if ( _udpSocket != nullptr )
{ {
this->setInError( "Network error!" ); _groupAddress = QHostAddress(_multicastGroup);
if ( !_udpSocket->bind(QHostAddress::AnyIPv4, _multiCastGroupPort, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint) )
{
QString errortext = QString ("(%1) %2, MulticastGroup: (%3)").arg(_udpSocket->error()).arg(_udpSocket->errorString()).arg(_multicastGroup);
this->setInError( errortext );
} }
else else
{ {
_joinedMulticastgroup = _udpSocket->joinMulticastGroup(_groupAddress);
if ( !_joinedMulticastgroup )
{
QString errortext = QString ("(%1) %2, MulticastGroup: (%3)").arg(_udpSocket->error()).arg(_udpSocket->errorString()).arg(_multicastGroup);
this->setInError( errortext );
}
else
{
// Everything is OK, device is ready
_deviceReady = true; _deviceReady = true;
setEnable(true); setEnable(true);
retval = 0; retval = 0;
} }
} }
}
}
return retval; return retval;
} }
void LedDeviceAtmoOrb::close()
{
LedDevice::close();
if ( _udpSocket != nullptr )
{
// Test, if device requires closing
if ( _udpSocket->isOpen() )
{
Debug(_log,"Close UDP-device: %s", QSTRING_CSTR( this->getActiveDeviceType() ) );
_udpSocket->close();
// Everything is OK -> device is closed
}
}
}
int LedDeviceAtmoOrb::write(const std::vector <ColorRgb> &ledValues) int LedDeviceAtmoOrb::write(const std::vector <ColorRgb> &ledValues)
{ {
// If not in multicast group return // If not in multicast group return
if (!joinedMulticastgroup) if (!_joinedMulticastgroup)
{ {
return 0; return 0;
} }
@ -179,20 +215,23 @@ void LedDeviceAtmoOrb::setColor(int orbId, const ColorRgb &color, int commandTyp
bytes.fill('\0'); bytes.fill('\0');
// Command identifier: C0FFEE // Command identifier: C0FFEE
bytes[0] = 0xC0; bytes[0] = static_cast<char>(0xC0);
bytes[1] = 0xFF; bytes[1] = static_cast<char>(0xFF);
bytes[2] = 0xEE; bytes[2] = static_cast<char>(0xEE);
// Command type // Command type
bytes[3] = commandType; bytes[3] = static_cast<char>(commandType);
// Orb ID // Orb ID
bytes[4] = orbId; bytes[4] = static_cast<char>(orbId);
// RED / GREEN / BLUE // RED / GREEN / BLUE
bytes[5] = color.red; bytes[5] = static_cast<char>(color.red);
bytes[6] = color.green; bytes[6] = static_cast<char>(color.green);
bytes[7] = color.blue; bytes[7] = static_cast<char>(color.blue);
// TODO: Why is the datagram _numLeds * 3 in size, if only bypes 5,6,7 are updated with the color?
//std::cout << "Orb [" << orbId << "] Cmd [" << bytes.toHex(':').toStdString() <<"]"<< std::endl;
sendCommand(bytes); sendCommand(bytes);
} }

View File

@ -60,6 +60,13 @@ protected:
/// ///
virtual int open() override; virtual int open() override;
///
/// @brief Closes the output device.
///
/// @return Zero on success (i.e. device is closed), else negative
///
virtual void close() override;
private: private:
/// ///
@ -102,7 +109,7 @@ private:
quint16 _multiCastGroupPort; quint16 _multiCastGroupPort;
// Multicast status // Multicast status
bool joinedMulticastgroup; bool _joinedMulticastgroup;
/// use Orbs own (external) smoothing algorithm /// use Orbs own (external) smoothing algorithm
bool _useOrbSmoothing; bool _useOrbSmoothing;
@ -116,9 +123,6 @@ private:
/// Number of leds in Orb, used to determine buffer size /// Number of leds in Orb, used to determine buffer size
int _numLeds; int _numLeds;
/// Array of the orb ids. /// Array of the orb ids.
QVector<int> _orbIds; QVector<int> _orbIds;
@ -127,7 +131,4 @@ private:
QMap<int, int> lastColorGreenMap; QMap<int, int> lastColorGreenMap;
QMap<int, int> lastColorBlueMap; QMap<int, int> lastColorBlueMap;
}; };

View File

@ -165,7 +165,7 @@ int LedDeviceFadeCandy::sendSysEx(uint8_t systemId, uint8_t commandId, QByteArra
if ( isConnected() ) if ( isConnected() )
{ {
QByteArray sysExData; QByteArray sysExData;
ssize_t data_size = msg.size() + 4; uint data_size = msg.size() + 4;
sysExData.resize( 4 + OPC_HEADER_SIZE ); sysExData.resize( 4 + OPC_HEADER_SIZE );
sysExData[0] = 0; sysExData[0] = 0;

View File

@ -337,12 +337,12 @@ bool LedDeviceNanoleaf::discoverDevice()
SSDPDiscover discover; SSDPDiscover discover;
// Discover Canvas device // Discover Canvas device
address = discover.getFirstService(STY_WEBSERVER, SSDP_CANVAS, SSDP_TIMEOUT); address = discover.getFirstService(searchType::STY_WEBSERVER, SSDP_CANVAS, SSDP_TIMEOUT);
//No Canvas device not found //No Canvas device not found
if ( address.isEmpty() ) { if ( address.isEmpty() ) {
// Discover Light Panels (Aurora) device // Discover Light Panels (Aurora) device
address = discover.getFirstService(STY_WEBSERVER, SSDP_LIGHTPANELS, SSDP_TIMEOUT); address = discover.getFirstService(searchType::STY_WEBSERVER, SSDP_LIGHTPANELS, SSDP_TIMEOUT);
if ( address.isEmpty() ) { if ( address.isEmpty() ) {
Warning(_log, "No Nanoleaf device discovered"); Warning(_log, "No Nanoleaf device discovered");
@ -353,7 +353,12 @@ bool LedDeviceNanoleaf::discoverDevice()
if ( ! address.isEmpty() ) { if ( ! address.isEmpty() ) {
Info(_log, "Nanoleaf device discovered at [%s]", QSTRING_CSTR( address )); Info(_log, "Nanoleaf device discovered at [%s]", QSTRING_CSTR( address ));
isDeviceFound = true; isDeviceFound = true;
// Resolve hostname and port (or use default API port)
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList addressparts = address.split(":", Qt::SkipEmptyParts);
#else
QStringList addressparts = address.split(":", QString::SkipEmptyParts); QStringList addressparts = address.split(":", QString::SkipEmptyParts);
#endif
_hostname = addressparts[0]; _hostname = addressparts[0];
_api_port = addressparts[1]; _api_port = addressparts[1];
} }

View File

@ -282,7 +282,11 @@ bool LedDevicePhilipsHueBridge::init(const QJsonObject &deviceConfig)
if ( !address.isEmpty() ) if ( !address.isEmpty() )
{ {
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList addressparts = address.split(":", Qt::SkipEmptyParts);
#else
QStringList addressparts = address.split(":", QString::SkipEmptyParts); QStringList addressparts = address.split(":", QString::SkipEmptyParts);
#endif
_hostname = addressparts[0]; _hostname = addressparts[0];
if ( addressparts.size() > 1 ) if ( addressparts.size() > 1 )
@ -402,7 +406,12 @@ void LedDevicePhilipsHueBridge::setBridgeConfig(QJsonDocument doc)
_deviceFirmwareVersion = jsonConfigInfo[DEV_DATA_FIRMWAREVERSION].toString(); _deviceFirmwareVersion = jsonConfigInfo[DEV_DATA_FIRMWAREVERSION].toString();
_deviceAPIVersion = jsonConfigInfo[DEV_DATA_APIVERSION].toString(); _deviceAPIVersion = jsonConfigInfo[DEV_DATA_APIVERSION].toString();
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList apiVersionParts = _deviceAPIVersion.split(".", Qt::SkipEmptyParts);
#else
QStringList apiVersionParts = _deviceAPIVersion.split(".", QString::SkipEmptyParts); QStringList apiVersionParts = _deviceAPIVersion.split(".", QString::SkipEmptyParts);
#endif
if ( !apiVersionParts.isEmpty() ) if ( !apiVersionParts.isEmpty() )
{ {
_api_major = apiVersionParts[0].toUInt(); _api_major = apiVersionParts[0].toUInt();
@ -483,7 +492,7 @@ bool LedDevicePhilipsHueBridge::discoverDevice()
SSDPDiscover discover; SSDPDiscover discover;
// Discover Philips Hue Bridge // Discover Philips Hue Bridge
address = discover.getFirstService( STY_WEBSERVER, SSDP_ID, SSDP_TIMEOUT ); address = discover.getFirstService( searchType::STY_WEBSERVER, SSDP_ID, SSDP_TIMEOUT );
if ( address.isEmpty() ) if ( address.isEmpty() )
{ {
Warning(_log, "No Philips Hue Bridge discovered" ); Warning(_log, "No Philips Hue Bridge discovered" );
@ -493,7 +502,13 @@ bool LedDevicePhilipsHueBridge::discoverDevice()
// Philips Hue Bridge found // Philips Hue Bridge found
Info(_log, "Philips Hue Bridge discovered at [%s]", QSTRING_CSTR( address ) ); Info(_log, "Philips Hue Bridge discovered at [%s]", QSTRING_CSTR( address ) );
isDeviceFound = true; isDeviceFound = true;
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList addressparts = address.split(":", Qt::SkipEmptyParts);
#else
QStringList addressparts = address.split(":", QString::SkipEmptyParts); QStringList addressparts = address.split(":", QString::SkipEmptyParts);
#endif
_hostname = addressparts[0]; _hostname = addressparts[0];
_api_port = addressparts[1]; _api_port = addressparts[1];
} }

View File

@ -1,5 +1,8 @@
#include "LedDeviceUdpH801.h" #include "LedDeviceUdpH801.h"
const ushort H801_DEFAULT_PORT = 30977;
static const char H801_DEFAULT_HOST[] = "255.255.255.255";
LedDeviceUdpH801::LedDeviceUdpH801(const QJsonObject &deviceConfig) LedDeviceUdpH801::LedDeviceUdpH801(const QJsonObject &deviceConfig)
: ProviderUdp() : ProviderUdp()
{ {
@ -31,8 +34,8 @@ bool LedDeviceUdpH801::init(const QJsonObject &deviceConfig)
} }
_message = QByteArray(_prefix_size + _colors + _id_size * _ids.size() + _suffix_size, 0x00); _message = QByteArray(_prefix_size + _colors + _id_size * _ids.size() + _suffix_size, 0x00);
_message[0] = 0xFB; _message[0] = static_cast<char>(0xFB);
_message[1] = 0xEB; _message[1] = static_cast<char>(0xEB);
for (int i = 0; i < _ids.length(); i++) { for (int i = 0; i < _ids.length(); i++) {
_message[_prefix_size + _colors + i * _id_size + 0] = (_ids[i] >> 0x00) & 0xFF; _message[_prefix_size + _colors + i * _id_size + 0] = (_ids[i] >> 0x00) & 0xFF;

View File

@ -8,9 +8,6 @@
/// ///
/// ///
const ushort H801_DEFAULT_PORT = 30977;
static const char H801_DEFAULT_HOST[] = "255.255.255.255";
class LedDeviceUdpH801: public ProviderUdp class LedDeviceUdpH801: public ProviderUdp
{ {
protected: protected:

View File

@ -14,6 +14,8 @@
// Local Hyperion includes // Local Hyperion includes
#include "ProviderUdp.h" #include "ProviderUdp.h"
const ushort MAX_PORT = 65535;
ProviderUdp::ProviderUdp() ProviderUdp::ProviderUdp()
: LedDevice() : LedDevice()
, _udpSocket (nullptr) , _udpSocket (nullptr)
@ -25,9 +27,12 @@ ProviderUdp::ProviderUdp()
} }
ProviderUdp::~ProviderUdp() ProviderUdp::~ProviderUdp()
{
if ( _udpSocket != nullptr )
{ {
_udpSocket->deleteLater(); _udpSocket->deleteLater();
} }
}
bool ProviderUdp::init(const QJsonObject &deviceConfig) bool ProviderUdp::init(const QJsonObject &deviceConfig)
{ {
@ -79,17 +84,18 @@ bool ProviderUdp::initNetwork()
_udpSocket = new QUdpSocket(this); _udpSocket = new QUdpSocket(this);
// Try to bind the UDP-Socket
if ( _udpSocket != nullptr ) if ( _udpSocket != nullptr )
{ {
QHostAddress localAddress = QHostAddress::Any; QHostAddress localAddress = QHostAddress::Any;
quint16 localPort = 0; quint16 localPort = 0;
if ( !_udpSocket->bind(localAddress, localPort) ) if ( !_udpSocket->bind(localAddress, localPort) )
{ {
Warning ( _log, "Could not bind local address: %s", strerror(errno)); QString warntext = QString ("Could not bind local address: %1, (%2) %3").arg(localAddress.toString()).arg(_udpSocket->error()).arg(_udpSocket->errorString());
Warning ( _log, "%s", QSTRING_CSTR(warntext));
} }
isInitOK = true; isInitOK = true;
} }
return isInitOK; return isInitOK;
} }
@ -120,18 +126,24 @@ void ProviderUdp::close()
{ {
LedDevice::close(); LedDevice::close();
// LedDevice specific closing activites
if ( _udpSocket != nullptr ) if ( _udpSocket != nullptr )
{ {
// Test, if device requires closing
if ( _udpSocket->isOpen() )
{
Debug(_log,"Close UDP-device: %s", QSTRING_CSTR( this->getActiveDeviceType() ) );
_udpSocket->close(); _udpSocket->close();
// Everything is OK -> device is closed
}
} }
} }
int ProviderUdp::writeBytes(const unsigned size, const uint8_t * data) int ProviderUdp::writeBytes(const unsigned size, const uint8_t * data)
{ {
qint64 retVal = _udpSocket->writeDatagram((const char *)data,size,_address,_port); qint64 retVal = _udpSocket->writeDatagram((const char *)data,size,_address,_port);
WarningIf((retVal<0), _log, "Error sending: %s", strerror(errno));
WarningIf((retVal<0), _log, "&s", QSTRING_CSTR(QString
("(%1:%2) Write Error: (%3) %4").arg(_address.toString()).arg(_port).arg(_udpSocket->error()).arg(_udpSocket->errorString())));
return retVal; return retVal;
} }

View File

@ -9,8 +9,6 @@
class QUdpSocket; class QUdpSocket;
const ushort MAX_PORT = 65535;
/// ///
/// The ProviderUdp implements an abstract base-class for LedDevices using UDP packets. /// The ProviderUdp implements an abstract base-class for LedDevices using UDP packets.
/// ///

View File

@ -1,11 +1,12 @@
#include "LedDeviceFile.h" #include "LedDeviceFile.h"
#include <chrono> // Qt includes
#include <iomanip> #include <Qt>
#include <iostream> #include <QTextStream>
LedDeviceFile::LedDeviceFile(const QJsonObject &deviceConfig) LedDeviceFile::LedDeviceFile(const QJsonObject &deviceConfig)
: LedDevice() : LedDevice()
, _file (nullptr)
{ {
_devConfig = deviceConfig; _devConfig = deviceConfig;
_deviceReady = false; _deviceReady = false;
@ -14,6 +15,10 @@ LedDeviceFile::LedDeviceFile(const QJsonObject &deviceConfig)
LedDeviceFile::~LedDeviceFile() LedDeviceFile::~LedDeviceFile()
{ {
if ( _file != nullptr )
{
_file->deleteLater();
}
} }
LedDevice* LedDeviceFile::construct(const QJsonObject &deviceConfig) LedDevice* LedDeviceFile::construct(const QJsonObject &deviceConfig)
@ -28,9 +33,19 @@ bool LedDeviceFile::init(const QJsonObject &deviceConfig)
_fileName = deviceConfig["output"].toString("/dev/null"); _fileName = deviceConfig["output"].toString("/dev/null");
_printTimeStamp = deviceConfig["printTimeStamp"].toBool(false); _printTimeStamp = deviceConfig["printTimeStamp"].toBool(false);
initFile(_fileName);
return initOK; return initOK;
} }
void LedDeviceFile::initFile(const QString &fileName)
{
if ( _file == nullptr )
{
_file = new QFile(fileName);
}
}
int LedDeviceFile::open() int LedDeviceFile::open()
{ {
int retval = -1; int retval = -1;
@ -39,15 +54,12 @@ int LedDeviceFile::open()
if ( init(_devConfig) ) if ( init(_devConfig) )
{ {
if ( _ofs.is_open() ) if ( ! _file->isOpen() )
{ {
_ofs.close(); Debug(_log, "QIODevice::WriteOnly, %s", QSTRING_CSTR(_fileName));
} if ( !_file->open(QIODevice::WriteOnly | QIODevice::Text) )
_ofs.open( QSTRING_CSTR(_fileName));
if ( _ofs.fail() )
{ {
errortext = QString ("Failed to open file (%1). Error message: %2").arg(_fileName, strerror(errno)); errortext = QString ("(%1) %2, file: (%3)").arg(_file->error()).arg(_file->errorString()).arg(_fileName);
} }
else else
{ {
@ -61,6 +73,7 @@ int LedDeviceFile::open()
this->setInError( errortext ); this->setInError( errortext );
} }
} }
}
return retval; return retval;
} }
@ -68,43 +81,47 @@ void LedDeviceFile::close()
{ {
LedDevice::close(); LedDevice::close();
// LedDevice specific closing activites if ( _file != nullptr)
if ( _ofs )
{ {
_ofs.close(); // Test, if device requires closing
if ( _ofs.fail() ) if ( _file->isOpen() )
{ {
Error( _log, "Failed to close device (%s). Error message: %s", QSTRING_CSTR(_fileName), strerror(errno) ); // close device physically
Debug(_log,"File: %s", QSTRING_CSTR(_fileName) );
_file->close();
} }
} }
} }
int LedDeviceFile::write(const std::vector<ColorRgb> & ledValues) int LedDeviceFile::write(const std::vector<ColorRgb> & ledValues)
{ {
QTextStream out(_file);
//printLedValues (ledValues); //printLedValues (ledValues);
if ( _printTimeStamp ) if ( _printTimeStamp )
{ {
// get a precise timestamp as a string QDateTime now = QDateTime::currentDateTime();
const auto now = std::chrono::system_clock::now(); qint64 elapsedTimeMs = _lastWriteTime.msecsTo(now);
const auto nowAsTimeT = std::chrono::system_clock::to_time_t(now);
const auto nowMs = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
const auto elapsedTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(now - lastWriteTime); #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0))
out << now.toString(Qt::ISODateWithMs) << " | +" << QString("%1").arg( elapsedTimeMs,4);
_ofs #else
<< std::put_time(std::localtime(&nowAsTimeT), "%Y-%m-%d %T") out << now.toString(Qt::ISODate) << now.toString(".zzz") << " | +" << QString("%1").arg( elapsedTimeMs,4);
<< '.' << std::setfill('0') << std::setw(3) << nowMs.count() #endif
<< " | +" << std::setfill('0') << std::setw(4) << elapsedTimeMs.count();
lastWriteTime = now;
} }
_ofs << " ["; out << " [";
for (const ColorRgb& color : ledValues) for (const ColorRgb& color : ledValues)
{ {
_ofs << color; out << color;
} }
_ofs << "]" << std::endl;
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
out << "]" << Qt::endl;
#else
out << "]" << endl;
#endif
return 0; return 0;
} }

View File

@ -1,74 +1,84 @@
#pragma once #ifndef LEDEVICEFILE_H
#define LEDEVICEFILE_H
// STL includes // LedDevice includes
#include <fstream>
#include <chrono>
// Leddevice includes
#include <leddevice/LedDevice.h> #include <leddevice/LedDevice.h>
// Qt includes
#include <QFile>
#include <QDateTime>
/// ///
/// Implementation of the LedDevice that write the led-colors to an /// Implementation of the LedDevice that write the LED-colors to an
/// ASCII-textfile('/home/pi/LedDevice.out') /// ASCII-textfile primarily for testing purposes
/// ///
class LedDeviceFile : public LedDevice class LedDeviceFile : public LedDevice
{ {
public: public:
/// ///
/// Constructs specific LedDevice /// @brief Constructs a file output LED-device
/// ///
/// @param deviceConfig json device config /// @param deviceConfig Device's configuration as JSON-Object
/// ///
explicit LedDeviceFile(const QJsonObject &deviceConfig); explicit LedDeviceFile(const QJsonObject &deviceConfig);
/// ///
/// Destructor of this test-device /// @brief Destructor of the LedDevice
/// ///
virtual ~LedDeviceFile() override; virtual ~LedDeviceFile() override;
/// constructs leddevice ///
/// @brief Constructs the LED-device
///
/// @param[in] deviceConfig Device's configuration as JSON-Object
/// @return LedDevice constructed
static LedDevice* construct(const QJsonObject &deviceConfig); static LedDevice* construct(const QJsonObject &deviceConfig);
///
/// Sets configuration
///
/// @param deviceConfig the json device config
/// @return true if success
virtual bool init(const QJsonObject &deviceConfig) override;
public slots: public slots:
/// ///
/// Closes the output device. /// @brief Closes the output device.
/// Includes switching-off the device and stopping refreshes ///
/// @return Zero on success (i.e. device is closed), else negative
/// ///
virtual void close() override; virtual void close() override;
protected: protected:
/// ///
/// Opens and initiatialises the output device /// @brief Initialise the device's configuration
/// ///
/// @return Zero on succes (i.e. device is ready and enabled) else negative /// @param[in] deviceConfig the JSON device configuration
/// @return True, if success
///
virtual bool init(const QJsonObject &deviceConfig) override;
///
/// @brief Opens the output device.
///
/// @return Zero on success (i.e. device is ready), else negative
/// ///
virtual int open() override; virtual int open() override;
/// ///
/// Writes the given led-color values to the output stream /// @brief Writes the RGB-Color values to the LEDs.
/// ///
/// @param ledValues The color-value per led /// @param[in] ledValues The RGB-color per LED
/// /// @return Zero on success, else negative
/// @return Zero on success else negative
/// ///
virtual int write(const std::vector<ColorRgb> & ledValues) override; virtual int write(const std::vector<ColorRgb> & ledValues) override;
/// The outputstream /// The outputstream
std::ofstream _ofs; QFile* _file;
private: private:
void initFile(const QString &filename);
QString _fileName; QString _fileName;
/// Timestamp for the output record /// Timestamp for the output record
bool _printTimeStamp; bool _printTimeStamp;
/// Last write/output timestamp
std::chrono::system_clock::time_point lastWriteTime = std::chrono::system_clock::now();
}; };
#endif // LEDEVICEFILE_H

View File

@ -27,7 +27,7 @@ bool LedDeviceWS281x::init(const QJsonObject &deviceConfig)
QString whiteAlgorithm = deviceConfig["whiteAlgorithm"].toString("white_off"); QString whiteAlgorithm = deviceConfig["whiteAlgorithm"].toString("white_off");
_whiteAlgorithm = RGBW::stringToWhiteAlgorithm(whiteAlgorithm); _whiteAlgorithm = RGBW::stringToWhiteAlgorithm(whiteAlgorithm);
if (_whiteAlgorithm == RGBW::INVALID) if (_whiteAlgorithm == RGBW::WhiteAlgorithm::INVALID)
{ {
errortext = QString ("unknown whiteAlgorithm: %1").arg(whiteAlgorithm); errortext = QString ("unknown whiteAlgorithm: %1").arg(whiteAlgorithm);
isInitOK = false; isInitOK = false;

View File

@ -2,7 +2,7 @@
LedDeviceSk6812SPI::LedDeviceSk6812SPI(const QJsonObject &deviceConfig) LedDeviceSk6812SPI::LedDeviceSk6812SPI(const QJsonObject &deviceConfig)
: ProviderSpi() : ProviderSpi()
, _whiteAlgorithm(RGBW::INVALID) , _whiteAlgorithm(RGBW::WhiteAlgorithm::INVALID)
, SPI_BYTES_PER_COLOUR(4) , SPI_BYTES_PER_COLOUR(4)
, bitpair_to_byte { , bitpair_to_byte {
0b10001000, 0b10001000,
@ -30,7 +30,7 @@ bool LedDeviceSk6812SPI::init(const QJsonObject &deviceConfig)
QString whiteAlgorithm = deviceConfig["whiteAlgorithm"].toString("white_off"); QString whiteAlgorithm = deviceConfig["whiteAlgorithm"].toString("white_off");
_whiteAlgorithm = RGBW::stringToWhiteAlgorithm(whiteAlgorithm); _whiteAlgorithm = RGBW::stringToWhiteAlgorithm(whiteAlgorithm);
if (_whiteAlgorithm == RGBW::INVALID) if (_whiteAlgorithm == RGBW::WhiteAlgorithm::INVALID)
{ {
QString errortext = QString ("unknown whiteAlgorithm: %1").arg(whiteAlgorithm); QString errortext = QString ("unknown whiteAlgorithm: %1").arg(whiteAlgorithm);
this->setInError(errortext); this->setInError(errortext);

View File

@ -1,6 +1,6 @@
#include <ssdp/SSDPDiscover.h> #include <ssdp/SSDPDiscover.h>
// qt inc // Qt includes
#include <QUdpSocket> #include <QUdpSocket>
#include <QUrl> #include <QUrl>
@ -40,7 +40,7 @@ const QString SSDPDiscover::getFirstService(const searchType& type, const QStrin
_searchTarget = st; _searchTarget = st;
// search // search
sendSearch(st); sendSearch(_searchTarget);
if ( _udpSocket->waitForReadyRead(timeout_ms) ) if ( _udpSocket->waitForReadyRead(timeout_ms) )
{ {
@ -58,12 +58,18 @@ const QString SSDPDiscover::getFirstService(const searchType& type, const QStrin
QString data(datagram); QString data(datagram);
Debug(_log, "_data: [%s]", QSTRING_CSTR(data)); //Debug(_log, "_data: [%s]", QSTRING_CSTR(data));
QMap<QString,QString> headers; QMap<QString,QString> headers;
QString address; QString address;
// parse request // parse request
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList entries = data.split("\n", Qt::SkipEmptyParts);
#else
QStringList entries = data.split("\n", QString::SkipEmptyParts); QStringList entries = data.split("\n", QString::SkipEmptyParts);
#endif
for(auto entry : entries) for(auto entry : entries)
{ {
// http header parse skip // http header parse skip
@ -92,13 +98,13 @@ const QString SSDPDiscover::getFirstService(const searchType& type, const QStrin
_usnList << headers.value("usn"); _usnList << headers.value("usn");
QUrl url(headers.value("location")); QUrl url(headers.value("location"));
//Debug(_log, "Received msearch response from '%s:%d'. Search target: %s",QSTRING_CSTR(sender.toString()), senderPort, QSTRING_CSTR(headers.value("st"))); //Debug(_log, "Received msearch response from '%s:%d'. Search target: %s",QSTRING_CSTR(sender.toString()), senderPort, QSTRING_CSTR(headers.value("st")));
if(type == STY_WEBSERVER) if(type == searchType::STY_WEBSERVER)
{ {
Debug(_log, "Found service [%s] at: %s:%d", QSTRING_CSTR(st), QSTRING_CSTR(url.host()), url.port()); Debug(_log, "Found service [%s] at: %s:%d", QSTRING_CSTR(st), QSTRING_CSTR(url.host()), url.port());
return url.host()+":"+QString::number(url.port()); return url.host()+":"+QString::number(url.port());
} }
else if(type == STY_FLATBUFSERVER) else if(type == searchType::STY_FLATBUFSERVER)
{ {
const QString fbsport = headers.value("hyperion-fbs-port"); const QString fbsport = headers.value("hyperion-fbs-port");
if(fbsport.isEmpty()) if(fbsport.isEmpty())
@ -111,7 +117,7 @@ const QString SSDPDiscover::getFirstService(const searchType& type, const QStrin
return url.host()+":"+fbsport; return url.host()+":"+fbsport;
} }
} }
else if(type == STY_JSONSERVER) else if(type == searchType::STY_JSONSERVER)
{ {
const QString jssport = headers.value("hyperion-jss-port"); const QString jssport = headers.value("hyperion-jss-port");
if(jssport.isEmpty()) if(jssport.isEmpty())
@ -146,7 +152,11 @@ void SSDPDiscover::readPendingDatagrams()
QString data(datagram); QString data(datagram);
QMap<QString,QString> headers; QMap<QString,QString> headers;
// parse request // parse request
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList entries = data.split("\n", Qt::SkipEmptyParts);
#else
QStringList entries = data.split("\n", QString::SkipEmptyParts); QStringList entries = data.split("\n", QString::SkipEmptyParts);
#endif
for(auto entry : entries) for(auto entry : entries)
{ {
// http header parse skip // http header parse skip

View File

@ -137,7 +137,11 @@ void SSDPServer::readPendingDatagrams()
QString data(datagram); QString data(datagram);
QMap<QString,QString> headers; QMap<QString,QString> headers;
// parse request // parse request
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList entries = data.split("\n", Qt::SkipEmptyParts);
#else
QStringList entries = data.split("\n", QString::SkipEmptyParts); QStringList entries = data.split("\n", QString::SkipEmptyParts);
#endif
for(auto entry : entries) for(auto entry : entries)
{ {
// http header parse skip // http header parse skip

View File

@ -8,7 +8,7 @@ ImageResampler::ImageResampler()
, _cropRight(0) , _cropRight(0)
, _cropTop(0) , _cropTop(0)
, _cropBottom(0) , _cropBottom(0)
, _videoMode(VIDEO_2D) , _videoMode(VideoMode::VIDEO_2D)
{ {
} }
@ -47,10 +47,10 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i
// handle 3D mode // handle 3D mode
switch (_videoMode) switch (_videoMode)
{ {
case VIDEO_3DSBS: case VideoMode::VIDEO_3DSBS:
cropRight = width >> 1; cropRight = width >> 1;
break; break;
case VIDEO_3DTAB: case VideoMode::VIDEO_3DTAB:
cropBottom = width >> 1; cropBottom = width >> 1;
break; break;
default: default:
@ -71,7 +71,7 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i
switch (pixelFormat) switch (pixelFormat)
{ {
case PIXELFORMAT_UYVY: case PixelFormat::UYVY:
{ {
int index = lineLength * ySource + (xSource << 1); int index = lineLength * ySource + (xSource << 1);
uint8_t y = data[index+1]; uint8_t y = data[index+1];
@ -80,7 +80,7 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i
yuv2rgb(y, u, v, rgb.red, rgb.green, rgb.blue); yuv2rgb(y, u, v, rgb.red, rgb.green, rgb.blue);
} }
break; break;
case PIXELFORMAT_YUYV: case PixelFormat::YUYV:
{ {
int index = lineLength * ySource + (xSource << 1); int index = lineLength * ySource + (xSource << 1);
uint8_t y = data[index]; uint8_t y = data[index];
@ -89,7 +89,7 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i
yuv2rgb(y, u, v, rgb.red, rgb.green, rgb.blue); yuv2rgb(y, u, v, rgb.red, rgb.green, rgb.blue);
} }
break; break;
case PIXELFORMAT_BGR16: case PixelFormat::BGR16:
{ {
int index = lineLength * ySource + (xSource << 1); int index = lineLength * ySource + (xSource << 1);
rgb.blue = (data[index] & 0x1f) << 3; rgb.blue = (data[index] & 0x1f) << 3;
@ -97,7 +97,7 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i
rgb.red = (data[index+1] & 0xF8); rgb.red = (data[index+1] & 0xF8);
} }
break; break;
case PIXELFORMAT_BGR24: case PixelFormat::BGR24:
{ {
int index = lineLength * ySource + (xSource << 1) + xSource; int index = lineLength * ySource + (xSource << 1) + xSource;
rgb.blue = data[index ]; rgb.blue = data[index ];
@ -105,7 +105,7 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i
rgb.red = data[index+2]; rgb.red = data[index+2];
} }
break; break;
case PIXELFORMAT_RGB32: case PixelFormat::RGB32:
{ {
int index = lineLength * ySource + (xSource << 2); int index = lineLength * ySource + (xSource << 2);
rgb.red = data[index ]; rgb.red = data[index ];
@ -113,7 +113,7 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i
rgb.blue = data[index+2]; rgb.blue = data[index+2];
} }
break; break;
case PIXELFORMAT_BGR32: case PixelFormat::BGR32:
{ {
int index = lineLength * ySource + (xSource << 2); int index = lineLength * ySource + (xSource << 2);
rgb.blue = data[index ]; rgb.blue = data[index ];
@ -122,10 +122,10 @@ void ImageResampler::processImage(const uint8_t * data, int width, int height, i
} }
break; break;
#ifdef HAVE_JPEG_DECODER #ifdef HAVE_JPEG_DECODER
case PIXELFORMAT_MJPEG: case PixelFormat::MJPEG:
break; break;
#endif #endif
case PIXELFORMAT_NO_CHANGE: case PixelFormat::NO_CHANGE:
Error(Logger::getInstance("ImageResampler"), "Invalid pixel format given"); Error(Logger::getInstance("ImageResampler"), "Invalid pixel format given");
break; break;
} }

View File

@ -7,18 +7,18 @@ namespace RGBW {
WhiteAlgorithm stringToWhiteAlgorithm(QString str) WhiteAlgorithm stringToWhiteAlgorithm(QString str)
{ {
if (str == "subtract_minimum") return SUBTRACT_MINIMUM; if (str == "subtract_minimum") return WhiteAlgorithm::SUBTRACT_MINIMUM;
if (str == "sub_min_warm_adjust") return SUB_MIN_WARM_ADJUST; if (str == "sub_min_warm_adjust") return WhiteAlgorithm::SUB_MIN_WARM_ADJUST;
if (str == "sub_min_cool_adjust") return SUB_MIN_COOL_ADJUST; if (str == "sub_min_cool_adjust") return WhiteAlgorithm::SUB_MIN_COOL_ADJUST;
if (str.isEmpty() || str == "white_off") return WHITE_OFF; if (str.isEmpty() || str == "white_off") return WhiteAlgorithm::WHITE_OFF;
return INVALID; return WhiteAlgorithm::INVALID;
} }
void Rgb_to_Rgbw(ColorRgb input, ColorRgbw * output, const WhiteAlgorithm algorithm) void Rgb_to_Rgbw(ColorRgb input, ColorRgbw * output, const WhiteAlgorithm algorithm)
{ {
switch (algorithm) switch (algorithm)
{ {
case SUBTRACT_MINIMUM: case WhiteAlgorithm::SUBTRACT_MINIMUM:
{ {
output->white = qMin(qMin(input.red, input.green), input.blue); output->white = qMin(qMin(input.red, input.green), input.blue);
output->red = input.red - output->white; output->red = input.red - output->white;
@ -27,13 +27,13 @@ void Rgb_to_Rgbw(ColorRgb input, ColorRgbw * output, const WhiteAlgorithm algori
break; break;
} }
case SUB_MIN_WARM_ADJUST: case WhiteAlgorithm::SUB_MIN_WARM_ADJUST:
{ {
// http://forum.garagecube.com/viewtopic.php?t=10178 // http://forum.garagecube.com/viewtopic.php?t=10178
// warm white // warm white
float F1 = 0.274; float F1 = static_cast<float>(0.274);
float F2 = 0.454; float F2 = static_cast<float>(0.454);
float F3 = 2.333; float F3 = static_cast<float>(2.333);
output->white = qMin(input.red*F1,qMin(input.green*F2,input.blue*F3)); output->white = qMin(input.red*F1,qMin(input.green*F2,input.blue*F3));
output->red = input.red - output->white/F1; output->red = input.red - output->white/F1;
@ -42,13 +42,13 @@ void Rgb_to_Rgbw(ColorRgb input, ColorRgbw * output, const WhiteAlgorithm algori
break; break;
} }
case SUB_MIN_COOL_ADJUST: case WhiteAlgorithm::SUB_MIN_COOL_ADJUST:
{ {
// http://forum.garagecube.com/viewtopic.php?t=10178 // http://forum.garagecube.com/viewtopic.php?t=10178
// cold white // cold white
float F1 = 0.299; float F1 = static_cast<float>(0.299);
float F2 = 0.587; float F2 = static_cast<float>(0.587);
float F3 = 0.114; float F3 = static_cast<float>(0.114);
output->white = qMin(input.red*F1,qMin(input.green*F2,input.blue*F3)); output->white = qMin(input.red*F1,qMin(input.green*F2,input.blue*F3));
output->red = input.red - output->white/F1; output->red = input.red - output->white/F1;
@ -57,7 +57,7 @@ void Rgb_to_Rgbw(ColorRgb input, ColorRgbw * output, const WhiteAlgorithm algori
break; break;
} }
case WHITE_OFF: case WhiteAlgorithm::WHITE_OFF:
{ {
output->red = input.red; output->red = input.red;
output->green = input.green; output->green = input.green;

View File

@ -58,7 +58,11 @@ void QtHttpClientWrapper::onClientDataReceived (void)
case AwaitingRequest: // "command url version" × 1 case AwaitingRequest: // "command url version" × 1
{ {
QString str = QString::fromUtf8 (line).trimmed (); QString str = QString::fromUtf8 (line).trimmed ();
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList parts = str.split (SPACE, Qt::SkipEmptyParts);
#else
QStringList parts = str.split (SPACE, QString::SkipEmptyParts); QStringList parts = str.split (SPACE, QString::SkipEmptyParts);
#endif
if (parts.size () == 3) if (parts.size () == 3)
{ {
@ -192,7 +196,12 @@ void QtHttpClientWrapper::onClientDataReceived (void)
// catch /jsonrpc in url, we need async callback, StaticFileServing is sync // catch /jsonrpc in url, we need async callback, StaticFileServing is sync
QString path = m_currentRequest->getUrl ().path (); QString path = m_currentRequest->getUrl ().path ();
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList uri_parts = path.split('/', Qt::SkipEmptyParts);
#else
QStringList uri_parts = path.split('/', QString::SkipEmptyParts); QStringList uri_parts = path.split('/', QString::SkipEmptyParts);
#endif
if ( ! uri_parts.empty() && uri_parts.at(0) == "json-rpc" ) if ( ! uri_parts.empty() && uri_parts.at(0) == "json-rpc" )
{ {

View File

@ -81,7 +81,11 @@ void StaticFileServing::onRequestNeedsReply (QtHttpRequest * request, QtHttpRepl
if (command == QStringLiteral ("GET")) if (command == QStringLiteral ("GET"))
{ {
QString path = request->getUrl ().path (); QString path = request->getUrl ().path ();
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QStringList uri_parts = path.split('/', Qt::SkipEmptyParts);
#else
QStringList uri_parts = path.split('/', QString::SkipEmptyParts); QStringList uri_parts = path.split('/', QString::SkipEmptyParts);
#endif
// special uri handling for server commands // special uri handling for server commands
if ( ! uri_parts.empty() ) if ( ! uri_parts.empty() )

View File

@ -239,7 +239,7 @@ void WebSocketClient::handleBinaryMessage(QByteArray &data)
unsigned width = ((data.at(2) << 8) & 0xFF00) | (data.at(3) & 0xFF); unsigned width = ((data.at(2) << 8) & 0xFF00) | (data.at(3) & 0xFF);
unsigned height = imgSize / width; unsigned height = imgSize / width;
if ( ! (imgSize) % width) if ( imgSize % width > 0 )
{ {
Error(_log, "data size is not multiple of width"); Error(_log, "data size is not multiple of width");
return; return;

View File

@ -69,7 +69,7 @@ int main(int argc, char ** argv)
if(argAddress.value(parser) == "127.0.0.1:19400") if(argAddress.value(parser) == "127.0.0.1:19400")
{ {
SSDPDiscover discover; SSDPDiscover discover;
address = discover.getFirstService(STY_FLATBUFSERVER); address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty()) if(address.isEmpty())
{ {
address = argAddress.value(parser); address = argAddress.value(parser);

View File

@ -57,15 +57,15 @@ int main(int argc, char ** argv)
// parse all options // parse all options
parser.process(app); parser.process(app);
VideoMode videoMode = VIDEO_2D; VideoMode videoMode = VideoMode::VIDEO_2D;
if (parser.isSet(arg3DSBS)) if (parser.isSet(arg3DSBS))
{ {
videoMode = VIDEO_3DSBS; videoMode = VideoMode::VIDEO_3DSBS;
} }
else if (parser.isSet(arg3DTAB)) else if (parser.isSet(arg3DTAB))
{ {
videoMode = VIDEO_3DTAB; videoMode = VideoMode::VIDEO_3DTAB;
} }
// check if we need to display the usage. exit if we do. // check if we need to display the usage. exit if we do.
@ -98,7 +98,7 @@ int main(int argc, char ** argv)
if(argAddress.value(parser) == "127.0.0.1:19400") if(argAddress.value(parser) == "127.0.0.1:19400")
{ {
SSDPDiscover discover; SSDPDiscover discover;
address = discover.getFirstService(STY_FLATBUFSERVER); address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty()) if(address.isEmpty())
{ {
address = argAddress.value(parser); address = argAddress.value(parser);

View File

@ -62,7 +62,7 @@ int main(int argc, char ** argv)
if(argAddress.value(parser) == "127.0.0.1:19400") if(argAddress.value(parser) == "127.0.0.1:19400")
{ {
SSDPDiscover discover; SSDPDiscover discover;
address = discover.getFirstService(STY_FLATBUFSERVER); address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty()) if(address.isEmpty())
{ {
address = argAddress.value(parser); address = argAddress.value(parser);

View File

@ -65,7 +65,7 @@ int main(int argc, char ** argv)
if(argAddress.value(parser) == "127.0.0.1:19400") if(argAddress.value(parser) == "127.0.0.1:19400")
{ {
SSDPDiscover discover; SSDPDiscover discover;
address = discover.getFirstService(STY_FLATBUFSERVER); address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty()) if(address.isEmpty())
{ {
address = argAddress.value(parser); address = argAddress.value(parser);

View File

@ -78,7 +78,7 @@ int main(int argc, char ** argv)
if(argAddress.value(parser) == "127.0.0.1:19400") if(argAddress.value(parser) == "127.0.0.1:19400")
{ {
SSDPDiscover discover; SSDPDiscover discover;
address = discover.getFirstService(STY_FLATBUFSERVER); address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty()) if(address.isEmpty())
{ {
address = argAddress.value(parser); address = argAddress.value(parser);

View File

@ -182,7 +182,7 @@ int main(int argc, char * argv[])
if(argAddress.value(parser) == "127.0.0.1:19444") if(argAddress.value(parser) == "127.0.0.1:19444")
{ {
SSDPDiscover discover; SSDPDiscover discover;
address = discover.getFirstService(STY_JSONSERVER); address = discover.getFirstService(searchType::STY_JSONSERVER);
if(address.isEmpty()) if(address.isEmpty())
{ {
address = argAddress.value(parser); address = argAddress.value(parser);

View File

@ -84,18 +84,18 @@ int main(int argc, char** argv)
BooleanOption & argSkipReply = parser.add<BooleanOption>(0x0, "skip-reply", "Do not receive and check reply messages from Hyperion"); BooleanOption & argSkipReply = parser.add<BooleanOption>(0x0, "skip-reply", "Do not receive and check reply messages from Hyperion");
BooleanOption & argHelp = parser.add<BooleanOption>('h', "help", "Show this help message and exit"); BooleanOption & argHelp = parser.add<BooleanOption>('h', "help", "Show this help message and exit");
argVideoStandard.addSwitch("pal", VIDEOSTANDARD_PAL); argVideoStandard.addSwitch("pal", VideoStandard::PAL);
argVideoStandard.addSwitch("ntsc", VIDEOSTANDARD_NTSC); argVideoStandard.addSwitch("ntsc", VideoStandard::NTSC);
argVideoStandard.addSwitch("secam", VIDEOSTANDARD_SECAM); argVideoStandard.addSwitch("secam", VideoStandard::SECAM);
argVideoStandard.addSwitch("no-change", VIDEOSTANDARD_NO_CHANGE); argVideoStandard.addSwitch("no-change", VideoStandard::NO_CHANGE);
argPixelFormat.addSwitch("yuyv", PIXELFORMAT_YUYV); argPixelFormat.addSwitch("yuyv", PixelFormat::YUYV);
argPixelFormat.addSwitch("uyvy", PIXELFORMAT_UYVY); argPixelFormat.addSwitch("uyvy", PixelFormat::UYVY);
argPixelFormat.addSwitch("rgb32", PIXELFORMAT_RGB32); argPixelFormat.addSwitch("rgb32", PixelFormat::RGB32);
#ifdef HAVE_JPEG #ifdef HAVE_JPEG
argPixelFormat.addSwitch("mjpeg", PIXELFORMAT_MJPEG); argPixelFormat.addSwitch("mjpeg", PixelFormat::MJPEG);
#endif #endif
argPixelFormat.addSwitch("no-change", PIXELFORMAT_NO_CHANGE); argPixelFormat.addSwitch("no-change", PixelFormat::NO_CHANGE);
// parse all options // parse all options
parser.process(app); parser.process(app);
@ -173,11 +173,11 @@ int main(int argc, char** argv)
// set 3D mode if applicable // set 3D mode if applicable
if (parser.isSet(arg3DSBS)) if (parser.isSet(arg3DSBS))
{ {
grabber.setVideoMode(VIDEO_3DSBS); grabber.setVideoMode(VideoMode::VIDEO_3DSBS);
} }
else if (parser.isSet(arg3DTAB)) else if (parser.isSet(arg3DTAB))
{ {
grabber.setVideoMode(VIDEO_3DTAB); grabber.setVideoMode(VideoMode::VIDEO_3DTAB);
} }
// run the grabber // run the grabber
@ -198,7 +198,7 @@ int main(int argc, char** argv)
if(argAddress.value(parser) == "127.0.0.1:19400") if(argAddress.value(parser) == "127.0.0.1:19400")
{ {
SSDPDiscover discover; SSDPDiscover discover;
address = discover.getFirstService(STY_FLATBUFSERVER); address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty()) if(address.isEmpty())
{ {
address = argAddress.value(parser); address = argAddress.value(parser);

View File

@ -83,7 +83,7 @@ int main(int argc, char ** argv)
if(argAddress.value(parser) == "127.0.0.1:19400") if(argAddress.value(parser) == "127.0.0.1:19400")
{ {
SSDPDiscover discover; SSDPDiscover discover;
address = discover.getFirstService(STY_FLATBUFSERVER); address = discover.getFirstService(searchType::STY_FLATBUFSERVER);
if(address.isEmpty()) if(address.isEmpty())
{ {
address = argAddress.value(parser); address = argAddress.value(parser);

View File

@ -77,7 +77,12 @@ unsigned int getProcessIdsByProcessName(const char *processName, QStringList &li
if (bytes.isEmpty()) if (bytes.isEmpty())
return 0; return 0;
#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
listOfPids = QString(bytes).split("\n", Qt::SkipEmptyParts);
#else
listOfPids = QString(bytes).split("\n", QString::SkipEmptyParts); listOfPids = QString(bytes).split("\n", QString::SkipEmptyParts);
#endif
return listOfPids.count(); return listOfPids.count();
#endif #endif

View File

@ -76,7 +76,7 @@ HyperionDaemon::HyperionDaemon(const QString rootPath, QObject *parent, const bo
, _osxGrabber(nullptr) , _osxGrabber(nullptr)
, _qtGrabber(nullptr) , _qtGrabber(nullptr)
, _ssdp(nullptr) , _ssdp(nullptr)
, _currVideoMode(VIDEO_2D) , _currVideoMode(VideoMode::VIDEO_2D)
{ {
HyperionDaemon::daemon = this; HyperionDaemon::daemon = this;
@ -278,7 +278,7 @@ void HyperionDaemon::handleSettingsUpdate(const settings::type &settingsType, co
if (level == "silent") if (level == "silent")
Logger::setLogLevel(Logger::OFF); Logger::setLogLevel(Logger::OFF);
else if (level == "warn") else if (level == "warn")
Logger::setLogLevel(Logger::WARNING); Logger::setLogLevel(Logger::LogLevel::WARNING);
else if (level == "verbose") else if (level == "verbose")
Logger::setLogLevel(Logger::INFO); Logger::setLogLevel(Logger::INFO);
else if (level == "debug") else if (level == "debug")
@ -325,8 +325,11 @@ void HyperionDaemon::handleSettingsUpdate(const settings::type &settingsType, co
Error(_log, "grabber device '%s' for type amlogic not found!", QSTRING_CSTR(_grabber_device)); Error(_log, "grabber device '%s' for type amlogic not found!", QSTRING_CSTR(_grabber_device));
} }
} }
else
{
// x11 -> if DISPLAY is set // x11 -> if DISPLAY is set
else if (getenv("DISPLAY") != NULL) QByteArray envDisplay = qgetenv("DISPLAY");
if ( !envDisplay.isEmpty() )
{ {
type = "x11"; type = "x11";
} }
@ -336,6 +339,7 @@ void HyperionDaemon::handleSettingsUpdate(const settings::type &settingsType, co
type = "qt"; type = "qt";
} }
} }
}
if (_prevType != type) if (_prevType != type)
{ {

View File

@ -230,7 +230,7 @@ int main(int argc, char** argv)
if (parser.isSet(versionOption)) if (parser.isSet(versionOption))
{ {
std::cout std::cout
<< "Hyperion Ambilight Deamon (" << getpid() << ")" << std::endl << "Hyperion Ambilight Deamon" << std::endl
<< "\tVersion : " << HYPERION_VERSION << " (" << HYPERION_BUILD_ID << ")" << std::endl << "\tVersion : " << HYPERION_VERSION << " (" << HYPERION_BUILD_ID << ")" << std::endl
<< "\tBuild Time: " << __DATE__ << " " << __TIME__ << std::endl; << "\tBuild Time: " << __DATE__ << " " << __TIME__ << std::endl;

View File

@ -1,13 +1,13 @@
// X11 includes
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <QElapsedTimer> #include <QElapsedTimer>
#include <utils/Image.h> #include <utils/Image.h>
#include <utils/ColorRgb.h> #include <utils/ColorRgb.h>
// X11 includes
#include <X11/Xlib.h>
#include <X11/Xutil.h>
void foo_1(int pixelDecimation) void foo_1(int pixelDecimation)
{ {
int cropWidth = 0; int cropWidth = 0;