| 1 | //---------------------------------------------------------------- | 
|---|
| 2 | // ---- classes de threads pour lecture (transfert DMA) | 
|---|
| 3 | //      et ecriture disque pour acquisition   BAORadio       ----- | 
|---|
| 4 | // LAL -      R. Ansari - Juin/Juillet 2008 | 
|---|
| 5 | //---------------------------------------------------------------- | 
|---|
| 6 |  | 
|---|
| 7 | #include "racqurw.h" | 
|---|
| 8 |  | 
|---|
| 9 | #include <stdlib.h> | 
|---|
| 10 | #include <unistd.h> | 
|---|
| 11 | #include <fstream> | 
|---|
| 12 | #include <signal.h> | 
|---|
| 13 | #include "pexceptions.h" | 
|---|
| 14 | #include "timestamp.h" | 
|---|
| 15 |  | 
|---|
| 16 | #include "pciewrap.h" | 
|---|
| 17 | #include "brpaqu.h" | 
|---|
| 18 | #include "minifits.h" | 
|---|
| 19 |  | 
|---|
| 20 | #include "resusage.h" // Pour mesure temps elapsed/CPU ... | 
|---|
| 21 | #include "datatable.h" // Pour sauver les entetes de paquet | 
|---|
| 22 | #include <sys/time.h>  // pour gettimeofday | 
|---|
| 23 | //------------------------------------------------------- | 
|---|
| 24 | // Classe thread de lecture PCI-Express | 
|---|
| 25 | //------------------------------------------------------- | 
|---|
| 26 |  | 
|---|
| 27 | PCIEReader::PCIEReader(PCIEWrapperInterface &pciw,uint_4 sizeFrame,uint_4 packSize ,RAcqMemZoneMgr& mem, | 
|---|
| 28 | uint_4 nmax, BRDataFmtConv swapall) | 
|---|
| 29 | :   memgr(mem) , pciw_ (pciw) | 
|---|
| 30 | { | 
|---|
| 31 | nmax_ = nmax; | 
|---|
| 32 | swapall_ = swapall;   // select data swap/format conversion for BRPaquet | 
|---|
| 33 | stop_ = false; | 
|---|
| 34 | packSize_ = packSize; | 
|---|
| 35 | sizeFr_ =sizeFrame; | 
|---|
| 36 | // Pour la logique de gestion des paquets ds zone memoire | 
|---|
| 37 | mid_ = -2; | 
|---|
| 38 | targ_npaq_ = 0; | 
|---|
| 39 |  | 
|---|
| 40 | max_targ_npaq = memgr.NbPaquets(); | 
|---|
| 41 | mmbuf_ = NULL; | 
|---|
| 42 | } | 
|---|
| 43 |  | 
|---|
| 44 | bool PCIEReader::MZoneManage(bool fgclean)    // Retourne true si probleme | 
|---|
| 45 | { | 
|---|
| 46 | /* Pour debug | 
|---|
| 47 | cout << " PCIEReader::MZoneManage() mid_=" << mid_ << " arg_npaq_= " << targ_npaq_ | 
|---|
| 48 | << " max_targ_npaq=" << max_targ_npaq << endl; | 
|---|
| 49 | */ | 
|---|
| 50 | if (mid_ >= 0)  memgr.FreeMemZone(mid_, MemZS_Filled); | 
|---|
| 51 | mmbuf_ = NULL;  targ_npaq_ = 0;  mid_ = -2; | 
|---|
| 52 | if (fgclean)  return false; | 
|---|
| 53 | mid_ = memgr.FindMemZoneId(MemZA_Fill); | 
|---|
| 54 | mmbuf_ = memgr.GetMemZone(mid_); | 
|---|
| 55 | if (mmbuf_==NULL) return true; | 
|---|
| 56 | return false; | 
|---|
| 57 | } | 
|---|
| 58 |  | 
|---|
| 59 | void PCIEReader::run() | 
|---|
| 60 | { | 
|---|
| 61 | struct sigaction act; | 
|---|
| 62 | struct sigaction old_act; | 
|---|
| 63 | //Precision insuffisante  ResourceUsage ru; ru.Update();  // Pour recuperer le temps passe | 
|---|
| 64 | struct timeval tv1, tv2; | 
|---|
| 65 | gettimeofday(&tv1, NULL); | 
|---|
| 66 |  | 
|---|
| 67 | try{ | 
|---|
| 68 | cout << " PCIEReader::run() - Starting , NMaxMemZones=" << nmax_ | 
|---|
| 69 | << "memgr.NbPaquets()=" << memgr.NbPaquets() << endl; | 
|---|
| 70 | setRC(1); | 
|---|
| 71 |  | 
|---|
| 72 | uint_4 cpt=0; | 
|---|
| 73 | // sigaddset(&act.sa_mask,SIGINT);  // pour proteger le transfert DMA | 
|---|
| 74 | //sigaction(SIGINT,&act,NULL); | 
|---|
| 75 |  | 
|---|
| 76 | uint_4 paqsz = memgr.PaqSize(); | 
|---|
| 77 | uint_4 dmasz = pciw_.TransferSize(); | 
|---|
| 78 | pciw_.StartTransfers(); | 
|---|
| 79 |  | 
|---|
| 80 | Byte* Datas = NULL; | 
|---|
| 81 | Byte* tampon = new Byte[paqsz]; | 
|---|
| 82 | Byte* nextpaq = NULL; | 
|---|
| 83 |  | 
|---|
| 84 | uint_4 off_acheval = 0; | 
|---|
| 85 |  | 
|---|
| 86 | int nerrdma = 0; | 
|---|
| 87 | int maxerrdma = 10; | 
|---|
| 88 | bool fgarret = false; | 
|---|
| 89 |  | 
|---|
| 90 | uint_4 npaqfait = 0;    //  Nb total de paquets traites (DMA + decode) | 
|---|
| 91 |  | 
|---|
| 92 | ///  do{  si boucle infini | 
|---|
| 93 | //  for (uint_4 kmz=0; kmz<nmax_; kmz++)  { | 
|---|
| 94 | while (npaqfait < nmax_*memgr.NbPaquets()) { | 
|---|
| 95 | if (stop_) break; | 
|---|
| 96 | if (fgarret) break; | 
|---|
| 97 | // On pointe vers le debut de la zone a remplir aver le prochain DMA | 
|---|
| 98 | Datas=pciw_.GetData(); | 
|---|
| 99 | if (Datas == NULL) { // No data Read in DMA | 
|---|
| 100 | nerrdma ++; | 
|---|
| 101 | cout << "PCIEReaderChecker/Erreur Waiting for datas ..." << endl; | 
|---|
| 102 | pciw_.PrintStatus(cout); | 
|---|
| 103 | if (nerrdma>=maxerrdma) { fgarret = true; break; } | 
|---|
| 104 | } | 
|---|
| 105 | else {  // DMA reussi | 
|---|
| 106 | uint_4 curoff = 0; | 
|---|
| 107 | //1- On traite le paquet a cheval, rempli partiellement avec le DMA d'avant si necessaire | 
|---|
| 108 | if (off_acheval > 0) { | 
|---|
| 109 | if ((paqsz-off_acheval)< dmasz) { | 
|---|
| 110 | memcpy((void *)(tampon+off_acheval), (void *)Datas, paqsz-off_acheval); | 
|---|
| 111 | curoff = paqsz-off_acheval;  off_acheval = 0; | 
|---|
| 112 |  | 
|---|
| 113 | if ((nextpaq=NextPaqTarget()) == NULL) { | 
|---|
| 114 | cout << "2 PCIEReader::run()/Error NextPaqTarget() returned NULL ->STOP 9" << endl; | 
|---|
| 115 | setRC(9);  fgarret=true; break; | 
|---|
| 116 | } | 
|---|
| 117 | BRPaquet paq(tampon, nextpaq, paqsz, swapall_); | 
|---|
| 118 | npaqfait++;  // Ne pas oublier le compteur de paquets faits | 
|---|
| 119 | } | 
|---|
| 120 | else { | 
|---|
| 121 | memcpy((void *)(tampon+off_acheval), (void *)Datas, dmasz); | 
|---|
| 122 | curoff =dmasz; | 
|---|
| 123 | off_acheval = (dmasz+off_acheval); | 
|---|
| 124 | } | 
|---|
| 125 | } | 
|---|
| 126 | //2- On traite les paquets complet qui se trouvent dans la zone du DMA | 
|---|
| 127 | while((curoff+paqsz)<=dmasz) { | 
|---|
| 128 | //          BRPaquet paq((Byte*)(Datas)+((paqsz*j)), nextdma+j*paqsz, paqsz, swapall_); | 
|---|
| 129 | if ((nextpaq=NextPaqTarget()) == NULL) { | 
|---|
| 130 | cout << "3 PCIEReader::run()/Error NextPaqTarget() returned NULL ->STOP 9" << endl; | 
|---|
| 131 | setRC(9);  fgarret=true; break; | 
|---|
| 132 | } | 
|---|
| 133 | BRPaquet paq(Datas+curoff, nextpaq, paqsz, swapall_); | 
|---|
| 134 | curoff += paqsz;  // On avance l'index dans le buffer du DMA | 
|---|
| 135 | npaqfait++;  // Ne pas oublier le compteur de paquets faits | 
|---|
| 136 | }  // -- FIN traitement des paquets complets ds un DMA | 
|---|
| 137 | //3- On copie si besoin la fin du DMA dans la zone tampon | 
|---|
| 138 | if (curoff < dmasz) { | 
|---|
| 139 | if (fgarret) break;  // pour sortir si l'on est passe par un STOP 9 | 
|---|
| 140 | off_acheval = dmasz-curoff; | 
|---|
| 141 | memcpy(tampon, (void*)(Datas+curoff), off_acheval); | 
|---|
| 142 | curoff += off_acheval; | 
|---|
| 143 | } | 
|---|
| 144 | }  //   Traitement d'un DMA OK | 
|---|
| 145 | } | 
|---|
| 146 | //  }while(!stop_); | 
|---|
| 147 |  | 
|---|
| 148 |  | 
|---|
| 149 | gettimeofday(&tv2, NULL); | 
|---|
| 150 | double tmelaps2 = (tv2.tv_sec-tv1.tv_sec)*1000.+(tv2.tv_usec-tv1.tv_usec)/1000.; | 
|---|
| 151 | if (tmelaps2<0.1) tmelaps2=0.1; | 
|---|
| 152 | cout << " ------------------ PCIEReader::run()-End summary -------------------" << endl; | 
|---|
| 153 | cout << " PCIEReader/Info TotTransfer=" << pciw_.TotTransferBytes()/1024 | 
|---|
| 154 | << " kb , ElapsTime=" << tmelaps2 << " ms ->" | 
|---|
| 155 | << (double)pciw_.TotTransferBytes()/tmelaps2 << " kb/s" << endl; | 
|---|
| 156 | cout << " --------------------------------------------------------------------" << endl; | 
|---|
| 157 |  | 
|---|
| 158 | MZoneManage(true); | 
|---|
| 159 | delete [] tampon; | 
|---|
| 160 |  | 
|---|
| 161 | }catch (PException& exc) { | 
|---|
| 162 | cout << " PCIEREADER::run()/catched PException " << exc.Msg() << endl; | 
|---|
| 163 | setRC(3); | 
|---|
| 164 | return; | 
|---|
| 165 | } | 
|---|
| 166 | catch(...) { | 
|---|
| 167 | cout << "  PCIEREADER::run()/catched unknown ... exception " << endl; | 
|---|
| 168 | setRC(4); | 
|---|
| 169 | return; | 
|---|
| 170 | } | 
|---|
| 171 | setRC(0); | 
|---|
| 172 |  | 
|---|
| 173 | return; | 
|---|
| 174 | } | 
|---|
| 175 |  | 
|---|
| 176 |  | 
|---|
| 177 | void PCIEReader::Stop() | 
|---|
| 178 | { | 
|---|
| 179 | // cout << " PCIEReader::Stop() -------------> STOP" <<endl; | 
|---|
| 180 | stop_ = true; | 
|---|
| 181 | return; | 
|---|
| 182 | } | 
|---|
| 183 |  | 
|---|
| 184 |  | 
|---|
| 185 | //------------------------------------------------------- | 
|---|
| 186 | // Classe thread de sauvegarde sur fichiers | 
|---|
| 187 | //------------------------------------------------------- | 
|---|
| 188 |  | 
|---|
| 189 | DataSaver::DataSaver(RAcqMemZoneMgr& mem, string& path, uint_4 nfiles, uint_4 nblocperfile, bool savesig) | 
|---|
| 190 | :  memgr(mem) | 
|---|
| 191 | { | 
|---|
| 192 | nfiles_ = nfiles; | 
|---|
| 193 | nblocperfile_ = nblocperfile; | 
|---|
| 194 | nmax_ = nblocperfile_*nfiles_; | 
|---|
| 195 | savesig_ = savesig;  // Si false, pas d'ecriture des fichiers FITS du signal | 
|---|
| 196 | stop_ = false; | 
|---|
| 197 | path_ = path; | 
|---|
| 198 | } | 
|---|
| 199 | void DataSaver::Stop() | 
|---|
| 200 | { | 
|---|
| 201 | // cout<< " DataSaver:Stop ........ " << endl; | 
|---|
| 202 | stop_=true; | 
|---|
| 203 |  | 
|---|
| 204 | } | 
|---|
| 205 | void DataSaver::run() | 
|---|
| 206 | { | 
|---|
| 207 | setRC(1); | 
|---|
| 208 | BRPaqChecker pcheck;  // Verification/comptage des paquets | 
|---|
| 209 |  | 
|---|
| 210 | try { | 
|---|
| 211 | TimeStamp ts; | 
|---|
| 212 | cout << " DataSaver::run() - Starting " << ts << " NbFiles=" << nfiles_ << " NBloc/File=" | 
|---|
| 213 | << nblocperfile_ << " NMaxMemZones=" << nmax_ << endl; | 
|---|
| 214 | char fname[512]; | 
|---|
| 215 |  | 
|---|
| 216 | sprintf(fname,"%s/saver.log",path_.c_str()); | 
|---|
| 217 | ofstream filog(fname); | 
|---|
| 218 | filog << " DataSaver::run() - starting log file " << ts << endl; | 
|---|
| 219 | filog << " NbFiles=" << nfiles_ << " NBloc/File="  << nblocperfile_ << " NMaxMemZones=" << nmax_ << endl; | 
|---|
| 220 |  | 
|---|
| 221 | DataTable dt; | 
|---|
| 222 | dt.AddLongColumn("TimeTag"); | 
|---|
| 223 | dt.AddIntegerColumn("FrameCounter"); | 
|---|
| 224 | dt.AddIntegerColumn("FrameLength"); | 
|---|
| 225 | dt.AddIntegerColumn("Num"); | 
|---|
| 226 | DataTableRow dtr = dt.EmptyRow(); | 
|---|
| 227 | uint_8 timtag = 0; | 
|---|
| 228 | uint_4 numpaq = 0; | 
|---|
| 229 | bool dthead = false;  // Mettre a false pour ne pas remplir DataTable Headers | 
|---|
| 230 |  | 
|---|
| 231 |  | 
|---|
| 232 | uint_4 fnum=0; | 
|---|
| 233 | uint_4 paqsz = memgr.PaqSize(); | 
|---|
| 234 | bool fgnulldev = false; | 
|---|
| 235 | if (path_ == "/dev/null") { | 
|---|
| 236 | cout << " DataSaver::run()/Warning /dev/null path specified, filenames=/dev/null" << endl; | 
|---|
| 237 | fgnulldev = true; | 
|---|
| 238 | } | 
|---|
| 239 | for (uint_4 nbFile=0;nbFile<nfiles_ ;nbFile++) { | 
|---|
| 240 | if (stop_ )   break; | 
|---|
| 241 | if (fgnulldev) strcpy(fname,"/dev/null"); | 
|---|
| 242 | else sprintf(fname,"%s/HDRfits%d.txt",path_.c_str(),fnum); | 
|---|
| 243 | ofstream header(fname); | 
|---|
| 244 |  | 
|---|
| 245 | BRPaquet paq0(NULL, NULL, paqsz); | 
|---|
| 246 | uint_4 npaqperfile = memgr.NbPaquets()*nblocperfile_;  // Nombre de paquets ecrits dans un fichier | 
|---|
| 247 |  | 
|---|
| 248 | MiniFITSFile mff; | 
|---|
| 249 | if (savesig_) { //Reza - Ouverture conditionnel fichier | 
|---|
| 250 | if (fgnulldev) strcpy(fname,"/dev/null"); | 
|---|
| 251 | else sprintf(fname,"%s/signal%d.fits",path_.c_str(),(int)fnum++); | 
|---|
| 252 | mff.Open(fname,MF_Write);  //Reza - Ouverture conditionnel fichier | 
|---|
| 253 | // Entete correspondant a l'ecriture tout le paquet - trailer compris (modif Mai 2009) | 
|---|
| 254 | mff.setDTypeNaxis(MF_Byte, paq0.PaquetSize(), npaqperfile); | 
|---|
| 255 | // Sans TRAILER de paquet mff.setDTypeNaxis(MF_Byte, paq0.DataSize()+paq0.HeaderSize(), npaqperfile); | 
|---|
| 256 | } | 
|---|
| 257 | else sprintf(fname,"MemDataBloc[%d]-NoDataFile",(int)fnum++); | 
|---|
| 258 |  | 
|---|
| 259 | for (uint_4 kmz=0; kmz<nblocperfile_; kmz++) { | 
|---|
| 260 | if (stop_) break; | 
|---|
| 261 | //DBG cout << " DataSaver::run()- nbFile=" << nbFile << " kmz=" << kmz << endl; | 
|---|
| 262 | int mid = memgr.FindMemZoneId(MemZA_Save); | 
|---|
| 263 | Byte* buff = memgr.GetMemZone(mid); | 
|---|
| 264 | if (buff == NULL) { | 
|---|
| 265 | cout << " DataSaver::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl; | 
|---|
| 266 | setRC(2); | 
|---|
| 267 | return; | 
|---|
| 268 | } | 
|---|
| 269 | for(uint_4 i=0; i<memgr.NbPaquets(); i++) { | 
|---|
| 270 |  | 
|---|
| 271 | BRPaquet paq(NULL, buff+i*paqsz, paqsz); | 
|---|
| 272 | pcheck.Check(paq);   // Verification du paquet / FrameCounter | 
|---|
| 273 | if (savesig_) | 
|---|
| 274 | header << hex << paq.HDRMarker() << " " << paq.TRLMarker() << " " | 
|---|
| 275 | << paq.TimeTag2()<< " "<< paq.TimeTag1()<< " " | 
|---|
| 276 | << paq.FrameCounter() << " " << paq.PaqLen()  << endl; | 
|---|
| 277 |  | 
|---|
| 278 | if (dthead) {  // Remplissage DataTable entetes paquets | 
|---|
| 279 | timtag = (uint_8)paq.TimeTag2()*0x100000000ULL+paq.TimeTag1(); | 
|---|
| 280 | dtr[0] = timtag; | 
|---|
| 281 | dtr[1] = paq.FrameCounter(); | 
|---|
| 282 | dtr[2] = paq.PaqLen(); | 
|---|
| 283 | dtr[3] = numpaq++; | 
|---|
| 284 | dt.AddRow(dtr); | 
|---|
| 285 | } | 
|---|
| 286 |  | 
|---|
| 287 | if (savesig_) // Reza - Ecriture conditionnel fichier fits signal | 
|---|
| 288 | mff.WriteB(paq.Header(),paq.PaquetSize()); // ecriture tout le paquet (modif Mai 2009) | 
|---|
| 289 | //  mff.WriteB(paq.Data1(), paq.DataSize()); | 
|---|
| 290 | //  mff.WriteB(paq.Header(),paq.DataSize()+paq.HeaderSize()); // ecriture datas + header | 
|---|
| 291 | } | 
|---|
| 292 | memgr.FreeMemZone(mid, MemZS_Saved); | 
|---|
| 293 | } | 
|---|
| 294 | ts.SetNow(); | 
|---|
| 295 | filog << ts << " : OK data file  " << fname << endl; | 
|---|
| 296 | cout << " DataSaver::run() " << ts << " : OK data file  " << fname << endl; | 
|---|
| 297 | } | 
|---|
| 298 | if (dthead) { | 
|---|
| 299 | cout << dt; | 
|---|
| 300 | char fname2[256]; | 
|---|
| 301 | sprintf(fname2,"%s/headers.ppf",path_.c_str()); | 
|---|
| 302 | POutPersist po(fname2); | 
|---|
| 303 | po << dt; | 
|---|
| 304 | } | 
|---|
| 305 | cout << " --------------------  DataSaver::run() -------------------- " << endl; | 
|---|
| 306 | pcheck.Print(cout); | 
|---|
| 307 | cout << " ---------------------------------------------------------- " << endl; | 
|---|
| 308 | ts.SetNow(); | 
|---|
| 309 | pcheck.Print(filog); | 
|---|
| 310 | filog << " DataSaver::run() - End of processing/run() " << ts << endl; | 
|---|
| 311 |  | 
|---|
| 312 | } | 
|---|
| 313 | catch (MiniFITSException& exc) { | 
|---|
| 314 | cout << " DataSaver::run()/catched MiniFITSException " << exc.Msg() << endl; | 
|---|
| 315 | setRC(3); | 
|---|
| 316 | return; | 
|---|
| 317 | } | 
|---|
| 318 | catch(...) { | 
|---|
| 319 | cout << " DataSaver::run()/catched unknown ... exception " << endl; | 
|---|
| 320 | setRC(4); | 
|---|
| 321 | return; | 
|---|
| 322 | } | 
|---|
| 323 | setRC(0); | 
|---|
| 324 | return; | 
|---|
| 325 | } | 
|---|
| 326 |  | 
|---|
| 327 |  | 
|---|
| 328 |  | 
|---|
| 329 |  | 
|---|
| 330 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 331 | // Classe thread de lecture PCI-Express + Check pour tests de verification de debit/etc avec un seul thread | 
|---|
| 332 | //---------------------------------------------------------------------------------------------------------- | 
|---|
| 333 |  | 
|---|
| 334 | PCIEReaderChecker::PCIEReaderChecker(PCIEWrapperInterface &pciw,uint_4 sizeFrame,uint_4 packSize ,RAcqMemZoneMgr& mem, | 
|---|
| 335 | uint_4 nmax, BRDataFmtConv swapall) | 
|---|
| 336 | :   memgr(mem) , pciw_ (pciw) | 
|---|
| 337 | { | 
|---|
| 338 | nmax_ = nmax; | 
|---|
| 339 | swapall_ = swapall;   // select data swap/format conversion for BRPaquet | 
|---|
| 340 | stop_ = false; | 
|---|
| 341 | packSize_ = packSize; | 
|---|
| 342 | sizeFr_ =sizeFrame; | 
|---|
| 343 | } | 
|---|
| 344 | void PCIEReaderChecker::run() | 
|---|
| 345 | { | 
|---|
| 346 |  | 
|---|
| 347 | struct timeval tv1, tv2; | 
|---|
| 348 | gettimeofday(&tv1, NULL); | 
|---|
| 349 |  | 
|---|
| 350 | cout << " PCIEReaderChecker::run() - Starting , NMaxMemZones=" << nmax_ | 
|---|
| 351 | << " memgr.NbPaquets()=" << memgr.NbPaquets() << endl; | 
|---|
| 352 | setRC(1); | 
|---|
| 353 | cout << " ... RAcqMemZoneMgr not used - using s fixed memory location for packets decoding ..." << endl; | 
|---|
| 354 |  | 
|---|
| 355 | uint_4 cpt=0; | 
|---|
| 356 | // sigaddset(&act.sa_mask,SIGINT);  // pour proteger le transfert DMA | 
|---|
| 357 | //sigaction(SIGINT,&act,NULL); | 
|---|
| 358 | uint_4 paqsz = memgr.PaqSize(); | 
|---|
| 359 | uint_4 dmasz = pciw_.TransferSize(); | 
|---|
| 360 | pciw_.StartTransfers(); | 
|---|
| 361 |  | 
|---|
| 362 | BRPaqChecker pcheck;  // Verification/comptage des paquets | 
|---|
| 363 |  | 
|---|
| 364 | Byte* Datas = NULL; | 
|---|
| 365 | Byte* locdata = new Byte[paqsz]; | 
|---|
| 366 | Byte* tampon = new Byte[paqsz]; | 
|---|
| 367 |  | 
|---|
| 368 | uint_4 off_acheval = 0; | 
|---|
| 369 |  | 
|---|
| 370 | int nerrdma = 0; | 
|---|
| 371 | int maxerrdma = 10; | 
|---|
| 372 | bool fgarret = false; | 
|---|
| 373 | for (uint_4 kmz=0; kmz<nmax_; kmz++)  { | 
|---|
| 374 | if (stop_) break; | 
|---|
| 375 | if (fgarret) break; | 
|---|
| 376 |  | 
|---|
| 377 | Byte* nextdma = locdata; | 
|---|
| 378 | uint_4 npaqfait = 0; | 
|---|
| 379 | //      for (uint_4 i=0; i<memgr.NbPaquets(); i += pktInDMATr) {  // attention pktInDMATr paquets dans 1 seul DMA | 
|---|
| 380 | while (npaqfait < memgr.NbPaquets()) { | 
|---|
| 381 | if (fgarret) break; | 
|---|
| 382 | // On pointe vers le debut de la zone a remplir aver le prochain DMA | 
|---|
| 383 | //-- Zone memoire locale Byte* nextdma = buff+i*paqsz; | 
|---|
| 384 | Datas=pciw_.GetData(); | 
|---|
| 385 |  | 
|---|
| 386 | if (Datas == NULL) { // No data Read in DMA | 
|---|
| 387 | nerrdma ++; | 
|---|
| 388 | cout << "PCIEReaderChecker/Erreur Waiting for datas ..." << endl; | 
|---|
| 389 | pciw_.PrintStatus(cout); | 
|---|
| 390 | if (nerrdma>=maxerrdma) { fgarret = true; break; } | 
|---|
| 391 | } | 
|---|
| 392 | else { | 
|---|
| 393 | uint_4 curoff = 0; | 
|---|
| 394 | //1- On traite le paquet a cheval, rempli partiellement avec le DMA d'avant si necessaire | 
|---|
| 395 | //      if (off_acheval > 0) { | 
|---|
| 396 | //  memcpy((void *)(tampon+off_acheval), (void *)Datas, paqsz-off_acheval); | 
|---|
| 397 | //  curoff = paqsz-off_acheval;  off_acheval = 0; | 
|---|
| 398 |  | 
|---|
| 399 | // BRPaquet paq(tampon, locdata, paqsz, swapall_); | 
|---|
| 400 | //  npaqfait++;  // Ne pas oublier le compteur de paquets faits | 
|---|
| 401 | //  pcheck.Check(paq);   // Verification du paquet / FrameCounter | 
|---|
| 402 | //} | 
|---|
| 403 | if (off_acheval > 0) { | 
|---|
| 404 | if ((paqsz-off_acheval)< dmasz) { | 
|---|
| 405 | memcpy((void *)(tampon+off_acheval), (void *)Datas, paqsz-off_acheval); | 
|---|
| 406 | curoff = paqsz-off_acheval;  off_acheval = 0; | 
|---|
| 407 |  | 
|---|
| 408 | BRPaquet paq(tampon, locdata, paqsz, swapall_); | 
|---|
| 409 | npaqfait++;  // Ne pas oublier le compteur de paquets faits | 
|---|
| 410 | pcheck.Check(paq);   // Verification du paquet / FrameCounter | 
|---|
| 411 | } | 
|---|
| 412 | else { | 
|---|
| 413 | memcpy((void *)(tampon+off_acheval), (void *)Datas, dmasz); | 
|---|
| 414 | curoff =dmasz; | 
|---|
| 415 | off_acheval = (dmasz+off_acheval); | 
|---|
| 416 | } | 
|---|
| 417 | } | 
|---|
| 418 | //2- On traite les paquets complet qui se trouvent dans la zone du DMA | 
|---|
| 419 | while((curoff+paqsz)<=dmasz) { | 
|---|
| 420 | //        BRPaquet paq((Byte*)(Datas)+((paqsz*j)), nextdma+j*paqsz, paqsz, swapall_); | 
|---|
| 421 | BRPaquet paq(Datas+curoff, locdata, paqsz, swapall_); | 
|---|
| 422 | curoff += paqsz;  // On avance l'index dans le buffer du DMA | 
|---|
| 423 | npaqfait++;  // Ne pas oublier le compteur de paquets faits | 
|---|
| 424 | pcheck.Check(paq);   // Verification du paquet / FrameCounter | 
|---|
| 425 | }  // -- FIN traitement des paquets complets ds un DMA | 
|---|
| 426 | //3- On copie si besoin la fin du DMA dans la zone tampon | 
|---|
| 427 | if (curoff < dmasz) { | 
|---|
| 428 | off_acheval = dmasz-curoff; | 
|---|
| 429 | memcpy(tampon, (void*)(Datas+curoff), off_acheval); | 
|---|
| 430 | curoff += off_acheval; | 
|---|
| 431 | } | 
|---|
| 432 | }  //   Traitement d'un DMA OK | 
|---|
| 433 |  | 
|---|
| 434 | }  // Fin boucle de remplissage d'une zone memoire | 
|---|
| 435 | } //  Fin boucle sur les zones | 
|---|
| 436 |  | 
|---|
| 437 | setRC(0); | 
|---|
| 438 | gettimeofday(&tv2, NULL); | 
|---|
| 439 | double tmelaps2 = (tv2.tv_sec-tv1.tv_sec)*1000.+(tv2.tv_usec-tv1.tv_usec)/1000.; | 
|---|
| 440 | if (tmelaps2<0.1) tmelaps2=0.1; | 
|---|
| 441 | cout << " ------------------ PCIEReaderChecker::run()-End summary -------------------" << endl; | 
|---|
| 442 | cout << " PCIEReaderChecker/Info TotTransfer=" << pciw_.TotTransferBytes()/1024 | 
|---|
| 443 | << " kb , ElapsTime=" << tmelaps2 << " ms ->" | 
|---|
| 444 | << (double)pciw_.TotTransferBytes()/tmelaps2 << " kb/s" << endl; | 
|---|
| 445 | pcheck.Print(cout); | 
|---|
| 446 | cout << " --------------------------------------------------------------------" << endl; | 
|---|
| 447 |  | 
|---|
| 448 | delete [] locdata; | 
|---|
| 449 | delete [] tampon; | 
|---|
| 450 |  | 
|---|
| 451 | return; | 
|---|
| 452 | } | 
|---|
| 453 | void PCIEReaderChecker::Stop() | 
|---|
| 454 | { | 
|---|
| 455 | // cout << " PCIEReaderChecker::stop()  ........ STOP" <<endl; | 
|---|
| 456 | stop_ = true; | 
|---|
| 457 |  | 
|---|
| 458 | } | 
|---|