#include "phd.h" #include #include #include const QHash 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 ¶ms) { 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); }