| 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 de traitement - calcul de visibilite pour n fibres 
 | 
|---|
| 16 | //---------------------------------------------------------------------
 | 
|---|
| 17 | 
 | 
|---|
| 18 | /* --Methode-- */
 | 
|---|
| 19 | BRBaseProcessor::BRBaseProcessor(RAcqMemZoneMgr& memgr, MemZaction mmact)
 | 
|---|
| 20 |   : memgr_(memgr), fbuff_(memgr.NbFibres()), fprocbuff_(memgr.NbFibres()),
 | 
|---|
| 21 |     vpaq_(memgr.NbFibres()), vprocpaq_(memgr.NbFibres()),
 | 
|---|
| 22 |     vpchk_(memgr.NbFibres()), vfgok_(memgr.NbFibres()), 
 | 
|---|
| 23 |     curfc_(memgr.NbFibres()), fcfirst_(memgr.NbFibres()), ttfirst_(memgr.NbFibres())
 | 
|---|
| 24 | {
 | 
|---|
| 25 |   SetMemZAction(mmact);
 | 
|---|
| 26 |   stop_ = false;
 | 
|---|
| 27 |   for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  {
 | 
|---|
| 28 |     fbuff_[fib]=NULL; 
 | 
|---|
| 29 |     fprocbuff_[fib]=NULL; 
 | 
|---|
| 30 |     vpaq_[fib]=BRPaquet(NULL,memgr_.PaqSize());
 | 
|---|
| 31 |     vprocpaq_[fib]=NULL; 
 | 
|---|
| 32 |     vpchk_[fib]=BRPaqChecker(true,0); 
 | 
|---|
| 33 |     vfgok_[fib]=true;
 | 
|---|
| 34 |     curfc_[fib]=0;
 | 
|---|
| 35 |     fcfirst_[fib]=0;
 | 
|---|
| 36 |     ttfirst_[fib]=0;
 | 
|---|
| 37 |   }
 | 
|---|
| 38 |   fgokallfibers_=true;
 | 
|---|
| 39 |   totprocnpaq_=0;
 | 
|---|
| 40 |   setNameId("baseproc",0); 
 | 
|---|
| 41 | }
 | 
|---|
| 42 | 
 | 
|---|
| 43 | /* --Methode-- */
 | 
|---|
| 44 | MemZStatus BRBaseProcessor::SetMemZAction(MemZaction mmact)
 | 
|---|
| 45 | {
 | 
|---|
| 46 |   mmact_=mmact;
 | 
|---|
| 47 |   mmsta_=MemZS_ProcA;
 | 
|---|
| 48 |   switch (mmact) {
 | 
|---|
| 49 |   case MemZA_ProcA:
 | 
|---|
| 50 |     mmsta_=MemZS_ProcA;    
 | 
|---|
| 51 |     break;
 | 
|---|
| 52 |   case MemZA_ProcB:
 | 
|---|
| 53 |     mmsta_=MemZS_ProcB;    
 | 
|---|
| 54 |     break;
 | 
|---|
| 55 |   case MemZA_ProcC:
 | 
|---|
| 56 |     mmsta_=MemZS_ProcC;    
 | 
|---|
| 57 |     break;
 | 
|---|
| 58 |   case MemZA_ProcD:
 | 
|---|
| 59 |     mmsta_=MemZS_ProcD;    
 | 
|---|
| 60 |     break;
 | 
|---|
| 61 |   case MemZA_ProcE:
 | 
|---|
| 62 |     mmsta_=MemZS_ProcE;    
 | 
|---|
| 63 |     break;
 | 
|---|
| 64 |   case MemZA_ProcF:
 | 
|---|
| 65 |     mmsta_=MemZS_ProcF;    
 | 
|---|
| 66 |     break;
 | 
|---|
| 67 |   default:
 | 
|---|
| 68 |     mmact_=MemZA_ProcA;
 | 
|---|
| 69 |     mmsta_=MemZS_ProcA;
 | 
|---|
| 70 |     break;
 | 
|---|
| 71 |   }
 | 
|---|
| 72 |   return mmsta_;
 | 
|---|
| 73 | }
 | 
|---|
| 74 | 
 | 
|---|
| 75 | /* --Methode-- */
 | 
|---|
| 76 | void BRBaseProcessor::run()
 | 
|---|
| 77 | {
 | 
|---|
| 78 |   setRC(1);     
 | 
|---|
| 79 |   int rc=0;
 | 
|---|
| 80 |   try {
 | 
|---|
| 81 |     cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() - Starting " << " NFibers=" 
 | 
|---|
| 82 |          << memgr_.NbFibres() << endl;  
 | 
|---|
| 83 | 
 | 
|---|
| 84 |     size_t paqsz=memgr_.PaqSize();
 | 
|---|
| 85 |     size_t procpaqsz=memgr_.ProcPaqSize();
 | 
|---|
| 86 |     bool fgrun=true;
 | 
|---|
| 87 |     while (fgrun) {
 | 
|---|
| 88 |       if (stop_) break;
 | 
|---|
| 89 |       if (memgr_.GetRunState() == MemZR_Stopped) break;
 | 
|---|
| 90 |       int mid = memgr_.FindMemZoneId(mmact_);  // (MemZA_ProcA);
 | 
|---|
| 91 |       //      Byte* buffg = memgr_.GetMemZone(mid);
 | 
|---|
| 92 |       //      if (buffg == NULL) {
 | 
|---|
| 93 |       if (mid < 0) {
 | 
|---|
| 94 |         cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR FindMemZoneId(" 
 | 
|---|
| 95 |              << (int)mmact_ << ") ->" << mid << ") -> NULL" << endl;
 | 
|---|
| 96 |         setRC(7);      fgrun=false;             
 | 
|---|
| 97 |         break;  
 | 
|---|
| 98 |       }
 | 
|---|
| 99 |       for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
 | 
|---|
| 100 |         fbuff_[fib] = memgr_.GetMemZone(mid,fib);
 | 
|---|
| 101 |         if (fbuff_[fib] == NULL) { // cela ne devrait pas arriver 
 | 
|---|
| 102 |           cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetMemZone(" 
 | 
|---|
| 103 |                << mid << "," << fib << ") -> NULL" << endl;
 | 
|---|
| 104 |           setRC(9);       fgrun=false;          
 | 
|---|
| 105 |           break;
 | 
|---|
| 106 |         }
 | 
|---|
| 107 |         if ((procpaqsz>0)&&((fprocbuff_[fib]=memgr_.GetProcMemZone(mid,fib))==NULL)) {   // cela ne devrait pas arriver non plus
 | 
|---|
| 108 |           cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetProcMemZone(" 
 | 
|---|
| 109 |                << mid << "," << fib << ") -> NULL" << endl;
 | 
|---|
| 110 |           setRC(9);       fgrun=false;          
 | 
|---|
| 111 |           break;
 | 
|---|
| 112 |         }
 | 
|---|
| 113 |       }
 | 
|---|
| 114 |       for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) {   // boucle sur les paquets d'une zone  
 | 
|---|
| 115 |         fgokallfibers_=true;
 | 
|---|
| 116 |         for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
 | 
|---|
| 117 |           vpaq_[fib].Set(fbuff_[fib]+jp*paqsz);
 | 
|---|
| 118 |           vfgok_[fib] = vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
 | 
|---|
| 119 |           if (!vfgok_[fib])  fgokallfibers_=false;
 | 
|---|
| 120 |           if (procpaqsz>0)    vprocpaq_[fib] = fprocbuff_[fib]+jp*procpaqsz;
 | 
|---|
| 121 |         }
 | 
|---|
| 122 |         //--- Traitement 
 | 
|---|
| 123 |         int rcp=0;
 | 
|---|
| 124 |         if (fgokallfibers_)  {
 | 
|---|
| 125 |           if (totprocnpaq_==0) {
 | 
|---|
| 126 |             for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  {
 | 
|---|
| 127 |               fcfirst_[fib]=curfc_[fib];
 | 
|---|
| 128 |               ttfirst_[fib]=vpaq_[fib].TimeTag();
 | 
|---|
| 129 |             }
 | 
|---|
| 130 |           }
 | 
|---|
| 131 |           rcp=Process();
 | 
|---|
| 132 |           totprocnpaq_++;
 | 
|---|
| 133 |         }
 | 
|---|
| 134 |         //      if (rcp != 0)   { fgrun=false; break; }
 | 
|---|
| 135 |       }  // Fin de boucle sur les paquets 
 | 
|---|
| 136 |       memgr_.FreeMemZone(mid, mmsta_);   // (MemZS_ProcA);
 | 
|---|
| 137 |     } // Fin de boucle sur les zones a traiter 
 | 
|---|
| 138 |     //------------------------------------
 | 
|---|
| 139 |     cout << " ---- END BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() , TotNbProcPaq=" 
 | 
|---|
| 140 |          << totprocnpaq_ << endl;
 | 
|---|
| 141 |     /*
 | 
|---|
| 142 |     for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)  vpchk_[fib].Print();
 | 
|---|
| 143 |     cout << " ------------------------------------ " << endl;
 | 
|---|
| 144 |     */
 | 
|---|
| 145 |   }
 | 
|---|
| 146 |   catch (std::exception& exc) {
 | 
|---|
| 147 |     cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched std::exception " << exc.what() << endl;
 | 
|---|
| 148 |     setRC(98);  
 | 
|---|
| 149 |     return; 
 | 
|---|
| 150 |   }
 | 
|---|
| 151 |   catch(...) {
 | 
|---|
| 152 |     cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched unknown ... exception " << endl;
 | 
|---|
| 153 |     setRC(99);  
 | 
|---|
| 154 |     return; 
 | 
|---|
| 155 |   }
 | 
|---|
| 156 | 
 | 
|---|
| 157 | }
 | 
|---|
| 158 | 
 | 
|---|
| 159 | 
 | 
|---|
| 160 | /* --Methode-- */
 | 
|---|
| 161 | int BRBaseProcessor::Process()
 | 
|---|
| 162 | {
 | 
|---|
| 163 |   // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
 | 
|---|
| 164 |   // la methode par defaut ne fait rien 
 | 
|---|
| 165 |   // if (fgokallfibers_) { faire le traitement }
 | 
|---|
| 166 |   //  return 0;
 | 
|---|
| 167 |   /*    Exemple de code test  */
 | 
|---|
| 168 |   if ( totprocnpaq_ % 1000 == 0 ) {
 | 
|---|
| 169 |     cout << " BRBaseProcessor::Process() " << totprocnpaq_ << " FrameCnt=" ;
 | 
|---|
| 170 |     for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)   
 | 
|---|
| 171 |       cout << curfc_[fib] << "," ;
 | 
|---|
| 172 |     cout << endl;
 | 
|---|
| 173 |     cout << " TimeTag : " ;
 | 
|---|
| 174 |     for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)   
 | 
|---|
| 175 |       cout << vpaq_[fib].TimeTag()/125000000 << "," ;
 | 
|---|
| 176 |       cout << "   seconds" << endl;
 | 
|---|
| 177 |   }
 | 
|---|
| 178 |   return 0;
 | 
|---|
| 179 | }
 | 
|---|
| 180 | 
 | 
|---|