1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-25 17:25:13 +03:00
This commit is contained in:
bsongis 2015-07-24 10:42:12 +02:00
parent 7e44eab63c
commit e1dfb15ba9
4 changed files with 85 additions and 92 deletions

View file

@ -8,14 +8,14 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
logsDialog::logsDialog(QWidget *parent) : LogsDialog::LogsDialog(QWidget *parent) :
QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
ui(new Ui::logsDialog) ui(new Ui::LogsDialog)
{ {
csvlog.clear(); csvlog.clear();
ui->setupUi(this); ui->setupUi(this);
this->setWindowIcon(CompanionIcon("logs.png")); setWindowIcon(CompanionIcon("logs.png"));
plotLock=false; plotLock=false;
@ -36,26 +36,20 @@ logsDialog::logsDialog(QWidget *parent) :
// create and prepare a plot title layout element // create and prepare a plot title layout element
QCPPlotTitle *title = new QCPPlotTitle(ui->customPlot); QCPPlotTitle *title = new QCPPlotTitle(ui->customPlot);
title->setText(tr("Telemetry logs")); title->setText(tr("Telemetry logs"));
// title->setFont(QFont("sans", 12, QFont::Bold));
// add it to the main plot layout // add it to the main plot layout
ui->customPlot->plotLayout()->insertRow(0); ui->customPlot->plotLayout()->insertRow(0);
ui->customPlot->plotLayout()->addElement(0, 0, title); ui->customPlot->plotLayout()->addElement(0, 0, title);
ui->customPlot->setNoAntialiasingOnDrag(true); ui->customPlot->setNoAntialiasingOnDrag(true);
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables);
ui->customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom |
QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables);
axisRect = ui->customPlot->axisRect(); axisRect = ui->customPlot->axisRect();
axisRect->axis(QCPAxis::atBottom)->setLabel(tr("Time (hh:mm:ss)")); axisRect->axis(QCPAxis::atBottom)->setLabel(tr("Time (hh:mm:ss)"));
axisRect->axis(QCPAxis::atBottom)->setTickLabelType(QCPAxis::ltDateTime); axisRect->axis(QCPAxis::atBottom)->setTickLabelType(QCPAxis::ltDateTime);
axisRect->axis(QCPAxis::atBottom)->setDateTimeFormat("hh:mm:ss"); axisRect->axis(QCPAxis::atBottom)->setDateTimeFormat("hh:mm:ss");
QDateTime now = QDateTime::currentDateTime(); QDateTime now = QDateTime::currentDateTime();
axisRect->axis(QCPAxis::atBottom)->setRange(now.addSecs(-60*60*2).toTime_t(), axisRect->axis(QCPAxis::atBottom)->setRange(now.addSecs(-60*60*2).toTime_t(), now.toTime_t());
now.toTime_t());
axisRect->axis(QCPAxis::atLeft)->setTickLabels(false); axisRect->axis(QCPAxis::atLeft)->setTickLabels(false);
axisRect->addAxis(QCPAxis::atLeft); axisRect->addAxis(QCPAxis::atLeft);
axisRect->addAxis(QCPAxis::atRight); axisRect->addAxis(QCPAxis::atRight);
axisRect->axis(QCPAxis::atLeft, 1)->setVisible(false); axisRect->axis(QCPAxis::atLeft, 1)->setVisible(false);
@ -76,8 +70,8 @@ logsDialog::logsDialog(QWidget *parent) :
ui->customPlot->setAutoAddPlottableToLegend(false); ui->customPlot->setAutoAddPlottableToLegend(false);
QString Path=g.gePath(); QString path = g.gePath();
if (Path.isEmpty() || !QFile(Path).exists()) { if (path.isEmpty() || !QFile(path).exists()) {
ui->mapsButton->hide(); ui->mapsButton->hide();
} }
@ -99,57 +93,52 @@ logsDialog::logsDialog(QWidget *parent) :
connect(ui->Reset_PB, SIGNAL(clicked()), this, SLOT(plotLogs())); connect(ui->Reset_PB, SIGNAL(clicked()), this, SLOT(plotLogs()));
} }
logsDialog::~logsDialog() LogsDialog::~LogsDialog()
{ {
delete ui; delete ui;
} }
void logsDialog::titleDoubleClick(QMouseEvent *evt, QCPPlotTitle *title) void LogsDialog::titleDoubleClick(QMouseEvent *evt, QCPPlotTitle *title)
{ {
// Set the plot title by double clicking on it // Set the plot title by double clicking on it
bool ok; bool ok;
QString newTitle = QInputDialog::getText(this, tr("Plot Title Change"), QString newTitle = QInputDialog::getText(this, tr("Plot Title Change"), tr("New plot title:"), QLineEdit::Normal, title->text(), &ok);
tr("New plot title:"), QLineEdit::Normal, title->text(), &ok); if (ok) {
if (ok)
{
title->setText(newTitle); title->setText(newTitle);
ui->customPlot->replot(); ui->customPlot->replot();
} }
} }
void logsDialog::axisLabelDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part) void LogsDialog::axisLabelDoubleClick(QCPAxis *axis, QCPAxis::SelectablePart part)
{ {
// Set an axis label by double clicking on it // Set an axis label by double clicking on it
if (part == QCPAxis::spAxisLabel) // only react when the actual axis label is clicked, not tick label or axis backbone if (part == QCPAxis::spAxisLabel) {
{ // only react when the actual axis label is clicked, not tick label or axis backbone
bool ok; bool ok;
QString newLabel = QInputDialog::getText(this, tr("Axis Label Change"), tr("New axis label:"), QLineEdit::Normal, axis->label(), &ok); QString newLabel = QInputDialog::getText(this, tr("Axis Label Change"), tr("New axis label:"), QLineEdit::Normal, axis->label(), &ok);
if (ok) if (ok) {
{
axis->setLabel(newLabel); axis->setLabel(newLabel);
ui->customPlot->replot(); ui->customPlot->replot();
} }
} }
} }
void logsDialog::legendDoubleClick(QCPLegend *legend, QCPAbstractLegendItem *item) void LogsDialog::legendDoubleClick(QCPLegend *legend, QCPAbstractLegendItem *item)
{ {
// Rename a graph by double clicking on its legend item // Rename a graph by double clicking on its legend item
if (item) // only react if item was clicked (user could have clicked on border padding of legend where there is no item, then item is 0) if (item) {
{ // only react if item was clicked (user could have clicked on border padding of legend where there is no item, then item is 0)
QCPPlottableLegendItem *plItem = qobject_cast<QCPPlottableLegendItem*>(item); QCPPlottableLegendItem *plItem = qobject_cast<QCPPlottableLegendItem*>(item);
bool ok; bool ok;
QString newName = QInputDialog::getText(this, tr("Graph Name Change"), tr("New graph name:"), QLineEdit::Normal, plItem->plottable()->name(), &ok); QString newName = QInputDialog::getText(this, tr("Graph Name Change"), tr("New graph name:"), QLineEdit::Normal, plItem->plottable()->name(), &ok);
if (ok) if (ok) {
{
plItem->plottable()->setName(newName); plItem->plottable()->setName(newName);
ui->customPlot->replot(); ui->customPlot->replot();
} }
} }
} }
void logsDialog::selectionChanged() void LogsDialog::selectionChanged()
{ {
/* /*
normally, axis base line, axis tick labels and axis labels are selectable separately, but we want normally, axis base line, axis tick labels and axis labels are selectable separately, but we want
@ -208,20 +197,18 @@ void logsDialog::selectionChanged()
} }
// synchronize selection of graphs with selection of corresponding legend items: // synchronize selection of graphs with selection of corresponding legend items:
for (int i=0; i<ui->customPlot->graphCount(); ++i) for (int i=0; i<ui->customPlot->graphCount(); ++i) {
{
QCPGraph *graph = ui->customPlot->graph(i); QCPGraph *graph = ui->customPlot->graph(i);
QCPPlottableLegendItem *item = ui->customPlot->legend->itemWithPlottable(graph); QCPPlottableLegendItem *item = ui->customPlot->legend->itemWithPlottable(graph);
if (item == NULL) item = rightLegend->itemWithPlottable(graph); if (item == NULL) item = rightLegend->itemWithPlottable(graph);
if (item->selected() || graph->selected()) if (item->selected() || graph->selected()) {
{
item->setSelected(true); item->setSelected(true);
graph->setSelected(true); graph->setSelected(true);
} }
} }
} }
QList<QStringList> logsDialog::filterGePoints(const QList<QStringList> & input) QList<QStringList> LogsDialog::filterGePoints(const QList<QStringList> & input)
{ {
QList<QStringList> result; QList<QStringList> result;
@ -260,7 +247,7 @@ QList<QStringList> logsDialog::filterGePoints(const QList<QStringList> & input)
// glitch filter // glitch filter
if ( glitchFilter.isGlitch(flatitude, flongitude) ) { if ( glitchFilter.isGlitch(flatitude, flongitude) ) {
qDebug() << "filterGePoints(): GPS glitch detected at" << i << flatitude << flongitude; // qDebug() << "filterGePoints(): GPS glitch detected at" << i << flatitude << flongitude;
continue; continue;
} }
@ -275,11 +262,11 @@ QList<QStringList> logsDialog::filterGePoints(const QList<QStringList> & input)
} }
} }
qDebug() << "filterGePoints(): filtered from" << input.count() << "to " << result.count() << "points"; // qDebug() << "filterGePoints(): filtered from" << input.count() << "to " << result.count() << "points";
return result; return result;
} }
void logsDialog::exportToGoogleEarth() void LogsDialog::exportToGoogleEarth()
{ {
// filter data points // filter data points
QList<QStringList> dataPoints = filterGePoints(csvlog); QList<QStringList> dataPoints = filterGePoints(csvlog);
@ -289,25 +276,26 @@ void logsDialog::exportToGoogleEarth()
int latcol=0, longcol=0, altcol=0, speedcol=0; int latcol=0, longcol=0, altcol=0, speedcol=0;
QSet<int> nondataCols; QSet<int> nondataCols;
for (int i=1; i<dataPoints.at(0).count(); i++) { for (int i=1; i<dataPoints.at(0).count(); i++) {
//Long,Lat,Course,GPS Speed,GPS Alt // Long,Lat,Course,GPS Speed,GPS Alt
if (dataPoints.at(0).at(i).contains("Long")) { if (dataPoints.at(0).at(i).contains("Long")) {
longcol=i; longcol = i;
nondataCols << i; nondataCols << i;
} }
if (dataPoints.at(0).at(i).contains("Lat")) { if (dataPoints.at(0).at(i).contains("Lat")) {
latcol=i; latcol = i;
nondataCols << i; nondataCols << i;
} }
if (dataPoints.at(0).at(i).contains("GPS Alt")) { if (dataPoints.at(0).at(i).contains("GPS Alt") || dataPoints.at(0).at(i).contains("GAlt")) {
altcol=i; altcol = i;
nondataCols << i; nondataCols << i;
} }
if (dataPoints.at(0).at(i).contains("GPS Speed")) { if (dataPoints.at(0).at(i).contains("GPS Speed")) {
speedcol=i; speedcol = i;
nondataCols << i; nondataCols << i;
} }
} }
if (longcol==0 || latcol==0 || altcol==0) {
if (longcol==0 || latcol==0) {
return; return;
} }
@ -375,22 +363,25 @@ void logsDialog::exportToGoogleEarth()
// coordinate data points // coordinate data points
for (int i=1; i<n; i++) { for (int i=1; i<n; i++) {
QString latitude=dataPoints.at(i).at(latcol).trimmed(); QString latitude = dataPoints.at(i).at(latcol).trimmed();
QString longitude=dataPoints.at(i).at(longcol).trimmed(); QString longitude = dataPoints.at(i).at(longcol).trimmed();
int altitude = altcol ? dataPoints.at(i).at(altcol).toFloat() : 0;
latitude.sprintf("%3.8f", toDecimalCoordinate(latitude)); latitude.sprintf("%3.8f", toDecimalCoordinate(latitude));
longitude.sprintf("%3.8f", toDecimalCoordinate(longitude)); longitude.sprintf("%3.8f", toDecimalCoordinate(longitude));
outputStream << "\t\t\t\t\t<gx:coord>" << longitude << " " << latitude << " " << dataPoints.at(i).at(altcol).toFloat() << " </gx:coord>\n" ; outputStream << "\t\t\t\t\t<gx:coord>" << longitude << " " << latitude << " " << altitude << " </gx:coord>\n" ;
} }
// additional data for data points // additional data for data points
outputStream << "\t\t\t\t\t<ExtendedData>\n\t\t\t\t\t\t<SchemaData schemaUrl=\"#schema\">\n"; outputStream << "\t\t\t\t\t<ExtendedData>\n\t\t\t\t\t\t<SchemaData schemaUrl=\"#schema\">\n";
// gps speed data points if (speedcol) {
outputStream << "\t\t\t\t\t\t\t<gx:SimpleArrayData name=\"GPSSpeed\">\n"; // gps speed data points
for (int i=1; i<n; i++) { outputStream << "\t\t\t\t\t\t\t<gx:SimpleArrayData name=\"GPSSpeed\">\n";
outputStream << "\t\t\t\t\t\t\t\t<gx:value>"<< dataPoints.at(i).at(speedcol) <<"</gx:value>\n"; for (int i=1; i<n; i++) {
outputStream << "\t\t\t\t\t\t\t\t<gx:value>"<< dataPoints.at(i).at(speedcol) <<"</gx:value>\n";
}
outputStream << "\t\t\t\t\t\t\t</gx:SimpleArrayData>\n";
} }
outputStream << "\t\t\t\t\t\t\t</gx:SimpleArrayData>\n";
// add values for additional fields // add values for additional fields
for (int i=0; i<dataPoints.at(0).count()-2; i++) { for (int i=0; i<dataPoints.at(0).count()-2; i++) {
@ -420,7 +411,7 @@ void logsDialog::exportToGoogleEarth()
process->start(gePath, parameters); process->start(gePath, parameters);
} }
void logsDialog::on_mapsButton_clicked() void LogsDialog::on_mapsButton_clicked()
{ {
ui->FieldsTW->setDisabled(true); ui->FieldsTW->setDisabled(true);
ui->logTable->setDisabled(true); ui->logTable->setDisabled(true);
@ -431,7 +422,7 @@ void logsDialog::on_mapsButton_clicked()
ui->logTable->setDisabled(false); ui->logTable->setDisabled(false);
} }
void logsDialog::mousePress() void LogsDialog::mousePress()
{ {
// if an axis is selected, only allow the direction of that axis to be dragged // if an axis is selected, only allow the direction of that axis to be dragged
// if no axis is selected, both directions may be dragged // if no axis is selected, both directions may be dragged
@ -444,7 +435,7 @@ void logsDialog::mousePress()
axisRect->setRangeDrag(Qt::Horizontal | Qt::Vertical); axisRect->setRangeDrag(Qt::Horizontal | Qt::Vertical);
} }
void logsDialog::mouseWheel() void LogsDialog::mouseWheel()
{ {
// if an axis is selected, only allow the direction of that axis to be zoomed // if an axis is selected, only allow the direction of that axis to be zoomed
// if no axis is selected, both directions may be zoomed // if no axis is selected, both directions may be zoomed
@ -462,7 +453,7 @@ void logsDialog::mouseWheel()
} }
} }
void logsDialog::removeAllGraphs() void LogsDialog::removeAllGraphs()
{ {
ui->customPlot->clearGraphs(); ui->customPlot->clearGraphs();
ui->customPlot->legend->setVisible(false); ui->customPlot->legend->setVisible(false);
@ -480,12 +471,11 @@ void logsDialog::removeAllGraphs()
ui->customPlot->replot(); ui->customPlot->replot();
} }
void logsDialog::on_fileOpen_BT_clicked() void LogsDialog::on_fileOpen_BT_clicked()
{ {
QString fileName = QFileDialog::getOpenFileName(this,tr("Select your log file"), g.logDir()); QString fileName = QFileDialog::getOpenFileName(this, tr("Select your log file"), g.logDir());
if (!fileName.isEmpty()) { if (!fileName.isEmpty()) {
g.logDir(fileName);
g.logDir( fileName );
ui->FileName_LE->setText(fileName); ui->FileName_LE->setText(fileName);
if (cvsFileParse()) { if (cvsFileParse()) {
ui->FieldsTW->clear(); ui->FieldsTW->clear();
@ -525,15 +515,16 @@ void logsDialog::on_fileOpen_BT_clicked()
} }
} }
bool logsDialog::cvsFileParse() bool LogsDialog::cvsFileParse()
{ {
QFile file(ui->FileName_LE->text()); QFile file(ui->FileName_LE->text());
int errors=0; int errors=0;
int lines=-1; int lines=-1;
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //reading HEX TEXT file if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { // reading HEX TEXT file
return false; return false;
} else { }
else {
csvlog.clear(); csvlog.clear();
logFilename.clear(); logFilename.clear();
QTextStream inputStream(&file); QTextStream inputStream(&file);
@ -541,7 +532,8 @@ bool logsDialog::cvsFileParse()
if (buffer.startsWith("Date,Time")) { if (buffer.startsWith("Date,Time")) {
file.reset(); file.reset();
} else { }
else {
return false; return false;
} }
@ -554,29 +546,30 @@ bool logsDialog::cvsFileParse()
} }
if (columns.count()==numfields) { if (columns.count()==numfields) {
csvlog.append(columns); csvlog.append(columns);
} else { }
else {
errors++; errors++;
} }
lines++; lines++;
} }
logFilename=QFileInfo(file.fileName()).baseName(); logFilename = QFileInfo(file.fileName()).baseName();
} }
file.close(); file.close();
if (errors>1) { if (errors > 1) {
QMessageBox::warning(this, "Companion", tr("The selected logfile contains %1 invalid lines out of %2 total lines").arg(errors).arg(lines)); QMessageBox::warning(this, "Companion", tr("The selected logfile contains %1 invalid lines out of %2 total lines").arg(errors).arg(lines));
} }
int n=csvlog.count(); int n = csvlog.count();
if (n==1) { if (n == 1) {
csvlog.clear(); csvlog.clear();
return false; return false;
} }
plotLock = true; plotLock = true;
setFlightSessions(); setFlightSessions();
plotLock=false; plotLock = false;
return true; return true;
} }
@ -586,7 +579,7 @@ struct FlightSession {
QDateTime end; QDateTime end;
}; };
QDateTime logsDialog::getRecordTimeStamp(int index) QDateTime LogsDialog::getRecordTimeStamp(int index)
{ {
QString tstamp = csvlog.at(index).at(0) + " " + csvlog.at(index).at(1); QString tstamp = csvlog.at(index).at(0) + " " + csvlog.at(index).at(1);
if (csvlog.at(index).at(1).contains(".")) if (csvlog.at(index).at(1).contains("."))
@ -594,7 +587,7 @@ QDateTime logsDialog::getRecordTimeStamp(int index)
return QDateTime::fromString(tstamp, "yyyy-MM-dd HH:mm:ss"); return QDateTime::fromString(tstamp, "yyyy-MM-dd HH:mm:ss");
} }
QString logsDialog::generateDuration(const QDateTime & start, const QDateTime & end) QString LogsDialog::generateDuration(const QDateTime & start, const QDateTime & end)
{ {
int secs = start.secsTo(end); int secs = start.secsTo(end);
QString durationString; QString durationString;
@ -606,11 +599,11 @@ QString logsDialog::generateDuration(const QDateTime & start, const QDateTime &
return durationString; return durationString;
} }
void logsDialog::setFlightSessions() void LogsDialog::setFlightSessions()
{ {
ui->sessions_CB->clear(); ui->sessions_CB->clear();
int n=csvlog.count(); int n = csvlog.count();
// qDebug() << "records" << n; // qDebug() << "records" << n;
// find session breaks // find session breaks
@ -646,7 +639,7 @@ void logsDialog::setFlightSessions()
} }
} }
void logsDialog::on_sessions_CB_currentIndexChanged(int index) void LogsDialog::on_sessions_CB_currentIndexChanged(int index)
{ {
if (plotLock) return; if (plotLock) return;
plotLock = true; plotLock = true;
@ -674,7 +667,7 @@ void logsDialog::on_sessions_CB_currentIndexChanged(int index)
plotLogs(); plotLogs();
} }
void logsDialog::plotLogs() void LogsDialog::plotLogs()
{ {
if (plotLock) return; if (plotLock) return;
@ -920,7 +913,7 @@ void logsDialog::plotLogs()
ui->customPlot->replot(); ui->customPlot->replot();
} }
void logsDialog::yAxisChangeRanges(QCPRange range) void LogsDialog::yAxisChangeRanges(QCPRange range)
{ {
if (axisRect->axis(QCPAxis::atRight)->visible()) { if (axisRect->axis(QCPAxis::atRight)->visible()) {
double lowerChange = (range.lower - yAxesRanges[firstLeft].min) * double lowerChange = (range.lower - yAxesRanges[firstLeft].min) *

View file

@ -1,5 +1,5 @@
#ifndef LOGSDIALOG_H #ifndef _LOGSDIALOG_H_
#define LOGSDIALOG_H #define _LOGSDIALOG_H_
#include <QtCore> #include <QtCore>
#include <QtGui> #include <QtGui>
@ -37,16 +37,16 @@ struct plotsCollection {
}; };
namespace Ui { namespace Ui {
class logsDialog; class LogsDialog;
} }
class logsDialog : public QDialog class LogsDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit logsDialog(QWidget *parent = 0); explicit LogsDialog(QWidget *parent = 0);
~logsDialog(); ~LogsDialog();
private slots: private slots:
void titleDoubleClick(QMouseEvent *evt, QCPPlotTitle *title); void titleDoubleClick(QMouseEvent *evt, QCPPlotTitle *title);
@ -64,7 +64,7 @@ private slots:
private: private:
QList<QStringList> csvlog; QList<QStringList> csvlog;
Ui::logsDialog *ui; Ui::LogsDialog *ui;
QCPAxisRect *axisRect; QCPAxisRect *axisRect;
QCPLegend *rightLegend; QCPLegend *rightLegend;
bool plotLock; bool plotLock;
@ -85,4 +85,4 @@ private:
}; };
#endif // LOGSDIALOG_H #endif // _LOGSDIALOG_H_

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>logsDialog</class> <class>LogsDialog</class>
<widget class="QDialog" name="logsDialog"> <widget class="QDialog" name="LogsDialog">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>

View file

@ -873,7 +873,7 @@ void MainWindow::compare()
void MainWindow::logFile() void MainWindow::logFile()
{ {
logsDialog *fd = new logsDialog(this); LogsDialog *fd = new LogsDialog(this);
fd->setWindowFlags(Qt::Window); //to show minimize an maximize buttons fd->setWindowFlags(Qt::Window); //to show minimize an maximize buttons
fd->setAttribute(Qt::WA_DeleteOnClose, true); fd->setAttribute(Qt::WA_DeleteOnClose, true);
fd->show(); fd->show();