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