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

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

Ajout definition de fenetre en temps de traitement (appel a Process()) ds BRBaseProcessor et BRAnaParam, FileSequenceNumber (numero signalXXX.fits) pour chaque zone memoire dans RAcqMZAuxData / RAcqMemZoneMgr, Reza 04/05/2011

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