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

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

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