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

Last change on this file since 4001 was 3683, checked in by ansari, 16 years ago

Mise a jour et ajout de fichier pour taritement multifibres apres

prise de donnees de Nov2009 a Pittsburgh

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