Ignore:
Timestamp:
Jun 15, 1999, 3:53:04 PM (26 years ago)
Author:
ansari
Message:

Archeops 24, gestion byte-swap

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Poubelle/archTOI.old/archeopsfile.cc

    r310 r315  
    11#define utilitaires_de_block_archeops
    22#include "archeopsfile.h"
     3extern "C" {
    34#include "compress.h"
     5}
    46#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.
    511
    612class BlockSet {
     
    2733  block_type_gyro_comprime* lastGyroComp;
    2834  block_type_sst_comprime*  lastSSTComp;
     35   
     36  block_type_modele         curBlock;
     37  block_type_modele         peekBlock;
     38 
     39  SSTHandler sstHandler;
    2940};
    3041
     
    4556  lastGyroComp   = NULL;
    4657  lastSSTComp    = NULL;
     58 
     59  memset(&curBlock,0,sizeof(block_type_modele));
     60  memset(&peekBlock,0,sizeof(block_type_modele));
    4761}
    4862
     
    6579}
    6680
    67 BlockSet::BlockSet(BlockSet const& x) {
     81BlockSet::BlockSet(BlockSet const& x)
     82: sstHandler(x.sstHandler)
     83{
    6884  lastParam      = NULL;
    6985  lastJournal    = NULL;
     
    8197  lastGyroComp   = NULL;
    8298  lastSSTComp    = NULL;
     99 
    83100  if (x.lastParam) {
    84101    lastParam = new block_type_param;
     
    141158    *lastSSTComp = *x.lastSSTComp;
    142159  }
     160 
     161  memcpy(&curBlock,&x.curBlock,sizeof(block_type_modele));
     162  memcpy(&peekBlock,&x.peekBlock,sizeof(block_type_modele));
     163
    143164}
    144165
     
    232253  fseek(f,0,SEEK_END);
    233254  fLen = ftell(f);
    234   curPos = 0;
     255  curPos = -1;
     256  peekPos = -1;
    235257  curKind = -1;
    236258  curRawKind = -1;
     
    256278  }
    257279
    258   curBlock   = x.curBlock;
     280  //curBlock   = x.curBlock;
    259281  curKind    = x.curKind;
    260282  curRawKind = x.curRawKind;
    261283  curPos     = x.curPos;
     284  peekPos    = x.peekPos;
    262285  fLen       = x.fLen;
    263286  fn         = x.fn;
     
    275298  delete blockSet;
    276299  blockSet = new BlockSet(*oldFile.blockSet);
     300  //curBlock = oldFile.curBlock;
     301  //peekBlock = oldFile.peekBlock;
     302  peekPos = 0;
    277303  setUTCOffset(oldFile.utcOffset);
    278304}
     
    282308
    283309bool 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) {
    291326  printf("block invalide\n"); throw ArchExc("invalid block");
    292327  }
    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);
    295334  //printf("block %d  :  %s \n",numero_block(&curBlock),nom_block[curKind]);
    296335  postProcessBlock();
     
    316355
    317356int  ArcheopsFile::blockNum() {
    318   return numero_block(&curBlock);
     357  return numero_block(currentBlock());
    319358}
    320359
     
    348387
    349388block_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
     393block_type_modele*  ArcheopsFile::aheadBlock() {
     394  //if (peekPos<0) return NULL;
     395  return &blockSet->peekBlock;
     396}
     397
     398bool ArcheopsFile::sameBlockNumAhead() {
     399  if (curPos<0) return false;
     400  return (numero_block(&blockSet->curBlock) == numero_block(&blockSet->peekBlock));
     401}
     402
    353403
    354404block_type_param* ArcheopsFile::lastParam() {
     
    401451  switch (curKind) {
    402452     case block_bolo_comprime: {
    403        blockSet->setRawBloc(curBlock);
     453       blockSet->setRawBloc(blockSet->curBlock);
    404454       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;
    406456       for(int j=0;j<nb_bolo_util;j++) 
    407457                {
     
    409459                }
    410460       valide_block((block_type_modele*)&blk2,block_bolo,numero_block(blk));   
    411        memcpy(&curBlock,&blk2,sizeof(blk2));
     461       memcpy(&blockSet->curBlock,&blk2,sizeof(blk2));
    412462       curKind = block_bolo;
    413463       break;
    414464     }
     465     case block_sst_comprime: {  // $CHECK$ TBD
     466     }
     467     case block_sst : {
     468       blockSet->sstHandler.ProcessBlock((block_type_sst*)&blockSet->curBlock);
     469     }
    415470  }
    416471}
    417472
    418473void ArcheopsFile::saveCurBlock() {
    419   blockSet->setBloc(curBlock);
     474  blockSet->setBloc(blockSet->curBlock);
    420475}
    421476
    422477void ArcheopsFile::pushMark() {    // push current file position, and "last" blocks`
    423478  fposStack.push(curPos);
     479  fposStack.push(peekPos);
    424480  blockStack.push(new BlockSet(*blockSet));
    425481}
     
    429485    delete blockSet;
    430486    blockSet = blockStack.top();
     487    blockStack.pop();
     488    peekPos = fposStack.top();
     489    fposStack.pop();
    431490    curPos = fposStack.top();
    432     blockStack.pop();
    433491    fposStack.pop();
    434492  }
    435493}
     494
     495typedef unsigned int4 uint_4;
     496typedef unsigned short uint_2;
     497
     498static 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
     507static 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
     521void 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
     531void 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
    436561
    437562static int mlen[] = {31,28,31,30,31,30,31,31,30,31,30,31};
     
    474599}
    475600
     601int ArcheopsFile::getBoloBlockNum() {
     602  if (!lastBolo()) return -1;
     603  return numero_block(lastBolo());
     604}
     605
     606int ArcheopsFile::getSSTBlockNum() {
     607  if (!lastSST()) return -1;
     608  return numero_block(lastSST());
     609}
     610
     611
    476612// GPS
    477613// $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,
     
    484620
    485621double ArcheopsFile::getGPSUTC() {  // en secondes depuis minuit UTC jour courant
    486   if (!lastGPS()) return -1;
     622  if (!lastGPS()) return -9.e99;
    487623  char* p = lastGPS()->gps;
    488   if (strncmp(p, "$GPGGA,", 7)) return -1;
     624  if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
    489625  p += 7;
    490626  double t;
     
    506642
    507643double ArcheopsFile::getGPSLat() {  // degres, +  = NORD
    508   if (!lastGPS()) return 99999;
     644  if (!lastGPS()) return -9.e99;
    509645  char* p = lastGPS()->gps;
    510   if (strncmp(p, "$GPGGA,", 7)) return 99999;
     646  if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
    511647  char* fence = p+80;
    512648  p += 7;
    513649  while (*p != ',' && p<fence) p++;
    514   if (*p != ',') return 99999;
     650  if (*p != ',') return -9.e99;
    515651  p++;
    516652  double t;
     
    519655  t = d + t/60;
    520656  while (*p != ',' && p<fence) p++;
    521   if (*p != ',') return 99999;
     657  if (*p != ',') return -9.e99;
    522658  p++;
    523659  if (*p == 'S') t = -t;
     
    526662
    527663double ArcheopsFile::getGPSLong() { // degres, +  = EST
    528   if (!lastGPS()) return -1;
     664  if (!lastGPS()) return -9.e99;
    529665  char* p = lastGPS()->gps;
    530   if (strncmp(p, "$GPGGA,", 7)) return 99999;
     666  if (strncmp(p, "$GPGGA,", 7)) return -9.e99;
    531667  char* fence = p+80;
    532668  p += 7;
    533669  for (int i=0; i<3; i++) {
    534670    while (*p != ',' && p<fence) p++;
    535     if (*p != ',') return 99999;
     671    if (*p != ',') return -9.e99;
    536672    p++;
    537673  }
     
    541677  t = d + t/60;
    542678  while (*p != ',' && p<fence) p++;
    543   if (*p != ',') return 99999;
     679  if (*p != ',') return -9.e99;
    544680  p++;
    545681  if (*p == 'W') t = -t;
     
    570706
    571707double 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;
    573710  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])));
    575712}
    576713
    577714
    578715// SST, gyros...
     716
     717void ArcheopsFile::needSSTProcessMask(int mask) {
     718  blockSet->sstHandler.NeedProcess(mask);
     719}
     720
     721
     722long ArcheopsFile::getSSTSignal(int idiode, int imesure) {
     723  return blockSet->sstHandler.getSignal(imesure, idiode);
     724}
    579725// $CHECK$ TBD
    580726
Note: See TracChangeset for help on using the changeset viewer.