From 9e35ae223960acc0d3ff4006ca52f455c17cbe96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Cebri=C3=A1n=20Juan?= Date: Sat, 5 May 2018 07:44:20 +0200 Subject: [PATCH] Add GPS Exchange Format (GPX) output writer class --- src/algorithms/PVT/libs/gpx_printer.cc | 176 +++++++++++++++++++++++++ src/algorithms/PVT/libs/gpx_printer.h | 62 +++++++++ 2 files changed, 238 insertions(+) create mode 100644 src/algorithms/PVT/libs/gpx_printer.cc create mode 100644 src/algorithms/PVT/libs/gpx_printer.h diff --git a/src/algorithms/PVT/libs/gpx_printer.cc b/src/algorithms/PVT/libs/gpx_printer.cc new file mode 100644 index 000000000..2960e6e7c --- /dev/null +++ b/src/algorithms/PVT/libs/gpx_printer.cc @@ -0,0 +1,176 @@ +/*! + * \file gpx_printer.cc + * \brief Interface of a class that prints PVT information to a gpx file + * \author Álvaro Cebrián Juan, 2018. acebrianjuan(at)gmail.com + * + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR 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, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#include "gpx_printer.h" +#include +#include +#include + +using google::LogMessage; + +bool Gpx_Printer::set_headers(std::string filename, bool time_tag_name) +{ + boost::posix_time::ptime pt = boost::posix_time::second_clock::local_time(); + tm timeinfo = boost::posix_time::to_tm(pt); + + if (time_tag_name) + { + std::stringstream strm0; + const int year = timeinfo.tm_year - 100; + strm0 << year; + const int month = timeinfo.tm_mon + 1; + if (month < 10) + { + strm0 << "0"; + } + strm0 << month; + const int day = timeinfo.tm_mday; + if (day < 10) + { + strm0 << "0"; + } + strm0 << day << "_"; + const int hour = timeinfo.tm_hour; + if (hour < 10) + { + strm0 << "0"; + } + strm0 << hour; + const int min = timeinfo.tm_min; + if (min < 10) + { + strm0 << "0"; + } + strm0 << min; + const int sec = timeinfo.tm_sec; + if (sec < 10) + { + strm0 << "0"; + } + strm0 << sec; + + gpx_filename = filename + "_" + strm0.str() + ".gpx"; + } + else + { + gpx_filename = filename + ".gpx"; + } + gpx_file.open(gpx_filename.c_str()); + + if (gpx_file.is_open()) + { + DLOG(INFO) << "GPX printer writing on " << filename.c_str(); + // Set iostream numeric format and precision + gpx_file.setf(gpx_file.fixed, gpx_file.floatfield); + gpx_file << std::setprecision(14); + gpx_file << "" << std::endl + << "" << std::endl + << "" << std::endl + << "" << std::endl; + return true; + } + else + { + return false; + } +} + + +bool Gpx_Printer::print_position(const std::shared_ptr& position, bool print_average_values) +{ + double latitude; + double longitude; + double height; + + positions_printed = true; + + std::shared_ptr position_ = position; + + if (print_average_values == false) + { + latitude = position_->get_latitude(); + longitude = position_->get_longitude(); + height = position_->get_height(); + } + else + { + latitude = position_->get_avg_latitude(); + longitude = position_->get_avg_longitude(); + height = position_->get_avg_height(); + } + + if (gpx_file.is_open()) + { + gpx_file << "" << height << "" << std::endl; + return true; + } + else + { + return false; + } +} + + +bool Gpx_Printer::close_file() +{ + if (gpx_file.is_open()) + { + gpx_file << "" << std::endl + << "" << std::endl + << ""; + gpx_file.close(); + return true; + } + else + { + return false; + } +} + + +Gpx_Printer::Gpx_Printer() +{ + positions_printed = false; +} + + +Gpx_Printer::~Gpx_Printer() +{ + close_file(); + if (!positions_printed) + { + if (remove(gpx_filename.c_str()) != 0) LOG(INFO) << "Error deleting temporary GPX file"; + } +} diff --git a/src/algorithms/PVT/libs/gpx_printer.h b/src/algorithms/PVT/libs/gpx_printer.h new file mode 100644 index 000000000..f7415cf71 --- /dev/null +++ b/src/algorithms/PVT/libs/gpx_printer.h @@ -0,0 +1,62 @@ +/*! + * \file gpx_printer.h + * \brief Interface of a class that prints PVT information to a gpx file + * \author Álvaro Cebrián Juan, 2018. acebrianjuan(at)gmail.com + * + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2018 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR 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, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR 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 for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#ifndef GNSS_SDR_GPX_PRINTER_H_ +#define GNSS_SDR_GPX_PRINTER_H_ + +#include "pvt_solution.h" +#include +#include +#include + + +/*! + * \brief Prints PVT information to GPX format file + * + * See http://www.topografix.com/gpx.asp + */ +class Gpx_Printer +{ +private: + std::ofstream gpx_file; + bool positions_printed; + std::string gpx_filename; + +public: + Gpx_Printer(); + ~Gpx_Printer(); + bool set_headers(std::string filename, bool time_tag_name = true); + bool print_position(const std::shared_ptr& position, bool print_average_values); + bool close_file(); +}; + +#endif