| 1 | //----------------------------------------------------------------
 | 
|---|
| 2 | // ---- classes de threads pour lecture (transfert DMA) 
 | 
|---|
| 3 | //      et ecriture disque pour acquisition   BAORadio       -----
 | 
|---|
| 4 | // LAL -      R. Ansari - Juin/Juillet 2008 
 | 
|---|
| 5 | //----------------------------------------------------------------
 | 
|---|
| 6 | 
 | 
|---|
| 7 | #include "racqurw.h"
 | 
|---|
| 8 | 
 | 
|---|
| 9 | #include <stdlib.h>
 | 
|---|
| 10 | #include <unistd.h>
 | 
|---|
| 11 | #include <fstream>
 | 
|---|
| 12 | 
 | 
|---|
| 13 | #include "pexceptions.h"
 | 
|---|
| 14 | #include "timestamp.h"
 | 
|---|
| 15 | 
 | 
|---|
| 16 | 
 | 
|---|
| 17 | #include "pciewrap.h"
 | 
|---|
| 18 | #include "brpaqu.h"
 | 
|---|
| 19 | #include "minifits.h"
 | 
|---|
| 20 | 
 | 
|---|
| 21 | 
 | 
|---|
| 22 | //-------------------------------------------------------
 | 
|---|
| 23 | // Classe thread de lecture PCI-Express
 | 
|---|
| 24 | //-------------------------------------------------------
 | 
|---|
| 25 | 
 | 
|---|
| 26 | PCIEReader::PCIEReader(RAcqMemZoneMgr& mem, uint_4 nmax)
 | 
|---|
| 27 |   :  memgr(mem)
 | 
|---|
| 28 | {
 | 
|---|
| 29 |   nmax_ = nmax;         
 | 
|---|
| 30 |   stop_ = false;        
 | 
|---|
| 31 | }
 | 
|---|
| 32 | 
 | 
|---|
| 33 | void PCIEReader::run()
 | 
|---|
| 34 | {
 | 
|---|
| 35 |   cout << " PCIEReader::run() - Starting , NMaxMemZones=" << nmax_ << endl;     
 | 
|---|
| 36 |   setRC(1);     
 | 
|---|
| 37 |   PCIEWrapper pciw;     
 | 
|---|
| 38 |   uint_4 paqsz = memgr.PaqSize();
 | 
|---|
| 39 |   for (uint_4 kmz=0; kmz<nmax_; kmz++) {
 | 
|---|
| 40 |     int mid = memgr.FindMemZoneId(MemZA_Fill);
 | 
|---|
| 41 |     Byte* buff = memgr.GetMemZone(mid);
 | 
|---|
| 42 |     if (buff == NULL) {
 | 
|---|
| 43 |       cout << " PCIEReader::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl;
 | 
|---|
| 44 |       setRC(2);           
 | 
|---|
| 45 |       return;   
 | 
|---|
| 46 |     }
 | 
|---|
| 47 |     for(uint_4 i=0; i<memgr.NbPaquets(); i++) {
 | 
|---|
| 48 |       while(pciw.NBytesToRead() < 1)  usleep(5);
 | 
|---|
| 49 |       pciw.Read(buff+i*paqsz,paqsz);    
 | 
|---|
| 50 |     }
 | 
|---|
| 51 |     memgr.FreeMemZone(mid, MemZS_Filled);
 | 
|---|
| 52 |   }     
 | 
|---|
| 53 |   setRC(0);
 | 
|---|
| 54 |   return;
 | 
|---|
| 55 | }
 | 
|---|
| 56 | 
 | 
|---|
| 57 | 
 | 
|---|
| 58 | 
 | 
|---|
| 59 | //-------------------------------------------------------
 | 
|---|
| 60 | // Classe thread de sauvegarde sur fichiers
 | 
|---|
| 61 | //-------------------------------------------------------
 | 
|---|
| 62 | 
 | 
|---|
| 63 | DataSaver::DataSaver(RAcqMemZoneMgr& mem, string& path, uint_4 nmax)
 | 
|---|
| 64 |   :  memgr(mem) 
 | 
|---|
| 65 | {
 | 
|---|
| 66 |   nmax_ = nmax; 
 | 
|---|
| 67 |   stop_ = false;        
 | 
|---|
| 68 |   path_ = path; 
 | 
|---|
| 69 | }
 | 
|---|
| 70 | 
 | 
|---|
| 71 | void DataSaver::run()
 | 
|---|
| 72 | {
 | 
|---|
| 73 |   setRC(1);     
 | 
|---|
| 74 |   try {
 | 
|---|
| 75 |     TimeStamp ts; 
 | 
|---|
| 76 |     cout << " DataSaver::run() - Starting " << ts << " NMaxMemZones=" << nmax_ << endl; 
 | 
|---|
| 77 |     char fname[512];
 | 
|---|
| 78 |     sprintf(fname,"%s/saver.log",path_.c_str());
 | 
|---|
| 79 |     ofstream filog(fname);
 | 
|---|
| 80 |     filog << " DataProc::run() - starting log file " << ts << endl;                    
 | 
|---|
| 81 | 
 | 
|---|
| 82 |     uint_4 paqsz = memgr.PaqSize();
 | 
|---|
| 83 |     for (uint_4 kmz=0; kmz<nmax_; kmz++) {
 | 
|---|
| 84 |       int mid = memgr.FindMemZoneId(MemZA_Save);
 | 
|---|
| 85 |       Byte* buff = memgr.GetMemZone(mid);
 | 
|---|
| 86 |       if (buff == NULL) {
 | 
|---|
| 87 |         cout << " DataSaver::run()/ERROR memgr.GetMemZone(" << mid << ") -> NULL" << endl;
 | 
|---|
| 88 |         setRC(2);       
 | 
|---|
| 89 |         return; 
 | 
|---|
| 90 |       }
 | 
|---|
| 91 |       sprintf(fname,"%s/signal%d.fits",path_.c_str(),(int)kmz);
 | 
|---|
| 92 |       MiniFITSFile mff(fname,MF_Write);
 | 
|---|
| 93 |       BRPaquet paq0(NULL, buff, paqsz); 
 | 
|---|
| 94 |       mff.setDTypeNaxis(MF_Byte, paq0.DataSize(), memgr.NbPaquets());
 | 
|---|
| 95 |       for(uint_4 i=0; i<memgr.NbPaquets(); i++) {
 | 
|---|
| 96 |         BRPaquet paq(NULL, buff+i*paqsz, paqsz); 
 | 
|---|
| 97 |         mff.WriteB(paq.Data(), paq.DataSize());
 | 
|---|
| 98 |       }
 | 
|---|
| 99 |       filog << ts << " : created data file  " << fname << endl;                
 | 
|---|
| 100 |       cout << " DataSaver::run() " << ts << " : created data file  " << fname << endl;
 | 
|---|
| 101 |       memgr.FreeMemZone(mid, MemZS_Saved);
 | 
|---|
| 102 |     }
 | 
|---|
| 103 |   }
 | 
|---|
| 104 |   catch (MiniFITSException& exc) {
 | 
|---|
| 105 |     cout << " DataSaver::run()/catched MiniFITSException " << exc.Msg() << endl;
 | 
|---|
| 106 |     setRC(3);   
 | 
|---|
| 107 |     return; 
 | 
|---|
| 108 |   }
 | 
|---|
| 109 |   catch(...) {
 | 
|---|
| 110 |     cout << " DataSaver::run()/catched unknown ... exception " << endl;
 | 
|---|
| 111 |     setRC(4);   
 | 
|---|
| 112 |     return; 
 | 
|---|
| 113 |   }
 | 
|---|
| 114 |   setRC(0);
 | 
|---|
| 115 |   return;
 | 
|---|
| 116 | }   
 | 
|---|
| 117 | 
 | 
|---|
| 118 | 
 | 
|---|