39 #include "NewNavInc.h"
40 #include <gnsstk/BasicFramework.hpp>
41 #include <gnsstk/RinexNavDataFactory.hpp>
42 #include <gnsstk/CommandOptionWithTimeArg.hpp>
43 #include <gnsstk/SystemTime.hpp>
44 #include <gnsstk/TimeString.hpp>
53 using StrmPtr = shared_ptr<Rinex3NavStream>;
58 static constexpr
double DefRINEX2Ver = 2.11;
64 : PRNID(-1), fitint2(0.)
67 :
time(rnd.
time), satSys(rnd.satSys), PRNID(rnd.PRNID),
68 fitint2(rnd.fitint * 1800.)
72 time.setTimeSystem(TimeSystem::Any);
79 if (satSys < right.
satSys)
return true;
80 if (right.
satSys < satSys)
return false;
81 if (PRNID < right.
PRNID)
return true;
85 {
return time - fitint2; }
87 {
return time + fitint2; }
96 bool initialize(
int argc,
char *argv[],
bool pretty=
true) throw() override;
98 void process() override;
108 set<
string>& outFNs);
114 void makeSysMappings();
155 :
BasicFramework(applName, "reads one or more RINEX (v.2+) navigation"
156 "
files and writes the merged navigation
data to one or"
157 " more output (ver 2 or 3)
files. A summary of the"
158 " ephemeris
data may be written to the screen."),
159 timeOpt('t', "
time", "%Y %m %d %H %M %S", "Start
time (of
data) for"
160 " processing (
time in RINEX 3
format, i.e. \"YYYY mm dd HH MM"
162 eTimeOpt('e', "end-
time", "%Y %m %d %H %M %S", "End
time (of
data) for"
164 excludeOpt('x', "exclude", "Exclude satellite [system] from output"
166 output3Opt('o', "out", "Output (ARG=[sys@]filename) to RINEX ver. 3"
168 output2Opt('2', "out2", "Output (ARG=[sys@]filename) to RINEX ver. 2"
170 filesOpt("RINEX-NAV-FILE [...]", true),
189 if (timeOpt.getCount() > 0)
191 minTime = timeOpt.getTime()[0];
193 if (eTimeOpt.getCount() > 0)
195 maxTime = eTimeOpt.getTime()[0];
197 minTime.setTimeSystem(TimeSystem::Any);
198 maxTime.setTimeSystem(TimeSystem::Any);
200 vector<string>
files(filesOpt.getValue());
206 for (
unsigned i = 0; i <
files.size(); i++)
208 if (fileSet.count(
files[i]) > 0)
210 cerr <<
"\"" <<
files[i]
211 <<
"\" specified multiple times, only using once" << endl;
214 fileSet.insert(
files[i]);
215 StrmPtr sp = make_shared<Rinex3NavStream>(
files[i].c_str(),std::ios::in);
218 cerr <<
"Unable to open \"" <<
files[i] <<
"\" for input" << endl;
219 exitCode = BasicFramework::EXIST_ERROR;
222 sp->exceptions(std::fstream::failbit);
224 (*sp) >> dataMap[
sp];
228 cerr <<
printTime(dataMap[
sp].
time,
"time:%Y/%02d/%02m-%02H:%02M:%02S")
230 if (orderMap.find(dataMap[
sp].time) == orderMap.end())
232 cerr <<
" new orderMap entry " <<
sp << endl;
236 cerr <<
" appending orderMap entry " <<
sp << endl;
239 orderMap.insert(pair<CommonTime,StrmPtr>(dataMap[
sp].
time,
sp));
241 cout <<
"Input file " <<
files[i] << endl;
245 if (!parseOut(output3Opt, output3Map, outFNs))
249 if (!parseOut(output2Opt, output2Map, outFNs))
254 vector<string> exsats(excludeOpt.getValue());
255 for (
unsigned i = 0; i < exsats.size(); i++)
267 exclSats.insert(sid);
271 cerr <<
"\"" << exsats[i] <<
"\" is not a valid satellite designation"
273 exitCode = BasicFramework::OPTION_ERROR;
290 if (orderMap.empty())
296 auto omi = orderMap.begin();
300 cerr <<
"Processing " <<
sp << endl;
303 if ((omi->first >= minTime) && (omi->first < maxTime) &&
304 (exclSats.count(dataMap[
sp].sat) == 0))
307 if (uniques.count(key) == 0)
323 for (
auto o3i : output3Map)
326 if ((o3i.first == SatelliteSystem::Unknown) ||
327 (o3i.first == dataMap[
sp].sat.system))
329 (*o3i.second) << dataMap[
sp];
332 for (
auto o2i : output2Map)
335 if ((o2i.first == SatelliteSystem::Unknown) ||
336 (o2i.first == dataMap[
sp].sat.system))
338 (*o2i.second) << dataMap[
sp];
345 (*sp) >> dataMap[
sp];
349 orderMap.insert(pair<CommonTime,StrmPtr>(dataMap[
sp].
time,
sp));
354 cout <<
"Nav table for all satellites has " << uniques.size()
355 <<
" entries; Valid time span is "
356 <<
printTime(tbegin,
"%Y/%02m/%02d %02H:%02M:%02S %P") <<
" to "
357 <<
printTime(tend,
"%Y/%02m/%02d %02H:%02M:%02S %P") << endl;
365 vector<string> outs(opt.
getValue());
366 for (
unsigned i = 0; i < outs.size(); i++)
369 vector<string> sysFn;
371 if (outs[i].find(
'@') != string::npos)
374 string sysUp = sysFn[0];
376 if (id1map.find(sysUp) != id1map.end())
380 else if (id3map.find(sysUp) != id3map.end())
388 if (sys == SatelliteSystem::Unknown)
390 cerr <<
"\"" << sysFn[0] <<
"\" is not a valid system ID" << endl;
391 exitCode = BasicFramework::OPTION_ERROR;
399 sys = SatelliteSystem::Unknown;
401 if (outFNs.count(sysFn[1]) > 0)
403 cerr <<
"Can't open \"" << sysFn[1] <<
"\" for output more than once"
405 exitCode = BasicFramework::OPTION_ERROR;
408 outFNs.insert(sysFn[1]);
409 StrmPtr sp = make_shared<Rinex3NavStream>(sysFn[1].c_str(),std::ios::out);
410 sp->exceptions(std::fstream::failbit);
413 cout <<
"Output file " << sysFn[1] << endl;
422 bool firstRec =
true;
424 merged.
fileType =
"N: GNSS NAV DATA";
429 merged.
valid = Rinex3NavHeader::validVersion | Rinex3NavHeader::validRunBy |
432 if (
pos != string::npos)
435 for (
auto dmi : dataMap)
438 (dmi.first->header.valid & Rinex3NavHeader::validLeapSeconds))
442 merged.
leapSeconds = dmi.first->header.leapSeconds;
443 merged.
leapDelta = dmi.first->header.leapDelta;
444 merged.
leapWeek = dmi.first->header.leapWeek;
445 merged.
leapDay = dmi.first->header.leapDay;
446 merged.
valid |= Rinex3NavHeader::validLeapSeconds;
450 for (
unsigned i = 0; i < dmi.first->header.commentList.size(); i++)
452 merged.
commentList.push_back(dmi.first->header.commentList[i]);
453 merged.
valid |= Rinex3NavHeader::validComment;
456 for (
const auto& i : dmi.first->header.mapTimeCorr)
459 merged.
valid |= Rinex3NavHeader::validTimeSysCorr;
462 for (
const auto& i : dmi.first->header.mapIonoCorr)
466 dmi.first->header.valid & (Rinex3NavHeader::validIonoCorrGPS |
467 Rinex3NavHeader::validIonoCorrGal));
471 if (dmi.first->header.version < 3.0)
474 guessedSys = dmi.second.sat.system;
479 guessedSys = dmi.first->header.fileSysSat.system;
481 if (mergedSys == SatelliteSystem::Last)
483 mergedSys = guessedSys;
485 else if (mergedSys != guessedSys)
487 mergedSys = SatelliteSystem::Mixed;
490 for (
auto& i : output3Map)
492 merged.
version = Rinex3ObsBase::currentVersion;
498 if (i.first == SatelliteSystem::Unknown)
508 (*i.second) << merged;
510 for (
auto& i : output2Map)
513 (*i.second) << merged;
529 id1map[sysStr] = sys;
532 id1map[sysStr] = sys;
537 int main(
int argc,
char *argv[])
539 #include "NewNavInit.h"
554 cerr << e.
what() << endl;
558 cerr <<
"unknown exception" << endl;
560 return BasicFramework::EXCEPTION_ERROR;