source: Sophya/trunk/AddOn/TAcq/brpaqu.cc@ 4086

Last change on this file since 4086 was 4016, checked in by ansari, 14 years ago

Ajout de commentaires d'autodocumentation Doxygen, Reza 12/08/2011

File size: 21.0 KB
RevLine 
[3642]1#include <string.h>
2
[3537]3#include "brpaqu.h"
4
[3671]5/* ----------------------------------------
6 Projet BAORadio --- LAL - 2008-2010
7 R. Ansari , M.Taurigna
8------------------------------------------- */
[3537]9
[4016]10/*!
11 \class BAORadioException
12 \ingroup TAcq
13
14 \brief Base class for exceptions used in the BAORadio acquisition software.
15*/
16
17
[3671]18/* --Methode-- */
19BAORadioException::BAORadioException(const char * m) throw()
20{
21 if (m!=NULL) {
22 strncpy(msg_, m, BREX_MAXMSGLEN-1);
23 msg_[BREX_MAXMSGLEN-1] = '\0';
24 }
25 else msg_[0] = '\0';
26}
27/* --Methode-- */
28BAORadioException::BAORadioException(const string& m) throw()
29{
30 strncpy(msg_, m.c_str(), BREX_MAXMSGLEN-1);
31 msg_[BREX_MAXMSGLEN-1] = '\0';
32}
33
34/* --Methode-- */
35BAORadioException::~BAORadioException() throw()
36{
37}
38
39/* --Methode-- */
40const char* BAORadioException::what() const throw()
41{
42 return msg_;
43}
44
45/* --Methode-- */
46string const BAORadioException::Msg() const
47{
48 return (string(msg_));
49}
50
51////////////////////////////////////////////////////////////////
52////////////////////////////////////////////////////////////////
53
[3537]54static inline void bswap4(void* p)
55{
56 UInt32 tmp = *(UInt32*)p;
57 *(UInt32*)p = ((tmp >> 24) & 0x000000FF) |
58 ((tmp >> 8) & 0x0000FF00) |
59 ((tmp & 0x0000FF00) << 8) |
60 ((tmp & 0x000000FF) << 24);
61}
62
[4016]63/*!
64 \class BRPaquet
65 \ingroup TAcq
66
67 \brief Class representing BAORadio data paquets, as received from ADC boards
68*/
69
[3592]70/* --Methode__ */
[3671]71BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgconv)
[3592]72 // swapall = true -> on swap tout le paquet, sinon swap entete seulement
[3537]73{
74 dst_ = dst;
75 sz_ = paqsz;
[3671]76 /*
77 if ((dst == NULL) || (paqsz<=(BRHDRSIZE+BRTRLSIZE)) )
78 throw BAORadioException("BRPaquet::BRPaquet(src,dst...) NULL src or dst pointer OR paqsz<HDR+TRLSize");
79 */
80 if ((dst==NULL)||(src==NULL)) return;
[3537]81
[3592]82 UInt32* src32 = (UInt32*)src;
83 UInt32* dst32 = (UInt32*)dst;
[3658]84
[3671]85
86 switch ( fgconv ) {
[3592]87 case BR_DoNothing : // rien a faire
88 break;
89 case BR_Copy : // copie directe
90 memcpy(dst_, src, sz_);
91 break;
92 case BR_Swap32 : // On swappe toutes les donnees du paquet
93 // les bytes sont dans l'ordre par paquet de 4 octets (Int32) , les deux Int32 de
[3671]94 // On copie la zone donnees en faisant un byte-swap correspondant a 8 octets (4->8 Reza/firmware SGDMA)
[3592]95 for(int ka=0; ka<sz_/4; ka+=2) {
96 dst32[ka] = src32[ka+1];
97 dst32[ka+1] = src32[ka];
[3658]98 }
[3592]99 break;
100 case BR_SwapAll:
[3671]101 // Byte swap complet sur 8 bytes
102 for(int ka=0; ka<sz_; ka+=8) {
[3592]103 for(int kb=0; kb<4; kb++) {
104 dst_[ka+kb] = src[ka+3-kb+4];
105 dst_[ka+kb+4] = src[ka+3-kb];
106 }
107 }
[3671]108 break;
109 case BR_CopyHDR:
110 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka];
111 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka];
112 break;
113 case BR_SwapHDR :
114 // ByteSwap 8 (4->8 Reza/firmware SGDMA) de l'enete
115 for(int ka=0; ka<BRHDRSIZE; ka+=8) {
[3592]116 for(int kb=0; kb<4; kb++) {
117 dst_[ka+kb] = src[ka+3-kb+4];
118 dst_[ka+kb+4] = src[ka+3-kb];
119 }
120 }
[3671]121 // Byte swap (sur 8 octets) du trailer
122 for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) {
123 for(int kb=0; kb<4; kb++) {
124 dst_[ka+kb] = src[ka+3-kb+4];
125 dst_[ka+kb+4] = src[ka+3-kb];
126 }
127 }
[3592]128 break;
[3671]129
130 // --------------------
131 // --- Copie/remise en ordre des donnees FFT
[3592]132 case BR_FFTOneChan :
133 case BR_FFTTwoChan :
[3671]134 // copie du header uniquement
135 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka];
136 // on reoordonne les coeff FFT (pas de swap)
137 if (fgconv == BR_FFTOneChan)
138 ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
139 else {
140 ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
141 ReorderFFTData((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
142 }
143 // copie du trailler uniquement :
144 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka];
145 break;
146
147 case BR_FFTOneChanSwapAll :
148 case BR_FFTTwoChanSwapAll :
[3623]149 // Byte swap (sur 8 octets) de l'entete
[3592]150 // ByteSwap 8 (4->8 Reza/firmware SGDMA) de l'enete
151 for(int ka=0; ka<BRHDRSIZE; ka+=8) {
152 for(int kb=0; kb<4; kb++) {
153 dst_[ka+kb] = src[ka+3-kb+4];
154 dst_[ka+kb+4] = src[ka+3-kb];
155 }
156 }
[3623]157 // on reoordonne les coeff FFT et on swappe en mem temps (Byte-swap sur 8 octets)
[3671]158 if (fgconv == BR_FFTOneChanSwapAll)
159 ReorderFFTDataSwapAll((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
160 else {
161 ReorderFFTDataSwapAll((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
162 ReorderFFTDataSwapAll((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
[3592]163 }
[3623]164 // Byte swap (sur 8 octets) du trailer
[3592]165 for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) {
166 for(int kb=0; kb<4; kb++) {
167 dst_[ka+kb] = src[ka+3-kb+4];
168 dst_[ka+kb+4] = src[ka+3-kb];
169 }
170 }
171 break;
172
[3671]173 case BR_FFTOneChanSwap32 :
174 case BR_FFTTwoChanSwap32 :
[3623]175 // swap du header uniquement : Echange de deux mots de 4 octets
[3592]176 for(int ka=0; ka<BRHDRSIZE/4; ka+=2) {
177 dst32[ka] = src32[ka+1];
178 dst32[ka+1] = src32[ka];
179 }
[3623]180 // on reoordonne et on swappe en mem temps (Echange de deux mots de 4 octets)
[3671]181 if (fgconv == BR_FFTOneChanSwap32)
182 ReorderFFTDataSwap32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize());
183 else {
184 ReorderFFTDataSwap32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2);
185 ReorderFFTDataSwap32((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2);
[3592]186 }
[3623]187 // swap du trailler uniquement : Echange de deux mots de 4 octets
[3592]188 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka+=2) {
189 dst32[ka] = src32[ka+1];
190 dst32[ka+1] = src32[ka];
191 }
[3658]192 break;
[3623]193
[3671]194 default:
195 // on ne fait rien
[3658]196 break;
[3592]197 } // Fin switch
[3671]198
[3537]199}
200
[3592]201/* --Methode__ */
202BRPaquet::BRPaquet(Byte* srcdst, int paqsz)
203{
[3671]204 /*
205 if ((srcdst==NULL)||(paqsz<=(BRHDRSIZE+BRTRLSIZE)))
206 throw BAORadioException("BRPaquet::BRPaquet(srcdst) NULL pointer OR paqsz<HDR+TRLSize");
207 */
[3592]208 dst_ = srcdst;
209 sz_ = paqsz;
210}
[3537]211
[3671]212/* --Methode__ */
213BRPaquet::BRPaquet(int paqsz)
214{
215 /*
216 if (paqsz<=(BRHDRSIZE+BRTRLSIZE))
217 throw BAORadioException("BRPaquet::BRPaquet(paqsz) paqsz<HDR+TRLSize");
218 */
219 dst_ = NULL;
220 sz_ = paqsz;
221}
[3592]222
223/* --Methode__ */
[3683]224BRPaquet::BRPaquet(BRPaquet const& paq)
225{
226 dst_ = paq.dst_;
227 sz_ = paq.sz_;
228}
229
230/* --Methode__ */
[3671]231void BRPaquet::CopyFrom(BRPaquet& pq, BRPaqReducAction ract, int offset)
232{
233 if (ract==BR_CopyRA) {
[3675]234 if (PaquetSize()!=pq.PaquetSize()) {
[3671]235 throw BAORadioException("BRPaquet::CopyFrom(BR_CopyRA) - NOT equal paquet size");
[3675]236 }
237 memcpy(Begin(), pq.Begin(), PaquetSize());
238 return;
[3671]239 }
240 // Recopie de l'entete HDR et trailer TRL
241 memcpy(Header(), pq.Header(), HeaderSize());
242 memcpy(Trailer(), pq.Trailer(), TrailerSize());
243 // Recopie partielle des donnees
244 size_t szc, szcmx;
245 switch (ract) {
246 case BR_OneChanReduc:
247 case BR_OneChanReducK0:
248 szc = DataSize();
249 szcmx = pq.DataSize()-offset;
250 if (szcmx<szc) szc=szcmx;
[3674]251 memcpy(Data1(), pq.Data1()+offset, szc);
[3671]252 if (ract==BR_OneChanReducK0) *(Data1C()) = *(pq.Data1C()); // On garde le continu et le nyquist
253 SetPaqLen(szc/4);
254 break;
255 case BR_TwoChanReduc:
256 case BR_TwoChanReducK0:
257 szc = DataSize()/2;
258 szcmx = pq.DataSize()/2-offset;
259 if (szcmx<szc) szc=szcmx;
[3674]260 memcpy(Data1(), pq.Data1()+offset, szc);
261 memcpy(Data2(), pq.Data2()+offset, szc);
[3671]262 if (ract==BR_TwoChanReducK0) { // On garde le continu et le nyquist
263 *(Data1C()) = *(pq.Data1C());
264 *(Data2C()) = *(pq.Data2C());
265 }
266 SetPaqLen(szc/2);
267 break;
268 default:
269 break;
270 }
271}
272
273
274/* --Methode__ */
[3592]275UInt16 BRPaquet::ChannelID()
276{
277
278 UInt16 ChnId=ChanId();
279 UInt16 ChpId=ChipId();
280
281
282 if (ChpId == 2)
283 {
284 if (ChnId == 1) ChnId = Ch3;
285 if (ChnId == 2) ChnId = Ch4;
286 if (ChnId == 3) ChnId = Ch3_4;
287 }
288 return(ChnId);
289}
290
291/* --Methode__ */
292UInt16 BRPaquet::ModeAcquisition()
293{
294 UInt16 ModAq;
[3623]295//DEL printf("Mod Acq %x \n",ModeAcq());
[3592]296 ModAq = ((ModeAcq() & 0x30)>> 4);
297 return(ModAq);
298}
299
300/* --Methode__ */
[3623]301void BRPaquet::SetHDRMarker64(UInt64 htag)
[3537]302{
[3623]303 *((UInt64*)(dst_+OFFSET)) = htag;
304 return;
305}
306
307/* --Methode__ */
308void BRPaquet::SetTRLMarker64(UInt64 ttag)
309{
310 *((UInt64*)(dst_+(sz_-BRTRLSIZE+OFFSET+1))) = 0;
311 *((UInt64*)(dst_+(sz_-BRTRLSIZE+OFFSET))) = ttag;
312 return;
313}
314
315/* --Methode__ */
316void BRPaquet::SetFrameCounter(UInt32 fc)
317{
318 UInt32* wp = (UInt32*)(dst_+(BRFRCPTOFF+OFFSET));
319 *wp = (*wp & 0x0000FFFF) | ((fc<<16) & 0xFFFF0000);
320 return;
321}
322
323/* --Methode__ */
324void BRPaquet::SetTimeTag(UInt64 timtag)
325{
326 UInt32* wp = (UInt32*)(dst_+(BRFRCPTOFF+OFFSET));
327 UInt32 fc = *wp;
328 *((UInt64*)(dst_+(BRTMTAGOFF+OFFSET))) = timtag;
329 *wp = (*wp & 0x0000FFFF) | (fc & 0xFFFF0000);
330 return;
331}
332
333/* --Methode__ */
334ostream& BRPaquet::Print(ostream & os, int nelt, bool prht)
335{
[3592]336 os << endl << "BRPaquet::Print() PaqSz=" << PaquetSize() << " DataSize=" << DataSize()
[3623]337 << " dst_pointer=(hex)" << hex << (unsigned long)dst_ << dec << endl;
[3592]338 if (dst_ == NULL) {
339 os << " ...NULL paquet " << endl;
[3623]340 return os;
[3592]341 }
[3623]342 os << " BR AcqMode: " << ModeAcquisition() << " Channel: " << ChannelID()
343 << " FrameCounter=" << FrameCounter() << " FrameDataLen=" << PaqLen() << endl;
[3537]344 if (TrailerSize() > 0)
345 os << " ...HDRMarker(hex)=" << hex << HDRMarker() << " TRLMarker=" << TRLMarker() << dec << endl;
346 else
347 os << " ...HDRMarker(hex)=" << hex << HDRMarker() << " NO TRLMarker=" << dec << endl;
348 UInt32 tt1, tt2;
[3592]349 tt2 = TimeTag1();
350 tt1 = TimeTag2();
[3623]351 os << " ...TimeTag (hex)=" << hex << " TT1= " << tt1 << " TT2=" << tt2
352 << dec << " ->TimeTag()=" << TimeTag() << endl;
[3592]353 // os << " ...Position Chariot (hex)= " << hex << PositionChariot() << endl;
[3537]354 if (nelt > DataSize()/2) nelt = DataSize()/2;
355 os << " ...Data[1.." << nelt << "]= ";
[3592]356
357 for(int k=0; k<nelt; k++) os << (int)(*(Data1()+k)) << " , ";
[3537]358 os << endl;
359 os << " ...Data[" << DataSize()-nelt << ".." << DataSize()-1 << "]= ";
[3592]360 for(int k=DataSize()-nelt; k<DataSize(); k++) os << (int)(*(Data1()+k)) << " , ";
[3537]361 os << endl;
362 if (prht) { // Impression header / trailer
363 UInt32* hdr = (UInt32*)Header();
364 os << " ...Header (hex):" << hex ;
365 for(int k=0; k<HeaderSize()/sizeof(UInt32); k++)
366 os << hdr[k] << " , " ;
367 os << dec << endl;
368 if (TrailerSize() > 0) {
369 UInt32* trl = (UInt32*)Trailer();
370 os << " ...Trailer (hex):" << hex ;
371 for(int k=0; k<TrailerSize()/sizeof(UInt32); k++)
372 os << trl[k] << " , " ;
373 os << dec << endl;
374 }
375 }
[3623]376 return os;
[3537]377}
[3592]378
379
380// ---------------------------------------------------------
381// **** REMARQUE N/2+1 complexes -> N/2 complexes *****
382// N = Nb d'echantillon en temps -> N/2 paires (real, imag)
383// Il y a le continu, et N/2 frequences ---> N/2+1 nombres complexes,
384// mais avec la contrainte Z(0).imag = 0 Z(N/2).imag = 0
385// f(i) i=0...N-1 ===> Z(k) ( Z complexe , k=0...N/2 )
386// mais avec la contrainte Z(0).imag = 0 Z(N/2).imag = 0
387// On peut donc tout mettre ds N/2 complexes en choisissant
388// de mettre ds Z(0).imag Z(N/2).real
389// ----------------------------------------------------------
390
391// Fonction magique qui donne le pointeur permettant de tenir compte du byte-swp sur 8 octets
392static inline int IndexByteSwap8(int idx)
393{
394 return ( (idx-(idx%8))+(7-idx%8) ) ;
395}
396
397/* --Methode__ */
[3671]398void BRPaquet::ReorderFFTDataSwapAll(SByte* src, SByte* dst, int N)
[3592]399{
[3671]400 // Remise en ordre des donnees avec swap complet sur 8 bytes
[3592]401 // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
402 // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
403 // Modif par rapport au code de Bruno : N/2 elements complexes au lieu de N/2+1 - Remarque ci-dessus
404
405 int nCoef = N / 2; // to change
406 int debutIndex = N / 4 + 1;
407 int fifoSize = N / 4 - 1;
408 int i;
409
410 TwoByteComplex* dstcmplx = (TwoByteComplex*)dst;
411
412 // cout << " Display BAO Datas FFT (" << N << ")" << " : from 0 to "<< nCoef << endl;
413 // cout << " Variables : debutIndex, fifoSize " << debutIndex << ", " << fifoSize << endl;
414
415
416 // Sortie 1
417 for (i = 0; i < fifoSize ; i++)
418 {
419 dstcmplx[debutIndex + i].realB() = src[IndexByteSwap8(2*i)];
420 dstcmplx[debutIndex + i].imagB() = src[IndexByteSwap8(2*i + 1)];
421 }
422
423 // element au milieu
424 dstcmplx[N / 4].realB() = src[IndexByteSwap8(2*fifoSize)];
425 dstcmplx[N / 4].imagB() = src[IndexByteSwap8(2*fifoSize + 1)];
426
427 // Sortie 2
428 for (i = 0; i < fifoSize ; i++)
429 {
430 dstcmplx[fifoSize - i].realB() = src[IndexByteSwap8(nCoef + 2*i)];
431 dstcmplx[fifoSize - i].imagB() = src[IndexByteSwap8(nCoef + 2*i + 1)];
432 }
433
434 // k = 0 et k = N/2
435 dstcmplx[0].realB() = src[IndexByteSwap8(N - 2)];
436 // Voir Remarque ci-dessus Z(N/2).real -> Z(0).image
437 dstcmplx[0].imagB() = src[IndexByteSwap8(N - 1)]; // Attention, on met ici la real(fmax)
438
439 return ;
440}
441
442static inline int IndexByteSwap8_32(int idx)
443{
444 return ( (idx-(idx%8))+((4+idx%8)%8) ) ;
445}
446
[3671]447/* --Methode__ */
448void BRPaquet::ReorderFFTDataSwap32(SByte* src, SByte* dst, int N)
[3592]449{
[3671]450 // Remise en ordre avec echange (swap) des mots de 32 bits
[3592]451 // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
452 // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
453 // Modif par rapport au code de Bruno : N/2 elements complexes au lieu de N/2+1 - Remarque ci-dessus
454
455 int nCoef = N / 2; // to change
456 int debutIndex = N / 4 + 1;
457 int fifoSize = N / 4 - 1;
458 int i;
459
460 TwoByteComplex* dstcmplx = (TwoByteComplex*)dst;
461
462 // cout << " Display BAO Datas FFT (" << N << ")" << " : from 0 to "<< nCoef << endl;
463 // cout << " Variables : debutIndex, fifoSize " << debutIndex << ", " << fifoSize << endl;
464
465
466 // Sortie 1
467 for (i = 0; i < fifoSize ; i++)
468 {
469 dstcmplx[debutIndex + i].realB() = src[IndexByteSwap8_32(2*i)];
470 dstcmplx[debutIndex + i].imagB() = src[IndexByteSwap8_32(2*i + 1)];
471 }
472
473 // element au milieu
474 dstcmplx[N / 4].realB() = src[IndexByteSwap8_32(2*fifoSize)];
475 dstcmplx[N / 4].imagB() = src[IndexByteSwap8_32(2*fifoSize + 1)];
476
477 // Sortie 2
478 for (i = 0; i < fifoSize ; i++)
479 {
480 dstcmplx[fifoSize - i].realB() = src[IndexByteSwap8_32(nCoef + 2*i)];
481 dstcmplx[fifoSize - i].imagB() = src[IndexByteSwap8_32(nCoef + 2*i + 1)];
482 }
483
484 // k = 0 et k = N/2
485 dstcmplx[0].realB() = src[IndexByteSwap8_32(N - 2)];
486 // Voir Remarque ci-dessus Z(N/2).real -> Z(0).image
487 dstcmplx[0].imagB() = src[IndexByteSwap8_32(N - 1)]; // Attention, on met ici la real(fmax)
488
489 return ;
490}
[3671]491
492/* --Methode__ */
493void BRPaquet::ReorderFFTData(SByte* src, SByte* dst, int N)
[3592]494{
[3671]495 // Remise en ordre des donnees FFT (sans swap)
[3592]496 // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
497 // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
498 // Modif par rapport au code de Bruno : N/2 elements complexes au lieu de N/2+1 - Remarque ci-dessus
499
500 int nCoef = N / 2; // to change
501 int debutIndex = N / 4 + 1;
502 int fifoSize = N / 4 - 1;
503 int i;
504
505 TwoByteComplex* dstcmplx = (TwoByteComplex*)dst;
506
507 // cout << " Display BAO Datas FFT (" << N << ")" << " : from 0 to "<< nCoef << endl;
508 // cout << " Variables : debutIndex, fifoSize " << debutIndex << ", " << fifoSize << endl;
509
510
511 // Sortie 1
512 for (i = 0; i < fifoSize ; i++)
513 {
514 dstcmplx[debutIndex + i].realB() = src[(2*i)];
515 dstcmplx[debutIndex + i].imagB() = src[(2*i + 1)];
516 }
517
518 // element au milieu
519 dstcmplx[N / 4].realB() = src[(2*fifoSize)];
520 dstcmplx[N / 4].imagB() = src[(2*fifoSize + 1)];
521
522 // Sortie 2
523 for (i = 0; i < fifoSize ; i++)
524 {
525 dstcmplx[fifoSize - i].realB() = src[(nCoef + 2*i)];
526 dstcmplx[fifoSize - i].imagB() = src[(nCoef + 2*i + 1)];
527 }
528
529 // k = 0 et k = N/2
530 dstcmplx[0].realB() = src[(N - 2)];
531 // Voir Remarque ci-dessus Z(N/2).real -> Z(0).image
532 dstcmplx[0].imagB() = src[(N - 1)]; // Attention, on met ici la real(fmax)
533
534 return ;
535}
536
537/* --Methode__ */
[3671]538const char* BRPaquet::FmtConvToString(BRDataFmtConv fgconv)
[3592]539{
540 const char * rs="";
[3671]541 switch ( fgconv ) {
[3592]542 case BR_DoNothing :
543 rs = "BR_DoNothing";
544 break;
545 case BR_Copy :
546 rs = "BR_Copy";
547 break;
548 case BR_SwapAll :
549 rs = "BR_SwapAll";
550 break;
[3671]551 case BR_Swap32 :
552 rs = "BR_Swap32";
553 break;
554 case BR_CopyHDR :
555 rs = "BR_CopyHDR";
556 break;
[3592]557 case BR_SwapHDR :
558 rs = "BR_SwapHDR";
559 break;
560 case BR_FFTOneChan :
561 rs = "BR_FFTOneChan";
562 break;
563 case BR_FFTTwoChan :
564 rs = "BR_FFTTwoChan";
565 break;
[3671]566 case BR_FFTOneChanSwapAll :
567 rs = "BR_FFTOneChanSwapAll";
[3592]568 break;
[3671]569 case BR_FFTTwoChanSwapAll :
570 rs = "BR_FFTTwoChanSwapAll";
[3592]571 break;
[3671]572 case BR_FFTOneChanSwap32 :
573 rs = "BR_FFTOneChanSwap32";
[3592]574 break;
[3671]575 case BR_FFTTwoChanSwap32 :
576 rs = "BR_FFTTwoChanSwap32";
[3592]577 break;
578 default:
579 rs = "?????";
580 break;
581 } // Fin switch
582 return rs;
583}
584
[3674]585/* --Methode__ */
586const char* BRPaquet::ReducActionToString(BRPaqReducAction rac)
587{
588 const char * rs="";
589 switch ( rac ) {
590 case BR_CopyRA :
591 rs = "BR_CopyRA";
592 break;
593 case BR_OneChanReduc :
594 rs = "BR_OneChanReduc";
595 break;
596 case BR_TwoChanReduc :
597 rs = "BR_TwoChanReduc";
598 break;
599 case BR_OneChanReducK0 :
600 rs = "BR_OneChanReducK0";
601 break;
602 case BR_TwoChanReducK0 :
603 rs = "BR_TwoChanReducK0";
604 break;
605 default:
606 rs = "?????";
607 break;
608 } // Fin switch
609 return rs;
610}
611
[3592]612// --------------------------------------------------------------------------
613// Classe pour effectuer des verifications d'integrite sur les paquets/frames
614// --------------------------------------------------------------------------
615
[4016]616/*!
617 \class BRPaqChecker
618 \ingroup TAcq
619
620 \brief Data packets (BRPaquet) objet integrity checker
621*/
622
[3671]623/* --Methode__ */
[3640]624BRPaqChecker::BRPaqChecker(bool cktrl, int maxprt)
[3592]625{
[3640]626 cktrl_ = cktrl;
[3592]627 totnframes = 0;
628 nframeok = 0;
629 lostframes = 0;
630 frclst = 0;
[3659]631 lastframenum = 0;
[3640]632 cnt_saut = 0;
633 maxprt_ = maxprt;
[3623]634 DefineHDRTag();
635 DefineTRLTag();
[3592]636}
637
[3671]638/* --Methode__ */
[3683]639BRPaqChecker::BRPaqChecker(BRPaqChecker const& pck)
640{
641 totnframes=pck.totnframes;
642 nframeok=pck.nframeok;
643 lostframes=pck.lostframes;
644 frclst=pck.frclst;
645 lastframenum=pck.lastframenum;
646 cktrl_=pck.cktrl_;
647 cnt_saut=pck.cnt_saut;
648 maxprt_=pck.maxprt_;
649 hdrtag_=pck.hdrtag_;
650 trltag_=pck.trltag_;
651}
652
653/* --Methode__ */
[3592]654BRPaqChecker::~BRPaqChecker()
655{
656}
657
[3623]658UInt64 BRPaqChecker::DefineHDRTag(UInt32 hdr1, UInt32 hdr2)
659{
660 hdrtag_ = (UInt64)hdr1 + ((UInt64)hdr2 << 32);
661 return hdrtag_;
662}
663
[3671]664/* --Methode__ */
[3623]665UInt64 BRPaqChecker::DefineTRLTag(UInt32 trl1, UInt32 trl2)
666{
667 trltag_ = (UInt64)trl1 + ((UInt64)trl2 << 32);
668 return trltag_;
669}
670
[3671]671/* --Methode__ */
[3659]672bool BRPaqChecker::Check(BRPaquet& paq, UInt64& numframe)
[3592]673{
674 totnframes++;
[3659]675 numframe=0;
[3623]676 if (paq.HDRMarker64() != HDRTag()) return false;
[3640]677 if (cktrl_&&(paq.TRLMarker64() != TRLTag())) return false;
[3625]678 /* DBG
[3623]679 if (paq.TRLMarker64() != TRLTag()) {
680 cnt_pb++;
681 if (cnt_pb < 5) paq.Print();
682 return false;
683 }
684 */
[3592]685 unsigned int curfc = paq.FrameCounter();
686 unsigned int delfc = 0;
687 if (nframeok > 0) {
688 if (curfc>frclst) delfc = (curfc-frclst);
[3630]689 else delfc = (65536-frclst+curfc);
[3592]690 lostframes += (unsigned long long)delfc - 1;
[3625]691 if (delfc != 1) {
[3640]692 cnt_saut++;
693 if (cnt_saut < maxprt_) {
[3626]694 cout << "BRPaqChecker::Check([NumFrameOK=" << nframeok
695 << ")/Debug FrameCounter Cur=" << curfc
696 << " Last=" << frclst << " -> delta=" << delfc << endl;
697 paq.Print();
698 }
[3625]699 }
[3592]700 }
[3659]701 nframeok++; frclst=curfc;
702 lastframenum+=(unsigned long long)delfc; // numero de frame sans repliement a 65535
703 numframe=lastframenum;
[3625]704//DBG if (cnt_pb<5) { cnt_pb++; paq.Print(); }
[3592]705 return true;
706}
707
[3671]708/* --Methode__ */
[3640]709ostream& BRPaqChecker::Print(ostream& os) const
[3592]710{
[3623]711 // os << "BRPaqChecker: HDRTag=" << hex << HDRTag() << " TRLTag=" << TRLTag() << dec << "\n"
712 // << " ... Tot.Nb.Frames.Proc=" << totnframes << " NbFrame HDR/TRL OK=" << nframeok
[3640]713 os << "BRPaqChecker: Tot.Nb.Frames.Proc=" << totnframes << " Nb.HDR/TRL OK=" << nframeok;
714 if (cktrl_) os << " (Check Header AND Trailer)" << endl;
715 else os << " (Header Check only)" << endl;
716 float meangap = (cnt_saut>0)?((float)lostframes/(float)cnt_saut):0.;
717 os << " ... LostFrames=" << lostframes
718 << " LossRate=" << (double)lostframes*100./(double)totnframes << " %"
719 << " NbGaps=" << cnt_saut << " MeanGap=" << meangap << endl;
[3592]720 return os;
721}
[3671]722
723/* --Methode__ */
724string BRPaqChecker::Summary(bool detail) const
725{
726 double meangap = (cnt_saut>0)?((double)lostframes/(double)cnt_saut):0.;
727 double lossrate= (double)lostframes*100./(double)totnframes;
728 char buff[256];
729 if (detail)
730 sprintf(buff, " TotNPaq= %ld HDR/TRL OK= %ld LostFrames= %ld LossRate= %lg NbGaps= %ld MeanGap= %lg",
731 (long)totnframes, (long)nframeok, (long)lostframes, lossrate, (long)cnt_saut, meangap);
732 else
733 sprintf(buff, "TotNPaq=%ld N_Ok=%ld LossRate=%lg", (long)totnframes, (long)nframeok, lossrate);
734 return buff;
735}
736
Note: See TracBrowser for help on using the repository browser.