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 |
|
---|