Changeset 342 in Sophya for trunk/Poubelle/archTOI.old/toiiter.cc
- Timestamp:
- Aug 2, 1999, 3:45:52 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Poubelle/archTOI.old/toiiter.cc
r315 r342 2 2 #include "toiinterpolator.h" 3 3 #include <dirent.h> 4 #include <iostream.h> 4 5 5 6 // Format bloc GPS … … 14 15 fileName = ""; 15 16 17 files.clear(); 18 19 isOnBoardRecorder = false; 20 21 imes=0; 22 16 23 tStart = -9.e99; 17 tEnd = -9.e99;24 tEnd = 9.e99; 18 25 19 26 tBlock0 = -1; 20 27 perEch = -1; 28 29 trigMask = 0; 21 30 rawIter = NULL; 22 31 interp = NULL; 23 32 lastSample = -1; 24 maxLookAhead = 1000 ;33 maxLookAhead = 10000; 25 34 26 35 } … … 30 39 fileName = x.fileName; 31 40 files = x.files; 32 curFile = x.curFile; 41 // curFile = x.curFile; // $CHECK$ DANGER !! 42 curFile = files.find(*(x.curFile)); 43 isOnBoardRecorder = x.isOnBoardRecorder; 33 44 imes = x.imes; 34 45 tStart = x.tStart; 35 46 tEnd = x.tEnd; 36 47 tBlock0 = x.tBlock0; 48 perEch = x.perEch; 37 49 trigMask = x.trigMask; 38 50 infos = x.infos; … … 63 75 } 64 76 77 #ifdef __MWERKS__ 78 #define filesep ':' 79 #else 80 #define filesep '/' 81 #endif 82 65 83 void TOIIter::Init() { 66 67 // $CHECK$ a deplacer, pour gerer repertoires... 84 // On a soit un repertoire, soit un fichier, soit une liste de fichiers.... 68 85 if (directory == "") { 69 file = new ArcheopsFile(fileName); 70 } else { 86 if (files.empty()) { // un seul fichier 87 file = new ArcheopsFile(fileName); 88 } else { 89 curFile = files.begin(); 90 file = new ArcheopsFile((*curFile).c_str()); 91 } 92 } else { // On a un repertoire a explorer 93 // On cherche soit les fichiers dans le repertoire donne, soit des fichiers 94 // dans un sous-repertoire "arch-YY_MM_DD". Les fichiers ont un nom en 95 // "hYY_MM_DD-hh_mm_ss". 96 // Pour l'enregistreur de vol, les fichiers ont un nom en ARKxxxxxx.DAT 97 if (directory[directory.length()-1] != filesep) 98 directory += filesep; 71 99 DIR* dir = opendir(directory.c_str()); 72 100 struct dirent* ent; 73 101 while ((ent = readdir(dir)) != NULL) { 74 files.insert(ent->d_name); 102 // si c'est un repertoire, avec un nom de jour, il faut l'explorer... 103 if (!strncmp(ent->d_name, "arch-", 5)) { 104 double mjd = ArcheopsFile::decodeMJD(ent->d_name+5) - 2./24.; // ENTIER + .5 en temps local! 105 if (mjd >= tStart - 1. && mjd <= tEnd) { 106 string direc2 = directory + ent->d_name + filesep; 107 DIR* dir2 = opendir(direc2.c_str()); 108 struct dirent* ent2; 109 while ((ent2 = readdir(dir2)) != NULL) { 110 if (*ent2->d_name == 'h') { 111 double mjd2 = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.; 112 if (mjd2 >= tStart - 1./24. && mjd2 <= tEnd) { 113 files.insert(direc2 + ent2->d_name); 114 } 115 } 116 } 117 } 118 } else { 119 if (!isOnBoardRecorder && *ent->d_name == 'h') { 120 double mjd = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.; // $CHECK$ UTCOffset 121 if (mjd >= tStart - 1./24. && mjd <= tEnd) { 122 files.insert(directory + ent->d_name); 123 } 124 } else if (isOnBoardRecorder) { 125 if (strncmp(ent->d_name, "ARK", 3)) continue; 126 char * sfx = ent->d_name + strlen(ent->d_name) - 4; 127 if (strcmp(sfx, ".DAT")) continue; 128 files.insert(directory + ent->d_name); 129 } 130 } 75 131 } 76 132 closedir(dir); … … 79 135 } 80 136 81 if (!file->lastParam()) file->nextBlock(block_param_mask); 137 // On avance jusqu'a avoir au moins un bloc param et un bloc reglage, 138 // car on ne peut rien faire sans... 139 // Si on a des donnees de l'enregistreur de vol, pas de bloc param, et 140 // on en simule un 141 if (!file->lastParam()) { 142 if (isOnBoardRecorder) { 143 extern param_bolo parametr; 144 block_type_param block; 145 block.param = parametr; 146 valide_block((block_type_modele*)&block, block_param, 0); 147 file->forceBlock((block_type_modele*)&block); 148 } else { 149 file->nextBlock(block_param_mask); 150 } 151 } 82 152 if (!file->lastReglage()) file->nextBlock(block_reglage_mask); 83 153 84 154 // On cherche un bloc GPS pour avoir la correspondance timestamp/UTC. 85 155 // Pour le moment, on se fonde sur le premier bloc GPS. On pourra faire 86 // mieux en prenant le min de tous les delta_T. 87 88 tBlock0 = file->getStartMJD(); 89 90 file->pushMark(); 91 if (file->lastGPS() || file->nextBlock(block_gps_mask)) { 92 // le temps du bloc courant, en secondes 93 double dt = file->blockNum() * file->perBlock(); 94 tBlock0 = file->getGPSMJD() - dt/86400.; 95 } else { // pas de bloc GPS... 156 // mieux en prenant le min de tous les delta_T, a condition d'avoir un 157 // peu plus de details sur la facon dont le GPS est lu. 158 159 if (tBlock0 < 0) { 96 160 tBlock0 = file->getStartMJD(); 97 } 98 file->popMark(); 161 162 file->pushMark(); 163 if (file->lastGPS() || file->nextBlock(block_gps_mask)) { 164 // le temps du bloc courant, en secondes 165 double dt = file->blockNum() * file->perBlock(); 166 tBlock0 = file->getGPSMJD() - dt/86400.; 167 } else { // pas de bloc GPS... 168 tBlock0 = file->getStartMJD(); 169 } 170 file->popMark(); 171 } 172 173 if (perEch < 0) 174 perEch = file->perEchant(); 99 175 100 176 bool hasInterp = false; … … 109 185 trigMask |= block_bolo_mask; 110 186 break; 187 case gpsTime: 111 188 case longitude: 112 189 case latitude: 190 case altitude: 113 191 trigMask |= block_gps_mask; 114 192 break; … … 125 203 file->needSSTProcessMask(SSTHandler::rmveOffset); 126 204 trigMask |= block_sst_mask; 205 break; 206 case sstRaw: 207 trigMask |= block_sst_mask; 208 break; 209 case gyroRaw: 210 trigMask |= block_gyro_mask; 127 211 break; 128 212 case alphaAxis: … … 157 241 return rawIter->NextFile(); 158 242 159 if ( directory == "") {243 if (files.empty()) { 160 244 return false; 161 245 } else { … … 163 247 curFile++; 164 248 if (curFile == files.end()) return false; 249 cout << "opening file " << (*curFile).c_str() << endl; 165 250 ArcheopsFile* newfile = new ArcheopsFile((*curFile).c_str()); 166 251 newfile->grabLastBlocs(*file); … … 242 327 return true; 243 328 case boloTens: 329 if (imes==0 && file->llastBolo()==NULL) return false; 330 return file->lastBolo() != NULL; 244 331 case boloRaw: 245 332 return file->lastBolo() != NULL; 246 333 case sstSignal: 334 case sstRaw: 247 335 return file->lastSST() != NULL; 336 case sstStarZ: 337 case sstStarF: 338 return (file->lastSST() != NULL) && (file->getSSTStarZ(index, imes) >= 0); 339 case gyroRaw: 340 return (file->lastGyro() != NULL); 341 case gpsTime: 342 return file->hasGPSTime(); 248 343 case longitude: 249 344 case latitude: 250 return file->lastGPS() != NULL; 345 return file->hasGPSPos(); 346 case altitude: 347 return file->hasGPSAlt(); 251 348 case azimut: 252 349 case alphaAxis: … … 271 368 return file->blockNum() * file->nEchBlock() + imes; 272 369 case internalTime: 273 return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant(); 370 //return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant(); 371 return (file->blockNum() * file->nEchBlock() + imes) * perEch; 274 372 case utc: 275 373 /* printf("utc: %d %d %g %g %g\n",file->blockNum(), … … 278 376 (file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400., 279 377 tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.); */ 280 return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.; 378 //return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.; 379 return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * perEch/86400.; 281 380 case boloTens: 282 381 return file->getMuVBolo(index, imes); … … 285 384 case sstSignal: 286 385 return file->getSSTSignal(index, imes); 386 case sstRaw: 387 return file->getSSTRawSignal(index, imes); 388 case sstStarZ: 389 return file->getSSTStarZ(index, imes); 390 case sstStarF: 391 return file->getSSTStarF(index, imes); 392 case gyroRaw: 393 return file->getGyro(index, imes); 394 case gpsTime: 395 return file->getGPSUTC(); 287 396 case longitude: 288 return file->getGPSLong(); // $CHECK$ TBD gerer interpolation (dans file)397 return file->getGPSLong(); 289 398 case latitude: 290 return file->getGPSLat(); // $CHECK$ TBD gerer interpolation (dans file) 399 return file->getGPSLat(); 400 case altitude: 401 return file->getGPSAlt(); 291 402 case azimut: 292 403 return file->getAzimut(imes); … … 301 412 bool TOIIter::newValue(int column) { 302 413 if (column < 0 || column >= infos.size()) return false; 414 if (rawIter) { 415 return interp[column].isNewValue(lastSample); 416 } 303 417 TOIKind kind = infos[column].kind; 304 418 switch (kind) { … … 311 425 case boloRaw: 312 426 return file->blockNum() == file->getBoloBlockNum(); 427 case sstRaw: 313 428 case sstSignal: 429 case sstStarZ: 430 case sstStarF: 314 431 return file->blockNum() == file->getSSTBlockNum(); 432 case gyroRaw: 433 return file->blockNum() == file->getGyroBlockNum(); 434 case gpsTime: 435 return file->blockNum() == file->getGPSBlockNum() && imes==0; 315 436 case longitude: 316 437 return file->blockNum() == file->getGPSBlockNum() && imes==0; 317 438 case latitude: 439 return file->blockNum() == file->getGPSBlockNum() && imes==0; 440 case altitude: 318 441 return file->blockNum() == file->getGPSBlockNum() && imes==0; 319 442 case azimut: … … 334 457 return (infos[column].interpolated && !newValue(column)); 335 458 } 459 460 bool TOIIter::isTrig(int column) { 461 if (column < 0 || column >= infos.size()) return false; 462 return infos[column].triggering; 463 } 464 336 465 337 466 TOIKind TOIIter::getKind(int column) { … … 370 499 371 500 int TOIIter::getSampleIndex() { 372 return file->blockNum() * file->nEchBlock() + imes; 501 if (file) { 502 return file->blockNum() * file->nEchBlock() + imes; 503 } else { 504 return lastSample; 505 } 373 506 } 374 507 … … 378 511 long sample = rawIter->getSampleIndex(); 379 512 for (int i=0; i<infos.size(); i++) { 380 if (rawIter->canGetValue(i) && rawIter->newValue(i)) 513 if (rawIter->canGetValue(i) && rawIter->newValue(i)) { 381 514 interp[i].enterValue(rawIter->getValue(i), sample); 515 } 382 516 } 383 517 return true; 384 518 } 385 519 520 block_type_param* TOIIter::lastParam() { 521 if (file) return file->lastParam(); 522 else return rawIter->lastParam(); 523 } 524 525
Note:
See TracChangeset
for help on using the changeset viewer.