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

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

version presque finale mfacq.cc avec reduction de taille de paquets - Reza 14/11/2009

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