Changeset 3671 in Sophya for trunk/AddOn/TAcq/brpaqu.cc
- Timestamp:
- Nov 13, 2009, 11:54:04 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/AddOn/TAcq/brpaqu.cc
r3659 r3671 3 3 #include "brpaqu.h" 4 4 5 /* ---------------------------------------- 6 Projet BAORadio --- LAL - 2008-2010 7 R. Ansari , M.Taurigna 8 ------------------------------------------- */ 9 10 /* --Methode-- */ 11 BAORadioException::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-- */ 20 BAORadioException::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-- */ 27 BAORadioException::~BAORadioException() throw() 28 { 29 } 30 31 /* --Methode-- */ 32 const char* BAORadioException::what() const throw() 33 { 34 return msg_; 35 } 36 37 /* --Methode-- */ 38 string const BAORadioException::Msg() const 39 { 40 return (string(msg_)); 41 } 42 43 //////////////////////////////////////////////////////////////// 44 //////////////////////////////////////////////////////////////// 5 45 6 46 static inline void bswap4(void* p) … … 14 54 15 55 /* --Methode__ */ 16 BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fg swap,int binMin,int nbBin)56 BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgconv) 17 57 // swapall = true -> on swap tout le paquet, sinon swap entete seulement 18 58 { 19 59 dst_ = dst; 20 60 sz_ = paqsz; 21 if ((src == NULL) || (dst == NULL)) return; 22 // Il faut mettre une protection (throw) si dst==NULL ou sz==0 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; 23 66 24 67 UInt32* src32 = (UInt32*)src; 25 68 UInt32* dst32 = (UInt32*)dst; 26 Byte* tmp = new Byte[sz_];27 69 28 switch ( fgswap ) { 70 71 switch ( fgconv ) { 29 72 case BR_DoNothing : // rien a faire 30 73 break; … … 32 75 memcpy(dst_, src, sz_); 33 76 break; 34 case BR_Copy_Reduc : // copie directe35 memcpy(dst_, src, HeaderSize());36 37 memcpy(dst_+ HeaderSize(), src+(binMin+ HeaderSize()), nbBin);38 memcpy(dst_+ (HeaderSize()+ nbBin ), src+(binMin+ HeaderSize()+sz_/2), nbBin);39 memcpy(dst_+( HeaderSize()+( 2* nbBin)),src+(HeaderSize()+DataSize()),TrailerSize());40 41 SetPaqLen( nbBin/2);42 break;43 44 77 case BR_Swap32 : // On swappe toutes les donnees du paquet 45 78 // les bytes sont dans l'ordre par paquet de 4 octets (Int32) , les deux Int32 de 46 // On copie la zone donnees en faisant un byte-swap correspondant a 8 octets (4->8 Reza/firmware SGDMA) 79 // On copie la zone donnees en faisant un byte-swap correspondant a 8 octets (4->8 Reza/firmware SGDMA) 47 80 for(int ka=0; ka<sz_/4; ka+=2) { 48 81 dst32[ka] = src32[ka+1]; … … 51 84 break; 52 85 case BR_SwapAll: 53 for(int ka=0; ka<sz_; ka+=8) { 86 // Byte swap complet sur 8 bytes 87 for(int ka=0; ka<sz_; ka+=8) { 54 88 for(int kb=0; kb<4; kb++) { 55 89 dst_[ka+kb] = src[ka+3-kb+4]; … … 57 91 } 58 92 } 59 for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) { 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) { 60 101 for(int kb=0; kb<4; kb++) { 61 102 dst_[ka+kb] = src[ka+3-kb+4]; … … 63 104 } 64 105 } 65 break; 66 case BR_SwapHDR : 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 67 117 case BR_FFTOneChan : 68 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 : 69 134 // Byte swap (sur 8 octets) de l'entete 70 135 // ByteSwap 8 (4->8 Reza/firmware SGDMA) de l'enete … … 75 140 } 76 141 } 77 78 142 // on reoordonne les coeff FFT et on swappe en mem temps (Byte-swap sur 8 octets) 79 if (fgswap == BR_FFTOneChan) ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()); 80 else if (fgswap == BR_FFTTwoChan) { 81 ReorderFFTData((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2); 82 ReorderFFTData((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2); 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); 83 148 } 84 149 // Byte swap (sur 8 octets) du trailer … … 91 156 break; 92 157 93 case BR_FFTOneChan 32 :94 case BR_FFTTwoChan 32 :158 case BR_FFTOneChanSwap32 : 159 case BR_FFTTwoChanSwap32 : 95 160 // swap du header uniquement : Echange de deux mots de 4 octets 96 161 for(int ka=0; ka<BRHDRSIZE/4; ka+=2) { … … 98 163 dst32[ka+1] = src32[ka]; 99 164 } 100 101 165 // on reoordonne et on swappe en mem temps (Echange de deux mots de 4 octets) 102 if (fgswap == BR_FFTOneChan32) ReorderFFTData32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()); 103 else if (fgswap == BR_FFTTwoChan32) { 104 ReorderFFTData32((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2); 105 ReorderFFTData32((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2); 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); 106 171 } 107 172 // swap du trailler uniquement : Echange de deux mots de 4 octets … … 111 176 } 112 177 break; 113 case BR_FFTOneChanNoSwap : 114 case BR_FFTTwoChanNoSwap : 115 // copie du header uniquement 116 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka]; 117 118 //DEL on a plus de swapdonc il faut copier dans dst 119 //DEL memcpy(dst_, src, sz_); 120 121 // on reoordonne les coeff FFT (pas de swap) 122 if (fgswap == BR_FFTOneChanNoSwap) ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()); 123 else if (fgswap == BR_FFTTwoChanNoSwap) { 124 ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(dst_+HeaderSize()), DataSize()/2); 125 ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(dst_+HeaderSize()+DataSize()/2), DataSize()/2); 126 } 127 // copie du trailler uniquement : 128 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka]; 129 break; 130 case BR_CpHdrTrl : 131 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka]; 132 for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka]; 133 break; 134 135 case BR_FFTOneChanNoSwapReduct : 136 case BR_FFTTwoChanNoSwapReduct : 137 // copie du header uniquement 138 139 for(int ka=0; ka<BRHDRSIZE/4; ka++) dst32[ka] = src32[ka]; 140 141 //DEL on a plus de swapdonc il faut copier dans dst 142 //DEL memcpy(dst_, src, sz_); 143 144 // on reoordonne les coeff FFT (pas de swap) 145 if (fgswap == BR_FFTOneChanNoSwap) ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(tmp+HeaderSize()), DataSize()); 146 else if (fgswap == BR_FFTTwoChanNoSwap) { 147 ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()), (SByte*)(tmp+HeaderSize()), DataSize()/2); 148 ReorderFFTDataNoSwap((SByte*)(src+HeaderSize()+DataSize()/2), (SByte*)(tmp+HeaderSize()+DataSize()/2), DataSize()/2); 149 } 150 memcpy(tmp+ HeaderSize(), src+(binMin+ HeaderSize()), nbBin); 151 memcpy(tmp+ (HeaderSize()+ nbBin ), src+(binMin+ HeaderSize()+sz_/2), nbBin); 152 memcpy(tmp+( HeaderSize()+( 2* nbBin)),src+(HeaderSize()+DataSize()),TrailerSize()); 153 memcpy(dst_+ HeaderSize(),tmp+ HeaderSize(),( 2* nbBin)+TrailerSize()); 154 SetPaqLen( nbBin/2); 155 156 // copie du trailler uniquement : 157 // for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka++) dst32[ka] = src32[ka]; 158 break; 178 179 default: 180 // on ne fait rien 181 break; 159 182 } // Fin switch 160 183 161 184 } 162 185 … … 164 187 BRPaquet::BRPaquet(Byte* srcdst, int paqsz) 165 188 { 189 /* 190 if ((srcdst==NULL)||(paqsz<=(BRHDRSIZE+BRTRLSIZE))) 191 throw BAORadioException("BRPaquet::BRPaquet(srcdst) NULL pointer OR paqsz<HDR+TRLSize"); 192 */ 166 193 dst_ = srcdst; 167 194 sz_ = paqsz; 168 // Il faut mettre une protection (throw) si srcdst==NULL ou sz==0 195 } 196 197 /* --Methode__ */ 198 BRPaquet::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__ */ 209 void 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(), 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(), szc); 238 memcpy(Data2(), pq.Data2(), 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 } 169 248 } 170 249 … … 294 373 295 374 /* --Methode__ */ 296 void BRPaquet::ReorderFFTData(SByte* src, SByte* dst, int N) 297 { 375 void BRPaquet::ReorderFFTDataSwapAll(SByte* src, SByte* dst, int N) 376 { 377 // Remise en ordre des donnees avec swap complet sur 8 bytes 298 378 // Code recopie depuis /Dev/DisplayData/HistoWindow.cc 299 379 // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie … … 342 422 } 343 423 344 void BRPaquet::ReorderFFTData32(SByte* src, SByte* dst, int N) 345 { 424 /* --Methode__ */ 425 void BRPaquet::ReorderFFTDataSwap32(SByte* src, SByte* dst, int N) 426 { 427 // Remise en ordre avec echange (swap) des mots de 32 bits 346 428 // Code recopie depuis /Dev/DisplayData/HistoWindow.cc 347 429 // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie … … 384 466 return ; 385 467 } 386 void BRPaquet::ReorderFFTDataNoSwap(SByte* src, SByte* dst, int N) 387 { 468 469 /* --Methode__ */ 470 void BRPaquet::ReorderFFTData(SByte* src, SByte* dst, int N) 471 { 472 // Remise en ordre des donnees FFT (sans swap) 388 473 // Code recopie depuis /Dev/DisplayData/HistoWindow.cc 389 474 // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie … … 428 513 429 514 /* --Methode__ */ 430 const char* BRPaquet::FmtConvToString(BRDataFmtConv fg swap)515 const char* BRPaquet::FmtConvToString(BRDataFmtConv fgconv) 431 516 { 432 517 const char * rs=""; 433 switch ( fg swap) {518 switch ( fgconv ) { 434 519 case BR_DoNothing : 435 520 rs = "BR_DoNothing"; … … 441 526 rs = "BR_SwapAll"; 442 527 break; 528 case BR_Swap32 : 529 rs = "BR_Swap32"; 530 break; 531 case BR_CopyHDR : 532 rs = "BR_CopyHDR"; 533 break; 443 534 case BR_SwapHDR : 444 535 rs = "BR_SwapHDR"; … … 450 541 rs = "BR_FFTTwoChan"; 451 542 break; 452 case BR_Swap32 : 453 rs = "BR_Swap32"; 454 break; 455 case BR_FFTOneChan32 : 456 rs = "BR_FFTOneChan32"; 457 break; 458 case BR_FFTTwoChan32 : 459 rs = "BR_FFTTwoChan32"; 460 break; 461 case BR_FFTOneChanNoSwap : 462 rs = "BR_FFTOneChanNoSwap"; 463 break; 464 case BR_FFTTwoChanNoSwap : 465 rs = "BR_FFTTwoChanNoSwap"; 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"; 466 554 break; 467 555 default: … … 476 564 // -------------------------------------------------------------------------- 477 565 566 /* --Methode__ */ 478 567 BRPaqChecker::BRPaqChecker(bool cktrl, int maxprt) 479 568 { … … 490 579 } 491 580 581 /* --Methode__ */ 492 582 BRPaqChecker::~BRPaqChecker() 493 583 { … … 500 590 } 501 591 592 /* --Methode__ */ 502 593 UInt64 BRPaqChecker::DefineTRLTag(UInt32 trl1, UInt32 trl2) 503 594 { … … 506 597 } 507 598 508 599 /* --Methode__ */ 509 600 bool BRPaqChecker::Check(BRPaquet& paq, UInt64& numframe) 510 601 { … … 543 634 } 544 635 636 /* --Methode__ */ 545 637 ostream& BRPaqChecker::Print(ostream& os) const 546 638 { … … 556 648 return os; 557 649 } 650 651 /* --Methode__ */ 652 string BRPaqChecker::Summary(bool detail) const 653 { 654 double meangap = (cnt_saut>0)?((double)lostframes/(double)cnt_saut):0.; 655 double lossrate= (double)lostframes*100./(double)totnframes; 656 char buff[256]; 657 if (detail) 658 sprintf(buff, " TotNPaq= %ld HDR/TRL OK= %ld LostFrames= %ld LossRate= %lg NbGaps= %ld MeanGap= %lg", 659 (long)totnframes, (long)nframeok, (long)lostframes, lossrate, (long)cnt_saut, meangap); 660 else 661 sprintf(buff, "TotNPaq=%ld N_Ok=%ld LossRate=%lg", (long)totnframes, (long)nframeok, lossrate); 662 return buff; 663 } 664
Note:
See TracChangeset
for help on using the changeset viewer.