#include "mfacq.h" //--------------------------------------------------------------- // Programme d'acquisition BAORadio multi-fibres/multi-threads // LAL - 2009 - 2010 // R. Ansari, M.Taurigna //--------------------------------------------------------------- static RAcqMemZoneMgr* pMmgr=NULL; static PCIEMultiReader* pPcierThr=NULL; static PCIEToEthernet* pPcie2Eth=NULL; static EthernetReader* pEthRdr=NULL; void Stop(int s) { if (s == 9765) cout << " Stop after exception ..." << endl; else printf("............. MAIN ... receive signal %d \n",s); if (pMmgr != NULL) pMmgr->Stop(); if (pPcie2Eth !=NULL) pPcie2Eth->Stop(); if (pPcierThr !=NULL) pPcierThr->Stop(); if (pEthRdr !=NULL) pEthRdr->Stop(); } //----------------------------------------------------------------------- //-------------------- le programme principal --------------------------- //----------------------------------------------------------------------- int main(int narg, char* arg[]) { int rc = 0; cout << " ============= BAORadio / Acquisition : mfacq =================" << endl; cout << " ===============================================================" << endl; cout << " ========= " < 1)&&(strcmp(arg[1],"-h"))==0) { Usage(false); return 1; } if (narg < 3) { Usage(true); return 3; } const char* desact[4] = {"PCIE_To_Ethernet", "Ethernet_To_Disk", "Ethernet_To_Visibilities","PCIE_DMA_To_Disk"}; try { // Creation/initialisation parametres Acq int act = DecodeArgs(narg,arg); if ((act < 0)||(act>3)) { cout << "mfacq/ERROR decoding arguments act=" << act << " -> exit -5" << endl; return -5; } cout << " mfacq/INFO action: " << desact[act] << endl; switch (act) { case 0: rc = PCIEToEthernetTransfer(); break; case 1: // ethernet --> disk rc = EthernetToMemoryAcq(false); break; case 2: // ethernet --> visibility calculation rc = EthernetToMemoryAcq(true); break; case 3: rc = MultiFibreAcq(); break; } } catch (MiniFITSException& exc) { cerr << " mfacq.cc catched MiniFITSException " << exc.Msg() << endl; rc = 77; } catch (PCIEWException& exc) { cerr << " mfacq.cc catched PCIEWException " << exc.Msg() << endl; rc = 75; } catch (PThrowable& exc) { cerr << " mfacq.cc catched Exception " << exc.Msg() << endl; rc = 76; } catch (std::exception& sex) { cerr << "\n mfacq.cc std::exception :" << (string)typeid(sex).name() << "\n msg= " << sex.what() << endl; rc = 78; } catch (...) { cerr << " mfacq.cc : Catched ... exception " << endl; rc = 79; } cout << "mfacq[9] ----- END --- stopping acq program " << endl; return rc; } /* --Nouvelle-Fonction-- */ void Usage(bool fgshort) { cout << " Usage: mfacq Action DataCardFileName [-dc DataCard -dc DataCard] [TargetMachines]" << endl; if (fgshort) return; cout << " o Action = -pci2disk , -pci2eth , -eth2disk , -eth2visib \n " << " DataCardFile : File name for parameters list (DataCards) : \n" << " fibres outpathname skysource paqsize dmasizekb nbfiles \n" << " nblocperfile acqmode memmgr monitor reducpaqsz ... "<< endl; cout << " o -dc DataCard : datacard appended for DataCardFileName" << endl; cout << " o TargetMachines : List of target machines for PCIe2Ethernet (-pci2eth) \n " << endl; return; } /* --Nouvelle-Fonction-- */ int DecodeArgs(int narg, char* arg[]) { string action=arg[1]; int act = 0; if ((action != "-pci2eth")&&(action != "-pci2disk")&&(action != "-eth2disk")&&(action != "-eth2visib")) { cout << " mfacq/Error , Bad action argument : " << action << endl; return -2; } if (action == "-pci2eth") act=0; else if (action == "-eth2disk") act=1; else if (action == "-eth2visib") act=2; else if (action == "-pci2disk") act=3; BRAcqConfig acpar; char tmpdcname[128]; sprintf(tmpdcname,"%s/dc_XXXXXX",acpar.TmpDirectory().c_str()); mktemp(tmpdcname); string dcardfile=tmpdcname; dcardfile+=".d"; string pardcfile=arg[2]; char cmd[512]; sprintf(cmd,"cp %s %s",pardcfile.c_str(),dcardfile.c_str()); cout << " mfacq/DecodeArgs() executing command: " << cmd << endl; int rc; rc=system(cmd); if (rc!=0) { cout << " mfacq/ERROR system(cmd) , Rc=" << rc << endl; return -3; } vector oargs; int aoff=3; { ofstream dcf( dcardfile.c_str(), ios_base::out|ios_base::app); dcf << "#### Appended datacards from command line " << endl; while (aoff<(narg-1)) { if (strcmp(arg[aoff],"-dc") != 0) break; dcf << arg[aoff+1] << endl; aoff+=2; } if ((act==0)&&(aoff vec_pciw; for (size_t i=0 ;iSetFiberNumId(bpar.FiberNum(i), bpar.FiberId(i)); vec_pciw.push_back( pciwp[i]); // cout << " mfacq[3.b]/Debug - pciwp[" << i << "] " << hex << pciwp[i] << dec << endl; } PCIEMultiReader PcierThr(vec_pciw, mmgr, bpar.GetParams()); // usleep(200); attente au cas ou ... pPcierThr=&PcierThr; tm.Split("Threads created"); if (acpar.fgdoProc>0) cout << "mfacq[4] - starting three threads: PCIEMultiReader, MultiDataSaver, MonitorProc ... " << endl; else cout << "mfacq[4] - starting two threads: PCIEMultiReader, MultiDataSaver ... " << endl; PcierThr.start(); DsThr.start(); if (acpar.fgdoProc>0) { // On ne demarre que si au moins NMaxProc>0 PrThr.start(); } // On attend avant de declencher la terminaison des threads usleep(200000); cout << "mfacq[5] - Waiting for threads to finish ... " << endl; PcierThr.join(); DsThr.join(); mmgr.Stop(); if (acpar.fgdoProc) { // On n'attend la fin que si le thread a ete demarre (NMaxProc>0) PrThr.join(); } pMmgr=NULL; cout << "mfacq[6] ---------- threads finished ---------------- " << endl; tm.Split("Threads Finished"); mmgr.Print(cout); #ifndef NOPCIECARD for (size_t i=0; i vec_pciw; for (size_t i=0 ;iSetFiberNumId(bpar.FiberNum(i), bpar.FiberId(i)); vec_pciw.push_back( pciwp[i]); } cout <<"mfacq[2] Creating PCIEToEthernet thread object " << endl; PCIEToEthernet pci2eth(vec_pciw, bpar.GetParams().GetEthTargets(), bpar.GetParams(), bpar.GetParams().tcpportid); pci2eth.SetPrintLevel(acpar.prtlevel_, acpar.prtmodulo_); // usleep(200); attente au cas ou ... pPcie2Eth=&pci2eth; tm.Split("Threads created"); cout << "mfacq[3] - starting one threads: PCIEToEthernet... " << endl; pci2eth.start(); // On attend avant de declencher la terminaison des threads usleep(200000); cout << "mfacq[5] - Waiting for threads to finish ... " << endl; pci2eth.join(); cout << "mfacq[6] ---------- threads finished ---------------- " << endl; tm.Split("Threads Finished"); #ifndef NOPCIECARD for (size_t i=0; i1) { fmask |= (uint_4)MemZS_ProcB; strfmask+=" | MemZS_ProcB"; mskmon=MemZS_ProcC; } if (acpar.nbcalgrpVisiC>2) { fmask |= (uint_4)MemZS_ProcC; strfmask+=" | MemZS_ProcC"; mskmon=MemZS_ProcD; } if (acpar.nbcalgrpVisiC>3) { fmask |= (uint_4)MemZS_ProcD; strfmask+=" | MemZS_ProcD"; mskmon=MemZS_ProcE; } } else { fmask=(uint_4)MemZS_Saved; strfmask="MemZS_Saved"; mskmon=MemZS_Proc; } if (acpar.fgdoProc) { fmask |= (uint_4)mskmon; strfmask+=" | MemZS_Proc[Monotoring]"; } // Dans ce cas, toutes les zones doivent passer ds le thread de monitoring // pour etre au moins marque comme traite - seul 1/acpar.stepProc sont effectivement traite mmgr.SetFinalizedMask(fmask); cout << " mfacq[1.b]/Info: Mmgr.SetFinalizedMask( " << strfmask << " )" << endl; if (fgviscal) cout <<"mfacq[2] Creating BRVisCalcGroup, NbVisibCalculator=" << acpar.nbcalgrpVisiC << " and MonitorProc " << endl; else cout <<"mfacq[2] Creating MultiDataSaver and MonitorProc thread objects ... " << endl; MultiDataSaver DsThr(mmgr); // Utilise les parametres globaux BRAcqConfig string ppath=bpar.OutputDirectory(); MonitorProc PrThr(mmgr); PrThr.SetMemZAction( RAcqMemZoneMgr::Convert_Status2Action( mskmon ) ); BRVisCalcGroup VCGThr(acpar.nbcalgrpVisiC, mmgr, bpar.OutputDirectory(), acpar.nmeanVisiC, acpar.firstpairVisiC, acpar.nbpairsVisiC, acpar.fgpimpVisiC, acpar.nthrVisiC); VCGThr.SelectFreqBinning(acpar.freqminVisiC, acpar.freqmaxVisiC, acpar.nbinfreqVisiC); VCGThr.ActivateVisDTable(acpar.fgfdtVisiC); VCGThr.SetPrintLevel(acpar.prtlevel_, acpar.prtmodulo2_); cout << "mfacq[3] Creating EthernetReader thread object " << endl; EthernetReader ethrdr(mmgr, bpar.GetParams(), bpar.GetParams().tcpportid); ethrdr.SetReadMode(acpar.ethr_forcesamefc_, acpar.ethr_sfc_maxdpc_,acpar.ethr_sfc_maxresync_); ethrdr.WaitENDMsg4Terminate(acpar.ethr_waitendmsg_); ethrdr.SetPrintLevel(acpar.prtlevel_, acpar.prtmodulo_); // usleep(200); attente au cas ou ... pEthRdr=ðrdr; tm.Split("Threads created"); cout << "mfacq[4] - starting EthernetReader thread object ..." << endl; ethrdr.start(); if (fgviscal) { cout << "mfacq[4.b] - starting Visibility calculator threads " << endl; VCGThr.start(); } else { cout << "mfacq[4.b] - starting MultiDataSaver " << endl; DsThr.start(); } if (acpar.fgdoProc) { // demarrage (optionnel) du thread de monitoring cout << " mfacq[4.c] - starting MonitorProc thread object " << endl; PrThr.start(); } // On attend avant de declencher la terminaison des threads usleep(200000); cout << "mfacq[5] - Waiting for threads to finish ... " << endl; ethrdr.join(); if (fgviscal) VCGThr.join(); else DsThr.join(); mmgr.Stop(); if (acpar.fgdoProc) { // On n'attend la fin que si le thread a ete demarre (NMaxProc>0) PrThr.join(); } pMmgr=NULL; cout << "mfacq[6] ---------- threads finished ---------------- " << endl; tm.Split("Threads Finished"); mmgr.Print(cout); return 0; }