Changeset 3671 in Sophya for trunk/AddOn/TAcq/brpaqu.cc


Ignore:
Timestamp:
Nov 13, 2009, 11:54:04 AM (16 years ago)
Author:
ansari
Message:
  • Nettoyage complet des programmes d'acquisition
  • Ajout methode BRPaquet::CopyFrom() pour reduction de paquet
  • Introduction des classes BRParList , BRConfList , BRAcqConfig
  • Introduction du nouveau programme acquisition mfacq.cc (MultiFibresAcq)

Reza, 13/11/2009

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/AddOn/TAcq/brpaqu.cc

    r3659 r3671  
    33#include "brpaqu.h"
    44
     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////////////////////////////////////////////////////////////////
    545
    646static inline void bswap4(void* p)
     
    1454
    1555/* --Methode__ */
    16 BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgswap,int binMin,int nbBin )
     56BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgconv)
    1757  // swapall = true -> on swap tout le paquet, sinon swap entete seulement
    1858{
    1959  dst_ = dst;
    2060  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;
    2366
    2467  UInt32* src32 = (UInt32*)src;
    2568  UInt32* dst32 = (UInt32*)dst;
    26   Byte* tmp = new Byte[sz_];
    2769 
    28   switch ( fgswap ) {
     70 
     71  switch ( fgconv ) {
    2972  case BR_DoNothing :  // rien a faire
    3073    break;
     
    3275    memcpy(dst_, src, sz_);
    3376    break;
    34   case BR_Copy_Reduc : // copie directe
    35    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    
    4477  case BR_Swap32 : // On swappe toutes les donnees du paquet
    4578  //  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)
    4780    for(int ka=0; ka<sz_/4; ka+=2) {
    4881      dst32[ka] = src32[ka+1];
     
    5184    break;
    5285  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) {
    5488      for(int kb=0; kb<4; kb++) {
    5589        dst_[ka+kb] = src[ka+3-kb+4];   
     
    5791      }
    5892    }
    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) {
    60101      for(int kb=0; kb<4; kb++) {
    61102        dst_[ka+kb] = src[ka+3-kb+4];   
     
    63104      }
    64105    }
    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
    67117  case BR_FFTOneChan :
    68118  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 :
    69134    // Byte swap (sur 8 octets) de l'entete
    70135    // ByteSwap 8 (4->8 Reza/firmware SGDMA) de l'enete
     
    75140      }
    76141    }
    77 
    78142    // 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);
    83148    }
    84149    // Byte swap (sur 8 octets) du trailer
     
    91156    break;
    92157 
    93   case BR_FFTOneChan32 :
    94   case BR_FFTTwoChan32 :
     158  case BR_FFTOneChanSwap32 :
     159  case BR_FFTTwoChanSwap32 :
    95160    // swap du header uniquement : Echange de deux mots de 4 octets
    96161    for(int ka=0; ka<BRHDRSIZE/4; ka+=2) {
     
    98163      dst32[ka+1] = src32[ka];
    99164    }
    100  
    101165    // 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);
    106171    }
    107172    // swap du trailler uniquement : Echange de deux mots de 4 octets
     
    111176    }
    112177    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;
    159182  }  // Fin switch
    160 
     183 
    161184}
    162185
     
    164187BRPaquet::BRPaquet(Byte* srcdst, int paqsz)
    165188{
     189  /*
     190  if ((srcdst==NULL)||(paqsz<=(BRHDRSIZE+BRTRLSIZE)))
     191    throw BAORadioException("BRPaquet::BRPaquet(srcdst) NULL pointer OR paqsz<HDR+TRLSize"); 
     192  */
    166193  dst_ = srcdst;
    167194  sz_ = paqsz;
    168   // Il faut mettre une protection (throw) si srcdst==NULL ou sz==0
     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(), 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  }
    169248}
    170249
     
    294373
    295374/* --Methode__ */
    296 void BRPaquet::ReorderFFTData(SByte* src, SByte* dst, int N)
    297 {
     375void BRPaquet::ReorderFFTDataSwapAll(SByte* src, SByte* dst, int N)
     376{
     377  // Remise en ordre des donnees avec swap complet sur 8 bytes
    298378  // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
    299379  // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
     
    342422}
    343423
    344 void BRPaquet::ReorderFFTData32(SByte* src, SByte* dst, int N)
    345 {
     424/* --Methode__ */
     425void BRPaquet::ReorderFFTDataSwap32(SByte* src, SByte* dst, int N)
     426{
     427  // Remise en ordre avec echange (swap) des mots de 32 bits
    346428  // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
    347429  // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
     
    384466  return ;
    385467}
    386 void BRPaquet::ReorderFFTDataNoSwap(SByte* src, SByte* dst, int N)
    387 {
     468
     469/* --Methode__ */
     470void BRPaquet::ReorderFFTData(SByte* src, SByte* dst, int N)
     471{
     472  // Remise en ordre des donnees FFT (sans swap)
    388473  // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
    389474  // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
     
    428513
    429514/* --Methode__ */
    430 const char* BRPaquet::FmtConvToString(BRDataFmtConv fgswap)
     515const char* BRPaquet::FmtConvToString(BRDataFmtConv fgconv)
    431516{
    432517  const char * rs="";
    433   switch ( fgswap ) {
     518  switch ( fgconv ) {
    434519  case BR_DoNothing : 
    435520    rs = "BR_DoNothing";
     
    441526    rs = "BR_SwapAll";
    442527    break;
     528  case BR_Swap32 :
     529    rs = "BR_Swap32";
     530    break;
     531  case BR_CopyHDR :
     532    rs = "BR_CopyHDR";
     533    break;
    443534  case BR_SwapHDR :
    444535    rs = "BR_SwapHDR";
     
    450541    rs = "BR_FFTTwoChan";
    451542    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";
    466554    break;
    467555  default:
     
    476564// --------------------------------------------------------------------------
    477565
     566/* --Methode__ */
    478567BRPaqChecker::BRPaqChecker(bool cktrl, int maxprt)
    479568{
     
    490579}
    491580
     581/* --Methode__ */
    492582BRPaqChecker::~BRPaqChecker()
    493583{
     
    500590}
    501591
     592/* --Methode__ */
    502593UInt64 BRPaqChecker::DefineTRLTag(UInt32 trl1, UInt32 trl2)
    503594{
     
    506597}
    507598
    508 
     599/* --Methode__ */
    509600bool BRPaqChecker::Check(BRPaquet& paq, UInt64& numframe)
    510601{
     
    543634}
    544635
     636/* --Methode__ */
    545637ostream& BRPaqChecker::Print(ostream& os) const
    546638{
     
    556648  return os;
    557649}
     650
     651/* --Methode__ */
     652string 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.