Changeset 315 in Sophya for trunk/Poubelle/archTOI.old/archeopsfile.cc
- Timestamp:
- Jun 15, 1999, 3:53:04 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Poubelle/archTOI.old/archeopsfile.cc
r310 r315 1 1 #define utilitaires_de_block_archeops 2 2 #include "archeopsfile.h" 3 extern "C" { 3 4 #include "compress.h" 5 } 4 6 #include <iostream.h> 7 8 // BlockSet is the current "state" of the file reader automate. 9 // It contains the last blocks of each kind, the current block and 10 // the look-ahead block. 5 11 6 12 class BlockSet { … … 27 33 block_type_gyro_comprime* lastGyroComp; 28 34 block_type_sst_comprime* lastSSTComp; 35 36 block_type_modele curBlock; 37 block_type_modele peekBlock; 38 39 SSTHandler sstHandler; 29 40 }; 30 41 … … 45 56 lastGyroComp = NULL; 46 57 lastSSTComp = NULL; 58 59 memset(&curBlock,0,sizeof(block_type_modele)); 60 memset(&peekBlock,0,sizeof(block_type_modele)); 47 61 } 48 62 … … 65 79 } 66 80 67 BlockSet::BlockSet(BlockSet const& x) { 81 BlockSet::BlockSet(BlockSet const& x) 82 : sstHandler(x.sstHandler) 83 { 68 84 lastParam = NULL; 69 85 lastJournal = NULL; … … 81 97 lastGyroComp = NULL; 82 98 lastSSTComp = NULL; 99 83 100 if (x.lastParam) { 84 101 lastParam = new block_type_param; … … 141 158 *lastSSTComp = *x.lastSSTComp; 142 159 } 160 161 memcpy(&curBlock,&x.curBlock,sizeof(block_type_modele)); 162 memcpy(&peekBlock,&x.peekBlock,sizeof(block_type_modele)); 163 143 164 } 144 165 … … 232 253 fseek(f,0,SEEK_END); 233 254 fLen = ftell(f); 234 curPos = 0; 255 curPos = -1; 256 peekPos = -1; 235 257 curKind = -1; 236 258 curRawKind = -1; … … 256 278 } 257 279 258 curBlock = x.curBlock;280 //curBlock = x.curBlock; 259 281 curKind = x.curKind; 260 282 curRawKind = x.curRawKind; 261 283 curPos = x.curPos; 284 peekPos = x.peekPos; 262 285 fLen = x.fLen; 263 286 fn = x.fn; … … 275 298 delete blockSet; 276 299 blockSet = new BlockSet(*oldFile.blockSet); 300 //curBlock = oldFile.curBlock; 301 //peekBlock = oldFile.peekBlock; 302 peekPos = 0; 277 303 setUTCOffset(oldFile.utcOffset); 278 304 } … … 282 308 283 309 bool ArcheopsFile::nextBlock() { 284 //if (curPos>0) saveCurBlock(); 285 //if (curPos<0) curPos = 0; 286 if (curPos+12 > fLen) return false; 287 fseek(f,curPos,SEEK_SET); 288 size_t read = fread(&curBlock,1,sizeof(curBlock),f); 289 if (read < longueur_block(&curBlock)) return false; 290 if (verifie_block(&curBlock) != block_correct) { 310 // si pas de peek, alors en lire un pour commencer... 311 if (peekPos<0) { 312 peekPos=0; if (!nextBlock()) return false; 313 } 314 block_type_modele* curBlock=currentBlock(); 315 block_type_modele* peekBlock=aheadBlock(); 316 317 memcpy(curBlock, peekBlock, sizeof(block_type_modele)); 318 319 if (peekPos+12 > fLen) return false; 320 fseek(f,peekPos,SEEK_SET); 321 size_t read = fread(peekBlock,1,sizeof(block_type_modele),f); 322 swapEntete(peekBlock); 323 if (read < longueur_block(peekBlock)) return false; 324 swapContent(peekBlock); 325 if (verifie_block(peekBlock) != block_correct) { 291 326 printf("block invalide\n"); throw ArchExc("invalid block"); 292 327 } 293 curRawKind = curKind = type_block(&curBlock); 294 curPos += longueur_block(&curBlock); 328 peekPos += longueur_block(peekBlock); 329 if (curPos < 0) { 330 curPos = 0; return true; 331 } 332 curPos += longueur_block(curBlock); 333 curRawKind = curKind = type_block(curBlock); 295 334 //printf("block %d : %s \n",numero_block(&curBlock),nom_block[curKind]); 296 335 postProcessBlock(); … … 316 355 317 356 int ArcheopsFile::blockNum() { 318 return numero_block( &curBlock);357 return numero_block(currentBlock()); 319 358 } 320 359 … … 348 387 349 388 block_type_modele* ArcheopsFile::currentBlock() { 350 if (curPos<0) return NULL; 351 return &curBlock; 352 } 389 //if (curPos<0) return NULL; 390 return &blockSet->curBlock; 391 } 392 393 block_type_modele* ArcheopsFile::aheadBlock() { 394 //if (peekPos<0) return NULL; 395 return &blockSet->peekBlock; 396 } 397 398 bool ArcheopsFile::sameBlockNumAhead() { 399 if (curPos<0) return false; 400 return (numero_block(&blockSet->curBlock) == numero_block(&blockSet->peekBlock)); 401 } 402 353 403 354 404 block_type_param* ArcheopsFile::lastParam() { … … 401 451 switch (curKind) { 402 452 case block_bolo_comprime: { 403 blockSet->setRawBloc( curBlock);453 blockSet->setRawBloc(blockSet->curBlock); 404 454 block_type_bolo blk2; 405 block_type_bolo_comprime* blk = (block_type_bolo_comprime*) & curBlock;455 block_type_bolo_comprime* blk = (block_type_bolo_comprime*) &blockSet->curBlock; 406 456 for(int j=0;j<nb_bolo_util;j++) 407 457 { … … 409 459 } 410 460 valide_block((block_type_modele*)&blk2,block_bolo,numero_block(blk)); 411 memcpy(& curBlock,&blk2,sizeof(blk2));461 memcpy(&blockSet->curBlock,&blk2,sizeof(blk2)); 412 462 curKind = block_bolo; 413 463 break; 414 464 } 465 case block_sst_comprime: { // $CHECK$ TBD 466 } 467 case block_sst : { 468 blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock); 469 } 415 470 } 416 471 } 417 472 418 473 void ArcheopsFile::saveCurBlock() { 419 blockSet->setBloc( curBlock);474 blockSet->setBloc(blockSet->curBlock); 420 475 } 421 476 422 477 void ArcheopsFile::pushMark() { // push current file position, and "last" blocks` 423 478 fposStack.push(curPos); 479 fposStack.push(peekPos); 424 480 blockStack.push(new BlockSet(*blockSet)); 425 481 } … … 429 485 delete blockSet; 430 486 blockSet = blockStack.top(); 487 blockStack.pop(); 488 peekPos = fposStack.top(); 489 fposStack.pop(); 431 490 curPos = fposStack.top(); 432 blockStack.pop();433 491 fposStack.pop(); 434 492 } 435 493 } 494 495 typedef unsigned int4 uint_4; 496 typedef unsigned short uint_2; 497 498 static inline void bswap4(void* p) 499 { 500 uint_4 tmp = *(uint_4*)p; 501 *(uint_4*)p = ((tmp >> 24) & 0x000000FF) | 502 ((tmp >> 8) & 0x0000FF00) | 503 ((tmp & 0x0000FF00) << 8) | 504 ((tmp & 0x000000FF) << 24); 505 } 506 507 static inline void bswap2(void* p) 508 { 509 uint_2 tmp = *(uint_2*)p; 510 *(uint_2*)p = ((tmp >> 8) & 0x00FF) | 511 ((tmp & 0x00FF) << 8); 512 } 513 514 #ifdef __DECCXX 515 #define SWAP 516 #endif 517 #if defined(Linux) || defined(linux) 518 #define SWAP 519 #endif 520 521 void ArcheopsFile::swapEntete(block_type_modele* blk) { 522 #ifdef SWAP 523 bswap4(&(blk->debut)); 524 bswap4(&(blk->code1)); 525 bswap4(&(blk->code2)); 526 long lg = longueur_block(blk); 527 bswap4(((char*)blk) + lg - 4); 528 #endif 529 } 530 531 void ArcheopsFile::swapContent(block_type_modele* blk) { 532 #ifdef SWAP 533 int typ = type_block(blk); 534 535 if (typ == block_gps) return; // char only, no swap 536 if (typ == block_une_periode) { // une_periode, des shorts 537 block_type_une_periode* b = (block_type_une_periode*) blk; 538 for (int i=0; i<nb_max_bolo; i++) 539 for (int j=0; j<nb_max_mes_per; j++) 540 bswap2(&b->bol_per[i][j]); 541 return; 542 } 543 544 for (int i=0; i<longueur_block(blk)/4-4; i++) 545 bswap4(blk->mot + i); 546 // On deswappe ce qui ne devait pas etre swappe... 547 switch (typ) { 548 case block_param: { 549 block_type_param* b = (block_type_param*) blk; 550 for (int i=0; i<nb_max_bolo; i++) 551 for (int j=0; j<8; j++) 552 bswap4(&b->param.bolo[i].bolo_nom[4*j]); 553 } 554 555 } 556 #endif 557 } 558 559 560 436 561 437 562 static int mlen[] = {31,28,31,30,31,30,31,31,30,31,30,31}; … … 474 599 } 475 600 601 int ArcheopsFile::getBoloBlockNum() { 602 if (!lastBolo()) return -1; 603 return numero_block(lastBolo()); 604 } 605 606 int ArcheopsFile::getSSTBlockNum() { 607 if (!lastSST()) return -1; 608 return numero_block(lastSST()); 609 } 610 611 476 612 // GPS 477 613 // $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z, … … 484 620 485 621 double ArcheopsFile::getGPSUTC() { // en secondes depuis minuit UTC jour courant 486 if (!lastGPS()) return - 1;622 if (!lastGPS()) return -9.e99; 487 623 char* p = lastGPS()->gps; 488 if (strncmp(p, "$GPGGA,", 7)) return - 1;624 if (strncmp(p, "$GPGGA,", 7)) return -9.e99; 489 625 p += 7; 490 626 double t; … … 506 642 507 643 double ArcheopsFile::getGPSLat() { // degres, + = NORD 508 if (!lastGPS()) return 99999;644 if (!lastGPS()) return -9.e99; 509 645 char* p = lastGPS()->gps; 510 if (strncmp(p, "$GPGGA,", 7)) return 99999;646 if (strncmp(p, "$GPGGA,", 7)) return -9.e99; 511 647 char* fence = p+80; 512 648 p += 7; 513 649 while (*p != ',' && p<fence) p++; 514 if (*p != ',') return 99999;650 if (*p != ',') return -9.e99; 515 651 p++; 516 652 double t; … … 519 655 t = d + t/60; 520 656 while (*p != ',' && p<fence) p++; 521 if (*p != ',') return 99999;657 if (*p != ',') return -9.e99; 522 658 p++; 523 659 if (*p == 'S') t = -t; … … 526 662 527 663 double ArcheopsFile::getGPSLong() { // degres, + = EST 528 if (!lastGPS()) return - 1;664 if (!lastGPS()) return -9.e99; 529 665 char* p = lastGPS()->gps; 530 if (strncmp(p, "$GPGGA,", 7)) return 99999;666 if (strncmp(p, "$GPGGA,", 7)) return -9.e99; 531 667 char* fence = p+80; 532 668 p += 7; 533 669 for (int i=0; i<3; i++) { 534 670 while (*p != ',' && p<fence) p++; 535 if (*p != ',') return 99999;671 if (*p != ',') return -9.e99; 536 672 p++; 537 673 } … … 541 677 t = d + t/60; 542 678 while (*p != ',' && p<fence) p++; 543 if (*p != ',') return 99999;679 if (*p != ',') return -9.e99; 544 680 p++; 545 681 if (*p == 'W') t = -t; … … 570 706 571 707 double ArcheopsFile::getMuVBolo(int ibolo, int imesure) { // microvolts, filtre avec filtre carre 572 double y = (getRawBolo(ibolo, imesure-1) + getRawBolo(ibolo, imesure))/2.; 708 double y = (getRawBolo(ibolo, imesure-1) - getRawBolo(ibolo, imesure))/2.; 709 if (imesure%2) y=-y; 573 710 block_type_reglage* reglage = lastReglage(); 574 return ((1e5*y)/(65536.*gain (reglage->reglage.bolo[ibolo])));711 return ((1e5*y)/(65536.*gain_ampli(reglage->reglage.bolo[ibolo]))); 575 712 } 576 713 577 714 578 715 // SST, gyros... 716 717 void ArcheopsFile::needSSTProcessMask(int mask) { 718 blockSet->sstHandler.NeedProcess(mask); 719 } 720 721 722 long ArcheopsFile::getSSTSignal(int idiode, int imesure) { 723 return blockSet->sstHandler.getSignal(imesure, idiode); 724 } 579 725 // $CHECK$ TBD 580 726
Note:
See TracChangeset
for help on using the changeset viewer.