Changeset 3909 in Sophya for trunk/AddOn/TAcq


Ignore:
Timestamp:
Nov 21, 2010, 2:26:12 PM (15 years ago)
Author:
ansari
Message:

1/ Mise en place d'informations auxiliaires au niveau de RAcqMemZoneMgr ,

FillTime (DATEOBS) pour chaque zone et identificateur des fibres

2/ remplissage de FillTime(DATEOBS) Et FiberId's de MemZoneMgr par

les classes PCIEMultiReader et EthernetReader

3/ Ajout de mots-cle (ds les datacards) pour numeros d'identification des

fibres et parametres de controles du DMA (@fiberids @waitenddma)
et corrections/ameliorations des modes acq (raw1c ordfft2c ...)

4/ Parametrage des WaitEndDMA ds PCIEWrapperInterface et implementation

au niveau de DMAMgrV6 (dmamgrv6.h .cc)

5/ Gestion d'echec DMA -> arret acquisition ds PCIEMultiReader,EthernetReader

modification TimeOut DMA entre le premier DMA et les suivants pour permettre
un arret propre rapide

6/ Adaptation de la classe BRVisibilityCalculator pour utilisation

FillTime (DATEOBS) et FiberIds de MemZoneMgr - amelioration de
l'identification des numeros de canaux pour les matrices de visibilites

7/ Petites ameliorations (ecriture mot-cles) pour MultiDataSaver et

amelioration classe BRMultiFitsReader pour lecture FillTime (DATEOBS)
et FiberIds depuis les fichiers FITS et remplissage de RAcqMemZoneMgr

Reza, 21/11/2010

Location:
trunk/AddOn/TAcq
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/AddOn/TAcq/acqparam_exemple.d

    r3899 r3909  
    22#   ------------ Soft BAORadio --------------
    33#   ------ Exemple de datacard pour les parametres d'acquisition
    4 #            Octobre/novembre 2009
     4#          2009 - 2010
    55#################################################################
    6 #   Liste des fibres  - @fibres I[,J,K...]
    7 #  Par defaut  @fibres 1
    8 @fibres 1,2
     6#   Liste des fibres  - @fibres I[,J,K...]  ou @fibers
     7#   @fibers 1,2,3   OU   @fibres 1,2,3
     8#  Par defaut  @fibres 1
     9@fibers 1,2
     10#   Numero (absolu) d'identification des fibres
     11#  Defaut:  @fiberids 1,2,3,4,5,6,7,8
     12@fiberids 1,2,3,4,5,6,7,8
    913#  Nom du Repertoire pour les fichiers d'acquisition
    1014#  Par defaut  @outpathname TstAcq
     
    1620#  Par defaut  @paqsize 16424
    1721@paqsize 8192
     22### Parametres du DMA
    1823#   Taille des DMA en kb (=1024 bytes)
    1924#  Par defaut @dmasizekb 32
    2025@dmasizekb 32
     26#   Parametres du timeout
     27#   @waitenddma maxkloop_check_enddma maxretry first_maxkloop_check_enddma first_maxretry
     28#     maxkloop_check_enddma : taille de boucle d'attente de fin DMA, en unite de 1000 (max_loop=1000*maxkloop)
     29#     first_maxkloop...,first_maxretry : parametres pour le premier DMA (attente debut trigger)
     30#   Defaut : @waitenddma 1000 3 20000 9
     31waitenddma 1000 3 20000 9
    2132#   Nombre total (maximum) de fichiers fits produits (/fibre)
    2233#  Par defaut  @nbfiles 1
     
    2738#   Mode d'acquisition   
    2839#  Par defaut  @acqmode std
    29 #   Modes standard:  [std=raw data] [fft2c=fft 2 canaux]
    30 #   Autres modes:  [nof=std,NoFitsFile] pattern,patnof,fft2cnof ...]
     40#   Modes standard:  [std=raw2c : 2 channels raw data] [fft2c: fft 2 canaux - NOT reordered]
     41#   Autres modes:  raw1c , fft1c , ordfft2c , ordfft1c 
     42#                  [nof=std+NoFitsFile] pattern,patnof,fft2cnof ...
    3143@acqmode std
    3244#  Parametres MemmoryManager    @memmgr  NZones,NPaqPerZone
     
    5163#  @ethrnlink 4
    5264ethrnlink 4
    53 #  En mode reception de paquets sur ethernet,  On peut forcer la lecture
    54 #   de paquets avec meme compteur de paquet (Force SameFrameCounter )
    55 #  @ethrforcesamefc  MaxDiffNumPaq   MaxNbResync
    56 #  Le parametre MaxDiffNumPaq (50 par defaut) est la difference maximum entre nombre de
    57 #  paquets lus sur les differents liens et MaxNbResync (def=50) est le nombre maximum de tentatives
     65#  En mode reception de paquets sur ethernet,  On peut activer la lecture
     66#   de paquets avec alignement du compteur (FrameCounter) avec la carte @ethrforcesamefc
     67#  @ethrforcesamefc  maxdiff_paqnum   maxresync
     68#  Le parametre maxdiff_paqnum (0 par defaut) est la difference maximum entre nombre de
     69#  paquets lus sur les differents liens et maxresync (0 par defaut) est le nombre maximum de tentatives
    5870#  de resynchronisation succesive
    59 ethrforcesamefc 50 50
     71#  - force_samefc=false : lecture des paquet sans alignement des FrameCounter
     72#  - force_samefc=true : lecture paquets avec alignement des FrameCounter
     73#    + mode par defaut : maxdiff_paqnum=0, maxresync=0 -> on cherche a aligner FrameCounter sur les
     74#    differents liens ethernet
     75#    + maxdiff_paqnum>0 : difference maximum de nombre de paquets entre les differents liens
     76#    + maxresync>0 : Mode de lecture avec resynchronisation du nombre de paquets , 
     77#      nombre maxi de resynchronisation
     78#  Modes conseilles : false  ;  @ethrforcesamefc 0 0   ;  @ethrforcesamefc 10 0 ;  @ethrforcesamefc 50 0
     79ethrforcesamefc 0 0
    6080#####
    6181# En activant la carte suivante, le lecteur (EthernetReader) attend les messages END sur chaque lien
     
    83103visicfreq 0 0 0
    84104########################
    85 #  Taux de perte de paquets en simulation (Sans carte PCIExpress)
    86 #  @nopcilossrate Perte     (0<=Perte<1)
     105#  Taux de perte de paquets en simulation / nombre maxi de paquets generes (Sans carte PCIExpress)
     106#  @nopcilossrate MaxCount.LossRate     (0<=LossRate<1)  - Defaut MaxCount=0 -> Non limite
     107#  MaxCount=Partie_Entiere ,   LossRate=Partie_Fractionnaire
    87108#  Defaut @nopcilossrate 0.
    88109########################
  • trunk/AddOn/TAcq/bracqvers.h

    r3876 r3909  
    55   Software version     LAL - 2008-2010
    66*/
    7 #define BAOR_ACQ_VER 7.2
    8 #define BAOR_ACQ_VER_STR "BaoAcq_v7r2_Sep10 "
     7#define BAOR_ACQ_VER 7.3
     8#define BAOR_ACQ_VER_STR "BaoAcq_v7r3_Nov10 "
    99
    1010#endif
  • trunk/AddOn/TAcq/brbaseproc.cc

    r3882 r3909  
    9797        break; 
    9898      }
     99      cts_=memgr_.GetAuxData(mid)->FillTime();   // get associated date/time (DATEOBS)
    99100      for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
    100101        fbuff_[fib] = memgr_.GetMemZone(mid,fib);
  • trunk/AddOn/TAcq/brbaseproc.h

    r3872 r3909  
    1414
    1515#include "brpaqu.h"
     16#include "timestamp.h"  // include SOPHYA
    1617
    1718using namespace std;
     
    5758
    5859  uint_8 totprocnpaq_;
     60  SOPHYA::TimeStamp cts_;   // current time stamp, get from MemZoneMgr
    5961
    6062  string bpnom_;    // nom du processeur
  • trunk/AddOn/TAcq/brfitsrd.cc

    r3883 r3909  
    5555      throw BAORadioException("BRMultiFitsReader::BRMultiFitsReader/ mff.NAxis1() != memgr_.PaqSize() ");
    5656    }
     57    // Extraction de qques parametres utiles depuis les fichiers FITS
     58    string fkvs;
     59    if (fib==0) {
     60      fkvs=mff_[fib].GetKeyValue("DATEOBS");
     61      if (fkvs.length()>0) {
     62        cdateobs_.Set(fkvs);
     63        cout << " BRMultiFitsReader/First file (for fiber 0) DATEOBS=" << fkvs << endl;
     64      }
     65    }
     66    fkvs=mff_[fib].GetKeyValue("DATEOBS");
     67    memgr_.FiberId(fib) = atoi( fkvs.c_str() );
     68
    5769    vfilenum_.push_back(imin_);
    5870    vfpos_.push_back(0);
     
    207219        throw BAORadioException("BRMultiFitsReader::ReadNext()/ mff.NAxis1() != memgr_.PaqSize() ");
    208220      }
     221      if (fib==0) {  // updating current date from file (fiber 0)
     222        string fkvs=mff_[fib].GetKeyValue("DATEOBS");
     223        if (fkvs.length()>0)  cdateobs_.Set(fkvs);
     224      }
    209225      vfpos_[fib]=0;
    210226    }
  • trunk/AddOn/TAcq/brfitsrd.h

    r3883 r3909  
    1414#include "brpaqu.h"
    1515#include "minifits.h"
     16#include "timestamp.h"
    1617
    1718using namespace std;
     
    7980  Byte* mmbufib_[MAXANAFIB];  // Pointeurs zone memoire de chaque fibre rendu par RAcqMemZoneMgr
    8081
     82  SOPHYA::TimeStamp cdateobs_;    // current time/date read from file
     83 
    8184  int prtlev_;         // print level
    8285  uint_8 prtmodulo_;   // print periodicity (modulo)
  • trunk/AddOn/TAcq/brparam.cc

    r3901 r3909  
    9898
    9999// Classe qui memorise tous les parametres importants de l'acquisition
     100#define PMAXNBFIBRES 64
    100101
    101102/* --Methode-- */
     
    109110
    110111  FiberListS=fibres;
    111   NbFibers=0;
    112   for (int fib=0; fib<PMAXNBFIBRES;fib++)  FiberNum[fib]=0;
     112  FiberIdsS="1,2,3,4,5,6,7,8";
     113
    113114  PaqSize=paqsz;
     115
    114116  dmasizekb=dmaszkb;
     117  maxkwedma_=1000;
     118  nretrydma_=3;
     119  first_maxkwedma_=20000;
     120  first_nretrydma_=9;
    115121
    116122  NbFiles=nfiles;
     
    181187
    182188  FiberListS=p.FiberListS;
    183   NbFibers=p.NbFibers;
    184   for (int fib=0; fib<PMAXNBFIBRES;fib++)  FiberNum[fib]=p.FiberNum[fib];
     189  FiberNum=p.FiberNum;
     190  FiberIdsS=p.FiberIdsS;
     191  FiberIds=p.FiberIds;
    185192
    186193  PaqSize=p.PaqSize;
     194
    187195  dmasizekb=p.dmasizekb;
     196  maxkwedma_=p.maxkwedma_;
     197  nretrydma_=p.nretrydma_;
     198  first_maxkwedma_=p.first_maxkwedma_;
     199  first_nretrydma_=p.first_nretrydma_;
    188200
    189201  NbFiles=p.NbFiles;
     
    237249{
    238250  DataCards conf(file);
    239   FiberListS= conf.SParam("fibres",0,"1");
     251  if(conf.HasKey("fibres"))
     252    FiberListS= conf.SParam("fibres",0,"1");
     253  else if(conf.HasKey("fibers"))
     254    FiberListS= conf.SParam("fibers",0,"1");
     255  if(conf.HasKey("fiberids"))   
     256    FiberIdsS= conf.SParam("fiberids",0,"1");
     257
    240258  OutPathName= conf.SParam("outpathname",0,"TstAcq");
    241259  skysource= conf.SParam("skysource",0,"");
    242260  PaqSize=(uint_4)conf.IParam("paqsize",0,16424);
     261
    243262  dmasizekb =(uint_4) conf.IParam("dmasizekb",0,32);
     263  maxkwedma_=(unsigned int)conf.IParam("waitenddma",0,1000);
     264  nretrydma_=(unsigned int)conf.IParam("waitenddma",1,3);
     265  first_maxkwedma_=(unsigned int)conf.IParam("waitenddma",2,20*maxkwedma_);
     266  first_nretrydma_=(unsigned int)conf.IParam("waitenddma",3,3*nretrydma_);
     267
    244268  NbFiles=conf.IParam("nbfiles",0,1);
    245269  NBlocPerFile=conf.IParam("nblocperfile",0,10);
     
    303327  vector<string> fiblist;
    304328  FillVStringFrString(FiberListS, fiblist, ',');
    305   NbFibers=fiblist.size();
    306329  for (int fib=0; fib<fiblist.size(); fib++) {
    307     FiberNum[fib]=atoi(fiblist[fib].c_str());
    308   }
     330    FiberNum.push_back(atoi(fiblist[fib].c_str()));
     331  }
     332  vector<string> fibids;
     333  FillVStringFrString(FiberIdsS, fibids, ',');
     334  for (int fib=0; fib<fibids.size(); fib++) {
     335    FiberIds.push_back(atoi(fibids[fib].c_str()));
     336  }
     337
    309338  if (OutPathName == "/dev/null") {
    310339    fgnulldev4fits=true;
     
    318347  fgdatafft=false;  fgsinglechannel=false;
    319348  reducneedcopy=false;  pqreducmode=BR_TwoChanReduc;
    320   if ((acqmode == "std")||(acqmode=="raw2c"))   swapall = BR_Copy ; 
     349  if ((acqmode == "std")||(acqmode=="raw2c"))   swapall = BR_Copy ;
     350  if (acqmode=="raw1c") { swapall = BR_Copy ;  fgsinglechannel=true;  pqreducmode=BR_OneChanReduc; }
     351
     352  if ((acqmode == "fft2c")||(acqmode == "fft1c"))   swapall = BR_Copy ; 
    321353  if (acqmode == "nosw")   swapall = BR_Copy ;
    322354  if (acqmode == "nof")  { swapall = BR_Copy ; savesigfits = false; }
    323   if (acqmode == "fft1c")  { swapall = BR_FFTOneChan; reducneedcopy=true;  pqreducmode=BR_OneChanReducK0; }
    324   if (acqmode == "fft2c")  { swapall = BR_FFTTwoChan;  reducneedcopy=true;  pqreducmode=BR_TwoChanReducK0; }
     355  if (acqmode == "ordfft1c")  { swapall = BR_FFTOneChan; reducneedcopy=true;  pqreducmode=BR_OneChanReducK0; }
     356  if (acqmode == "ordfft2c")  { swapall = BR_FFTTwoChan;  reducneedcopy=true;  pqreducmode=BR_TwoChanReducK0; }
     357
    325358  if (acqmode == "fft1cnof") 
    326359    { swapall = BR_FFTOneChan;  savesigfits = false; reducneedcopy=true;  pqreducmode=BR_OneChanReducK0;  }
     
    379412  os << " ------ BRParList::Print() ----- " << endl;
    380413  os << " FiberListS=" << FiberListS ;
     414  os << " FiberIdsS=" << FiberIdsS ;
     415  os << " Fibers (Num->Id): ";
     416  for(size_t f=0; f<NbFibers(); f++)   cout << FiberNum[f] << " -> " << FiberIds[f] << " ; " ;
     417  os << endl;
    381418  os << " PaqSize=" <<PaqSize;
    382   os << " DMA_Size_kb=" <<dmasizekb << endl;
     419  os << " DMA_Size_kb=" <<dmasizekb << " (EndDMA: Maxkw=" << maxkwedma_ << " NRetry=" << nretrydma_
     420     << " FirstDMA: Maxkw=" << first_maxkwedma_ << " NRetry=" << first_nretrydma_ << ")" << endl;
    383421  os << " AcqMode="<<AcqMode;
    384422  os << " Type of acquisition :" << BRPaquet::FmtConvToString( swapall) << endl;
  • trunk/AddOn/TAcq/brparam.h

    r3899 r3909  
    7171};
    7272
    73 #define PMAXNBFIBRES 32
    7473
    7574//-----------------------------------------------------------------------------
     
    8887
    8988  // Nombre de fibres
    90   inline int NFibers() { return NbFibers; }
     89  inline size_t NFibers() { return FiberNum.size(); }
     90  inline size_t NbFibers() { return FiberNum.size(); }
    9191  // Taille des operations DMA (en octets)
    9292  inline uint_4 DMASizeBytes() { return dmasizekb*1024; }
     
    130130  bool fgsinglechannel; // true -> un seul canal par fibre (par defaut=2 canaux/fibres)
    131131
    132   string FiberListS ;  // liste des fibres a utiliser 1,3,4 par exemple
    133   int NbFibers;  // liste des fibres a utiliser 1,3,4 par exemple
    134   int FiberNum[PMAXNBFIBRES];
     132  string FiberListS ;    // String_liste des fibres a utiliser 1,3,4 par exemple
     133  vector<int> FiberNum;  // liste des fibres a utiliser {1,3,4} par exemple
     134  string FiberIdsS ;     // String_liste des numeros 'absolu' des fibres 12,13,14,15 par exemple
     135  vector<int> FiberIds;  // liste des numero d'identification 'absolu' des fibres {12,13,14,15} par ex.
    135136
    136137  string OutPathName;  // directory de base
    137138  string ProcPathName;
    138139  uint_4 PaqSize ; // taille des paquets ou sizeFrame
     140
     141  // Controle/gestion  du DMA
    139142  uint_4 dmasizekb ; // taille du dma en multiple de 2 (2 a 56)
     143  unsigned int maxkwedma_;   // Nombre d'iterations de la boucle d'attente de fin de DMA (en unite de 1000)
     144  unsigned int nretrydma_;   // nombre maxi de tentatives pour terminer le DMA
     145  unsigned int first_maxkwedma_;   // Nombre d'iterations de la boucle d'attente de fin du PREMIER DMA (u 1000)
     146  unsigned int first_nretrydma_;   // nombre maxi de tentatives pour terminer le PREMIER DMA
     147
    140148  int NbFiles; // nombre de fichier produits
    141149  int NBlocPerFile; // nombre de bloc par fichier
     
    234242
    235243  // Nombre de fibres
    236   inline int NFibers() { return param_->NbFibers; }
     244  inline int  NFibers() { return param_->NbFibers(); }
     245  inline int  NbFibers() { return param_->NbFibers(); }
     246
    237247  // Taille des operations DMA (en octets)
    238248  inline uint_4 DMASizeBytes() { return param_->DMASizeBytes(); }
  • trunk/AddOn/TAcq/brviscalc.cc

    r3895 r3909  
    3232
    3333  uint_4 maxnpairs = (2*memgr_.NbFibres()+1)*memgr_.NbFibres();
    34   chanum_.SetSize(maxnpairs);
    35   sa_size_t k=0;
    36   for(size_t i=0; i<2*memgr_.NbFibres(); i++)  vpdata_[i]=NULL;
    37   for(size_t i=0; i<2*memgr_.NbFibres(); i++) {
    38     for(size_t j=i; j<2*memgr_.NbFibres(); j++) {
    39       chanum_(k) = (i+1)*100+(j+1);  k++;
    40     }
    41   }
     34  chanids_.SetSize(2*memgr_.NbFibres());
     35  chanpairnumall_.SetSize(maxnpairs);
     36  chanpairsall_.SetSize(maxnpairs,2);
     37  for(size_t i=0; i<2*memgr_.NbFibres(); i++)   vpdata_[i]=NULL;
    4238  SelectPairs();
    4339
     
    8278  po << visdt_;
    8379  if (calcid_ == 0) {
    84     POutPersist poc(outpath_+"chanum.ppf");
    85     poc << chanum_;
    8680   
    8781    if (fgcktt_) {
     
    130124  nbpairs_=nbpairs;
    131125  vismtx_.SetSize(nbpairs_, paq.DataSize()/4);
     126
     127  chanpairnum_.SetSize(nbpairs_);
     128  chanpairs_.SetSize(nbpairs_,2);
     129
    132130  return nbpairs_;
    133131}
     
    147145}
    148146
     147/* --Methode-- */
     148void BRVisibilityCalculator::UpdateChanIds()
     149{
     150
     151  for(size_t i=0; i<memgr_.NbFibres(); i++) {
     152    chanids_(2*i)=memgr_.FiberId(i)*2-1;
     153    chanids_(2*i+1)=memgr_.FiberId(i)*2;
     154  }
     155  sa_size_t k=0;     // numero de ligne dans la matrice des visibilites
     156  for(size_t i=0; i<vpdata_.size(); i++) {
     157    for(size_t j=i; j<vpdata_.size(); j++) {
     158      chanpairnumall_(k)=chanids_(i)*CHANPAIRCONVFAC+chanids_(j);
     159      chanpairsall_(k,0)=chanids_(i);  chanpairsall_(k,1)=chanids_(j);     k++;
     160    }
     161  }
     162  sa_size_t kpair=0; 
     163  k=0;  // numero de ligne dans la matrice des visibilites
     164  for(size_t i=0; i<vpdata_.size(); i++) {
     165    for(size_t j=i; j<vpdata_.size(); j++) {
     166      kpair++;
     167      if (kpair<(pairst_+1))  continue;
     168      if (kpair>=(pairst_+nbpairs_+1))  break;
     169      chanpairnum_(k)=chanids_(i)*CHANPAIRCONVFAC+chanids_(j);
     170      chanpairs_(k,0)=chanids_(i);  chanpairs_(k,1)=chanids_(j);     k++;
     171    }
     172  }
     173
     174  string filename;
     175  filename = outpath_+"chanum.ppf";
     176  if (nbcalc_>1) {
     177    char sbuff[32];
     178    sprintf(sbuff,"chanum_%d.ppf",(int)calcid_);
     179    filename = outpath_+sbuff;
     180  }
     181  POutPersist poc(outpath_+"chanum.ppf");
     182  poc << PPFNameTag("chanids") << chanids_;
     183  poc << PPFNameTag("chanpairs") << chanpairs_;
     184  poc << PPFNameTag("chanpairnum") << chanpairnum_;
     185  poc << PPFNameTag("chanpairsall") << chanpairsall_;
     186  poc << PPFNameTag("chanpairnumal") << chanpairnumall_;
     187  cout << "BRVisibilityCalculator::UpdateChanIds() Channel Ids/Pairs saved to PPF file " << filename << endl;
     188  return;
     189}
    149190
    150191/* --Methode-- */
     
    207248        break; 
    208249      }
     250      cts_=memgr_.GetAuxData(mid)->FillTime();   // get associated date/time (DATEOBS)
     251
    209252      for(size_t fib=0; fib<(size_t)memgr_.NbFibres(); fib++) {
    210253        fbuff_[fib] = memgr_.GetMemZone(mid,fib);
     
    238281        vismtx_ = complex<r_4>((r_4)0.,(r_4)0.);
    239282        moyfc_=moytt_=0.;
    240         first_tmstamp_.SetNow();  // Current date and time
     283        //      first_tmstamp_.SetNow();  // Current date and time
     284        first_tmstamp_=cts_;  // Current date and time
    241285      }
    242286
     
    326370    first_fc_=curfc_[0];
    327371    first_tt_= (vpaq_[0].TimeTag()-ttfirst_[0]);
    328     first_tmstamp_.SetNow();  // Current date and time
     372    // first_tmstamp_.SetNow();  // Current date and time
     373    first_tmstamp_=cts_;  // Current date and time
    329374  }
    330375
     
    439484      for(sa_size_t jf=jf1_; jf<jf2_; jf++) {
    440485        xnt[2]=jf;
    441         xnt[3]=chanum_(rv+pairst_);
     486        xnt[3]=chanpairnumall_(rv+pairst_);
    442487        xnt[4]=vismtx_(rv,jf).real()/(r_4)(nmean_);
    443488        xnt[5]=vismtx_(rv,jf).imag()/(r_4)(nmean_);
     
    458503        }
    459504        xnt[2]=jf+djf_/2;
    460         xnt[3]=chanum_(rv+pairst_);
     505        xnt[3]=chanpairnumall_(rv+pairst_);
    461506        xnt[4]=moyreal/(r_4)(nmean_*djf_);
    462507        xnt[5]=moyimag/(r_4)(nmean_*djf_);
  • trunk/AddOn/TAcq/brviscalc.h

    r3895 r3909  
    3232// Classe de traitement - calcul de visibilite pour n fibres
    3333//---------------------------------------------------------------------
     34// Pour convertir une paire de numeros de canaux en un seul entier C1*CHANPAIRCONVFAC+C2
     35#define  CHANPAIRCONVFAC  1000
     36
    3437class BRVisibilityCalculator : public BRBaseProcessor, ParallelTaskInterface {
    3538public:
     
    6265
    6366protected:
     67  virtual void UpdateChanIds();
    6468  virtual int Process();
    6569  virtual void UpdateVisMtxInfo();
     
    8589 
    8690  TMatrix< complex<r_4> > vismtx_;
    87   TVector< uint_4 > chanum_;
     91  TVector< uint_4 > chanids_;    // Numero de chaque canal=FiberId*2-1, FiberId*2
     92  TVector< uint_4 > chanpairnumall_;  // Liste de tous les numeros de paires de canaux (forme 1000*C1+C2=IIIJJJ)
     93  TMatrix< uint_4 > chanpairsall_ ;  // Liste de toutes paires de canaux (forme (C1,C2) )
     94  TVector< uint_4 > chanpairnum_;    // Liste des paires de canaux calcules par ce BRVisibilityCalculator
     95  TMatrix< uint_4 > chanpairs_ ;  // Liste des paires de canaux (forme (C1,C2) ) pour ce BRVisibilityCalculator
     96
    8897  //  FitsInOutFile dtfos_;
    8998  DataTable visdt_;
  • trunk/AddOn/TAcq/mfacq.cc

    r3899 r3909  
    162162  BRParList& acpar=bpar.GetParams();
    163163 
    164   cout << " mfacq[1]/Info: Creating RAcqMemZoneMgr for" << acpar.NbFibers << " fibers , nZones="
     164  cout << " mfacq[1]/Info: Creating RAcqMemZoneMgr for" << acpar.NbFibers() << " fibers , nZones="
    165165       << acpar.nZones << " NbPaquet/Zone=" << acpar.nPaqZone
    166166       << " MmgrPaqSize=" << acpar.MMgrPaquetSize() << endl;
     
    177177 
    178178#ifndef NOPCIECARD 
    179   for (int i=0 ;i <acpar.NFibers() ;i++) {
     179  for (size_t i=0 ;i <acpar.NFibers() ;i++) {
    180180    UINT32 card=(acpar.FiberNum[i]-1)/2+1;
    181181    UINT32 cardfiber=(acpar.FiberNum[i]-1)%2;
     
    209209  cout << "mfacq[3] Creating   PCIEMultiReader thread object     " << endl;
    210210  vector<PCIEWrapperInterface*> vec_pciw;
    211   for  (int i=0 ;i<bpar.NFibers();i++)  {
     211  for  (size_t i=0 ;i<bpar.NFibers();i++)  {
     212    pciwp[i]->SetFiberNumId(acpar.FiberNum[i], acpar.FiberIds[i]);
    212213    vec_pciw.push_back( pciwp[i]);
    213214    //    cout << " mfacq[3.b]/Debug - pciwp[" << i << "] " << hex << pciwp[i] << dec << endl;
     
    244245  mmgr.Print(cout);
    245246#ifndef NOPCIECARD
    246   for (int i=0 ;i <acpar.NbFibers ;i++) {
     247  for (size_t i=0; i<acpar.NbFibers(); i++) {
    247248    UINT32 card=(acpar.FiberNum[i]-1)/2+1;
    248249    UINT32 cardfiber=(acpar.FiberNum[i]-1)%2;
     
    266267  BRParList& acpar=bpar.GetParams();
    267268 
    268   cout << " mfacq[1]/Info: PCIEToEthernet for" << acpar.NbFibers << " fibers , nZones="
     269  cout << " mfacq[1]/Info: PCIEToEthernet for" << acpar.NbFibers() << " fibers , nZones="
    269270       << acpar.nZones << " NbPaquet/Zone=" << acpar.nPaqZone
    270271       << " MmgrPaqSize=" << acpar.MMgrPaquetSize() << endl;
    271272#ifndef NOPCIECARD 
    272   for (int i=0 ;i <acpar.NFibers() ;i++) {
     273  for (size_t i=0 ;i <acpar.NFibers() ;i++) {
    273274    UINT32 card=(acpar.FiberNum[i]-1)/2+1;
    274275    UINT32 cardfiber=(acpar.FiberNum[i]-1)%2;
     
    297298
    298299  vector<PCIEWrapperInterface*> vec_pciw;
    299   for  (int i=0 ;i<bpar.NFibers();i++)  vec_pciw.push_back( pciwp[i]);
     300  for  (size_t i=0 ;i<bpar.NFibers();i++)  {
     301    pciwp[i]->SetFiberNumId(acpar.FiberNum[i], acpar.FiberIds[i]);
     302    vec_pciw.push_back( pciwp[i]);
     303  }
    300304  cout <<"mfacq[2] Creating PCIEToEthernet  thread object " << endl;
    301305  PCIEToEthernet pci2eth(vec_pciw, bpar.GetParams().GetEthTargets(), bpar.GetParams(), bpar.GetParams().tcpportid);
     
    316320 
    317321#ifndef NOPCIECARD
    318   for (int i=0 ;i <acpar.NbFibers ;i++) {
     322  for (size_t i=0; i<acpar.NbFibers(); i++) {
    319323    UINT32 card=(acpar.FiberNum[i]-1)/2+1;
    320324    UINT32 cardfiber=(acpar.FiberNum[i]-1)%2;
  • trunk/AddOn/TAcq/pciewrap.cc

    r3683 r3909  
    1212using namespace SOPHYA;
    1313
     14//-----------------------------------------------------------------------
     15//  Classe PCIEWrapperInterface  ( virtuelle pure )
     16//-----------------------------------------------------------------------
     17
     18/* --Methode-- */
     19PCIEWrapperInterface::PCIEWrapperInterface()
     20{
     21  SetMaxWaitEndDMA();
     22}
     23
     24/* --Methode-- */
     25PCIEWrapperInterface::~PCIEWrapperInterface()
     26{
     27}
     28
     29/* --Methode-- */
     30unsigned long PCIEWrapperInterface::SetMaxWaitEndDMA(unsigned int maxkwedma, unsigned int nretry)
     31{
     32  if (maxkwedma>1) { maxwaitenddmaloop_=maxkwedma*1000; maxretryenddma_=nretry; }
     33  return maxwaitenddmaloop_;
     34}
     35
     36//------------------------------------------------------------------
     37// Classe TestPCIWrapperNODMA : genere des paquets sans appel au DMA
     38//------------------------------------------------------------------
    1439/* --Methode-- */
    1540TestPCIWrapperNODMA::TestPCIWrapperNODMA(UInt32 sz, double lossrate)
     
    2348  timetag_ = 0;
    2449  tottransfer_ = 0;
    25   lossrate_ = lossrate;
    26   cout << " TestPCIWrapperNODMA(PaqSz=" << sz << ",LossRate=" << lossrate << ")" << endl;
     50  if (lossrate<0.)  lossrate=-lossrate;
     51  max_frcount_=(UInt32)lossrate;
     52  lossrate_ = lossrate-(double)max_frcount_;
     53  if (lossrate_<1.e-9) lossrate_=0.;
     54  cout << " TestPCIWrapperNODMA(PaqSz=" << sz << ",LossRate=" << lossrate
     55       << " MaxFrameCount=" << max_frcount_ << ")" << endl;
    2756}
    2857
     
    4978Byte* TestPCIWrapperNODMA::GetData()
    5079{
    51   if (lossrate_ > 1.e-19) {
     80  if (frame_counter_>max_frcount_)  return NULL;
     81  if (lossrate_ > 1.e-9) {
    5282    UInt32 dfc = 1;
    5383    while (rg_.Flat01()<lossrate_)  dfc++;
  • trunk/AddOn/TAcq/pciewrap.h

    r3683 r3909  
    3232 public:
    3333  // Constructeur - fait l'initialisation
    34   PCIEWrapperInterface() { }
     34  PCIEWrapperInterface();
    3535  // destructeur - libere la memoire allouee
    36   virtual ~PCIEWrapperInterface() { }
     36  virtual ~PCIEWrapperInterface();
    3737
    3838  virtual UInt32 TransferSize() = 0;
     
    4141  virtual UInt64 TotTransferBytes() = 0;   
    4242  virtual void PrintStatus(ostream& os) = 0;
     43  // Identification de fibres / voies
     44  inline void SetFiberNumId(int fibnum=1, int fibid=1)
     45  { fiber_num_=fibnum;  fiber_id_=fibid; }
     46  inline int FiberNum() { return fiber_num_; }
     47  inline int FiberId() { return fiber_id_; }
     48  // Parametre de controle de la boucle d'attente de fin de DMA (en unite de 1000 pour maxkwedma)
     49  virtual unsigned long SetMaxWaitEndDMA(unsigned int maxkwedma=1000, unsigned int nretry=3);
     50protected:
     51  unsigned long maxwaitenddmaloop_;  // Nombre d'iterations de la boucle d'attente de fin de DMA
     52  unsigned int maxretryenddma_;      // nombre maxi de tentatives pour terminer le DMA
     53  int fiber_num_;                    // numero de fibre sur la machine
     54  int fiber_id_;                     // identificateur de fibre - numero absolu sur l'ensemble des machines
    4355};
    4456
     
    4658class TestPCIWrapperNODMA : public PCIEWrapperInterface {
    4759public:
     60  // lossrate_=partie_fractionnaire[lossrate], max_frcount_=partie entiere[lossrate] 
    4861  TestPCIWrapperNODMA(UInt32 sz, double lossrate=0.);
    4962  virtual ~TestPCIWrapperNODMA();
     
    6275  UInt64 tottransfer_;
    6376  double lossrate_;
     77  UInt32 max_frcount_;
    6478  BRPaqChecker pchk_;
    6579//  FMTRandGen rg_;
  • trunk/AddOn/TAcq/racqueth.cc

    r3907 r3909  
    5555      for(int ii=0; ii<BRTCPMSGLEN; ii++) msg[ii]='\0';
    5656      uint_4 dmasz = (fgdirectsend_)  ? vec_pciw_[0]->TransferSize() : 0;
    57       sprintf(msg,"BAORadio-PCIEToEthernet  %d %d %d %d %d", par_.MMgrNbPaquet(), par_.MMgrPaquetSize(), dmasz, 0,i);
     57      sprintf(msg,"BAORadio-PCIEToEthernet  %d %d %d %d %d", par_.MMgrNbPaquet(), par_.MMgrPaquetSize(),
     58              vec_pciw_[i]->FiberId(), dmasz, i);
    5859      //           123456789012345678901234567890
    5960      sok.SendAll(msg,BRTCPMSGLEN);
     
    7273    vvec_errorcnt_.push_back(verrcnt);
    7374    vec_cntpaq_.push_back(0);
     75    vfgmsgfin_.push_back(false);
     76
    7477  }
    7578  totrdsnd_ = 0;
     
    119122  uint_4 off_acheval=0;
    120123 
    121   int nerrdma = 0;
    122   int maxerrdma = 10;
    123124  bool fgarret = false;
    124125 
     
    170171  uint_4 npaqfaitg = 0;
    171172
     173  for (int i=0;i< (int)nbDma_ ;i++)
     174    vec_pciw_[i]->SetMaxWaitEndDMA(par_.first_maxkwedma_,par_.first_nretrydma_);
     175
    172176  while (npaqfaitg < nmaxpaq_) {  // Boucle global G
    173177    if (fgarret) break;
    174178    if (stop_) break;
     179
     180    if ((prtlev_>0)&&(npaqfaitg>1)&&((npaqfaitg-1)%prtmodulo_==0))
     181      cout << " PCIEToEthernet::run()/Info NPaqFait= " << npaqfaitg << endl;
    175182   
    176183    // Lancement des DMA
    177184    for (int dma=0; dma < (int)nbDma_ ;dma++) vec_pciw_[dma]->StartTransfers();
     185    if (npaqfaitg==1)  {
     186      for (int i=0;i< (int)nbDma_ ;i++)
     187        vec_pciw_[i]->SetMaxWaitEndDMA(par_.maxkwedma_,par_.nretrydma_);
     188    }
    178189   
    179190    // On pointe vers le debut de la zone a remplir aver le prochain DMA
     
    185196      Datas[dma]=vec_pciw_[dma]->GetData();
    186197      if (Datas[dma] == NULL) { // No data Read in DMA
    187         nerrdma ++;   fgbaddma=true;
    188         cout << "PCIEToEthernetChecker/Erreur Waiting for datas ..." << endl;
     198        fgbaddma=true;
     199        cout << "PCIEToEthernetChecker/Error Waiting for datas ..." << endl;
    189200        vec_pciw_[dma]->PrintStatus(cout);
    190         if (nerrdma>=maxerrdma) { fgarret = true; break; }
     201        fgarret = true;  break;
    191202      }
    192203    }
    193204    if (fgbaddma) continue; 
    194     if ((prtlev_>0)&&(npaqfaitg%prtmodulo_==0))
    195       cout << " PCIEToEthernet::run()/Info NPaqFait= " << npaqfaitg << endl;
     205
    196206    if (fgdirectsend_) {  // Pas de copie / reduction de taille de paquet, on rebalance tel quel ...
    197207      for (int fib=0; fib<(int) nbDma_ ;fib++) {
     
    283293  }  //   FIN  Boucle global G
    284294 
     295  // ----- Nettoyage final et impression de resume -------
     296  CleanUpEndSendAllLinks();
    285297  setRC(0);
    286298  gettimeofday(&tv2, NULL);
     
    326338static long cnt_prt=0;
    327339/* --Methode-- */
    328 size_t PCIEToEthernet::SendToTargets(int fib, Byte* data, size_t len)
     340size_t PCIEToEthernet::SendToTargets(int fib, Byte* data, size_t len, bool fgfin)
    329341{
    330342  //DBG    cout << " SendToTargets/DBG" << cnt_prt << " len=" << len << " data=" << hex << (unsigned long)data << dec << endl; cnt_prt++;
     
    360372  }
    361373#endif
    362   if (vec_cntpaq_[fib]==nmaxpaq_) {  // fin de l'envoi pour cette fibre
     374  if ((vec_cntpaq_[fib]==nmaxpaq_)||(fgfin&&(vec_cntpaq_[fib]%par_.MMgrNbPaquet()==0))) {  // fin de l'envoi pour cette fibre
    363375    sprintf(msg,"PCIEToEthernet-Send-END %d",vec_cntpaq_[fib]);
    364376    for(size_t j=0; j<vskt.size(); j++) {
    365377      vskt[j].SendAll(msg, BRTCPMSGLEN2);
    366378    }
    367    
     379    vfgmsgfin_[fib]=true;
    368380  }
    369381  return rc;
    370382}
     383
     384/* --Methode-- */
     385void PCIEToEthernet::CleanUpEndSendAllLinks()
     386{
     387  cout << " PCIEToEthernet::CleanUpEndSendAllLinks() - Ending transmission on links ..." << endl;
     388  Byte* tampon = new Byte[par_.MMgrPaquetSize()];
     389  memset(tampon,0,(size_t)par_.MMgrPaquetSize());
     390  for(size_t fib=0; fib<vfgmsgfin_.size(); fib++) {
     391    while (!vfgmsgfin_[fib])  SendToTargets(fib,tampon,par_.MMgrPaquetSize(),true);
     392    cout << " ... Ended transmission on links for Fiber " << fib << endl;
     393  }
     394  delete[] tampon;
     395}
     396
    371397//------------------------------------------------------------------
    372398// Classe thread de lecture sur interface reseau (Ethernet)
     
    429455    sok.SendAll(msg,BRTCPMSGLEN);
    430456    vsok_.push_back(sok);
    431     cout << " EthernetReader/Info connection/link" << fib << " established." << endl;
     457    vfibid_.push_back(ic);
     458    cout << " EthernetReader/Info connection/link" << fib << " established - FiberId= " << ic << endl;
    432459    vec_cntpaq_.push_back(0);
    433460    vec_fgsokend_.push_back(false);
    434461  }
     462  if (vsok_.size()>1) {
     463    cout << " EthernetReader/Info: sorting socket according to FiberIds ..." << endl;
     464    bool encore=true;
     465    Socket tmpskt;
     466    int tmpid;
     467    while(encore) {
     468      encore=false;
     469      for(size_t ii=0; ii<vsok_.size()-1; ii++) {
     470        if (vfibid_[ii]<vfibid_[ii+1]) {
     471          tmpskt=vsok_[ii];  tmpid=vfibid_[ii];
     472          vsok_[ii]=vsok_[ii+1];  vfibid_[ii]=vfibid_[ii+1];
     473          vsok_[ii+1]=tmpskt;  vfibid_[ii+1]=tmpid;
     474          encore=true;
     475        }
     476      }
     477    }
     478  }
     479  cout << " EthernetReader/Info: Setting FiberIds in RAcqMemZoneMgr \n ... FiberIds= " ;
     480  for(size_t ii=0; ii<vsok_.size(); ii++)  {
     481    memgr_.FiberId(ii)=vfibid_[ii];
     482    cout << vfibid_[ii] << " ; ";
     483  }
     484  cout << endl;
     485
    435486  gl_fgsokend = true;
    436487  stopreason_="??Unknown??";
  • trunk/AddOn/TAcq/racqueth.h

    r3901 r3909  
    6161
    6262protected:
    63   virtual size_t SendToTargets(int fib, Byte* data, size_t len);
     63  virtual size_t SendToTargets(int fib, Byte* data, size_t len, bool fgfin=false);
     64  virtual void CleanUpEndSendAllLinks();
    6465
    6566  BRParList par_;   // Parametres divers d'acquisition
     
    7576  vector< vector<uint_8> > vvec_errorcnt_;
    7677  vector< uint_8 > vec_cntpaq_;
     78  vector< bool > vfgmsgfin_;   // true -> message fin envoye pour la fibre correspondante 
    7779  uint_4 packSize_;
    7880  uint_4 packSizeInMgr_;
     
    9698  // Si force_samefc=true, on essaye de lire des paquets avec meme FrameCounter, sans depasser une
    9799  // difference maximum de maxdiff_paqnum entre nombre de paquets lus sur chaque fibre
     100  //  - force_samefc=false : lecture des paquet sans alignement des FrameCounter
     101  //  - force_samefc=true : lecture paquets avec alignement des FrameCounter
     102  //     + mode par defaut : maxdiff_paqnum=0, maxresync=0 -> on cherche a aligner FrameCounter sur les
     103  //     differents liens ethernet
     104  //     + maxdiff_paqnum>0 : difference maximum de nombre de paquets entre les differents liens
     105  //     + maxresync>0 : Mode de lecture avec resynchronisation du nombre de paquets , nombre
     106  //       maxi de resynchronisation -
     107  //  Modes conseilles : false   -  true,0,0  - true,10,0       
    98108  inline void SetReadMode(bool force_samefc=false, uint_4 maxdiff_paqnum=0, uint_4 maxresync=0)
    99109  { rdsamefc_=force_samefc; sfc_maxdpc_=maxdiff_paqnum; sfc_maxresync_=maxresync; }
     
    138148  ServerSocket* srv_sokp_;  // Le socket serveur 
    139149  vector< Socket > vsok_;  //  Les sockets de lecture pour chaque lien ethernet (1 lien= 1 fibre a l'envoi)
     150  vector< int > vfibid_;   //  Identificateur des fibres transmis par l'emetteur
    140151  vector< uint_8 > vec_cntpaq_;   // vecteur de compteurs de paquet ( 1 compteur / lien )
    141152  vector< uint_4 > vec_fgsokend_;    // vecteur de flag, >0 : fin de reception (ou ereur) sur le lien
  • trunk/AddOn/TAcq/racqumem.cc

    r3779 r3909  
    3838     memzones.push_back(new Byte[mzsz] );
    3939     states.push_back(st);
     40     auxdatap.push_back(new RAcqMZAuxData );
     41     fiber_id.push_back(0);
    4042     if (procmzsz > 0)  procmemzones.push_back(new Byte[procmzsz] );
    4143   }
     44  dummy_=0;
    4245  serial_ = 0;
    4346  SetFinalizedMask();
     
    5053  for(uint_4 k=0; k<NbZones(); k++) {
    5154    delete[] memzones[k];
     55    delete auxdatap[k];
    5256    if (procpaqsz > 0) delete[] procmemzones[k];
    5357  }
  • trunk/AddOn/TAcq/racqumem.h

    r3683 r3909  
    1616#include <iostream>
    1717#include "brtypes.h"
     18#include "timestamp.h"
    1819
    1920using namespace std;
     
    6364
    6465
     66// ---------------------------------------------------------
     67//  Classe pour donnees auxiliaires associees a chaque zone
     68// ---------------------------------------------------------
     69class RAcqMZAuxData {
     70public:
     71  RAcqMZAuxData() { }
     72  inline SOPHYA::TimeStamp& FillTime() { return filltime_; }
     73
     74  SOPHYA::TimeStamp filltime_;
     75};
     76
    6577// -------------------------------------------------------------------
    6678// Classe de gestion de zones memoire partagee (des buffers) entre
     
    8092  ~RAcqMemZoneMgr();
    8193 
     94  // Retourne le nombre de zones memoire
     95  inline uint_4 NbZones() { return nzones; }
    8296  // Retourne le nombre de fibres dans chaque zone
    83   inline uint_4 NbZones() { return nzones; }
    84   // Retourne le nombre de zones memoire
    8597  inline uint_4 NbFibres() { return nfibres; }
    8698  // Retourne la taille de paquet
     
    136148    return procmemzones[id]; 
    137149    }
    138  
     150  // Retourne le pointeur sur les donnees auxiliaire associee a une zone
     151  inline RAcqMZAuxData* GetAuxData(int id)   {
     152    if ((id < 0) || (id >=(int) auxdatap.size()))  return NULL;
     153    return auxdatap[id]; 
     154    } 
     155  // Retourne l'identificateur (numero absolu) de la fibre
     156  inline int& FiberId(int fib) {
     157    if ((fib < 0) || (fib >=(int) nfibres))  return dummy_;
     158    return fiber_id[fib];
     159  }
     160
    139161  ostream& Print(ostream& os);
    140162  inline ostream& Print() { return Print(cout); }
     
    153175  SOPHYA::ZMutex mex;   
    154176  uint_4  nzones, nfibres, npaq, paqsz, procpaqsz;
    155 //  DMAMgrInterface &dma_;
    156   vector< Byte* > memzones;
    157   vector< St_MemZ > states;
    158   vector< Byte* > procmemzones;
     177  vector< Byte* > memzones;            // pointeur de donnees de chaque zone
     178  vector< St_MemZ > states;            // etat de chaque zone
     179  vector< RAcqMZAuxData* > auxdatap;   // pointeur de donnees auxiliaires associees a chaque zone
     180  vector< Byte* > procmemzones;        // pointeur de donnees traitees de chaque zone 
     181// Identificateur (numero absolu) des fibres
     182  vector< int > fiber_id;
     183  int dummy_;
    159184  bool stop_;
    160185  MemZRunState runstate_;
  • trunk/AddOn/TAcq/racqurw.cc

    r3683 r3909  
    487487  mmbuf_=NULL;
    488488  max_targ_npaq = memgr.NbPaquets();
    489   for (int fid=0 ; fid<(int)nbDma_ ;fid++) mmbufib_[fid]=NULL;
     489  for (int fid=0 ; fid<(int)nbDma_ ;fid++) {
     490    memgr.FiberId(fid)=vec_pciw[fid]->FiberId();
     491    mmbufib_[fid]=NULL;
     492  }
    490493}
    491494
     
    507510  uint_4 paqsz =  packSize_;
    508511  uint_4 dmasz = vec_pciw_[0]->TransferSize();
    509   vec_pciw_[0]->StartTransfers();
     512  //DEL   vec_pciw_[0]->StartTransfers();
    510513
    511514  BRPaqChecker pcheck[MAXNBFIB];  // Verification/comptage des paquets 
     
    516519  uint_4 off_acheval=0;
    517520 
    518   int nerrdma = 0;
    519   int maxerrdma = 10;
    520521  bool fgarret = false;
    521522 
     
    523524  for (int i=0;i< (int)nbDma_ ;i++) { 
    524525    tampon[i]=   new Byte[paqsz];
     526    vec_pciw_[i]->SetMaxWaitEndDMA(par_.first_maxkwedma_,par_.first_nretrydma_);
    525527  }
    526528  bool fgredpaq=par_.fgreducpsize;
     
    551553    // Lancement des DMA
    552554    for (int dma=0; dma < (int)nbDma_ ;dma++) vec_pciw_[dma]->StartTransfers();
    553    
     555    if (npaqfaitg==1)  {
     556      for (int i=0;i< (int)nbDma_ ;i++)
     557        vec_pciw_[i]->SetMaxWaitEndDMA(par_.maxkwedma_,par_.nretrydma_);
     558    }
    554559    // On pointe vers le debut de la zone a remplir aver le prochain DMA
    555560    //-- Zone memoire locale Byte* nextdma = buff+i*paqsz;
     
    560565      Datas[dma]=vec_pciw_[dma]->GetData();
    561566      if (Datas[dma] == NULL) { // No data Read in DMA
    562         nerrdma ++;   fgbaddma=true;
    563         cout << "PCIEMultiReaderChecker/Erreur Waiting for datas ..." << endl;
     567        fgbaddma=true;
     568        cout << "PCIEMultiReaderChecker/Error Waiting for datas ..." << endl;
    564569        vec_pciw_[dma]->PrintStatus(cout);
    565         if (nerrdma>=maxerrdma) { fgarret = true; break; }
     570        fgarret = true;  break;
    566571      }
    567572    }
     
    681686  cout << " --------------------------------------------------------------------" << endl;
    682687
    683   // //// Nettoyage final
     688  //---- Nettoyage final et arret
    684689  MZoneManage(true);
     690  memgr.Stop();   // Pour arreter les autres threads
     691
    685692  for (int i=0;i< (int)nbDma_ ;i++) delete[] tampon[i];
    686693  if ((fgredpaq)&&predtampon) delete[] predtampon;
     
    700707       << " max_targ_npaq=" << max_targ_npaq << endl;
    701708  */
    702   if (mid_ >= 0)  memgr.FreeMemZone(mid_, MemZS_Filled);
     709  if (mid_ >= 0)  {
     710    memgr.GetAuxData(mid_)->filltime_.SetNow();
     711    memgr.FreeMemZone(mid_, MemZS_Filled);
     712  }
    703713  mmbuf_ = NULL;  targ_npaq_ = 0;  mid_ = -2;
    704714  for (int fid=0;fid<(int)nbDma_ ;fid++) mmbufib_[fid]=NULL;
     
    790800    }
    791801    BRPaquet paq0(NULL, NULL, paqsz);
     802    TimeStamp tsmz;
    792803    for (uint_4 nbFile=0;nbFile<nfiles_ ;nbFile++) {
    793804      if (stop_ )   break;
     
    813824        // Sans TRAILER de paquet mff.setDTypeNaxis(MF_Byte, paq0.DataSize()+paq0.HeaderSize(), npaqperfile);
    814825        }
    815         AddFitsKWStart(mff,bpar);
    816826        fnum++;   fgfirstfctt=true;
    817827      }
     
    828838          return;       
    829839        }
     840        tsmz = memgr.GetAuxData(mid)->filltime_;
    830841        for(uint_4 fib=0; fib<memgr.NbFibres(); fib++)  {  // Boucle sur les fibres
    831842          Byte* buff = memgr.GetMemZone(mid,fib);
     
    841852              framecnt_first_[fib] = pcheck[fib].LastFrameNum();
    842853              timetag_first_[fib] = paq.TimeTag();
     854              AddFitsKWStart(mff,bpar,tsmz);
    843855              fgfirstfctt=false;
    844856            }
     
    871883          framecnt_last_[fib] = pcheck[fib].LastFrameNum();
    872884
    873         AddFitsKWEnd(mff,bpar);
     885        AddFitsKWEnd(mff,bpar,tsmz);
    874886        for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) {
    875887          header[fib].close();
     
    907919
    908920/* --Methode-- */
    909 int MultiDataSaver::AddFitsKWStart(MiniFITSFile* mff, BRAcqConfig& acpar)
     921int MultiDataSaver::AddFitsKWStart(MiniFITSFile* mff, BRAcqConfig& acpar, TimeStamp& ts)
    910922{
    911   TimeStamp ts;
    912923  string cdtu=ts.ToString();
    913924  string& skysrc=acpar.SkySource();
     
    922933    mff[fib].AddKeyS("BRPAQCFMT", BRPaquet::FmtConvToString(acpar.GetParams().GetDataConvFg()),
    923934                         " BAORadio BRPaquet DataFormatConversion" );
    924     mff[fib].AddKeyI("FIBERNUM", acpar.GetParams().FiberNum[fib], " Fiber number/id") ;
     935    mff[fib].AddKeyI("FIBERNUM", acpar.GetParams().FiberNum[fib], " Fiber number") ;
     936    mff[fib].AddKeyI("FIBERID",memgr.FiberId(fib), " Fiber identifier (absolute id)");
    925937    if (hassrc)
    926938      mff[fib].AddKeyS("SKYSOURC", skysrc, " Source identification" );
     
    935947
    936948/* --Methode-- */
    937 int MultiDataSaver::AddFitsKWEnd(MiniFITSFile* mff, BRAcqConfig& acpar)
     949int MultiDataSaver::AddFitsKWEnd(MiniFITSFile* mff, BRAcqConfig& acpar, TimeStamp& ts)
    938950{
    939   TimeStamp ts;
    940951  string cdtu=ts.ToString();
    941952  for(uint_4 fib=0; fib<memgr.NbFibres(); fib++) {
  • trunk/AddOn/TAcq/racqurw.h

    r3775 r3909  
    170170  inline void STOP() { stop_ = true; } 
    171171protected:
    172   int  AddFitsKWStart(MiniFITSFile* mff, BRAcqConfig& acpar);
    173   int  AddFitsKWEnd(MiniFITSFile* mff, BRAcqConfig& acpar);
     172  int  AddFitsKWStart(MiniFITSFile* mff, BRAcqConfig& acpar, TimeStamp& ts);
     173  int  AddFitsKWEnd(MiniFITSFile* mff, BRAcqConfig& acpar, TimeStamp& ts);
    174174
    175175  RAcqMemZoneMgr& memgr;
Note: See TracChangeset for help on using the changeset viewer.