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

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

Correction: ajout appel a ClearProcTimeWindow() ds constructeur BRBaseProcessor, Reza 04/05/2011

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