source: Sophya/trunk/AddOn/TAcq/brbaseproc.cc@ 4016

Last change on this file since 4016 was 4016, checked in by ansari, 14 years ago

Ajout de commentaires d'autodocumentation Doxygen, Reza 12/08/2011

File size: 7.7 KB
RevLine 
[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
13using namespace SOPHYA;
14//---------------------------------------------------------------------
[3939]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
[3683]18//---------------------------------------------------------------------
[4016]19/*!
20 \class BRBaseProcessor
21 \ingroup TAcq
[3683]22
[4016]23 \brief Base class for BAORadio processing thread classes.
24
25 Thread classes for BAORadio data processing and analysis can inherit from
26 this class and redefine/implement the Process() method which is called
27 for each BRpaquet.
28*/
29
[3683]30/* --Methode-- */
[3774]31BRBaseProcessor::BRBaseProcessor(RAcqMemZoneMgr& memgr, MemZaction mmact)
[3872]32 : memgr_(memgr), fbuff_(memgr.NbFibres()), fprocbuff_(memgr.NbFibres()),
33 vpaq_(memgr.NbFibres()), vprocpaq_(memgr.NbFibres()),
34 vpchk_(memgr.NbFibres()), vfgok_(memgr.NbFibres()),
[3696]35 curfc_(memgr.NbFibres()), fcfirst_(memgr.NbFibres()), ttfirst_(memgr.NbFibres())
[3683]36{
[3774]37 SetMemZAction(mmact);
[3686]38 stop_ = false;
[3683]39 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
[3872]40 fbuff_[fib]=NULL;
41 fprocbuff_[fib]=NULL;
[3694]42 vpaq_[fib]=BRPaquet(NULL,memgr_.PaqSize());
[3872]43 vprocpaq_[fib]=NULL;
[3694]44 vpchk_[fib]=BRPaqChecker(true,0);
45 vfgok_[fib]=true;
46 curfc_[fib]=0;
[3696]47 fcfirst_[fib]=0;
48 ttfirst_[fib]=0;
[3683]49 }
[3696]50 fgokallfibers_=true;
[3683]51 totprocnpaq_=0;
[3993]52 startdate_=0;
[3778]53 setNameId("baseproc",0);
[3981]54 ClearProcTimeWindow();
[3938]55 SetPrintLevel();
[3683]56}
57
58/* --Methode-- */
[3774]59MemZStatus BRBaseProcessor::SetMemZAction(MemZaction mmact)
60{
61 mmact_=mmact;
62 mmsta_=MemZS_ProcA;
63 switch (mmact) {
64 case MemZA_ProcA:
65 mmsta_=MemZS_ProcA;
66 break;
67 case MemZA_ProcB:
68 mmsta_=MemZS_ProcB;
69 break;
70 case MemZA_ProcC:
71 mmsta_=MemZS_ProcC;
72 break;
73 case MemZA_ProcD:
74 mmsta_=MemZS_ProcD;
75 break;
76 case MemZA_ProcE:
77 mmsta_=MemZS_ProcE;
78 break;
79 case MemZA_ProcF:
80 mmsta_=MemZS_ProcF;
81 break;
[3955]82 case MemZA_ProcG:
83 mmsta_=MemZS_ProcG;
84 break;
85 case MemZA_ProcH:
86 mmsta_=MemZS_ProcH;
87 break;
88 case MemZA_ProcI:
89 mmsta_=MemZS_ProcI;
90 break;
91 case MemZA_ProcJ:
92 mmsta_=MemZS_ProcI;
93 break;
[3774]94 default:
95 mmact_=MemZA_ProcA;
96 mmsta_=MemZS_ProcA;
97 break;
98 }
99 return mmsta_;
100}
101
102/* --Methode-- */
[3683]103void BRBaseProcessor::run()
104{
105 setRC(1);
106 int rc=0;
107 try {
[3872]108 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() - Starting " << " NFibers="
[3882]109 << memgr_.NbFibres() << endl;
[3979]110 if (fgproctimewin_) cout << " BRBaseProcessor...TimeWindow Start=" << tmstart_ << " End=" << tmend_ << endl;
[3683]111
112 size_t paqsz=memgr_.PaqSize();
[3872]113 size_t procpaqsz=memgr_.ProcPaqSize();
[3979]114
115 double tstartdays = tmstart_.ToDays();
116 double tenddays = tmend_.ToDays();
117
[3683]118 bool fgrun=true;
119 while (fgrun) {
120 if (stop_) break;
121 if (memgr_.GetRunState() == MemZR_Stopped) break;
[3979]122 mid_ = memgr_.FindMemZoneId(mmact_); // (MemZA_ProcA);
123 // Byte* buffg = memgr_.GetMemZone(mid_);
[3779]124 // if (buffg == NULL) {
[3979]125 if (mid_ < 0) {
[3872]126 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR FindMemZoneId("
[3979]127 << (int)mmact_ << ") ->" << mid_ << ") -> NULL" << endl;
[3683]128 setRC(7); fgrun=false;
129 break;
130 }
[3979]131 cts_=memgr_.GetAuxData(mid_)->FillTime(); // get associated date/time (DATEOBS)
[3993]132 if (startdate_==0) startdate_=cts_.DaysPart();
133
[3696]134 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
[3979]135 fbuff_[fib] = memgr_.GetMemZone(mid_,fib);
[3696]136 if (fbuff_[fib] == NULL) { // cela ne devrait pas arriver
[3872]137 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetMemZone("
[3979]138 << mid_ << "," << fib << ") -> NULL" << endl;
[3696]139 setRC(9); fgrun=false;
140 break;
141 }
[3979]142 if ((procpaqsz>0)&&((fprocbuff_[fib]=memgr_.GetProcMemZone(mid_,fib))==NULL)) { // cela ne devrait pas arriver non plus
[3872]143 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetProcMemZone("
[3979]144 << mid_ << "," << fib << ") -> NULL" << endl;
[3872]145 setRC(9); fgrun=false;
146 break;
147 }
[3696]148 }
[3979]149
150 // On ne traite les paquets que si pas de fenetre en temps ou tmstart_ <= FillTime() <= tmend_
151 double ftmdays = memgr_.GetAuxData(mid_)->FillTime().ToDays();
152 if ((!fgproctimewin_) || ( (ftmdays<=tenddays)&&(ftmdays>=tstartdays) ) ) {
153
154 for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) { // boucle sur les paquets d'une zone
155 fgokallfibers_=true;
156 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
157 vpaq_[fib].Set(fbuff_[fib]+jp*paqsz);
158 vfgok_[fib]=vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
159 if (!vfgok_[fib]) fgokallfibers_=false;
160 if (procpaqsz>0) vprocpaq_[fib] = fprocbuff_[fib]+jp*procpaqsz;
161 }
162 //--- Traitement
163 int rcp=0;
164 if (fgokallfibers_) {
165 if (totprocnpaq_==0) {
166 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
167 fcfirst_[fib]=curfc_[fib];
168 ttfirst_[fib]=vpaq_[fib].TimeTag();
169 }
[3696]170 }
[3979]171 rcp=Process();
172 totprocnpaq_++;
[3696]173 }
[3979]174 // if (rcp != 0) { fgrun=false; break; }
175 } // Fin de boucle sur les paquets
176 } // Fin de test pour fenetre en temps de traitement des paquets
177
178 memgr_.FreeMemZone(mid_, mmsta_); // (MemZS_ProcA);
[3683]179 } // Fin de boucle sur les zones a traiter
180 //------------------------------------
[3872]181 cout << " ---- END BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() , TotNbProcPaq="
182 << totprocnpaq_ << endl;
[3686]183 /*
184 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) vpchk_[fib].Print();
185 cout << " ------------------------------------ " << endl;
186 */
[3683]187 }
188 catch (std::exception& exc) {
[3872]189 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched std::exception " << exc.what() << endl;
[3683]190 setRC(98);
191 return;
192 }
193 catch(...) {
[3872]194 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched unknown ... exception " << endl;
[3683]195 setRC(99);
196 return;
197 }
198
199}
200
201
202/* --Methode-- */
203int BRBaseProcessor::Process()
204{
[3876]205 // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
[3683]206 // la methode par defaut ne fait rien
207 // if (fgokallfibers_) { faire le traitement }
[3696]208 // return 0;
209 /* Exemple de code test */
[3938]210 if ((prtlev_>0)&&(totprocnpaq_ %prtmodulo_==0)) {
211 cout << " BRBaseProcessor::Process(totnpaq=" << totprocnpaq_ << ") ObsTime=" << getObsTime()
212 << " TimeTag=" << getCurTimeTagSeconds() << " s. FrameCounter=" << getCurFrameCounter() << endl;
213 if (prtlev_<2) return 0;
214 cout << " ... FrameCnt[0..." << memgr_.NbFibres()-1 << "]=" ;
[3686]215 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
[3938]216 cout << getCurFrameCounter(fib) << "," ;
[3686]217 cout << endl;
[3938]218 cout << " ... TimeTag[0..." << memgr_.NbFibres()-1 << "]=" ;
[3686]219 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
[3938]220 cout << getCurTimeTag(fib) << "," ;
221 cout << endl;
222 if (prtlev_<3) return 0;
223 cout << " ... TimeTagSeconds[0..." << memgr_.NbFibres()-1 << "]=" ;
224 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
225 cout << getCurTimeTagSeconds(fib) << "," ;
[3982]226 cout << endl;
[3979]227 if (prtlev_<4) return 0;
228 cout << " ... FileSequenceNumber[0..." << memgr_.NbFibres()-1 << "]=" ;
229 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
230 cout << memgr_.GetAuxData(mid_)->FileSequenceNumber(fib) << ",";
[3938]231 cout << endl;
[3686]232 }
[3696]233 return 0;
[3683]234}
235
Note: See TracBrowser for help on using the repository browser.