Files
tenmon/phd.cpp
T

94 lines
2.4 KiB
C++

#include "phd.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
const QHash<PHDState, QString> stateMap = {{Stopped, "Stopped"}, {Selected,"Selected"}, {Calibrating,"Calibrating"}, {Guiding,"Guiding"},
{LostLock,"LostLock"}, {Paused,"Paused"}, {Looping,"Looping"}};
PHD::PHD(QObject *parent) : QObject(parent)
,_messageId(0)
{
_socket = new QTcpSocket(this);
connect(_socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
void PHD::connectTo(const QHostAddress &address, int port)
{
if(_socket->state() == QTcpSocket::ConnectedState)
{
_socket->disconnect();
_socket->waitForDisconnected();
}
_socket->connectToHost(address, port);
}
QString PHD::stateToString(PHDState state)
{
if(stateMap.contains(state))
return stateMap[state];
else
return QString();
}
PHDState PHD::stringToState(const QString &state)
{
return stateMap.key(state, Unknown);
}
void PHD::dither(float pixels, bool raOnly, int time, int timeout)
{
QVariantList params;
params.append(pixels);
params.append(raOnly);
params.append(QVariantHash({{"pixels",pixels/2.0},{"time",time},{"timeout",timeout}}));
invokeMethod("dither", params);
}
void PHD::parseMessage()
{
QJsonDocument json = QJsonDocument::fromJson(_data);
QJsonObject message = json.object();
//qDebug() << message;
if(message.contains("Event"))
{
QString event = message.value("Event").toString();
if(event=="AppState")
emit stateChanged(stringToState(message.value("State").toString()));
else if(event=="SettleDone")
{
qDebug() << message;
emit settled();
}
}
_data.clear();
}
void PHD::invokeMethod(const QString &method, const QVariantList &params)
{
QJsonDocument json;
QJsonObject message;
message.insert("method", method);
message.insert("id", QString::number(_messageId++));
message.insert("params", QJsonArray::fromVariantList(params));
json.setObject(message);
QByteArray data = json.toJson(QJsonDocument::Compact);
data.append('\n');
_socket->write(data);
}
void PHD::readyRead()
{
QByteArray data = _socket->readAll();
int index;
while((index = data.indexOf('\n')) != -1)
{
_data.append(data.left(index));
data.remove(0, index+1);
parseMessage();
}
if(data.size())
_data.append(data);
}