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

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

Ajout de la fonctionalite de calcul des visibilites (sur donnees firmware FFT uniquement) dans le programme d'acquisition mfacq.cc , Reza 09/09/2010

File size: 5.6 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 de traitement - calcul de visibilite pour n fibres
16//---------------------------------------------------------------------
17
18/* --Methode-- */
19BRBaseProcessor::BRBaseProcessor(RAcqMemZoneMgr& memgr, MemZaction mmact)
20 : memgr_(memgr), fbuff_(memgr.NbFibres()), fprocbuff_(memgr.NbFibres()),
21 vpaq_(memgr.NbFibres()), vprocpaq_(memgr.NbFibres()),
22 vpchk_(memgr.NbFibres()), vfgok_(memgr.NbFibres()),
23 curfc_(memgr.NbFibres()), fcfirst_(memgr.NbFibres()), ttfirst_(memgr.NbFibres())
24{
25 SetMemZAction(mmact);
26 stop_ = false;
27 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
28 fbuff_[fib]=NULL;
29 fprocbuff_[fib]=NULL;
30 vpaq_[fib]=BRPaquet(NULL,memgr_.PaqSize());
31 vprocpaq_[fib]=NULL;
32 vpchk_[fib]=BRPaqChecker(true,0);
33 vfgok_[fib]=true;
34 curfc_[fib]=0;
35 fcfirst_[fib]=0;
36 ttfirst_[fib]=0;
37 }
38 fgokallfibers_=true;
39 totprocnpaq_=0;
40 setNameId("baseproc",0);
41}
42
43/* --Methode-- */
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-- */
76void BRBaseProcessor::run()
77{
78 setRC(1);
79 int rc=0;
80 try {
81 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() - Starting " << " NFibers="
82 << memgr_.NbFibres() << " NChan=" << 2*memgr_.NbFibres() << endl;
83
84 size_t paqsz=memgr_.PaqSize();
85 size_t procpaqsz=memgr_.ProcPaqSize();
86 bool fgrun=true;
87 while (fgrun) {
88 if (stop_) break;
89 if (memgr_.GetRunState() == MemZR_Stopped) break;
90 int mid = memgr_.FindMemZoneId(mmact_); // (MemZA_ProcA);
91 // Byte* buffg = memgr_.GetMemZone(mid);
92 // if (buffg == NULL) {
93 if (mid < 0) {
94 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR FindMemZoneId("
95 << (int)mmact_ << ") ->" << mid << ") -> NULL" << endl;
96 setRC(7); fgrun=false;
97 break;
98 }
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
102 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetMemZone("
103 << mid << "," << fib << ") -> NULL" << endl;
104 setRC(9); fgrun=false;
105 break;
106 }
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 }
113 }
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++) {
117 vpaq_[fib].Set(fbuff_[fib]+jp*paqsz);
118 vfgok_[fib] = vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
119 if (!vfgok_[fib]) fgokallfibers_=false;
120 if (procpaqsz>0) vprocpaq_[fib] = fprocbuff_[fib]+jp*procpaqsz;
121 }
122 //--- Traitement
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 }
134 // if (rcp != 0) { fgrun=false; break; }
135 } // Fin de boucle sur les paquets
136 memgr_.FreeMemZone(mid, mmsta_); // (MemZS_ProcA);
137 } // Fin de boucle sur les zones a traiter
138 //------------------------------------
139 cout << " ---- END BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() , TotNbProcPaq="
140 << totprocnpaq_ << endl;
141 /*
142 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) vpchk_[fib].Print();
143 cout << " ------------------------------------ " << endl;
144 */
145 }
146 catch (std::exception& exc) {
147 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched std::exception " << exc.what() << endl;
148 setRC(98);
149 return;
150 }
151 catch(...) {
152 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched unknown ... exception " << endl;
153 setRC(99);
154 return;
155 }
156
157}
158
159
160/* --Methode-- */
161int BRBaseProcessor::Process()
162{
163 // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
164 // la methode par defaut ne fait rien
165 // if (fgokallfibers_) { faire le traitement }
166 // return 0;
167 /* Exemple de code test */
168 if ( totprocnpaq_ % 1000 == 0 ) {
169 cout << " BRBaseProcessor::Process() " << totprocnpaq_ << " FrameCnt=" ;
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 }
178 return 0;
179}
180
Note: See TracBrowser for help on using the repository browser.