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

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

Correction bug avec reduction taille de paquet - Reza 15/11/2009

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