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

Last change on this file since 3902 was 3882, checked in by ansari, 15 years ago

Modifs cosmetiques impression, Reza 20/09/2010

File size: 5.6 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//---------------------------------------------------------------------
15// Classe de traitement - calcul de visibilite pour n fibres
16//---------------------------------------------------------------------
17
18/* --Methode-- */
[3774]19BRBaseProcessor::BRBaseProcessor(RAcqMemZoneMgr& memgr, MemZaction mmact)
[3872]20 : memgr_(memgr), fbuff_(memgr.NbFibres()), fprocbuff_(memgr.NbFibres()),
21 vpaq_(memgr.NbFibres()), vprocpaq_(memgr.NbFibres()),
22 vpchk_(memgr.NbFibres()), vfgok_(memgr.NbFibres()),
[3696]23 curfc_(memgr.NbFibres()), fcfirst_(memgr.NbFibres()), ttfirst_(memgr.NbFibres())
[3683]24{
[3774]25 SetMemZAction(mmact);
[3686]26 stop_ = false;
[3683]27 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
[3872]28 fbuff_[fib]=NULL;
29 fprocbuff_[fib]=NULL;
[3694]30 vpaq_[fib]=BRPaquet(NULL,memgr_.PaqSize());
[3872]31 vprocpaq_[fib]=NULL;
[3694]32 vpchk_[fib]=BRPaqChecker(true,0);
33 vfgok_[fib]=true;
34 curfc_[fib]=0;
[3696]35 fcfirst_[fib]=0;
36 ttfirst_[fib]=0;
[3683]37 }
[3696]38 fgokallfibers_=true;
[3683]39 totprocnpaq_=0;
[3778]40 setNameId("baseproc",0);
[3683]41}
42
43/* --Methode-- */
[3774]44MemZStatus BRBaseProcessor::SetMemZAction(MemZaction mmact)
45{
46 mmact_=mmact;
47 mmsta_=MemZS_ProcA;
48 switch (mmact) {
49 case MemZA_ProcA:
50 mmsta_=MemZS_ProcA;
51 break;
52 case MemZA_ProcB:
53 mmsta_=MemZS_ProcB;
54 break;
55 case MemZA_ProcC:
56 mmsta_=MemZS_ProcC;
57 break;
58 case MemZA_ProcD:
59 mmsta_=MemZS_ProcD;
60 break;
61 case MemZA_ProcE:
62 mmsta_=MemZS_ProcE;
63 break;
64 case MemZA_ProcF:
65 mmsta_=MemZS_ProcF;
66 break;
67 default:
68 mmact_=MemZA_ProcA;
69 mmsta_=MemZS_ProcA;
70 break;
71 }
72 return mmsta_;
73}
74
75/* --Methode-- */
[3683]76void BRBaseProcessor::run()
77{
78 setRC(1);
79 int rc=0;
80 try {
[3872]81 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() - Starting " << " NFibers="
[3882]82 << memgr_.NbFibres() << endl;
[3683]83
84 size_t paqsz=memgr_.PaqSize();
[3872]85 size_t procpaqsz=memgr_.ProcPaqSize();
[3683]86 bool fgrun=true;
87 while (fgrun) {
88 if (stop_) break;
89 if (memgr_.GetRunState() == MemZR_Stopped) break;
[3774]90 int mid = memgr_.FindMemZoneId(mmact_); // (MemZA_ProcA);
[3779]91 // Byte* buffg = memgr_.GetMemZone(mid);
92 // if (buffg == NULL) {
93 if (mid < 0) {
[3872]94 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR FindMemZoneId("
[3779]95 << (int)mmact_ << ") ->" << mid << ") -> NULL" << endl;
[3683]96 setRC(7); fgrun=false;
97 break;
98 }
[3696]99 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
100 fbuff_[fib] = memgr_.GetMemZone(mid,fib);
101 if (fbuff_[fib] == NULL) { // cela ne devrait pas arriver
[3872]102 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetMemZone("
103 << mid << "," << fib << ") -> NULL" << endl;
[3696]104 setRC(9); fgrun=false;
105 break;
106 }
[3872]107 if ((procpaqsz>0)&&((fprocbuff_[fib]=memgr_.GetProcMemZone(mid,fib))==NULL)) { // cela ne devrait pas arriver non plus
108 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetProcMemZone("
109 << mid << "," << fib << ") -> NULL" << endl;
110 setRC(9); fgrun=false;
111 break;
112 }
[3696]113 }
[3683]114 for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) { // boucle sur les paquets d'une zone
115 fgokallfibers_=true;
116 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
[3696]117 vpaq_[fib].Set(fbuff_[fib]+jp*paqsz);
[3683]118 vfgok_[fib] = vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
119 if (!vfgok_[fib]) fgokallfibers_=false;
[3872]120 if (procpaqsz>0) vprocpaq_[fib] = fprocbuff_[fib]+jp*procpaqsz;
[3683]121 }
122 //--- Traitement
[3696]123 int rcp=0;
124 if (fgokallfibers_) {
125 if (totprocnpaq_==0) {
126 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
127 fcfirst_[fib]=curfc_[fib];
128 ttfirst_[fib]=vpaq_[fib].TimeTag();
129 }
130 }
131 rcp=Process();
132 totprocnpaq_++;
133 }
[3686]134 // if (rcp != 0) { fgrun=false; break; }
[3683]135 } // Fin de boucle sur les paquets
[3774]136 memgr_.FreeMemZone(mid, mmsta_); // (MemZS_ProcA);
[3683]137 } // Fin de boucle sur les zones a traiter
138 //------------------------------------
[3872]139 cout << " ---- END BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() , TotNbProcPaq="
140 << totprocnpaq_ << endl;
[3686]141 /*
142 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) vpchk_[fib].Print();
143 cout << " ------------------------------------ " << endl;
144 */
[3683]145 }
146 catch (std::exception& exc) {
[3872]147 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched std::exception " << exc.what() << endl;
[3683]148 setRC(98);
149 return;
150 }
151 catch(...) {
[3872]152 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched unknown ... exception " << endl;
[3683]153 setRC(99);
154 return;
155 }
156
157}
158
159
160/* --Methode-- */
161int BRBaseProcessor::Process()
162{
[3876]163 // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
[3683]164 // la methode par defaut ne fait rien
165 // if (fgokallfibers_) { faire le traitement }
[3696]166 // return 0;
167 /* Exemple de code test */
[3686]168 if ( totprocnpaq_ % 1000 == 0 ) {
[3876]169 cout << " BRBaseProcessor::Process() " << totprocnpaq_ << " FrameCnt=" ;
[3686]170 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
171 cout << curfc_[fib] << "," ;
172 cout << endl;
173 cout << " TimeTag : " ;
174 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
175 cout << vpaq_[fib].TimeTag()/125000000 << "," ;
176 cout << " seconds" << endl;
177 }
[3696]178 return 0;
[3683]179}
180
Note: See TracBrowser for help on using the repository browser.