| 1 | //----------------------------------------------------------------
 | 
|---|
| 2 | // Projet BAORadio - (C) LAL/IRFU  2008-2010
 | 
|---|
| 3 | // Classes de base pour les threads de traitememt donnees BAORadio 
 | 
|---|
| 4 | //----------------------------------------------------------------
 | 
|---|
| 5 | 
 | 
|---|
| 6 | #include <stdlib.h>
 | 
|---|
| 7 | #include <string.h>
 | 
|---|
| 8 | #include <unistd.h>
 | 
|---|
| 9 | #include <fstream>
 | 
|---|
| 10 | #include "brbaseproc.h"
 | 
|---|
| 11 | 
 | 
|---|
| 12 | 
 | 
|---|
| 13 | using namespace SOPHYA;
 | 
|---|
| 14 | //---------------------------------------------------------------------
 | 
|---|
| 15 | // Classe BRBaseProcessor : classe de base pour l'analyse des donnees 
 | 
|---|
| 16 | // BAORadio - Les classes de traitement heritent de cette classe et 
 | 
|---|
| 17 | // redefinissent la mathode Process() qui est appele paquet par paquet
 | 
|---|
| 18 | //---------------------------------------------------------------------
 | 
|---|
| 19 | 
 | 
|---|
| 20 | /* --Methode-- */
 | 
|---|
| 21 | BRBaseProcessor::BRBaseProcessor(RAcqMemZoneMgr& memgr, MemZaction mmact)
 | 
|---|
| 22 |   : memgr_(memgr), fbuff_(memgr.NbFibres()), fprocbuff_(memgr.NbFibres()),
 | 
|---|
| 23 |     vpaq_(memgr.NbFibres()), vprocpaq_(memgr.NbFibres()),
 | 
|---|
| 24 |     vpchk_(memgr.NbFibres()), vfgok_(memgr.NbFibres()), 
 | 
|---|
| 25 |     curfc_(memgr.NbFibres()), fcfirst_(memgr.NbFibres()), ttfirst_(memgr.NbFibres())
 | 
|---|
| 26 | {
 | 
|---|
| 27 |   SetMemZAction(mmact);
 | 
|---|
| 28 |   stop_ = false;
 | 
|---|
| 29 |   for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  {
 | 
|---|
| 30 |     fbuff_[fib]=NULL; 
 | 
|---|
| 31 |     fprocbuff_[fib]=NULL; 
 | 
|---|
| 32 |     vpaq_[fib]=BRPaquet(NULL,memgr_.PaqSize());
 | 
|---|
| 33 |     vprocpaq_[fib]=NULL; 
 | 
|---|
| 34 |     vpchk_[fib]=BRPaqChecker(true,0); 
 | 
|---|
| 35 |     vfgok_[fib]=true;
 | 
|---|
| 36 |     curfc_[fib]=0;
 | 
|---|
| 37 |     fcfirst_[fib]=0;
 | 
|---|
| 38 |     ttfirst_[fib]=0;
 | 
|---|
| 39 |   }
 | 
|---|
| 40 |   fgokallfibers_=true;
 | 
|---|
| 41 |   totprocnpaq_=0;
 | 
|---|
| 42 |   setNameId("baseproc",0); 
 | 
|---|
| 43 |   SetPrintLevel();
 | 
|---|
| 44 | }
 | 
|---|
| 45 | 
 | 
|---|
| 46 | /* --Methode-- */
 | 
|---|
| 47 | MemZStatus BRBaseProcessor::SetMemZAction(MemZaction mmact)
 | 
|---|
| 48 | {
 | 
|---|
| 49 |   mmact_=mmact;
 | 
|---|
| 50 |   mmsta_=MemZS_ProcA;
 | 
|---|
| 51 |   switch (mmact) {
 | 
|---|
| 52 |   case MemZA_ProcA:
 | 
|---|
| 53 |     mmsta_=MemZS_ProcA;    
 | 
|---|
| 54 |     break;
 | 
|---|
| 55 |   case MemZA_ProcB:
 | 
|---|
| 56 |     mmsta_=MemZS_ProcB;    
 | 
|---|
| 57 |     break;
 | 
|---|
| 58 |   case MemZA_ProcC:
 | 
|---|
| 59 |     mmsta_=MemZS_ProcC;    
 | 
|---|
| 60 |     break;
 | 
|---|
| 61 |   case MemZA_ProcD:
 | 
|---|
| 62 |     mmsta_=MemZS_ProcD;    
 | 
|---|
| 63 |     break;
 | 
|---|
| 64 |   case MemZA_ProcE:
 | 
|---|
| 65 |     mmsta_=MemZS_ProcE;    
 | 
|---|
| 66 |     break;
 | 
|---|
| 67 |   case MemZA_ProcF:
 | 
|---|
| 68 |     mmsta_=MemZS_ProcF;    
 | 
|---|
| 69 |     break;
 | 
|---|
| 70 |   default:
 | 
|---|
| 71 |     mmact_=MemZA_ProcA;
 | 
|---|
| 72 |     mmsta_=MemZS_ProcA;
 | 
|---|
| 73 |     break;
 | 
|---|
| 74 |   }
 | 
|---|
| 75 |   return mmsta_;
 | 
|---|
| 76 | }
 | 
|---|
| 77 | 
 | 
|---|
| 78 | /* --Methode-- */
 | 
|---|
| 79 | void BRBaseProcessor::run()
 | 
|---|
| 80 | {
 | 
|---|
| 81 |   setRC(1);     
 | 
|---|
| 82 |   int rc=0;
 | 
|---|
| 83 |   try {
 | 
|---|
| 84 |     cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() - Starting " << " NFibers=" 
 | 
|---|
| 85 |          << memgr_.NbFibres() << endl;  
 | 
|---|
| 86 | 
 | 
|---|
| 87 |     size_t paqsz=memgr_.PaqSize();
 | 
|---|
| 88 |     size_t procpaqsz=memgr_.ProcPaqSize();
 | 
|---|
| 89 |     bool fgrun=true;
 | 
|---|
| 90 |     while (fgrun) {
 | 
|---|
| 91 |       if (stop_) break;
 | 
|---|
| 92 |       if (memgr_.GetRunState() == MemZR_Stopped) break;
 | 
|---|
| 93 |       int mid = memgr_.FindMemZoneId(mmact_);  // (MemZA_ProcA);
 | 
|---|
| 94 |       //      Byte* buffg = memgr_.GetMemZone(mid);
 | 
|---|
| 95 |       //      if (buffg == NULL) {
 | 
|---|
| 96 |       if (mid < 0) {
 | 
|---|
| 97 |         cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR FindMemZoneId(" 
 | 
|---|
| 98 |              << (int)mmact_ << ") ->" << mid << ") -> NULL" << endl;
 | 
|---|
| 99 |         setRC(7);      fgrun=false;             
 | 
|---|
| 100 |         break;  
 | 
|---|
| 101 |       }
 | 
|---|
| 102 |       cts_=memgr_.GetAuxData(mid)->FillTime();   // get associated date/time (DATEOBS)
 | 
|---|
| 103 |       for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
 | 
|---|
| 104 |         fbuff_[fib] = memgr_.GetMemZone(mid,fib);
 | 
|---|
| 105 |         if (fbuff_[fib] == NULL) { // cela ne devrait pas arriver 
 | 
|---|
| 106 |           cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetMemZone(" 
 | 
|---|
| 107 |                << mid << "," << fib << ") -> NULL" << endl;
 | 
|---|
| 108 |           setRC(9);       fgrun=false;          
 | 
|---|
| 109 |           break;
 | 
|---|
| 110 |         }
 | 
|---|
| 111 |         if ((procpaqsz>0)&&((fprocbuff_[fib]=memgr_.GetProcMemZone(mid,fib))==NULL)) {   // cela ne devrait pas arriver non plus
 | 
|---|
| 112 |           cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetProcMemZone(" 
 | 
|---|
| 113 |                << mid << "," << fib << ") -> NULL" << endl;
 | 
|---|
| 114 |           setRC(9);       fgrun=false;          
 | 
|---|
| 115 |           break;
 | 
|---|
| 116 |         }
 | 
|---|
| 117 |       }
 | 
|---|
| 118 |       for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) {   // boucle sur les paquets d'une zone  
 | 
|---|
| 119 |         fgokallfibers_=true;
 | 
|---|
| 120 |         for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
 | 
|---|
| 121 |           vpaq_[fib].Set(fbuff_[fib]+jp*paqsz);
 | 
|---|
| 122 |           vfgok_[fib]=vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
 | 
|---|
| 123 |           if (!vfgok_[fib])  fgokallfibers_=false;
 | 
|---|
| 124 |           if (procpaqsz>0)    vprocpaq_[fib] = fprocbuff_[fib]+jp*procpaqsz;
 | 
|---|
| 125 |         }
 | 
|---|
| 126 |         //--- Traitement 
 | 
|---|
| 127 |         int rcp=0;
 | 
|---|
| 128 |         if (fgokallfibers_)  {
 | 
|---|
| 129 |           if (totprocnpaq_==0) {
 | 
|---|
| 130 |             for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  {
 | 
|---|
| 131 |               fcfirst_[fib]=curfc_[fib];
 | 
|---|
| 132 |               ttfirst_[fib]=vpaq_[fib].TimeTag();
 | 
|---|
| 133 |             }
 | 
|---|
| 134 |           }
 | 
|---|
| 135 |           rcp=Process();
 | 
|---|
| 136 |           totprocnpaq_++;
 | 
|---|
| 137 |         }
 | 
|---|
| 138 |         //      if (rcp != 0)   { fgrun=false; break; }
 | 
|---|
| 139 |       }  // Fin de boucle sur les paquets 
 | 
|---|
| 140 |       memgr_.FreeMemZone(mid, mmsta_);   // (MemZS_ProcA);
 | 
|---|
| 141 |     } // Fin de boucle sur les zones a traiter 
 | 
|---|
| 142 |     //------------------------------------
 | 
|---|
| 143 |     cout << " ---- END BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() , TotNbProcPaq=" 
 | 
|---|
| 144 |          << totprocnpaq_ << endl;
 | 
|---|
| 145 |     /*
 | 
|---|
| 146 |     for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  vpchk_[fib].Print();
 | 
|---|
| 147 |     cout << " ------------------------------------ " << endl;
 | 
|---|
| 148 |     */
 | 
|---|
| 149 |   }
 | 
|---|
| 150 |   catch (std::exception& exc) {
 | 
|---|
| 151 |     cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched std::exception " << exc.what() << endl;
 | 
|---|
| 152 |     setRC(98);  
 | 
|---|
| 153 |     return; 
 | 
|---|
| 154 |   }
 | 
|---|
| 155 |   catch(...) {
 | 
|---|
| 156 |     cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched unknown ... exception " << endl;
 | 
|---|
| 157 |     setRC(99);  
 | 
|---|
| 158 |     return; 
 | 
|---|
| 159 |   }
 | 
|---|
| 160 | 
 | 
|---|
| 161 | }
 | 
|---|
| 162 | 
 | 
|---|
| 163 | 
 | 
|---|
| 164 | /* --Methode-- */
 | 
|---|
| 165 | int BRBaseProcessor::Process()
 | 
|---|
| 166 | {
 | 
|---|
| 167 |   // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
 | 
|---|
| 168 |   // la methode par defaut ne fait rien 
 | 
|---|
| 169 |   // if (fgokallfibers_) { faire le traitement }
 | 
|---|
| 170 |   //  return 0;
 | 
|---|
| 171 |   /*    Exemple de code test  */
 | 
|---|
| 172 |   if ((prtlev_>0)&&(totprocnpaq_ %prtmodulo_==0))  {
 | 
|---|
| 173 |     cout << " BRBaseProcessor::Process(totnpaq=" << totprocnpaq_ << ")  ObsTime=" << getObsTime() 
 | 
|---|
| 174 |          << " TimeTag=" << getCurTimeTagSeconds() << " s. FrameCounter="  << getCurFrameCounter() << endl;
 | 
|---|
| 175 |     if (prtlev_<2) return 0;
 | 
|---|
| 176 |     cout << " ... FrameCnt[0..." << memgr_.NbFibres()-1 << "]=" ;
 | 
|---|
| 177 |     for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)   
 | 
|---|
| 178 |       cout << getCurFrameCounter(fib) << "," ;
 | 
|---|
| 179 |     cout << endl;
 | 
|---|
| 180 |     cout << " ... TimeTag[0..." << memgr_.NbFibres()-1 << "]=" ;
 | 
|---|
| 181 |     for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)   
 | 
|---|
| 182 |       cout << getCurTimeTag(fib) << "," ;
 | 
|---|
| 183 |     cout << endl;
 | 
|---|
| 184 |     if (prtlev_<3) return 0;
 | 
|---|
| 185 |     cout << " ... TimeTagSeconds[0..." << memgr_.NbFibres()-1 << "]=" ;
 | 
|---|
| 186 |     for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)   
 | 
|---|
| 187 |       cout << getCurTimeTagSeconds(fib) << "," ;
 | 
|---|
| 188 |     cout << endl;
 | 
|---|
| 189 |   }
 | 
|---|
| 190 |   return 0;
 | 
|---|
| 191 | }
 | 
|---|
| 192 | 
 | 
|---|