Index: trunk/Poubelle/archTOI.old/toiiter.cc
===================================================================
--- trunk/Poubelle/archTOI.old/toiiter.cc	(revision 315)
+++ trunk/Poubelle/archTOI.old/toiiter.cc	(revision 342)
@@ -2,4 +2,5 @@
 #include "toiinterpolator.h"
 #include <dirent.h>
+#include <iostream.h>
 
 // Format bloc GPS
@@ -14,13 +15,21 @@
  fileName = "";
  
+ files.clear();
+
+ isOnBoardRecorder = false;
+   
+ imes=0;
+
  tStart = -9.e99;
- tEnd   = -9.e99;
+ tEnd   = 9.e99;
  
  tBlock0 = -1;
- 
+ perEch = -1;
+ 
+ trigMask = 0;
  rawIter = NULL;
  interp  = NULL;
  lastSample = -1;
- maxLookAhead = 1000;
+ maxLookAhead = 10000;
 
 }
@@ -30,9 +39,12 @@
   fileName = x.fileName;
   files = x.files;
-  curFile = x.curFile;
+  //  curFile = x.curFile; // $CHECK$ DANGER !!
+  curFile = files.find(*(x.curFile));
+  isOnBoardRecorder = x.isOnBoardRecorder;
   imes = x.imes;
   tStart = x.tStart;
   tEnd = x.tEnd;
   tBlock0 = x.tBlock0;
+  perEch = x.perEch;
   trigMask = x.trigMask;
   infos = x.infos;   
@@ -63,14 +75,58 @@
 }
 
+#ifdef __MWERKS__
+#define filesep ':'
+#else
+#define filesep '/'
+#endif
+
 void TOIIter::Init() {
-
-  // $CHECK$ a deplacer, pour gerer repertoires...
+ // On a soit un repertoire, soit un fichier, soit une liste de fichiers....
   if (directory == "") {
-    file = new ArcheopsFile(fileName);
-  } else {
+    if (files.empty()) {   // un seul fichier
+      file = new ArcheopsFile(fileName);
+    } else {
+      curFile = files.begin();
+      file = new ArcheopsFile((*curFile).c_str());
+    }
+  } else { // On a un repertoire a explorer
+    // On cherche soit les fichiers dans le repertoire donne, soit des fichiers
+    // dans un sous-repertoire "arch-YY_MM_DD". Les fichiers ont un nom en
+    // "hYY_MM_DD-hh_mm_ss".
+    // Pour l'enregistreur de vol, les fichiers ont un nom en ARKxxxxxx.DAT
+    if (directory[directory.length()-1] != filesep) 
+      directory += filesep;
     DIR* dir = opendir(directory.c_str());
     struct dirent* ent;
     while ((ent = readdir(dir)) != NULL) {
-      files.insert(ent->d_name);
+      // si c'est un repertoire, avec un nom de jour, il faut l'explorer...
+      if (!strncmp(ent->d_name, "arch-", 5)) {
+        double mjd = ArcheopsFile::decodeMJD(ent->d_name+5) - 2./24.; // ENTIER + .5 en temps local!
+        if (mjd >= tStart - 1. && mjd <= tEnd) {
+          string direc2 = directory + ent->d_name + filesep;
+          DIR* dir2 = opendir(direc2.c_str());
+          struct dirent* ent2;
+          while ((ent2 = readdir(dir2)) != NULL) {
+            if (*ent2->d_name == 'h') {
+              double mjd2 = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.;
+              if (mjd2 >= tStart - 1./24. && mjd2 <= tEnd) {
+                files.insert(direc2 + ent2->d_name);
+              }
+            }
+          }
+        }
+      } else {
+        if (!isOnBoardRecorder && *ent->d_name == 'h') {
+          double mjd = ArcheopsFile::decodeMJD(ent->d_name+1) - 2./24.; // $CHECK$ UTCOffset
+          if (mjd >= tStart - 1./24. && mjd <= tEnd) {
+            files.insert(directory + ent->d_name);
+          }
+        } else if (isOnBoardRecorder) {
+          if (strncmp(ent->d_name, "ARK", 3)) continue;
+          char * sfx = ent->d_name + strlen(ent->d_name) - 4;
+          if (strcmp(sfx, ".DAT")) continue;
+          files.insert(directory + ent->d_name);
+        }
+      }
     }
     closedir(dir);
@@ -79,22 +135,42 @@
   }
 
-  if (!file->lastParam()) file->nextBlock(block_param_mask);
+  // On avance jusqu'a avoir au moins un bloc param et un bloc reglage,
+  // car on ne peut rien faire sans...
+  // Si on a des donnees de l'enregistreur de vol, pas de bloc param, et
+  // on en simule un
+  if (!file->lastParam()) {
+    if (isOnBoardRecorder) {
+      extern param_bolo  parametr;
+      block_type_param block;
+      block.param = parametr;
+      valide_block((block_type_modele*)&block, block_param, 0);
+      file->forceBlock((block_type_modele*)&block);
+    } else {
+      file->nextBlock(block_param_mask);
+    }
+  }
   if (!file->lastReglage()) file->nextBlock(block_reglage_mask);
   
   // On cherche un bloc GPS pour avoir la correspondance timestamp/UTC.
   // Pour le moment, on se fonde sur le premier bloc GPS. On pourra faire
-  // mieux en prenant le min de tous les delta_T.
-  
-  tBlock0 = file->getStartMJD();
-
-  file->pushMark();
-  if (file->lastGPS() || file->nextBlock(block_gps_mask)) {
-    // le temps du bloc courant, en secondes
-    double dt = file->blockNum() * file->perBlock();
-    tBlock0 = file->getGPSMJD() - dt/86400.;
-  } else { // pas de bloc GPS...
+  // mieux en prenant le min de tous les delta_T, a condition d'avoir un 
+  // peu plus de details sur la facon dont le GPS est lu.
+  
+  if (tBlock0 < 0) {
     tBlock0 = file->getStartMJD();
-  }
-  file->popMark();
+
+    file->pushMark();
+    if (file->lastGPS() || file->nextBlock(block_gps_mask)) {
+      // le temps du bloc courant, en secondes
+      double dt = file->blockNum() * file->perBlock();
+      tBlock0 = file->getGPSMJD() - dt/86400.;
+    } else { // pas de bloc GPS...
+      tBlock0 = file->getStartMJD();
+    }
+    file->popMark();
+  }
+  
+  if (perEch < 0)
+    perEch = file->perEchant();
 
   bool hasInterp = false;
@@ -109,6 +185,8 @@
           trigMask |= block_bolo_mask;
           break;
+        case gpsTime:
         case longitude:
         case latitude:
+        case altitude:
           trigMask |= block_gps_mask;
           break;
@@ -125,4 +203,10 @@
           file->needSSTProcessMask(SSTHandler::rmveOffset);
           trigMask |= block_sst_mask;
+          break;
+        case sstRaw:
+          trigMask |= block_sst_mask;
+          break;
+        case gyroRaw:
+          trigMask |= block_gyro_mask;
           break;
         case alphaAxis:
@@ -157,5 +241,5 @@
     return rawIter->NextFile();
     
-  if (directory == "") {
+  if (files.empty()) {
     return false;
   } else {
@@ -163,4 +247,5 @@
     curFile++;
     if (curFile == files.end()) return false;
+    cout << "opening file " << (*curFile).c_str() << endl;
     ArcheopsFile* newfile = new ArcheopsFile((*curFile).c_str());
     newfile->grabLastBlocs(*file);
@@ -242,11 +327,23 @@
        return true;
      case boloTens:
+       if (imes==0 && file->llastBolo()==NULL) return false;
+       return file->lastBolo() != NULL;
      case boloRaw:
        return file->lastBolo() != NULL;
      case sstSignal:
+     case sstRaw:
        return file->lastSST() != NULL;
+     case sstStarZ:
+     case sstStarF:
+       return (file->lastSST() != NULL) && (file->getSSTStarZ(index, imes) >= 0);
+     case gyroRaw:
+       return (file->lastGyro() != NULL);
+     case gpsTime:
+       return file->hasGPSTime();
      case longitude:
      case latitude:
-       return file->lastGPS() != NULL;
+       return file->hasGPSPos();
+     case altitude:
+       return file->hasGPSAlt();
      case azimut:
      case alphaAxis:
@@ -271,5 +368,6 @@
        return file->blockNum() * file->nEchBlock() + imes;
      case internalTime:
-       return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant();
+       //return (file->blockNum() * file->nEchBlock() + imes) * file->perEchant();
+       return (file->blockNum() * file->nEchBlock() + imes) * perEch;
      case utc:
       /* printf("utc: %d %d %g %g %g\n",file->blockNum(),
@@ -278,5 +376,6 @@
          (file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.,
          tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.); */
-       return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.;
+       //return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * file->perEchant()/86400.;
+       return tBlock0+(file->blockNum() * file->nEchBlock() + imes) * perEch/86400.;
      case boloTens:
        return file->getMuVBolo(index, imes);
@@ -285,8 +384,20 @@
      case sstSignal:
        return file->getSSTSignal(index, imes);
+     case sstRaw:
+       return file->getSSTRawSignal(index, imes);
+     case sstStarZ:
+       return file->getSSTStarZ(index, imes);
+     case sstStarF:
+       return file->getSSTStarF(index, imes);
+     case gyroRaw:
+       return file->getGyro(index, imes);
+     case gpsTime:
+       return file->getGPSUTC();
      case longitude:
-       return file->getGPSLong(); // $CHECK$ TBD gerer interpolation (dans file)
+       return file->getGPSLong();
      case latitude:
-       return file->getGPSLat();  // $CHECK$ TBD gerer interpolation (dans file)
+       return file->getGPSLat();
+     case altitude:
+       return file->getGPSAlt();
      case azimut:
        return file->getAzimut(imes);
@@ -301,4 +412,7 @@
 bool   TOIIter::newValue(int column) {
    if (column < 0 || column >= infos.size()) return false;
+   if (rawIter) {
+       return interp[column].isNewValue(lastSample);
+   }
    TOIKind kind = infos[column].kind;
    switch (kind) {
@@ -311,9 +425,18 @@
      case boloRaw:
        return file->blockNum() == file->getBoloBlockNum();
+     case sstRaw:
      case sstSignal:
+     case sstStarZ:
+     case sstStarF:
        return file->blockNum() == file->getSSTBlockNum();
+     case gyroRaw:
+       return file->blockNum() == file->getGyroBlockNum();
+     case gpsTime:
+       return file->blockNum() == file->getGPSBlockNum() && imes==0;
      case longitude:
        return file->blockNum() == file->getGPSBlockNum() && imes==0;
      case latitude:
+       return file->blockNum() == file->getGPSBlockNum() && imes==0;
+     case altitude:
        return file->blockNum() == file->getGPSBlockNum() && imes==0;
      case azimut:
@@ -334,4 +457,10 @@
    return (infos[column].interpolated && !newValue(column));
 }
+
+bool TOIIter::isTrig(int column) {
+   if (column < 0 || column >= infos.size()) return false;
+   return infos[column].triggering;
+}
+
  
 TOIKind TOIIter::getKind(int column) {
@@ -370,5 +499,9 @@
  
 int TOIIter::getSampleIndex() {
-   return file->blockNum() * file->nEchBlock() + imes;
+   if (file) {
+     return file->blockNum() * file->nEchBlock() + imes;
+   } else {
+     return lastSample;
+   }
 }
  
@@ -378,8 +511,15 @@
   long sample = rawIter->getSampleIndex();
   for (int i=0; i<infos.size(); i++) {
-    if (rawIter->canGetValue(i) && rawIter->newValue(i))
+    if (rawIter->canGetValue(i) && rawIter->newValue(i)) {
       interp[i].enterValue(rawIter->getValue(i), sample);
+    }
   }
   return true;
 }
 
+block_type_param* TOIIter::lastParam() {
+  if (file) return file->lastParam(); 
+  else return rawIter->lastParam();
+}
+
+
