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


Ignore:
Timestamp:
Apr 6, 2009, 11:57:39 PM (16 years ago)
Author:
ansari
Message:

Amelioration programme mfits2pec.cc - Reza 06/04/2009

File:
1 edited

Legend:

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

    r3538 r3592  
    1111}
    1212
    13 BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz)
     13/* --Methode__ */
     14BRPaquet::BRPaquet(Byte* src, Byte* dst, int paqsz, BRDataFmtConv fgswap)
     15  // swapall = true -> on swap tout le paquet, sinon swap entete seulement
    1416{
    1517  dst_ = dst;
    1618  sz_ = paqsz;
    17   if ((src==NULL)||(dst==NULL))  return;
    18   // On copie l'entete sans swapper
    19   for(int k=0; k<BRHDRSIZE; k++)  dst_[k] = src[k];
    20   // On copie la zone donnees en faisant un byte-swap correspondant a 4 octets
    21    for(int ka=BRHDRSIZE; ka<sz_-BRTRLSIZE; ka+=4) {
    22     for(int kb=0; kb<4; kb++)
    23       dst_[ka+kb] = src[ka+3-kb];
     19  if ((src == NULL) || (dst == NULL)) return;
     20  // Il faut mettre une protection (throw) si dst==NULL ou sz==0
     21
     22  UInt32* src32 = (UInt32*)src;
     23  UInt32* dst32 = (UInt32*)dst;
     24
     25  switch ( fgswap ) {
     26  case BR_DoNothing :  // rien a faire
     27    break;
     28  case BR_Copy : // copie directe
     29    memcpy(dst_, src, sz_);
     30    break;
     31  case BR_Swap32 : // On swappe toutes les donnees du paquet
     32  //  les bytes sont dans l'ordre par paquet de 4 octets (Int32) , les deux Int32 de
     33  // On copie la zone donnees en faisant un byte-swap correspondant a 8 octets (4->8 Reza/firmware SGDMA)
     34    for(int ka=0; ka<sz_/4; ka+=2) {
     35      dst32[ka] = src32[ka+1];
     36      dst32[ka+1] = src32[ka];
     37    }
     38   
     39    break;
     40  case BR_SwapAll:
     41  for(int ka=0; ka<sz_; ka+=8) {
     42      for(int kb=0; kb<4; kb++) {
     43        dst_[ka+kb] = src[ka+3-kb+4];   
     44        dst_[ka+kb+4] = src[ka+3-kb];   
     45      }
     46    }
     47    for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) {
     48      for(int kb=0; kb<4; kb++) {
     49        dst_[ka+kb] = src[ka+3-kb+4];   
     50        dst_[ka+kb+4] = src[ka+3-kb];   
     51      }
     52    }
     53    break;
     54  case BR_SwapHDR :
     55  case BR_FFTOneChan :
     56  case BR_FFTTwoChan :
     57    // ByteSwap 8 (4->8 Reza/firmware SGDMA) de l'enete
     58    for(int ka=0; ka<BRHDRSIZE; ka+=8) {
     59      for(int kb=0; kb<4; kb++) {
     60        dst_[ka+kb] = src[ka+3-kb+4];   
     61        dst_[ka+kb+4] = src[ka+3-kb];   
     62      }
     63    }
     64
     65    if (fgswap == BR_FFTOneChan) ReorderFFTData(src+HeaderSize(), dst_+HeaderSize(), DataSize());
     66    else if (fgswap == BR_FFTTwoChan) {
     67      ReorderFFTData(src+HeaderSize(), dst_+HeaderSize(), DataSize()/2);
     68      ReorderFFTData(src+HeaderSize()+DataSize()/2, dst_+HeaderSize()+DataSize()/2, DataSize()/2);
     69    }
     70    for(int ka=HeaderSize()+DataSize(); ka<sz_; ka+=8) {
     71      for(int kb=0; kb<4; kb++) {
     72        dst_[ka+kb] = src[ka+3-kb+4];   
     73        dst_[ka+kb+4] = src[ka+3-kb];   
     74      }
     75    }
     76    break;
     77 
     78  case BR_FFTOneChan32 :
     79  case BR_FFTTwoChan32 :
     80    // on swappe tout  en attendant le swap general sinon il faut encore créer une fonctiondifferente de ReorderFFT
     81    // swapp du header uniquement
     82    for(int ka=0; ka<BRHDRSIZE/4; ka+=2) {
     83      dst32[ka] = src32[ka+1];
     84      dst32[ka+1] = src32[ka];
     85    }
     86 
     87    // on reoordonne et on swappe en mem temps
     88    if (fgswap == BR_FFTOneChan32) ReorderFFTData32(src+HeaderSize(), dst_+HeaderSize(), DataSize());
     89    else if (fgswap == BR_FFTTwoChan32) {
     90      ReorderFFTData32(src+HeaderSize(), dst_+HeaderSize(), DataSize()/2);
     91      ReorderFFTData32(src+HeaderSize()+DataSize()/2, dst_+HeaderSize()+DataSize()/2, DataSize()/2);
     92    }
     93    // swap du trailler uniquement
     94    for(int ka=(HeaderSize()+DataSize())/4;ka < sz_/4; ka+=2) {
     95      dst32[ka] = src32[ka+1];
     96      dst32[ka+1] = src32[ka];
     97    }
     98   
     99  case BR_FFTOneChanNoSwap :
     100  case BR_FFTTwoChanNoSwap :
     101    // on a plus de swapdonc il faut copier dans dst
     102    memcpy(dst_, src, sz_);
     103    // on reoordonne et on swappe en mem temps
     104    if (fgswap == BR_FFTOneChanNoSwap) ReorderFFTDataNoSwap(src+HeaderSize(), dst_+HeaderSize(), DataSize());
     105    else if (fgswap == BR_FFTTwoChanNoSwap) {
     106      ReorderFFTDataNoSwap(src+HeaderSize(), dst_+HeaderSize(), DataSize()/2);
     107      ReorderFFTDataNoSwap(src+HeaderSize()+DataSize()/2, dst_+HeaderSize()+DataSize()/2, DataSize()/2);
     108    }
     109   
     110    break;
     111  }  // Fin switch
     112
     113}
     114
     115/* --Methode__ */
     116BRPaquet::BRPaquet(Byte* srcdst, int paqsz)
     117{
     118  dst_ = srcdst;
     119  sz_ = paqsz;
     120  // Il faut mettre une protection (throw) si srcdst==NULL ou sz==0
     121}
     122
     123
     124/* --Methode__ */
     125UInt16 BRPaquet::ChannelID()
     126{
     127
     128  UInt16 ChnId=ChanId();
     129  UInt16 ChpId=ChipId();
     130 
     131     
     132  if (ChpId == 2)
     133    {
     134      if (ChnId == 1) ChnId = Ch3;
     135      if (ChnId == 2) ChnId = Ch4;
     136      if (ChnId == 3) ChnId = Ch3_4;
     137    }
     138  return(ChnId);
     139}
     140
     141/* --Methode__ */
     142UInt16 BRPaquet::ModeAcquisition()
     143{
     144  UInt16 ModAq;
     145  printf("Mod Acq %x \n",ModeAcq());
     146  ModAq = ((ModeAcq() & 0x30)>> 4);
     147  return(ModAq);
     148 
     149}
     150
     151/* --Methode__ */
     152void BRPaquet::Print(ostream & os, int nelt, bool prht)
     153{
     154  os << endl << "BRPaquet::Print() PaqSz=" << PaquetSize() << " DataSize=" << DataSize()
     155     << " dst_pointer=(hex)" << hex << (unsigned long)dst_ << dec << endl;
     156  if (dst_ == NULL) {
     157    os << " ...NULL paquet " << endl;
     158    return;
    24159  }
    25   // On copie le trailer sans swapper
    26   for(int k=sz_-1; k>=sz_-BRTRLSIZE; k--)  dst_[k] = src[k];
    27 
    28 }
    29 
    30 
    31 void BRPaquet::Print(ostream & os, int nelt, bool prht)
    32 {
    33   os << "BRPaquet::Print() PaqSz=" << PaquetSize() << " DataSize=" << DataSize()
    34      << " dst_pointer=(hex)" << hex << (unsigned long)dst_ << dec << endl;
     160
     161  os << endl << " BR AcqMode: " << ModeAcquisition() << " Channel: " << ChannelID()  << endl;
     162
    35163  if (TrailerSize() > 0)
    36164    os << " ...HDRMarker(hex)=" << hex <<  HDRMarker() << " TRLMarker=" << TRLMarker() << dec << endl;
     
    38166    os << " ...HDRMarker(hex)=" << hex <<  HDRMarker() << " NO TRLMarker=" << dec << endl;
    39167  UInt32 tt1, tt2;
    40 //  tt2 = (TimeTag()&0xFFFFFFFF00000000) >> 32;
    41   tt2=0;
    42   tt1 = TimeTag()&0x00000000FFFFFFFF;
    43   os << " ...TimeTag (hex)=" << hex << TimeTag() << " TT1= " << tt1 << " TT2=" << tt2 << dec << endl;
     168  tt2 = TimeTag1();
     169  tt1 = TimeTag2();
     170  os << " ...TimeTag (hex)=" << hex << "TimeTag()" << " TT1= " << tt1 << " TT2=" << tt2 << dec << endl;
     171  // os << " ...Position Chariot (hex)= " << hex << PositionChariot() << endl;
    44172  if (nelt > DataSize()/2) nelt = DataSize()/2;
    45173  os << " ...Data[1.." << nelt << "]= ";
    46   for(int k=0; k<nelt; k++) os << (int)(*(Data()+k)) << " , ";
     174
     175  for(int k=0; k<nelt; k++) os << (int)(*(Data1()+k)) << " , ";
    47176  os << endl;
    48177  os << " ...Data[" << DataSize()-nelt << ".." << DataSize()-1 << "]= ";
    49   for(int k=DataSize()-nelt; k<DataSize(); k++) os << (int)(*(Data()+k)) << " , ";
     178  for(int k=DataSize()-nelt; k<DataSize(); k++) os << (int)(*(Data1()+k)) << " , ";
    50179  os << endl;
    51180  if (prht) {   // Impression header / trailer
     
    64193  }
    65194}
     195
     196
     197// ---------------------------------------------------------
     198//  **** REMARQUE   N/2+1 complexes -> N/2 complexes *****
     199// N = Nb d'echantillon en temps -> N/2 paires (real, imag)
     200// Il y a le continu, et N/2 frequences ---> N/2+1 nombres complexes,
     201// mais avec la contrainte Z(0).imag = 0  Z(N/2).imag = 0
     202// f(i) i=0...N-1   ===> Z(k) ( Z complexe , k=0...N/2 )
     203// mais avec la contrainte Z(0).imag = 0  Z(N/2).imag = 0
     204// On peut donc tout mettre ds N/2 complexes en choisissant
     205// de mettre ds Z(0).imag  Z(N/2).real
     206// ----------------------------------------------------------
     207
     208// Fonction magique qui donne le pointeur permettant de tenir compte du byte-swp sur 8 octets
     209static inline int IndexByteSwap8(int idx)
     210{
     211  return ( (idx-(idx%8))+(7-idx%8) ) ;
     212}
     213
     214/* --Methode__ */
     215void BRPaquet::ReorderFFTData(Byte* src, Byte* dst, int N)
     216{
     217  // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
     218  // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
     219  // Modif par rapport au code de Bruno : N/2 elements complexes au lieu de N/2+1 - Remarque ci-dessus
     220 
     221  int nCoef = N / 2; // to change
     222  int debutIndex = N / 4 + 1;
     223  int fifoSize =  N / 4 - 1;
     224  int i;
     225
     226  TwoByteComplex* dstcmplx = (TwoByteComplex*)dst;
     227 
     228  //   cout << " Display BAO Datas FFT (" << N << ")" << " : from 0 to "<< nCoef << endl;
     229  //   cout << " Variables : debutIndex, fifoSize " << debutIndex << ", " << fifoSize << endl;
     230
     231 
     232  // Sortie 1
     233  for (i = 0; i < fifoSize ; i++)
     234    {
     235      dstcmplx[debutIndex + i].realB() = src[IndexByteSwap8(2*i)];
     236      dstcmplx[debutIndex + i].imagB() = src[IndexByteSwap8(2*i + 1)];
     237    }
     238
     239  // element au milieu
     240  dstcmplx[N / 4].realB() = src[IndexByteSwap8(2*fifoSize)];
     241  dstcmplx[N / 4].imagB() = src[IndexByteSwap8(2*fifoSize + 1)];
     242
     243  // Sortie 2
     244  for (i = 0; i < fifoSize ; i++)
     245    {
     246      dstcmplx[fifoSize - i].realB() = src[IndexByteSwap8(nCoef + 2*i)];
     247      dstcmplx[fifoSize - i].imagB() = src[IndexByteSwap8(nCoef + 2*i + 1)];
     248    }
     249
     250  // k = 0 et k = N/2 
     251  dstcmplx[0].realB() = src[IndexByteSwap8(N - 2)];
     252  // Voir Remarque ci-dessus Z(N/2).real -> Z(0).image
     253  dstcmplx[0].imagB() = src[IndexByteSwap8(N - 1)];  // Attention, on met ici la real(fmax)
     254
     255  return ;
     256}
     257
     258static inline int IndexByteSwap8_32(int idx)
     259{
     260  return ( (idx-(idx%8))+((4+idx%8)%8) ) ;
     261}
     262
     263void BRPaquet::ReorderFFTData32(Byte* src, Byte* dst, int N)
     264{
     265  // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
     266  // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
     267  // Modif par rapport au code de Bruno : N/2 elements complexes au lieu de N/2+1 - Remarque ci-dessus
     268
     269  int nCoef = N / 2; // to change
     270  int debutIndex = N / 4 + 1;
     271  int fifoSize =  N / 4 - 1;
     272  int i;
     273
     274  TwoByteComplex* dstcmplx = (TwoByteComplex*)dst;
     275 
     276  //   cout << " Display BAO Datas FFT (" << N << ")" << " : from 0 to "<< nCoef << endl;
     277  //   cout << " Variables : debutIndex, fifoSize " << debutIndex << ", " << fifoSize << endl;
     278
     279 
     280  // Sortie 1
     281  for (i = 0; i < fifoSize ; i++)
     282    {
     283      dstcmplx[debutIndex + i].realB() = src[IndexByteSwap8_32(2*i)];
     284      dstcmplx[debutIndex + i].imagB() = src[IndexByteSwap8_32(2*i + 1)];
     285    }
     286
     287  // element au milieu
     288  dstcmplx[N / 4].realB() = src[IndexByteSwap8_32(2*fifoSize)];
     289  dstcmplx[N / 4].imagB() = src[IndexByteSwap8_32(2*fifoSize + 1)];
     290
     291  // Sortie 2
     292  for (i = 0; i < fifoSize ; i++)
     293    {
     294      dstcmplx[fifoSize - i].realB() = src[IndexByteSwap8_32(nCoef + 2*i)];
     295      dstcmplx[fifoSize - i].imagB() = src[IndexByteSwap8_32(nCoef + 2*i + 1)];
     296    }
     297
     298  // k = 0 et k = N/2 
     299  dstcmplx[0].realB() = src[IndexByteSwap8_32(N - 2)];
     300  // Voir Remarque ci-dessus Z(N/2).real -> Z(0).image
     301  dstcmplx[0].imagB() = src[IndexByteSwap8_32(N - 1)];  // Attention, on met ici la real(fmax)
     302
     303  return ;
     304}
     305void BRPaquet::ReorderFFTDataNoSwap(Byte* src, Byte* dst, int N)
     306{
     307  // Code recopie depuis /Dev/DisplayData/HistoWindow.cc
     308  // fonction TraceWind::DisplayBaoDatasFFT() et adapte aux structures BRPaquet et Cie
     309  // Modif par rapport au code de Bruno : N/2 elements complexes au lieu de N/2+1 - Remarque ci-dessus
     310 
     311  int nCoef = N / 2; // to change
     312  int debutIndex = N / 4 + 1;
     313  int fifoSize =  N / 4 - 1;
     314  int i;
     315
     316  TwoByteComplex* dstcmplx = (TwoByteComplex*)dst;
     317 
     318  //   cout << " Display BAO Datas FFT (" << N << ")" << " : from 0 to "<< nCoef << endl;
     319  //   cout << " Variables : debutIndex, fifoSize " << debutIndex << ", " << fifoSize << endl;
     320
     321 
     322  // Sortie 1
     323  for (i = 0; i < fifoSize ; i++)
     324    {
     325      dstcmplx[debutIndex + i].realB() = src[(2*i)];
     326      dstcmplx[debutIndex + i].imagB() = src[(2*i + 1)];
     327    }
     328
     329  // element au milieu
     330  dstcmplx[N / 4].realB() = src[(2*fifoSize)];
     331  dstcmplx[N / 4].imagB() = src[(2*fifoSize + 1)];
     332
     333  // Sortie 2
     334  for (i = 0; i < fifoSize ; i++)
     335    {
     336      dstcmplx[fifoSize - i].realB() = src[(nCoef + 2*i)];
     337      dstcmplx[fifoSize - i].imagB() = src[(nCoef + 2*i + 1)];
     338    }
     339
     340  // k = 0 et k = N/2 
     341  dstcmplx[0].realB() = src[(N - 2)];
     342  // Voir Remarque ci-dessus Z(N/2).real -> Z(0).image
     343  dstcmplx[0].imagB() = src[(N - 1)];  // Attention, on met ici la real(fmax)
     344
     345  return ;
     346}
     347
     348/* --Methode__ */
     349const char* BRPaquet::FmtConvToString(BRDataFmtConv fgswap)
     350{
     351  const char * rs="";
     352  switch ( fgswap ) {
     353  case BR_DoNothing : 
     354    rs = "BR_DoNothing";
     355    break;
     356  case BR_Copy :
     357    rs = "BR_Copy";
     358    break;
     359  case BR_SwapAll :
     360    rs = "BR_SwapAll";
     361    break;
     362  case BR_SwapHDR :
     363    rs = "BR_SwapHDR";
     364    break;
     365  case BR_FFTOneChan :
     366    rs = "BR_FFTOneChan";
     367    break;
     368  case BR_FFTTwoChan :
     369    rs = "BR_FFTTwoChan";
     370    break;
     371  case BR_Swap32 :
     372    rs = "BR_Swap32";
     373    break;
     374  case BR_FFTOneChan32 :
     375    rs = "BR_FFTOneChan32";
     376    break;
     377  case BR_FFTTwoChan32 :
     378    rs = "BR_FFTTwoChan32";
     379    break;
     380  case BR_FFTOneChanNoSwap :
     381    rs = "BR_FFTOneChanNoSwap";
     382    break;
     383  case BR_FFTTwoChanNoSwap :
     384    rs = "BR_FFTTwoChanNoSwap";
     385    break;
     386  default:
     387    rs = "?????";
     388    break;
     389  }  // Fin switch
     390  return rs;
     391}
     392
     393// --------------------------------------------------------------------------
     394// Classe pour effectuer des verifications d'integrite sur les paquets/frames
     395// --------------------------------------------------------------------------
     396
     397BRPaqChecker::BRPaqChecker()
     398{
     399  totnframes = 0;
     400  nframeok = 0;
     401  lostframes = 0;
     402  frclst = 0;
     403}
     404
     405BRPaqChecker::~BRPaqChecker()
     406{
     407}
     408
     409bool BRPaqChecker::Check(BRPaquet& paq)
     410{
     411  totnframes++;
     412  if (paq.HDRMarker() != 0x76543210) return false;
     413  unsigned int curfc = paq.FrameCounter();
     414  unsigned int delfc = 0;
     415  if (nframeok > 0) {
     416    if (curfc>frclst)  delfc = (curfc-frclst);
     417    else delfc = (65535-frclst+curfc);
     418    lostframes += (unsigned long long)delfc - 1;
     419  }
     420  nframeok++; frclst = curfc;
     421  return true;
     422}
     423
     424ostream& BRPaqChecker::Print(ostream& os)
     425{
     426  os << "BRPaqChecker:  Tot.Nb.Frames.Proc=" << totnframes << " NbFrameOK=" << nframeok
     427     << " LostFrames=" << lostframes
     428     << " Loss=" << (double)lostframes*100./(double)totnframes << " %" << endl;
     429  return os;
     430}
Note: See TracChangeset for help on using the changeset viewer.