| 1 | #include "toiiter.h"
 | 
|---|
| 2 | #include <dirent.h>
 | 
|---|
| 3 | 
 | 
|---|
| 4 | // Format bloc GPS
 | 
|---|
| 5 | // $GPGGA,hhmmss.ss,ddmm.mmmm,n,dddmm.mmmm,e,q,ss,y.y,a.a,z,
 | 
|---|
| 6 | 
 | 
|---|
| 7 | TOIIter::TOIIter() {
 | 
|---|
| 8 |  // Toutes les valeurs initialisees par defaut. Le TOISvr les positionnera,
 | 
|---|
| 9 |  // puis lancera l'initialisation
 | 
|---|
| 10 |  
 | 
|---|
| 11 |  file = NULL;
 | 
|---|
| 12 |  directory = "";
 | 
|---|
| 13 |  fileName = "";
 | 
|---|
| 14 |  
 | 
|---|
| 15 |  tStart = -9.e99;
 | 
|---|
| 16 |  tEnd   = -9.e99;
 | 
|---|
| 17 |  
 | 
|---|
| 18 |  tBlock0 = -1;
 | 
|---|
| 19 | 
 | 
|---|
| 20 | }
 | 
|---|
| 21 | 
 | 
|---|
| 22 | TOIIter::TOIIter(TOIIter const& x) {
 | 
|---|
| 23 |   directory = x.directory;
 | 
|---|
| 24 |   fileName = x.fileName;
 | 
|---|
| 25 |   files = x.files;
 | 
|---|
| 26 |   curFile = x.curFile;
 | 
|---|
| 27 |   imes = x.imes;
 | 
|---|
| 28 |   tStart = x.tStart;
 | 
|---|
| 29 |   tEnd = x.tEnd;
 | 
|---|
| 30 |   tBlock0 = x.tBlock0;
 | 
|---|
| 31 |   trigMask = x.trigMask;
 | 
|---|
| 32 |   infos = x.infos;   
 | 
|---|
| 33 | 
 | 
|---|
| 34 |   file = new ArcheopsFile(*x.file);
 | 
|---|
| 35 | }
 | 
|---|
| 36 | 
 | 
|---|
| 37 | TOIIter::~TOIIter() {
 | 
|---|
| 38 |   delete file;
 | 
|---|
| 39 | }
 | 
|---|
| 40 | 
 | 
|---|
| 41 | void TOIIter::Init() {
 | 
|---|
| 42 |   if (directory == "") {
 | 
|---|
| 43 |     file = new ArcheopsFile(fileName);
 | 
|---|
| 44 |   } else {
 | 
|---|
| 45 |     DIR* dir = opendir(directory.c_str());
 | 
|---|
| 46 |     struct dirent* ent;
 | 
|---|
| 47 |     while ((ent = readdir(dir)) != NULL) {
 | 
|---|
| 48 |       files.insert(ent->d_name);
 | 
|---|
| 49 |     }
 | 
|---|
| 50 |     closedir(dir);
 | 
|---|
| 51 |     curFile = files.begin();
 | 
|---|
| 52 |     file = new ArcheopsFile((*curFile).c_str());
 | 
|---|
| 53 |   }
 | 
|---|
| 54 | 
 | 
|---|
| 55 |   if (!file->lastParam()) file->nextBlock(block_param_mask);
 | 
|---|
| 56 |   if (!file->lastReglage()) file->nextBlock(block_reglage_mask);
 | 
|---|
| 57 |   
 | 
|---|
| 58 |   // On cherche un bloc GPS pour avoir la correspondance timestamp/UTC.
 | 
|---|
| 59 |   // Pour le moment, on se fonde sur le premier bloc GPS. On pourra faire
 | 
|---|
| 60 |   // mieux en prenant le min de tous les delta_T.
 | 
|---|
| 61 |   
 | 
|---|
| 62 |     tBlock0 = file->getStartMJD();
 | 
|---|
| 63 | #if 0
 | 
|---|
| 64 |   file->pushMark();
 | 
|---|
| 65 |   if (file->lastGPS() || file->nextBlock(block_gps_mask)) {
 | 
|---|
| 66 |     // le temps du bloc courant, en secondes
 | 
|---|
| 67 |     double dt = file->blockNum() * file->perBlock();
 | 
|---|
| 68 |     tBlock0 = file->getGPSMJD() - dt/86400.;
 | 
|---|
| 69 |   } else { // pas de bloc GPS...
 | 
|---|
| 70 |     tBlock0 = file->getStartMJD();
 | 
|---|
| 71 |   }
 | 
|---|
| 72 |   file->popMark();
 | 
|---|
| 73 | #endif  
 | 
|---|
| 74 |   
 | 
|---|
| 75 |   trigMask = 0;
 | 
|---|
| 76 |   for (vector<info>::iterator i = infos.begin(); i != infos.end(); i++) {
 | 
|---|
| 77 |     if ((*i).triggering) {
 | 
|---|
| 78 |       switch ((*i).kind) {
 | 
|---|
| 79 |         case boloTens:
 | 
|---|
| 80 |         case boloRaw:
 | 
|---|
| 81 |           trigMask |= block_bolo_mask;
 | 
|---|
| 82 |           break;
 | 
|---|
| 83 |         case longitude:
 | 
|---|
| 84 |         case latitude:
 | 
|---|
| 85 |           trigMask |= block_gps_mask;
 | 
|---|
| 86 |           break;
 | 
|---|
| 87 |         case azimut:
 | 
|---|
| 88 |           trigMask |= block_sst_mask;
 | 
|---|
| 89 |           break;
 | 
|---|
| 90 |         case alpha:
 | 
|---|
| 91 |         case delta:
 | 
|---|
| 92 |           trigMask |= block_sst_mask;
 | 
|---|
| 93 |           break;
 | 
|---|
| 94 |       }
 | 
|---|
| 95 |     }
 | 
|---|
| 96 |   }
 | 
|---|
| 97 |   
 | 
|---|
| 98 |   if (trigMask & (block_bolo_mask | block_sst_mask)) {
 | 
|---|
| 99 |     imes = 9999;
 | 
|---|
| 100 |   } else {
 | 
|---|
| 101 |     imes = 0;
 | 
|---|
| 102 |   }
 | 
|---|
| 103 | }
 | 
|---|
| 104 | 
 | 
|---|
| 105 | bool TOIIter::NextFile() {
 | 
|---|
| 106 |   if (directory == "") {
 | 
|---|
| 107 |     return false;
 | 
|---|
| 108 |   } else {
 | 
|---|
| 109 |     if (curFile == files.end()) return false;
 | 
|---|
| 110 |     curFile++;
 | 
|---|
| 111 |     if (curFile == files.end()) return false;
 | 
|---|
| 112 |     ArcheopsFile* newfile = new ArcheopsFile((*curFile).c_str());
 | 
|---|
| 113 |     newfile->grabLastBlocs(*file);
 | 
|---|
| 114 |     delete file;
 | 
|---|
| 115 |     file = newfile;
 | 
|---|
| 116 |     return true;
 | 
|---|
| 117 |   }
 | 
|---|
| 118 | }
 | 
|---|
| 119 | 
 | 
|---|
| 120 | bool TOIIter::Next() {
 | 
|---|
| 121 | 
 | 
|---|
| 122 | 
 | 
|---|
| 123 |   // trigger sur info indexee dans bloc bolo ou bloc sst ?
 | 
|---|
| 124 |   if (trigMask & (block_bolo_mask | block_sst_mask)) {
 | 
|---|
| 125 |     imes++;
 | 
|---|
| 126 |     if (imes < file->nEchBlock()) return true;
 | 
|---|
| 127 |     imes = 0;
 | 
|---|
| 128 |   }
 | 
|---|
| 129 |   
 | 
|---|
| 130 |   // soit pas d'info indexee, soit fin bloc courant...
 | 
|---|
| 131 |   
 | 
|---|
| 132 |   if (file->nextBlock(trigMask)) {
 | 
|---|
| 133 |     return true;
 | 
|---|
| 134 |   }
 | 
|---|
| 135 |   if (!NextFile()) return false;
 | 
|---|
| 136 |   return file->nextBlock(trigMask);
 | 
|---|
| 137 | }
 | 
|---|
| 138 | 
 | 
|---|
| 139 |  double TOIIter::getTime() {                // MJD 
 | 
|---|
| 140 |    // le temps du bloc courant, en secondes
 | 
|---|
| 141 |    double dt = file->blockNum() * file->perBlock();
 | 
|---|
| 142 |    return tBlock0 + dt/86400. + imes*file->perEchant()/86400.;
 | 
|---|
| 143 |  }
 | 
|---|
| 144 |  
 | 
|---|
| 145 |  double TOIIter::getValue(int column) {
 | 
|---|
| 146 |    if (column < 0 || column >= infos.size()) return -1;
 | 
|---|
| 147 |    TOIKind kind = infos[column].kind;
 | 
|---|
| 148 |    int index = infos[column].index;
 | 
|---|
| 149 |    switch (kind) {
 | 
|---|
| 150 |      case boloTens:
 | 
|---|
| 151 |        return file->getMuVBolo(index, imes);
 | 
|---|
| 152 |      case boloRaw:
 | 
|---|
| 153 |        return file->getRawBolo(index, imes);
 | 
|---|
| 154 |      case longitude:
 | 
|---|
| 155 |        return file->getGPSLong(); // $CHECK$ TBD gerer interpolation (dans file)
 | 
|---|
| 156 |      case latitude:
 | 
|---|
| 157 |        return file->getGPSLat();  // $CHECK$ TBD gerer interpolation (dans file)
 | 
|---|
| 158 |       case azimut:
 | 
|---|
| 159 |        return file->getAzimut(imes);
 | 
|---|
| 160 |       case alpha:
 | 
|---|
| 161 |        return file->getAlpha(imes);
 | 
|---|
| 162 |       case delta:
 | 
|---|
| 163 |        return file->getDelta(imes);
 | 
|---|
| 164 |    }
 | 
|---|
| 165 |    return -1;
 | 
|---|
| 166 |  }
 | 
|---|
| 167 |  
 | 
|---|
| 168 |  bool   TOIIter::newValue(int column) {
 | 
|---|
| 169 |    if (column < 0 || column >= infos.size()) return false;
 | 
|---|
| 170 |    TOIKind kind = infos[column].kind;
 | 
|---|
| 171 |    switch (kind) {
 | 
|---|
| 172 |      case boloTens:
 | 
|---|
| 173 |        return file->blockKind() == block_bolo;
 | 
|---|
| 174 |      case boloRaw:
 | 
|---|
| 175 |        return file->blockKind() == block_bolo;
 | 
|---|
| 176 |      case longitude:
 | 
|---|
| 177 |        return file->blockKind() == block_gps;
 | 
|---|
| 178 |      case latitude:
 | 
|---|
| 179 |        return file->blockKind() == block_gps;
 | 
|---|
| 180 |       case azimut:
 | 
|---|
| 181 |        return file->blockKind() == block_sst || file->blockKind() == block_bolo;
 | 
|---|
| 182 |       case alpha:
 | 
|---|
| 183 |        return file->blockKind() == block_sst || file->blockKind() == block_bolo;
 | 
|---|
| 184 |       case delta:
 | 
|---|
| 185 |        return file->blockKind() == block_sst || file->blockKind() == block_bolo;
 | 
|---|
| 186 |    }
 | 
|---|
| 187 |    return false;
 | 
|---|
| 188 |  }
 | 
|---|
| 189 |  
 | 
|---|
| 190 |  bool   TOIIter::extendValue(int column) {
 | 
|---|
| 191 |    return !newValue(column);
 | 
|---|
| 192 |  }
 | 
|---|
| 193 |  
 | 
|---|
| 194 |  bool   TOIIter::interpValue(int /*column*/) {
 | 
|---|
| 195 |    return false; // $CHECK$ TBD gerer interpolation
 | 
|---|
| 196 |  }
 | 
|---|
| 197 |  
 | 
|---|
| 198 |  TOIKind TOIIter::getKind(int column) {
 | 
|---|
| 199 |    if (column < 0 || column >= infos.size()) return (TOIKind)-1;
 | 
|---|
| 200 |    return infos[column].kind;
 | 
|---|
| 201 |  }
 | 
|---|
| 202 |  
 | 
|---|
| 203 |  int TOIIter::getIndex(int column) {
 | 
|---|
| 204 |    if (column < 0 || column >= infos.size()) return (TOIKind)-1;
 | 
|---|
| 205 |    return infos[column].index;
 | 
|---|
| 206 |  }
 | 
|---|
| 207 |    
 | 
|---|
| 208 |  int TOIIter::getSampleIndex() {
 | 
|---|
| 209 |    return imes;
 | 
|---|
| 210 |  } | 
|---|