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

Last change on this file since 3957 was 3955, checked in by ansari, 15 years ago

Ajout des actions de traitemnt ProcG,ProcH,ProcI,ProcJ ds le gestionnaire memoire RAcqMemZoneMgr et adaptation de BRBaseProcessor, Reza 02/03/2011

File size: 6.5 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;
[3683]98
99 size_t paqsz=memgr_.PaqSize();
[3872]100 size_t procpaqsz=memgr_.ProcPaqSize();
[3683]101 bool fgrun=true;
102 while (fgrun) {
103 if (stop_) break;
104 if (memgr_.GetRunState() == MemZR_Stopped) break;
[3774]105 int mid = memgr_.FindMemZoneId(mmact_); // (MemZA_ProcA);
[3779]106 // Byte* buffg = memgr_.GetMemZone(mid);
107 // if (buffg == NULL) {
108 if (mid < 0) {
[3872]109 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR FindMemZoneId("
[3779]110 << (int)mmact_ << ") ->" << mid << ") -> NULL" << endl;
[3683]111 setRC(7); fgrun=false;
112 break;
113 }
[3909]114 cts_=memgr_.GetAuxData(mid)->FillTime(); // get associated date/time (DATEOBS)
[3696]115 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
116 fbuff_[fib] = memgr_.GetMemZone(mid,fib);
117 if (fbuff_[fib] == NULL) { // cela ne devrait pas arriver
[3872]118 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetMemZone("
119 << mid << "," << fib << ") -> NULL" << endl;
[3696]120 setRC(9); fgrun=false;
121 break;
122 }
[3872]123 if ((procpaqsz>0)&&((fprocbuff_[fib]=memgr_.GetProcMemZone(mid,fib))==NULL)) { // cela ne devrait pas arriver non plus
124 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetProcMemZone("
125 << mid << "," << fib << ") -> NULL" << endl;
126 setRC(9); fgrun=false;
127 break;
128 }
[3696]129 }
[3683]130 for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) { // boucle sur les paquets d'une zone
131 fgokallfibers_=true;
132 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
[3696]133 vpaq_[fib].Set(fbuff_[fib]+jp*paqsz);
[3938]134 vfgok_[fib]=vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
[3683]135 if (!vfgok_[fib]) fgokallfibers_=false;
[3872]136 if (procpaqsz>0) vprocpaq_[fib] = fprocbuff_[fib]+jp*procpaqsz;
[3683]137 }
138 //--- Traitement
[3696]139 int rcp=0;
140 if (fgokallfibers_) {
141 if (totprocnpaq_==0) {
142 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
143 fcfirst_[fib]=curfc_[fib];
144 ttfirst_[fib]=vpaq_[fib].TimeTag();
145 }
146 }
147 rcp=Process();
148 totprocnpaq_++;
149 }
[3686]150 // if (rcp != 0) { fgrun=false; break; }
[3683]151 } // Fin de boucle sur les paquets
[3774]152 memgr_.FreeMemZone(mid, mmsta_); // (MemZS_ProcA);
[3683]153 } // Fin de boucle sur les zones a traiter
154 //------------------------------------
[3872]155 cout << " ---- END BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() , TotNbProcPaq="
156 << totprocnpaq_ << endl;
[3686]157 /*
158 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) vpchk_[fib].Print();
159 cout << " ------------------------------------ " << endl;
160 */
[3683]161 }
162 catch (std::exception& exc) {
[3872]163 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched std::exception " << exc.what() << endl;
[3683]164 setRC(98);
165 return;
166 }
167 catch(...) {
[3872]168 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched unknown ... exception " << endl;
[3683]169 setRC(99);
170 return;
171 }
172
173}
174
175
176/* --Methode-- */
177int BRBaseProcessor::Process()
178{
[3876]179 // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
[3683]180 // la methode par defaut ne fait rien
181 // if (fgokallfibers_) { faire le traitement }
[3696]182 // return 0;
183 /* Exemple de code test */
[3938]184 if ((prtlev_>0)&&(totprocnpaq_ %prtmodulo_==0)) {
185 cout << " BRBaseProcessor::Process(totnpaq=" << totprocnpaq_ << ") ObsTime=" << getObsTime()
186 << " TimeTag=" << getCurTimeTagSeconds() << " s. FrameCounter=" << getCurFrameCounter() << endl;
187 if (prtlev_<2) return 0;
188 cout << " ... FrameCnt[0..." << memgr_.NbFibres()-1 << "]=" ;
[3686]189 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
[3938]190 cout << getCurFrameCounter(fib) << "," ;
[3686]191 cout << endl;
[3938]192 cout << " ... TimeTag[0..." << memgr_.NbFibres()-1 << "]=" ;
[3686]193 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
[3938]194 cout << getCurTimeTag(fib) << "," ;
195 cout << endl;
196 if (prtlev_<3) return 0;
197 cout << " ... TimeTagSeconds[0..." << memgr_.NbFibres()-1 << "]=" ;
198 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
199 cout << getCurTimeTagSeconds(fib) << "," ;
200 cout << endl;
[3686]201 }
[3696]202 return 0;
[3683]203}
204
Note: See TracBrowser for help on using the repository browser.