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
Line 
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//---------------------------------------------------------------------
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 \class BRBaseProcessor
21 \ingroup TAcq
22
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
30/* --Methode-- */
31BRBaseProcessor::BRBaseProcessor(RAcqMemZoneMgr& memgr, MemZaction mmact)
32 : memgr_(memgr), fbuff_(memgr.NbFibres()), fprocbuff_(memgr.NbFibres()),
33 vpaq_(memgr.NbFibres()), vprocpaq_(memgr.NbFibres()),
34 vpchk_(memgr.NbFibres()), vfgok_(memgr.NbFibres()),
35 curfc_(memgr.NbFibres()), fcfirst_(memgr.NbFibres()), ttfirst_(memgr.NbFibres())
36{
37 SetMemZAction(mmact);
38 stop_ = false;
39 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
40 fbuff_[fib]=NULL;
41 fprocbuff_[fib]=NULL;
42 vpaq_[fib]=BRPaquet(NULL,memgr_.PaqSize());
43 vprocpaq_[fib]=NULL;
44 vpchk_[fib]=BRPaqChecker(true,0);
45 vfgok_[fib]=true;
46 curfc_[fib]=0;
47 fcfirst_[fib]=0;
48 ttfirst_[fib]=0;
49 }
50 fgokallfibers_=true;
51 totprocnpaq_=0;
52 startdate_=0;
53 setNameId("baseproc",0);
54 ClearProcTimeWindow();
55 SetPrintLevel();
56}
57
58/* --Methode-- */
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;
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;
94 default:
95 mmact_=MemZA_ProcA;
96 mmsta_=MemZS_ProcA;
97 break;
98 }
99 return mmsta_;
100}
101
102/* --Methode-- */
103void BRBaseProcessor::run()
104{
105 setRC(1);
106 int rc=0;
107 try {
108 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() - Starting " << " NFibers="
109 << memgr_.NbFibres() << endl;
110 if (fgproctimewin_) cout << " BRBaseProcessor...TimeWindow Start=" << tmstart_ << " End=" << tmend_ << endl;
111
112 size_t paqsz=memgr_.PaqSize();
113 size_t procpaqsz=memgr_.ProcPaqSize();
114
115 double tstartdays = tmstart_.ToDays();
116 double tenddays = tmend_.ToDays();
117
118 bool fgrun=true;
119 while (fgrun) {
120 if (stop_) break;
121 if (memgr_.GetRunState() == MemZR_Stopped) break;
122 mid_ = memgr_.FindMemZoneId(mmact_); // (MemZA_ProcA);
123 // Byte* buffg = memgr_.GetMemZone(mid_);
124 // if (buffg == NULL) {
125 if (mid_ < 0) {
126 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR FindMemZoneId("
127 << (int)mmact_ << ") ->" << mid_ << ") -> NULL" << endl;
128 setRC(7); fgrun=false;
129 break;
130 }
131 cts_=memgr_.GetAuxData(mid_)->FillTime(); // get associated date/time (DATEOBS)
132 if (startdate_==0) startdate_=cts_.DaysPart();
133
134 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
135 fbuff_[fib] = memgr_.GetMemZone(mid_,fib);
136 if (fbuff_[fib] == NULL) { // cela ne devrait pas arriver
137 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetMemZone("
138 << mid_ << "," << fib << ") -> NULL" << endl;
139 setRC(9); fgrun=false;
140 break;
141 }
142 if ((procpaqsz>0)&&((fprocbuff_[fib]=memgr_.GetProcMemZone(mid_,fib))==NULL)) { // cela ne devrait pas arriver non plus
143 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetProcMemZone("
144 << mid_ << "," << fib << ") -> NULL" << endl;
145 setRC(9); fgrun=false;
146 break;
147 }
148 }
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 }
170 }
171 rcp=Process();
172 totprocnpaq_++;
173 }
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);
179 } // Fin de boucle sur les zones a traiter
180 //------------------------------------
181 cout << " ---- END BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() , TotNbProcPaq="
182 << totprocnpaq_ << endl;
183 /*
184 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) vpchk_[fib].Print();
185 cout << " ------------------------------------ " << endl;
186 */
187 }
188 catch (std::exception& exc) {
189 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched std::exception " << exc.what() << endl;
190 setRC(98);
191 return;
192 }
193 catch(...) {
194 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched unknown ... exception " << endl;
195 setRC(99);
196 return;
197 }
198
199}
200
201
202/* --Methode-- */
203int BRBaseProcessor::Process()
204{
205 // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
206 // la methode par defaut ne fait rien
207 // if (fgokallfibers_) { faire le traitement }
208 // return 0;
209 /* Exemple de code test */
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 << "]=" ;
215 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
216 cout << getCurFrameCounter(fib) << "," ;
217 cout << endl;
218 cout << " ... TimeTag[0..." << memgr_.NbFibres()-1 << "]=" ;
219 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
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) << "," ;
226 cout << endl;
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) << ",";
231 cout << endl;
232 }
233 return 0;
234}
235
Note: See TracBrowser for help on using the repository browser.