Added a qDebug() statement in hgx11net::_sendCommand() to log the JSON command string just before it is sent to the Hyperion server. This will help in debugging why no results are appearing on the Hyperion end, by confirming if commands are being sent and what their content is.
201 lines
6.8 KiB
C++
201 lines
6.8 KiB
C++
#include "hgx11.h"
|
|
|
|
// public
|
|
|
|
hgx11::hgx11(QHash<QString, QString> opts)
|
|
{
|
|
QString addr = "localhost";
|
|
unsigned short port = 19444;
|
|
unsigned short scale = 8;
|
|
unsigned short frameskip = 0;
|
|
unsigned short priority = 100;
|
|
const char * filter = FilterNearest;
|
|
QString redAdjust = "", greenAdjust = "", blueAdjust = "";
|
|
QString temperature = "", threshold = "", transform = "";
|
|
QHashIterator<QString, QString> i(opts);
|
|
while (i.hasNext()) {
|
|
i.next();
|
|
if ((i.key() == "a" || i.key() == "address") && !(i.value().isNull() && i.value().isEmpty())) {
|
|
addr = i.value();
|
|
} else if ((i.key() == "p" || i.key() == "port") && i.value().toUShort()) {
|
|
port = i.value().toUShort();
|
|
} else if ((i.key() == "c" || i.key() == "priority") && (i.value().toUShort() && i.value().toUShort() <= 255)) {
|
|
priority = i.value().toUShort();
|
|
} else if ((i.key() == "s" || i.key() == "scale") && i.value().toUShort()) {
|
|
scale = i.value().toUShort();
|
|
} else if ((i.key() == "f" || i.key() == "frameskip") && (i.value().toUShort() && i.value().toUShort() <= 255)) {
|
|
frameskip = i.value().toUShort();
|
|
} else if ((i.key() == "i" || i.key() == "inactive") && i.value().toInt()) {
|
|
_inactiveTime_m = (i.value().toInt() * 1000);
|
|
} else if ((i.key() == "j" || i.key() == "inactivetype") && i.value().toInt() == 1) {
|
|
_inactiveXss_m = true;
|
|
} else if (i.key() == "r" || i.key() == "redadjust") {
|
|
redAdjust = _parseColorArr(i.value(), 1);
|
|
} else if (i.key() == "g" || i.key() == "greenadjust") {
|
|
greenAdjust = _parseColorArr(i.value(), 1);
|
|
} else if (i.key() == "b" || i.key() == "blueadjust") {
|
|
blueAdjust = _parseColorArr(i.value(), 1);
|
|
} else if (i.key() == "t" || i.key() == "temperature") {
|
|
temperature = _parseColorArr(i.value(), 1);
|
|
} else if (i.key() == "d" || i.key() == "threshold") {
|
|
threshold = _parseColorArr(i.value(), 0);
|
|
} else if ((i.key() == "l" || i.key() == "transform") && _parseColorArr(i.value(), 0) != "") {
|
|
transform = i.value();
|
|
} else if ((i.key() == "x" || i.key() == "scalefilter") && i.value().toInt()) {
|
|
switch (i.value().toInt()) {
|
|
case 1:
|
|
filter = FilterBilinear;
|
|
break;
|
|
case 2:
|
|
filter = FilterFast;
|
|
break;
|
|
case 3:
|
|
filter = FilterGood;
|
|
break;
|
|
case 4:
|
|
filter = FilterBest;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// _hyperionPriority_m now stores only the priority value, not the "priority:" key.
|
|
_hyperionPriority_m = QString::number(priority);
|
|
|
|
_display_p = XOpenDisplay(nullptr);
|
|
if(_display_p == nullptr){
|
|
qCritical() << "Failed to open X11 display";
|
|
return;
|
|
}
|
|
|
|
_grabber_p = new hgx11grab(_display_p, scale, filter);
|
|
_hclient_p = new hgx11net(addr, port, _hyperionPriority_m);
|
|
_damage_p = new hgx11damage(&_grabbed_m, frameskip);
|
|
if (_inactiveXss_m) {
|
|
_screensaver_p = new hgx11screensaver(_display_p);
|
|
_inactiveTimeXss_m = ulong(_inactiveTime_m);
|
|
}
|
|
|
|
_setImgSize();
|
|
_hclient_p->ledAdjustments(redAdjust, greenAdjust, blueAdjust, temperature, threshold, transform);
|
|
|
|
connect(_damage_p, SIGNAL(damageDetected()), this, SLOT(_grabImage()));
|
|
connect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize()));
|
|
connect(_grabber_p, SIGNAL(imageCreated()), this, SLOT(_sendImage()));
|
|
_grabActive_m = true;
|
|
|
|
if (_inactiveTime_m) {
|
|
_timer_p = new QTimer(this);
|
|
if (!_inactiveXss_m) {
|
|
connect(_timer_p, SIGNAL(timeout()), this, SLOT(_inActivity()));
|
|
connect(_damage_p, SIGNAL(damageDetected()), this, SLOT(_activity()));
|
|
_timer_p->start(_inactiveTime_m);
|
|
} else {
|
|
connect(_timer_p, SIGNAL(timeout()), this, SLOT(_checkXss()));
|
|
_timer_p->start(1000);
|
|
}
|
|
}
|
|
|
|
_damage_p->start();
|
|
}
|
|
|
|
hgx11::~hgx11()
|
|
{
|
|
_grabbed_m.wakeAll();
|
|
_timer_p->stop();
|
|
disconnect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame()));
|
|
disconnect(_grabber_p, SIGNAL(scaleChanged()), this, SLOT(_setImgSize()));
|
|
disconnect(_grabber_p, SIGNAL(imageCreated()), this, SLOT(_sendImage()));
|
|
if (!_inactiveXss_m) {
|
|
disconnect(_timer_p, SIGNAL(timeout()), this, SLOT(_inActivity()));
|
|
disconnect(_damage_p, SIGNAL(damageDetected()), this, SLOT(_activity()));
|
|
|
|
} else {
|
|
disconnect(_timer_p, SIGNAL(timeout()), this, SLOT(_checkXss()));
|
|
delete _screensaver_p;
|
|
}
|
|
if (_display_p != nullptr) {
|
|
XCloseDisplay(_display_p);
|
|
}
|
|
delete _hclient_p;
|
|
_damage_p->terminate();
|
|
while (!_damage_p->isFinished()) {}
|
|
delete _damage_p;
|
|
delete _grabber_p;
|
|
delete _timer_p;
|
|
}
|
|
|
|
// private
|
|
|
|
QString hgx11::_parseColorArr(QString value, bool isInt)
|
|
{
|
|
QStringList values = value.split(',');
|
|
if (values.size() != 3) {
|
|
return "";
|
|
}
|
|
value = "[";
|
|
for (int i = 0; i < 3; i++) {
|
|
if (isInt && (values.at(i).toInt() < 0 || values.at(i).toInt() > 255)) {
|
|
return "";
|
|
}
|
|
if (!isInt && (values.at(i).toDouble() < 0.0 || values.at(i).toDouble() > 1.0)) {
|
|
return "";
|
|
}
|
|
value.append(values.at(i));
|
|
value.append(",");
|
|
}
|
|
value.chop(1);
|
|
value.append("]");
|
|
return value;
|
|
}
|
|
|
|
// private slots
|
|
|
|
void hgx11::_grabImage()
|
|
{
|
|
_grabber_p->grabFrame();
|
|
_grabbed_m.wakeAll();
|
|
}
|
|
|
|
void hgx11::_sendImage()
|
|
{
|
|
_hclient_p->sendImage(_grabber_p->imgdata_m);
|
|
}
|
|
|
|
void hgx11::_inActivity()
|
|
{
|
|
_hclient_p->clearLeds();
|
|
}
|
|
|
|
void hgx11::_activity()
|
|
{
|
|
_timer_p->stop();
|
|
_timer_p->start(_inactiveTime_m);
|
|
}
|
|
|
|
void hgx11::_setImgSize()
|
|
{
|
|
_hclient_p->imgCmdBuf.clear();
|
|
_hclient_p->imgCmdBuf.append("{\"command\":\"image\",\"priority\":").append(_hyperionPriority_m.toUtf8()).append(",\"imageheight\":");
|
|
_hclient_p->imgCmdBuf.append(QString::number(_grabber_p->getDest_height()).toUtf8());
|
|
_hclient_p->imgCmdBuf.append(",\"imagewidth\":");
|
|
_hclient_p->imgCmdBuf.append(QString::number(_grabber_p->getDest_width()).toUtf8());
|
|
_hclient_p->imgCmdBuf.append(",\"imagedata\":\"");
|
|
}
|
|
|
|
void hgx11::_checkXss()
|
|
{
|
|
if (_screensaver_p->lastX11ActivitySeconds() < _inactiveTimeXss_m) {
|
|
if (!_grabActive_m) {
|
|
connect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame()));
|
|
_grabActive_m = true;
|
|
}
|
|
return;
|
|
}
|
|
if (_grabActive_m) {
|
|
disconnect(_damage_p, SIGNAL(damageDetected()), _grabber_p, SLOT(grabFrame()));
|
|
_grabActive_m = false;
|
|
_inActivity();
|
|
}
|
|
}
|