RinEditNav.cpp
Go to the documentation of this file.
1 //==============================================================================
2 //
3 // This file is part of GNSSTk, the ARL:UT GNSS Toolkit.
4 //
5 // The GNSSTk is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published
7 // by the Free Software Foundation; either version 3.0 of the License, or
8 // any later version.
9 //
10 // The GNSSTk is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with GNSSTk; if not, write to the Free Software Foundation,
17 // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 //
19 // This software was developed by Applied Research Laboratories at the
20 // University of Texas at Austin.
21 // Copyright 2004-2022, The Board of Regents of The University of Texas System
22 //
23 //==============================================================================
24 
25 //==============================================================================
26 //
27 // This software was developed by Applied Research Laboratories at the
28 // University of Texas at Austin, under contract to an agency or agencies
29 // within the U.S. Department of Defense. The U.S. Government retains all
30 // rights to use, duplicate, distribute, disclose, or release this software.
31 //
32 // Pursuant to DoD Directive 523024
33 //
34 // DISTRIBUTION STATEMENT A: This software has been approved for public
35 // release, distribution is unlimited.
36 //
37 //==============================================================================
38 
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>
45 
46 using namespace std;
47 using namespace gnsstk;
48 
49 class RinEditNav : public BasicFramework
50 {
51 public:
53  using StrmPtr = shared_ptr<Rinex3NavStream>;
55  using OutputMap = map<SatelliteSystem, StrmPtr>;
56 
58  static constexpr double DefRINEX2Ver = 2.11;
59 
61  struct UniqueNav
62  {
64  : PRNID(-1), fitint2(0.)
65  {}
67  : time(rnd.time), satSys(rnd.satSys), PRNID(rnd.PRNID),
68  fitint2(rnd.fitint * 1800.)
69  {
70  // Kludge to make everything in the same time system.
71  // This isn't truly valid, but it should be in most cases.
72  time.setTimeSystem(TimeSystem::Any);
73  }
74  bool operator<(const UniqueNav& right) const
75  {
76  // fitint2 is not needed for ordering.
77  if (time < right.time) return true;
78  if (right.time < time) return false;
79  if (satSys < right.satSys) return true;
80  if (right.satSys < satSys) return false;
81  if (PRNID < right.PRNID) return true;
82  return false;
83  }
85  { return time - fitint2; }
87  { return time + fitint2; }
89  std::string satSys;
90  short PRNID;
91  double fitint2;
92  };
93 
94  RinEditNav(const string& applName);
95 
96  bool initialize(int argc, char *argv[], bool pretty=true) throw() override;
97 
98  void process() override;
99 
107  bool parseOut(const CommandOptionWithAnyArg& opt, OutputMap& outMap,
108  set<string>& outFNs);
109 
111  void writeHeaders();
112 
114  void makeSysMappings();
115 
127  CommandOptionOneOf outputOpts;
131  map<StrmPtr, Rinex3NavData> dataMap;
133  multimap<CommonTime, StrmPtr> orderMap;
135  OutputMap output3Map;
137  OutputMap output2Map;
139  set<SatID> exclSats;
141  CommonTime minTime;
143  CommonTime maxTime;
145  map<string,SatelliteSystem> id1map;
147  map<string,SatelliteSystem> id3map;
149  set<UniqueNav> uniques;
150 };
151 
152 
153 RinEditNav ::
154 RinEditNav(const string& applName)
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"
161  " SS\")"),
162  eTimeOpt('e', "end-time", "%Y %m %d %H %M %S", "End time (of data) for"
163  " processing"),
164  excludeOpt('x', "exclude", "Exclude satellite [system] from output"
165  " [e.g. G17,R]"),
166  output3Opt('o', "out", "Output (ARG=[sys@]filename) to RINEX ver. 3"
167  " file fn [repeatable]"),
168  output2Opt('2', "out2", "Output (ARG=[sys@]filename) to RINEX ver. 2"
169  " file fn [repeatable]"),
170  filesOpt("RINEX-NAV-FILE [...]", true),
171  minTime(CommonTime::BEGINNING_OF_TIME),
172  maxTime(CommonTime::END_OF_TIME)
173 {
174  timeOpt.setMaxCount(1);
175  eTimeOpt.setMaxCount(1);
176  outputOpts.addOption(&output2Opt);
177  outputOpts.addOption(&output3Opt);
178 }
179 
180 
181 bool RinEditNav ::
182 initialize(int argc, char *argv[], bool pretty) throw()
183 {
184  if (!BasicFramework::initialize(argc, argv, pretty))
185  return false;
186 
187  makeSysMappings();
188 
189  if (timeOpt.getCount() > 0)
190  {
191  minTime = timeOpt.getTime()[0];
192  }
193  if (eTimeOpt.getCount() > 0)
194  {
195  maxTime = eTimeOpt.getTime()[0];
196  }
197  minTime.setTimeSystem(TimeSystem::Any);
198  maxTime.setTimeSystem(TimeSystem::Any);
199 
200  vector<string> files(filesOpt.getValue());
201  set<string> fileSet; // for uniqueness
202  // Open all requested files and read the first record so we can
203  // process the data in time order (this assumes the individual
204  // files are in time order to begin with).
206  for (unsigned i = 0; i < files.size(); i++)
207  {
208  if (fileSet.count(files[i]) > 0)
209  {
210  cerr << "\"" << files[i]
211  << "\" specified multiple times, only using once" << endl;
212  continue;
213  }
214  fileSet.insert(files[i]);
215  StrmPtr sp = make_shared<Rinex3NavStream>(files[i].c_str(),std::ios::in);
216  if (!(*sp))
217  {
218  cerr << "Unable to open \"" << files[i] << "\" for input" << endl;
219  exitCode = BasicFramework::EXIST_ERROR;
220  return false;
221  }
222  sp->exceptions(std::fstream::failbit);
223  // read the first data record of the file into the map
224  (*sp) >> dataMap[sp];
225  // also save the time stamp so we always have everything in order
226  if (debugLevel)
227  {
228  cerr << printTime(dataMap[sp].time, "time:%Y/%02d/%02m-%02H:%02M:%02S")
229  << endl;
230  if (orderMap.find(dataMap[sp].time) == orderMap.end())
231  {
232  cerr << " new orderMap entry " << sp << endl;
233  }
234  else
235  {
236  cerr << " appending orderMap entry " << sp << endl;
237  }
238  }
239  orderMap.insert(pair<CommonTime,StrmPtr>(dataMap[sp].time,sp));
240 
241  cout << "Input file " << files[i] << endl;
242  }
243 
244  set<string> outFNs;
245  if (!parseOut(output3Opt, output3Map, outFNs))
246  {
247  return false;
248  }
249  if (!parseOut(output2Opt, output2Map, outFNs))
250  {
251  return false;
252  }
253 
254  vector<string> exsats(excludeOpt.getValue());
255  for (unsigned i = 0; i < exsats.size(); i++)
256  {
257  try
258  {
259  RinexSatID sid(exsats[i]);
260  if (sid.id == -1)
261  {
262  // If you don't specify a satellite ID, only a system,
263  // you get a satellite ID of -1. Turn that into a
264  // wildcard.
265  sid.wildId = true;
266  }
267  exclSats.insert(sid);
268  }
269  catch (...)
270  {
271  cerr << "\"" << exsats[i] << "\" is not a valid satellite designation"
272  << endl;
273  exitCode = BasicFramework::OPTION_ERROR;
274  return false;
275  }
276  }
277 
278  return true;
279 }
280 
281 
282 void RinEditNav ::
284 {
285  CommonTime tbegin,tend;
286  writeHeaders();
287  bool done = false;
288  while (!done)
289  {
290  if (orderMap.empty())
291  {
292  // nothing more to process
293  break;
294  }
295  // first element of orderMap is always the oldest
296  auto omi = orderMap.begin();
297  StrmPtr sp = omi->second;
298  if (debugLevel)
299  {
300  cerr << "Processing " << sp << endl;
301  }
302  // write the already-read data record to output
303  if ((omi->first >= minTime) && (omi->first < maxTime) &&
304  (exclSats.count(dataMap[sp].sat) == 0))
305  {
306  UniqueNav key(dataMap[sp]);
307  if (uniques.count(key) == 0)
308  {
309  uniques.insert(key);
310 
311  // keep track of earliest and latest times
312  if ((tbegin == CommonTime::BEGINNING_OF_TIME) ||
313  (tbegin > key.beginFit()))
314  {
315  tbegin = key.beginFit();
316  }
317  if ((tend == CommonTime::BEGINNING_OF_TIME) ||
318  (tend < key.endFit()))
319  {
320  tend = key.endFit();
321  }
322 
323  for (auto o3i : output3Map)
324  {
325  // Treat "Unknown" as a wildcard here
326  if ((o3i.first == SatelliteSystem::Unknown) ||
327  (o3i.first == dataMap[sp].sat.system))
328  {
329  (*o3i.second) << dataMap[sp];
330  }
331  }
332  for (auto o2i : output2Map)
333  {
334  // Treat "Unknown" as a wildcard here
335  if ((o2i.first == SatelliteSystem::Unknown) ||
336  (o2i.first == dataMap[sp].sat.system))
337  {
338  (*o2i.second) << dataMap[sp];
339  }
340  }
341  }
342  }
343  // read the next record in the file and update orderMap;
344  orderMap.erase(omi);
345  (*sp) >> dataMap[sp];
346  if (*sp)
347  {
348  // only add the record if it's valid.
349  orderMap.insert(pair<CommonTime,StrmPtr>(dataMap[sp].time,sp));
350  }
351  }
352 
353  // write times to stdout
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;
358 }
359 
360 
361 bool RinEditNav ::
363  set<string>& outFNs)
364 {
365  vector<string> outs(opt.getValue());
366  for (unsigned i = 0; i < outs.size(); i++)
367  {
368  // sysFn[0] = system, sysFn[1] = file name
369  vector<string> sysFn;
370  SatelliteSystem sys;
371  if (outs[i].find('@') != string::npos)
372  {
373  sysFn = gnsstk::StringUtils::split(outs[i], '@');
374  string sysUp = sysFn[0];
375  StringUtils::upperCase(sysUp);
376  if (id1map.find(sysUp) != id1map.end())
377  {
378  sys = id1map[sysUp];
379  }
380  else if (id3map.find(sysUp) != id3map.end())
381  {
382  sys = id3map[sysUp];
383  }
384  else
385  {
387  }
388  if (sys == SatelliteSystem::Unknown)
389  {
390  cerr << "\"" << sysFn[0] << "\" is not a valid system ID" << endl;
391  exitCode = BasicFramework::OPTION_ERROR;
392  return false;
393  }
394  }
395  else
396  {
397  sysFn.resize(2);
398  sysFn[1] = outs[i];
399  sys = SatelliteSystem::Unknown;
400  }
401  if (outFNs.count(sysFn[1]) > 0)
402  {
403  cerr << "Can't open \"" << sysFn[1] << "\" for output more than once"
404  << endl;
405  exitCode = BasicFramework::OPTION_ERROR;
406  return false;
407  }
408  outFNs.insert(sysFn[1]);
409  StrmPtr sp = make_shared<Rinex3NavStream>(sysFn[1].c_str(),std::ios::out);
410  sp->exceptions(std::fstream::failbit);
411  outMap[sys] = sp;
412 
413  cout << "Output file " << sysFn[1] << endl;
414  }
415  return true;
416 }
417 
418 
419 void RinEditNav ::
421 {
422  bool firstRec = true;
423  Rinex3NavHeader merged;
424  merged.fileType = "N: GNSS NAV DATA";
425  merged.fileSys = "";
426  merged.fileProgram = argv0;
427  merged.fileAgency = "gnsstk";
428  merged.date = printTime(SystemTime(),"%Y%02m%02d %02H%02M%02S %P");
429  merged.valid = Rinex3NavHeader::validVersion | Rinex3NavHeader::validRunBy |
431  size_t pos = merged.fileProgram.find_last_of("/\\");
432  if (pos != string::npos)
433  merged.fileProgram.erase(0,pos+1);
434  SatelliteSystem mergedSys = SatelliteSystem::Last;
435  for (auto dmi : dataMap)
436  {
437  if (firstRec &&
438  (dmi.first->header.valid & Rinex3NavHeader::validLeapSeconds))
439  {
440  // Just pull these things from the first header, which is
441  // really the best we can do.
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;
447  firstRec = false;
448  }
449  // merge comments
450  for (unsigned i = 0; i < dmi.first->header.commentList.size(); i++)
451  {
452  merged.commentList.push_back(dmi.first->header.commentList[i]);
453  merged.valid |= Rinex3NavHeader::validComment;
454  }
455  // merge time system corrections
456  for (const auto& i : dmi.first->header.mapTimeCorr)
457  {
458  merged.mapTimeCorr[i.first] = i.second;
459  merged.valid |= Rinex3NavHeader::validTimeSysCorr;
460  }
461  // merge iono corrections
462  for (const auto& i : dmi.first->header.mapIonoCorr)
463  {
464  merged.mapIonoCorr[i.first] = i.second;
465  merged.valid |= (
466  dmi.first->header.valid & (Rinex3NavHeader::validIonoCorrGPS |
467  Rinex3NavHeader::validIonoCorrGal));
468  }
469  // attempt to determine the system or mixed from the input
470  SatelliteSystem guessedSys;
471  if (dmi.first->header.version < 3.0)
472  {
473  // try and pick up the system from the data
474  guessedSys = dmi.second.sat.system;
475  }
476  else
477  {
478  // pick up the system from the input header for 3.0+
479  guessedSys = dmi.first->header.fileSysSat.system;
480  }
481  if (mergedSys == SatelliteSystem::Last)
482  {
483  mergedSys = guessedSys;
484  }
485  else if (mergedSys != guessedSys)
486  {
487  mergedSys = SatelliteSystem::Mixed;
488  }
489  }
490  for (auto& i : output3Map)
491  {
492  merged.version = Rinex3ObsBase::currentVersion;
493  RinexSatID sat;
494  // If the map key is "Unknown", that means there's no
495  // restriction on which systems go in the output file, so use
496  // our best guess. Otherwise, we know the file will only
497  // contain the one system so use that instead.
498  if (i.first == SatelliteSystem::Unknown)
499  {
500  sat.system = mergedSys;
501  }
502  else
503  {
504  sat.system = i.first;
505  }
506  merged.fileSys = string(1, sat.systemChar()) + ": " +
507  sat.systemString();
508  (*i.second) << merged;
509  }
510  for (auto& i : output2Map)
511  {
512  merged.version = DefRINEX2Ver;
513  (*i.second) << merged;
514  }
515 }
516 
517 
518 void RinEditNav ::
520 {
521  // This is a pretty clunky way to generate the mappings but this
522  // was the only way I found to get system mappings for RINEX.
523  RinexSatID sat;
525  {
526  sat.system = sys;
527  string sysStr = string(1, sat.systemChar());
528  if (sysStr != "?")
529  id1map[sysStr] = sys;
530  sysStr = sat.systemString3();
531  if (sysStr != "Unk")
532  id1map[sysStr] = sys;
533  }
534 }
535 
536 
537 int main(int argc, char *argv[])
538 {
539 #include "NewNavInit.h"
540  try
541  {
542  RinEditNav app(argv[0]);
543  if (!app.initialize(argc, argv))
544  return app.exitCode;
545  app.run();
546  return app.exitCode;
547  }
548  catch (Exception& e)
549  {
550  cerr << e << endl;
551  }
552  catch (exception& e)
553  {
554  cerr << e.what() << endl;
555  }
556  catch (...)
557  {
558  cerr << "unknown exception" << endl;
559  }
560  return BasicFramework::EXCEPTION_ERROR;
561 }
gnsstk::StringUtils::upperCase
std::string & upperCase(std::string &s)
Definition: StringUtils.hpp:2117
RinEditNav::UniqueNav::UniqueNav
UniqueNav(const Rinex3NavData &rnd)
Definition: RinEditNav.cpp:66
gnsstk::SatID::id
int id
Satellite identifier, e.g. PRN.
Definition: SatID.hpp:154
RinEditNav::StrmPtr
shared_ptr< Rinex3NavStream > StrmPtr
Nav stream shared (managed) pointer.
Definition: RinEditNav.cpp:53
file
page HOWTO subpage DoxygenGuide Documenting Your Code page DoxygenGuide Documenting Your Code todo Flesh out this document section doctips Tips for Documenting When defining make sure that the prototype is identical between the cpp and hpp file
Definition: DOCUMENTING.dox:9
gnsstk::Rinex3NavHeader::version
double version
RINEX Version.
Definition: Rinex3NavHeader.hpp:178
gnsstk::Rinex3NavHeader::leapWeek
long leapWeek
Week number of ref time.
Definition: Rinex3NavHeader.hpp:192
gnsstk::Rinex3NavHeader::fileType
std::string fileType
File type "N....".
Definition: Rinex3NavHeader.hpp:179
gnsstk::Rinex3NavHeader::valid
unsigned long valid
Definition: Rinex3NavHeader.hpp:153
gnsstk::Rinex3NavData
Definition: Rinex3NavData.hpp:69
RinEditNav
Definition: RinEditNav.cpp:49
gnsstk::BEGINNING_OF_TIME
const Epoch BEGINNING_OF_TIME(CommonTime::BEGINNING_OF_TIME)
Earliest representable Epoch.
const
#define const
Definition: getopt.c:43
gnsstk::CommandOptionOneOf::addOption
void addOption(CommandOption *opt)
Add an option to the list of mutually exclusive options.
Definition: CommandOption.cpp:396
gnsstk::RinexSatID::systemString
std::string systemString() const noexcept
Definition: RinexSatID.cpp:82
gnsstk::Rinex3NavHeader::commentList
std::vector< std::string > commentList
Definition: Rinex3NavHeader.hpp:185
gnsstk::RinexSatID::systemString3
std::string systemString3() const noexcept
Definition: RinexSatID.cpp:102
RinEditNav::UniqueNav::fitint2
double fitint2
Half fit interval (in seconds) of ephemeris.
Definition: RinEditNav.cpp:91
gnsstk::SatelliteSystem
SatelliteSystem
Supported satellite systems.
Definition: SatelliteSystem.hpp:55
gnsstk::CommandOptionRest
CommandOption to take the rest of the command line.
Definition: CommandOption.hpp:457
gnsstk::Exception::what
std::string what() const
Dump to a string.
Definition: Exception.cpp:193
RinEditNav::OutputMap
map< SatelliteSystem, StrmPtr > OutputMap
Map system to output stream.
Definition: RinEditNav.cpp:55
RinEditNav::initialize
bool initialize(int argc, char *argv[], bool pretty=true) override
Definition: RinEditNav.cpp:182
gnsstk::SatID
Definition: SatID.hpp:89
gnsstk::SatID::wildId
bool wildId
If true, any satellite matches.
Definition: SatID.hpp:155
gnsstk::Rinex3NavHeader::mapIonoCorr
std::map< std::string, IonoCorr > mapIonoCorr
map of label : GAL, GPSA or GPSB, and IONO CORRs
Definition: Rinex3NavHeader.hpp:189
gnsstk::CommandOptionWithAnyArg
Definition: CommandOption.hpp:342
RinEditNav::UniqueNav::PRNID
short PRNID
SV PRN ID.
Definition: RinEditNav.cpp:90
gnsstk
For Sinex::InputHistory.
Definition: BasicFramework.cpp:50
gnsstk::StringUtils::split
std::vector< std::string > split(const std::string &str, const char delimiter=' ')
Definition: StringUtils.hpp:2275
RinEditNav::UniqueNav::beginFit
CommonTime beginFit() const
Definition: RinEditNav.cpp:84
RinEditNav::UniqueNav::UniqueNav
UniqueNav()
Definition: RinEditNav.cpp:63
gnsstk::Exception
Definition: Exception.hpp:151
initialize
int initialize(string &errors)
Definition: RinEdit.cpp:513
gnsstk::Rinex3NavHeader
Definition: Rinex3NavHeader.hpp:107
gnsstk::BasicFramework
Definition: BasicFramework.hpp:387
example4.time
time
Definition: example4.py:103
gnsstk::SystemTime
Definition: SystemTime.hpp:54
gnsstk::Rinex3NavHeader::leapDelta
long leapDelta
Change in Leap seconds at ref time.
Definition: Rinex3NavHeader.hpp:191
example6.validEoH
validEoH
Definition: example6.py:82
gnsstk::CommonTime
Definition: CommonTime.hpp:84
gnsstk::SatelliteSystemIterator
EnumIterator< SatelliteSystem, SatelliteSystem::Unknown, SatelliteSystem::Last > SatelliteSystemIterator
Definition: SatelliteSystem.hpp:74
RinEditNav::UniqueNav
Minimal data for uniquely identifying nav data for the output file.
Definition: RinEditNav.cpp:61
files
page HOWTO subpage DoxygenGuide Documenting Your Code page DoxygenGuide Documenting Your Code todo Flesh out this document section doctips Tips for Documenting When defining make sure that the prototype is identical between the cpp and hpp including both the namespaces and the parameter names for you have std::string as the return type in the hpp file and string as the return type in the cpp Doxygen may get confused and autolink to the cpp version with no documentation If you don t use the same parameter names between the cpp and hpp files
Definition: DOCUMENTING.dox:9
RinEditNav::UniqueNav::time
CommonTime time
Time according to the sat/epoch record (TOC)
Definition: RinEditNav.cpp:88
RinEditNav::writeHeaders
void writeHeaders()
Write the headers for all open output streams. Merges input headers.
Definition: RinEditNav.cpp:420
main
int main(int argc, char *argv[])
Definition: RinEditNav.cpp:537
RinEditNav::UniqueNav::operator<
bool operator<(const UniqueNav &right) const
Definition: RinEditNav.cpp:74
gnsstk::BasicFramework::run
bool run() noexcept
Definition: BasicFramework.cpp:126
gnsstk::END_OF_TIME
const Epoch END_OF_TIME(CommonTime::END_OF_TIME)
Latest Representable Epoch.
RinEditNav::UniqueNav::endFit
CommonTime endFit() const
Definition: RinEditNav.cpp:86
example4.pos
pos
Definition: example4.py:125
gnsstk::SatID::system
SatelliteSystem system
System for this satellite.
Definition: SatID.hpp:156
gnsstk::Rinex3NavHeader::date
std::string date
Date string; includes "UTC" at the end.
Definition: Rinex3NavHeader.hpp:184
example3.data
data
Definition: example3.py:22
RinEditNav::UniqueNav::satSys
std::string satSys
Satellite system of Epoch: G,R,E,S,C.
Definition: RinEditNav.cpp:89
gnsstk::Rinex3NavHeader::leapSeconds
long leapSeconds
Leap seconds.
Definition: Rinex3NavHeader.hpp:190
gnsstk::format
Definition: format.hpp:51
gnsstk::Rinex3NavHeader::fileAgency
std::string fileAgency
Agency string.
Definition: Rinex3NavHeader.hpp:183
RinEditNav::makeSysMappings
void makeSysMappings()
Create the mappings from system string to enum.
Definition: RinEditNav.cpp:519
gnsstk::printTime
std::string printTime(const CommonTime &t, const std::string &fmt)
Definition: TimeString.cpp:64
gnsstk::RinexSatID
Definition: RinexSatID.hpp:63
std
Definition: Angle.hpp:142
gnsstk::BasicFramework::exitCode
int exitCode
Definition: BasicFramework.hpp:450
gnsstk::CommandOption::getValue
const std::vector< std::string > & getValue() const
Definition: CommandOption.hpp:194
RinEditNav::process
void process() override
Definition: RinEditNav.cpp:283
example5.fn
string fn
Definition: example5.py:10
gnsstk::Rinex3NavHeader::fileSys
std::string fileSys
File system string.
Definition: Rinex3NavHeader.hpp:180
gnsstk::StringUtils::asSatelliteSystem
SatelliteSystem asSatelliteSystem(const std::string &s) noexcept
Convert a string name to an SatelliteSystem.
Definition: SatelliteSystem.cpp:73
gnsstk::CommandOptionWithTimeArg
Definition: CommandOptionWithTimeArg.hpp:61
RinEditNav::parseOut
bool parseOut(const CommandOptionWithAnyArg &opt, OutputMap &outMap, set< string > &outFNs)
Definition: RinEditNav.cpp:362
gnsstk::Rinex3NavHeader::fileProgram
std::string fileProgram
Program string.
Definition: Rinex3NavHeader.hpp:182
gnsstk::CommandOptionOneOf
Definition: CommandOption.hpp:540
gnsstk::Rinex3NavHeader::mapTimeCorr
std::map< std::string, TimeSystemCorrection > mapTimeCorr
map of label: GAUT, GPUT, etc, and TimeCorr
Definition: Rinex3NavHeader.hpp:187
gnsstk::CommandOption::setMaxCount
CommandOption & setMaxCount(const unsigned long l)
Definition: CommandOption.hpp:164
gnsstk::RinexSatID::systemChar
char systemChar() const noexcept
Definition: RinexSatID.cpp:62
sp
double sp
Definition: IERS1996NutationData.hpp:46
gnsstk::Rinex3NavHeader::leapDay
long leapDay
Day of week of ref time.
Definition: Rinex3NavHeader.hpp:193


gnsstk
Author(s):
autogenerated on Wed Oct 25 2023 02:40:40