#include "rinex.hh" #include #include #include #include #include using namespace std; /* Header: 3.03 N: GNSS NAV DATA M: MIXED RINEX VERSION / TYPE sbf2rin-13.2.1 20191217 004932 UTC PGM / RUN BY / DATE GPSA 8.3819E-09 -1.4901E-08 -5.9605E-08 1.1921E-07 IONOSPHERIC CORR GPSB 9.4208E+04 -1.3107E+05 -1.3107E+05 8.5197E+05 IONOSPHERIC CORR GAL 3.0500E+01 3.3203E-01 2.9907E-03 0.0000E+00 IONOSPHERIC CORR GPUT 5.8207660913E-11 3.996802889E-15 122400 2084 TIME SYSTEM CORR GAUT 0.0000000000E+00 0.000000000E+00 86400 2084 TIME SYSTEM CORR GPGA 4.0745362639E-09 9.325873407E-15 172800 2084 TIME SYSTEM CORR 18 LEAP SECONDS END OF HEADER */ RINEXReader::RINEXReader(std::string_view fname) { d_fname=fname; d_fp = gzopen(&fname[0], "r"); if(!d_fp) throw runtime_error("Unable to open "+(string)fname+": "+strerror(errno)); try { skipFileHeader(); } catch(...) { gzclose(d_fp); throw; } } void RINEXReader::skipFileHeader() { char line[300]; bool eoh=false; int lines=0; while(gzgets(d_fp, line, sizeof(line))) { if(strstr(line, "END OF HEADER")) { eoh=true; break; } if(lines++ > 250) break; } if(!eoh) { throw std::runtime_error("Did not find RINEX END OF HEADER in "+d_fname); } } RINEXReader::~RINEXReader() { if(d_fp) gzclose(d_fp); } /* RINEX format.. is very special. This extracts a value from a line where it should be noted values can be and often are back to back */ static double getRINEXValue(char* line, int offset) { char* ptr=line+offset+19; char tmp = *ptr; *ptr = 0; double ret; sscanf(line + offset, "%lf", &ret); // cout<<"'"<