TelescopeClientJsonRts2::TelescopeClientJsonRts2(const QString &name, const QString &params, Equinox eq)
	: TelescopeClient(name)
	, networkManager(new QNetworkAccessManager)
	, equinox(eq)
	, baseurl("http://localhost:8889/")
	, telName("")
	, telReadonly(false)
	, telLatitude(NAN)
	, telLongitude(NAN)
	, telAltitude(NAN)
	, telTargetDist(NAN)
	, time_delay(50)
	, reconnectTimer(-1)
	, refresh_delay(500)
	, server_micros(0)
{
	telescopeManager = GETSTELMODULE(TelescopeControl);

	// Example params:
	// 1000:test:1234@localhost:8889/tel

	QRegExp paramRx("^(\\d+):(.*)$");
	QString url;
	if (paramRx.exactMatch(params))
	{
		refresh_delay = paramRx.capturedTexts().at(1).toInt() / 1000; // convert microseconds to milliseconds
		url           = paramRx.capturedTexts().at(2).trimmed();
	}
	else
	{
		qWarning() << "ERROR creating TelescopeClientJsonRts2: invalid parameters.";
		return;
	}

	qDebug() << "TelescopeRTS2(" << name << ") URL, refresh timeout: " << url << "," << refresh_delay;

	baseurl.setUrl(url);
	if (!baseurl.isValid())
	{
		qWarning() << "TelescopeRTS2(" << name << ") invalid URL: " << url;
		return;
	}

	QUrl rurl(baseurl);

	rurl.setPath(baseurl.path() + "/api/devbytype");

	QUrlQuery query;
	query.addQueryItem("t", "2");
	rurl.setQuery(query);

	cfgRequest.setUrl(rurl);

	qDebug() << "TelescopeRTS2(" << name << ")::TelescopeRTS2: request url:" << rurl.toString();

	connect(&networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));

	networkManager.get(cfgRequest);
}
Esempio n. 2
0
bool SSortFileItem::FileDescending(CFileItem *left, CFileItem *right)
{
  // sanity
  RETURN_IF_NULL(left,false); RETURN_IF_NULL(right,false);

  // ignore the ".." item - that should always be on top
  if (left->IsParentFolder()) return true;
  if (right->IsParentFolder()) return false;
  CURL lurl(left->m_strPath); CURL rurl(right->m_strPath);
  int result = StringUtils::AlphaNumericCompare(lurl.GetFileNameWithoutPath().c_str(), rurl.GetFileNameWithoutPath().c_str());
  if (result < 0) return false;
  if (result > 0) return true;
  return left->m_lStartOffset > right->m_lStartOffset;
}
void TelescopeClientJsonRts2::replyFinished(QNetworkReply *reply)
{
	if (reply->error() != QNetworkReply::NoError)
	{
		if (reply->url().path().endsWith("/api/cmd") && reply->error() == QNetworkReply::ProtocolInvalidOperationError)
		{
			setReadOnly(true);
			return;
		}
		qDebug() << "TelescopeRTS2(" << name << ")::replyFinished: error " << reply->error() << " url: " << reply->url().toString();
		telName = "";
		if (reconnectTimer < 0)
			reconnectTimer = startTimer(15000);

		return;
	}

	if (reconnectTimer > 0)
	{
		killTimer(reconnectTimer);
		reconnectTimer = -1;
	}

	QByteArray data = reply->readAll();
	//qDebug() << "TelescopeRTS2(" << name << ")::replyFinished: data " << (QString) data;

	QJsonDocument doc;
	QJsonParseError jsonError;
	doc = QJsonDocument::fromJson(data, &jsonError);

	if (reply->url().path().endsWith("/api/devbytype"))
	{
		QJsonArray arr = doc.array();
		telName = arr[0].toString();

		getReadOnly();
	}
	else if (reply->url().path().endsWith("/api/deviceinfo"))
	{
		QJsonObject docObject = doc.object();
		setReadOnly(docObject["readonly"].toBool());

		QUrl rurl(baseurl);

		rurl.setPath(baseurl.path() + "/api/get");

		QUrlQuery query;
		query.addQueryItem("d", telName);
		rurl.setQuery(query);

		request.setUrl(rurl);

		qDebug() << "TelescopeRTS2(" << name << ")::replyFinished: request url:" << rurl.toString();

		refreshTimer();
	}
	else if (reply->url().path().endsWith("/api/get"))
	{
		QJsonObject docObject = doc.object();
		QJsonObject dObject = docObject["d"].toObject();
		QJsonObject telObject = dObject["TEL"].toObject();

		telLongitude = dObject["LONGITUD"].toDouble() * M_PI / 180.0;
		telLatitude = dObject["LATITUDE"].toDouble() * M_PI / 180.0;
		telAltitude = dObject["ALTITUDE"].toDouble();
		telTargetDist = dObject["target_distance"].toDouble() * M_PI / 180.0;

		const double ra = telObject["ra"].toDouble() * M_PI / 180.0;
		const double dec = telObject["dec"].toDouble() * M_PI / 180.0;
		const double cdec = cos(dec);
	
		qDebug() << "TelescopeRTS2(" << name << ")::replyFinished: RADEC" << ra << dec;

		lastPos.set(cos(ra)*cdec, sin(ra)*cdec, sin(dec));
		interpolatedPosition.add(lastPos, getNow(), server_micros, 0);

		QTimer::singleShot(refresh_delay, this, SLOT(refreshTimer()));
	}
	else if (reply->url().path().endsWith("/api/cmd"))
	{
		QJsonObject docObject = doc.object();
		int cmdRet = docObject["ret"].toInt();
		qDebug() << "Move command finished: " << cmdRet;
		if (cmdRet == 0)
			getReadOnly();
		else
			setReadOnly(true);
	}
	else
	{
		qWarning() << "TelescopeRTS2(" << name << ")::replyFinished: unhandled reply: " << reply->url().toString();
	}
	reply->deleteLater();
}