mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-25 09:18:54 -05:00
199 lines
5.9 KiB
C++
199 lines
5.9 KiB
C++
///////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 2024 Jon Beniston, M7RCE //
|
|
// //
|
|
// This program is free software; you can redistribute it and/or modify //
|
|
// it under the terms of the GNU General Public License as published by //
|
|
// the Free Software Foundation as version 3 of the License, or //
|
|
// (at your option) any later version. //
|
|
// //
|
|
// This program is distributed in the hope that it will be useful, //
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
|
// GNU General Public License V3 for more details. //
|
|
// //
|
|
// You should have received a copy of the GNU General Public License //
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "grb.h"
|
|
#include "util/csv.h"
|
|
|
|
#include <QDebug>
|
|
#include <QUrl>
|
|
#include <QNetworkReply>
|
|
#include <QNetworkDiskCache>
|
|
#include <QTextStream>
|
|
|
|
GRB::GRB()
|
|
{
|
|
connect(&m_dataTimer, &QTimer::timeout, this,&GRB::getData);
|
|
m_networkManager = new QNetworkAccessManager();
|
|
connect(m_networkManager, &QNetworkAccessManager::finished, this, &GRB::handleReply);
|
|
|
|
QStringList locations = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation);
|
|
QDir writeableDir(locations[0]);
|
|
if (!writeableDir.mkpath(QStringLiteral("cache") + QDir::separator() + QStringLiteral("grb"))) {
|
|
qDebug() << "Failed to create cache/grb";
|
|
}
|
|
|
|
m_cache = new QNetworkDiskCache();
|
|
m_cache->setCacheDirectory(locations[0] + QDir::separator() + QStringLiteral("cache") + QDir::separator() + QStringLiteral("grb"));
|
|
m_cache->setMaximumCacheSize(100000000);
|
|
m_networkManager->setCache(m_cache);
|
|
}
|
|
|
|
GRB::~GRB()
|
|
{
|
|
disconnect(&m_dataTimer, &QTimer::timeout, this, &GRB::getData);
|
|
disconnect(m_networkManager, &QNetworkAccessManager::finished, this, &GRB::handleReply);
|
|
delete m_networkManager;
|
|
}
|
|
|
|
GRB* GRB::create()
|
|
{
|
|
return new GRB();
|
|
}
|
|
|
|
void GRB::getDataPeriodically(int periodInMins)
|
|
{
|
|
if (periodInMins > 0)
|
|
{
|
|
m_dataTimer.setInterval(periodInMins*60*1000);
|
|
m_dataTimer.start();
|
|
getData();
|
|
}
|
|
else
|
|
{
|
|
m_dataTimer.stop();
|
|
}
|
|
}
|
|
|
|
void GRB::getData()
|
|
{
|
|
QUrl url("https://user-web.icecube.wisc.edu/~grbweb_public/Summary_table.txt");
|
|
|
|
m_networkManager->get(QNetworkRequest(url));
|
|
}
|
|
|
|
void GRB::handleReply(QNetworkReply* reply)
|
|
{
|
|
if (reply)
|
|
{
|
|
if (!reply->error())
|
|
{
|
|
if (reply->url().fileName().endsWith(".txt"))
|
|
{
|
|
QByteArray bytes = reply->readAll();
|
|
handleText(bytes);
|
|
}
|
|
else
|
|
{
|
|
qDebug() << "GRB::handleReply: Unexpected file" << reply->url().fileName();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
qDebug() << "GRB::handleReply: Error: " << reply->error();
|
|
}
|
|
reply->deleteLater();
|
|
}
|
|
else
|
|
{
|
|
qDebug() << "GRB::handleReply: Reply is null";
|
|
}
|
|
}
|
|
|
|
void GRB::handleText(QByteArray& bytes)
|
|
{
|
|
// Convert to CSV
|
|
QString s(bytes);
|
|
QStringList l = s.split("\n");
|
|
for (int i = 0; i < l.size(); i++) {
|
|
l[i] = l[i].simplified().replace(" ", ",");
|
|
}
|
|
s = l.join("\n");
|
|
|
|
QTextStream in(&s);
|
|
|
|
// Skip header
|
|
for (int i = 0; i < 4; i++) {
|
|
in.readLine();
|
|
}
|
|
|
|
QList<Data> grbs;
|
|
QStringList cols;
|
|
while(CSV::readRow(in, &cols))
|
|
{
|
|
Data grb;
|
|
|
|
if (cols.length() >= 10)
|
|
{
|
|
grb.m_name = cols[0];
|
|
grb.m_fermiName = cols[1];
|
|
int year = grb.m_name.mid(3, 2).toInt();
|
|
if (year >= 90) {
|
|
year += 1900;
|
|
} else {
|
|
year += 2000;
|
|
}
|
|
QDate date(year, grb.m_name.mid(5, 2).toInt(), grb.m_name.mid(7, 2).toInt());
|
|
QTime time = QTime::fromString(cols[2]);
|
|
grb.m_dateTime = QDateTime(date, time);
|
|
grb.m_ra = cols[3].toFloat();
|
|
grb.m_dec = cols[4].toFloat();
|
|
grb.m_fluence = cols[9].toFloat();
|
|
|
|
//qDebug() << grb.m_name << grb.m_dateTime.toString() << grb.m_ra << grb.m_dec << grb.m_fluence ;
|
|
|
|
if (grb.m_dateTime.isValid()) {
|
|
grbs.append(grb);
|
|
}
|
|
}
|
|
}
|
|
|
|
emit dataUpdated(grbs);
|
|
}
|
|
|
|
QString GRB::Data::getFermiURL() const
|
|
{
|
|
if (m_fermiName.isEmpty() || (m_fermiName == "None")) {
|
|
return "";
|
|
}
|
|
QString base = "https://heasarc.gsfc.nasa.gov/FTP/fermi/data/gbm/bursts/";
|
|
QString yearDir = "20" + m_fermiName.mid(3, 2);
|
|
QString dataDir = m_fermiName;
|
|
dataDir.replace("GRB", "bn");
|
|
return base + yearDir + "/" + dataDir + "/current/";
|
|
}
|
|
|
|
QString GRB::Data::getFermiPlotURL() const
|
|
{
|
|
QString base = getFermiURL();
|
|
if (base.isEmpty()) {
|
|
return "";
|
|
}
|
|
|
|
QString name = m_fermiName;
|
|
name.replace("GRB", "bn");
|
|
return getFermiURL() + "glg_lc_all_" + name + "_v00.gif"; // Could be v01.gif? How to know without fetching index?
|
|
}
|
|
|
|
QString GRB::Data::getFermiSkyMapURL() const
|
|
{
|
|
QString base = getFermiURL();
|
|
if (base.isEmpty()) {
|
|
return "";
|
|
}
|
|
|
|
QString name = m_fermiName;
|
|
name.replace("GRB", "bn");
|
|
return getFermiURL() + "glg_skymap_all_" + name + "_v00.png";
|
|
}
|
|
|
|
QString GRB::Data::getSwiftURL() const
|
|
{
|
|
QString name = m_name;
|
|
name.replace("GRB", "");
|
|
return "https://swift.gsfc.nasa.gov/archive/grb_table/" + name;
|
|
}
|