Rinex3ClockHeader.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 
44 #include "StringUtils.hpp"
45 #include "CommonTime.hpp"
46 #include "SystemTime.hpp"
47 #include "Rinex3ClockStream.hpp"
48 #include "Rinex3ClockHeader.hpp"
49 #include "TimeString.hpp"
50 
51 #define debug 0
52 
53 using namespace std;
54 
55 namespace gnsstk
56 {
57  using namespace StringUtils;
58 
59  const string Rinex3ClockHeader::versionString = "RINEX VERSION / TYPE";
60  const string Rinex3ClockHeader::runByString = "PGM / RUN BY / DATE";
61  const string Rinex3ClockHeader::commentString = "COMMENT";
62  const string Rinex3ClockHeader::sysString = "SYS / # / OBS TYPES";
63  const string Rinex3ClockHeader::timeSystemString = "TIME SYSTEM ID";
64  const string Rinex3ClockHeader::leapSecondsString = "LEAP SECONDS";
65  const string Rinex3ClockHeader::sysDCBString = "SYS / DCBS APPLIED";
66  const string Rinex3ClockHeader::sysPCVString = "SYS / PCVS APPLIED";
67  const string Rinex3ClockHeader::numDataString = "# / TYPES OF DATA";
68  const string Rinex3ClockHeader::stationNameString = "STATION NAME / NUM";
69  const string Rinex3ClockHeader::stationClockRefString ="STATION CLK REF";
70  const string Rinex3ClockHeader::analysisCenterString = "ANALYSIS CENTER";
71  const string Rinex3ClockHeader::numClockRefString = "# OF CLK REF";
72  const string Rinex3ClockHeader::analysisClkRefrString ="ANALYSIS CLK REF";
73  const string Rinex3ClockHeader::numReceiversString = "# OF SOLN STA / TRF";
74  const string Rinex3ClockHeader::solnStateString = "SOLN STA NAME / NUM";
75  const string Rinex3ClockHeader::numSolnSatsString = "# OF SOLN SATS";
76  const string Rinex3ClockHeader::prnListString = "PRN LIST";
77  const string Rinex3ClockHeader::endOfHeaderString = "END OF HEADER";
78 
79  // --------------------------------------------------------------------------------
80  void Rinex3ClockHeader::reallyGetRecord(FFStream& ffs)
81  {
82  Rinex3ClockStream& strm = dynamic_cast<Rinex3ClockStream&>(ffs);
83 
84  // if header is already read, just return
85  if(strm.headerRead) return;
86 
87  // clear the storage
88  clear();
89 
90  string line;
91  while(!(valid & endOfHeaderValid)) {
92  // get a line
93  strm.formattedGetLine(line);
94  stripTrailing(line);
95 
96  if(debug) cout << "Rinex3Clock Header Line " << line << endl;
97 
98  if(line.length() == 0) continue;
99  else if(line.length() < 60 || line.length() > 80) {
100  FFStreamError e("Invalid line length");
101  GNSSTK_THROW(e);
102  }
103 
104  // parse the line
105  try {
106  string label(line, 60, 20);
107  if(label == versionString) {
108  version = asDouble(line.substr(0,9));
109  if(line[20] != 'C') {
110  FFStreamError e("Invalid file type: " + line.substr(20,1));
111  GNSSTK_THROW(e);
112  }
113  fileSys = strip(line.substr(35,20));
114  valid |= versionValid;
115  }
116  else if(label == runByString) {
117  program = strip(line.substr(0,20));
118  runby = strip(line.substr(20,20));
119  //date = strip(line.substr(40,20));
120  valid |= runByValid;
121  }
122  else if(label == commentString) {
123  commentList.push_back(strip(line.substr(0,60)));
124  valid |= commentValid;
125  }
126  else if(label == sysString) {
127  string satSys = strip(line.substr(0,1));
128  if (satSys != "")
129  {
130  numObs = asInt(line.substr(3,3));
131  satSysPrev = satSys;
132  }
133  else
134  satSys = satSysPrev;
135 
136  try
137  {
138  const int maxObsPerLine = 13;
139  for (int i=0; i < maxObsPerLine && sysObsTypes[satSys].size() < numObs; i++)
140  sysObsTypes[satSys].push_back(
141  RinexObsID(satSys+line.substr(4 * i + 7, 3), version));
142  }
143  catch(InvalidParameter& ip)
144  {
145  FFStreamError fse("InvalidParameter: "+ip.what());
146  GNSSTK_THROW(fse);
147  }
148  valid |= sysValid;
149  }
150  else if(label == timeSystemString) {
151  string ts(upperCase(line.substr(3,3)));
152  timeSystem = gnsstk::StringUtils::asTimeSystem(ts);
153  valid |= timeSystemValid;
154  }
155  else if(label == leapSecondsString) {
156  leapSeconds = asInt(line.substr(0,6));
157  valid |= leapSecondsValid;
158  }
159  else if(label == sysDCBString)
160  {
161  string satstr(line.substr(0,1));
162  try
163  {
164  RinexSatID sat(satstr);
165  dcbsMap[satstr] =
166  stringPair(strip(line.substr(1,17)),
167  strip(line.substr(20,40)));
168  }
169  catch (Exception& exc)
170  {
171  FFStreamError e(exc);
172  e.addText("Invalid dcbs system : " + line.substr(0,1));
173  GNSSTK_THROW(e);
174  }
175  valid |= sysDCBValid;
176  }
177  else if(label == sysPCVString)
178  {
179  string satstr(line.substr(0,1));
180  try
181  {
182  RinexSatID sat(satstr);
183  pcvsMap[satstr] =
184  stringPair(strip(line.substr(1,17)),
185  strip(line.substr(20,40)));
186  }
187  catch (Exception& exc)
188  {
189  FFStreamError e(exc);
190  e.addText("Invalid pcvs system : " + line.substr(0,1));
191  GNSSTK_THROW(e);
192  }
193  valid |= sysPCVValid;
194  }
195  else if(label == numDataString) {
196  int n(asInt(line.substr(0,6)));
197  for(int i=0; i<n; ++i)
198  dataTypes.push_back(line.substr(10+i*6,2));
199  valid |= numDataValid;
200  }
201  else if(label == stationNameString) {
202  //string label(strip(line.substr(0,4)));
203  //stationID[label] = strip(line.substr(5,20));
204  valid |= stationNameValid;
205  }
206  else if(label == stationClockRefString) {
207  valid |= stationClockRefValid;
208  }
209  else if(label == analysisCenterString) {
210  analCenterDesignator = strip(line.substr(0,3));
211  analysisCenter = strip(line.substr(5,55));
212  valid |= analysisCenterValid;
213  }
214  else if(label == numClockRefString) {
215  valid |= numClockRefValid;
216  }
217  else if(label == analysisClkRefrString) {
218  valid |= analysisClkRefrValid;
219  }
220  else if(label == numReceiversString) {
221  numSolnStations = asInt(line.substr(0,6));
222  terrRefFrame = strip(line.substr(10,50));
223  valid |= numReceiversValid;
224  }
225  else if(label == solnStateString) {
226  string label(strip(line.substr(0,4)));
227  stationID[label] = strip(line.substr(5,20));
228  stationX[label] = strip(line.substr(25,11));
229  stationY[label] = strip(line.substr(37,11));
230  stationZ[label] = strip(line.substr(49,11));
231  valid |= solnStateValid;
232  }
233  else if(label == numSolnSatsString) {
234  numSolnSatellites = asInt(line.substr(0,6));
235  valid |= numSolnSatsValid;
236  }
237  else if(label == prnListString) {
238  int i,prn;
239  string label;
240  for(i=0; i<15; ++i) {
241  label = line.substr(4*i,3);
242  if(label == string(" "))
243  break;
244  try
245  {
246  RinexSatID sat(label);
247  satList.push_back(sat);
248  }
249  catch (Exception& exc)
250  {
251  FFStreamError e(exc);
252  e.addText("Invalid sat (PRN LIST): /" + label + "/");
253  GNSSTK_THROW(e);
254  }
255  }
257  valid |= prnListValid;
258  }
259  else if(label == endOfHeaderString) {
260  valid |= endOfHeaderValid;
261  }
262  else {
263  FFStreamError e("Invalid line label: " + label);
264  GNSSTK_THROW(e);
265  }
266 
267  if(debug) cout << "Valid is " << hex << valid << fixed << endl;
268 
269  } // end parsing the line
270  catch(FFStreamError& e) { GNSSTK_RETHROW(e); }
271 
272  } // end while end-of-header not found
273 
274  if(debug) cout << "Header read; Valid is " << hex << valid << fixed << endl;
275 
276  // is this header valid?
277  if( (valid & allRequiredValid) != allRequiredValid) {
278  cout << "Header is invalid on input (valid is x" << hex << valid
279  << dec << ").\n";
280  dumpValid(cout);
281  FFStreamError e("Invalid header");
282  GNSSTK_THROW(e);
283  }
284 
285  strm.headerRead = true;
286 
287  } // end Rinex3ClockHeader::reallyGetRecord()
288 
289 
290  void Rinex3ClockHeader::reallyPutRecord(FFStream& ffs) const
291  {
292  try {
293  Rinex3ClockStream& strm = dynamic_cast<Rinex3ClockStream&>(ffs);
294 
295  // is this header valid?
296  if( (valid & allRequiredValid) != allRequiredValid) {
297  FFStreamError e("Invalid header");
298  GNSSTK_THROW(e);
299  }
300 
301  size_t i;
302  string line;
303  try {
304  line = rightJustify(asString(version,2), 9);
305  line += string(11,' ');
306  line += string("CLOCK") + string(15,' ');
307  if (version >=3)
308  line += leftJustify(fileSys,20);
309  else
310  line += string(20,' ');
311  line += versionString; // "RINEX VERSION / TYPE"
312  strm << line << endl;
313  strm.lineNumber++;
314 
315  line = leftJustify(program,20);
316  line += leftJustify(runby,20);
317  CommonTime dt = SystemTime();
318  string dat;
319  if (version >= 3)
320  dat = printTime(dt,"%04Y/%02m/%02d %02H:%02M:%02S %4P");
321  else
322  dat = printTime(dt,"%02m/%02d/%04Y %02H:%02M:%02S");
323  line += leftJustify(dat, 20);
324  line += runByString; // "PGM / RUN BY / DATE"
325  strm << line << endl;
326  strm.lineNumber++;
327 
328  if(valid & sysValid && version >= 3) {
329  RinexObsMap::const_iterator it = sysObsTypes.begin();
330  for (;it != sysObsTypes.end(); it++)
331  {
332  static const int maxObsPerLine = 13;
333 
334  map<string,vector<RinexObsID> >::const_iterator mapIter;
335  for(mapIter = sysObsTypes.begin(); mapIter != sysObsTypes.end();
336  mapIter++)
337  {
338  int obsWritten = 0;
339  line = ""; // make sure the line contents are reset
340 
341  vector<RinexObsID> ObsTypeList = mapIter->second;
342 
343  for(size_t i = 0; i < ObsTypeList.size(); i++)
344  {
345  // the first line needs to have the GNSS type and # of obs
346  if(obsWritten == 0)
347  {
348  line = leftJustify(mapIter->first, 1);
349  line += string(2, ' ');
350  line += rightJustify(asString(ObsTypeList.size()), 3);
351  }
352  // if you hit 13, write out the line and start a new one
353  else if((obsWritten % maxObsPerLine) == 0)
354  {
355  line += string(2, ' ');
356  line += sysString;
357  strm << line << endl;
358  strm.lineNumber++;
359  line = string(6, ' ');
360  }
361  line += string(1, ' ');
362  line += rightJustify(ObsTypeList[i].asString(), 3);
363  obsWritten++;
364  }
365  line += string(60 - line.size(), ' ');
366  line += sysString;
367  strm << line << endl;
368  strm.lineNumber++;
369  }
370  }
371  }
372 
373  if(valid & timeSystemValid && version >= 3) {
374  line = string(3,' ');
375  line += leftJustify(gnsstk::StringUtils::asString(timeSystem),57);
376  line += timeSystemString; // "TIME SYSTEM ID"
377  strm << line << endl;
378  strm.lineNumber++;
379  }
380 
381  for(i=0; i<commentList.size(); ++i) {
382  line = leftJustify(commentList[i],60);
383  line += commentString; // "COMMENT"
384  strm << line << endl;
385  strm.lineNumber++;
386  }
387 
388  if(valid & leapSecondsValid) {
389  line = rightJustify(asString(leapSeconds), 6);
390  line += string(54,' ');
391  line += leapSecondsString; // "LEAP SECONDS"
392  strm << line << endl;
393  strm.lineNumber++;
394  }
395 
396  if(valid & sysDCBValid && version >= 3) {
397  std::map<std::string,stringPair>::const_iterator cbsCor;
398  for (cbsCor = dcbsMap.begin(); cbsCor != dcbsMap.end(); cbsCor++)
399  {
400  line = leftJustify(cbsCor->first,2);
401  line += leftJustify(cbsCor->second.first,18);
402  line += leftJustify(cbsCor->second.second,40);
403  line += sysDCBString; // "SYS / DCBS APPLIED"
404  strm << line << endl;
405  strm.lineNumber++;
406  }
407  }
408 
409  if(valid & sysPCVValid && version >= 3) {
410  std::map<std::string,stringPair>::const_iterator pcCor;
411  for (pcCor = pcvsMap.begin(); pcCor != pcvsMap.end(); pcCor++)
412  {
413  line = leftJustify(pcCor->first,2);
414  line += leftJustify(pcCor->second.first,18);
415  line += leftJustify(pcCor->second.second,40);
416  line += sysPCVString; // "SYS / PCVS APPLIED"
417  strm << line << endl;
418  strm.lineNumber++;
419  }
420  }
421 
422  line = rightJustify(asString(dataTypes.size()), 6);
423  for(i=0; i<dataTypes.size(); ++i)
424  line += string(4,' ') + dataTypes[i];
425  line += string(60-line.size(),' ');
426  line += numDataString; // "# / TYPES OF DATA"
427  strm << line << endl;
428  strm.lineNumber++;
429 
430  //@todo line += stationNameString; // "STATION NAME / NUM"
431  //strm << line << endl;
432  //strm.lineNumber++;
433 
434  //@todo line += stationClockRefString; // "STATION CLK REF"
435  //strm << line << endl;
436  //strm.lineNumber++;
437 
438  line = analCenterDesignator;
439  line += string(2,' ');
440  line += leftJustify(analysisCenter,55);
441  line += analysisCenterString; // "ANALYSIS CENTER"
442  strm << line << endl;
443  strm.lineNumber++;
444 
445  //line += numClockRefString; // "# OF CLK REF"
446  //strm << line << endl;
447  //strm.lineNumber++;
448 
449  //line += analysisClkRefrString; // "ANALYSIS CLK REF"
450  //strm << line << endl;
451  //strm.lineNumber++;
452 
453  line = rightJustify(asString(numSolnStations), 6);
454  line += string(4,' ');
455  line += leftJustify(terrRefFrame,50);
456  line += numReceiversString; // "# OF SOLN STA / TRF"
457  strm << line << endl;
458  strm.lineNumber++;
459 
460  map<string,string>::const_iterator it, jt;
461  for(it=stationID.begin(); it != stationID.end(); ++it) {
462  string label(it->first),field;
463  line = label;
464  line += string(1,' ');
465  line += leftJustify(it->second,20);
466  jt = stationX.find(label);
467  field = jt->second;
468  line += rightJustify(field, 11);
469  line += string(1,' ');
470  jt = stationY.find(label);
471  field = jt->second;
472  line += rightJustify(field, 11);
473  line += string(1,' ');
474  jt = stationZ.find(label);
475  field = jt->second;
476  line += rightJustify(field, 11);
477  line += solnStateString; // "SOLN STA NAME / NUM"
478  strm << line << endl;
479  strm.lineNumber++;
480  }
481 
482  line = rightJustify(asString(numSolnSatellites), 6);
483  line += string(54,' ');
484  line += numSolnSatsString; // "# OF SOLN SATS"
485  strm << line << endl;
486  strm.lineNumber++;
487 
488  line = string();
489  for(i=0; i<satList.size(); ++i) {
490  string satstr(" ");
491  satstr[0] = satList[i].systemChar();
492  satstr += rightJustify(asString(satList[i].id), 2);
493  if(satstr[1] == ' ') satstr[1] = '0';
494  line += satstr + string(1,' ');
495  if(((i+1) % 15) == 0 || i==satList.size()-1) {
496  line += string(60-line.size(),' ');
497  line += prnListString; // "PRN LIST"
498  strm << line << endl;
499  strm.lineNumber++;
500  line = string();
501  }
502  }
503 
504  line = string(60,' ');
505  line += endOfHeaderString; // "END OF HEADER"
506  strm << line << endl;
507  strm.lineNumber++;
508  }
509  catch(FFStreamError& e) { GNSSTK_RETHROW(e); }
510  catch(StringException& e) { GNSSTK_RETHROW(e); }
511 
512  }
513  catch(Exception& e) { GNSSTK_RETHROW(e); }
514  catch(exception& e) { Exception g(e.what()); GNSSTK_THROW(g); }
515  }
516 
517 
518  void Rinex3ClockHeader::dump(ostream& os, short detail) const noexcept
519  {
520  size_t i;
521  os << "Dump Rinex3Clock Header:\n";
522  os << " Version = " << fixed << setprecision(2) << version
523  << " Prgm /" << program << "/ Run By /" << runby << "/" << endl;
524  os << " There are " << dataTypes.size() << " data types, as follows:";
525  for(i=0; i<dataTypes.size(); ++i)
526  os << " " << dataTypes[i];
527  os << endl;
528  os << " Leap seconds is " << leapSeconds << endl;
529  os << " Analysis center: /" << analCenterDesignator
530  << "/ /" << analysisCenter << "/" << endl;
531  os << " Terrestrial Reference Frame " << terrRefFrame << endl;
532  std::map<std::string,stringPair>::const_iterator dcbs;
533  for (dcbs = dcbsMap.begin(); dcbs != dcbsMap.end(); dcbs++)
534  {
535  os << " DCBs: " << dcbs->first << " /" << dcbs->second.first << "/ /"
536  << dcbs->second.second << "/" << endl;
537  }
538  std::map<std::string,stringPair>::const_iterator pcvs;
539  for (pcvs = pcvsMap.begin(); pcvs != pcvsMap.end(); pcvs++)
540  {
541  os << " PCVs: " << pcvs->first << " /" << pcvs->second.first << "/ /"
542  << pcvs->second.second << "/" << endl;
543  }
544  os << " Comments:\n";
545  for(i=0; i<commentList.size(); ++i)
546  os << " " << commentList[i] << endl;
547  os << " There are " << stationID.size() << " stations." << endl;
548  os << " There are " << satList.size() << " satellites." << endl;
549  if(detail > 0) {
550  os << " Stations: identifier X(mm) Y(mm) Z(mm)\n";
551  map<string,string>::const_iterator it, jt;
552  for(it=stationID.begin(); it!=stationID.end(); ++it) {
553  string label(it->first),field;
554  os << " " << label << " " << it->second;
555  jt = stationX.find(label);
556  field = jt->second;
557  os << rightJustify(field,12);
558  jt = stationY.find(label);
559  field = jt->second;
560  os << rightJustify(field,12);
561  jt = stationZ.find(label);
562  field = jt->second;
563  os << rightJustify(field,12) << endl;
564  }
565  os << " Sat list:\n";
566  for(i=0; i<satList.size(); ++i) {
567  os << " " << satList[i];
568  if(((i+1)%15) == 0 || i == satList.size()-1) os << endl;
569  }
570 
571  if(detail >= 2) dumpValid(os);
572  }
573 
574  os << "End of Rinex3Clock header dump." << endl;
575 
576  } // end Rinex3ClockHeader::dump()
577 
578  void Rinex3ClockHeader::dumpValid(ostream& os) const noexcept
579  {
580  if( (valid & allValid) == allValid) return;
581  string tag(" Invalid or missing header line: ");
582  os << "Dump invalid or missing header records:\n";
583  if(!(valid & versionValid)) os << tag << versionString << endl;
584  if(!(valid & runByValid)) os << tag << runByString << endl;
585  if(!(valid & commentValid)) os << tag << commentString << endl;
586  if(!(valid & sysValid)) os << tag << sysString << endl;
587  if(!(valid & timeSystemValid)) os << tag << timeSystemString << endl;
588  if(!(valid & leapSecondsValid)) os << tag << leapSecondsString << endl;
589  if(!(valid & sysDCBValid)) os << tag << sysDCBString << endl;
590  if(!(valid & sysPCVValid)) os << tag << sysPCVString << endl;
591  if(!(valid & numDataValid)) os << tag << numDataString << endl;
592  if(!(valid & stationNameValid)) os << tag << stationNameString << endl;
593  if(!(valid & stationClockRefValid)) os << tag << stationClockRefString << endl;
594  if(!(valid & analysisCenterValid)) os << tag << analysisCenterString << endl;
595  if(!(valid & numClockRefValid)) os << tag << numClockRefString << endl;
596  if(!(valid & analysisClkRefrValid)) os << tag << analysisClkRefrString << endl;
597  if(!(valid & numReceiversValid)) os << tag << numReceiversString << endl;
598  if(!(valid & solnStateValid)) os << tag << solnStateString << endl;
599  if(!(valid & numSolnSatsValid)) os << tag << numSolnSatsString << endl;
600  if(!(valid & prnListValid)) os << tag << prnListString << endl;
601  if(!(valid & endOfHeaderValid)) os << tag << endOfHeaderString << endl;
602  os << "End of invalid or missing dump" << endl;
603  }
604 
605 } // namespace
gnsstk::dump
void dump(vector< SatPass > &SatPassList, ostream &os, bool rev, bool dbug)
Definition: SatPassUtilities.cpp:59
gnsstk::StringUtils::upperCase
std::string & upperCase(std::string &s)
Definition: StringUtils.hpp:2117
gnsstk::StringUtils::asInt
long asInt(const std::string &s)
Definition: StringUtils.hpp:713
gnsstk::Rinex3ClockStream
Definition: Rinex3ClockStream.hpp:59
gnsstk::FFStream
Definition: FFStream.hpp:119
StringUtils.hpp
gnsstk::Rinex3ClockStream::headerRead
bool headerRead
true if the header has been read
Definition: Rinex3ClockStream.hpp:80
gnsstk::FFTextStream::formattedGetLine
void formattedGetLine(std::string &line, const bool expectEOF=false)
Definition: FFTextStream.cpp:149
Rinex3ClockStream.hpp
gnsstk::FFTextStream::lineNumber
unsigned int lineNumber
Definition: FFTextStream.hpp:98
gnsstk::StringUtils::asString
std::string asString(IonexStoreStrategy e)
Convert a IonexStoreStrategy to a whitespace-free string name.
Definition: IonexStoreStrategy.cpp:46
gnsstk
For Sinex::InputHistory.
Definition: BasicFramework.cpp:50
gnsstk::Exception
Definition: Exception.hpp:151
gnsstk::StringUtils::stripTrailing
std::string & stripTrailing(std::string &s, const std::string &aString, std::string::size_type num=std::string::npos)
Definition: StringUtils.hpp:1453
gnsstk::StringUtils::asTimeSystem
TimeSystem asTimeSystem(const std::string &s)
Convert a string representation of TimeSystem to an enum.
Definition: TimeSystem.cpp:324
debug
#define debug
Definition: Rinex3ClockHeader.cpp:51
SystemTime.hpp
gnsstk::SystemTime
Definition: SystemTime.hpp:54
gnsstk::CommonTime
Definition: CommonTime.hpp:84
version
string version(string("2.4 9/23/15 rev"))
example6.valid
valid
Definition: example6.py:20
gnsstk::RinexObsID
Definition: RinexObsID.hpp:102
gnsstk::StringUtils::asDouble
double asDouble(const std::string &s)
Definition: StringUtils.hpp:705
Rinex3ClockHeader.hpp
GNSSTK_RETHROW
#define GNSSTK_RETHROW(exc)
Definition: Exception.hpp:369
gnsstk::StringUtils::rightJustify
std::string & rightJustify(std::string &s, const std::string::size_type length, const char pad=' ')
Definition: StringUtils.hpp:1557
gnsstk::printTime
std::string printTime(const CommonTime &t, const std::string &fmt)
Definition: TimeString.cpp:64
gnsstk::RinexSatID
Definition: RinexSatID.hpp:63
CommonTime.hpp
std
Definition: Angle.hpp:142
gnsstk::StringUtils::strip
std::string & strip(std::string &s, const std::string &aString, std::string::size_type num=std::string::npos)
Definition: StringUtils.hpp:1482
gnsstk::StringUtils::leftJustify
std::string & leftJustify(std::string &s, const std::string::size_type length, const char pad=' ')
Definition: StringUtils.hpp:1582
GNSSTK_THROW
#define GNSSTK_THROW(exc)
Definition: Exception.hpp:366
gnsstk::Rinex3ClockHeader::stringPair
std::pair< std::string, std::string > stringPair
Definition: Rinex3ClockHeader.hpp:191
TimeString.hpp


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