refactor(client): Use QJsonObject for Hyperion command construction

Refactored HyperionClient to use QJsonObject and QJsonDocument for constructing JSON commands.

This improves code readability, maintainability, and reduces the risk of malformed JSON strings compared to manual string concatenation.
This commit is contained in:
Tobias J. Endres 2025-08-15 00:42:09 +02:00
parent 817caed810
commit d1497f8c91
2 changed files with 102 additions and 55 deletions

View File

@ -37,21 +37,36 @@ HyperionClient::~HyperionClient()
void HyperionClient::clearLeds()
{
_cmd_m.clear();
_cmd_m.append("{\"command\": \"clearall\",\"priority\":").append(_priority_m.toUtf8()).append("}\n");
_sendCommand();
QJsonObject fullCommand;
fullCommand["command"] = "clearall";
fullCommand["id"] = ++_idCounter;
QJsonObject params;
params["priority"] = _priority_m.toInt();
fullCommand["params"] = params;
_cmd_m = QJsonDocument(fullCommand).toJson(QJsonDocument::Compact);
_cmd_m.append("\n");
_sendCommand();
}
void HyperionClient::setLedColor(quint8 R, quint8 G, quint8 B)
{
_cmd_m.clear();
_cmd_m.append("{\"color\":[");
_cmd_m.append(QString::number(R).toUtf8());
_cmd_m.append(",");
_cmd_m.append(QString::number(G).toUtf8());
_cmd_m.append(",");
_cmd_m.append(QString::number(B).toUtf8());
_cmd_m.append("],\"command\":\"color\",\"priority\":").append(_priority_m.toUtf8()).append("}\n");
QJsonObject fullCommand;
fullCommand["command"] = "color";
fullCommand["id"] = ++_idCounter;
QJsonObject params;
QJsonArray colorArray;
colorArray.append(R);
colorArray.append(G);
colorArray.append(B);
params["color"] = colorArray;
params["priority"] = _priority_m.toInt();
fullCommand["params"] = params;
_cmd_m = QJsonDocument(fullCommand).toJson(QJsonDocument::Compact);
_cmd_m.append("\n");
_sendCommand();
}
@ -103,6 +118,7 @@ void HyperionClient::_ledAdjustments()
_colorAdjustment();
_thresholdAdjustment();
_transformdAdjustment();
_temperatureAdjustment(); // Ensure temperature adjustment is called
}
void HyperionClient::_colorAdjustment()
@ -110,25 +126,29 @@ void HyperionClient::_colorAdjustment()
if (!_colorAdjustmentType_m) {
return;
}
_cmd_m.clear();
_cmd_m.append("{\"adjustment\":{");
QJsonObject fullCommand;
fullCommand["command"] = "adjustment";
fullCommand["id"] = ++_idCounter;
QJsonObject params;
QJsonObject adjustmentObject;
if (_colorAdjustmentType_m & REDADJUST) {
_cmd_m.append("\"redAdjust\":");
_cmd_m.append(_redAdjust_m.toUtf8());
_cmd_m.append(",");
adjustmentObject["redAdjust"] = _redAdjust_m.toDouble();
}
if (_colorAdjustmentType_m & GREENADJUST) {
_cmd_m.append("\"greenAdjust\":");
_cmd_m.append(_greenAdjust_m.toUtf8());
_cmd_m.append(",");
adjustmentObject["greenAdjust"] = _greenAdjust_m.toDouble();
}
if (_colorAdjustmentType_m & BLUEADJUST) {
_cmd_m.append("\"blueAdjust\":");
_cmd_m.append(_blueAdjust_m.toUtf8());
_cmd_m.append(",");
adjustmentObject["blueAdjust"] = _blueAdjust_m.toDouble();
}
_cmd_m.chop(1); // remove trailing ,
_cmd_m.append("},\"command\":\"adjustment\",\"priority\":").append(_priority_m.toUtf8()).append("\n");
params["adjustment"] = adjustmentObject;
params["priority"] = _priority_m.toInt();
fullCommand["params"] = params;
_cmd_m = QJsonDocument(fullCommand).toJson(QJsonDocument::Compact);
_cmd_m.append("\n");
_sendCommand();
}
void HyperionClient::_thresholdAdjustment()
@ -136,10 +156,19 @@ void HyperionClient::_thresholdAdjustment()
if (_threshold_m == "") {
return;
}
_cmd_m.clear();
_cmd_m.append("{\"command\":\"transform\",\"priority\":").append(_priority_m.toUtf8()).append(",\"transform\":{\"threshold\":");
_cmd_m.append(_threshold_m.toUtf8());
_cmd_m.append("}}\n");
QJsonObject fullCommand;
fullCommand["command"] = "transform";
fullCommand["id"] = ++_idCounter;
QJsonObject params;
QJsonObject transformObject;
transformObject["threshold"] = _threshold_m.toDouble();
params["transform"] = transformObject;
params["priority"] = _priority_m.toInt();
fullCommand["params"] = params;
_cmd_m = QJsonDocument(fullCommand).toJson(QJsonDocument::Compact);
_cmd_m.append("\n");
_sendCommand();
}
@ -149,14 +178,26 @@ void HyperionClient::_transformdAdjustment()
return;
}
QStringList values = _transform_m.split(',');
_cmd_m.clear();
_cmd_m.append("{\"command\":\"transform\",\"priority\":").append(_priority_m.toUtf8()).append(",\"transform\":{\"luminanceGain\":");
_cmd_m.append(values.at(0).toUtf8());
_cmd_m.append(",\"luminanceMinimum\":");
_cmd_m.append(values.at(1).toUtf8());
_cmd_m.append(",\"saturationGain\":");
_cmd_m.append(values.at(2).toUtf8());
_cmd_m.append("}}\n");
if (values.size() != 3) {
qWarning() << "Invalid transform values:" << _transform_m;
return;
}
QJsonObject fullCommand;
fullCommand["command"] = "transform";
fullCommand["id"] = ++_idCounter;
QJsonObject params;
QJsonObject transformObject;
transformObject["luminanceGain"] = values.at(0).toDouble();
transformObject["luminanceMinimum"] = values.at(1).toDouble();
transformObject["saturationGain"] = values.at(2).toDouble();
params["transform"] = transformObject;
params["priority"] = _priority_m.toInt();
fullCommand["params"] = params;
_cmd_m = QJsonDocument(fullCommand).toJson(QJsonDocument::Compact);
_cmd_m.append("\n");
_sendCommand();
}
@ -165,10 +206,17 @@ void HyperionClient::_temperatureAdjustment()
if (_temperature_m == "") {
return;
}
_cmd_m.clear();
_cmd_m.append("{\"command\":\"temperature\",\"priority\":");
_cmd_m.append(_temperature_m.toUtf8());
_cmd_m.append("}}\n");
QJsonObject fullCommand;
fullCommand["command"] = "temperature";
fullCommand["id"] = ++_idCounter;
QJsonObject params;
params["temperature"] = _temperature_m.toDouble();
params["priority"] = _priority_m.toInt();
fullCommand["params"] = params;
_cmd_m = QJsonDocument(fullCommand).toJson(QJsonDocument::Compact);
_cmd_m.append("\n");
_sendCommand();
}
@ -180,12 +228,9 @@ void HyperionClient::sendImage(const uchar *data, int size)
fullCommand["command"] = "image";
fullCommand["id"] = ++_idCounter;
QJsonDocument paramsDoc = QJsonDocument::fromJson(imgCmdBuf);
QJsonObject paramsObject = paramsDoc.object();
_imageParams_m["imagedata"] = QString(QByteArray::fromRawData(reinterpret_cast<const char*>(data), size).toBase64());
paramsObject["imagedata"] = QString(QByteArray::fromRawData(reinterpret_cast<const char*>(data), size).toBase64());
fullCommand["params"] = paramsObject;
fullCommand["params"] = _imageParams_m;
_cmd_m = QJsonDocument(fullCommand).toJson(QJsonDocument::Compact);
_cmd_m.append("\n"); // Add newline terminator
@ -196,14 +241,13 @@ void HyperionClient::sendImage(const uchar *data, int size)
void HyperionClient::setImgSize(int width, int height)
{
QJsonObject params;
params["priority"] = _priority_m.toInt();
params["imageheight"] = height;
params["imagewidth"] = width;
QJsonDocument doc(params);
imgCmdBuf = doc.toJson(QJsonDocument::Compact).chopped(1); // Remove trailing '}'
imgCmdBuf.append(",\"imagedata\":\"");
_imageParams_m["priority"] = _priority_m.toInt();
_imageParams_m["imageheight"] = height;
_imageParams_m["imagewidth"] = width;
_imageParams_m["duration"] = -1; // Default value
_imageParams_m["scale"] = -1; // Default value
_imageParams_m["format"] = "rgb"; // Default value
_imageParams_m["name"] = ""; // Default value
}
@ -225,11 +269,11 @@ void HyperionClient::_disconnected()
void HyperionClient::_readyRead()
{
QByteArray data = _sock_p->readAll();
qDebug() << "Received from Hyperion:" << data;
qDebug() << "Received from Hyperion: " << data;
}
void HyperionClient::_socketError(QAbstractSocket::SocketError socketError)
{
Q_UNUSED(socketError);
qWarning() << "Socket Error:" << _sock_p->errorString();
}
}

View File

@ -5,6 +5,7 @@
#include <QTcpSocket>
#include <QByteArray>
#include <QTimer> // Added for QTimer::singleShot
#include <QJsonObject>
class HyperionClient : public QObject
{
@ -36,6 +37,7 @@ private:
QString _priority_m;
QByteArray _cmd_m;
QByteArray imgCmdBuf;
QJsonObject _imageParams_m;
void _connectHost();
void _sendCommand();
@ -56,6 +58,7 @@ private:
QString _blueAdjust_m;
QString _temperature_m;
QString _threshold_m;
QString _transform_m;
static int _idCounter;
};