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

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

1/ Mise en place d'informations auxiliaires au niveau de RAcqMemZoneMgr ,

FillTime (DATEOBS) pour chaque zone et identificateur des fibres

2/ remplissage de FillTime(DATEOBS) Et FiberId's de MemZoneMgr par

les classes PCIEMultiReader et EthernetReader

3/ Ajout de mots-cle (ds les datacards) pour numeros d'identification des

fibres et parametres de controles du DMA (@fiberids @waitenddma)
et corrections/ameliorations des modes acq (raw1c ordfft2c ...)

4/ Parametrage des WaitEndDMA ds PCIEWrapperInterface et implementation

au niveau de DMAMgrV6 (dmamgrv6.h .cc)

5/ Gestion d'echec DMA -> arret acquisition ds PCIEMultiReader,EthernetReader

modification TimeOut DMA entre le premier DMA et les suivants pour permettre
un arret propre rapide

6/ Adaptation de la classe BRVisibilityCalculator pour utilisation

FillTime (DATEOBS) et FiberIds de MemZoneMgr - amelioration de
l'identification des numeros de canaux pour les matrices de visibilites

7/ Petites ameliorations (ecriture mot-cles) pour MultiDataSaver et

amelioration classe BRMultiFitsReader pour lecture FillTime (DATEOBS)
et FiberIds depuis les fichiers FITS et remplissage de RAcqMemZoneMgr

Reza, 21/11/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 }
[3909]99 cts_=memgr_.GetAuxData(mid)->FillTime(); // get associated date/time (DATEOBS)
[3696]100 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
101 fbuff_[fib] = memgr_.GetMemZone(mid,fib);
102 if (fbuff_[fib] == NULL) { // cela ne devrait pas arriver
[3872]103 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetMemZone("
104 << mid << "," << fib << ") -> NULL" << endl;
[3696]105 setRC(9); fgrun=false;
106 break;
107 }
[3872]108 if ((procpaqsz>0)&&((fprocbuff_[fib]=memgr_.GetProcMemZone(mid,fib))==NULL)) { // cela ne devrait pas arriver non plus
109 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/ERROR memgr.GetProcMemZone("
110 << mid << "," << fib << ") -> NULL" << endl;
111 setRC(9); fgrun=false;
112 break;
113 }
[3696]114 }
[3683]115 for(size_t jp=0; jp<memgr_.NbPaquets(); jp++) { // boucle sur les paquets d'une zone
116 fgokallfibers_=true;
117 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
[3696]118 vpaq_[fib].Set(fbuff_[fib]+jp*paqsz);
[3683]119 vfgok_[fib] = vpchk_[fib].Check(vpaq_[fib],curfc_[fib]);
120 if (!vfgok_[fib]) fgokallfibers_=false;
[3872]121 if (procpaqsz>0) vprocpaq_[fib] = fprocbuff_[fib]+jp*procpaqsz;
[3683]122 }
123 //--- Traitement
[3696]124 int rcp=0;
125 if (fgokallfibers_) {
126 if (totprocnpaq_==0) {
127 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
128 fcfirst_[fib]=curfc_[fib];
129 ttfirst_[fib]=vpaq_[fib].TimeTag();
130 }
131 }
132 rcp=Process();
133 totprocnpaq_++;
134 }
[3686]135 // if (rcp != 0) { fgrun=false; break; }
[3683]136 } // Fin de boucle sur les paquets
[3774]137 memgr_.FreeMemZone(mid, mmsta_); // (MemZS_ProcA);
[3683]138 } // Fin de boucle sur les zones a traiter
139 //------------------------------------
[3872]140 cout << " ---- END BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run() , TotNbProcPaq="
141 << totprocnpaq_ << endl;
[3686]142 /*
143 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) vpchk_[fib].Print();
144 cout << " ------------------------------------ " << endl;
145 */
[3683]146 }
147 catch (std::exception& exc) {
[3872]148 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched std::exception " << exc.what() << endl;
[3683]149 setRC(98);
150 return;
151 }
152 catch(...) {
[3872]153 cout << "BRBaseProcessor[" << bpnom_ << "," << bpid_ << "]::run()/catched unknown ... exception " << endl;
[3683]154 setRC(99);
155 return;
156 }
157
158}
159
160
161/* --Methode-- */
162int BRBaseProcessor::Process()
163{
[3876]164 // Cette methode est appele pour chaque "trigger', cad la serie de paquets pour toutes les fibres
[3683]165 // la methode par defaut ne fait rien
166 // if (fgokallfibers_) { faire le traitement }
[3696]167 // return 0;
168 /* Exemple de code test */
[3686]169 if ( totprocnpaq_ % 1000 == 0 ) {
[3876]170 cout << " BRBaseProcessor::Process() " << totprocnpaq_ << " FrameCnt=" ;
[3686]171 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
172 cout << curfc_[fib] << "," ;
173 cout << endl;
174 cout << " TimeTag : " ;
175 for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++)
176 cout << vpaq_[fib].TimeTag()/125000000 << "," ;
177 cout << " seconds" << endl;
178 }
[3696]179 return 0;
[3683]180}
181
Note: See TracBrowser for help on using the repository browser.