| 1 | #define utilitaires_de_block_archeops
 | 
|---|
| 2 | #include "archeopsfile.h"
 | 
|---|
| 3 | #include "compress.h"
 | 
|---|
| 4 | #include <iostream.h>
 | 
|---|
| 5 | 
 | 
|---|
| 6 | class BlockSet {
 | 
|---|
| 7 | public:
 | 
|---|
| 8 |   BlockSet();
 | 
|---|
| 9 |   BlockSet(BlockSet const&);
 | 
|---|
| 10 |   ~BlockSet();
 | 
|---|
| 11 |   void setBloc(block_type_modele const& blk);
 | 
|---|
| 12 |   void setRawBloc(block_type_modele const& blk);
 | 
|---|
| 13 | 
 | 
|---|
| 14 |   block_type_param*         lastParam;
 | 
|---|
| 15 |   block_type_journal*       lastJournal;
 | 
|---|
| 16 |   block_type_reglage*       lastReglage;
 | 
|---|
| 17 |   block_type_dilution*      lastDilution;
 | 
|---|
| 18 |   block_type_gps*           lastGPS;
 | 
|---|
| 19 |   block_type_une_periode*   lastUnePeriode;
 | 
|---|
| 20 |   block_type_synchro_sol*   lastSynchroSol;
 | 
|---|
| 21 |   block_type_pointage_sol*  lastPointageSol;
 | 
|---|
| 22 |   block_type_bolo*          lastBolo;   // can be uncompressed bolo_comp
 | 
|---|
| 23 |   block_type_bolo*          llastBolo;   
 | 
|---|
| 24 |   block_type_gyro*          lastGyro;
 | 
|---|
| 25 |   block_type_sst*           lastSST;
 | 
|---|
| 26 |   block_type_bolo_comprime* lastBoloComp;   // can be uncompressed bolo_comp
 | 
|---|
| 27 |   block_type_gyro_comprime* lastGyroComp;
 | 
|---|
| 28 |   block_type_sst_comprime*  lastSSTComp;
 | 
|---|
| 29 | };
 | 
|---|
| 30 | 
 | 
|---|
| 31 | BlockSet::BlockSet() {
 | 
|---|
| 32 |   lastParam      = NULL;
 | 
|---|
| 33 |   lastJournal    = NULL;
 | 
|---|
| 34 |   lastReglage    = NULL;
 | 
|---|
| 35 |   lastDilution   = NULL;
 | 
|---|
| 36 |   lastGPS        = NULL;
 | 
|---|
| 37 |   lastUnePeriode = NULL;
 | 
|---|
| 38 |   lastSynchroSol = NULL;
 | 
|---|
| 39 |   lastPointageSol= NULL;
 | 
|---|
| 40 |   lastBolo       = NULL;   
 | 
|---|
| 41 |   llastBolo      = NULL;   
 | 
|---|
| 42 |   lastGyro       = NULL;
 | 
|---|
| 43 |   lastSST        = NULL;
 | 
|---|
| 44 |   lastBoloComp   = NULL;   
 | 
|---|
| 45 |   lastGyroComp   = NULL;
 | 
|---|
| 46 |   lastSSTComp    = NULL;
 | 
|---|
| 47 | }
 | 
|---|
| 48 | 
 | 
|---|
| 49 | BlockSet::~BlockSet() {
 | 
|---|
| 50 |   delete lastParam;
 | 
|---|
| 51 |   delete lastJournal;
 | 
|---|
| 52 |   delete lastReglage;
 | 
|---|
| 53 |   delete lastDilution;
 | 
|---|
| 54 |   delete lastGPS;
 | 
|---|
| 55 |   delete lastUnePeriode;
 | 
|---|
| 56 |   delete lastSynchroSol;
 | 
|---|
| 57 |   delete lastPointageSol;
 | 
|---|
| 58 |   delete lastBolo;   
 | 
|---|
| 59 |   delete llastBolo;   
 | 
|---|
| 60 |   delete lastGyro;
 | 
|---|
| 61 |   delete lastSST;
 | 
|---|
| 62 |   delete lastBoloComp;   
 | 
|---|
| 63 |   delete lastGyroComp;
 | 
|---|
| 64 |   delete lastSSTComp;
 | 
|---|
| 65 | }
 | 
|---|
| 66 | 
 | 
|---|
| 67 | BlockSet::BlockSet(BlockSet const& x) {
 | 
|---|
| 68 |   lastParam      = NULL;
 | 
|---|
| 69 |   lastJournal    = NULL;
 | 
|---|
| 70 |   lastReglage    = NULL;
 | 
|---|
| 71 |   lastDilution   = NULL;
 | 
|---|
| 72 |   lastGPS        = NULL;
 | 
|---|
| 73 |   lastUnePeriode = NULL;
 | 
|---|
| 74 |   lastSynchroSol = NULL;
 | 
|---|
| 75 |   lastPointageSol= NULL;
 | 
|---|
| 76 |   lastBolo       = NULL;   
 | 
|---|
| 77 |   llastBolo      = NULL;   
 | 
|---|
| 78 |   lastGyro       = NULL;
 | 
|---|
| 79 |   lastSST        = NULL;
 | 
|---|
| 80 |   lastBoloComp   = NULL;   
 | 
|---|
| 81 |   lastGyroComp   = NULL;
 | 
|---|
| 82 |   lastSSTComp    = NULL;
 | 
|---|
| 83 |   if (x.lastParam) {
 | 
|---|
| 84 |     lastParam = new block_type_param;
 | 
|---|
| 85 |     *lastParam = *x.lastParam;
 | 
|---|
| 86 |   }
 | 
|---|
| 87 |   if (x.lastJournal) {
 | 
|---|
| 88 |     lastJournal = new block_type_journal;
 | 
|---|
| 89 |     *lastJournal = *x.lastJournal;
 | 
|---|
| 90 |   }
 | 
|---|
| 91 |   if (x.lastReglage) {
 | 
|---|
| 92 |     lastReglage = new block_type_reglage;
 | 
|---|
| 93 |     *lastReglage = *x.lastReglage;
 | 
|---|
| 94 |   }
 | 
|---|
| 95 |   if (x.lastDilution) {
 | 
|---|
| 96 |     lastDilution = new block_type_dilution;
 | 
|---|
| 97 |     *lastDilution = *x.lastDilution;
 | 
|---|
| 98 |   }
 | 
|---|
| 99 |   if (x.lastGPS) {
 | 
|---|
| 100 |     lastGPS = new block_type_gps;
 | 
|---|
| 101 |     *lastGPS = *x.lastGPS;
 | 
|---|
| 102 |   }
 | 
|---|
| 103 |   if (x.lastUnePeriode) {
 | 
|---|
| 104 |     lastUnePeriode = new block_type_une_periode;
 | 
|---|
| 105 |     *lastUnePeriode = *x.lastUnePeriode;
 | 
|---|
| 106 |   }
 | 
|---|
| 107 |   if (x.lastSynchroSol) {
 | 
|---|
| 108 |     lastSynchroSol = new block_type_synchro_sol;
 | 
|---|
| 109 |     *lastSynchroSol = *x.lastSynchroSol;
 | 
|---|
| 110 |   }
 | 
|---|
| 111 |   if (x.lastPointageSol) {
 | 
|---|
| 112 |     lastPointageSol = new block_type_pointage_sol;
 | 
|---|
| 113 |     *lastPointageSol = *x.lastPointageSol;
 | 
|---|
| 114 |   }
 | 
|---|
| 115 |   if (x.lastBolo) {
 | 
|---|
| 116 |     lastBolo = new block_type_bolo;
 | 
|---|
| 117 |     *lastBolo = *x.lastBolo;
 | 
|---|
| 118 |   }
 | 
|---|
| 119 |   if (x.llastBolo) {
 | 
|---|
| 120 |     llastBolo = new block_type_bolo;
 | 
|---|
| 121 |     *llastBolo = *x.llastBolo;
 | 
|---|
| 122 |   }
 | 
|---|
| 123 |   if (x.lastGyro) {
 | 
|---|
| 124 |     lastGyro = new block_type_gyro;
 | 
|---|
| 125 |     *lastGyro = *x.lastGyro;
 | 
|---|
| 126 |   }
 | 
|---|
| 127 |   if (x.lastSST) {
 | 
|---|
| 128 |     lastSST = new block_type_sst;
 | 
|---|
| 129 |     *lastSST = *x.lastSST;
 | 
|---|
| 130 |   }
 | 
|---|
| 131 |   if (x.lastBoloComp) {
 | 
|---|
| 132 |     lastBoloComp = new block_type_bolo_comprime;
 | 
|---|
| 133 |     *lastBoloComp = *x.lastBoloComp;
 | 
|---|
| 134 |   }
 | 
|---|
| 135 |   if (x.lastGyroComp) {
 | 
|---|
| 136 |     lastGyroComp = new block_type_gyro_comprime;
 | 
|---|
| 137 |     *lastGyroComp = *x.lastGyroComp;
 | 
|---|
| 138 |   }
 | 
|---|
| 139 |   if (x.lastSSTComp) {
 | 
|---|
| 140 |     lastSSTComp = new block_type_sst_comprime;
 | 
|---|
| 141 |     *lastSSTComp = *x.lastSSTComp;
 | 
|---|
| 142 |   }
 | 
|---|
| 143 | }
 | 
|---|
| 144 | 
 | 
|---|
| 145 | void BlockSet::setBloc(block_type_modele const& blk)
 | 
|---|
| 146 | {
 | 
|---|
| 147 |   int kind = type_block(&blk);
 | 
|---|
| 148 |   switch (kind) {
 | 
|---|
| 149 |     case block_param:
 | 
|---|
| 150 |       if (!lastParam) lastParam = new block_type_param;
 | 
|---|
| 151 |       memcpy(lastParam, &blk, sizeof(block_type_param));
 | 
|---|
| 152 |       // Les fichiers fournis contiennent des valeurs debiles...
 | 
|---|
| 153 |       if (lastParam->param.n_max_bolo < 0)
 | 
|---|
| 154 |         lastParam->param.n_max_bolo = nb_max_bolo;
 | 
|---|
| 155 |       if (lastParam->param.n_per_block < 0)
 | 
|---|
| 156 |         lastParam->param.n_per_block = nb_per_block;
 | 
|---|
| 157 |       if (lastParam->param.n_max_mes_per < 0)
 | 
|---|
| 158 |         lastParam->param.n_max_mes_per = nb_max_mes_per;
 | 
|---|
| 159 |       break;
 | 
|---|
| 160 |     case block_journal:
 | 
|---|
| 161 |       if (!lastJournal) lastJournal = new block_type_journal;
 | 
|---|
| 162 |       memcpy(lastJournal, &blk, sizeof(block_type_journal));
 | 
|---|
| 163 |       break;
 | 
|---|
| 164 |     case block_reglage:
 | 
|---|
| 165 |       if (!lastReglage) lastReglage = new block_type_reglage;
 | 
|---|
| 166 |       memcpy(lastReglage, &blk, sizeof(block_type_reglage));
 | 
|---|
| 167 |       break;
 | 
|---|
| 168 |     case block_dilution:
 | 
|---|
| 169 |       if (!lastDilution) lastDilution = new block_type_dilution;
 | 
|---|
| 170 |       memcpy(lastDilution, &blk, sizeof(block_type_dilution));
 | 
|---|
| 171 |       break;
 | 
|---|
| 172 |     case block_gps:
 | 
|---|
| 173 |       if (!lastGPS) lastGPS = new block_type_gps;
 | 
|---|
| 174 |       memcpy(lastGPS, &blk, sizeof(block_type_gps));
 | 
|---|
| 175 |       break;
 | 
|---|
| 176 |     case block_une_periode:
 | 
|---|
| 177 |       if (!lastUnePeriode) lastUnePeriode = new block_type_une_periode;
 | 
|---|
| 178 |       memcpy(lastUnePeriode, &blk, sizeof(block_type_une_periode));
 | 
|---|
| 179 |       break;
 | 
|---|
| 180 |     case block_synchro_sol:
 | 
|---|
| 181 |       if (!lastSynchroSol) lastSynchroSol = new block_type_synchro_sol;
 | 
|---|
| 182 |       memcpy(lastSynchroSol, &blk, sizeof(block_type_synchro_sol));
 | 
|---|
| 183 |       break;
 | 
|---|
| 184 |     case block_pointage_sol:
 | 
|---|
| 185 |       if (!lastPointageSol) lastPointageSol = new block_type_pointage_sol;
 | 
|---|
| 186 |       memcpy(lastPointageSol, &blk, sizeof(block_type_pointage_sol));
 | 
|---|
| 187 |       break;
 | 
|---|
| 188 |     case block_bolo:
 | 
|---|
| 189 |       if (!lastBolo) lastBolo = new block_type_bolo;
 | 
|---|
| 190 |       else if (!llastBolo) {
 | 
|---|
| 191 |         llastBolo = new block_type_bolo;
 | 
|---|
| 192 |         memcpy(llastBolo, lastBolo, sizeof(block_type_bolo));
 | 
|---|
| 193 |       }
 | 
|---|
| 194 |       memcpy(lastBolo, &blk, sizeof(block_type_bolo));
 | 
|---|
| 195 |       break;
 | 
|---|
| 196 |     case block_gyro:
 | 
|---|
| 197 |       if (!lastGyro) lastGyro = new block_type_gyro;
 | 
|---|
| 198 |       memcpy(lastGyro, &blk, sizeof(block_type_gyro));
 | 
|---|
| 199 |       break;
 | 
|---|
| 200 |     case block_sst:
 | 
|---|
| 201 |       if (!lastSST) lastSST = new block_type_sst;
 | 
|---|
| 202 |       memcpy(lastSST, &blk, sizeof(block_type_sst));
 | 
|---|
| 203 |       break;
 | 
|---|
| 204 |   }
 | 
|---|
| 205 | }
 | 
|---|
| 206 | 
 | 
|---|
| 207 | void BlockSet::setRawBloc(block_type_modele const& blk)
 | 
|---|
| 208 | {
 | 
|---|
| 209 |   int kind = type_block(&blk);
 | 
|---|
| 210 |   switch (kind) {
 | 
|---|
| 211 |     case block_bolo_comprime:
 | 
|---|
| 212 |       if (!lastBoloComp) lastBoloComp = new block_type_bolo_comprime;
 | 
|---|
| 213 |       memcpy(lastBoloComp, &blk, sizeof(block_type_bolo_comprime));
 | 
|---|
| 214 |       break;
 | 
|---|
| 215 |     case block_gyro_comprime:
 | 
|---|
| 216 |       if (!lastGyroComp) lastGyroComp = new block_type_gyro_comprime;
 | 
|---|
| 217 |       memcpy(lastGyroComp, &blk, sizeof(block_type_gyro_comprime));
 | 
|---|
| 218 |       break;
 | 
|---|
| 219 |     case block_sst_comprime:
 | 
|---|
| 220 |       if (!lastSSTComp) lastSSTComp = new block_type_sst_comprime;
 | 
|---|
| 221 |       memcpy(lastSSTComp, &blk, sizeof(block_type_sst_comprime));
 | 
|---|
| 222 |       break;
 | 
|---|
| 223 |   }
 | 
|---|
| 224 | }
 | 
|---|
| 225 | 
 | 
|---|
| 226 | 
 | 
|---|
| 227 | 
 | 
|---|
| 228 | ArcheopsFile::ArcheopsFile(string const& fname) {
 | 
|---|
| 229 |   f = fopen(fname.c_str(), "rb");
 | 
|---|
| 230 |   fn = fname;
 | 
|---|
| 231 |   if (!f) throw ArchExc("file not found");
 | 
|---|
| 232 |   fseek(f,0,SEEK_END);
 | 
|---|
| 233 |   fLen = ftell(f);
 | 
|---|
| 234 |   curPos = 0;
 | 
|---|
| 235 |   curKind = -1;
 | 
|---|
| 236 |   curRawKind = -1;
 | 
|---|
| 237 |   blockSet = new BlockSet;
 | 
|---|
| 238 |   utcOffset=2;
 | 
|---|
| 239 |   computeMJD(fname);
 | 
|---|
| 240 | }
 | 
|---|
| 241 | 
 | 
|---|
| 242 | ArcheopsFile::ArcheopsFile(ArcheopsFile const& x) {
 | 
|---|
| 243 |   blockSet = x.blockSet ? new BlockSet(*x.blockSet) : NULL;
 | 
|---|
| 244 |   fposStack = x.fposStack;
 | 
|---|
| 245 |   
 | 
|---|
| 246 |   stack<BlockSet*> tmp;
 | 
|---|
| 247 |   ArcheopsFile& y = (ArcheopsFile&) x;
 | 
|---|
| 248 |   while (!y.blockStack.empty()) {
 | 
|---|
| 249 |     tmp.push(y.blockStack.top());
 | 
|---|
| 250 |     y.blockStack.pop();
 | 
|---|
| 251 |   }
 | 
|---|
| 252 |   while (!tmp.empty()) {
 | 
|---|
| 253 |     y.blockStack.push(tmp.top());
 | 
|---|
| 254 |     blockStack.push(new BlockSet(*tmp.top()));
 | 
|---|
| 255 |     tmp.pop();
 | 
|---|
| 256 |   }
 | 
|---|
| 257 | 
 | 
|---|
| 258 |   curBlock   = x.curBlock;
 | 
|---|
| 259 |   curKind    = x.curKind;
 | 
|---|
| 260 |   curRawKind = x.curRawKind;
 | 
|---|
| 261 |   curPos     = x.curPos;
 | 
|---|
| 262 |   fLen       = x.fLen;
 | 
|---|
| 263 |   fn         = x.fn;
 | 
|---|
| 264 |   f = fopen(fn.c_str(), "rb");
 | 
|---|
| 265 | }
 | 
|---|
| 266 | 
 | 
|---|
| 267 | ArcheopsFile::~ArcheopsFile() {
 | 
|---|
| 268 |   if (f) fclose(f);
 | 
|---|
| 269 |   delete blockSet;
 | 
|---|
| 270 |   while (!blockStack.empty())
 | 
|---|
| 271 |     { delete blockStack.top(); blockStack.pop();}
 | 
|---|
| 272 | }
 | 
|---|
| 273 | 
 | 
|---|
| 274 | void ArcheopsFile::grabLastBlocs(ArcheopsFile const& oldFile) {
 | 
|---|
| 275 |   delete blockSet;
 | 
|---|
| 276 |   blockSet = new BlockSet(*oldFile.blockSet);
 | 
|---|
| 277 |   setUTCOffset(oldFile.utcOffset);
 | 
|---|
| 278 | }
 | 
|---|
| 279 | 
 | 
|---|
| 280 | 
 | 
|---|
| 281 | def_nom_block
 | 
|---|
| 282 | 
 | 
|---|
| 283 | 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) {
 | 
|---|
| 291 |   printf("block invalide\n"); throw ArchExc("invalid block");
 | 
|---|
| 292 |   }
 | 
|---|
| 293 |   curRawKind = curKind = type_block(&curBlock);
 | 
|---|
| 294 |   curPos += longueur_block(&curBlock);
 | 
|---|
| 295 |   //printf("block %d  :  %s \n",numero_block(&curBlock),nom_block[curKind]);
 | 
|---|
| 296 |   postProcessBlock();
 | 
|---|
| 297 |   saveCurBlock();
 | 
|---|
| 298 |   return true;
 | 
|---|
| 299 | }
 | 
|---|
| 300 | 
 | 
|---|
| 301 | bool ArcheopsFile::nextBlock(long mask) {
 | 
|---|
| 302 |   if (!mask) return false;
 | 
|---|
| 303 |   while (1) {
 | 
|---|
| 304 |     if (!nextBlock()) return false;
 | 
|---|
| 305 |     if (( 1 << curRawKind) & mask) return true;
 | 
|---|
| 306 |   }
 | 
|---|
| 307 | }
 | 
|---|
| 308 | 
 | 
|---|
| 309 | int  ArcheopsFile::blockKind() {
 | 
|---|
| 310 |   return curKind;
 | 
|---|
| 311 | }
 | 
|---|
| 312 | 
 | 
|---|
| 313 | int  ArcheopsFile::blockRawKind() {
 | 
|---|
| 314 |   return curRawKind;
 | 
|---|
| 315 | }
 | 
|---|
| 316 | 
 | 
|---|
| 317 | int  ArcheopsFile::blockNum() {
 | 
|---|
| 318 |   return numero_block(&curBlock);
 | 
|---|
| 319 | }
 | 
|---|
| 320 | 
 | 
|---|
| 321 | #define  bitmot                 24              // nb de bit horloge dans un mot ADC
 | 
|---|
| 322 | 
 | 
|---|
| 323 | double ArcheopsFile::perEchant() { // periode d'echantillonage pour le dernier bloc reglage
 | 
|---|
| 324 |   double p,f1,f2,f3;
 | 
|---|
| 325 |   int pp;
 | 
|---|
| 326 |   pp=lastReglage()->reglage.horloge.periode;
 | 
|---|
| 327 |   p=pp/5.;
 | 
|---|
| 328 |   f1=1000/p;f2=f1/bitmot;f3=f2*1000./(double)(lastReglage()->reglage.horloge.nb_mesures);
 | 
|---|
| 329 |   return 0.5/f3;                                        //  2 fois la frequence de modulation
 | 
|---|
| 330 | }
 | 
|---|
| 331 | 
 | 
|---|
| 332 | double ArcheopsFile::perBlock() {  // duree (en secondes) correspondant a un bloc bolo
 | 
|---|
| 333 |   return perEchant() * (double)lastParam()->param.n_per_block*2.;
 | 
|---|
| 334 | }
 | 
|---|
| 335 | 
 | 
|---|
| 336 | int ArcheopsFile::nEchBlock() {  // Nb d'echantillons dans un bloc
 | 
|---|
| 337 |   return lastParam()->param.n_per_block*2.;
 | 
|---|
| 338 | }
 | 
|---|
| 339 | 
 | 
|---|
| 340 | string  ArcheopsFile::blockKdName() {
 | 
|---|
| 341 |   return nom_block[curKind];
 | 
|---|
| 342 | }
 | 
|---|
| 343 | 
 | 
|---|
| 344 | string  ArcheopsFile::blockRawKdName() {
 | 
|---|
| 345 |   return nom_block[curRawKind];
 | 
|---|
| 346 | }
 | 
|---|
| 347 | 
 | 
|---|
| 348 | 
 | 
|---|
| 349 | block_type_modele*  ArcheopsFile::currentBlock() {
 | 
|---|
| 350 |   if (curPos<0) return NULL;
 | 
|---|
| 351 |   return &curBlock;
 | 
|---|
| 352 | }
 | 
|---|
| 353 | 
 | 
|---|
| 354 | block_type_param* ArcheopsFile::lastParam() {
 | 
|---|
| 355 |   return blockSet->lastParam;
 | 
|---|
| 356 | }
 | 
|---|
| 357 | block_type_journal* ArcheopsFile::lastJournal() {
 | 
|---|
| 358 |   return blockSet->lastJournal;
 | 
|---|
| 359 | }
 | 
|---|
| 360 | block_type_reglage* ArcheopsFile::lastReglage() {
 | 
|---|
| 361 |   return blockSet->lastReglage;
 | 
|---|
| 362 | }
 | 
|---|
| 363 | block_type_dilution* ArcheopsFile::lastDilution() {
 | 
|---|
| 364 |   return blockSet->lastDilution;
 | 
|---|
| 365 | }
 | 
|---|
| 366 | block_type_gps* ArcheopsFile::lastGPS() {
 | 
|---|
| 367 |   return blockSet->lastGPS;
 | 
|---|
| 368 | }
 | 
|---|
| 369 | block_type_une_periode* ArcheopsFile::lastUnePeriode() {
 | 
|---|
| 370 |   return blockSet->lastUnePeriode;
 | 
|---|
| 371 | }
 | 
|---|
| 372 | block_type_synchro_sol* ArcheopsFile::lastSynchroSol() {
 | 
|---|
| 373 |   return blockSet->lastSynchroSol;
 | 
|---|
| 374 | }
 | 
|---|
| 375 | block_type_pointage_sol* ArcheopsFile::lastPointageSol() {
 | 
|---|
| 376 |   return blockSet->lastPointageSol;
 | 
|---|
| 377 | }
 | 
|---|
| 378 | block_type_bolo* ArcheopsFile::lastBolo() {
 | 
|---|
| 379 |   return blockSet->lastBolo;
 | 
|---|
| 380 | } 
 | 
|---|
| 381 | block_type_bolo* ArcheopsFile::llastBolo() {
 | 
|---|
| 382 |   return blockSet->llastBolo;
 | 
|---|
| 383 | } 
 | 
|---|
| 384 | block_type_gyro* ArcheopsFile::lastGyro() {
 | 
|---|
| 385 |   return blockSet->lastGyro;
 | 
|---|
| 386 | }
 | 
|---|
| 387 | block_type_sst* ArcheopsFile::lastSST() {
 | 
|---|
| 388 |   return blockSet->lastSST;
 | 
|---|
| 389 | }
 | 
|---|
| 390 | block_type_bolo_comprime* ArcheopsFile::lastBoloComp() {
 | 
|---|
| 391 |   return blockSet->lastBoloComp;
 | 
|---|
| 392 | } 
 | 
|---|
| 393 | block_type_gyro_comprime* ArcheopsFile::lastGyroComp() {
 | 
|---|
| 394 |   return blockSet->lastGyroComp;
 | 
|---|
| 395 | }
 | 
|---|
| 396 | block_type_sst_comprime* ArcheopsFile::lastSSTComp() {
 | 
|---|
| 397 |   return blockSet->lastSSTComp;
 | 
|---|
| 398 | }
 | 
|---|
| 399 | 
 | 
|---|
| 400 | void ArcheopsFile::postProcessBlock() {
 | 
|---|
| 401 |   switch (curKind) {
 | 
|---|
| 402 |      case block_bolo_comprime: {
 | 
|---|
| 403 |        blockSet->setRawBloc(curBlock);
 | 
|---|
| 404 |        block_type_bolo blk2;
 | 
|---|
| 405 |        block_type_bolo_comprime* blk = (block_type_bolo_comprime*) &curBlock;
 | 
|---|
| 406 |        for(int j=0;j<nb_bolo_util;j++)  
 | 
|---|
| 407 |                 {
 | 
|---|
| 408 |                    decompress_7_2(blk->data_bolo[j],blk2.data_bolo[j],nb_per_block*2);
 | 
|---|
| 409 |                 }
 | 
|---|
| 410 |        valide_block((block_type_modele*)&blk2,block_bolo,numero_block(blk));    
 | 
|---|
| 411 |        memcpy(&curBlock,&blk2,sizeof(blk2));
 | 
|---|
| 412 |        curKind = block_bolo;
 | 
|---|
| 413 |        break;
 | 
|---|
| 414 |      }
 | 
|---|
| 415 |   }
 | 
|---|
| 416 | }
 | 
|---|
| 417 | 
 | 
|---|
| 418 | void ArcheopsFile::saveCurBlock() {
 | 
|---|
| 419 |   blockSet->setBloc(curBlock);
 | 
|---|
| 420 | }
 | 
|---|
| 421 | 
 | 
|---|
| 422 | void ArcheopsFile::pushMark() {    // push current file position, and "last" blocks`
 | 
|---|
| 423 |   fposStack.push(curPos);
 | 
|---|
| 424 |   blockStack.push(new BlockSet(*blockSet));
 | 
|---|
| 425 | }
 | 
|---|
| 426 | 
 | 
|---|
| 427 | void ArcheopsFile::popMark() {    // pops last file position and "last" blocks
 | 
|---|
| 428 |   if (! blockStack.empty()) {
 | 
|---|
| 429 |     delete blockSet;
 | 
|---|
| 430 |     blockSet = blockStack.top();
 | 
|---|
| 431 |     curPos = fposStack.top();
 | 
|---|
| 432 |     blockStack.pop();
 | 
|---|
| 433 |     fposStack.pop();
 | 
|---|
| 434 |   }
 | 
|---|
| 435 | }
 | 
|---|
| 436 | 
 | 
|---|
| 437 | static int mlen[] = {31,28,31,30,31,30,31,31,30,31,30,31};
 | 
|---|
| 438 | 
 | 
|---|
| 439 | void ArcheopsFile::computeMJD(string const& fname) {
 | 
|---|
| 440 |   //h99_04_29-15h36m22
 | 
|---|
| 441 |   short y,m,d,hh,mm,ss;
 | 
|---|
| 442 |   char const* p = fname.c_str();
 | 
|---|
| 443 |   char const* p2 = p  + fname.length()-1;
 | 
|---|
| 444 |   while (*p2 != ':' && *p2 != '/' && p2 != p) p2--;
 | 
|---|
| 445 |   if (*p2 == ':' || *p2 == '/') p2++;
 | 
|---|
| 446 |   if (*p2 == 'h') p2++;
 | 
|---|
| 447 |   y  = atoi(p2); p2+=3;
 | 
|---|
| 448 |   m  = atoi(p2); p2+=3;
 | 
|---|
| 449 |   d  = atoi(p2); p2+=3;
 | 
|---|
| 450 |   hh = atoi(p2); p2+=3;
 | 
|---|
| 451 |   mm = atoi(p2); p2+=3;
 | 
|---|
| 452 |   ss = atoi(p2);
 | 
|---|
| 453 |   
 | 
|---|
| 454 |   if (y<50) y += 100;
 | 
|---|
| 455 |   // 1. depuis 0/1/97 minuit
 | 
|---|
| 456 |   rawMJD = (int) (365.25 * (y-97));
 | 
|---|
| 457 |   for (int i=0; i<m-1; i++)
 | 
|---|
| 458 |     rawMJD += mlen[i];
 | 
|---|
| 459 |   if (y%4 == 0 && m > 2) rawMJD++;
 | 
|---|
| 460 |   rawMJD += d;
 | 
|---|
| 461 |   rawMJD += hh/24. + mm/24./60. + ss/24./60./60;
 | 
|---|
| 462 |   
 | 
|---|
| 463 |   rawMJD += 448.5; // 0/1/97 minuit
 | 
|---|
| 464 |   startMJD = rawMJD - utcOffset/24.;
 | 
|---|
| 465 | }
 | 
|---|
| 466 | 
 | 
|---|
| 467 | void ArcheopsFile::setUTCOffset(int UTCOffset) {
 | 
|---|
| 468 |   utcOffset = UTCOffset;
 | 
|---|
| 469 |   startMJD = rawMJD - utcOffset/24.;
 | 
|---|
| 470 | }
 | 
|---|
| 471 | 
 | 
|---|
| 472 | double ArcheopsFile::getStartMJD() {
 | 
|---|
| 473 |   return startMJD;
 | 
|---|
| 474 | }
 | 
|---|
| 475 | 
 | 
|---|
| 476 | // GPS
 | 
|---|
| 477 | // $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,
 | 
|---|
| 478 | 
 | 
|---|
| 479 | 
 | 
|---|
| 480 | int ArcheopsFile::getGPSBlockNum() {
 | 
|---|
| 481 |   if (!lastGPS()) return -1;
 | 
|---|
| 482 |   return numero_block(lastGPS());
 | 
|---|
| 483 | }
 | 
|---|
| 484 | 
 | 
|---|
| 485 | double ArcheopsFile::getGPSUTC() {  // en secondes depuis minuit UTC jour courant
 | 
|---|
| 486 |   if (!lastGPS()) return -1;
 | 
|---|
| 487 |   char* p = lastGPS()->gps;
 | 
|---|
| 488 |   if (strncmp(p, "$GPGGA,", 7)) return -1;
 | 
|---|
| 489 |   p += 7;
 | 
|---|
| 490 |   double t;
 | 
|---|
| 491 |   sscanf(p, "%lg", &t);
 | 
|---|
| 492 |   int h = int(t/10000); t -= h*10000;
 | 
|---|
| 493 |   int m = int(t/100);   t -= m*100;
 | 
|---|
| 494 |   return h*3600. + m*60. + t;
 | 
|---|
| 495 | }
 | 
|---|
| 496 | 
 | 
|---|
| 497 | double ArcheopsFile::getGPSMJD() {  // modified julian day du dernier bloc GPS, JD - 2450000
 | 
|---|
| 498 |   double t = getGPSUTC()/86400.;
 | 
|---|
| 499 |   if (t<0) return t;
 | 
|---|
| 500 |   if (t > (startMJD - int(startMJD))) {
 | 
|---|
| 501 |     return int(startMJD) + t;
 | 
|---|
| 502 |   } else {
 | 
|---|
| 503 |     return int(startMJD) + 1. + t;
 | 
|---|
| 504 |   }
 | 
|---|
| 505 | }
 | 
|---|
| 506 | 
 | 
|---|
| 507 | double ArcheopsFile::getGPSLat() {  // degres, +  = NORD
 | 
|---|
| 508 |   if (!lastGPS()) return 99999;
 | 
|---|
| 509 |   char* p = lastGPS()->gps;
 | 
|---|
| 510 |   if (strncmp(p, "$GPGGA,", 7)) return 99999;
 | 
|---|
| 511 |   char* fence = p+80;
 | 
|---|
| 512 |   p += 7;
 | 
|---|
| 513 |   while (*p != ',' && p<fence) p++;
 | 
|---|
| 514 |   if (*p != ',') return 99999; 
 | 
|---|
| 515 |   p++;
 | 
|---|
| 516 |   double t;
 | 
|---|
| 517 |   sscanf(p, "%lg", &t);
 | 
|---|
| 518 |   int d = int(t/100); t -= d*100;
 | 
|---|
| 519 |   t = d + t/60;
 | 
|---|
| 520 |   while (*p != ',' && p<fence) p++;
 | 
|---|
| 521 |   if (*p != ',') return 99999; 
 | 
|---|
| 522 |   p++;
 | 
|---|
| 523 |   if (*p == 'S') t = -t;
 | 
|---|
| 524 |   return t;
 | 
|---|
| 525 | }
 | 
|---|
| 526 | 
 | 
|---|
| 527 | double ArcheopsFile::getGPSLong() { // degres, +  = EST
 | 
|---|
| 528 |   if (!lastGPS()) return -1;
 | 
|---|
| 529 |   char* p = lastGPS()->gps;
 | 
|---|
| 530 |   if (strncmp(p, "$GPGGA,", 7)) return 99999;
 | 
|---|
| 531 |   char* fence = p+80;
 | 
|---|
| 532 |   p += 7;
 | 
|---|
| 533 |   for (int i=0; i<3; i++) {
 | 
|---|
| 534 |     while (*p != ',' && p<fence) p++;
 | 
|---|
| 535 |     if (*p != ',') return 99999; 
 | 
|---|
| 536 |     p++;
 | 
|---|
| 537 |   }
 | 
|---|
| 538 |   double t;
 | 
|---|
| 539 |   sscanf(p, "%lg", &t);
 | 
|---|
| 540 |   int d = int(t/100); t -= d*100;
 | 
|---|
| 541 |   t = d + t/60;
 | 
|---|
| 542 |   while (*p != ',' && p<fence) p++;
 | 
|---|
| 543 |   if (*p != ',') return 99999; 
 | 
|---|
| 544 |   p++;
 | 
|---|
| 545 |   if (*p == 'W') t = -t;
 | 
|---|
| 546 |   return t;
 | 
|---|
| 547 | }
 | 
|---|
| 548 | 
 | 
|---|
| 549 | 
 | 
|---|
| 550 | 
 | 
|---|
| 551 | // Bolo
 | 
|---|
| 552 | 
 | 
|---|
| 553 | long ArcheopsFile::getRawBolo(int ibolo, int imesure) {    // donnee brute, avec seulement soustraction offset
 | 
|---|
| 554 |   int nb_coups,aa;  
 | 
|---|
| 555 |   block_type_bolo* blk = imesure >= 0 ? lastBolo() : llastBolo();
 | 
|---|
| 556 |   if (imesure < 0) imesure += nEchBlock();
 | 
|---|
| 557 |   if (!blk) return 0;
 | 
|---|
| 558 |   block_type_reglage* reglage = lastReglage();
 | 
|---|
| 559 |   block_type_param* param = lastParam();
 | 
|---|
| 560 |   
 | 
|---|
| 561 |   nb_coups= reglage->reglage.horloge.nb_mesures/2 - reglage->reglage.horloge.temp_mort;
 | 
|---|
| 562 |   aa = (nb_coups<<14) + (nb_coups*190) ;
 | 
|---|
| 563 |   
 | 
|---|
| 564 |   int s = imesure % 2 ? 1 : -1;
 | 
|---|
| 565 | 
 | 
|---|
| 566 |   return s*(((blk->data_bolo[ibolo][imesure]-aa)<<1)/nb_coups);
 | 
|---|
| 567 | }
 | 
|---|
| 568 | 
 | 
|---|
| 569 | def_gains 
 | 
|---|
| 570 | 
 | 
|---|
| 571 | double ArcheopsFile::getMuVBolo(int ibolo, int imesure) { // microvolts, filtre avec filtre carre
 | 
|---|
| 572 |   double y = (getRawBolo(ibolo, imesure-1) + getRawBolo(ibolo, imesure))/2.;
 | 
|---|
| 573 |   block_type_reglage* reglage = lastReglage();
 | 
|---|
| 574 |   return ((1e5*y)/(65536.*gain(reglage->reglage.bolo[ibolo])));
 | 
|---|
| 575 | }
 | 
|---|
| 576 | 
 | 
|---|
| 577 | 
 | 
|---|
| 578 | // SST, gyros...
 | 
|---|
| 579 | // $CHECK$ TBD
 | 
|---|
| 580 | 
 | 
|---|
| 581 | 
 | 
|---|
| 582 | double ArcheopsFile::getAzimut(int imesure) {return imesure*360/nEchBlock();}
 | 
|---|
| 583 | double ArcheopsFile::getPendDirect(int /*imesure*/) {return 0;}
 | 
|---|
| 584 | double ArcheopsFile::getPendOrth(int /*imesure*/) {return 0;}
 | 
|---|
| 585 | double ArcheopsFile::getAlpha(int /*imesure*/) {return 0;}
 | 
|---|
| 586 | double ArcheopsFile::getDelta(int /*imesure*/) {return 0;}
 | 
|---|