00001 #pragma ident "$Id: SatDataReader.cpp 1718 2009-02-22 11:19:26Z architest $"
00002
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "SatDataReader.hpp"
00034
00035
00036 namespace gpstk
00037 {
00038
00039
00040 void SatDataReader::loadData(void)
00041 throw(FFStreamError, gpstk::StringUtils::StringException)
00042 {
00043
00044
00045 while(1)
00046 {
00047 try
00048 {
00049 std::string line;
00050
00051 formattedGetLine(line, true);
00052
00053
00054 if (line.size()>255)
00055 {
00056 FFStreamError e("Line too long");
00057 GPSTK_THROW(e);
00058 }
00059
00060
00061 if( StringUtils::firstWord(line)[0] == '#' )
00062 {
00063 formattedGetLine(line, true);
00064 }
00065
00066 std::string::size_type idx = line.find('#');
00067 if( !(idx == std::string::npos) )
00068 {
00069 line = line.substr(0, idx);
00070 }
00071
00072
00073 if( StringUtils::firstWord(line) == "Launch" )
00074 {
00075 formattedGetLine(line, true);
00076 }
00077
00078
00079 line = StringUtils::strip(line);
00080
00081
00082 if (line.size()==0)
00083 {
00084 continue;
00085 }
00086
00087
00088
00089 string ldate(StringUtils::stripFirstWord(line));
00090
00091 string ddate(StringUtils::stripFirstWord(line));
00092
00093 string gnumber(StringUtils::stripFirstWord(line));
00094
00095 string prn(StringUtils::stripFirstWord(line));
00096
00097 string block(StringUtils::upperCase(
00098 StringUtils::stripFirstWord(line)));
00099
00100
00101
00102 SatID sat(StringUtils::asInt(prn),SatID::systemUnknown);
00103
00104 if(block[0] == 'I')
00105 {
00106 sat.system = SatID::systemGPS;
00107 }
00108 else
00109 {
00110 if (block.substr(0, 3) == "GLO")
00111 {
00112 sat.system = SatID::systemGlonass;
00113 }
00114 }
00115
00116
00117 SatDataReader::svData data;
00118
00119 data.block = block;
00120 data.gpsNumber = StringUtils::asInt(gnumber);
00121
00122
00123 if(ldate[0] != '0')
00124 {
00125 ldate = StringUtils::translate(ldate, "-", " ");
00126 data.launchDate.setToString(ldate, "%Y %m %d");
00127 }
00128
00129
00130 if(ddate[0] != '0')
00131 {
00132 ddate = StringUtils::translate(ddate, "-", " ");
00133 data.deactivationDate.setToString(ddate, "%Y %m %d");
00134 }
00135
00136
00137
00138 setData(sat, data);
00139
00140 }
00141 catch (EndOfFile& e)
00142 {
00143
00144 (*this).close();
00145
00146 return;
00147 }
00148 catch (...)
00149 {
00150
00151 (*this).close();
00152
00153 return;
00154 }
00155
00156 }
00157
00158 }
00159
00160
00161
00162
00163 void SatDataReader::open(const char* fn)
00164 {
00165
00166
00167 (*this).close();
00168
00169
00170 FFTextStream::open(fn, std::ios::in);
00171
00172
00173 loadData();
00174
00175 return;
00176
00177 }
00178
00179
00180
00181 void SatDataReader::open(const string& fn)
00182 {
00183
00184
00185 (*this).close();
00186
00187
00188 FFTextStream::open(fn.c_str(), std::ios::in);
00189
00190
00191 loadData();
00192
00193 return;
00194
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 string SatDataReader::getBlock(const SatID& sat,
00209 const DayTime& epoch) const
00210 {
00211
00212
00213 pair<satDataIt, satDataIt> range = SatelliteData.equal_range(sat);
00214
00215
00216 if(range.first == range.second)
00217 {
00218 return "";
00219 }
00220
00221
00222 satDataIt iter(range.first);
00223
00224
00225 if( (*iter).second.launchDate > epoch )
00226 {
00227 return "";
00228 }
00229
00230
00231 while( (*iter).second.deactivationDate < epoch )
00232 {
00233 ++iter;
00234 }
00235
00236
00237 if( (*iter).second.launchDate > epoch )
00238 {
00239 return "";
00240 }
00241
00242
00243 return ((*iter).second.block);
00244
00245 }
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258 int SatDataReader::getGPSNumber(const SatID& sat,
00259 const DayTime& epoch) const
00260 {
00261
00262
00263 pair<satDataIt, satDataIt> range = SatelliteData.equal_range(sat);
00264
00265
00266 if(range.first == range.second)
00267 {
00268 return -1;
00269 }
00270
00271
00272 satDataIt iter(range.first);
00273
00274
00275 if( (*iter).second.launchDate > epoch )
00276 {
00277 return -1;
00278 }
00279
00280
00281 while( (*iter).second.deactivationDate < epoch )
00282 {
00283 ++iter;
00284 }
00285
00286
00287 if( (*iter).second.launchDate > epoch )
00288 {
00289 return -1;
00290 }
00291
00292
00293 return ((*iter).second.gpsNumber);
00294
00295 }
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308 DayTime SatDataReader::getLaunchDate(const SatID& sat,
00309 const DayTime& epoch) const
00310 {
00311
00312
00313 pair<satDataIt, satDataIt> range = SatelliteData.equal_range(sat);
00314
00315
00316 if(range.first == range.second)
00317 {
00318 return DayTime::END_OF_TIME;
00319 }
00320
00321
00322 satDataIt iter(range.first);
00323
00324
00325 if( (*iter).second.launchDate > epoch )
00326 {
00327 return DayTime::END_OF_TIME;
00328 }
00329
00330
00331 while( (*iter).second.deactivationDate < epoch )
00332 {
00333 ++iter;
00334 }
00335
00336
00337 if( (*iter).second.launchDate > epoch )
00338 {
00339 return DayTime::END_OF_TIME;
00340 }
00341
00342 return ((*iter).second.launchDate);
00343
00344 }
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358 DayTime SatDataReader::getDeactivationDate(const SatID& sat,
00359 const DayTime& epoch) const
00360 {
00361
00362
00363 pair<satDataIt, satDataIt> range = SatelliteData.equal_range(sat);
00364
00365
00366 if(range.first == range.second)
00367 {
00368 return DayTime::BEGINNING_OF_TIME;
00369 }
00370
00371
00372 satDataIt iter(range.first);
00373
00374
00375 if( (*iter).second.launchDate > epoch )
00376 {
00377 return DayTime::BEGINNING_OF_TIME;
00378 }
00379
00380
00381 while( (*iter).second.deactivationDate < epoch )
00382 {
00383 ++iter;
00384 }
00385
00386
00387 if( (*iter).second.launchDate > epoch )
00388 {
00389 return DayTime::BEGINNING_OF_TIME;
00390 }
00391
00392 return ((*iter).second.deactivationDate);
00393
00394 }
00395
00396
00397
00398 }