2012-01-03 05:38:45 +00:00
/*!
2012-01-10 08:43:58 +00:00
* \ file rinex_printer . cc
2014-09-06 00:26:43 +00:00
* \ brief Implementation of a RINEX 2.11 / 3.02 printer
* See http : //igscb.jpl.nasa.gov/igscb/data/format/rinex302.pdf
2012-01-03 05:38:45 +00:00
* \ author Carles Fernandez Prades , 2011. cfernandez ( at ) cttc . es
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
2018-05-13 20:49:11 +00:00
* Copyright ( C ) 2010 - 2018 ( see AUTHORS file for a list of contributors )
2012-01-03 05:38:45 +00:00
*
* 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
2014-09-02 00:04:13 +00:00
* ( at your option ) any later version .
2012-01-03 05:38:45 +00:00
*
* 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
2018-05-13 20:49:11 +00:00
* along with GNSS - SDR . If not , see < https : //www.gnu.org/licenses/>.
2012-01-03 05:38:45 +00:00
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
2012-01-10 08:43:58 +00:00
# include "rinex_printer.h"
2014-01-14 23:22:54 +00:00
# include <boost/date_time/time_zone_base.hpp>
# include <boost/date_time/gregorian/gregorian.hpp>
# include <boost/date_time/local_time/local_time.hpp>
# include <boost/date_time/posix_time/posix_time.hpp>
2014-03-16 19:58:29 +00:00
# include <glog/logging.h>
2018-03-03 01:03:39 +00:00
# include <unistd.h> // for getlogin_r()
# include <algorithm> // for min and max
# include <cmath> // for floor
# include <cstdlib> // for getenv()
2015-03-03 13:56:22 +00:00
# include <iterator>
2014-01-12 20:07:38 +00:00
# include <ostream>
2016-10-31 21:32:58 +00:00
# include <set>
2014-01-12 20:07:38 +00:00
# include <utility>
# include <vector>
2011-10-01 18:45:20 +00:00
2012-01-03 05:38:45 +00:00
using google : : LogMessage ;
2011-10-01 18:45:20 +00:00
2012-01-10 08:43:58 +00:00
2018-08-11 11:56:24 +00:00
Rinex_Printer : : Rinex_Printer ( int32_t conf_version )
2012-01-03 05:38:45 +00:00
{
2012-02-16 19:17:06 +00:00
navfilename = Rinex_Printer : : createFilename ( " RINEX_FILE_TYPE_GPS_NAV " ) ;
obsfilename = Rinex_Printer : : createFilename ( " RINEX_FILE_TYPE_OBS " ) ;
2013-11-10 00:42:15 +00:00
sbsfilename = Rinex_Printer : : createFilename ( " RINEX_FILE_TYPE_SBAS " ) ;
2014-08-31 13:58:09 +00:00
navGalfilename = Rinex_Printer : : createFilename ( " RINEX_FILE_TYPE_GAL_NAV " ) ;
2014-09-05 10:44:51 +00:00
navMixfilename = Rinex_Printer : : createFilename ( " RINEX_FILE_TYPE_MIXED_NAV " ) ;
2017-07-19 14:45:54 +00:00
navGlofilename = Rinex_Printer : : createFilename ( " RINEX_FILE_TYPE_GLO_NAV " ) ;
2014-08-31 13:58:09 +00:00
2015-03-03 13:56:22 +00:00
Rinex_Printer : : navFile . open ( navfilename , std : : ios : : out | std : : ios : : in | std : : ios : : app ) ;
2015-03-03 21:48:03 +00:00
Rinex_Printer : : obsFile . open ( obsfilename , std : : ios : : out | std : : ios : : in | std : : ios : : app ) ;
2013-11-10 00:42:15 +00:00
Rinex_Printer : : sbsFile . open ( sbsfilename , std : : ios : : out | std : : ios : : app ) ;
2015-03-03 21:48:03 +00:00
Rinex_Printer : : navGalFile . open ( navGalfilename , std : : ios : : out | std : : ios : : in | std : : ios : : app ) ;
Rinex_Printer : : navMixFile . open ( navMixfilename , std : : ios : : out | std : : ios : : in | std : : ios : : app ) ;
2017-07-19 14:45:54 +00:00
Rinex_Printer : : navGloFile . open ( navGlofilename , std : : ios : : out | std : : ios : : in | std : : ios : : app ) ;
2012-01-04 07:52:56 +00:00
2014-09-05 14:38:44 +00:00
// RINEX v3.02 codes
2012-01-11 07:05:09 +00:00
satelliteSystem [ " GPS " ] = " G " ;
satelliteSystem [ " GLONASS " ] = " R " ;
satelliteSystem [ " SBAS payload " ] = " S " ;
satelliteSystem [ " Galileo " ] = " E " ;
2014-09-05 10:44:51 +00:00
satelliteSystem [ " Beidou " ] = " C " ;
2014-09-05 14:38:44 +00:00
satelliteSystem [ " Mixed " ] = " M " ;
2012-01-04 07:52:56 +00:00
2018-03-03 01:03:39 +00:00
observationCode [ " GPS_L1_CA " ] = " 1C " ; // "1C" GPS L1 C/A
observationCode [ " GPS_L1_P " ] = " 1P " ; // "1P" GPS L1 P
observationCode [ " GPS_L1_Z_TRACKING " ] = " 1W " ; // "1W" GPS L1 Z-tracking and similar (AS on)
observationCode [ " GPS_L1_Y " ] = " 1Y " ; // "1Y" GPS L1 Y
observationCode [ " GPS_L1_M " ] = " 1M " ; // "1M" GPS L1 M
observationCode [ " GPS_L1_CODELESS " ] = " 1N " ; // "1N" GPS L1 codeless
observationCode [ " GPS_L2_CA " ] = " 2C " ; // "2C" GPS L2 C/A
observationCode [ " L2_SEMI_CODELESS " ] = " 2D " ; // "2D" GPS L2 L1(C/A)+(P2-P1) semi-codeless
observationCode [ " GPS_L2_L2CM " ] = " 2S " ; // "2S" GPS L2 L2C (M)
observationCode [ " GPS_L2_L2CL " ] = " 2L " ; // "2L" GPS L2 L2C (L)
observationCode [ " GPS_L2_L2CML " ] = " 2X " ; // "2X" GPS L2 L2C (M+L)
observationCode [ " GPS_L2_P " ] = " 2P " ; // "2P" GPS L2 P
observationCode [ " GPS_L2_Z_TRACKING " ] = " 2W " ; // "2W" GPS L2 Z-tracking and similar (AS on)
observationCode [ " GPS_L2_Y " ] = " 2Y " ; // "2Y" GPS L2 Y
observationCode [ " GPS_L2_M " ] = " 2M " ; // "2M" GPS GPS L2 M
observationCode [ " GPS_L2_codeless " ] = " 2N " ; // "2N" GPS L2 codeless
observationCode [ " GPS_L5_I " ] = " 5I " ; // "5I" GPS L5 I
observationCode [ " GPS_L5_Q " ] = " 5Q " ; // "5Q" GPS L5 Q
observationCode [ " GPS_L5_IQ " ] = " 5X " ; // "5X" GPS L5 I+Q
observationCode [ " GLONASS_G1_CA " ] = " 1C " ; // "1C" GLONASS G1 C/A
observationCode [ " GLONASS_G1_P " ] = " 1P " ; // "1P" GLONASS G1 P
observationCode [ " GLONASS_G2_CA " ] = " 2C " ; // "2C" GLONASS G2 C/A (Glonass M)
observationCode [ " GLONASS_G2_P " ] = " 2P " ; // "2P" GLONASS G2 P
observationCode [ " GALILEO_E1_A " ] = " 1A " ; // "1A" GALILEO E1 A (PRS)
observationCode [ " GALILEO_E1_B " ] = " 1B " ; // "1B" GALILEO E1 B (I/NAV OS/CS/SoL)
observationCode [ " GALILEO_E1_C " ] = " 1C " ; // "1C" GALILEO E1 C (no data)
observationCode [ " GALILEO_E1_BC " ] = " 1X " ; // "1X" GALILEO E1 B+C
observationCode [ " GALILEO_E1_ABC " ] = " 1Z " ; // "1Z" GALILEO E1 A+B+C
observationCode [ " GALILEO_E5a_I " ] = " 5I " ; // "5I" GALILEO E5a I (F/NAV OS)
observationCode [ " GALILEO_E5a_Q " ] = " 5Q " ; // "5Q" GALILEO E5a Q (no data)
observationCode [ " GALILEO_E5a_IQ " ] = " 5X " ; // "5X" GALILEO E5a I+Q
observationCode [ " GALILEO_E5b_I " ] = " 7I " ; // "7I" GALILEO E5b I
observationCode [ " GALILEO_E5b_Q " ] = " 7Q " ; // "7Q" GALILEO E5b Q
observationCode [ " GALILEO_E5b_IQ " ] = " 7X " ; // "7X" GALILEO E5b I+Q
observationCode [ " GALILEO_E5_I " ] = " 8I " ; // "8I" GALILEO E5 I
observationCode [ " GALILEO_E5_Q " ] = " 8Q " ; // "8Q" GALILEO E5 Q
observationCode [ " GALILEO_E5_IQ " ] = " 8X " ; // "8X" GALILEO E5 I+Q
observationCode [ " GALILEO_E56_A " ] = " 6A " ; // "6A" GALILEO E6 A
observationCode [ " GALILEO_E56_B " ] = " 6B " ; // "6B" GALILEO E6 B
observationCode [ " GALILEO_E56_B " ] = " 6C " ; // "6C" GALILEO E6 C
observationCode [ " GALILEO_E56_BC " ] = " 6X " ; // "6X" GALILEO E6 B+C
observationCode [ " GALILEO_E56_ABC " ] = " 6Z " ; // "6Z" GALILEO E6 A+B+C
observationCode [ " SBAS_L1_CA " ] = " 1C " ; // "1C" SBAS L1 C/A
observationCode [ " SBAS_L5_I " ] = " 5I " ; // "5I" SBAS L5 I
observationCode [ " SBAS_L5_Q " ] = " 5Q " ; // "5Q" SBAS L5 Q
observationCode [ " SBAS_L5_IQ " ] = " 5X " ; // "5X" SBAS L5 I+Q
2012-01-04 07:52:56 +00:00
observationCode [ " COMPASS_E2_I " ] = " 2I " ;
observationCode [ " COMPASS_E2_Q " ] = " 2Q " ;
observationCode [ " COMPASS_E2_IQ " ] = " 2X " ;
observationCode [ " COMPASS_E5b_I " ] = " 7I " ;
observationCode [ " COMPASS_E5b_Q " ] = " 7Q " ;
observationCode [ " COMPASS_E5b_IQ " ] = " 7X " ;
observationCode [ " COMPASS_E6_I " ] = " 6I " ;
observationCode [ " COMPASS_E6_Q " ] = " 6Q " ;
observationCode [ " COMPASS_E6_IQ " ] = " 6X " ;
2012-01-11 07:05:09 +00:00
observationType [ " PSEUDORANGE " ] = " C " ;
observationType [ " CARRIER_PHASE " ] = " L " ;
observationType [ " DOPPLER " ] = " D " ;
observationType [ " SIGNAL_STRENGTH " ] = " S " ;
2011-10-01 18:45:20 +00:00
2013-05-23 17:05:06 +00:00
// RINEX v2.10 and v2.11 codes
observationType [ " PSEUDORANGE_CA_v2 " ] = " C " ;
observationType [ " PSEUDORANGE_P_v2 " ] = " P " ;
2013-05-24 16:11:48 +00:00
observationType [ " CARRIER_PHASE_CA_v2 " ] = " L " ;
2013-05-23 17:05:06 +00:00
observationType [ " DOPPLER_v2 " ] = " D " ;
observationType [ " SIGNAL_STRENGTH_v2 " ] = " S " ;
observationCode [ " GPS_L1_CA_v2 " ] = " 1 " ;
2017-12-26 00:05:35 +00:00
observationCode [ " GLONASS_G1_CA_v2 " ] = " 1 " ;
2013-05-23 17:05:06 +00:00
2018-03-03 01:03:39 +00:00
if ( conf_version = = 2 )
2014-09-06 00:26:43 +00:00
{
version = 2 ;
stringVersion = " 2.11 " ;
2014-09-05 14:38:44 +00:00
}
2012-01-10 08:43:58 +00:00
else
{
2015-05-15 01:02:45 +00:00
version = 3 ;
stringVersion = " 3.02 " ;
2012-01-10 08:43:58 +00:00
}
2018-03-03 01:03:39 +00:00
numberTypesObservations = 4 ; // Number of available types of observable in the system
2017-04-01 08:47:36 +00:00
fake_cnav_iode = 1 ;
2011-10-01 18:45:20 +00:00
}
2012-01-03 07:31:32 +00:00
2012-01-10 08:43:58 +00:00
Rinex_Printer : : ~ Rinex_Printer ( )
2011-10-01 18:45:20 +00:00
{
2012-01-03 05:38:45 +00:00
// close RINEX files
2018-08-11 11:56:24 +00:00
int64_t posn , poso , poss , posng , posmn , posnr ;
2012-02-16 19:17:06 +00:00
posn = navFile . tellp ( ) ;
poso = obsFile . tellp ( ) ;
2014-09-01 16:00:33 +00:00
poss = sbsFile . tellp ( ) ;
2014-08-31 13:58:09 +00:00
posng = navGalFile . tellp ( ) ;
2014-09-05 10:44:51 +00:00
posmn = navMixFile . tellp ( ) ;
2017-07-24 05:57:54 +00:00
posnr = navGloFile . tellp ( ) ;
2017-07-19 14:45:54 +00:00
2012-01-10 08:43:58 +00:00
Rinex_Printer : : navFile . close ( ) ;
Rinex_Printer : : obsFile . close ( ) ;
2013-11-10 00:42:15 +00:00
Rinex_Printer : : sbsFile . close ( ) ;
2014-08-31 13:58:09 +00:00
Rinex_Printer : : navGalFile . close ( ) ;
2017-07-19 14:45:54 +00:00
Rinex_Printer : : navGloFile . close ( ) ;
2012-02-16 19:17:06 +00:00
// If nothing written, erase the files.
if ( posn = = 0 )
{
2018-03-03 01:03:39 +00:00
if ( remove ( navfilename . c_str ( ) ) ! = 0 ) LOG ( INFO ) < < " Error deleting temporary file " ;
2012-02-16 19:17:06 +00:00
}
if ( poso = = 0 )
{
2018-03-03 01:03:39 +00:00
if ( remove ( obsfilename . c_str ( ) ) ! = 0 ) LOG ( INFO ) < < " Error deleting temporary file " ;
2012-02-16 19:17:06 +00:00
}
2013-11-10 00:42:15 +00:00
if ( poss = = 0 )
{
2018-03-03 01:03:39 +00:00
if ( remove ( sbsfilename . c_str ( ) ) ! = 0 ) LOG ( INFO ) < < " Error deleting temporary file " ;
2013-11-10 00:42:15 +00:00
}
2014-08-31 13:58:09 +00:00
if ( posng = = 0 )
{
2018-03-03 01:03:39 +00:00
if ( remove ( navGalfilename . c_str ( ) ) ! = 0 ) LOG ( INFO ) < < " Error deleting temporary file " ;
2014-08-31 13:58:09 +00:00
}
2014-09-05 10:44:51 +00:00
if ( posmn = = 0 )
{
2018-03-03 01:03:39 +00:00
if ( remove ( navMixfilename . c_str ( ) ) ! = 0 ) LOG ( INFO ) < < " Error deleting temporary file " ;
2014-09-05 10:44:51 +00:00
}
2017-07-19 14:45:54 +00:00
if ( posnr = = 0 )
{
2018-03-03 01:03:39 +00:00
if ( remove ( navGlofilename . c_str ( ) ) ! = 0 ) LOG ( INFO ) < < " Error deleting temporary file " ;
2017-07-19 14:45:54 +00:00
}
2011-10-01 18:45:20 +00:00
}
2012-01-03 05:38:45 +00:00
2014-09-14 17:08:32 +00:00
void Rinex_Printer : : lengthCheck ( const std : : string & line )
2011-10-01 18:45:20 +00:00
{
2012-01-03 05:38:45 +00:00
if ( line . length ( ) ! = 80 )
{
2014-03-16 19:58:29 +00:00
LOG ( ERROR ) < < " Bad defined RINEX line: "
2018-03-03 01:03:39 +00:00
< < line . length ( ) < < " characters (must be 80) " < < std : : endl
< < line < < std : : endl
< < " ----|---1|0---|---2|0---|---3|0---|---4|0---|---5|0---|---6|0---|---7|0---|---8| " < < std : : endl ;
2012-01-03 05:38:45 +00:00
}
}
2012-01-11 07:05:09 +00:00
std : : string Rinex_Printer : : createFilename ( std : : string type )
{
2018-03-03 01:03:39 +00:00
const std : : string stationName = " GSDR " ; // 4-character station name designator
2012-01-03 05:38:45 +00:00
boost : : gregorian : : date today = boost : : gregorian : : day_clock : : local_day ( ) ;
2018-08-11 11:56:24 +00:00
const int32_t dayOfTheYear = today . day_of_year ( ) ;
2012-01-03 05:38:45 +00:00
std : : stringstream strm0 ;
2018-03-03 01:03:39 +00:00
if ( dayOfTheYear < 100 ) strm0 < < " 0 " ; // three digits for day of the year
if ( dayOfTheYear < 10 ) strm0 < < " 0 " ; // three digits for day of the year
2012-01-03 05:38:45 +00:00
strm0 < < dayOfTheYear ;
2018-03-03 01:03:39 +00:00
std : : string dayOfTheYearTag = strm0 . str ( ) ;
2012-01-03 05:38:45 +00:00
std : : map < std : : string , std : : string > fileType ;
2012-01-11 07:05:09 +00:00
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_OBS " , " O " ) ) ; // O - Observation file.
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_GPS_NAV " , " N " ) ) ; // N - GPS navigation message file.
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_MET " , " M " ) ) ; // M - Meteorological data file.
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_GLO_NAV " , " G " ) ) ; // G - GLONASS navigation file.
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_GAL_NAV " , " L " ) ) ; // L - Galileo navigation message file.
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_MIXED_NAV " , " P " ) ) ; // P - Mixed GNSS navigation message file.
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_GEO_NAV " , " H " ) ) ; // H - SBAS Payload navigation message file.
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_SBAS " , " B " ) ) ; // B - SBAS broadcast data file.
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_CLK " , " C " ) ) ; // C - Clock file.
fileType . insert ( std : : pair < std : : string , std : : string > ( " RINEX_FILE_TYPE_SUMMARY " , " S " ) ) ; // S - Summary file (used e.g., by IGS, not a standard!).
boost : : posix_time : : ptime pt = boost : : posix_time : : second_clock : : local_time ( ) ;
tm pt_tm = boost : : posix_time : : to_tm ( pt ) ;
2018-08-11 11:56:24 +00:00
int32_t local_hour = pt_tm . tm_hour ;
2012-01-03 05:38:45 +00:00
std : : stringstream strm ;
strm < < local_hour ;
std : : map < std : : string , std : : string > Hmap ;
2012-01-11 07:05:09 +00:00
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 0 " , " a " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 1 " , " b " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 2 " , " c " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 3 " , " d " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 4 " , " e " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 5 " , " f " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 6 " , " g " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 7 " , " h " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 8 " , " i " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 9 " , " j " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 10 " , " k " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 11 " , " l " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 12 " , " m " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 13 " , " n " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 14 " , " o " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 15 " , " p " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 16 " , " q " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 17 " , " r " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 18 " , " s " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 19 " , " t " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 20 " , " u " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 21 " , " v " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 22 " , " w " ) ) ;
Hmap . insert ( std : : pair < std : : string , std : : string > ( " 23 " , " x " ) ) ;
2012-01-03 05:38:45 +00:00
std : : string hourTag = Hmap [ strm . str ( ) ] ;
2018-08-11 11:56:24 +00:00
int32_t local_minute = pt_tm . tm_min ;
2012-01-03 05:38:45 +00:00
std : : stringstream strm2 ;
2018-03-03 01:03:39 +00:00
if ( local_minute < 10 ) strm2 < < " 0 " ; // at least two digits for minutes
2012-01-03 05:38:45 +00:00
strm2 < < local_minute ;
std : : string minTag = strm2 . str ( ) ;
2018-08-11 11:56:24 +00:00
int32_t local_year = pt_tm . tm_year - 100 ; // 2012 is 112
2012-01-03 05:38:45 +00:00
std : : stringstream strm3 ;
strm3 < < local_year ;
std : : string yearTag = strm3 . str ( ) ;
2012-01-11 07:05:09 +00:00
std : : string typeOfFile = fileType [ type ] ;
2012-01-03 05:38:45 +00:00
2012-01-11 07:05:09 +00:00
std : : string filename ( stationName + dayOfTheYearTag + hourTag + minTag + " . " + yearTag + typeOfFile ) ;
2012-01-03 05:38:45 +00:00
return filename ;
2011-10-01 18:45:20 +00:00
}
2012-01-03 05:38:45 +00:00
2012-01-10 08:43:58 +00:00
std : : string Rinex_Printer : : getLocalTime ( )
2011-10-01 18:45:20 +00:00
{
2012-01-03 05:38:45 +00:00
std : : string line ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( " GNSS-SDR " ) ;
line + = std : : string ( 12 , ' ' ) ;
2014-09-05 10:44:51 +00:00
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2014-09-05 10:44:51 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
line + = Rinex_Printer : : leftJustify ( username , 20 ) ;
2012-01-03 05:38:45 +00:00
boost : : gregorian : : date today = boost : : gregorian : : day_clock : : local_day ( ) ;
boost : : local_time : : time_zone_ptr zone ( new boost : : local_time : : posix_time_zone ( " UTC " ) ) ;
boost : : local_time : : local_date_time pt = boost : : local_time : : local_sec_clock : : local_time ( zone ) ;
2012-01-11 07:05:09 +00:00
tm pt_tm = boost : : local_time : : to_tm ( pt ) ;
2012-01-03 05:38:45 +00:00
2012-01-10 08:43:58 +00:00
std : : stringstream strmHour ;
2018-08-11 11:56:24 +00:00
int32_t utc_hour = pt_tm . tm_hour ;
2018-03-03 01:03:39 +00:00
if ( utc_hour < 10 ) strmHour < < " 0 " ; // two digits for hours
2012-01-10 08:43:58 +00:00
strmHour < < utc_hour ;
2012-01-03 05:38:45 +00:00
2012-01-10 08:43:58 +00:00
std : : stringstream strmMin ;
2018-08-11 11:56:24 +00:00
int32_t utc_minute = pt_tm . tm_min ;
2018-03-03 01:03:39 +00:00
if ( utc_minute < 10 ) strmMin < < " 0 " ; // two digits for minutes
2012-01-10 08:43:58 +00:00
strmMin < < utc_minute ;
if ( version = = 2 )
{
2018-08-11 11:56:24 +00:00
int32_t day = pt_tm . tm_mday ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( day ) , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( " - " ) ;
2018-08-11 11:56:24 +00:00
std : : map < int32_t , std : : string > months ;
2012-01-11 07:05:09 +00:00
months [ 0 ] = " JAN " ;
months [ 1 ] = " FEB " ;
months [ 2 ] = " MAR " ;
months [ 3 ] = " APR " ;
months [ 4 ] = " MAY " ;
months [ 5 ] = " JUN " ;
months [ 6 ] = " JUL " ;
months [ 7 ] = " AUG " ;
months [ 8 ] = " SEP " ;
months [ 9 ] = " OCT " ;
months [ 10 ] = " NOV " ;
months [ 11 ] = " DEC " ;
2012-01-10 08:43:58 +00:00
line + = months [ pt_tm . tm_mon ] ;
line + = std : : string ( " - " ) ;
2012-01-11 07:05:09 +00:00
line + = boost : : lexical_cast < std : : string > ( pt_tm . tm_year - 100 ) ;
line + = std : : string ( 1 , ' ' ) ;
2012-01-10 08:43:58 +00:00
line + = strmHour . str ( ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( " : " ) ;
2012-01-10 08:43:58 +00:00
line + = strmMin . str ( ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 5 , ' ' ) ;
2012-01-10 08:43:58 +00:00
}
if ( version = = 3 )
{
2012-01-11 07:05:09 +00:00
line + = boost : : gregorian : : to_iso_string ( today ) ;
2014-09-01 09:42:51 +00:00
line + = std : : string ( 1 , ' ' ) ;
2012-01-10 08:43:58 +00:00
line + = strmHour . str ( ) ;
line + = strmMin . str ( ) ;
std : : stringstream strm2 ;
2018-08-11 11:56:24 +00:00
int32_t utc_seconds = pt_tm . tm_sec ;
2018-03-03 01:03:39 +00:00
if ( utc_seconds < 10 ) strm2 < < " 0 " ; // two digits for seconds
2012-01-10 08:43:58 +00:00
strm2 < < utc_seconds ;
line + = strm2 . str ( ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( " UTC " ) ;
line + = std : : string ( 1 , ' ' ) ;
2012-01-10 08:43:58 +00:00
}
2012-01-03 05:38:45 +00:00
return line ;
}
2011-10-01 18:45:20 +00:00
2017-12-26 00:05:35 +00:00
void Rinex_Printer : : rinex_nav_header ( std : : fstream & out , const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model , const Glonass_Gnav_Ephemeris & glonass_gnav_eph )
2017-07-19 14:45:54 +00:00
{
std : : string line ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = std : : string ( " N: GNSS NAV DATA " ) ;
line + = std : : string ( 4 , ' ' ) ;
line + = std : : string ( " R: GLONASS " ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GLONASS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction
2017-12-26 00:05:35 +00:00
if ( version = = 3 )
2018-01-28 10:46:35 +00:00
{
line . clear ( ) ;
line + = std : : string ( " GLUT " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_c , 16 , 2 ) , 17 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-26 00:05:35 +00:00
2018-01-28 10:46:35 +00:00
// -------- Line system time correction 2
line . clear ( ) ;
line + = std : : string ( " GLGP " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_gps , 16 , 2 ) , 17 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2017-12-26 00:05:35 +00:00
if ( version = = 2 )
2018-01-28 10:46:35 +00:00
{
// Set reference time and its clock corrections
boost : : posix_time : : ptime p_utc_ref_time = glonass_gnav_eph . glot_to_utc ( glonass_gnav_eph . d_t_b , 0.0 ) ;
std : : string timestring = boost : : posix_time : : to_iso_string ( p_utc_ref_time ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
2017-12-26 00:05:35 +00:00
2018-01-28 10:46:35 +00:00
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = std : : string ( 3 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_c , 19 , 2 ) , 19 ) ;
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " CORR TO SYSTEM TIME " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2017-07-19 14:45:54 +00:00
// -------- End of Header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
void Rinex_Printer : : rinex_nav_header ( std : : fstream & out , const Gps_Iono & gps_iono , const Gps_Utc_Model & gps_utc_model , const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model , const Glonass_Gnav_Almanac & glonass_gnav_almanac )
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_almanac . i_satellite_freq_channel )
{
} //Avoid compiler warning
2017-07-19 14:45:54 +00:00
std : : string line ;
stringVersion = " 3.02 " ;
version = 3 ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = std : : string ( " N: GNSS NAV DATA " ) ;
line + = std : : string ( 4 , ' ' ) ;
line + = std : : string ( " M: MIXED " ) ;
line + = std : : string ( 12 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GNSS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line ionospheric info 1
line . clear ( ) ;
line + = std : : string ( " GPSA " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 1
line . clear ( ) ;
line + = std : : string ( " GLUT " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_c , 16 , 2 ) , 17 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 2
line . clear ( ) ;
line + = std : : string ( " GLGP " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_gps , 16 , 2 ) , 17 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 3
line . clear ( ) ;
line + = std : : string ( " GPUT " ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_t_OT ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 6 leap seconds
// For leap second information, see http://www.endruntechnologies.com/leap.htm
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LS ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_DN ) , 6 ) ;
line + = std : : string ( 36 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- End of Header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2018-01-25 18:35:28 +00:00
2017-12-28 02:10:08 +00:00
void Rinex_Printer : : rinex_nav_header ( std : : fstream & out , const Gps_CNAV_Iono & gps_iono , const Gps_CNAV_Utc_Model & gps_utc_model , const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model , const Glonass_Gnav_Almanac & glonass_gnav_almanac )
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_almanac . i_satellite_freq_channel )
{
} //Avoid compiler warning
2017-12-28 02:10:08 +00:00
std : : string line ;
stringVersion = " 3.02 " ;
version = 3 ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = std : : string ( " N: GNSS NAV DATA " ) ;
line + = std : : string ( 4 , ' ' ) ;
line + = std : : string ( " M: MIXED " ) ;
line + = std : : string ( 12 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GNSS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2017-12-28 02:10:08 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line ionospheric info 1
line . clear ( ) ;
line + = std : : string ( " GPSA " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 1
line . clear ( ) ;
line + = std : : string ( " GLUT " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_c , 16 , 2 ) , 17 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 2
line . clear ( ) ;
line + = std : : string ( " GLGP " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_gps , 16 , 2 ) , 17 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 3
line . clear ( ) ;
line + = std : : string ( " GPUT " ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_t_OT ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 6 leap seconds
// For leap second information, see http://www.endruntechnologies.com/leap.htm
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LS ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_DN ) , 6 ) ;
line + = std : : string ( 36 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- End of Header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2017-07-19 14:45:54 +00:00
2018-01-25 18:35:28 +00:00
2018-10-24 15:28:12 +00:00
void Rinex_Printer : : rinex_nav_header ( std : : fstream & out , const Galileo_Iono & galileo_iono , const Galileo_Utc_Model & galileo_utc_model , const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model , const Glonass_Gnav_Almanac & glonass_gnav_almanac )
2017-07-24 05:57:54 +00:00
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_almanac . i_satellite_freq_channel )
{
} //Avoid compiler warning
2018-01-28 10:46:35 +00:00
//Avoid compiler warning, there is not time system correction between Galileo and GLONASS
2018-10-24 15:28:12 +00:00
if ( galileo_utc_model . A_0G_10 )
2018-03-03 01:03:39 +00:00
{
}
2017-07-24 05:57:54 +00:00
std : : string line ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = std : : string ( " N: GNSS NAV DATA " ) ;
line + = std : : string ( 4 , ' ' ) ;
line + = std : : string ( " M: MIXED " ) ;
line + = std : : string ( 12 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GNSS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line ionospheric info 1
line . clear ( ) ;
line + = std : : string ( " GAL " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai0_5 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai1_5 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai2_5 , 10 , 2 ) , 12 ) ;
double zero = 0.0 ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( zero , 10 , 2 ) , 12 ) ;
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction
line . clear ( ) ;
line + = std : : string ( " GAUT " ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A0_6 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A1_6 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . t0t_6 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . WNot_6 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 1
line . clear ( ) ;
line + = std : : string ( " GLUT " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_c , 16 , 2 ) , 17 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 6 leap seconds
// For leap second information, see http://www.endruntechnologies.com/leap.htm
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . Delta_tLS_6 ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . Delta_tLSF_6 ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . WN_LSF_6 ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . DN_6 ) , 6 ) ;
line + = std : : string ( 36 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- End of Header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2018-01-25 18:35:28 +00:00
2018-10-24 15:28:12 +00:00
void Rinex_Printer : : rinex_nav_header ( std : : fstream & out , const Galileo_Iono & iono , const Galileo_Utc_Model & utc_model )
2014-08-31 13:58:09 +00:00
{
std : : string line ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = std : : string ( " N: GNSS NAV DATA " ) ;
line + = std : : string ( 4 , ' ' ) ;
line + = std : : string ( " E: GALILEO " ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GALILEO NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2014-09-01 18:38:31 +00:00
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2014-08-31 13:58:09 +00:00
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2014-08-31 13:58:09 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line ionospheric info 1
line . clear ( ) ;
line + = std : : string ( " GAL " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . ai0_5 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . ai1_5 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . ai2_5 , 10 , 2 ) , 12 ) ;
double zero = 0.0 ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( zero , 10 , 2 ) , 12 ) ;
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction
line . clear ( ) ;
line + = std : : string ( " GAUT " ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . A0_6 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . A1_6 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . t0t_6 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . WNot_6 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 2
2014-09-03 05:58:57 +00:00
line . clear ( ) ;
2014-08-31 13:58:09 +00:00
line + = std : : string ( " GPGA " ) ;
2018-10-24 15:28:12 +00:00
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . A_0G_10 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . A_1G_10 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . t_0G_10 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . WN_0G_10 ) , 5 ) ;
2014-08-31 13:58:09 +00:00
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
2014-09-03 05:58:57 +00:00
out < < line < < std : : endl ;
2014-08-31 13:58:09 +00:00
// -------- Line 6 leap seconds
// For leap second information, see http://www.endruntechnologies.com/leap.htm
line . clear ( ) ;
2014-09-03 05:58:57 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . Delta_tLS_6 ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . Delta_tLSF_6 ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . WN_LSF_6 ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . DN_6 ) , 6 ) ;
2014-08-31 13:58:09 +00:00
line + = std : : string ( 36 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- End of Header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2018-01-25 18:35:28 +00:00
2018-03-03 01:03:39 +00:00
void Rinex_Printer : : rinex_nav_header ( std : : fstream & out , const Gps_CNAV_Iono & iono , const Gps_CNAV_Utc_Model & utc_model )
2015-03-03 16:35:26 +00:00
{
2016-10-29 15:15:04 +00:00
std : : string line ;
2015-03-03 16:35:26 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = std : : string ( " N: GNSS NAV DATA " ) ;
line + = std : : string ( 4 , ' ' ) ;
line + = std : : string ( " G: GPS " ) ;
line + = std : : string ( 14 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 16:35:26 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 16:35:26 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GPS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 16:35:26 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 16:35:26 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2016-10-29 15:15:04 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 16:35:26 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line ionospheric info 1
line . clear ( ) ;
line + = std : : string ( " GPSA " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 16:35:26 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line ionospheric info 2
line . clear ( ) ;
line + = std : : string ( " GPSB " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta0 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta1 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta2 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta3 , 10 , 2 ) , 12 ) ;
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 5 system time correction
line . clear ( ) ;
line + = std : : string ( " GPUT " ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_t_OT ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
/* if ( SBAS )
{
line + = string ( 1 , ' ' ) ;
line + = leftJustify ( asString ( d_t_OT_SBAS ) , 5 ) ;
line + = string ( 1 , ' ' ) ;
line + = leftJustify ( asString ( d_WN_T_SBAS ) , 2 ) ;
line + = string ( 1 , ' ' ) ;
}
else
*/
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 6 leap seconds
// For leap second information, see http://www.endruntechnologies.com/leap.htm
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LS ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_DN ) , 6 ) ;
line + = std : : string ( 36 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- End of Header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 16:35:26 +00:00
}
2018-01-25 18:35:28 +00:00
2016-10-29 15:15:04 +00:00
void Rinex_Printer : : rinex_nav_header ( std : : fstream & out , const Gps_Iono & iono , const Gps_Utc_Model & utc_model )
2015-03-01 20:16:29 +00:00
{
2016-10-29 15:15:04 +00:00
std : : string line ;
2015-03-03 13:56:22 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
2015-03-03 13:56:22 +00:00
2016-10-29 15:15:04 +00:00
if ( version = = 2 )
{
line + = std : : string ( " N: GPS NAV DATA " ) ;
line + = std : : string ( 25 , ' ' ) ;
}
2015-03-03 14:39:23 +00:00
2018-03-03 01:03:39 +00:00
if ( version = = 3 )
2015-03-01 20:16:29 +00:00
{
2016-10-29 15:15:04 +00:00
line + = std : : string ( " N: GNSS NAV DATA " ) ;
line + = std : : string ( 4 , ' ' ) ;
//! \todo Add here other systems...
line + = std : : string ( " G: GPS " ) ;
line + = std : : string ( 14 , ' ' ) ;
// ...
}
2015-03-03 14:39:23 +00:00
2016-10-29 09:42:17 +00:00
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GPS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line ionospheric info 1
line . clear ( ) ;
2016-10-29 15:15:04 +00:00
if ( version = = 2 )
{
line + = std : : string ( 2 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ION ALPHA " , 20 ) ;
}
if ( version = = 3 )
{
line + = std : : string ( " GPSA " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
}
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-04 07:52:56 +00:00
out < < line < < std : : endl ;
2012-01-11 07:05:09 +00:00
// -------- Line ionospheric info 2
2012-01-04 07:52:56 +00:00
line . clear ( ) ;
2012-01-10 08:43:58 +00:00
if ( version = = 2 )
{
2012-01-11 07:05:09 +00:00
line + = std : : string ( 2 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta0 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta1 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta2 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta3 , 10 , 2 ) , 12 ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ION BETA " , 20 ) ;
2012-01-10 08:43:58 +00:00
}
if ( version = = 3 )
{
line + = std : : string ( " GPSB " ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta0 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta1 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta2 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta3 , 10 , 2 ) , 12 ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
2012-01-10 08:43:58 +00:00
}
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-04 07:52:56 +00:00
out < < line < < std : : endl ;
// -------- Line 5 system time correction
line . clear ( ) ;
2012-01-10 08:43:58 +00:00
if ( version = = 2 )
{
2012-01-12 05:47:50 +00:00
line + = std : : string ( 3 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A0 , 18 , 2 ) , 19 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A1 , 18 , 2 ) , 19 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_t_OT ) , 9 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_T + 1024 ) , 9 ) ; // valid until 2019
2012-01-11 07:05:09 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " DELTA-UTC: A0,A1,T,W " , 20 ) ;
2012-01-10 08:43:58 +00:00
}
2012-01-12 05:47:50 +00:00
2012-01-10 08:43:58 +00:00
if ( version = = 3 )
{
line + = std : : string ( " GPUT " ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_t_OT ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
2012-01-10 08:43:58 +00:00
/* if ( SBAS )
2012-01-04 07:52:56 +00:00
{
line + = string ( 1 , ' ' ) ;
line + = leftJustify ( asString ( d_t_OT_SBAS ) , 5 ) ;
line + = string ( 1 , ' ' ) ;
line + = leftJustify ( asString ( d_WN_T_SBAS ) , 2 ) ;
line + = string ( 1 , ' ' ) ;
}
else
2012-01-10 08:43:58 +00:00
*/
line + = std : : string ( 10 , ' ' ) ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
2012-01-10 08:43:58 +00:00
}
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-04 07:52:56 +00:00
out < < line < < std : : endl ;
2012-01-03 05:38:45 +00:00
2012-01-04 07:52:56 +00:00
// -------- Line 6 leap seconds
2012-01-09 09:58:54 +00:00
// For leap second information, see http://www.endruntechnologies.com/leap.htm
2012-01-03 05:38:45 +00:00
line . clear ( ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LS ) , 6 ) ;
2012-01-10 08:43:58 +00:00
if ( version = = 2 )
{
2012-01-11 07:05:09 +00:00
line + = std : : string ( 54 , ' ' ) ;
2012-01-10 08:43:58 +00:00
}
if ( version = = 3 )
{
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_DN ) , 6 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 36 , ' ' ) ;
}
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-03 05:38:45 +00:00
out < < line < < std : : endl ;
// -------- End of Header
line . clear ( ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-03 05:38:45 +00:00
out < < line < < std : : endl ;
2011-10-01 18:45:20 +00:00
}
2018-01-25 18:35:28 +00:00
2018-10-24 15:28:12 +00:00
void Rinex_Printer : : rinex_nav_header ( std : : fstream & out , const Gps_Iono & gps_iono , const Gps_Utc_Model & gps_utc_model , const Galileo_Iono & galileo_iono , const Galileo_Utc_Model & galileo_utc_model )
2014-09-05 10:44:51 +00:00
{
std : : string line ;
2016-10-30 09:20:34 +00:00
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = std : : string ( " N: GNSS NAV DATA " ) ;
line + = std : : string ( 4 , ' ' ) ;
line + = std : : string ( " M: MIXED " ) ;
line + = std : : string ( 12 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GNSS NAVIGATION MESSAGE FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2016-10-30 09:20:34 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line ionospheric info 1
line . clear ( ) ;
line + = std : : string ( " GAL " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai0_5 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai1_5 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai2_5 , 10 , 2 ) , 12 ) ;
double zero = 0.0 ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( zero , 10 , 2 ) , 12 ) ;
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line ionospheric info 2
line . clear ( ) ;
line + = std : : string ( " GPSA " ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line + = std : : string ( 7 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction
line . clear ( ) ;
line + = std : : string ( " GAUT " ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A0_6 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A1_6 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . t0t_6 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . WNot_6 ) , 5 ) ;
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 2
line . clear ( ) ;
line + = std : : string ( " GPGA " ) ;
2018-10-24 15:28:12 +00:00
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A_0G_10 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A_1G_10 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . t_0G_10 ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . WN_0G_10 ) , 5 ) ;
2016-10-30 09:20:34 +00:00
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line system time correction 3
line . clear ( ) ;
line + = std : : string ( " GPUT " ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_t_OT ) , 7 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
line + = std : : string ( 10 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 6 leap seconds
// For leap second information, see http://www.endruntechnologies.com/leap.htm
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LS ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_LSF ) , 6 ) ;
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_DN ) , 6 ) ;
line + = std : : string ( 36 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- End of Header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2014-09-05 10:44:51 +00:00
}
2011-10-01 18:45:20 +00:00
2015-03-03 18:56:40 +00:00
2015-03-03 13:56:22 +00:00
void Rinex_Printer : : rinex_sbs_header ( std : : fstream & out )
2013-11-10 00:42:15 +00:00
{
std : : string line ;
// -------- Line 1
line . clear ( ) ;
line = std : : string ( 5 , ' ' ) ;
line + = std : : string ( " 2.10 " ) ;
line + = std : : string ( 11 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " B SBAS DATA " , 20 ) ;
2013-11-10 00:42:15 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ;
2014-09-05 10:44:51 +00:00
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2014-09-05 10:44:51 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
line + = Rinex_Printer : : leftJustify ( username , 20 ) ;
2013-11-10 00:42:15 +00:00
// Date of file creation (dd-mmm-yy hhmm)
boost : : local_time : : time_zone_ptr zone ( new boost : : local_time : : posix_time_zone ( " UTC " ) ) ;
boost : : local_time : : local_date_time pt = boost : : local_time : : local_sec_clock : : local_time ( zone ) ;
tm pt_tm = boost : : local_time : : to_tm ( pt ) ;
std : : stringstream strYear ;
2018-08-11 11:56:24 +00:00
int32_t utc_year = pt . date ( ) . year ( ) ;
2018-03-03 01:03:39 +00:00
utc_year - = 2000 ; // two digits for year
2013-11-10 00:42:15 +00:00
strYear < < utc_year ;
std : : stringstream strMonth ;
2018-08-11 11:56:24 +00:00
int32_t utc_month = pt . date ( ) . month ( ) . as_number ( ) ;
2018-03-03 01:03:39 +00:00
if ( utc_month < 10 ) strMonth < < " 0 " ; // two digits for months
2013-11-10 00:42:15 +00:00
strMonth < < utc_month ;
std : : stringstream strmDay ;
2018-08-11 11:56:24 +00:00
int32_t utc_day = pt . date ( ) . day ( ) . as_number ( ) ;
2018-03-03 01:03:39 +00:00
if ( utc_day < 10 ) strmDay < < " 0 " ; // two digits for days
2013-11-10 00:42:15 +00:00
strmDay < < utc_day ;
std : : stringstream strmHour ;
2018-08-11 11:56:24 +00:00
int32_t utc_hour = pt_tm . tm_hour ;
2018-03-03 01:03:39 +00:00
if ( utc_hour < 10 ) strmHour < < " 0 " ; // two digits for hours
2013-11-10 00:42:15 +00:00
strmHour < < utc_hour ;
std : : stringstream strmMin ;
2018-08-11 11:56:24 +00:00
int32_t utc_minute = pt_tm . tm_min ;
2018-03-03 01:03:39 +00:00
if ( utc_minute < 10 ) strmMin < < " 0 " ; // two digits for minutes
2013-11-10 00:42:15 +00:00
strmMin < < utc_minute ;
std : : string time_str ;
time_str + = strmDay . str ( ) ;
time_str + = " - " ;
time_str + = strMonth . str ( ) ;
time_str + = " - " ;
time_str + = strYear . str ( ) ;
time_str + = " " ;
time_str + = strmHour . str ( ) ;
time_str + = strmMin . str ( ) ;
line + = Rinex_Printer : : leftJustify ( time_str , 20 ) ;
line + = Rinex_Printer : : leftJustify ( " PGM / RUN BY / DATE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2016-10-29 15:15:04 +00:00
// -------- Line 3
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " REC INDEX/TYPE/VERS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT 1
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " BROADCAST DATA FILE FOR GEO SV, GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT 2
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2016-10-29 15:15:04 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- End of Header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2017-07-19 14:45:54 +00:00
void Rinex_Printer : : update_nav_header ( std : : fstream & out , const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model , const Glonass_Gnav_Almanac & glonass_gnav_almanac )
2016-10-29 15:15:04 +00:00
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_almanac . i_satellite_freq_channel )
{
} //Avoid compiler warning
2016-10-29 15:15:04 +00:00
std : : vector < std : : string > data ;
std : : string line_aux ;
2018-08-11 11:56:24 +00:00
int64_t pos = out . tellp ( ) ;
2016-10-29 15:15:04 +00:00
out . seekp ( 0 ) ;
data . clear ( ) ;
bool no_more_finds = false ;
std : : string line_str ;
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2016-10-29 15:15:04 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2016-10-29 15:15:04 +00:00
{
line_aux . clear ( ) ;
2017-07-19 14:45:54 +00:00
if ( ( line_str . find ( " GLUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
2016-10-29 15:15:04 +00:00
{
2017-07-19 14:45:54 +00:00
line_aux + = std : : string ( " GLUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_c , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
2016-10-29 15:15:04 +00:00
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
2017-07-19 14:45:54 +00:00
else if ( ( line_str . find ( " GLGP " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
2016-10-29 15:15:04 +00:00
{
2017-07-19 14:45:54 +00:00
line_aux + = std : : string ( " GLGP " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_gps , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
2016-10-29 15:15:04 +00:00
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
2017-07-19 14:45:54 +00:00
out . open ( navGlofilename , std : : ios : : out | std : : ios : : trunc ) ;
2016-10-29 15:15:04 +00:00
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2016-10-29 15:15:04 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
2017-07-19 14:45:54 +00:00
out . open ( navGlofilename , std : : ios : : out | std : : ios : : app ) ;
2016-10-29 15:15:04 +00:00
out . seekp ( pos ) ;
2017-07-19 14:45:54 +00:00
std : : cout < < " The RINEX Navigation file header has been updated with UTC info. " < < std : : endl ;
2016-10-29 15:15:04 +00:00
}
2018-01-25 18:35:28 +00:00
2018-10-24 15:28:12 +00:00
void Rinex_Printer : : update_nav_header ( std : : fstream & out , const Galileo_Iono & galileo_iono , const Galileo_Utc_Model & utc_model )
2016-10-29 15:15:04 +00:00
{
std : : vector < std : : string > data ;
std : : string line_aux ;
2018-08-11 11:56:24 +00:00
int64_t pos = out . tellp ( ) ;
2016-10-29 15:15:04 +00:00
out . seekp ( 0 ) ;
data . clear ( ) ;
bool no_more_finds = false ;
std : : string line_str ;
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2016-10-29 15:15:04 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2016-10-29 15:15:04 +00:00
{
line_aux . clear ( ) ;
2017-07-19 14:45:54 +00:00
if ( ( line_str . find ( " GAL " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " IONOSPHERIC CORR " , 59 ) ! = std : : string : : npos ) )
2016-10-29 15:15:04 +00:00
{
2017-07-19 14:45:54 +00:00
line_aux + = std : : string ( " GAL " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai0_5 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai1_5 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai2_5 , 10 , 2 ) , 12 ) ;
double zero = 0.0 ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( zero , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GAUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GAUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . A0_6 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . A1_6 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . t0t_6 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . WNot_6 ) , 5 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GPGA " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GPGA " ) ;
2018-10-24 15:28:12 +00:00
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . A_0G_10 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . A_1G_10 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . t_0G_10 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . WN_0G_10 ) , 5 ) ;
2017-07-19 14:45:54 +00:00
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " LEAP SECONDS " , 59 ) ! = std : : string : : npos )
{
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . Delta_tLS_6 ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . Delta_tLSF_6 ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . WN_LSF_6 ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . DN_6 ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( navGalfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2017-07-19 14:45:54 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
out . open ( navGalfilename , std : : ios : : out | std : : ios : : app ) ;
out . seekp ( pos ) ;
std : : cout < < " The RINEX Navigation file header has been updated with UTC and IONO info. " < < std : : endl ;
}
2018-01-25 18:35:28 +00:00
2017-07-19 14:45:54 +00:00
void Rinex_Printer : : update_nav_header ( std : : fstream & out , const Gps_Utc_Model & utc_model , const Gps_Iono & iono )
{
std : : vector < std : : string > data ;
std : : string line_aux ;
2018-08-11 11:56:24 +00:00
int64_t pos = out . tellp ( ) ;
2017-07-19 14:45:54 +00:00
out . seekp ( 0 ) ;
data . clear ( ) ;
bool no_more_finds = false ;
std : : string line_str ;
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2017-07-19 14:45:54 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2017-07-19 14:45:54 +00:00
{
line_aux . clear ( ) ;
if ( version = = 2 )
{
if ( line_str . find ( " ION ALPHA " , 59 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( 2 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " ION ALPHA " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " ION BETA " , 59 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( 2 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " ION BETA " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " DELTA-UTC " , 59 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( 3 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A0 , 18 , 2 ) , 19 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A1 , 18 , 2 ) , 19 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_t_OT ) , 9 ) ;
2018-03-03 01:03:39 +00:00
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_T + 1024 ) , 9 ) ; // valid until 2019
2017-07-19 14:45:54 +00:00
line_aux + = std : : string ( 1 , ' ' ) ;
2016-10-29 15:15:04 +00:00
line_aux + = Rinex_Printer : : leftJustify ( " DELTA-UTC: A0,A1,T,W " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " LEAP SECONDS " , 59 ) ! = std : : string : : npos )
{
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LS ) , 6 ) ;
line_aux + = std : : string ( 54 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
if ( version = = 3 )
{
if ( line_str . find ( " GPSA " , 0 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( " GPSA " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " GPSB " , 0 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( " GPSB " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " GPUT " , 0 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( " GPUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_t_OT ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " LEAP SECONDS " , 59 ) ! = std : : string : : npos )
{
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LS ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_DN ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( navfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2016-10-29 15:15:04 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
out . open ( navfilename , std : : ios : : out | std : : ios : : app ) ;
out . seekp ( pos ) ;
std : : cout < < " The RINEX Navigation file header has been updated with UTC and IONO info. " < < std : : endl ;
}
2018-03-03 01:03:39 +00:00
void Rinex_Printer : : update_nav_header ( std : : fstream & out , const Gps_CNAV_Utc_Model & utc_model , const Gps_CNAV_Iono & iono )
2016-10-29 15:15:04 +00:00
{
std : : vector < std : : string > data ;
std : : string line_aux ;
2018-08-11 11:56:24 +00:00
int64_t pos = out . tellp ( ) ;
2016-10-29 15:15:04 +00:00
out . seekp ( 0 ) ;
data . clear ( ) ;
bool no_more_finds = false ;
std : : string line_str ;
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2016-10-29 15:15:04 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2016-10-29 15:15:04 +00:00
{
line_aux . clear ( ) ;
if ( line_str . find ( " GPSA " , 0 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( " GPSA " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " GPSB " , 0 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( " GPSB " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( iono . d_beta3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " GPUT " , 0 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( " GPUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_t_OT ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " LEAP SECONDS " , 59 ) ! = std : : string : : npos )
{
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LS ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_DN ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( navfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2016-10-29 15:15:04 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
out . open ( navfilename , std : : ios : : out | std : : ios : : app ) ;
out . seekp ( pos ) ;
std : : cout < < " The RINEX Navigation file header has been updated with UTC and IONO info. " < < std : : endl ;
}
2013-11-10 00:42:15 +00:00
2018-10-24 15:28:12 +00:00
void Rinex_Printer : : update_nav_header ( std : : fstream & out , const Gps_Iono & gps_iono , const Gps_Utc_Model & gps_utc_model , const Galileo_Iono & galileo_iono , const Galileo_Utc_Model & galileo_utc_model )
2016-10-29 15:15:04 +00:00
{
std : : vector < std : : string > data ;
std : : string line_aux ;
2013-11-10 00:42:15 +00:00
2018-08-11 11:56:24 +00:00
int64_t pos = out . tellp ( ) ;
2016-10-29 15:15:04 +00:00
out . seekp ( 0 ) ;
data . clear ( ) ;
2014-09-01 18:38:31 +00:00
2016-10-29 15:15:04 +00:00
bool no_more_finds = false ;
std : : string line_str ;
2013-11-10 00:42:15 +00:00
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2016-10-29 15:15:04 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2016-10-29 15:15:04 +00:00
{
line_aux . clear ( ) ;
if ( line_str . find ( " GPSA " , 0 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( " GPSA " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GAL " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " IONOSPHERIC CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GAL " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai0_5 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai1_5 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai2_5 , 10 , 2 ) , 12 ) ;
double zero = 0.0 ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( zero , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GPSB " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " IONOSPHERIC CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GPSB " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_beta0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_beta1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_beta2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_beta3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GPUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GPUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_t_OT ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GAUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GAUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A0_6 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A1_6 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . t0t_6 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . WNot_6 ) , 5 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GPGA " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GPGA " ) ;
2018-10-24 15:28:12 +00:00
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A_0G_10 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A_1G_10 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . t_0G_10 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . WN_0G_10 ) , 5 ) ;
2016-10-29 15:15:04 +00:00
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " LEAP SECONDS " , 59 ) ! = std : : string : : npos )
{
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LS ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_DN ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( navMixfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2016-10-29 15:15:04 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
out . open ( navMixfilename , std : : ios : : out | std : : ios : : app ) ;
out . seekp ( pos ) ;
std : : cout < < " The RINEX Navigation file header has been updated with UTC and IONO info. " < < std : : endl ;
2013-11-10 00:42:15 +00:00
}
2017-07-19 14:45:54 +00:00
void Rinex_Printer : : update_nav_header ( std : : fstream & out , const Gps_Iono & gps_iono , const Gps_Utc_Model & gps_utc_model , const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model , const Glonass_Gnav_Almanac & glonass_gnav_almanac )
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_almanac . i_satellite_freq_channel )
{
} //Avoid compiler warning
2017-07-19 14:45:54 +00:00
std : : vector < std : : string > data ;
std : : string line_aux ;
2018-08-11 11:56:24 +00:00
int64_t pos = out . tellp ( ) ;
2017-07-19 14:45:54 +00:00
out . seekp ( 0 ) ;
data . clear ( ) ;
bool no_more_finds = false ;
std : : string line_str ;
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2017-07-19 14:45:54 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2017-07-19 14:45:54 +00:00
{
line_aux . clear ( ) ;
if ( line_str . find ( " GPSA " , 0 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( " GPSA " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GPUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GPUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_t_OT ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GLUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GLUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_c , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GLGP " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GLGP " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_gps , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " LEAP SECONDS " , 59 ) ! = std : : string : : npos )
{
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LS ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_DN ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( navMixfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2017-07-19 14:45:54 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
out . open ( navMixfilename , std : : ios : : out | std : : ios : : app ) ;
out . seekp ( pos ) ;
std : : cout < < " The RINEX Navigation file header has been updated with UTC and IONO info. " < < std : : endl ;
}
2017-12-28 02:10:08 +00:00
void Rinex_Printer : : update_nav_header ( std : : fstream & out , const Gps_CNAV_Iono & gps_iono , const Gps_CNAV_Utc_Model & gps_utc_model , const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model , const Glonass_Gnav_Almanac & glonass_gnav_almanac )
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_almanac . i_satellite_freq_channel )
{
} //Avoid compiler warning
2017-12-28 02:10:08 +00:00
std : : vector < std : : string > data ;
std : : string line_aux ;
2018-08-11 11:56:24 +00:00
int64_t pos = out . tellp ( ) ;
2017-12-28 02:10:08 +00:00
out . seekp ( 0 ) ;
data . clear ( ) ;
bool no_more_finds = false ;
std : : string line_str ;
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2017-12-28 02:10:08 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2017-12-28 02:10:08 +00:00
{
line_aux . clear ( ) ;
if ( line_str . find ( " GPSA " , 0 ) ! = std : : string : : npos )
{
line_aux + = std : : string ( " GPSA " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha0 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha1 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha2 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_iono . d_alpha3 , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GPUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GPUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A0 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( gps_utc_model . d_A1 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_t_OT ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_T + 1024 ) , 5 ) ; // valid until 2019
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GLUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GLUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_c , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GLGP " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GLGP " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_gps , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " LEAP SECONDS " , 59 ) ! = std : : string : : npos )
{
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LS ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . d_DeltaT_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_WN_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_utc_model . i_DN ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( navMixfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2017-12-28 02:10:08 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
out . open ( navMixfilename , std : : ios : : out | std : : ios : : app ) ;
out . seekp ( pos ) ;
std : : cout < < " The RINEX Navigation file header has been updated with UTC and IONO info. " < < std : : endl ;
}
2018-01-25 18:35:28 +00:00
2018-10-24 15:28:12 +00:00
void Rinex_Printer : : update_nav_header ( std : : fstream & out , const Galileo_Iono & galileo_iono , const Galileo_Utc_Model & galileo_utc_model , const Glonass_Gnav_Utc_Model & glonass_gnav_utc_model , const Glonass_Gnav_Almanac & glonass_gnav_almanac )
2017-07-24 05:57:54 +00:00
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_almanac . i_satellite_freq_channel )
{
} //Avoid compiler warning
2017-08-23 22:16:07 +00:00
//Avoid compiler warning, there is not time system correction between Galileo and GLONASS
2018-10-24 15:28:12 +00:00
if ( galileo_utc_model . A_0G_10 )
2018-03-03 01:03:39 +00:00
{
}
2017-07-24 05:57:54 +00:00
std : : vector < std : : string > data ;
std : : string line_aux ;
2018-08-11 11:56:24 +00:00
int64_t pos = out . tellp ( ) ;
2017-07-24 05:57:54 +00:00
out . seekp ( 0 ) ;
data . clear ( ) ;
bool no_more_finds = false ;
std : : string line_str ;
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2017-07-24 05:57:54 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2017-07-24 05:57:54 +00:00
{
line_aux . clear ( ) ;
if ( ( line_str . find ( " GAL " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " IONOSPHERIC CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GAL " ) ;
line_aux + = std : : string ( 1 , ' ' ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai0_5 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai1_5 , 10 , 2 ) , 12 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_iono . ai2_5 , 10 , 2 ) , 12 ) ;
double zero = 0.0 ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( zero , 10 , 2 ) , 12 ) ;
line_aux + = std : : string ( 7 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " IONOSPHERIC CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GAUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GAUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A0_6 , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( galileo_utc_model . A1_6 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . t0t_6 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . WNot_6 ) , 5 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( ( line_str . find ( " GLUT " , 0 ) ! = std : : string : : npos ) & & ( line_str . find ( " TIME SYSTEM CORR " , 59 ) ! = std : : string : : npos ) )
{
line_aux + = std : : string ( " GLUT " ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( glonass_gnav_utc_model . d_tau_c , 16 , 2 ) , 18 ) ;
line_aux + = Rinex_Printer : : rightJustify ( Rinex_Printer : : doub2for ( 0.0 , 15 , 2 ) , 16 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 7 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0.0 ) , 5 ) ;
line_aux + = std : : string ( 10 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " TIME SYSTEM CORR " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " LEAP SECONDS " , 59 ) ! = std : : string : : npos )
{
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . Delta_tLS_6 ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . Delta_tLSF_6 ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . WN_LSF_6 ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . DN_6 ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( navMixfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2017-07-24 05:57:54 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
out . open ( navMixfilename , std : : ios : : out | std : : ios : : app ) ;
out . seekp ( pos ) ;
std : : cout < < " The RINEX Navigation file header has been updated with UTC and IONO info. " < < std : : endl ;
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_nav ( std : : fstream & out , const std : : map < int32_t , Gps_Ephemeris > & eph_map )
2012-01-10 08:43:58 +00:00
{
std : : string line ;
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Gps_Ephemeris > : : const_iterator gps_ephemeris_iter ;
2013-03-14 12:52:32 +00:00
2018-03-03 01:03:39 +00:00
for ( gps_ephemeris_iter = eph_map . cbegin ( ) ;
gps_ephemeris_iter ! = eph_map . cend ( ) ;
gps_ephemeris_iter + + )
2018-01-25 18:35:28 +00:00
{
2012-01-12 00:21:29 +00:00
// -------- SV / EPOCH / SV CLK
2015-03-03 18:56:40 +00:00
boost : : posix_time : : ptime p_utc_time = Rinex_Printer : : compute_GPS_time ( gps_ephemeris_iter - > second , gps_ephemeris_iter - > second . d_Toc ) ;
2012-01-12 00:21:29 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_utc_time ) ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
std : : string seconds ( timestring , 13 , 2 ) ;
2012-01-12 00:21:29 +00:00
if ( version = = 2 )
{
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( gps_ephemeris_iter - > second . i_satellite_PRN ) , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 2 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( month ) < 10 )
2015-02-26 00:56:11 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( month , 1 , 1 ) ;
}
else
{
line + = month ;
}
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( day ) < 10 )
2015-02-26 00:56:11 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( day , 1 , 1 ) ;
}
else
{
line + = day ;
}
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( hour ) < 10 )
2015-02-26 00:56:11 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( hour , 1 , 1 ) ;
}
else
{
line + = hour ;
}
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( minutes ) < 10 )
2015-02-26 00:56:11 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( minutes , 1 , 1 ) ;
}
else
{
line + = minutes ;
}
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( seconds ) < 10 )
2015-02-26 00:56:11 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( seconds , 1 , 1 ) ;
}
else
{
line + = seconds ;
}
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' . ' ) ;
std : : string decimal = std : : string ( " 0 " ) ;
if ( timestring . size ( ) > 16 )
{
2018-03-03 01:03:39 +00:00
std : : string decimal ( timestring , 16 , 1 ) ;
2012-01-12 00:21:29 +00:00
}
line + = decimal ;
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_A_f0 , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_A_f1 , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_A_f2 , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
}
if ( version = = 3 )
{
line + = satelliteSystem [ " GPS " ] ;
2018-03-03 01:03:39 +00:00
if ( gps_ephemeris_iter - > second . i_satellite_PRN < 10 ) line + = std : : string ( " 0 " ) ;
2013-03-14 12:52:32 +00:00
line + = boost : : lexical_cast < std : : string > ( gps_ephemeris_iter - > second . i_satellite_PRN ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
line + = seconds ;
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_A_f0 , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_A_f1 , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_A_f2 , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2011-10-01 18:45:20 +00:00
2012-01-12 00:21:29 +00:00
// -------- BROADCAST ORBIT - 1
line . clear ( ) ;
if ( version = = 2 )
2012-01-10 08:43:58 +00:00
{
2012-01-12 00:21:29 +00:00
line + = std : : string ( 4 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 5 , ' ' ) ;
}
2013-03-14 12:52:32 +00:00
// If there is a discontinued reception the ephemeris is not validated
2015-02-18 00:06:41 +00:00
if ( gps_ephemeris_iter - > second . d_IODE_SF2 = = gps_ephemeris_iter - > second . d_IODE_SF3 )
{
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_IODE_SF2 , 18 , 2 ) ;
}
else
{
LOG ( WARNING ) < < " Discontinued reception of Frame 2 and 3 " ;
}
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Crs , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Delta_n , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_M_0 , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2011-10-01 18:45:20 +00:00
2012-01-12 00:21:29 +00:00
// -------- BROADCAST ORBIT - 2
line . clear ( ) ;
if ( version = = 2 )
{
line + = std : : string ( 4 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 5 , ' ' ) ;
}
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Cuc , 18 , 2 ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_e_eccentricity , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Cus , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_sqrt_A , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2011-10-01 18:45:20 +00:00
2012-01-12 00:21:29 +00:00
// -------- BROADCAST ORBIT - 3
line . clear ( ) ;
if ( version = = 2 )
{
line + = std : : string ( 4 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 5 , ' ' ) ;
}
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Toe , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Cic , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_OMEGA0 , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Cis , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2012-01-10 08:43:58 +00:00
2012-01-12 00:21:29 +00:00
// -------- BROADCAST ORBIT - 4
line . clear ( ) ;
if ( version = = 2 )
{
line + = std : : string ( 4 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 5 , ' ' ) ;
}
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_i_0 , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Crc , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_OMEGA , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_OMEGA_DOT , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2012-01-10 08:43:58 +00:00
2012-01-12 00:21:29 +00:00
// -------- BROADCAST ORBIT - 5
line . clear ( ) ;
if ( version = = 2 )
{
line + = std : : string ( 4 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 5 , ' ' ) ;
}
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_IDOT , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2014-09-12 16:27:19 +00:00
line + = Rinex_Printer : : doub2for ( static_cast < double > ( gps_ephemeris_iter - > second . i_code_on_L2 ) , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
double GPS_week_continuous_number = static_cast < double > ( gps_ephemeris_iter - > second . i_GPS_week + 1024 ) ; // valid until April 7, 2019 (check http://www.colorado.edu/geography/gcraft/notes/gps/gpseow.htm)
2012-01-12 00:21:29 +00:00
line + = Rinex_Printer : : doub2for ( GPS_week_continuous_number , 18 , 2 ) ;
2012-12-11 18:29:20 +00:00
line + = std : : string ( 1 , ' ' ) ;
2014-09-12 16:27:19 +00:00
line + = Rinex_Printer : : doub2for ( static_cast < double > ( gps_ephemeris_iter - > second . i_code_on_L2 ) , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2012-01-10 08:43:58 +00:00
2012-01-12 00:21:29 +00:00
// -------- BROADCAST ORBIT - 6
line . clear ( ) ;
if ( version = = 2 )
{
line + = std : : string ( 4 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 5 , ' ' ) ;
}
2014-09-12 16:27:19 +00:00
line + = Rinex_Printer : : doub2for ( static_cast < double > ( gps_ephemeris_iter - > second . i_SV_accuracy ) , 18 , 2 ) ;
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2014-09-12 16:27:19 +00:00
line + = Rinex_Printer : : doub2for ( static_cast < double > ( gps_ephemeris_iter - > second . i_SV_health ) , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_TGD , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_IODC , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2012-01-10 08:43:58 +00:00
2012-01-12 00:21:29 +00:00
// -------- BROADCAST ORBIT - 7
line . clear ( ) ;
if ( version = = 2 )
{
line + = std : : string ( 4 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 5 , ' ' ) ;
}
2013-03-14 12:52:32 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_TOW , 18 , 2 ) ;
2012-01-12 00:21:29 +00:00
line + = std : : string ( 1 , ' ' ) ;
double curve_fit_interval = 4 ;
2012-01-10 08:43:58 +00:00
2014-09-14 17:08:32 +00:00
if ( gps_ephemeris_iter - > second . satelliteBlock . at ( gps_ephemeris_iter - > second . i_satellite_PRN ) . compare ( " IIA " ) )
2012-01-12 00:21:29 +00:00
{
// Block II/IIA (Table 20-XI IS-GPS-200E )
2018-03-03 01:03:39 +00:00
if ( ( gps_ephemeris_iter - > second . d_IODC > 239 ) & & ( gps_ephemeris_iter - > second . d_IODC < 248 ) ) curve_fit_interval = 8 ;
if ( ( ( gps_ephemeris_iter - > second . d_IODC > 247 ) & & ( gps_ephemeris_iter - > second . d_IODC < 256 ) ) | | ( gps_ephemeris_iter - > second . d_IODC = = 496 ) ) curve_fit_interval = 14 ;
if ( ( gps_ephemeris_iter - > second . d_IODC > 496 ) & & ( gps_ephemeris_iter - > second . d_IODC < 504 ) ) curve_fit_interval = 26 ;
if ( ( gps_ephemeris_iter - > second . d_IODC > 503 ) & & ( gps_ephemeris_iter - > second . d_IODC < 511 ) ) curve_fit_interval = 50 ;
if ( ( ( gps_ephemeris_iter - > second . d_IODC > 751 ) & & ( gps_ephemeris_iter - > second . d_IODC < 757 ) ) | | ( gps_ephemeris_iter - > second . d_IODC = = 511 ) ) curve_fit_interval = 74 ;
if ( gps_ephemeris_iter - > second . d_IODC = = 757 ) curve_fit_interval = 98 ;
2012-01-12 00:21:29 +00:00
}
2012-01-11 07:05:09 +00:00
2014-09-14 17:08:32 +00:00
if ( ( gps_ephemeris_iter - > second . satelliteBlock . at ( gps_ephemeris_iter - > second . i_satellite_PRN ) . compare ( " IIR " ) = = 0 ) | |
2018-03-03 01:03:39 +00:00
( gps_ephemeris_iter - > second . satelliteBlock . at ( gps_ephemeris_iter - > second . i_satellite_PRN ) . compare ( " IIR-M " ) = = 0 ) | |
( gps_ephemeris_iter - > second . satelliteBlock . at ( gps_ephemeris_iter - > second . i_satellite_PRN ) . compare ( " IIF " ) = = 0 ) | |
( gps_ephemeris_iter - > second . satelliteBlock . at ( gps_ephemeris_iter - > second . i_satellite_PRN ) . compare ( " IIIA " ) = = 0 ) )
2012-01-12 00:21:29 +00:00
{
// Block IIR/IIR-M/IIF/IIIA (Table 20-XII IS-GPS-200E )
2018-03-03 01:03:39 +00:00
if ( ( gps_ephemeris_iter - > second . d_IODC > 239 ) & & ( gps_ephemeris_iter - > second . d_IODC < 248 ) ) curve_fit_interval = 8 ;
if ( ( ( gps_ephemeris_iter - > second . d_IODC > 247 ) & & ( gps_ephemeris_iter - > second . d_IODC < 256 ) ) | | ( gps_ephemeris_iter - > second . d_IODC = = 496 ) ) curve_fit_interval = 14 ;
if ( ( ( gps_ephemeris_iter - > second . d_IODC > 496 ) & & ( gps_ephemeris_iter - > second . d_IODC < 504 ) ) | | ( ( gps_ephemeris_iter - > second . d_IODC > 1020 ) & & ( gps_ephemeris_iter - > second . d_IODC < 1024 ) ) ) curve_fit_interval = 26 ;
2012-01-12 00:21:29 +00:00
}
line + = Rinex_Printer : : doub2for ( curve_fit_interval , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 18 , ' ' ) ; // spare
2012-01-10 08:43:58 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 18 , ' ' ) ; // spare
2012-01-12 00:21:29 +00:00
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
line . clear ( ) ;
2012-01-10 08:43:58 +00:00
}
2011-10-01 18:45:20 +00:00
}
2016-10-29 10:41:51 +00:00
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_nav ( std : : fstream & out , const std : : map < int32_t , Gps_CNAV_Ephemeris > & eph_map )
2016-10-29 09:42:17 +00:00
{
std : : string line ;
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Gps_CNAV_Ephemeris > : : const_iterator gps_ephemeris_iter ;
2016-10-29 09:42:17 +00:00
2018-03-03 01:03:39 +00:00
for ( gps_ephemeris_iter = eph_map . cbegin ( ) ;
gps_ephemeris_iter ! = eph_map . cend ( ) ;
gps_ephemeris_iter + + )
2016-10-29 10:41:51 +00:00
{
2016-10-29 09:42:17 +00:00
// -------- SV / EPOCH / SV CLK
boost : : posix_time : : ptime p_utc_time = Rinex_Printer : : compute_GPS_time ( gps_ephemeris_iter - > second , gps_ephemeris_iter - > second . d_Toc ) ;
std : : string timestring = boost : : posix_time : : to_iso_string ( p_utc_time ) ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
std : : string seconds ( timestring , 13 , 2 ) ;
2016-10-29 10:41:51 +00:00
line + = satelliteSystem [ " GPS " ] ;
2018-03-03 01:03:39 +00:00
if ( gps_ephemeris_iter - > second . i_satellite_PRN < 10 ) line + = std : : string ( " 0 " ) ;
2016-10-29 10:41:51 +00:00
line + = boost : : lexical_cast < std : : string > ( gps_ephemeris_iter - > second . i_satellite_PRN ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2016-10-29 10:41:51 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
line + = seconds ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_A_f0 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_A_f1 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_A_f2 , 18 , 2 ) ;
2016-10-29 09:42:17 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 1
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
2017-04-01 08:47:36 +00:00
// If there is no IODE in CNAV, so we check if Toe in message Type 10, Toe in Message type 11 and Toc in message types 30-37.
// Whenever these three terms do not match, a data set cutover has occurred and new data must be collected.
// See IS-GPS-200H, p. 155
2018-03-03 01:03:39 +00:00
if ( ! ( ( gps_ephemeris_iter - > second . d_Toe1 = = gps_ephemeris_iter - > second . d_Toe2 ) & & ( gps_ephemeris_iter - > second . d_Toe1 = = gps_ephemeris_iter - > second . d_Toc ) ) ) // Toe1: Toe in message type 10, Toe2: Toe in message type 11
2017-04-01 08:47:36 +00:00
{
// Toe1: Toe in message type 10, Toe2: Toe in message type 11,
fake_cnav_iode = fake_cnav_iode + 1 ;
2018-03-03 01:03:39 +00:00
if ( fake_cnav_iode = = 240 ) fake_cnav_iode = 1 ;
2017-04-01 08:47:36 +00:00
}
line + = Rinex_Printer : : doub2for ( fake_cnav_iode , 18 , 2 ) ;
2016-10-29 09:42:17 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Crs , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Delta_n , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_M_0 , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 2
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Cuc , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_e_eccentricity , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Cus , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
const double A_REF = 26559710.0 ; // See IS-GPS-200H, pp. 163
2016-10-29 09:42:17 +00:00
double sqrt_A = sqrt ( A_REF + gps_ephemeris_iter - > second . d_DELTA_A ) ;
line + = Rinex_Printer : : doub2for ( sqrt_A , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 3
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
2016-10-29 10:41:51 +00:00
line + = Rinex_Printer : : doub2for ( std : : max ( gps_ephemeris_iter - > second . d_Toe1 , gps_ephemeris_iter - > second . d_Toe2 ) , 18 , 2 ) ;
2016-10-29 09:42:17 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Cic , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_OMEGA0 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Cis , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 4
line . clear ( ) ;
2016-10-29 10:41:51 +00:00
line + = std : : string ( 5 , ' ' ) ;
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_i_0 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_Crc , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_OMEGA , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
const double OMEGA_DOT_REF = - 2.6e-9 ; // semicircles / s, see IS-GPS-200H pp. 164
2016-10-29 09:42:17 +00:00
double OMEGA_DOT = OMEGA_DOT_REF + gps_ephemeris_iter - > second . d_DELTA_OMEGA_DOT ;
line + = Rinex_Printer : : doub2for ( OMEGA_DOT , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 5
line . clear ( ) ;
2016-10-29 10:41:51 +00:00
line + = std : : string ( 5 , ' ' ) ;
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_IDOT , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2016-10-29 10:41:51 +00:00
// No data flag for L2 P code
2017-04-01 08:47:36 +00:00
double my_zero = 0.0 ;
2016-10-29 10:41:51 +00:00
line + = Rinex_Printer : : doub2for ( my_zero , 18 , 2 ) ;
2016-10-29 09:42:17 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
double GPS_week_continuous_number = static_cast < double > ( gps_ephemeris_iter - > second . i_GPS_week + 1024 ) ; // valid until April 7, 2019 (check http://www.colorado.edu/geography/gcraft/notes/gps/gpseow.htm)
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : doub2for ( GPS_week_continuous_number , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2016-10-29 10:41:51 +00:00
line + = Rinex_Printer : : doub2for ( my_zero , 18 , 2 ) ;
2016-10-29 09:42:17 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 6
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
2016-10-29 10:41:51 +00:00
line + = Rinex_Printer : : doub2for ( static_cast < double > ( gps_ephemeris_iter - > second . i_URA ) , 18 , 2 ) ;
2016-10-29 09:42:17 +00:00
line + = std : : string ( 1 , ' ' ) ;
2016-10-29 10:41:51 +00:00
line + = Rinex_Printer : : doub2for ( static_cast < double > ( gps_ephemeris_iter - > second . i_signal_health ) , 18 , 2 ) ;
2016-10-29 09:42:17 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_TGD , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2017-04-01 08:47:36 +00:00
// no IODC in CNAV, so we fake it (see above)
line + = Rinex_Printer : : doub2for ( fake_cnav_iode , 18 , 2 ) ;
2016-10-29 09:42:17 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 7
line . clear ( ) ;
2016-10-29 10:41:51 +00:00
line + = std : : string ( 5 , ' ' ) ;
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : doub2for ( gps_ephemeris_iter - > second . d_TOW , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
double curve_fit_interval = 3 ; /// ?? Not defined in CNAV
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : doub2for ( curve_fit_interval , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 18 , ' ' ) ; // spare
2016-10-29 09:42:17 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 18 , ' ' ) ; // spare
2016-10-29 09:42:17 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
line . clear ( ) ;
}
2016-10-29 10:41:51 +00:00
}
2016-10-29 09:42:17 +00:00
2012-01-11 07:05:09 +00:00
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_nav ( std : : fstream & out , const std : : map < int32_t , Galileo_Ephemeris > & eph_map )
2014-08-31 13:58:09 +00:00
{
std : : string line ;
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Galileo_Ephemeris > : : const_iterator galileo_ephemeris_iter ;
2014-08-31 13:58:09 +00:00
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
for ( galileo_ephemeris_iter = eph_map . cbegin ( ) ;
galileo_ephemeris_iter ! = eph_map . cend ( ) ;
galileo_ephemeris_iter + + )
2014-08-31 13:58:09 +00:00
{
// -------- SV / EPOCH / SV CLK
2015-03-03 18:56:40 +00:00
boost : : posix_time : : ptime p_utc_time = Rinex_Printer : : compute_Galileo_time ( galileo_ephemeris_iter - > second , galileo_ephemeris_iter - > second . t0e_1 ) ;
2014-08-31 13:58:09 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_utc_time ) ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
std : : string seconds ( timestring , 13 , 2 ) ;
2014-08-31 13:58:09 +00:00
line + = satelliteSystem [ " Galileo " ] ;
2018-03-03 01:03:39 +00:00
if ( galileo_ephemeris_iter - > second . i_satellite_PRN < 10 ) line + = std : : string ( " 0 " ) ;
2014-08-31 13:58:09 +00:00
line + = boost : : lexical_cast < std : : string > ( galileo_ephemeris_iter - > second . i_satellite_PRN ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2014-08-31 13:58:09 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
line + = seconds ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . af0_4 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . af1_4 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . af2_4 , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 1
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
2014-09-02 00:04:13 +00:00
line + = Rinex_Printer : : doub2for ( static_cast < double > ( galileo_ephemeris_iter - > second . IOD_ephemeris ) , 18 , 2 ) ;
2014-08-31 13:58:09 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . C_rs_3 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . delta_n_3 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . M0_1 , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 2
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . C_uc_3 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . e_1 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . C_us_3 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . A_1 , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 3
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . t0e_1 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . C_ic_4 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . OMEGA_0_2 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . C_is_4 , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 4
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . i_0_2 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . C_rc_3 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . omega_2 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . OMEGA_dot_3 , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 5
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . iDot_2 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2014-09-03 16:57:37 +00:00
//double one = 1.0; // INAV E1-B
std : : string iNAVE1B ( " 1000000001 " ) ;
2018-08-11 11:56:24 +00:00
int32_t data_source_INAV = Rinex_Printer : : toInt ( iNAVE1B , 10 ) ;
2014-09-03 16:57:37 +00:00
line + = Rinex_Printer : : doub2for ( static_cast < double > ( data_source_INAV ) , 18 , 2 ) ;
2014-08-31 13:58:09 +00:00
line + = std : : string ( 1 , ' ' ) ;
2014-09-12 16:27:19 +00:00
double GST_week = static_cast < double > ( galileo_ephemeris_iter - > second . WN_5 ) ;
2018-03-03 01:03:39 +00:00
double num_GST_rollovers = floor ( ( GST_week + 1024.0 ) / 4096.0 ) ;
2014-09-03 16:57:37 +00:00
double Galileo_week_continuous_number = GST_week + 1024.0 + num_GST_rollovers * 4096.0 ;
2014-08-31 13:58:09 +00:00
line + = Rinex_Printer : : doub2for ( Galileo_week_continuous_number , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2014-09-03 16:57:37 +00:00
double zero = 0.0 ;
2014-08-31 13:58:09 +00:00
line + = Rinex_Printer : : doub2for ( zero , 18 , 2 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 6
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
2014-09-03 23:40:46 +00:00
//line += Rinex_Printer::doub2for(galileo_ephemeris_iter->second.SISA_3, 18, 2);
line + = Rinex_Printer : : doub2for ( zero , 18 , 2 ) ; // *************** CHANGE THIS WHEN GALILEO SIGNAL IS VALID
2014-09-03 16:57:37 +00:00
line + = std : : string ( 1 , ' ' ) ;
2014-09-03 19:55:09 +00:00
std : : string E1B_HS ;
std : : string E5B_HS ;
2018-03-03 01:03:39 +00:00
if ( galileo_ephemeris_iter - > second . E1B_HS_5 = = 0 ) E1B_HS = " 00 " ;
if ( galileo_ephemeris_iter - > second . E1B_HS_5 = = 1 ) E1B_HS = " 01 " ;
if ( galileo_ephemeris_iter - > second . E1B_HS_5 = = 2 ) E1B_HS = " 10 " ;
if ( galileo_ephemeris_iter - > second . E1B_HS_5 = = 3 ) E1B_HS = " 11 " ;
if ( galileo_ephemeris_iter - > second . E5b_HS_5 = = 0 ) E5B_HS = " 00 " ;
if ( galileo_ephemeris_iter - > second . E5b_HS_5 = = 1 ) E5B_HS = " 01 " ;
if ( galileo_ephemeris_iter - > second . E5b_HS_5 = = 2 ) E5B_HS = " 10 " ;
if ( galileo_ephemeris_iter - > second . E5b_HS_5 = = 3 ) E5B_HS = " 11 " ;
if ( E1B_HS = = " 11 " ) LOG ( WARNING ) < < " Signal Component currently in Test " ;
if ( E1B_HS = = " 10 " ) LOG ( WARNING ) < < " Signal will be out of service " ;
if ( E1B_HS = = " 01 " ) LOG ( WARNING ) < < " Signal out of service " ;
2014-09-03 23:40:46 +00:00
E1B_HS = " 00 " ; // *************** CHANGE THIS WHEN GALILEO SIGNAL IS VALID
std : : string E1B_DVS = boost : : lexical_cast < std : : string > ( galileo_ephemeris_iter - > second . E1B_DVS_5 ) ;
2018-03-03 01:03:39 +00:00
if ( E1B_DVS = = " 1 " ) LOG ( WARNING ) < < " Navigation data without guarantee " ;
E1B_DVS = " 0 " ; // *************** CHANGE THIS WHEN GALILEO SIGNAL IS VALID
2014-09-03 23:40:46 +00:00
2018-03-03 01:03:39 +00:00
std : : string SVhealth_str = E5B_HS + boost : : lexical_cast < std : : string > ( galileo_ephemeris_iter - > second . E5b_DVS_5 ) + " 11 " + " 1 " + E1B_DVS + E1B_HS + boost : : lexical_cast < std : : string > ( galileo_ephemeris_iter - > second . E1B_DVS_5 ) ;
SVhealth_str = " 000000000 " ; // *************** CHANGE THIS WHEN GALILEO SIGNAL IS VALID
2018-08-11 11:56:24 +00:00
int32_t SVhealth = Rinex_Printer : : toInt ( SVhealth_str , 9 ) ;
2014-09-03 23:40:46 +00:00
line + = Rinex_Printer : : doub2for ( static_cast < double > ( SVhealth ) , 18 , 2 ) ;
2014-09-03 16:57:37 +00:00
line + = std : : string ( 1 , ' ' ) ;
2014-09-03 23:40:46 +00:00
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . BGD_E1E5a_5 , 18 , 2 ) ;
2014-09-03 16:57:37 +00:00
line + = std : : string ( 1 , ' ' ) ;
2014-09-03 23:40:46 +00:00
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . BGD_E1E5b_5 , 18 , 2 ) ;
2014-08-31 13:58:09 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 7
line . clear ( ) ;
line + = std : : string ( 5 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( galileo_ephemeris_iter - > second . TOW_5 , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( zero , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 18 , ' ' ) ; // spare
2014-08-31 13:58:09 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 18 , ' ' ) ; // spare
2014-08-31 13:58:09 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
line . clear ( ) ;
}
2016-10-29 15:15:04 +00:00
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_nav ( std : : fstream & out , const std : : map < int32_t , Glonass_Gnav_Ephemeris > & eph_map )
2017-07-19 14:45:54 +00:00
{
std : : string line ;
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Glonass_Gnav_Ephemeris > : : const_iterator glonass_gnav_ephemeris_iter ;
2017-07-19 14:45:54 +00:00
2018-03-03 01:03:39 +00:00
for ( glonass_gnav_ephemeris_iter = eph_map . begin ( ) ;
glonass_gnav_ephemeris_iter ! = eph_map . end ( ) ;
glonass_gnav_ephemeris_iter + + )
2018-01-25 18:35:28 +00:00
{
2017-07-19 14:45:54 +00:00
// -------- SV / EPOCH / SV CLK
2017-12-26 00:05:35 +00:00
boost : : posix_time : : ptime p_utc_time = glonass_gnav_ephemeris_iter - > second . glot_to_utc ( glonass_gnav_ephemeris_iter - > second . d_t_b , 0.0 ) ;
2017-07-19 14:45:54 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_utc_time ) ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
std : : string seconds ( timestring , 13 , 2 ) ;
2017-07-19 14:45:54 +00:00
if ( version = = 2 )
{
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( glonass_gnav_ephemeris_iter - > second . i_satellite_PRN ) , 2 ) ;
2017-07-19 14:45:54 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 2 , 2 ) ;
2017-07-19 14:45:54 +00:00
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( month ) < 10 )
2017-07-19 14:45:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( month , 1 , 1 ) ;
}
else
{
line + = month ;
}
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( day ) < 10 )
2017-07-19 14:45:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( day , 1 , 1 ) ;
}
else
{
line + = day ;
}
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( hour ) < 10 )
2017-07-19 14:45:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( hour , 1 , 1 ) ;
}
else
{
line + = hour ;
}
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( minutes ) < 10 )
2017-07-19 14:45:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( minutes , 1 , 1 ) ;
}
else
{
line + = minutes ;
}
line + = std : : string ( 1 , ' ' ) ;
2018-08-11 11:56:24 +00:00
if ( boost : : lexical_cast < int32_t > ( seconds ) < 10 )
2018-01-28 10:46:35 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = std : : string ( seconds , 1 , 1 ) ;
}
else
{
line + = seconds ;
}
line + = std : : string ( 1 , ' . ' ) ;
std : : string decimal = std : : string ( " 0 " ) ;
if ( timestring . size ( ) > 16 )
{
2018-03-03 01:03:39 +00:00
std : : string decimal ( timestring , 16 , 1 ) ;
2018-01-28 10:46:35 +00:00
}
line + = decimal ;
line + = std : : string ( 1 , ' ' ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : doub2for ( - glonass_gnav_ephemeris_iter - > second . d_tau_c , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_gamma_n , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_t_k , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
}
if ( version = = 3 )
{
line + = satelliteSystem [ " GLONASS " ] ;
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_ephemeris_iter - > second . i_satellite_PRN < 10 ) line + = std : : string ( " 0 " ) ;
2017-07-19 14:45:54 +00:00
line + = boost : : lexical_cast < std : : string > ( glonass_gnav_ephemeris_iter - > second . i_satellite_PRN ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2017-07-19 14:45:54 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
line + = seconds ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( - glonass_gnav_ephemeris_iter - > second . d_tau_n , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( + glonass_gnav_ephemeris_iter - > second . d_gamma_n , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
//TODO need to define this here. what is nd
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_t_k + p_utc_time . date ( ) . day_of_week ( ) * 86400 , 18 , 2 ) ;
2017-07-19 14:45:54 +00:00
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 1
line . clear ( ) ;
// TODO Why is this happening here?. The extra space maybe is intended to help with readability
if ( version = = 2 )
{
line + = std : : string ( 3 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 4 , ' ' ) ;
}
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_Xn , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_VXn , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_AXn , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_B_n , 18 , 2 ) ;
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 2
line . clear ( ) ;
if ( version = = 2 )
{
line + = std : : string ( 3 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 4 , ' ' ) ;
}
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_Yn , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_VYn , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_AYn , 18 , 2 ) ;
2017-07-19 14:45:54 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . i_satellite_freq_channel , 18 , 2 ) ;
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- BROADCAST ORBIT - 3
line . clear ( ) ;
if ( version = = 2 )
{
line + = std : : string ( 3 , ' ' ) ;
}
if ( version = = 3 )
{
line + = std : : string ( 4 , ' ' ) ;
}
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_Zn , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_VZn , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_AZn , 18 , 2 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : doub2for ( glonass_gnav_ephemeris_iter - > second . d_E_n , 18 , 2 ) ;
if ( version = = 2 )
{
line + = std : : string ( 1 , ' ' ) ;
}
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-11-03 22:26:03 +00:00
line . clear ( ) ;
2017-07-19 14:45:54 +00:00
}
}
2018-01-25 18:35:28 +00:00
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_nav ( std : : fstream & out , const std : : map < int32_t , Gps_Ephemeris > & gps_eph_map , const std : : map < int32_t , Galileo_Ephemeris > & galileo_eph_map )
2017-07-19 14:45:54 +00:00
{
version = 3 ;
stringVersion = " 3.02 " ;
Rinex_Printer : : log_rinex_nav ( out , gps_eph_map ) ;
Rinex_Printer : : log_rinex_nav ( out , galileo_eph_map ) ;
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_nav ( std : : fstream & out , const std : : map < int32_t , Gps_Ephemeris > & gps_eph_map , const std : : map < int32_t , Glonass_Gnav_Ephemeris > & glonass_gnav_eph_map )
2017-07-19 14:45:54 +00:00
{
Rinex_Printer : : log_rinex_nav ( out , gps_eph_map ) ;
Rinex_Printer : : log_rinex_nav ( out , glonass_gnav_eph_map ) ;
}
2018-01-25 18:35:28 +00:00
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_nav ( std : : fstream & out , const std : : map < int32_t , Gps_CNAV_Ephemeris > & gps_eph_map , const std : : map < int32_t , Glonass_Gnav_Ephemeris > & glonass_gnav_eph_map )
2017-12-28 02:10:08 +00:00
{
Rinex_Printer : : log_rinex_nav ( out , gps_eph_map ) ;
Rinex_Printer : : log_rinex_nav ( out , glonass_gnav_eph_map ) ;
}
2017-07-19 14:45:54 +00:00
2018-01-25 18:35:28 +00:00
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_nav ( std : : fstream & out , const std : : map < int32_t , Galileo_Ephemeris > & galileo_eph_map , const std : : map < int32_t , Glonass_Gnav_Ephemeris > & glonass_gnav_eph_map )
2017-07-24 05:57:54 +00:00
{
version = 3 ;
stringVersion = " 3.02 " ;
Rinex_Printer : : log_rinex_nav ( out , galileo_eph_map ) ;
Rinex_Printer : : log_rinex_nav ( out , glonass_gnav_eph_map ) ;
}
2017-08-23 22:16:07 +00:00
void Rinex_Printer : : rinex_obs_header ( std : : fstream & out , const Glonass_Gnav_Ephemeris & eph , const double d_TOW_first_observation , const std : : string glonass_bands )
2017-07-19 14:45:54 +00:00
{
2018-03-03 01:03:39 +00:00
if ( eph . d_m )
{
} //Avoid compiler warning
2017-07-19 14:45:54 +00:00
std : : string line ;
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Glonass_Gnav_Ephemeris > : : const_iterator glonass_gnav_ephemeris_iter ;
2017-07-19 14:45:54 +00:00
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " OBSERVATION DATA " , 20 ) ;
line + = satelliteSystem [ " GLONASS " ] ;
line + = std : : string ( 19 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
if ( version = = 2 )
{
line + = Rinex_Printer : : leftJustify ( " BLANK OR G = GPS, R = GLONASS, E = GALILEO, M = MIXED " , 60 ) ;
}
if ( version = = 3 )
{
line + = Rinex_Printer : : leftJustify ( " G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED " , 60 ) ;
}
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GLONASS OBSERVATION DATA FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER NAME
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " DEFAULT MARKER NAME " , 60 ) ; // put a flag or a property,
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " MARKER NAME " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER TYPE
2018-01-21 19:36:42 +00:00
if ( version = = 2 )
2018-01-28 10:46:35 +00:00
{
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GROUND_CRAFT " , 20 ) ; // put a flag or a property
2018-01-28 10:46:35 +00:00
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " MARKER NUMBER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
if ( version = = 3 )
{
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GROUND_CRAFT " , 20 ) ; // put a flag or a property
2018-01-28 10:46:35 +00:00
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " MARKER TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2017-07-19 14:45:54 +00:00
// -------- Line OBSERVER / AGENCY
line . clear ( ) ;
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2017-07-19 14:45:54 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
line + = leftJustify ( username , 20 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " CTTC " , 40 ) ; // add flag and property
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " OBSERVER / AGENCY " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line REC / TYPE VERS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ; // add flag and property
line + = Rinex_Printer : : leftJustify ( " Software Receiver " , 20 ) ; // add flag and property
2017-07-19 14:45:54 +00:00
//line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property
2018-03-03 01:03:39 +00:00
if ( gnss_sdr_version . length ( ) > 20 ) gnss_sdr_version . resize ( 9 , ' ' ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 20 ) ;
line + = Rinex_Printer : : leftJustify ( " REC # / TYPE / VERS " , 20 ) ;
lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA TYPE
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " Antenna number " , 20 ) ; // add flag and property
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna type " , 20 ) ; // add flag and property
2017-07-19 14:45:54 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANT # / TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- APPROX POSITION (optional for moving platforms)
// put here real data!
double antena_x = 0.0 ;
double antena_y = 0.0 ;
double antena_z = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_x , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_y , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_z , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " APPROX POSITION XYZ " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA: DELTA H/E/N
// put here real data!
double antena_h = 0.0 ;
double antena_e = 0.0 ;
double antena_n = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_h , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_e , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_n , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANTENNA: DELTA H/E/N " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-27 18:57:25 +00:00
// -------- SYS / OBS TYPES
2017-07-19 14:45:54 +00:00
if ( version = = 3 )
{
// -------- SYS / OBS TYPES
// one line per available system
line . clear ( ) ;
line + = satelliteSystem [ " GLONASS " ] ;
line + = std : : string ( 2 , ' ' ) ;
std : : stringstream strm ;
numberTypesObservations = 4 ;
strm < < numberTypesObservations ;
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 3 ) ;
2017-08-23 22:16:07 +00:00
2017-10-10 14:40:05 +00:00
std : : string signal_ = " 1G " ;
2017-12-28 02:10:08 +00:00
std : : size_t found_1G = glonass_bands . find ( signal_ ) ;
2017-10-10 14:40:05 +00:00
signal_ = " 2G " ;
2017-12-28 02:10:08 +00:00
std : : size_t found_2G = glonass_bands . find ( signal_ ) ;
2017-08-23 22:16:07 +00:00
2018-03-03 01:03:39 +00:00
if ( found_1G ! = std : : string : : npos )
2017-08-23 22:16:07 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
}
2018-03-03 01:03:39 +00:00
if ( found_2G ! = std : : string : : npos )
2017-08-23 22:16:07 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
}
2017-07-19 14:45:54 +00:00
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
if ( version = = 2 )
{
// -------- SYS / OBS TYPES
line . clear ( ) ;
std : : stringstream strm ;
strm < < numberTypesObservations ;
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 6 ) ;
// per type of observation
// GLONASS L1 C/A PSEUDORANGE
line + = Rinex_Printer : : rightJustify ( observationType [ " PSEUDORANGE_CA_v2 " ] , 5 ) ;
line + = observationCode [ " GLONASS_G1_CA_v2 " ] ;
// GLONASS L1 PHASE
line + = Rinex_Printer : : rightJustify ( observationType [ " CARRIER_PHASE_CA_v2 " ] , 5 ) ;
line + = observationCode [ " GLONASS_G1_CA_v2 " ] ;
// GLONASS DOPPLER L1
line + = Rinex_Printer : : rightJustify ( observationType [ " DOPPLER_v2 " ] , 5 ) ;
line + = observationCode [ " GLONASS_G1_CA_v2 " ] ;
// GLONASS L1 SIGNAL STRENGTH
line + = Rinex_Printer : : rightJustify ( observationType [ " SIGNAL_STRENGTH_v2 " ] , 5 ) ;
line + = observationCode [ " GLONASS_G1_CA_v2 " ] ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " # / TYPES OF OBSERV " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2017-12-27 18:57:25 +00:00
// -------- Signal Strength units (Only version 3)
2017-07-19 14:45:54 +00:00
if ( version = = 3 )
{
// -------- Signal Strength units
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " DBHZ " , 20 ) ;
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " SIGNAL STRENGTH UNIT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
// -------- TIME OF FIRST OBS
2018-03-03 01:03:39 +00:00
boost : : posix_time : : ptime p_utc_time = Rinex_Printer : : compute_UTC_time ( eph , d_TOW_first_observation ) ;
2017-12-26 00:05:35 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_utc_time ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2017-12-26 00:05:35 +00:00
double intpart = 0 ;
2018-03-03 01:03:39 +00:00
double seconds = p_utc_time . time_of_day ( ) . seconds ( ) + modf ( d_TOW_first_observation , & intpart ) ;
2017-12-26 00:05:35 +00:00
line . clear ( ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = Rinex_Printer : : rightJustify ( hour , 6 ) ;
line + = Rinex_Printer : : rightJustify ( minutes , 6 ) ;
line + = Rinex_Printer : : rightJustify ( asString ( seconds , 7 ) , 13 ) ;
line + = Rinex_Printer : : rightJustify ( std : : string ( " GLO " ) , 8 ) ;
line + = std : : string ( 9 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME OF FIRST OBS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-27 18:57:25 +00:00
// -------- GLONASS SLOT / FRQ # (On;y version 3)
if ( version = = 3 )
{
2018-01-28 10:46:35 +00:00
// -------- GLONASS SLOT / FRQ #
// TODO Need to provide system with list of all satellites and update this accordingly
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0 ) , 3 ) ; // Number of satellites in list
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = satelliteSystem [ " GLONASS " ] ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0 ) , 2 ) ; // Slot Number
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0 ) , 2 ) ; // Frequency Number
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " GLONASS SLOT / FRQ # " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-07-19 14:45:54 +00:00
2018-01-28 10:46:35 +00:00
// -------- GLONASS CODE/PHS/BIS
// No GLONASS Phase bias correction used to align code and phase observations.
line . clear ( ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G1_P " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G2_P " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " GLONASS COD/PHS/BIS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-27 18:57:25 +00:00
}
2017-07-19 14:45:54 +00:00
// -------- END OF HEADER
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
void Rinex_Printer : : rinex_obs_header ( std : : fstream & out , const Gps_Ephemeris & gps_eph , const Glonass_Gnav_Ephemeris & glonass_gnav_eph , const double d_TOW_first_observation , const std : : string glonass_bands )
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_eph . d_m )
{
} // avoid warning, not needed
2017-07-19 14:45:54 +00:00
std : : string line ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
2017-12-27 18:57:25 +00:00
line + = stringVersion ;
2017-07-19 14:45:54 +00:00
line + = std : : string ( 11 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " OBSERVATION DATA " , 20 ) ;
line + = satelliteSystem [ " Mixed " ] ;
line + = std : : string ( 19 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2017-12-27 18:57:25 +00:00
line + = Rinex_Printer : : leftJustify ( " MIXED (GPS/GLO) OBSERVATION DATA FILE GENERATED BY GNSS-SDR " , 60 ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2018-01-28 10:46:35 +00:00
// -------- Line MARKER NAME / TYPE
2018-01-21 19:36:42 +00:00
if ( version = = 2 )
2018-01-28 10:46:35 +00:00
{
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GROUND_CRAFT " , 20 ) ; // put a flag or a property
2018-01-28 10:46:35 +00:00
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " MARKER NUMBER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
if ( version = = 3 )
{
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GROUND_CRAFT " , 20 ) ; // put a flag or a property
2018-01-28 10:46:35 +00:00
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " MARKER TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
// -------- Line MARKER TYPE
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " NON_GEODETIC " , 20 ) ; // put a flag or a property
2018-01-28 10:46:35 +00:00
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " MARKER TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-07-19 14:45:54 +00:00
// -------- Line OBSERVER / AGENCY
line . clear ( ) ;
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2017-07-19 14:45:54 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
line + = leftJustify ( username , 20 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " CTTC " , 40 ) ; // add flag and property
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( " OBSERVER / AGENCY " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line REC / TYPE VERS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ; // add flag and property
line + = Rinex_Printer : : leftJustify ( " Software Receiver " , 20 ) ; // add flag and property
2017-07-19 14:45:54 +00:00
//line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property
2018-03-03 01:03:39 +00:00
if ( gnss_sdr_version . length ( ) > 20 ) gnss_sdr_version . resize ( 9 , ' ' ) ;
2017-07-19 14:45:54 +00:00
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 20 ) ;
line + = Rinex_Printer : : leftJustify ( " REC # / TYPE / VERS " , 20 ) ;
lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA TYPE
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " Antenna number " , 20 ) ; // add flag and property
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna type " , 20 ) ; // add flag and property
2017-07-19 14:45:54 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANT # / TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- APPROX POSITION (optional for moving platforms)
// put here real data!
double antena_x = 0.0 ;
double antena_y = 0.0 ;
double antena_z = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_x , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_y , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_z , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " APPROX POSITION XYZ " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA: DELTA H/E/N
// put here real data!
double antena_h = 0.0 ;
double antena_e = 0.0 ;
double antena_n = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_h , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_e , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_n , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANTENNA: DELTA H/E/N " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS / OBS TYPES
2018-03-03 01:03:39 +00:00
if ( version = = 3 )
2017-07-19 14:45:54 +00:00
{
2018-01-28 10:46:35 +00:00
// one line per available system
2017-12-27 18:57:25 +00:00
line . clear ( ) ;
2018-01-28 10:46:35 +00:00
line + = satelliteSystem [ " GPS " ] ;
line + = std : : string ( 2 , ' ' ) ;
2017-12-27 18:57:25 +00:00
std : : stringstream strm ;
2018-01-28 10:46:35 +00:00
numberTypesObservations = 4 ;
2017-12-27 18:57:25 +00:00
strm < < numberTypesObservations ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 3 ) ;
2017-12-27 18:57:25 +00:00
// per type of observation
2018-01-28 10:46:35 +00:00
// GPS L1 PSEUDORANGE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS L1 PHASE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS DOPPLER L1
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS L1 CA SIGNAL STRENGTH
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// Find GLONASS Signal in Mixed file
2018-08-11 11:56:24 +00:00
uint32_t number_of_observations_glo = 0 ;
2018-01-28 10:46:35 +00:00
std : : string signal_ ( " 1G " ) ;
std : : size_t found_1G = glonass_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_1G ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
number_of_observations_glo = number_of_observations_glo + 4 ;
}
signal_ = " 2G " ;
std : : size_t found_2G = glonass_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_2G ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
number_of_observations_glo = number_of_observations_glo + 4 ;
}
line . clear ( ) ;
line + = satelliteSystem [ " GLONASS " ] ;
line + = std : : string ( 2 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( std : : to_string ( number_of_observations_glo ) , 3 ) ;
2018-03-03 01:03:39 +00:00
if ( found_1G ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
}
2018-03-03 01:03:39 +00:00
if ( found_2G ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
}
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2018-03-03 01:03:39 +00:00
if ( version = = 2 )
2017-07-19 14:45:54 +00:00
{
2017-12-27 18:57:25 +00:00
// -------- SYS / OBS TYPES
line . clear ( ) ;
std : : stringstream strm ;
strm < < numberTypesObservations ;
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 6 ) ;
// per type of observation
// GLONASS L1 C/A PSEUDORANGE
line + = Rinex_Printer : : rightJustify ( observationType [ " PSEUDORANGE_CA_v2 " ] , 5 ) ;
line + = observationCode [ " GLONASS_G1_CA_v2 " ] ;
// GLONASS L1 PHASE
line + = Rinex_Printer : : rightJustify ( observationType [ " CARRIER_PHASE_CA_v2 " ] , 5 ) ;
line + = observationCode [ " GLONASS_G1_CA_v2 " ] ;
// GLONASS DOPPLER L1
line + = Rinex_Printer : : rightJustify ( observationType [ " DOPPLER_v2 " ] , 5 ) ;
line + = observationCode [ " GLONASS_G1_CA_v2 " ] ;
// GLONASS L1 SIGNAL STRENGTH
line + = Rinex_Printer : : rightJustify ( observationType [ " SIGNAL_STRENGTH_v2 " ] , 5 ) ;
line + = observationCode [ " GLONASS_G1_CA_v2 " ] ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2017-12-27 18:57:25 +00:00
line + = Rinex_Printer : : leftJustify ( " # / TYPES OF OBSERV " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-07-19 14:45:54 +00:00
}
2017-12-27 18:57:25 +00:00
// -------- Signal Strength units (only version 3)
2018-03-03 01:03:39 +00:00
if ( version = = 3 )
2018-01-28 10:46:35 +00:00
{
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " DBHZ " , 20 ) ;
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " SIGNAL STRENGTH UNIT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2017-07-19 14:45:54 +00:00
// -------- TIME OF FIRST OBS
line . clear ( ) ;
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( gps_eph , d_TOW_first_observation ) ;
2018-03-03 01:03:39 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2017-07-19 14:45:54 +00:00
double gps_t = d_TOW_first_observation ;
double seconds = fmod ( gps_t , 60 ) ;
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = Rinex_Printer : : rightJustify ( hour , 6 ) ;
line + = Rinex_Printer : : rightJustify ( minutes , 6 ) ;
line + = Rinex_Printer : : rightJustify ( asString ( seconds , 7 ) , 13 ) ;
line + = Rinex_Printer : : rightJustify ( std : : string ( " GPS " ) , 8 ) ;
line + = std : : string ( 9 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME OF FIRST OBS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-27 18:57:25 +00:00
// -------- GLONASS SLOT / FRQ # (On;y version 3)
if ( version = = 3 )
{
2018-01-28 10:46:35 +00:00
// -------- GLONASS SLOT / FRQ #
// TODO Need to provide system with list of all satellites and update this accordingly
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0 ) , 3 ) ; // Number of satellites in list
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = satelliteSystem [ " GLONASS " ] ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0 ) , 2 ) ; // Slot Number
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0 ) , 2 ) ; // Frequency Number
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " GLONASS SLOT / FRQ # " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-27 18:57:25 +00:00
2018-01-28 10:46:35 +00:00
// -------- GLONASS CODE/PHS/BIS
// No GLONASS Phase bias correction used to align code and phase observations.
line . clear ( ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G1_P " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G2_P " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " GLONASS COD/PHS/BIS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-27 18:57:25 +00:00
}
2017-07-19 14:45:54 +00:00
// -------- end of header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 17:01:53 +00:00
}
2012-01-12 00:21:29 +00:00
2015-03-03 19:07:35 +00:00
2017-12-28 02:10:08 +00:00
void Rinex_Printer : : rinex_obs_header ( std : : fstream & out , const Gps_CNAV_Ephemeris & gps_eph , const Glonass_Gnav_Ephemeris & glonass_gnav_eph , const double d_TOW_first_observation , const std : : string glonass_bands )
2011-10-01 18:45:20 +00:00
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_eph . d_m )
{
} // avoid warning, not needed
2012-01-03 05:38:45 +00:00
std : : string line ;
// -------- Line 1
2012-01-11 07:05:09 +00:00
line = std : : string ( 5 , ' ' ) ;
2017-12-28 02:10:08 +00:00
line + = stringVersion ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 11 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " OBSERVATION DATA " , 20 ) ;
2017-07-24 05:57:54 +00:00
line + = satelliteSystem [ " Mixed " ] ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 19 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-03 05:38:45 +00:00
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED " , 60 ) ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-03 05:38:45 +00:00
out < < line < < std : : endl ;
// -------- Line 3
line . clear ( ) ;
2012-01-10 08:43:58 +00:00
line + = Rinex_Printer : : getLocalTime ( ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-03 05:38:45 +00:00
out < < line < < std : : endl ;
2012-01-11 07:05:09 +00:00
// -------- Line COMMENT
2012-01-03 05:38:45 +00:00
line . clear ( ) ;
2017-12-28 02:10:08 +00:00
line + = Rinex_Printer : : leftJustify ( " MIXED (GPS/GLO) OBSERVATION DATA FILE GENERATED BY GNSS-SDR " , 60 ) ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-03 05:38:45 +00:00
out < < line < < std : : endl ;
2012-01-10 08:43:58 +00:00
2014-09-01 18:38:31 +00:00
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2012-01-11 07:05:09 +00:00
// -------- Line COMMENT
2012-01-10 08:43:58 +00:00
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER NAME
2018-03-10 11:56:30 +00:00
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " DEFAULT MARKER NAME " , 60 ) ; // put a flag or a property,
line + = Rinex_Printer : : leftJustify ( " MARKER NAME " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2018-01-22 00:27:19 +00:00
// -------- Line MARKER NUMBER / TYPE
2018-01-21 19:36:42 +00:00
if ( version = = 2 )
2018-03-10 11:56:30 +00:00
{
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GROUND_CRAFT " , 20 ) ; // put a flag or a property
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " MARKER NUMBER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
if ( version = = 3 )
{
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GROUND_CRAFT " , 20 ) ; // put a flag or a property
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " MARKER TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2012-01-03 05:38:45 +00:00
2012-01-07 05:21:11 +00:00
// -------- Line OBSERVER / AGENCY
2012-01-03 05:38:45 +00:00
line . clear ( ) ;
2014-09-05 10:44:51 +00:00
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2014-09-05 10:44:51 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
2012-01-11 07:05:09 +00:00
line + = leftJustify ( username , 20 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " CTTC " , 40 ) ; // add flag and property
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : leftJustify ( " OBSERVER / AGENCY " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-03 05:38:45 +00:00
out < < line < < std : : endl ;
2012-01-07 05:21:11 +00:00
// -------- Line REC / TYPE VERS
2012-01-03 05:38:45 +00:00
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ; // add flag and property
line + = Rinex_Printer : : leftJustify ( " Software Receiver " , 20 ) ; // add flag and property
2012-01-11 07:05:09 +00:00
//line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property
2018-03-03 01:03:39 +00:00
if ( gnss_sdr_version . length ( ) > 20 ) gnss_sdr_version . resize ( 9 , ' ' ) ;
2014-09-01 18:38:31 +00:00
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 20 ) ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : leftJustify ( " REC # / TYPE / VERS " , 20 ) ;
2012-01-03 05:38:45 +00:00
lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA TYPE
line . clear ( ) ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna number " , 20 ) ; // add flag and property
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna type " , 20 ) ; // add flag and property
2012-01-11 07:05:09 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANT # / TYPE " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-03 05:38:45 +00:00
out < < line < < std : : endl ;
// -------- APPROX POSITION (optional for moving platforms)
2012-12-11 18:29:20 +00:00
// put here real data!
double antena_x = 0.0 ;
double antena_y = 0.0 ;
double antena_z = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_x , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_y , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_z , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " APPROX POSITION XYZ " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2012-01-03 05:38:45 +00:00
// -------- ANTENNA: DELTA H/E/N
2012-01-04 07:52:56 +00:00
// put here real data!
2012-01-11 07:05:09 +00:00
double antena_h = 0.0 ;
double antena_e = 0.0 ;
double antena_n = 0.0 ;
2012-01-04 07:52:56 +00:00
line . clear ( ) ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_h , 4 ) , 14 ) ;
2012-01-10 08:43:58 +00:00
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_e , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_n , 4 ) , 14 ) ;
2012-01-04 07:52:56 +00:00
line + = std : : string ( 18 , ' ' ) ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : leftJustify ( " ANTENNA: DELTA H/E/N " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-04 07:52:56 +00:00
out < < line < < std : : endl ;
2012-01-03 05:38:45 +00:00
2017-07-24 05:57:54 +00:00
// -------- SYS / OBS TYPES
2017-12-28 02:10:08 +00:00
// one line per available system
line . clear ( ) ;
2018-01-28 10:46:35 +00:00
line + = satelliteSystem [ " GPS " ] ;
line + = std : : string ( 2 , ' ' ) ;
std : : stringstream strm ;
numberTypesObservations = 4 ;
strm < < numberTypesObservations ;
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 3 ) ;
// per type of observation
// GPS L1 PSEUDORANGE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
// GPS L1 PHASE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
// GPS DOPPLER L1
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
// GPS L1 CA SIGNAL STRENGTH
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
// Find GLONASS Signal in Mixed file
2018-08-11 11:56:24 +00:00
uint32_t number_of_observations_glo = 0 ;
2018-01-28 10:46:35 +00:00
std : : string signal_ ( " 1G " ) ;
std : : size_t found_1G = glonass_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_1G ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
number_of_observations_glo = number_of_observations_glo + 4 ;
}
signal_ = " 2G " ;
std : : size_t found_2G = glonass_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_2G ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
number_of_observations_glo = number_of_observations_glo + 4 ;
}
line . clear ( ) ;
line + = satelliteSystem [ " GLONASS " ] ;
line + = std : : string ( 2 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( std : : to_string ( number_of_observations_glo ) , 3 ) ;
2018-03-03 01:03:39 +00:00
if ( found_1G ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
}
2018-03-03 01:03:39 +00:00
if ( found_2G ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
}
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-28 02:10:08 +00:00
// -------- Signal Strength units (only version 3)
line . clear ( ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " DBHZ " , 20 ) ;
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " SIGNAL STRENGTH UNIT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-28 02:10:08 +00:00
// -------- TIME OF FIRST OBS
line . clear ( ) ;
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( gps_eph , d_TOW_first_observation ) ;
2018-03-03 01:03:39 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2017-12-28 02:10:08 +00:00
double gps_t = d_TOW_first_observation ;
double seconds = fmod ( gps_t , 60 ) ;
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = Rinex_Printer : : rightJustify ( hour , 6 ) ;
line + = Rinex_Printer : : rightJustify ( minutes , 6 ) ;
line + = Rinex_Printer : : rightJustify ( asString ( seconds , 7 ) , 13 ) ;
line + = Rinex_Printer : : rightJustify ( std : : string ( " GPS " ) , 8 ) ;
line + = std : : string ( 9 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME OF FIRST OBS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- GLONASS SLOT / FRQ #
2018-01-28 10:46:35 +00:00
// TODO Need to provide system with list of all satellites and update this accordingly
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0 ) , 3 ) ; // Number of satellites in list
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = satelliteSystem [ " GLONASS " ] ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0 ) , 2 ) ; // Slot Number
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( 0 ) , 2 ) ; // Frequency Number
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " GLONASS SLOT / FRQ # " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
// -------- GLONASS CODE/PHS/BIS
// No GLONASS Phase bias correction used to align code and phase observations.
line . clear ( ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G1_P " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_G2_P " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( asString ( 0.0 , 3 ) , 8 ) ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : leftJustify ( " GLONASS COD/PHS/BIS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-28 02:10:08 +00:00
// -------- end of header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2018-01-28 10:46:35 +00:00
2017-12-28 02:10:08 +00:00
void Rinex_Printer : : rinex_obs_header ( std : : fstream & out , const Galileo_Ephemeris & galileo_eph , const Glonass_Gnav_Ephemeris & glonass_gnav_eph , const double d_TOW_first_observation , const std : : string galileo_bands , const std : : string glonass_bands )
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_eph . d_m )
{
} // avoid warning, not needed
2017-12-28 02:10:08 +00:00
std : : string line ;
version = 3 ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = " 3.02 " ;
line + = std : : string ( 11 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " OBSERVATION DATA " , 20 ) ;
line + = satelliteSystem [ " Mixed " ] ;
line + = std : : string ( 19 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " MIXED (GALILEO/GLONASS) OBSERVATION DATA FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2017-12-28 02:10:08 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER NAME
line . clear ( ) ;
2018-03-10 11:56:30 +00:00
line + = Rinex_Printer : : leftJustify ( " DEFAULT MARKER NAME " , 60 ) ; // put a flag or a property,
2018-01-22 00:27:19 +00:00
line + = Rinex_Printer : : leftJustify ( " MARKER NAME " , 20 ) ;
2017-12-28 02:10:08 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER TYPE
2018-01-22 00:27:19 +00:00
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " NON_GEODETIC " , 20 ) ; // put a flag or a property
2018-01-22 00:27:19 +00:00
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " MARKER TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-12-28 02:10:08 +00:00
// -------- Line OBSERVER / AGENCY
line . clear ( ) ;
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2017-12-28 02:10:08 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
line + = leftJustify ( username , 20 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " CTTC " , 40 ) ; // add flag and property
2017-12-28 02:10:08 +00:00
line + = Rinex_Printer : : leftJustify ( " OBSERVER / AGENCY " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line REC / TYPE VERS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ; // add flag and property
line + = Rinex_Printer : : leftJustify ( " Software Receiver " , 20 ) ; // add flag and property
2017-12-28 02:10:08 +00:00
//line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property
2018-03-03 01:03:39 +00:00
if ( gnss_sdr_version . length ( ) > 20 ) gnss_sdr_version . resize ( 9 , ' ' ) ;
2017-12-28 02:10:08 +00:00
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 20 ) ;
line + = Rinex_Printer : : leftJustify ( " REC # / TYPE / VERS " , 20 ) ;
lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA TYPE
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " Antenna number " , 20 ) ; // add flag and property
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna type " , 20 ) ; // add flag and property
2017-12-28 02:10:08 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANT # / TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- APPROX POSITION (optional for moving platforms)
// put here real data!
double antena_x = 0.0 ;
double antena_y = 0.0 ;
double antena_z = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_x , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_y , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_z , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " APPROX POSITION XYZ " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA: DELTA H/E/N
// put here real data!
double antena_h = 0.0 ;
double antena_e = 0.0 ;
double antena_n = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_h , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_e , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_n , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANTENNA: DELTA H/E/N " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS / OBS TYPES
line . clear ( ) ;
2018-08-11 11:56:24 +00:00
uint32_t number_of_observations_gal = 0 ;
2017-07-24 05:57:54 +00:00
std : : string signal_ ( " 1B " ) ;
std : : size_t found_1B = galileo_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_1B ! = std : : string : : npos )
2013-07-04 13:47:40 +00:00
{
2017-07-24 05:57:54 +00:00
number_of_observations_gal = number_of_observations_gal + 4 ;
2013-07-04 13:47:40 +00:00
}
2017-07-24 05:57:54 +00:00
signal_ = " 5X " ;
std : : size_t found_5X = galileo_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_5X ! = std : : string : : npos )
2017-07-24 05:57:54 +00:00
{
number_of_observations_gal = number_of_observations_gal + 4 ;
}
line . clear ( ) ;
signal_ = " 7X " ;
std : : size_t found_7X = galileo_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_7X ! = std : : string : : npos )
2017-07-24 05:57:54 +00:00
{
number_of_observations_gal = number_of_observations_gal + 4 ;
}
line + = satelliteSystem [ " Galileo " ] ;
line + = std : : string ( 2 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( std : : to_string ( number_of_observations_gal ) , 3 ) ;
2018-03-03 01:03:39 +00:00
if ( found_1B ! = std : : string : : npos )
2013-07-04 13:47:40 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
2017-07-24 05:57:54 +00:00
line + = observationCode [ " GALILEO_E1_B " ] ;
2014-09-01 16:00:33 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
2017-07-24 05:57:54 +00:00
line + = observationCode [ " GALILEO_E1_B " ] ;
2014-09-01 16:00:33 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
2017-07-24 05:57:54 +00:00
line + = observationCode [ " GALILEO_E1_B " ] ;
2013-07-04 13:47:40 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
2017-07-24 05:57:54 +00:00
line + = observationCode [ " GALILEO_E1_B " ] ;
}
2013-07-04 13:47:40 +00:00
2018-03-03 01:03:39 +00:00
if ( found_5X ! = std : : string : : npos )
2017-07-24 05:57:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
2013-07-04 13:47:40 +00:00
}
2013-05-23 17:05:06 +00:00
2018-03-03 01:03:39 +00:00
if ( found_7X ! = std : : string : : npos )
2013-07-04 13:47:40 +00:00
{
2017-07-24 05:57:54 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
2013-07-04 13:47:40 +00:00
}
2013-05-23 17:05:06 +00:00
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
line . clear ( ) ;
2018-08-11 11:56:24 +00:00
uint32_t number_of_observations_glo = 0 ;
2017-10-10 14:40:05 +00:00
signal_ = " 1G " ;
2017-12-28 02:10:08 +00:00
std : : size_t found_1G = glonass_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_1G ! = std : : string : : npos )
2013-07-04 13:47:40 +00:00
{
2017-07-24 05:57:54 +00:00
number_of_observations_glo = number_of_observations_glo + 4 ;
}
2017-10-10 14:40:05 +00:00
signal_ = " 2G " ;
2017-12-28 02:10:08 +00:00
std : : size_t found_2G = glonass_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_2G ! = std : : string : : npos )
2017-07-24 05:57:54 +00:00
{
number_of_observations_glo = number_of_observations_glo + 4 ;
}
line + = satelliteSystem [ " GLONASS " ] ;
line + = std : : string ( 2 , ' ' ) ;
line + = Rinex_Printer : : rightJustify ( std : : to_string ( number_of_observations_glo ) , 3 ) ;
2018-03-03 01:03:39 +00:00
if ( found_1G ! = std : : string : : npos )
2017-07-24 05:57:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_L1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GLONASS_L1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GLONASS_L1_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GLONASS_L1_CA " ] ;
}
2018-03-03 01:03:39 +00:00
if ( found_2G ! = std : : string : : npos )
2017-07-24 05:57:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GLONASS_L2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GLONASS_L2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GLONASS_L2_CA " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GLONASS_L2_CA " ] ;
2013-07-04 13:47:40 +00:00
}
2012-01-03 05:38:45 +00:00
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Signal Strength units
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " DBHZ " , 20 ) ;
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " SIGNAL STRENGTH UNIT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2012-01-03 05:38:45 +00:00
// -------- TIME OF FIRST OBS
2012-01-04 07:52:56 +00:00
line . clear ( ) ;
2017-07-24 05:57:54 +00:00
boost : : posix_time : : ptime p_galileo_time = Rinex_Printer : : compute_Galileo_time ( galileo_eph , d_TOW_first_observation ) ;
2018-03-03 01:03:39 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_galileo_time ) ;
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2017-07-24 05:57:54 +00:00
double galileo_t = d_TOW_first_observation ;
double seconds = fmod ( galileo_t , 60 ) ;
2012-01-11 07:05:09 +00:00
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = Rinex_Printer : : rightJustify ( hour , 6 ) ;
line + = Rinex_Printer : : rightJustify ( minutes , 6 ) ;
2012-01-11 09:01:24 +00:00
line + = Rinex_Printer : : rightJustify ( asString ( seconds , 7 ) , 13 ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : rightJustify ( std : : string ( " Galileo " ) , 8 ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 9 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME OF FIRST OBS " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-04 07:52:56 +00:00
out < < line < < std : : endl ;
2012-01-03 05:38:45 +00:00
// -------- end of header
line . clear ( ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
2012-01-10 08:43:58 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
2012-01-03 05:38:45 +00:00
out < < line < < std : : endl ;
}
2015-03-03 19:07:35 +00:00
2017-07-24 05:57:54 +00:00
void Rinex_Printer : : rinex_obs_header ( std : : fstream & out , const Gps_Ephemeris & eph , const double d_TOW_first_observation )
2016-10-29 09:42:17 +00:00
{
std : : string line ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " OBSERVATION DATA " , 20 ) ;
line + = satelliteSystem [ " GPS " ] ;
line + = std : : string ( 19 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
2017-07-24 05:57:54 +00:00
if ( version = = 2 )
{
line + = Rinex_Printer : : leftJustify ( " BLANK OR G = GPS, R = GLONASS, E = GALILEO, M = MIXED " , 60 ) ;
}
if ( version = = 3 )
{
line + = Rinex_Printer : : leftJustify ( " G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED " , 60 ) ;
}
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GPS OBSERVATION DATA FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER NAME
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " DEFAULT MARKER NAME " , 60 ) ; // put a flag or a property,
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : leftJustify ( " MARKER NAME " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER TYPE
//line.clear();
//line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property
//line += std::string(40, ' ');
//line += Rinex_Printer::leftJustify("MARKER TYPE", 20);
//Rinex_Printer::lengthCheck(line);
//out << line << std::endl;
// -------- Line OBSERVER / AGENCY
line . clear ( ) ;
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2016-10-29 09:42:17 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
line + = leftJustify ( username , 20 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " CTTC " , 40 ) ; // add flag and property
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : leftJustify ( " OBSERVER / AGENCY " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line REC / TYPE VERS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ; // add flag and property
line + = Rinex_Printer : : leftJustify ( " Software Receiver " , 20 ) ; // add flag and property
2016-10-29 09:42:17 +00:00
//line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property
2018-03-03 01:03:39 +00:00
if ( gnss_sdr_version . length ( ) > 20 ) gnss_sdr_version . resize ( 9 , ' ' ) ;
2016-10-29 09:42:17 +00:00
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 20 ) ;
line + = Rinex_Printer : : leftJustify ( " REC # / TYPE / VERS " , 20 ) ;
lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA TYPE
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " Antenna number " , 20 ) ; // add flag and property
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna type " , 20 ) ; // add flag and property
2016-10-29 09:42:17 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANT # / TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- APPROX POSITION (optional for moving platforms)
// put here real data!
double antena_x = 0.0 ;
double antena_y = 0.0 ;
double antena_z = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_x , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_y , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_z , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " APPROX POSITION XYZ " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA: DELTA H/E/N
// put here real data!
double antena_h = 0.0 ;
double antena_e = 0.0 ;
double antena_n = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_h , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_e , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_n , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANTENNA: DELTA H/E/N " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-07-24 05:57:54 +00:00
if ( version = = 2 )
{
// --------- WAVELENGHT FACTOR
// put here real data!
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : rightJustify ( " 1 " , 6 ) ;
line + = Rinex_Printer : : rightJustify ( " 1 " , 6 ) ;
2017-07-24 05:57:54 +00:00
line + = std : : string ( 48 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " WAVELENGTH FACT L1/2 " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2016-10-29 09:42:17 +00:00
2017-07-24 05:57:54 +00:00
if ( version = = 3 )
{
// -------- SYS / OBS TYPES
// one line per available system
line . clear ( ) ;
line + = satelliteSystem [ " GPS " ] ;
line + = std : : string ( 2 , ' ' ) ;
std : : stringstream strm ;
numberTypesObservations = 4 ;
strm < < numberTypesObservations ;
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 3 ) ;
// per type of observation
// GPS L1 PSEUDORANGE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS L1 PHASE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS DOPPLER L1
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS L1 CA SIGNAL STRENGTH
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
2016-10-29 09:42:17 +00:00
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
if ( version = = 2 )
{
// -------- SYS / OBS TYPES
line . clear ( ) ;
std : : stringstream strm ;
strm < < numberTypesObservations ;
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 6 ) ;
// per type of observation
// GPS L1 PSEUDORANGE
line + = Rinex_Printer : : rightJustify ( observationType [ " PSEUDORANGE_CA_v2 " ] , 5 ) ;
line + = observationCode [ " GPS_L1_CA_v2 " ] ;
// GPS L1 PHASE
line + = Rinex_Printer : : rightJustify ( observationType [ " CARRIER_PHASE_CA_v2 " ] , 5 ) ;
line + = observationCode [ " GPS_L1_CA_v2 " ] ;
// GPS DOPPLER L1
line + = Rinex_Printer : : rightJustify ( observationType [ " DOPPLER_v2 " ] , 5 ) ;
line + = observationCode [ " GPS_L1_CA_v2 " ] ;
// GPS L1 SIGNAL STRENGTH
line + = Rinex_Printer : : rightJustify ( observationType [ " SIGNAL_STRENGTH_v2 " ] , 5 ) ;
line + = observationCode [ " GPS_L1_CA_v2 " ] ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " # / TYPES OF OBSERV " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
if ( version = = 3 )
{
// -------- Signal Strength units
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " DBHZ " , 20 ) ;
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " SIGNAL STRENGTH UNIT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
// -------- TIME OF FIRST OBS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( eph , d_TOW_first_observation ) ;
2017-07-24 05:57:54 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2017-07-24 05:57:54 +00:00
double gps_t = d_TOW_first_observation ;
double seconds = fmod ( gps_t , 60 ) ;
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = Rinex_Printer : : rightJustify ( hour , 6 ) ;
line + = Rinex_Printer : : rightJustify ( minutes , 6 ) ;
line + = Rinex_Printer : : rightJustify ( asString ( seconds , 7 ) , 13 ) ;
line + = Rinex_Printer : : rightJustify ( std : : string ( " GPS " ) , 8 ) ;
line + = std : : string ( 9 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME OF FIRST OBS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS /PHASE SHIFTS
// -------- end of header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2018-01-25 18:35:28 +00:00
2018-03-03 01:03:39 +00:00
void Rinex_Printer : : rinex_obs_header ( std : : fstream & out , const Gps_CNAV_Ephemeris & eph , const double d_TOW_first_observation )
2017-07-24 05:57:54 +00:00
{
std : : string line ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " OBSERVATION DATA " , 20 ) ;
line + = satelliteSystem [ " GPS " ] ;
line + = std : : string ( 19 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GPS OBSERVATION DATA FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER NAME
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " DEFAULT MARKER NAME " , 60 ) ; // put a flag or a property,
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " MARKER NAME " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER TYPE
//line.clear();
//line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property
//line += std::string(40, ' ');
//line += Rinex_Printer::leftJustify("MARKER TYPE", 20);
//Rinex_Printer::lengthCheck(line);
//out << line << std::endl;
// -------- Line OBSERVER / AGENCY
line . clear ( ) ;
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2017-07-24 05:57:54 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
line + = leftJustify ( username , 20 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " CTTC " , 40 ) ; // add flag and property
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " OBSERVER / AGENCY " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line REC / TYPE VERS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ; // add flag and property
line + = Rinex_Printer : : leftJustify ( " Software Receiver " , 20 ) ; // add flag and property
2017-07-24 05:57:54 +00:00
//line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property
2018-03-03 01:03:39 +00:00
if ( gnss_sdr_version . length ( ) > 20 ) gnss_sdr_version . resize ( 9 , ' ' ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 20 ) ;
line + = Rinex_Printer : : leftJustify ( " REC # / TYPE / VERS " , 20 ) ;
lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA TYPE
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " Antenna number " , 20 ) ; // add flag and property
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna type " , 20 ) ; // add flag and property
2017-07-24 05:57:54 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANT # / TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- APPROX POSITION (optional for moving platforms)
// put here real data!
double antena_x = 0.0 ;
double antena_y = 0.0 ;
double antena_z = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_x , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_y , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_z , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " APPROX POSITION XYZ " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA: DELTA H/E/N
// put here real data!
double antena_h = 0.0 ;
double antena_e = 0.0 ;
double antena_n = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_h , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_e , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_n , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANTENNA: DELTA H/E/N " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS / OBS TYPES
// one line per available system
line . clear ( ) ;
line + = satelliteSystem [ " GPS " ] ;
line + = std : : string ( 2 , ' ' ) ;
std : : stringstream strm ;
numberTypesObservations = 4 ;
strm < < numberTypesObservations ;
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 3 ) ;
// per type of observation
// GPS L2 PSEUDORANGE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
// GPS L2 PHASE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
// GPS DOPPLER L2
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
// GPS L2 SIGNAL STRENGTH
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Signal Strength units
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " DBHZ " , 20 ) ;
2016-10-29 10:41:51 +00:00
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " SIGNAL STRENGTH UNIT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2016-10-29 09:42:17 +00:00
// -------- TIME OF FIRST OBS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( eph , d_TOW_first_observation ) ;
2016-10-29 09:42:17 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2016-10-29 09:42:17 +00:00
double gps_t = d_TOW_first_observation ;
double seconds = fmod ( gps_t , 60 ) ;
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = Rinex_Printer : : rightJustify ( hour , 6 ) ;
line + = Rinex_Printer : : rightJustify ( minutes , 6 ) ;
line + = Rinex_Printer : : rightJustify ( asString ( seconds , 7 ) , 13 ) ;
line + = Rinex_Printer : : rightJustify ( std : : string ( " GPS " ) , 8 ) ;
line + = std : : string ( 9 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME OF FIRST OBS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS /PHASE SHIFTS
// -------- end of header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2018-03-03 01:03:39 +00:00
void Rinex_Printer : : rinex_obs_header ( std : : fstream & out , const Gps_Ephemeris & eph , const Gps_CNAV_Ephemeris & eph_cnav , const double d_TOW_first_observation )
2015-03-03 18:56:40 +00:00
{
2018-03-03 01:03:39 +00:00
if ( eph_cnav . d_i_0 )
{
} // avoid warning, not needed
2016-10-29 15:15:04 +00:00
std : : string line ;
2015-03-03 18:56:40 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = stringVersion ;
line + = std : : string ( 11 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " OBSERVATION DATA " , 20 ) ;
line + = satelliteSystem [ " GPS " ] ;
line + = std : : string ( 19 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 18:56:40 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 18:56:40 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 18:56:40 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GPS OBSERVATION DATA FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 18:56:40 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 18:56:40 +00:00
2016-10-29 15:15:04 +00:00
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2016-10-29 15:15:04 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER NAME
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " DEFAULT MARKER NAME " , 60 ) ; // put a flag or a property,
2016-10-29 15:15:04 +00:00
line + = Rinex_Printer : : leftJustify ( " MARKER NAME " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER TYPE
//line.clear();
//line += Rinex_Printer::leftJustify("GROUND_CRAFT", 20); // put a flag or a property
//line += std::string(40, ' ');
//line += Rinex_Printer::leftJustify("MARKER TYPE", 20);
//Rinex_Printer::lengthCheck(line);
//out << line << std::endl;
// -------- Line OBSERVER / AGENCY
line . clear ( ) ;
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2016-10-29 15:15:04 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
2015-03-03 18:56:40 +00:00
}
2016-10-29 15:15:04 +00:00
line + = leftJustify ( username , 20 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " CTTC " , 40 ) ; // add flag and property
2016-10-29 15:15:04 +00:00
line + = Rinex_Printer : : leftJustify ( " OBSERVER / AGENCY " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line REC / TYPE VERS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ; // add flag and property
line + = Rinex_Printer : : leftJustify ( " Software Receiver " , 20 ) ; // add flag and property
2016-10-29 15:15:04 +00:00
//line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property
2018-03-03 01:03:39 +00:00
if ( gnss_sdr_version . length ( ) > 20 ) gnss_sdr_version . resize ( 9 , ' ' ) ;
2016-10-29 15:15:04 +00:00
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 20 ) ;
line + = Rinex_Printer : : leftJustify ( " REC # / TYPE / VERS " , 20 ) ;
lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA TYPE
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " Antenna number " , 20 ) ; // add flag and property
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna type " , 20 ) ; // add flag and property
2016-10-29 15:15:04 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANT # / TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- APPROX POSITION (optional for moving platforms)
// put here real data!
double antena_x = 0.0 ;
double antena_y = 0.0 ;
double antena_z = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_x , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_y , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_z , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " APPROX POSITION XYZ " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA: DELTA H/E/N
// put here real data!
double antena_h = 0.0 ;
double antena_e = 0.0 ;
double antena_n = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_h , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_e , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_n , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANTENNA: DELTA H/E/N " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS / OBS TYPES
// one line per available system
line . clear ( ) ;
line + = satelliteSystem [ " GPS " ] ;
line + = std : : string ( 2 , ' ' ) ;
std : : stringstream strm ;
numberTypesObservations = 8 ;
strm < < numberTypesObservations ;
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 3 ) ;
// per type of observation
// GPS L1 PSEUDORANGE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS L1 PHASE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS DOPPLER L1
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS L1 CA SIGNAL STRENGTH
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS L2 PSEUDORANGE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
// GPS L2 PHASE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
// GPS DOPPLER L2
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
// GPS L2 SIGNAL STRENGTH
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GPS_L2_L2CM " ] ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2016-10-29 15:15:04 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Signal Strength units
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " DBHZ " , 20 ) ;
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " SIGNAL STRENGTH UNIT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- TIME OF FIRST OBS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( eph , d_TOW_first_observation ) ;
2016-10-29 15:15:04 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2016-10-29 15:15:04 +00:00
double gps_t = d_TOW_first_observation ;
double seconds = fmod ( gps_t , 60 ) ;
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = Rinex_Printer : : rightJustify ( hour , 6 ) ;
line + = Rinex_Printer : : rightJustify ( minutes , 6 ) ;
line + = Rinex_Printer : : rightJustify ( asString ( seconds , 7 ) , 13 ) ;
line + = Rinex_Printer : : rightJustify ( std : : string ( " GPS " ) , 8 ) ;
line + = std : : string ( 9 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME OF FIRST OBS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS /PHASE SHIFTS
2015-03-03 18:56:40 +00:00
2016-10-29 15:15:04 +00:00
// -------- end of header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2015-03-03 18:56:40 +00:00
}
2011-10-01 18:45:20 +00:00
2016-10-31 21:32:58 +00:00
void Rinex_Printer : : rinex_obs_header ( std : : fstream & out , const Galileo_Ephemeris & eph , const double d_TOW_first_observation , const std : : string bands )
2014-09-01 09:42:51 +00:00
{
std : : string line ;
version = 3 ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
2014-09-05 14:38:44 +00:00
line + = " 3.02 " ;
2014-09-01 09:42:51 +00:00
line + = std : : string ( 11 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " OBSERVATION DATA " , 20 ) ;
line + = satelliteSystem [ " Galileo " ] ;
line + = std : : string ( 19 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " GALILEO OBSERVATION DATA FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2014-09-01 18:38:31 +00:00
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2014-09-01 09:42:51 +00:00
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2014-09-01 09:42:51 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER NAME
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " DEFAULT MARKER NAME " , 60 ) ; // put a flag or a property,
2014-09-01 09:42:51 +00:00
line + = Rinex_Printer : : leftJustify ( " MARKER NAME " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER TYPE
//line.clear();
2014-09-05 14:38:44 +00:00
//line += Rinex_Printer::leftJustify("NON_GEODETIC", 20); // put a flag or a property
2014-09-01 09:42:51 +00:00
//line += std::string(40, ' ');
//line += Rinex_Printer::leftJustify("MARKER TYPE", 20);
//Rinex_Printer::lengthCheck(line);
//out << line << std::endl;
// -------- Line OBSERVER / AGENCY
line . clear ( ) ;
2014-09-05 10:44:51 +00:00
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2014-09-05 10:44:51 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
2014-09-01 09:42:51 +00:00
line + = leftJustify ( username , 20 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " CTTC " , 40 ) ; // add flag and property
2014-09-01 09:42:51 +00:00
line + = Rinex_Printer : : leftJustify ( " OBSERVER / AGENCY " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line REC / TYPE VERS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ; // add flag and property
line + = Rinex_Printer : : leftJustify ( " Software Receiver " , 20 ) ; // add flag and property
2014-09-01 09:42:51 +00:00
//line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property
2018-03-03 01:03:39 +00:00
if ( gnss_sdr_version . length ( ) > 20 ) gnss_sdr_version . resize ( 9 , ' ' ) ;
2014-09-01 18:38:31 +00:00
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 20 ) ;
2014-09-01 09:42:51 +00:00
line + = Rinex_Printer : : leftJustify ( " REC # / TYPE / VERS " , 20 ) ;
lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA TYPE
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " Antenna number " , 20 ) ; // add flag and property
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna type " , 20 ) ; // add flag and property
2014-09-01 09:42:51 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANT # / TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- APPROX POSITION (optional for moving platforms)
// put here real data!
double antena_x = 0.0 ;
double antena_y = 0.0 ;
double antena_z = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_x , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_y , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_z , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " APPROX POSITION XYZ " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA: DELTA H/E/N
// put here real data!
double antena_h = 0.0 ;
double antena_e = 0.0 ;
double antena_n = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_h , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_e , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_n , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANTENNA: DELTA H/E/N " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS / OBS TYPES
// one line per available system
2018-08-11 11:56:24 +00:00
uint32_t number_of_observations = 0 ;
2016-10-31 21:32:58 +00:00
std : : string signal_ ( " 1B " ) ;
std : : size_t found_1B = bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_1B ! = std : : string : : npos )
2016-10-31 21:32:58 +00:00
{
number_of_observations = number_of_observations + 4 ;
}
signal_ = " 5X " ;
std : : size_t found_5X = bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_5X ! = std : : string : : npos )
2016-10-31 21:32:58 +00:00
{
number_of_observations = number_of_observations + 4 ;
}
2014-09-01 09:42:51 +00:00
line . clear ( ) ;
2016-10-31 21:32:58 +00:00
signal_ = " 7X " ;
std : : size_t found_7X = bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_7X ! = std : : string : : npos )
2016-10-31 21:32:58 +00:00
{
number_of_observations = number_of_observations + 4 ;
}
line . clear ( ) ;
2014-09-01 09:42:51 +00:00
line + = satelliteSystem [ " Galileo " ] ;
line + = std : : string ( 2 , ' ' ) ;
2016-10-31 21:32:58 +00:00
line + = Rinex_Printer : : rightJustify ( std : : to_string ( number_of_observations ) , 3 ) ;
2018-03-03 01:03:39 +00:00
if ( found_1B ! = std : : string : : npos )
2016-10-31 21:32:58 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GALILEO_E1_B " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GALILEO_E1_B " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GALILEO_E1_B " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GALILEO_E1_B " ] ;
}
2018-03-03 01:03:39 +00:00
if ( found_5X ! = std : : string : : npos )
2016-10-31 21:32:58 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
}
2018-03-03 01:03:39 +00:00
if ( found_7X ! = std : : string : : npos )
2016-10-31 21:32:58 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
}
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2014-09-01 09:42:51 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Signal Strength units
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " DBHZ " , 20 ) ;
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " SIGNAL STRENGTH UNIT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2016-10-29 09:42:17 +00:00
2014-09-01 09:42:51 +00:00
// -------- TIME OF FIRST OBS
line . clear ( ) ;
boost : : posix_time : : ptime p_galileo_time = Rinex_Printer : : compute_Galileo_time ( eph , d_TOW_first_observation ) ;
2018-03-03 01:03:39 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_galileo_time ) ;
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2014-09-01 09:42:51 +00:00
double galileo_t = d_TOW_first_observation ;
double seconds = fmod ( galileo_t , 60 ) ;
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = Rinex_Printer : : rightJustify ( hour , 6 ) ;
line + = Rinex_Printer : : rightJustify ( minutes , 6 ) ;
line + = Rinex_Printer : : rightJustify ( asString ( seconds , 7 ) , 13 ) ;
line + = Rinex_Printer : : rightJustify ( std : : string ( " GAL " ) , 8 ) ;
line + = std : : string ( 9 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME OF FIRST OBS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS /PHASE SHIFTS
// -------- end of header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2016-11-01 10:00:44 +00:00
void Rinex_Printer : : rinex_obs_header ( std : : fstream & out , const Gps_Ephemeris & gps_eph , const Galileo_Ephemeris & galileo_eph , const double d_TOW_first_observation , const std : : string galileo_bands )
2014-09-05 14:38:44 +00:00
{
2018-03-03 01:03:39 +00:00
if ( galileo_eph . e_1 )
{
} // avoid warning, not needed
2014-09-05 14:38:44 +00:00
std : : string line ;
version = 3 ;
// -------- Line 1
line = std : : string ( 5 , ' ' ) ;
line + = " 3.02 " ;
line + = std : : string ( 11 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " OBSERVATION DATA " , 20 ) ;
line + = satelliteSystem [ " Mixed " ] ;
line + = std : : string ( 19 , ' ' ) ;
line + = std : : string ( " RINEX VERSION / TYPE " ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 2
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " G = GPS R = GLONASS E = GALILEO S = GEO M = MIXED " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line 3
line . clear ( ) ;
line + = Rinex_Printer : : getLocalTime ( ) ;
line + = std : : string ( " PGM / RUN BY / DATE " ) ;
line + = std : : string ( 1 , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " MIXED (GPS/GALILEO) OBSERVATION DATA FILE GENERATED BY GNSS-SDR " , 60 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
std : : string gnss_sdr_version ( GNSS_SDR_VERSION ) ;
line + = " GNSS-SDR VERSION " ;
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 43 ) ;
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line COMMENT
line . clear ( ) ;
2018-05-09 18:20:57 +00:00
line + = Rinex_Printer : : leftJustify ( " See https://gnss-sdr.org " , 60 ) ;
2014-09-05 14:38:44 +00:00
line + = Rinex_Printer : : leftJustify ( " COMMENT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER NAME
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " DEFAULT MARKER NAME " , 60 ) ; // put a flag or a property,
2014-09-05 14:38:44 +00:00
line + = Rinex_Printer : : leftJustify ( " MARKER NAME " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line MARKER TYPE
//line.clear();
//line += Rinex_Printer::leftJustify("NON_GEODETIC", 20); // put a flag or a property
//line += std::string(40, ' ');
//line += Rinex_Printer::leftJustify("MARKER TYPE", 20);
//Rinex_Printer::lengthCheck(line);
//out << line << std::endl;
// -------- Line OBSERVER / AGENCY
line . clear ( ) ;
std : : string username ;
char c_username [ 20 ] = { 0 } ;
2018-08-11 11:56:24 +00:00
int32_t nGet = getlogin_r ( c_username , sizeof ( c_username ) - 1 ) ;
2014-09-05 14:38:44 +00:00
if ( nGet = = 0 )
{
username = c_username ;
}
else
{
username = " UNKNOWN USER " ;
}
line + = leftJustify ( username , 20 ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " CTTC " , 40 ) ; // add flag and property
2014-09-05 14:38:44 +00:00
line + = Rinex_Printer : : leftJustify ( " OBSERVER / AGENCY " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Line REC / TYPE VERS
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " GNSS-SDR " , 20 ) ; // add flag and property
line + = Rinex_Printer : : leftJustify ( " Software Receiver " , 20 ) ; // add flag and property
2014-09-05 14:38:44 +00:00
//line += Rinex_Printer::leftJustify(google::VersionString(), 20); // add flag and property
2018-03-03 01:03:39 +00:00
if ( gnss_sdr_version . length ( ) > 20 ) gnss_sdr_version . resize ( 9 , ' ' ) ;
2014-09-05 14:38:44 +00:00
line + = Rinex_Printer : : leftJustify ( gnss_sdr_version , 20 ) ;
line + = Rinex_Printer : : leftJustify ( " REC # / TYPE / VERS " , 20 ) ;
lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- ANTENNA TYPE
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " Antenna number " , 20 ) ; // add flag and property
2018-03-03 01:03:39 +00:00
line + = Rinex_Printer : : leftJustify ( " Antenna type " , 20 ) ; // add flag and property
2014-09-05 14:38:44 +00:00
line + = std : : string ( 20 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANT # / TYPE " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- APPROX POSITION (optional for moving platforms)
// put here real data!
double antena_x = 0.0 ;
double antena_y = 0.0 ;
double antena_z = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_x , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_y , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_z , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " APPROX POSITION XYZ " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2016-10-29 15:15:04 +00:00
// -------- ANTENNA: DELTA H/E/N
// put here real data!
double antena_h = 0.0 ;
double antena_e = 0.0 ;
double antena_n = 0.0 ;
line . clear ( ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_h , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_e , 4 ) , 14 ) ;
line + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString ( antena_n , 4 ) , 14 ) ;
line + = std : : string ( 18 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " ANTENNA: DELTA H/E/N " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- SYS / OBS TYPES
// one line per available system
line . clear ( ) ;
line + = satelliteSystem [ " GPS " ] ;
line + = std : : string ( 2 , ' ' ) ;
std : : stringstream strm ;
numberTypesObservations = 4 ;
strm < < numberTypesObservations ;
line + = Rinex_Printer : : rightJustify ( strm . str ( ) , 3 ) ;
// per type of observation
// GPS L1 PSEUDORANGE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS L1 PHASE
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS DOPPLER L1
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
// GPS L1 CA SIGNAL STRENGTH
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GPS_L1_CA " ] ;
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2016-10-29 15:15:04 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
line . clear ( ) ;
2018-08-11 11:56:24 +00:00
uint32_t number_of_observations_gal = 0 ;
2016-11-01 10:00:44 +00:00
std : : string signal_ ( " 1B " ) ;
std : : size_t found_1B = galileo_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_1B ! = std : : string : : npos )
2016-11-01 10:00:44 +00:00
{
number_of_observations_gal = number_of_observations_gal + 4 ;
}
signal_ = " 5X " ;
std : : size_t found_5X = galileo_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_5X ! = std : : string : : npos )
2016-11-01 10:00:44 +00:00
{
number_of_observations_gal = number_of_observations_gal + 4 ;
}
line . clear ( ) ;
signal_ = " 7X " ;
std : : size_t found_7X = galileo_bands . find ( signal_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_7X ! = std : : string : : npos )
2016-11-01 10:00:44 +00:00
{
number_of_observations_gal = number_of_observations_gal + 4 ;
}
2016-10-29 15:15:04 +00:00
line + = satelliteSystem [ " Galileo " ] ;
line + = std : : string ( 2 , ' ' ) ;
2016-11-01 10:00:44 +00:00
line + = Rinex_Printer : : rightJustify ( std : : to_string ( number_of_observations_gal ) , 3 ) ;
2018-03-03 01:03:39 +00:00
if ( found_1B ! = std : : string : : npos )
2016-11-01 10:00:44 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GALILEO_E1_B " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GALILEO_E1_B " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GALILEO_E1_B " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GALILEO_E1_B " ] ;
}
2018-03-03 01:03:39 +00:00
if ( found_5X ! = std : : string : : npos )
2016-11-01 10:00:44 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GALILEO_E5a_IQ " ] ;
}
2018-03-03 01:03:39 +00:00
if ( found_7X ! = std : : string : : npos )
2016-11-01 10:00:44 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " PSEUDORANGE " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " CARRIER_PHASE " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " DOPPLER " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
line + = std : : string ( 1 , ' ' ) ;
line + = observationType [ " SIGNAL_STRENGTH " ] ;
line + = observationCode [ " GALILEO_E5b_IQ " ] ;
}
2018-03-03 01:03:39 +00:00
line + = std : : string ( 60 - line . size ( ) , ' ' ) ;
2016-10-29 15:15:04 +00:00
line + = Rinex_Printer : : leftJustify ( " SYS / # / OBS TYPES " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- Signal Strength units
line . clear ( ) ;
line + = Rinex_Printer : : leftJustify ( " DBHZ " , 20 ) ;
line + = std : : string ( 40 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " SIGNAL STRENGTH UNIT " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- TIME OF FIRST OBS
line . clear ( ) ;
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( gps_eph , d_TOW_first_observation ) ;
2018-03-03 01:03:39 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
std : : string year ( timestring , 0 , 4 ) ;
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2016-10-29 15:15:04 +00:00
double gps_t = d_TOW_first_observation ;
double seconds = fmod ( gps_t , 60 ) ;
line + = Rinex_Printer : : rightJustify ( year , 6 ) ;
line + = Rinex_Printer : : rightJustify ( month , 6 ) ;
line + = Rinex_Printer : : rightJustify ( day , 6 ) ;
line + = Rinex_Printer : : rightJustify ( hour , 6 ) ;
line + = Rinex_Printer : : rightJustify ( minutes , 6 ) ;
line + = Rinex_Printer : : rightJustify ( asString ( seconds , 7 ) , 13 ) ;
line + = Rinex_Printer : : rightJustify ( std : : string ( " GPS " ) , 8 ) ;
line + = std : : string ( 9 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " TIME OF FIRST OBS " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- end of header
line . clear ( ) ;
line + = std : : string ( 60 , ' ' ) ;
line + = Rinex_Printer : : leftJustify ( " END OF HEADER " , 20 ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
}
2017-11-11 10:02:21 +00:00
2018-01-28 10:46:35 +00:00
void Rinex_Printer : : update_obs_header ( std : : fstream & out __attribute__ ( ( unused ) ) , const Glonass_Gnav_Utc_Model & utc_model )
2017-07-24 05:57:54 +00:00
{
2018-03-03 01:03:39 +00:00
if ( utc_model . d_N_4 )
2017-07-24 05:57:54 +00:00
{
2018-01-28 10:46:35 +00:00
// do nothing
2017-07-24 05:57:54 +00:00
}
}
2016-10-29 15:15:04 +00:00
void Rinex_Printer : : update_obs_header ( std : : fstream & out , const Gps_Utc_Model & utc_model )
{
std : : vector < std : : string > data ;
std : : string line_aux ;
out . seekp ( 0 ) ;
data . clear ( ) ;
bool no_more_finds = false ;
std : : string line_str ;
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2016-10-29 15:15:04 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2016-10-29 15:15:04 +00:00
{
line_aux . clear ( ) ;
if ( version = = 2 )
{
2018-03-03 01:03:39 +00:00
if ( line_str . find ( " TIME OF FIRST OBS " , 59 ) ! = std : : string : : npos ) // TIME OF FIRST OBS last header annotation might change in the future
2016-10-29 15:15:04 +00:00
{
data . push_back ( line_str ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LS ) , 6 ) ;
line_aux + = std : : string ( 54 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
if ( version = = 3 )
{
if ( line_str . find ( " TIME OF FIRST OBS " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LS ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_DN ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( obsfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2016-10-29 15:15:04 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
out . open ( obsfilename , std : : ios : : out | std : : ios : : in | std : : ios : : app ) ;
out . seekp ( 0 , std : : ios_base : : end ) ;
}
void Rinex_Printer : : update_obs_header ( std : : fstream & out , const Gps_CNAV_Utc_Model & utc_model )
{
std : : vector < std : : string > data ;
std : : string line_aux ;
out . seekp ( 0 ) ;
data . clear ( ) ;
bool no_more_finds = false ;
std : : string line_str ;
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2016-10-29 15:15:04 +00:00
{
std : : getline ( out , line_str ) ;
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2016-10-29 15:15:04 +00:00
{
line_aux . clear ( ) ;
if ( line_str . find ( " TIME OF FIRST OBS " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LS ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . d_DeltaT_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_WN_LSF ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( utc_model . i_DN ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( obsfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2016-10-29 15:15:04 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
out . open ( obsfilename , std : : ios : : out | std : : ios : : in | std : : ios : : app ) ;
out . seekp ( 0 , std : : ios_base : : end ) ;
}
2014-09-05 14:38:44 +00:00
2016-10-29 15:15:04 +00:00
void Rinex_Printer : : update_obs_header ( std : : fstream & out , const Galileo_Utc_Model & galileo_utc_model )
{
std : : vector < std : : string > data ;
std : : string line_aux ;
2014-09-05 14:38:44 +00:00
2016-10-29 15:15:04 +00:00
out . seekp ( 0 ) ;
data . clear ( ) ;
2014-09-05 14:38:44 +00:00
2016-10-29 15:15:04 +00:00
bool no_more_finds = false ;
std : : string line_str ;
2014-09-05 14:38:44 +00:00
2018-03-03 01:03:39 +00:00
while ( ! out . eof ( ) )
2016-10-29 15:15:04 +00:00
{
std : : getline ( out , line_str ) ;
2014-09-05 14:38:44 +00:00
2018-03-03 01:03:39 +00:00
if ( ! no_more_finds )
2016-10-29 15:15:04 +00:00
{
line_aux . clear ( ) ;
2014-09-05 14:38:44 +00:00
2016-10-29 15:15:04 +00:00
if ( line_str . find ( " TIME OF FIRST OBS " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . Delta_tLS_6 ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . Delta_tLSF_6 ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . WN_LSF_6 ) , 6 ) ;
line_aux + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( galileo_utc_model . DN_6 ) , 6 ) ;
line_aux + = std : : string ( 36 , ' ' ) ;
line_aux + = Rinex_Printer : : leftJustify ( " LEAP SECONDS " , 20 ) ;
data . push_back ( line_aux ) ;
}
else if ( line_str . find ( " END OF HEADER " , 59 ) ! = std : : string : : npos )
{
data . push_back ( line_str ) ;
no_more_finds = true ;
}
else
{
data . push_back ( line_str ) ;
}
}
else
{
data . push_back ( line_str ) ;
}
}
out . close ( ) ;
out . open ( obsfilename , std : : ios : : out | std : : ios : : trunc ) ;
out . seekp ( 0 ) ;
2018-08-11 11:56:24 +00:00
for ( int32_t i = 0 ; i < static_cast < int32_t > ( data . size ( ) ) - 1 ; i + + )
2016-10-29 15:15:04 +00:00
{
out < < data [ i ] < < std : : endl ;
}
out . close ( ) ;
2018-03-03 01:03:39 +00:00
out . open ( obsfilename , std : : ios : : out | std : : ios : : in | std : : ios : : app ) ;
2016-10-29 15:15:04 +00:00
out . seekp ( 0 , std : : ios_base : : end ) ;
2014-09-05 14:38:44 +00:00
}
2011-10-01 18:45:20 +00:00
2015-03-03 18:56:40 +00:00
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_obs ( std : : fstream & out , const Glonass_Gnav_Ephemeris & eph , const double obs_time , const std : : map < int32_t , Gnss_Synchro > & observables , const std : : string glonass_band )
2017-07-19 14:45:54 +00:00
{
// RINEX observations timestamps are GPS timestamps.
std : : string line ;
2018-02-28 03:51:24 +00:00
double int_sec = 0 ;
2017-07-19 14:45:54 +00:00
2017-08-23 22:16:07 +00:00
// Avoid compiler warning
2018-03-03 01:03:39 +00:00
if ( glonass_band . size ( ) )
{
}
2017-08-23 22:16:07 +00:00
2017-12-26 00:05:35 +00:00
boost : : posix_time : : ptime p_glonass_time = Rinex_Printer : : compute_UTC_time ( eph , obs_time ) ;
2017-07-24 05:57:54 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_glonass_time ) ;
2017-07-19 14:45:54 +00:00
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
//double gps_t = eph.sv_clock_correction(obs_time);
2018-03-10 11:56:30 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
double utc_sec = modf ( obs_time , & int_sec ) + p_glonass_time . time_of_day ( ) . seconds ( ) ;
2017-07-19 14:45:54 +00:00
if ( version = = 2 )
{
line . clear ( ) ;
2018-03-10 11:56:30 +00:00
std : : string year ( timestring , 2 , 2 ) ;
2017-07-19 14:45:54 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
2018-03-10 11:56:30 +00:00
if ( month . compare ( 0 , 1 , " 0 " ) = = 0 )
2017-07-19 14:45:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = month . substr ( 1 , 1 ) ;
}
else
{
line + = month ;
}
line + = std : : string ( 1 , ' ' ) ;
2018-03-10 11:56:30 +00:00
if ( day . compare ( 0 , 1 , " 0 " ) = = 0 )
2017-07-19 14:45:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = day . substr ( 1 , 1 ) ;
}
else
{
line + = day ;
}
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
2018-02-28 03:51:24 +00:00
if ( utc_sec < 10 )
2017-07-19 14:45:54 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
}
2018-02-28 03:51:24 +00:00
line + = Rinex_Printer : : asString ( utc_sec , 7 ) ;
2017-07-19 14:45:54 +00:00
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
//Number of satellites observed in current epoch
2018-08-11 11:56:24 +00:00
int32_t numSatellitesObserved = 0 ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . begin ( ) ;
observables_iter ! = observables . end ( ) ;
observables_iter + + )
2017-07-19 14:45:54 +00:00
{
numSatellitesObserved + + ;
}
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . begin ( ) ;
observables_iter ! = observables . end ( ) ;
observables_iter + + )
2017-07-19 14:45:54 +00:00
{
line + = satelliteSystem [ " GLONASS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) line + = std : : string ( 1 , ' 0 ' ) ;
line + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2017-07-19 14:45:54 +00:00
}
// Receiver clock offset (optional)
//line += rightJustify(asString(clockOffset, 12), 15);
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . begin ( ) ;
observables_iter ! = observables . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
std : : string lineObs ;
lineObs . clear ( ) ;
line . clear ( ) ;
2017-12-26 00:05:35 +00:00
// GLONASS L1 PSEUDORANGE
2017-07-24 05:57:54 +00:00
line + = std : : string ( 2 , ' ' ) ;
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Pseudorange_m , 3 ) , 14 ) ;
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2017-07-24 05:57:54 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2017-07-24 05:57:54 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( observables_iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-12-26 00:05:35 +00:00
// GLONASS L1 CA PHASE
2018-03-03 01:03:39 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_phase_rads / GLONASS_TWO_PI , 3 ) , 14 ) ;
2017-07-24 05:57:54 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-12-26 00:05:35 +00:00
// GLONASS L1 CA DOPPLER
2017-07-24 05:57:54 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-12-26 00:05:35 +00:00
//GLONASS L1 SIGNAL STRENGTH
2017-07-24 05:57:54 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
}
if ( version = = 3 )
{
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2017-07-24 05:57:54 +00:00
line + = std : : string ( 1 , ' > ' ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
// Add extra 0 if seconds are < 10
2018-02-28 03:51:24 +00:00
if ( utc_sec < 10 )
2018-03-10 11:56:30 +00:00
{
line + = std : : string ( 1 , ' 0 ' ) ;
}
2018-02-28 03:51:24 +00:00
line + = Rinex_Printer : : asString ( utc_sec , 7 ) ;
2017-07-24 05:57:54 +00:00
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
//Number of satellites observed in current epoch
2018-08-11 11:56:24 +00:00
int32_t numSatellitesObserved = 0 ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . begin ( ) ;
observables_iter ! = observables . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
numSatellitesObserved + + ;
}
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
// Receiver clock offset (optional)
//line += rightJustify(asString(clockOffset, 12), 15);
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . begin ( ) ;
observables_iter ! = observables . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
std : : string lineObs ;
lineObs . clear ( ) ;
lineObs + = satelliteSystem [ " GLONASS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2017-07-24 05:57:54 +00:00
//lineObs += std::string(2, ' ');
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Pseudorange_m , 3 ) , 14 ) ;
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2017-07-24 05:57:54 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2017-07-24 05:57:54 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( observables_iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-24 05:57:54 +00:00
// GLONASS L1 CA PHASE
2018-03-03 01:03:39 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_phase_rads / GLONASS_TWO_PI , 3 ) , 14 ) ;
2017-07-24 05:57:54 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-24 05:57:54 +00:00
// GLONASS L1 CA DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2017-07-24 05:57:54 +00:00
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-24 05:57:54 +00:00
//GLONASS L1 SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
}
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_obs ( std : : fstream & out , const Gps_Ephemeris & gps_eph , const Glonass_Gnav_Ephemeris & glonass_gnav_eph , double gps_obs_time , const std : : map < int32_t , Gnss_Synchro > & observables )
2017-07-24 05:57:54 +00:00
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_eph . d_m )
{
} // avoid warning, not needed
2017-07-24 05:57:54 +00:00
std : : string line ;
2017-12-27 18:57:25 +00:00
// -------- EPOCH record
2017-07-24 05:57:54 +00:00
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( gps_eph , gps_obs_time ) ;
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
//double gps_t = eph.sv_clock_correction(obs_time);
double gps_t = gps_obs_time ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2017-07-24 05:57:54 +00:00
2017-12-27 18:57:25 +00:00
if ( version = = 2 )
2017-07-24 05:57:54 +00:00
{
2017-12-27 18:57:25 +00:00
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 2 , 2 ) ;
2017-12-27 18:57:25 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
if ( month . compare ( 0 , 1 , " 0 " ) = = 0 )
2017-07-24 05:57:54 +00:00
{
2017-12-27 18:57:25 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = month . substr ( 1 , 1 ) ;
2017-07-24 05:57:54 +00:00
}
2017-12-27 18:57:25 +00:00
else
2017-07-24 05:57:54 +00:00
{
2017-12-27 18:57:25 +00:00
line + = month ;
2017-07-24 05:57:54 +00:00
}
2017-12-27 18:57:25 +00:00
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
if ( day . compare ( 0 , 1 , " 0 " ) = = 0 )
2017-07-24 05:57:54 +00:00
{
2017-12-27 18:57:25 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = day . substr ( 1 , 1 ) ;
2017-07-24 05:57:54 +00:00
}
2017-12-27 18:57:25 +00:00
else
2017-07-24 05:57:54 +00:00
{
2017-12-27 18:57:25 +00:00
line + = day ;
2017-07-24 05:57:54 +00:00
}
2017-12-27 18:57:25 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
double second_ = fmod ( gps_t , 60 ) ;
if ( second_ < 10 )
2017-07-24 05:57:54 +00:00
{
2017-12-27 18:57:25 +00:00
line + = std : : string ( 1 , ' ' ) ;
2017-07-24 05:57:54 +00:00
}
2017-12-27 18:57:25 +00:00
line + = Rinex_Printer : : asString ( second_ , 7 ) ;
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
2017-07-24 05:57:54 +00:00
}
2017-12-27 18:57:25 +00:00
if ( version = = 3 )
2017-07-19 14:45:54 +00:00
{
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' > ' ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
2017-07-24 05:57:54 +00:00
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' ' ) ;
double seconds = fmod ( gps_t , 60 ) ;
// Add extra 0 if seconds are < 10
if ( seconds < 10 )
{
2018-03-03 01:03:39 +00:00
line + = std : : string ( 1 , ' 0 ' ) ;
2018-01-28 10:46:35 +00:00
}
line + = Rinex_Printer : : asString ( seconds , 7 ) ;
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
2017-07-24 05:57:54 +00:00
}
//Number of satellites observed in current epoch
//Get maps with observations
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Gnss_Synchro > observablesG1C ;
std : : map < int32_t , Gnss_Synchro > observablesR1C ;
std : : map < int32_t , Gnss_Synchro > observablesR2C ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2017-07-24 05:57:54 +00:00
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . begin ( ) ;
observables_iter ! = observables . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
std : : string system_ ( & observables_iter - > second . System , 1 ) ;
std : : string sig_ ( observables_iter - > second . Signal ) ;
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " R " ) = = 0 ) & & ( sig_ . compare ( " 1G " ) = = 0 ) )
2017-07-19 14:45:54 +00:00
{
2018-08-11 11:56:24 +00:00
observablesR1C . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2017-07-19 14:45:54 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " R " ) = = 0 ) & & ( sig_ . compare ( " 2G " ) = = 0 ) )
2017-07-24 05:57:54 +00:00
{
2018-08-11 11:56:24 +00:00
observablesR2C . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2017-07-24 05:57:54 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " G " ) = = 0 ) & & ( sig_ . compare ( " 1C " ) = = 0 ) )
2017-07-24 05:57:54 +00:00
{
2018-08-11 11:56:24 +00:00
observablesG1C . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2017-07-24 05:57:54 +00:00
}
}
2018-08-11 11:56:24 +00:00
std : : multimap < uint32_t , Gnss_Synchro > total_glo_map ;
std : : set < uint32_t > available_glo_prns ;
std : : set < uint32_t > : : iterator it ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesR1C . begin ( ) ;
observables_iter ! = observablesR1C . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_glo_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2017-07-24 05:57:54 +00:00
it = available_glo_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_glo_prns . end ( ) )
2017-07-24 05:57:54 +00:00
{
available_glo_prns . insert ( prn_ ) ;
}
}
2018-01-28 10:46:35 +00:00
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesR2C . begin ( ) ;
observables_iter ! = observablesR2C . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_glo_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2017-07-24 05:57:54 +00:00
it = available_glo_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_glo_prns . end ( ) )
2017-07-24 05:57:54 +00:00
{
available_glo_prns . insert ( prn_ ) ;
}
}
2017-07-19 14:45:54 +00:00
2018-08-11 11:56:24 +00:00
int32_t numGloSatellitesObserved = available_glo_prns . size ( ) ;
int32_t numGpsSatellitesObserved = observablesG1C . size ( ) ;
int32_t numSatellitesObserved = numGloSatellitesObserved + numGpsSatellitesObserved ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
2018-03-03 01:03:39 +00:00
if ( version = = 2 )
2017-07-24 05:57:54 +00:00
{
2018-01-28 10:46:35 +00:00
// Add list of GPS satellites
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesG1C . begin ( ) ;
observables_iter ! = observablesG1C . end ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
line + = satelliteSystem [ " GPS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) line + = std : : string ( 1 , ' 0 ' ) ;
line + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2018-01-28 10:46:35 +00:00
}
// Add list of GLONASS L1 satellites
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesR1C . begin ( ) ;
observables_iter ! = observablesR1C . end ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
line + = satelliteSystem [ " GLONASS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) line + = std : : string ( 1 , ' 0 ' ) ;
line + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2018-01-28 10:46:35 +00:00
}
// Add list of GLONASS L2 satellites
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesR2C . begin ( ) ;
observables_iter ! = observablesR2C . end ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
line + = satelliteSystem [ " GLONASS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) line + = std : : string ( 1 , ' 0 ' ) ;
line + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2018-01-28 10:46:35 +00:00
}
}
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- OBSERVATION record
std : : string s ;
std : : string lineObs ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesG1C . begin ( ) ;
observables_iter ! = observablesG1C . end ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
lineObs . clear ( ) ;
s . assign ( 1 , observables_iter - > second . System ) ;
2018-03-03 01:03:39 +00:00
if ( version = = 3 )
2018-01-28 10:46:35 +00:00
{
// Specify system only if in version 3
2018-03-03 01:03:39 +00:00
if ( s . compare ( " G " ) = = 0 ) lineObs + = satelliteSystem [ " GPS " ] ;
if ( s . compare ( " R " ) = = 0 ) lineObs + = satelliteSystem [ " GLONASS " ] ; // should not happen
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2018-01-28 10:46:35 +00:00
}
// Pseudorange Measurements
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Pseudorange_m , 3 ) , 14 ) ;
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2018-01-28 10:46:35 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( observables_iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2018-01-28 10:46:35 +00:00
// PHASE
2018-03-03 01:03:39 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_phase_rads / GPS_TWO_PI , 3 ) , 14 ) ;
2018-01-28 10:46:35 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2018-01-28 10:46:35 +00:00
// DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2018-01-28 10:46:35 +00:00
// SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
2018-08-11 11:56:24 +00:00
std : : pair < std : : multimap < uint32_t , Gnss_Synchro > : : iterator , std : : multimap < uint32_t , Gnss_Synchro > : : iterator > ret ;
2018-03-03 01:03:39 +00:00
for ( it = available_glo_prns . begin ( ) ;
it ! = available_glo_prns . end ( ) ;
it + + )
2018-01-28 10:46:35 +00:00
{
lineObs . clear ( ) ;
2018-03-03 01:03:39 +00:00
if ( version = = 3 )
2018-01-28 10:46:35 +00:00
{
lineObs + = satelliteSystem [ " GLONASS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( * it ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( * it ) ) ;
2018-01-28 10:46:35 +00:00
}
ret = total_glo_map . equal_range ( * it ) ;
2018-08-11 11:56:24 +00:00
for ( std : : multimap < uint32_t , Gnss_Synchro > : : iterator iter = ret . first ; iter ! = ret . second ; + + iter )
2018-01-28 10:46:35 +00:00
{
/// \todo Need to account for pseudorange correction for glonass
//double leap_seconds = Rinex_Printer::get_leap_second(glonass_gnav_eph, gps_obs_time);
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Pseudorange_m , 3 ) , 14 ) ;
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2018-01-28 10:46:35 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2018-01-28 10:46:35 +00:00
// GLONASS CARRIER PHASE
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_phase_rads / ( GLONASS_TWO_PI ) , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2018-01-28 10:46:35 +00:00
// GLONASS DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2018-01-28 10:46:35 +00:00
// GLONASS SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
}
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_obs ( std : : fstream & out , const Gps_CNAV_Ephemeris & gps_eph , const Glonass_Gnav_Ephemeris & glonass_gnav_eph , double gps_obs_time , const std : : map < int32_t , Gnss_Synchro > & observables )
2018-01-28 10:46:35 +00:00
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_eph . d_m )
{
} // avoid warning, not needed
2018-01-28 10:46:35 +00:00
std : : string line ;
// -------- EPOCH record
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( gps_eph , gps_obs_time ) ;
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
//double gps_t = eph.sv_clock_correction(obs_time);
double gps_t = gps_obs_time ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2018-01-28 10:46:35 +00:00
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2018-01-28 10:46:35 +00:00
line + = std : : string ( 1 , ' > ' ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
double seconds = fmod ( gps_t , 60 ) ;
// Add extra 0 if seconds are < 10
if ( seconds < 10 )
{
2018-03-03 01:03:39 +00:00
line + = std : : string ( 1 , ' 0 ' ) ;
2018-01-28 10:46:35 +00:00
}
line + = Rinex_Printer : : asString ( seconds , 7 ) ;
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
//Number of satellites observed in current epoch
//Get maps with observations
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Gnss_Synchro > observablesG2S ;
std : : map < int32_t , Gnss_Synchro > observablesR1C ;
std : : map < int32_t , Gnss_Synchro > observablesR2C ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2018-01-28 10:46:35 +00:00
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . begin ( ) ;
observables_iter ! = observables . end ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
std : : string system_ ( & observables_iter - > second . System , 1 ) ;
std : : string sig_ ( observables_iter - > second . Signal ) ;
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " R " ) = = 0 ) & & ( sig_ . compare ( " 1G " ) = = 0 ) )
2018-01-28 10:46:35 +00:00
{
2018-08-11 11:56:24 +00:00
observablesR1C . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2018-01-28 10:46:35 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " R " ) = = 0 ) & & ( sig_ . compare ( " 2G " ) = = 0 ) )
2018-01-28 10:46:35 +00:00
{
2018-08-11 11:56:24 +00:00
observablesR2C . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2018-01-28 10:46:35 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " G " ) = = 0 ) & & ( sig_ . compare ( " 2S " ) = = 0 ) )
2018-01-28 10:46:35 +00:00
{
2018-08-11 11:56:24 +00:00
observablesG2S . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2018-01-28 10:46:35 +00:00
}
}
2018-08-11 11:56:24 +00:00
std : : multimap < uint32_t , Gnss_Synchro > total_glo_map ;
std : : set < uint32_t > available_glo_prns ;
std : : set < uint32_t > : : iterator it ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesR1C . begin ( ) ;
observables_iter ! = observablesR1C . end ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_glo_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2018-01-28 10:46:35 +00:00
it = available_glo_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_glo_prns . end ( ) )
2018-01-28 10:46:35 +00:00
{
available_glo_prns . insert ( prn_ ) ;
}
}
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesR2C . begin ( ) ;
observables_iter ! = observablesR2C . end ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_glo_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2018-01-28 10:46:35 +00:00
it = available_glo_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_glo_prns . end ( ) )
2018-01-28 10:46:35 +00:00
{
available_glo_prns . insert ( prn_ ) ;
}
}
2018-08-11 11:56:24 +00:00
int32_t numGloSatellitesObserved = available_glo_prns . size ( ) ;
int32_t numGpsSatellitesObserved = observablesG2S . size ( ) ;
int32_t numSatellitesObserved = numGloSatellitesObserved + numGpsSatellitesObserved ;
2018-01-28 10:46:35 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
// -------- OBSERVATION record
std : : string s ;
std : : string lineObs ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesG2S . begin ( ) ;
observables_iter ! = observablesG2S . end ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
lineObs . clear ( ) ;
s . assign ( 1 , observables_iter - > second . System ) ;
// Specify system only if in version 3
2018-03-03 01:03:39 +00:00
if ( s . compare ( " G " ) = = 0 ) lineObs + = satelliteSystem [ " GPS " ] ;
if ( s . compare ( " R " ) = = 0 ) lineObs + = satelliteSystem [ " GLONASS " ] ; // should not happen
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2017-12-27 18:57:25 +00:00
2018-01-28 10:46:35 +00:00
// Pseudorange Measurements
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Pseudorange_m , 3 ) , 14 ) ;
2017-07-24 05:57:54 +00:00
2018-01-28 10:46:35 +00:00
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2018-01-28 10:46:35 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2017-07-24 05:57:54 +00:00
2018-01-28 10:46:35 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( observables_iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-19 14:45:54 +00:00
2018-01-28 10:46:35 +00:00
// PHASE
2018-03-03 01:03:39 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_phase_rads / GPS_TWO_PI , 3 ) , 14 ) ;
2018-01-28 10:46:35 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-24 05:57:54 +00:00
2018-01-28 10:46:35 +00:00
// DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
// SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
2017-12-28 02:10:08 +00:00
2018-08-11 11:56:24 +00:00
std : : pair < std : : multimap < uint32_t , Gnss_Synchro > : : iterator , std : : multimap < uint32_t , Gnss_Synchro > : : iterator > ret ;
2018-03-03 01:03:39 +00:00
for ( it = available_glo_prns . begin ( ) ;
it ! = available_glo_prns . end ( ) ;
it + + )
2018-01-28 10:46:35 +00:00
{
lineObs . clear ( ) ;
lineObs + = satelliteSystem [ " GLONASS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( * it ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( * it ) ) ;
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
ret = total_glo_map . equal_range ( * it ) ;
2018-08-11 11:56:24 +00:00
for ( std : : multimap < uint32_t , Gnss_Synchro > : : iterator iter = ret . first ; iter ! = ret . second ; + + iter )
2018-01-28 10:46:35 +00:00
{
/// \todo Need to account for pseudorange correction for glonass
//double leap_seconds = Rinex_Printer::get_leap_second(glonass_gnav_eph, gps_obs_time);
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Pseudorange_m , 3 ) , 14 ) ;
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2018-01-28 10:46:35 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
// GLONASS CARRIER PHASE
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_phase_rads / ( GLONASS_TWO_PI ) , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
// GLONASS DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
// GLONASS SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
}
2017-12-28 02:10:08 +00:00
2018-01-28 10:46:35 +00:00
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
2017-12-28 02:10:08 +00:00
}
2018-01-28 10:46:35 +00:00
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_obs ( std : : fstream & out , const Galileo_Ephemeris & galileo_eph , const Glonass_Gnav_Ephemeris & glonass_gnav_eph , double galileo_obs_time , const std : : map < int32_t , Gnss_Synchro > & observables )
2017-07-24 05:57:54 +00:00
{
2018-03-03 01:03:39 +00:00
if ( glonass_gnav_eph . d_m )
{
} // avoid warning, not needed
2017-07-24 05:57:54 +00:00
std : : string line ;
boost : : posix_time : : ptime p_galileo_time = Rinex_Printer : : compute_Galileo_time ( galileo_eph , galileo_obs_time ) ;
std : : string timestring = boost : : posix_time : : to_iso_string ( p_galileo_time ) ;
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
//double gps_t = eph.sv_clock_correction(obs_time);
double galileo_t = galileo_obs_time ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2017-07-24 05:57:54 +00:00
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2017-07-24 05:57:54 +00:00
line + = std : : string ( 1 , ' > ' ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
double seconds = fmod ( galileo_t , 60 ) ;
// Add extra 0 if seconds are < 10
if ( seconds < 10 )
2017-07-19 14:45:54 +00:00
{
2018-03-03 01:03:39 +00:00
line + = std : : string ( 1 , ' 0 ' ) ;
2017-07-24 05:57:54 +00:00
}
line + = Rinex_Printer : : asString ( seconds , 7 ) ;
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
2017-07-19 14:45:54 +00:00
2017-07-24 05:57:54 +00:00
//Number of satellites observed in current epoch
2017-07-19 14:45:54 +00:00
2017-07-24 05:57:54 +00:00
//Get maps with observations
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Gnss_Synchro > observablesE1B ;
std : : map < int32_t , Gnss_Synchro > observablesR1C ;
std : : map < int32_t , Gnss_Synchro > observablesR2C ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2017-07-24 05:57:54 +00:00
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . begin ( ) ;
observables_iter ! = observables . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
std : : string system_ ( & observables_iter - > second . System , 1 ) ;
std : : string sig_ ( observables_iter - > second . Signal ) ;
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " R " ) = = 0 ) & & ( sig_ . compare ( " 1G " ) = = 0 ) )
2017-07-19 14:45:54 +00:00
{
2018-08-11 11:56:24 +00:00
observablesR1C . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2017-07-19 14:45:54 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " R " ) = = 0 ) & & ( sig_ . compare ( " 2G " ) = = 0 ) )
2017-07-24 05:57:54 +00:00
{
2018-08-11 11:56:24 +00:00
observablesR2C . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2017-07-24 05:57:54 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " E " ) = = 0 ) & & ( sig_ . compare ( " 1B " ) = = 0 ) )
2017-07-24 05:57:54 +00:00
{
2018-08-11 11:56:24 +00:00
observablesE1B . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2017-07-24 05:57:54 +00:00
}
}
2018-08-11 11:56:24 +00:00
std : : multimap < uint32_t , Gnss_Synchro > total_glo_map ;
std : : set < uint32_t > available_glo_prns ;
std : : set < uint32_t > : : iterator it ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesR1C . begin ( ) ;
observables_iter ! = observablesR1C . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_glo_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2017-07-24 05:57:54 +00:00
it = available_glo_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_glo_prns . end ( ) )
2017-07-24 05:57:54 +00:00
{
available_glo_prns . insert ( prn_ ) ;
}
}
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesR2C . begin ( ) ;
observables_iter ! = observablesR2C . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_glo_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2017-07-24 05:57:54 +00:00
it = available_glo_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_glo_prns . end ( ) )
2017-07-24 05:57:54 +00:00
{
available_glo_prns . insert ( prn_ ) ;
}
}
2017-07-19 14:45:54 +00:00
2018-08-11 11:56:24 +00:00
int32_t numGloSatellitesObserved = available_glo_prns . size ( ) ;
int32_t numGalSatellitesObserved = observablesE1B . size ( ) ;
int32_t numSatellitesObserved = numGalSatellitesObserved + numGloSatellitesObserved ;
2017-07-24 05:57:54 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
2017-07-19 14:45:54 +00:00
2017-07-24 05:57:54 +00:00
// Receiver clock offset (optional)
//line += rightJustify(asString(clockOffset, 12), 15);
2017-07-19 14:45:54 +00:00
2017-07-24 05:57:54 +00:00
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2017-07-19 14:45:54 +00:00
2017-07-24 05:57:54 +00:00
std : : string s ;
std : : string lineObs ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesE1B . begin ( ) ;
observables_iter ! = observablesE1B . end ( ) ;
observables_iter + + )
2017-07-24 05:57:54 +00:00
{
lineObs . clear ( ) ;
s . assign ( 1 , observables_iter - > second . System ) ;
2018-03-03 01:03:39 +00:00
if ( s . compare ( " E " ) = = 0 ) lineObs + = satelliteSystem [ " Galileo " ] ;
if ( s . compare ( " R " ) = = 0 ) lineObs + = satelliteSystem [ " GLONASS " ] ; // should not happen
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2017-07-24 05:57:54 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Pseudorange_m , 3 ) , 14 ) ;
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2017-07-24 05:57:54 +00:00
if ( lli = = 0 )
2017-07-19 14:45:54 +00:00
{
2017-07-24 05:57:54 +00:00
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2017-07-24 05:57:54 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( observables_iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-24 05:57:54 +00:00
// PHASE
2018-03-03 01:03:39 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_phase_rads / GPS_TWO_PI , 3 ) , 14 ) ;
2017-07-24 05:57:54 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-24 05:57:54 +00:00
// DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-24 05:57:54 +00:00
// SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
2018-08-11 11:56:24 +00:00
std : : pair < std : : multimap < uint32_t , Gnss_Synchro > : : iterator , std : : multimap < uint32_t , Gnss_Synchro > : : iterator > ret ;
2018-03-03 01:03:39 +00:00
for ( it = available_glo_prns . begin ( ) ;
it ! = available_glo_prns . end ( ) ;
it + + )
2017-07-24 05:57:54 +00:00
{
lineObs . clear ( ) ;
lineObs + = satelliteSystem [ " Galileo " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( * it ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( * it ) ) ;
2017-07-24 05:57:54 +00:00
ret = total_glo_map . equal_range ( * it ) ;
2018-08-11 11:56:24 +00:00
for ( std : : multimap < uint32_t , Gnss_Synchro > : : iterator iter = ret . first ; iter ! = ret . second ; + + iter )
2017-07-24 05:57:54 +00:00
{
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Pseudorange_m , 3 ) , 14 ) ;
2017-07-19 14:45:54 +00:00
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2017-07-19 14:45:54 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2017-07-19 14:45:54 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-19 14:45:54 +00:00
2017-07-24 05:57:54 +00:00
// GLONASS CARRIER PHASE
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_phase_rads / ( GLONASS_TWO_PI ) , 3 ) , 14 ) ;
2017-07-19 14:45:54 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-19 14:45:54 +00:00
2017-07-24 05:57:54 +00:00
// GLONASS DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
2017-07-19 14:45:54 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2017-07-19 14:45:54 +00:00
2017-07-24 05:57:54 +00:00
// GLONASS SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
2017-07-19 14:45:54 +00:00
}
2017-07-24 05:57:54 +00:00
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
2017-07-19 14:45:54 +00:00
}
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_obs ( std : : fstream & out , const Gps_Ephemeris & eph , const double obs_time , const std : : map < int32_t , Gnss_Synchro > & observables )
2011-10-01 18:45:20 +00:00
{
2014-09-05 14:38:44 +00:00
// RINEX observations timestamps are GPS timestamps.
2012-01-11 07:05:09 +00:00
std : : string line ;
2011-10-01 18:45:20 +00:00
2014-09-05 14:38:44 +00:00
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( eph , obs_time ) ;
2013-07-04 13:47:40 +00:00
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
2012-12-11 18:29:20 +00:00
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
2013-07-04 13:47:40 +00:00
//double gps_t = eph.sv_clock_correction(obs_time);
double gps_t = obs_time ;
2012-12-11 18:29:20 +00:00
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2012-01-12 05:47:50 +00:00
2012-01-11 07:05:09 +00:00
if ( version = = 2 )
{
2012-01-12 05:47:50 +00:00
line . clear ( ) ;
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 2 , 2 ) ;
2012-01-12 05:47:50 +00:00
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
if ( month . compare ( 0 , 1 , " 0 " ) = = 0 )
2012-01-12 05:47:50 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = month . substr ( 1 , 1 ) ;
}
else
{
line + = month ;
}
line + = std : : string ( 1 , ' ' ) ;
2018-03-03 01:03:39 +00:00
if ( day . compare ( 0 , 1 , " 0 " ) = = 0 )
2012-01-12 05:47:50 +00:00
{
line + = std : : string ( 1 , ' ' ) ;
line + = day . substr ( 1 , 1 ) ;
}
else
{
line + = day ;
}
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
2015-02-18 00:06:41 +00:00
double second_ = fmod ( gps_t , 60 ) ;
if ( second_ < 10 )
{
line + = std : : string ( 1 , ' ' ) ;
}
2015-02-18 00:13:56 +00:00
line + = Rinex_Printer : : asString ( second_ , 7 ) ;
2012-01-12 05:47:50 +00:00
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
//Number of satellites observed in current epoch
2018-08-11 11:56:24 +00:00
int32_t numSatellitesObserved = 0 ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2012-01-12 05:47:50 +00:00
{
numSatellitesObserved + + ;
}
2013-05-24 16:11:48 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2012-01-12 05:47:50 +00:00
{
line + = satelliteSystem [ " GPS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) line + = std : : string ( 1 , ' 0 ' ) ;
line + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2012-01-12 05:47:50 +00:00
}
// Receiver clock offset (optional)
//line += rightJustify(asString(clockOffset, 12), 15);
2012-01-11 09:01:24 +00:00
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
2012-01-11 07:05:09 +00:00
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2012-01-12 05:47:50 +00:00
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2012-01-12 05:47:50 +00:00
{
std : : string lineObs ;
lineObs . clear ( ) ;
line . clear ( ) ;
2013-05-24 16:11:48 +00:00
// GPS L1 PSEUDORANGE
2012-01-12 05:47:50 +00:00
line + = std : : string ( 2 , ' ' ) ;
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Pseudorange_m , 3 ) , 14 ) ;
2012-01-12 05:47:50 +00:00
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2012-01-12 05:47:50 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2015-02-20 19:59:36 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( observables_iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2013-05-24 16:11:48 +00:00
// GPS L1 CA PHASE
2018-03-03 01:03:39 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_phase_rads / GPS_TWO_PI , 3 ) , 14 ) ;
2015-02-20 19:59:36 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
// else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2013-05-24 16:11:48 +00:00
// GPS L1 CA DOPPLER
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
2015-02-20 19:59:36 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2013-05-24 16:11:48 +00:00
//GPS L1 SIGNAL STRENGTH
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
2012-01-12 05:47:50 +00:00
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
2012-01-11 07:05:09 +00:00
}
2011-10-01 18:45:20 +00:00
2012-01-11 07:05:09 +00:00
if ( version = = 3 )
{
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 1 , ' > ' ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
2015-02-20 19:59:36 +00:00
double seconds = fmod ( gps_t , 60 ) ;
2012-12-11 18:29:20 +00:00
// Add extra 0 if seconds are < 10
2014-09-01 16:00:33 +00:00
if ( seconds < 10 )
2018-01-28 10:46:35 +00:00
{
line + = std : : string ( 1 , ' 0 ' ) ;
}
2012-12-11 18:29:20 +00:00
line + = Rinex_Printer : : asString ( seconds , 7 ) ;
2012-01-11 07:05:09 +00:00
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
//Number of satellites observed in current epoch
2018-08-11 11:56:24 +00:00
int32_t numSatellitesObserved = 0 ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2012-01-11 07:05:09 +00:00
{
numSatellitesObserved + + ;
}
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
// Receiver clock offset (optional)
//line += rightJustify(asString(clockOffset, 12), 15);
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2012-01-11 07:05:09 +00:00
{
std : : string lineObs ;
lineObs . clear ( ) ;
lineObs + = satelliteSystem [ " GPS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2012-01-11 07:05:09 +00:00
//lineObs += std::string(2, ' ');
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Pseudorange_m , 3 ) , 14 ) ;
2012-01-11 07:05:09 +00:00
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2012-01-11 07:05:09 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2014-09-01 16:00:33 +00:00
2015-02-20 19:59:36 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( observables_iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2015-02-20 19:59:36 +00:00
2014-09-01 16:00:33 +00:00
// GPS L1 CA PHASE
2018-03-03 01:03:39 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_phase_rads / GPS_TWO_PI , 3 ) , 14 ) ;
2015-02-20 19:59:36 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2014-09-01 16:00:33 +00:00
// GPS L1 CA DOPPLER
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
2015-02-20 19:59:36 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2015-02-20 19:59:36 +00:00
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2014-09-01 16:00:33 +00:00
//GPS L1 SIGNAL STRENGTH
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
2014-09-01 16:00:33 +00:00
2014-09-01 11:03:24 +00:00
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
}
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_obs ( std : : fstream & out , const Gps_CNAV_Ephemeris & eph , double obs_time , const std : : map < int32_t , Gnss_Synchro > & observables )
2016-10-29 15:59:48 +00:00
{
// RINEX observations timestamps are GPS timestamps.
std : : string line ;
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( eph , obs_time ) ;
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
//double gps_t = eph.sv_clock_correction(obs_time);
double gps_t = obs_time ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2016-10-29 15:59:48 +00:00
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2016-10-29 15:59:48 +00:00
line + = std : : string ( 1 , ' > ' ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
double seconds = fmod ( gps_t , 60 ) ;
// Add extra 0 if seconds are < 10
if ( seconds < 10 )
{
line + = std : : string ( 1 , ' 0 ' ) ;
}
line + = Rinex_Printer : : asString ( seconds , 7 ) ;
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
//Number of satellites observed in current epoch
2018-08-11 11:56:24 +00:00
int32_t numSatellitesObserved = 0 ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2016-10-29 15:59:48 +00:00
{
numSatellitesObserved + + ;
}
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
// Receiver clock offset (optional)
//line += rightJustify(asString(clockOffset, 12), 15);
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2016-10-29 15:59:48 +00:00
{
std : : string lineObs ;
lineObs . clear ( ) ;
lineObs + = satelliteSystem [ " GPS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2016-10-29 15:59:48 +00:00
//lineObs += std::string(2, ' ');
//GPS L2 PSEUDORANGE
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Pseudorange_m , 3 ) , 14 ) ;
2016-10-29 15:59:48 +00:00
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2016-10-29 15:59:48 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2016-10-29 15:59:48 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( observables_iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-10-29 15:59:48 +00:00
// GPS L2 PHASE
2018-03-03 01:03:39 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_phase_rads / GPS_TWO_PI , 3 ) , 14 ) ;
2016-10-29 15:59:48 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-10-29 15:59:48 +00:00
// GPS L2 DOPPLER
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
2016-10-29 15:59:48 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2016-10-29 15:59:48 +00:00
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-10-29 15:59:48 +00:00
//GPS L2 SIGNAL STRENGTH
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
2016-10-29 15:59:48 +00:00
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_obs ( std : : fstream & out , const Gps_Ephemeris & eph , const Gps_CNAV_Ephemeris & eph_cnav , double obs_time , const std : : map < int32_t , Gnss_Synchro > & observables )
2016-10-29 15:15:04 +00:00
{
2018-03-03 01:03:39 +00:00
if ( eph_cnav . d_i_0 )
{
} // avoid warning, not needed
2016-10-29 15:15:04 +00:00
// RINEX observations timestamps are GPS timestamps.
std : : string line ;
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( eph , obs_time ) ;
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
//double gps_t = eph.sv_clock_correction(obs_time);
double gps_t = obs_time ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2016-10-29 15:15:04 +00:00
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2016-10-29 15:15:04 +00:00
line + = std : : string ( 1 , ' > ' ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
double seconds = fmod ( gps_t , 60 ) ;
// Add extra 0 if seconds are < 10
if ( seconds < 10 )
{
line + = std : : string ( 1 , ' 0 ' ) ;
}
line + = Rinex_Printer : : asString ( seconds , 7 ) ;
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
//Number of satellites observed in current epoch
//Get maps with GPS L1 and L2 observations
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Gnss_Synchro > observablesL1 ;
std : : map < int32_t , Gnss_Synchro > observablesL2 ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2016-10-29 15:15:04 +00:00
2018-08-11 11:56:24 +00:00
std : : multimap < uint32_t , Gnss_Synchro > total_mmap ;
std : : multimap < uint32_t , Gnss_Synchro > : : iterator mmap_iter ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2016-10-29 15:15:04 +00:00
{
2016-11-03 13:52:30 +00:00
std : : string system_ ( & observables_iter - > second . System , 1 ) ;
std : : string sig_ ( observables_iter - > second . Signal ) ;
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " G " ) = = 0 ) & & ( sig_ . compare ( " 1C " ) = = 0 ) )
2016-10-29 15:15:04 +00:00
{
2018-08-11 11:56:24 +00:00
observablesL1 . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
total_mmap . insert ( std : : pair < uint32_t , Gnss_Synchro > ( observables_iter - > second . PRN , observables_iter - > second ) ) ;
2016-10-29 15:15:04 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " G " ) = = 0 ) & & ( sig_ . compare ( " 2S " ) = = 0 ) )
2016-10-29 15:15:04 +00:00
{
2018-08-11 11:56:24 +00:00
observablesL2 . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2016-11-03 13:52:30 +00:00
mmap_iter = total_mmap . find ( observables_iter - > second . PRN ) ;
2018-03-03 01:03:39 +00:00
if ( mmap_iter = = total_mmap . end ( ) )
2016-11-01 13:02:23 +00:00
{
Gnss_Synchro gs = Gnss_Synchro ( ) ;
2018-08-11 11:56:24 +00:00
total_mmap . insert ( std : : pair < uint32_t , Gnss_Synchro > ( observables_iter - > second . PRN , gs ) ) ;
2016-11-01 13:02:23 +00:00
}
2018-08-11 11:56:24 +00:00
total_mmap . insert ( std : : pair < uint32_t , Gnss_Synchro > ( observables_iter - > second . PRN , observables_iter - > second ) ) ;
2016-11-01 13:02:23 +00:00
}
}
// Fill with zeros satellites with L1 obs but not L2
2018-08-11 11:56:24 +00:00
std : : multimap < uint32_t , Gnss_Synchro > mmap_aux ;
2016-11-01 13:02:23 +00:00
mmap_aux = total_mmap ;
2018-03-03 01:03:39 +00:00
for ( mmap_iter = mmap_aux . begin ( ) ;
mmap_iter ! = mmap_aux . end ( ) ;
mmap_iter + + )
2016-11-01 13:02:23 +00:00
{
2018-03-03 01:03:39 +00:00
if ( ( total_mmap . count ( mmap_iter - > second . PRN ) ) = = 1 & & ( mmap_iter - > second . PRN ! = 0 ) )
2016-11-01 13:02:23 +00:00
{
Gnss_Synchro gs = Gnss_Synchro ( ) ;
std : : string sys = " G " ;
gs . System = * sys . c_str ( ) ;
std : : string sig = " 2S " ;
2017-08-19 18:05:52 +00:00
std : : memcpy ( static_cast < void * > ( gs . Signal ) , sig . c_str ( ) , 3 ) ;
2016-11-01 13:02:23 +00:00
gs . PRN = mmap_iter - > second . PRN ;
2018-08-11 11:56:24 +00:00
total_mmap . insert ( std : : pair < uint32_t , Gnss_Synchro > ( mmap_iter - > second . PRN , gs ) ) ;
2016-10-29 15:15:04 +00:00
}
}
2018-08-11 11:56:24 +00:00
std : : set < uint32_t > available_prns ;
std : : set < uint32_t > : : iterator it ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesL1 . cbegin ( ) ;
observables_iter ! = observablesL1 . cend ( ) ;
observables_iter + + )
2016-10-29 15:15:04 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
2016-11-01 12:01:35 +00:00
it = available_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_prns . end ( ) )
2016-10-29 15:15:04 +00:00
{
2016-11-01 12:01:35 +00:00
available_prns . insert ( prn_ ) ;
2016-10-29 15:15:04 +00:00
}
}
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesL2 . cbegin ( ) ;
observables_iter ! = observablesL2 . cend ( ) ;
observables_iter + + )
2016-11-01 12:01:35 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
2016-11-01 12:01:35 +00:00
it = available_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_prns . end ( ) )
2016-11-01 12:01:35 +00:00
{
available_prns . insert ( prn_ ) ;
}
}
2016-10-29 15:15:04 +00:00
2018-08-11 11:56:24 +00:00
int32_t numSatellitesObserved = available_prns . size ( ) ;
2016-11-01 12:01:35 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
2016-10-29 15:15:04 +00:00
// Receiver clock offset (optional)
//line += rightJustify(asString(clockOffset, 12), 15);
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2016-11-01 12:01:35 +00:00
std : : string lineObs ;
2018-08-11 11:56:24 +00:00
std : : pair < std : : multimap < uint32_t , Gnss_Synchro > : : iterator , std : : multimap < uint32_t , Gnss_Synchro > : : iterator > ret ;
2018-03-03 01:03:39 +00:00
for ( it = available_prns . begin ( ) ;
it ! = available_prns . end ( ) ;
it + + )
2016-10-29 15:15:04 +00:00
{
lineObs . clear ( ) ;
lineObs + = satelliteSystem [ " GPS " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( * it ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( * it ) ) ;
2016-11-01 13:02:23 +00:00
ret = total_mmap . equal_range ( * it ) ;
2018-08-11 11:56:24 +00:00
for ( std : : multimap < uint32_t , Gnss_Synchro > : : iterator iter = ret . first ; iter ! = ret . second ; + + iter )
2016-10-29 15:15:04 +00:00
{
2016-11-01 12:01:35 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Pseudorange_m , 3 ) , 14 ) ;
2016-10-29 15:15:04 +00:00
2016-11-01 12:01:35 +00:00
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2016-11-01 12:01:35 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
// else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2016-10-29 15:15:04 +00:00
2016-11-01 12:01:35 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-10-29 15:15:04 +00:00
2016-11-01 12:01:35 +00:00
// GPS CARRIER PHASE
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_phase_rads / ( GALILEO_TWO_PI ) , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-10-29 15:15:04 +00:00
2016-11-01 12:01:35 +00:00
// GPS DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-10-29 15:15:04 +00:00
2016-11-01 12:01:35 +00:00
// GPS SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
2016-10-29 15:15:04 +00:00
}
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_obs ( std : : fstream & out , const Galileo_Ephemeris & eph , double obs_time , const std : : map < int32_t , Gnss_Synchro > & observables , const std : : string galileo_bands )
2014-09-01 11:03:24 +00:00
{
2014-09-01 18:38:31 +00:00
// RINEX observations timestamps are Galileo timestamps.
// See http://gage14.upc.es/gLAB/HTML/Observation_Rinex_v3.01.html
2014-09-01 11:03:24 +00:00
std : : string line ;
boost : : posix_time : : ptime p_galileo_time = Rinex_Printer : : compute_Galileo_time ( eph , obs_time ) ;
std : : string timestring = boost : : posix_time : : to_iso_string ( p_galileo_time ) ;
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
//double gps_t = eph.sv_clock_correction(obs_time);
double galileo_t = obs_time ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2014-09-01 11:03:24 +00:00
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2014-09-01 18:38:31 +00:00
line + = std : : string ( 1 , ' > ' ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
2014-09-01 11:03:24 +00:00
2014-09-01 18:38:31 +00:00
line + = std : : string ( 1 , ' ' ) ;
double seconds = fmod ( galileo_t , 60 ) ;
// Add extra 0 if seconds are < 10
if ( seconds < 10 )
{
2016-10-31 21:32:58 +00:00
line + = std : : string ( 1 , ' 0 ' ) ;
2014-09-01 18:38:31 +00:00
}
line + = Rinex_Printer : : asString ( seconds , 7 ) ;
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
//Number of satellites observed in current epoch
2016-10-31 21:32:58 +00:00
//Get maps with Galileo observations
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Gnss_Synchro > observablesE1B ;
std : : map < int32_t , Gnss_Synchro > observablesE5A ;
std : : map < int32_t , Gnss_Synchro > observablesE5B ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2016-11-03 13:52:30 +00:00
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2014-09-01 18:38:31 +00:00
{
2016-11-03 13:52:30 +00:00
std : : string system_ ( & observables_iter - > second . System , 1 ) ;
std : : string sig_ ( observables_iter - > second . Signal ) ;
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " E " ) = = 0 ) & & ( sig_ . compare ( " 1B " ) = = 0 ) )
2016-10-31 21:32:58 +00:00
{
2018-08-11 11:56:24 +00:00
observablesE1B . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2016-10-31 21:32:58 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " E " ) = = 0 ) & & ( sig_ . compare ( " 5X " ) = = 0 ) )
2016-10-31 21:32:58 +00:00
{
2018-08-11 11:56:24 +00:00
observablesE5A . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2016-10-31 21:32:58 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " E " ) = = 0 ) & & ( sig_ . compare ( " 7X " ) = = 0 ) )
2016-10-31 21:32:58 +00:00
{
2018-08-11 11:56:24 +00:00
observablesE5B . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2016-10-31 21:32:58 +00:00
}
}
2016-11-03 09:49:10 +00:00
std : : size_t found_1B = galileo_bands . find ( " 1B " ) ;
std : : size_t found_E5a = galileo_bands . find ( " 5X " ) ;
std : : size_t found_E5b = galileo_bands . find ( " 7X " ) ;
2016-10-31 21:32:58 +00:00
2018-08-11 11:56:24 +00:00
std : : multimap < uint32_t , Gnss_Synchro > total_map ;
std : : set < uint32_t > available_prns ;
std : : set < uint32_t > : : iterator it ;
2018-03-03 01:03:39 +00:00
if ( found_1B ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesE1B . begin ( ) ;
observables_iter ! = observablesE1B . end ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2018-01-28 10:46:35 +00:00
it = available_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_prns . end ( ) )
2016-11-03 09:49:10 +00:00
{
2018-01-28 10:46:35 +00:00
available_prns . insert ( prn_ ) ;
2016-11-03 09:49:10 +00:00
}
2018-01-28 10:46:35 +00:00
}
}
2018-03-03 01:03:39 +00:00
if ( found_E5a ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesE5A . cbegin ( ) ;
observables_iter ! = observablesE5A . cend ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
2018-01-28 10:46:35 +00:00
it = available_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_prns . end ( ) )
2016-11-03 09:49:10 +00:00
{
2018-01-28 10:46:35 +00:00
available_prns . insert ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_1B ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
Gnss_Synchro gs = Gnss_Synchro ( ) ;
std : : string sys = " E " ;
gs . System = * sys . c_str ( ) ;
std : : string sig = " 1B " ;
std : : memcpy ( static_cast < void * > ( gs . Signal ) , sig . c_str ( ) , 3 ) ;
gs . PRN = prn_ ;
2018-08-11 11:56:24 +00:00
total_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , gs ) ) ;
2018-01-28 10:46:35 +00:00
}
2016-11-03 09:49:10 +00:00
}
2018-08-11 11:56:24 +00:00
total_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2018-01-28 10:46:35 +00:00
}
}
2018-03-03 01:03:39 +00:00
if ( found_E5b ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesE5B . cbegin ( ) ;
observables_iter ! = observablesE5B . cend ( ) ;
observables_iter + + )
2018-01-28 10:46:35 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
2018-01-28 10:46:35 +00:00
it = available_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_prns . end ( ) )
2018-01-28 10:46:35 +00:00
{
available_prns . insert ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( found_1B ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
Gnss_Synchro gs = Gnss_Synchro ( ) ;
std : : string sys = " E " ;
gs . System = * sys . c_str ( ) ;
std : : string sig = " 1B " ;
std : : memcpy ( static_cast < void * > ( gs . Signal ) , sig . c_str ( ) , 3 ) ;
gs . PRN = prn_ ;
2018-08-11 11:56:24 +00:00
total_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , gs ) ) ;
2018-01-28 10:46:35 +00:00
}
2018-03-03 01:03:39 +00:00
if ( found_E5a ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
Gnss_Synchro gs = Gnss_Synchro ( ) ;
std : : string sys = " E " ;
gs . System = * sys . c_str ( ) ;
std : : string sig = " 5X " ;
std : : memcpy ( static_cast < void * > ( gs . Signal ) , sig . c_str ( ) , 3 ) ;
gs . PRN = prn_ ;
2018-08-11 11:56:24 +00:00
total_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , gs ) ) ;
2018-01-28 10:46:35 +00:00
}
}
else
{
// if 5X is listed but empty
2018-03-03 01:03:39 +00:00
if ( found_E5a ! = std : : string : : npos )
2018-01-28 10:46:35 +00:00
{
2018-03-03 01:03:39 +00:00
if ( ( total_map . count ( prn_ ) ) = = 1 )
2018-01-28 10:46:35 +00:00
{
Gnss_Synchro gs = Gnss_Synchro ( ) ;
std : : string sys = " E " ;
gs . System = * sys . c_str ( ) ;
std : : string sig = " 5X " ;
std : : memcpy ( static_cast < void * > ( gs . Signal ) , sig . c_str ( ) , 3 ) ;
gs . PRN = prn_ ;
2018-08-11 11:56:24 +00:00
total_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , gs ) ) ;
2018-01-28 10:46:35 +00:00
}
}
}
2018-08-11 11:56:24 +00:00
total_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2018-01-28 10:46:35 +00:00
}
}
2018-08-11 11:56:24 +00:00
int32_t numSatellitesObserved = available_prns . size ( ) ;
2016-10-31 21:32:58 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
2014-09-01 18:38:31 +00:00
// Receiver clock offset (optional)
//line += rightJustify(asString(clockOffset, 12), 15);
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
2014-09-01 11:03:24 +00:00
2016-11-01 10:00:44 +00:00
std : : string lineObs ;
2018-08-11 11:56:24 +00:00
std : : pair < std : : multimap < uint32_t , Gnss_Synchro > : : iterator , std : : multimap < uint32_t , Gnss_Synchro > : : iterator > ret ;
2018-03-03 01:03:39 +00:00
for ( it = available_prns . begin ( ) ;
it ! = available_prns . end ( ) ;
it + + )
2014-09-01 18:38:31 +00:00
{
lineObs . clear ( ) ;
lineObs + = satelliteSystem [ " Galileo " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( * it ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( * it ) ) ;
2016-11-01 10:00:44 +00:00
ret = total_map . equal_range ( * it ) ;
2018-08-11 11:56:24 +00:00
for ( std : : multimap < uint32_t , Gnss_Synchro > : : iterator iter = ret . first ; iter ! = ret . second ; + + iter )
2014-09-01 18:38:31 +00:00
{
2016-10-31 21:32:58 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Pseudorange_m , 3 ) , 14 ) ;
2015-02-20 19:59:36 +00:00
2016-10-31 21:32:58 +00:00
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2016-10-31 21:32:58 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2015-02-20 19:59:36 +00:00
2016-10-31 21:32:58 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2015-02-20 19:59:36 +00:00
2016-10-31 21:32:58 +00:00
// Galileo CARRIER PHASE
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_phase_rads / ( GALILEO_TWO_PI ) , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-10-31 21:32:58 +00:00
// Galileo DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-10-31 21:32:58 +00:00
// Galileo SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
2015-02-20 19:59:36 +00:00
}
2014-09-01 18:38:31 +00:00
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
2012-01-11 07:05:09 +00:00
}
2012-01-03 05:38:45 +00:00
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : log_rinex_obs ( std : : fstream & out , const Gps_Ephemeris & gps_eph , const Galileo_Ephemeris & galileo_eph , double gps_obs_time , const std : : map < int32_t , Gnss_Synchro > & observables )
2014-09-05 14:38:44 +00:00
{
2018-03-03 01:03:39 +00:00
if ( galileo_eph . e_1 )
{
} // avoid warning, not needed
2014-09-05 14:38:44 +00:00
std : : string line ;
boost : : posix_time : : ptime p_gps_time = Rinex_Printer : : compute_GPS_time ( gps_eph , gps_obs_time ) ;
std : : string timestring = boost : : posix_time : : to_iso_string ( p_gps_time ) ;
//double utc_t = nav_msg.utc_time(nav_msg.sv_clock_correction(obs_time));
//double gps_t = eph.sv_clock_correction(obs_time);
double gps_t = gps_obs_time ;
2018-03-03 01:03:39 +00:00
std : : string month ( timestring , 4 , 2 ) ;
std : : string day ( timestring , 6 , 2 ) ;
std : : string hour ( timestring , 9 , 2 ) ;
std : : string minutes ( timestring , 11 , 2 ) ;
2014-09-05 14:38:44 +00:00
2018-03-03 01:03:39 +00:00
std : : string year ( timestring , 0 , 4 ) ;
2014-09-05 14:38:44 +00:00
line + = std : : string ( 1 , ' > ' ) ;
line + = std : : string ( 1 , ' ' ) ;
line + = year ;
line + = std : : string ( 1 , ' ' ) ;
line + = month ;
line + = std : : string ( 1 , ' ' ) ;
line + = day ;
line + = std : : string ( 1 , ' ' ) ;
line + = hour ;
line + = std : : string ( 1 , ' ' ) ;
line + = minutes ;
line + = std : : string ( 1 , ' ' ) ;
double seconds = fmod ( gps_t , 60 ) ;
// Add extra 0 if seconds are < 10
if ( seconds < 10 )
{
2018-03-03 01:03:39 +00:00
line + = std : : string ( 1 , ' 0 ' ) ;
2014-09-05 14:38:44 +00:00
}
line + = Rinex_Printer : : asString ( seconds , 7 ) ;
line + = std : : string ( 2 , ' ' ) ;
// Epoch flag 0: OK 1: power failure between previous and current epoch <1: Special event
line + = std : : string ( 1 , ' 0 ' ) ;
//Number of satellites observed in current epoch
2016-11-01 10:00:44 +00:00
//Get maps with observations
2018-08-11 11:56:24 +00:00
std : : map < int32_t , Gnss_Synchro > observablesG1C ;
std : : map < int32_t , Gnss_Synchro > observablesE1B ;
std : : map < int32_t , Gnss_Synchro > observablesE5A ;
std : : map < int32_t , Gnss_Synchro > observablesE5B ;
std : : map < int32_t , Gnss_Synchro > : : const_iterator observables_iter ;
2016-11-03 13:52:30 +00:00
2018-03-03 01:03:39 +00:00
for ( observables_iter = observables . cbegin ( ) ;
observables_iter ! = observables . cend ( ) ;
observables_iter + + )
2014-09-05 14:38:44 +00:00
{
2016-11-03 13:52:30 +00:00
std : : string system_ ( & observables_iter - > second . System , 1 ) ;
std : : string sig_ ( observables_iter - > second . Signal ) ;
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " E " ) = = 0 ) & & ( sig_ . compare ( " 1B " ) = = 0 ) )
2016-11-01 10:00:44 +00:00
{
2018-08-11 11:56:24 +00:00
observablesE1B . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2016-11-01 10:00:44 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " E " ) = = 0 ) & & ( sig_ . compare ( " 5X " ) = = 0 ) )
2016-11-01 10:00:44 +00:00
{
2018-08-11 11:56:24 +00:00
observablesE5A . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2016-11-01 10:00:44 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " E " ) = = 0 ) & & ( sig_ . compare ( " 7X " ) = = 0 ) )
2016-11-01 10:00:44 +00:00
{
2018-08-11 11:56:24 +00:00
observablesE5B . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2016-11-01 10:00:44 +00:00
}
2018-03-03 01:03:39 +00:00
if ( ( system_ . compare ( " G " ) = = 0 ) & & ( sig_ . compare ( " 1C " ) = = 0 ) )
2016-11-01 10:00:44 +00:00
{
2018-08-11 11:56:24 +00:00
observablesG1C . insert ( std : : pair < int32_t , Gnss_Synchro > ( observables_iter - > first , observables_iter - > second ) ) ;
2016-11-01 10:00:44 +00:00
}
}
2018-08-11 11:56:24 +00:00
std : : multimap < uint32_t , Gnss_Synchro > total_gal_map ;
std : : set < uint32_t > available_gal_prns ;
std : : set < uint32_t > : : iterator it ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesE1B . cbegin ( ) ;
observables_iter ! = observablesE1B . cend ( ) ;
observables_iter + + )
2016-11-01 10:00:44 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_gal_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2016-11-01 10:00:44 +00:00
it = available_gal_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_gal_prns . end ( ) )
2016-11-01 10:00:44 +00:00
{
available_gal_prns . insert ( prn_ ) ;
}
}
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesE5A . cbegin ( ) ;
observables_iter ! = observablesE5A . cend ( ) ;
observables_iter + + )
2016-11-01 10:00:44 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_gal_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2016-11-01 10:00:44 +00:00
it = available_gal_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_gal_prns . end ( ) )
2016-11-01 10:00:44 +00:00
{
available_gal_prns . insert ( prn_ ) ;
}
}
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesE5B . cbegin ( ) ;
observables_iter ! = observablesE5B . cend ( ) ;
observables_iter + + )
2016-11-01 10:00:44 +00:00
{
2018-08-11 11:56:24 +00:00
uint32_t prn_ = observables_iter - > second . PRN ;
total_gal_map . insert ( std : : pair < uint32_t , Gnss_Synchro > ( prn_ , observables_iter - > second ) ) ;
2016-11-01 10:00:44 +00:00
it = available_gal_prns . find ( prn_ ) ;
2018-03-03 01:03:39 +00:00
if ( it = = available_gal_prns . end ( ) )
2016-11-01 10:00:44 +00:00
{
available_gal_prns . insert ( prn_ ) ;
}
2014-09-05 14:38:44 +00:00
}
2016-11-01 10:00:44 +00:00
2018-08-11 11:56:24 +00:00
int32_t numGalSatellitesObserved = available_gal_prns . size ( ) ;
int32_t numGpsSatellitesObserved = observablesG1C . size ( ) ;
int32_t numSatellitesObserved = numGalSatellitesObserved + numGpsSatellitesObserved ;
2014-09-05 14:38:44 +00:00
line + = Rinex_Printer : : rightJustify ( boost : : lexical_cast < std : : string > ( numSatellitesObserved ) , 3 ) ;
// Receiver clock offset (optional)
//line += rightJustify(asString(clockOffset, 12), 15);
line + = std : : string ( 80 - line . size ( ) , ' ' ) ;
Rinex_Printer : : lengthCheck ( line ) ;
out < < line < < std : : endl ;
std : : string s ;
2016-11-01 10:00:44 +00:00
std : : string lineObs ;
2018-03-03 01:03:39 +00:00
for ( observables_iter = observablesG1C . cbegin ( ) ;
observables_iter ! = observablesG1C . cend ( ) ;
observables_iter + + )
2014-09-05 14:38:44 +00:00
{
lineObs . clear ( ) ;
2016-11-03 13:52:30 +00:00
s . assign ( 1 , observables_iter - > second . System ) ;
2018-03-03 01:03:39 +00:00
if ( s . compare ( " G " ) = = 0 ) lineObs + = satelliteSystem [ " GPS " ] ;
if ( s . compare ( " E " ) = = 0 ) lineObs + = satelliteSystem [ " Galileo " ] ; // should not happen
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( observables_iter - > second . PRN ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( observables_iter - > second . PRN ) ) ;
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Pseudorange_m , 3 ) , 14 ) ;
2014-09-05 14:38:44 +00:00
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2014-09-05 14:38:44 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2014-09-05 14:38:44 +00:00
2015-02-20 19:59:36 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( observables_iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2015-02-20 19:59:36 +00:00
2014-09-05 14:38:44 +00:00
// PHASE
2018-03-03 01:03:39 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_phase_rads / GPS_TWO_PI , 3 ) , 14 ) ;
2015-02-20 19:59:36 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2014-09-05 14:38:44 +00:00
// DOPPLER
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
2015-02-20 19:59:36 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2014-09-05 14:38:44 +00:00
// SIGNAL STRENGTH
2016-11-03 13:52:30 +00:00
lineObs + = Rinex_Printer : : rightJustify ( asString ( observables_iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
2014-09-05 14:38:44 +00:00
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
2016-11-01 10:00:44 +00:00
2018-08-11 11:56:24 +00:00
std : : pair < std : : multimap < uint32_t , Gnss_Synchro > : : iterator , std : : multimap < uint32_t , Gnss_Synchro > : : iterator > ret ;
2018-03-03 01:03:39 +00:00
for ( it = available_gal_prns . begin ( ) ;
it ! = available_gal_prns . end ( ) ;
it + + )
2016-11-01 10:00:44 +00:00
{
lineObs . clear ( ) ;
lineObs + = satelliteSystem [ " Galileo " ] ;
2018-08-11 11:56:24 +00:00
if ( static_cast < int32_t > ( * it ) < 10 ) lineObs + = std : : string ( 1 , ' 0 ' ) ;
lineObs + = boost : : lexical_cast < std : : string > ( static_cast < int32_t > ( * it ) ) ;
2016-11-01 10:00:44 +00:00
ret = total_gal_map . equal_range ( * it ) ;
2018-08-11 11:56:24 +00:00
for ( std : : multimap < uint32_t , Gnss_Synchro > : : iterator iter = ret . first ; iter ! = ret . second ; + + iter )
2016-11-01 10:00:44 +00:00
{
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Pseudorange_m , 3 ) , 14 ) ;
//Loss of lock indicator (LLI)
2018-08-11 11:56:24 +00:00
int32_t lli = 0 ; // Include in the observation!!
2016-11-01 10:00:44 +00:00
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2016-11-01 10:00:44 +00:00
// Signal Strength Indicator (SSI)
2018-08-11 11:56:24 +00:00
int32_t ssi = Rinex_Printer : : signalStrength ( iter - > second . CN0_dB_hz ) ;
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-11-01 10:00:44 +00:00
// Galileo CARRIER PHASE
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_phase_rads / ( GALILEO_TWO_PI ) , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-11-01 10:00:44 +00:00
// Galileo DOPPLER
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . Carrier_Doppler_hz , 3 ) , 14 ) ;
if ( lli = = 0 )
{
lineObs + = std : : string ( 1 , ' ' ) ;
}
2018-01-28 10:46:35 +00:00
//else
// {
// lineObs += Rinex_Printer::rightJustify(Rinex_Printer::asString<short>(lli), 1);
// }
2018-08-11 11:56:24 +00:00
lineObs + = Rinex_Printer : : rightJustify ( Rinex_Printer : : asString < int32_t > ( ssi ) , 1 ) ;
2016-11-01 10:00:44 +00:00
// Galileo SIGNAL STRENGTH
lineObs + = Rinex_Printer : : rightJustify ( asString ( iter - > second . CN0_dB_hz , 3 ) , 14 ) ;
}
if ( lineObs . size ( ) < 80 ) lineObs + = std : : string ( 80 - lineObs . size ( ) , ' ' ) ;
out < < lineObs < < std : : endl ;
}
2014-09-05 14:38:44 +00:00
}
2018-08-11 11:56:24 +00:00
void Rinex_Printer : : to_date_time ( int32_t gps_week , int32_t gps_tow , int & year , int & month , int & day , int & hour , int & minute , int & second )
2013-11-10 00:42:15 +00:00
{
2016-10-30 09:20:34 +00:00
// represents GPS time (week, TOW) in the date time format of the Gregorian calendar.
// -> Leap years are considered, but leap seconds are not.
2018-08-11 11:56:24 +00:00
int32_t days_per_month [ ] = { 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 } ;
2013-11-10 00:42:15 +00:00
// seconds in a not leap year
2018-08-11 11:56:24 +00:00
const int32_t secs_per_day = 24 * 60 * 60 ;
const int32_t secs_per_week = 7 * secs_per_day ;
const int32_t secs_per_normal_year = 365 * secs_per_day ;
const int32_t secs_per_leap_year = secs_per_normal_year + secs_per_day ;
2013-11-10 00:42:15 +00:00
// the GPS epoch is 06.01.1980 00:00, i.e. midnight 5. / 6. January 1980
// -> seconds since then
2018-08-11 11:56:24 +00:00
int32_t secs_since_gps_epoch = gps_week * secs_per_week + gps_tow ;
2013-11-10 00:42:15 +00:00
// find year, consider leap years
bool is_leap_year ;
2018-08-11 11:56:24 +00:00
int32_t remaining_secs = secs_since_gps_epoch + 5 * secs_per_day ;
for ( int32_t y = 1980 ; true ; y + + )
2013-11-10 00:42:15 +00:00
{
2018-03-03 01:03:39 +00:00
is_leap_year = y % 4 = = 0 & & ( y % 100 ! = 0 | | y % 400 = = 0 ) ;
2018-08-11 11:56:24 +00:00
int32_t secs_in_year_y = is_leap_year ? secs_per_leap_year : secs_per_normal_year ;
2013-11-10 00:42:15 +00:00
if ( secs_in_year_y < = remaining_secs )
{
remaining_secs - = secs_in_year_y ;
}
else
{
year = y ;
//std::cout << "year: year=" << year << " secs_in_year_y="<< secs_in_year_y << " remaining_secs="<< remaining_secs << std::endl;
break ;
}
//std::cout << "year: y=" << y << " secs_in_year_y="<< secs_in_year_y << " remaining_secs="<< remaining_secs << std::endl;
}
// find month
2018-08-11 11:56:24 +00:00
for ( int32_t m = 1 ; true ; m + + )
2013-11-10 00:42:15 +00:00
{
2018-08-11 11:56:24 +00:00
int32_t secs_in_month_m = days_per_month [ m - 1 ] * secs_per_day ;
2018-03-10 11:56:30 +00:00
if ( is_leap_year & & m = = 2 ) // consider February of leap year
2013-11-10 00:42:15 +00:00
{
secs_in_month_m + = secs_per_day ;
}
if ( secs_in_month_m < = remaining_secs )
{
remaining_secs - = secs_in_month_m ;
}
else
{
month = m ;
//std::cout << "month: month=" << month << " secs_in_month_m="<< secs_in_month_m << " remaining_secs="<< remaining_secs << std::endl;
break ;
}
//std::cout << "month: m=" << m << " secs_in_month_m="<< secs_in_month_m << " remaining_secs="<< remaining_secs << std::endl;
}
2018-03-10 11:56:30 +00:00
day = remaining_secs / secs_per_day + 1 ;
remaining_secs = remaining_secs % secs_per_day ;
2013-11-10 00:42:15 +00:00
2018-03-10 11:56:30 +00:00
hour = remaining_secs / ( 60 * 60 ) ;
remaining_secs = remaining_secs % ( 60 * 60 ) ;
2013-11-10 00:42:15 +00:00
2018-03-10 11:56:30 +00:00
minute = remaining_secs / 60 ;
second = remaining_secs % 60 ;
2013-11-10 00:42:15 +00:00
}
2017-04-20 14:10:12 +00:00
//void Rinex_Printer::log_rinex_sbs(std::fstream& out, const Sbas_Raw_Msg& sbs_message)
//{
// // line 1: PRN / EPOCH / RCVR
// std::stringstream line1;
//
// // SBAS PRN
// line1 << sbs_message.get_prn();
// line1 << " ";
//
// // gps time of reception
2018-08-11 11:56:24 +00:00
// int32_t gps_week;
2017-04-20 14:10:12 +00:00
// double gps_sec;
// if(sbs_message.get_rx_time_obj().get_gps_time(gps_week, gps_sec))
// {
2018-08-11 11:56:24 +00:00
// int32_t year;
// int32_t month;
// int32_t day;
// int32_t hour;
// int32_t minute;
// int32_t second;
2017-04-20 14:10:12 +00:00
//
// double gps_sec_one_digit_precicion = round(gps_sec *10)/10; // to prevent rounding towards 60.0sec in the stream output
2018-08-11 11:56:24 +00:00
// int32_t gps_tow = trunc(gps_sec_one_digit_precicion);
2017-04-20 14:10:12 +00:00
// double sub_sec = gps_sec_one_digit_precicion - double(gps_tow);
//
// to_date_time(gps_week, gps_tow, year, month, day, hour, minute, second);
// line1 << asFixWidthString(year, 2, '0') << " " << asFixWidthString(month, 2, '0') << " " << asFixWidthString(day, 2, '0') << " " << asFixWidthString(hour, 2, '0') << " " << asFixWidthString(minute, 2, '0') << " " << rightJustify(asString(double(second)+sub_sec,1),4,' ');
// }
// else
// {
// line1 << std::string(19, ' ');
// }
// line1 << " ";
//
// // band
// line1 << "L1";
// line1 << " ";
//
// // Length of data message (bytes)
// line1 << asFixWidthString(sbs_message.get_msg().size(), 3, ' ');
// line1 << " ";
// // File-internal receiver index
// line1 << " 0";
// line1 << " ";
// // Transmission System Identifier
// line1 << "SBA";
// line1 << std::string(35, ' ');
// lengthCheck(line1.str());
// out << line1.str() << std::endl;
//
// // DATA RECORD - 1
// std::stringstream line2;
// line2 << " ";
// // Message frame identifier
// if (sbs_message.get_msg_type() < 10) line2 << " ";
// line2 << sbs_message.get_msg_type();
// line2 << std::string(4, ' ');
// // First 18 bytes of message (hex)
// std::vector<unsigned char> msg = sbs_message.get_msg();
// for (size_t i = 0; i < 18 && i < msg.size(); ++i)
// {
// line2 << std::hex << std::setfill('0') << std::setw(2);
// line2 << int(msg[i]) << " ";
// }
// line2 << std::string(19, ' ');
// lengthCheck(line2.str());
// out << line2.str() << std::endl;
//
// // DATA RECORD - 2
// std::stringstream line3;
// line3 << std::string(7, ' ');
// // Remaining bytes of message (hex)
// for (size_t i = 18; i < 36 && i < msg.size(); ++i)
// {
// line3 << std::hex << std::setfill('0') << std::setw(2);
// line3 << int(msg[i]) << " ";
// }
// line3 << std::string(31, ' ');
// lengthCheck(line3.str());
// out << line3.str() << std::endl;
//}
2013-11-10 00:42:15 +00:00
2018-08-11 11:56:24 +00:00
int32_t Rinex_Printer : : signalStrength ( const double snr )
2011-10-01 18:45:20 +00:00
{
2018-08-11 11:56:24 +00:00
int32_t ss ;
2018-03-03 01:03:39 +00:00
ss = int ( std : : min ( std : : max ( int ( floor ( snr / 6 ) ) , 1 ) , 9 ) ) ;
2012-01-11 07:05:09 +00:00
return ss ;
2011-10-01 18:45:20 +00:00
}
2012-01-03 05:38:45 +00:00
2014-09-14 17:08:32 +00:00
boost : : posix_time : : ptime Rinex_Printer : : compute_UTC_time ( const Gps_Navigation_Message & nav_msg )
2012-01-07 05:21:11 +00:00
{
// if we are processing a file -> wait to leap second to resolve the ambiguity else take the week from the local system time
//: idea resolve the ambiguity with the leap second http://www.colorado.edu/geography/gcraft/notes/gps/gpseow.htm
2014-09-14 17:08:32 +00:00
const double utc_t = nav_msg . utc_time ( nav_msg . d_TOW ) ;
2018-08-11 11:56:24 +00:00
boost : : posix_time : : time_duration t = boost : : posix_time : : milliseconds ( static_cast < int64_t > ( ( utc_t + 604800 * static_cast < double > ( nav_msg . i_GPS_week ) ) * 1000 ) ) ;
2012-01-11 07:05:09 +00:00
boost : : posix_time : : ptime p_time ( boost : : gregorian : : date ( 1999 , 8 , 22 ) , t ) ;
2012-01-07 05:21:11 +00:00
return p_time ;
}
2012-01-03 05:38:45 +00:00
2014-09-02 00:04:13 +00:00
2014-09-14 17:08:32 +00:00
boost : : posix_time : : ptime Rinex_Printer : : compute_GPS_time ( const Gps_Ephemeris & eph , const double obs_time )
2012-12-11 18:29:20 +00:00
{
2013-07-04 13:47:40 +00:00
// The RINEX v2.11 v3.00 format uses GPS time for the observations epoch, not UTC time, thus, no leap seconds needed here.
// (see Section 3 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex211.txt)
// (see Pag. 17 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex300.pdf)
// --??? No time correction here, since it will be done in the RINEX processor
2014-09-14 17:08:32 +00:00
const double gps_t = obs_time ;
2018-08-11 11:56:24 +00:00
boost : : posix_time : : time_duration t = boost : : posix_time : : milliseconds ( static_cast < int64_t > ( ( gps_t + 604800 * static_cast < double > ( eph . i_GPS_week % 1024 ) ) * 1000 ) ) ;
2012-12-11 18:29:20 +00:00
boost : : posix_time : : ptime p_time ( boost : : gregorian : : date ( 1999 , 8 , 22 ) , t ) ;
return p_time ;
}
2016-10-30 09:20:34 +00:00
2018-03-03 01:03:39 +00:00
boost : : posix_time : : ptime Rinex_Printer : : compute_GPS_time ( const Gps_CNAV_Ephemeris & eph , const double obs_time )
2016-10-29 09:42:17 +00:00
{
// The RINEX v2.11 v3.00 format uses GPS time for the observations epoch, not UTC time, thus, no leap seconds needed here.
// (see Section 3 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex211.txt)
// (see Pag. 17 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex300.pdf)
// --??? No time correction here, since it will be done in the RINEX processor
const double gps_t = obs_time ;
2018-08-11 11:56:24 +00:00
boost : : posix_time : : time_duration t = boost : : posix_time : : milliseconds ( static_cast < int64_t > ( ( gps_t + 604800 * static_cast < double > ( eph . i_GPS_week % 1024 ) ) * 1000 ) ) ;
2016-10-29 09:42:17 +00:00
boost : : posix_time : : ptime p_time ( boost : : gregorian : : date ( 1999 , 8 , 22 ) , t ) ;
return p_time ;
}
2014-08-31 13:58:09 +00:00
2014-09-14 17:08:32 +00:00
boost : : posix_time : : ptime Rinex_Printer : : compute_Galileo_time ( const Galileo_Ephemeris & eph , const double obs_time )
2014-08-31 13:58:09 +00:00
{
2014-09-03 16:57:37 +00:00
// The RINEX v2.11 v3.00 format uses Galileo time for the observations epoch, not UTC time, thus, no leap seconds needed here.
// (see Pag. 17 in http://igscb.jpl.nasa.gov/igscb/data/format/rinex301.pdf)
2014-08-31 13:58:09 +00:00
// --??? No time correction here, since it will be done in the RINEX processor
double galileo_t = obs_time ;
2018-08-11 11:56:24 +00:00
boost : : posix_time : : time_duration t = boost : : posix_time : : milliseconds ( static_cast < int64_t > ( ( galileo_t + 604800 * static_cast < double > ( eph . WN_5 ) ) * 1000 ) ) ; //
2014-08-31 13:58:09 +00:00
boost : : posix_time : : ptime p_time ( boost : : gregorian : : date ( 1999 , 8 , 22 ) , t ) ;
return p_time ;
}
2014-09-02 00:04:13 +00:00
2017-12-26 00:05:35 +00:00
boost : : posix_time : : ptime Rinex_Printer : : compute_UTC_time ( const Glonass_Gnav_Ephemeris & eph , const double obs_time )
2017-07-19 14:45:54 +00:00
{
2017-12-26 00:05:35 +00:00
double tod = 0.0 ;
2018-03-10 11:56:30 +00:00
double glot2utc = 3 * 3600 ;
2018-03-10 12:30:11 +00:00
double obs_time_glot = 0.0 ;
2018-08-11 11:56:24 +00:00
int32_t i = 0 ;
2018-03-10 11:56:30 +00:00
// Get observation time in nearly GLONASS time. Correction for leap seconds done at the end
obs_time_glot = obs_time + glot2utc ;
// Get seconds of day in glonass time
tod = fmod ( obs_time_glot , 86400 ) ;
// Form date and time duration types
boost : : posix_time : : time_duration t1 ( 0 , 0 , tod ) ;
boost : : gregorian : : date d1 ( eph . d_yr , 1 , 1 ) ;
boost : : gregorian : : days d2 ( eph . d_N_T - 1 ) ;
boost : : posix_time : : ptime glo_time ( d1 + d2 , t1 ) ;
// Convert to utc
boost : : posix_time : : time_duration t2 ( 0 , 0 , glot2utc ) ;
boost : : posix_time : : ptime utc_time = glo_time - t2 ;
// Adjust for leap second correction
for ( i = 0 ; GLONASS_LEAP_SECONDS [ i ] [ 0 ] > 0 ; i + + )
{
boost : : posix_time : : time_duration t3 ( GLONASS_LEAP_SECONDS [ i ] [ 3 ] , GLONASS_LEAP_SECONDS [ i ] [ 4 ] , GLONASS_LEAP_SECONDS [ i ] [ 5 ] ) ;
boost : : gregorian : : date d3 ( GLONASS_LEAP_SECONDS [ i ] [ 0 ] , GLONASS_LEAP_SECONDS [ i ] [ 1 ] , GLONASS_LEAP_SECONDS [ i ] [ 2 ] ) ;
boost : : posix_time : : ptime ls_time ( d3 , t3 ) ;
if ( utc_time > = ls_time )
{
// We subtract the leap second when going from gpst to utc, values store as negatives
utc_time = utc_time + boost : : posix_time : : time_duration ( 0 , 0 , GLONASS_LEAP_SECONDS [ i ] [ 6 ] ) ;
break ;
}
}
return utc_time ;
2017-07-19 14:45:54 +00:00
}
2017-12-26 00:05:35 +00:00
2017-12-27 18:57:25 +00:00
double Rinex_Printer : : get_leap_second ( const Glonass_Gnav_Ephemeris & eph , const double gps_obs_time )
{
double tod = 0.0 ;
2018-03-10 11:56:30 +00:00
double glot2utc = 3 * 3600 ;
double obs_time_glot = 0.0 ;
2018-08-11 11:56:24 +00:00
int32_t i = 0 ;
2018-03-10 11:56:30 +00:00
double leap_second = 0 ;
// Get observation time in nearly GLONASS time. Correction for leap seconds done at the end
obs_time_glot = gps_obs_time + glot2utc ;
// Get seconds of day in glonass time
tod = fmod ( obs_time_glot , 86400 ) ;
// Form date and time duration types
boost : : posix_time : : time_duration t1 ( 0 , 0 , tod ) ;
boost : : gregorian : : date d1 ( eph . d_yr , 1 , 1 ) ;
boost : : gregorian : : days d2 ( eph . d_N_T - 1 ) ;
boost : : posix_time : : ptime glo_time ( d1 + d2 , t1 ) ;
// Convert to utc
boost : : posix_time : : time_duration t2 ( 0 , 0 , glot2utc ) ;
boost : : posix_time : : ptime utc_time = glo_time - t2 ;
// Adjust for leap second correction
for ( i = 0 ; GLONASS_LEAP_SECONDS [ i ] [ 0 ] > 0 ; i + + )
{
boost : : posix_time : : time_duration t3 ( GLONASS_LEAP_SECONDS [ i ] [ 3 ] , GLONASS_LEAP_SECONDS [ i ] [ 4 ] , GLONASS_LEAP_SECONDS [ i ] [ 5 ] ) ;
boost : : gregorian : : date d3 ( GLONASS_LEAP_SECONDS [ i ] [ 0 ] , GLONASS_LEAP_SECONDS [ i ] [ 1 ] , GLONASS_LEAP_SECONDS [ i ] [ 2 ] ) ;
boost : : posix_time : : ptime ls_time ( d3 , t3 ) ;
if ( utc_time > = ls_time )
{
// We subtract the leap second when going from gpst to utc
leap_second = fabs ( GLONASS_LEAP_SECONDS [ i ] [ 6 ] ) ;
break ;
}
}
return leap_second ;
2017-12-27 18:57:25 +00:00
}
2018-01-28 10:46:35 +00:00
2012-01-03 05:38:45 +00:00
/*
enum RINEX_enumMarkerType {
GEODETIC , //!< GEODETIC Earth-fixed, high-precision monumentation
NON_GEODETIC , //!< NON_GEODETIC Earth-fixed, low-precision monumentation
SPACEBORNE , //!< SPACEBORNE Orbiting space vehicle
AIRBORNE , //!< AIRBORNE Aircraft, balloon, etc.
WATER_CRAFT , //!< WATER_CRAFT Mobile water craft
GROUND_CRAFT , //!< GROUND_CRAFT Mobile terrestrial vehicle
FIXED_BUOY , //!< FIXED_BUOY "Fixed" on water surface
FLOATING_BUOY , //!< FLOATING_BUOY Floating on water surface
FLOATING_ICE , //!< FLOATING_ICE Floating ice sheet, etc.
GLACIER , //!< GLACIER "Fixed" on a glacier
BALLISTIC , //!< BALLISTIC Rockets, shells, etc
ANIMAL , //!< ANIMAL Animal carrying a receiver
HUMAN //!< HUMAN Human being
} ;
2012-01-09 09:58:54 +00:00
*/