# HG changeset patch # User Heiko Schlittermann (JUMPER) # Date 1327798262 -3600 # Node ID c55e1f2a4db427d1a689448304c21e3a754d0ff1 # Parent dfefb600349899be08552dc19b0a435647205816 now using more pointers It's really confusing, when to use a pointer and who takes care about that pointer… diff -r dfefb6003498 -r c55e1f2a4db4 igc.cc --- a/igc.cc Sun Jan 29 00:38:40 2012 +0100 +++ b/igc.cc Sun Jan 29 01:51:02 2012 +0100 @@ -1,5 +1,51 @@ #include "igc.h" +Fix::Fix(const QString &s) +{ + int pos = 0; + + time_ = QTime::fromString(s.mid(pos, 6), "hhmmss"); + pos += 6; + + gps_.lat = s.mid(pos, 8); pos += 8; // DDMMmmm[NS] + gps_.lon = s.mid(pos, 9); pos += 9; // DDDMMmmm[EW] + + is3d_ = s.mid(pos, 1) == "A"; + pos += 1; + + alt_[baro] = s.mid(pos, 5).toInt(); pos += 5; + alt_[gps] = s.mid(pos, 5).toInt(); pos += 5; +} + + +IGC::IGC() +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + : altitude_({0}) +#endif +{ +#ifndef __GXX_EXPERIMENTAL_CXX0X__ + memset(altitude_, 0, sizeof(altitude_)); +#endif +} + +IGC::IGC(QTextStream &s) +#ifdef __GXX_EXPERIMENTAL_CXX0X__ + : altitude_({0}) +#endif +{ +#ifndef __GXX_EXPERIMENTAL_CXX0X__ + memset(altitude_, 0, sizeof(altitude_)); +#endif + read(s); +} + +IGC::~IGC() +{ + for (size_t i = 0; i < sizeof(altitude_)/sizeof(altitude_[0]); ++i) { + delete altitude_[i]; + } +} + void IGC::read(QTextStream &in) { while (!in.atEnd()) { @@ -37,19 +83,19 @@ } } -Fix::Fix(const QString &s) +const QVector& IGC::altitude(Fix::Source src) const { - int pos = 0; + + // optimization: if already allocated, return the allocated vector + if (altitude_[src]) return *altitude_[src]; - time_ = QTime::fromString(s.mid(pos, 6), "hhmmss"); - pos += 6; + altitude_[src] = new QVector; - gps_.lat = s.mid(pos, 8); pos += 8; // DDMMmmm[NS] - gps_.lon = s.mid(pos, 9); pos += 9; // DDDMMmmm[EW] + for (Fixes::const_iterator i = fixes_.begin(); + i != fixes_.end(); + i++) { + *altitude_[src] << QPointF(QTime().secsTo(i->time()), i->altitude(src)); + } - is3d_ = s.mid(pos, 1) == "A"; - pos += 1; - - alt_[baro] = s.mid(pos, 5).toInt(); pos += 5; - alt_[gps] = s.mid(pos, 5).toInt(); pos += 5; + return *altitude_[src]; } diff -r dfefb6003498 -r c55e1f2a4db4 igc.h --- a/igc.h Sun Jan 29 00:38:40 2012 +0100 +++ b/igc.h Sun Jan 29 01:51:02 2012 +0100 @@ -54,6 +54,10 @@ class IGC { public: + IGC(); + IGC(QTextStream&); + ~IGC(); + //! Read the IGC records. //! \param s a (file) stream containing the records void read(QTextStream& s); @@ -66,11 +70,13 @@ Fix start() const { return start_; } //!< the very first fix Fix landing() const { return landing_; } //!< the very last fix + const QVector& altitude(Fix::Source) const; private: QString device_, pilot_, glider_; QDate date_; Fixes fixes_; + mutable QVector* altitude_[2]; Fix start_; Fix landing_; diff -r dfefb6003498 -r c55e1f2a4db4 mainwindow.cc --- a/mainwindow.cc Sun Jan 29 00:38:40 2012 +0100 +++ b/mainwindow.cc Sun Jan 29 01:51:02 2012 +0100 @@ -9,6 +9,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui_(new Ui::MainWindow), + igc_(0), plot_(new QwtPlot(tr("Altitude"), this)) { ui_->setupUi(this); @@ -41,6 +42,8 @@ MainWindow::~MainWindow() { delete ui_; + delete igc_; + delete plot_; } void MainWindow::open(const QString &s) @@ -72,9 +75,16 @@ setWindowTitle(QFileInfo(fileName).baseName()); statusBar()->showMessage(tr("opening %1").arg(fileName), 5000); - igc_.read(input_); + delete igc_; + igc_ = new IGC(input_); + showInfo(); + showProfile(); +} + +void MainWindow::showInfo() +{ // now let's fill the table QTableWidget *t = ui_->table; int r = 0; @@ -88,57 +98,32 @@ // fill t->setRowCount(t->rowCount() + 1); t->setItem(r, K, new QTableWidgetItem(tr("Pilot"))); - t->setItem(r, V, new QTableWidgetItem(igc_.pilot())); + t->setItem(r, V, new QTableWidgetItem(igc_->pilot())); ++r; t->setRowCount(t->rowCount() + 1); t->setItem(r, K, new QTableWidgetItem(tr("Date"))); - t->setItem(r, V, new QTableWidgetItem(igc_ - .date() + t->setItem(r, V, new QTableWidgetItem(igc_->date() .toString(DefaultLocaleLongDate))); ++r; t->setRowCount(t->rowCount() + 1); t->setItem(r, K, new QTableWidgetItem(tr("Glider"))); - t->setItem(r, V, new QTableWidgetItem(igc_.glider())); + t->setItem(r, V, new QTableWidgetItem(igc_->glider())); ++r; t->setRowCount(t->rowCount() + 1); t->setItem(r, K, new QTableWidgetItem(tr("Place"))); - t->setItem(r, V, new QTableWidgetItem(igc_.start().longitude() + " / " + igc_.start().latitude())); + t->setItem(r, V, new QTableWidgetItem(igc_->start().longitude() + " / " + igc_->start().latitude())); ++r; - showProfile(); } void MainWindow::showProfile() { - const Fixes f = igc_.fixes(); -#ifdef MYPLOT - QList< QPair > altitudesBaro; - QList< QPair > altitudesGPS; -#endif - QVector pointsGPS; - QVector pointsBaro; - - - for (Fixes::const_iterator i = f.begin(); - i != f.end(); - i++) { -#ifdef MYPLOT - altitudesBaro << i->altitudeFix(Fix::baro); - altitudesGPS << i->altitudeFix(Fix::gps); -#endif - pointsGPS << QPointF(QTime().secsTo(i->time()), i->altitude(Fix::gps)); - pointsBaro << QPointF(QTime().secsTo(i->time()), i->altitude(Fix::baro)); - } - -#ifdef MYPLOT - myPlot_.draw(altitudesBaro.begin(), altitudesBaro.end()); - myPlot_.draw(altitudesGPS.begin(), altitudesGPS.end()); - ui_->altitude->setScene(&myPlot_); -#endif + QVector pointsGPS = igc_->altitude(Fix::gps); + QVector pointsBaro = igc_->altitude(Fix::baro); QwtPlotCurve *gps = new QwtPlotCurve(tr("Altitude GPS")); QwtPlotCurve *baro = new QwtPlotCurve(tr("Altitude barometric")); diff -r dfefb6003498 -r c55e1f2a4db4 mainwindow.h --- a/mainwindow.h Sun Jan 29 00:38:40 2012 +0100 +++ b/mainwindow.h Sun Jan 29 01:51:02 2012 +0100 @@ -12,23 +12,27 @@ class MainWindow : public QMainWindow { Q_OBJECT + public: MainWindow(QWidget *parent = 0); ~MainWindow(); + public slots: void open(const QString& = ""); + private: + void showProfile(); + void showInfo(); Ui::MainWindow *ui_; + QFile currentFile_; QTextStream input_; - IGC igc_; -#ifdef MYPLOT - Plot *myplot_; -#endif + IGC *igc_; QwtPlot *plot_; + };