source: Sophya/trunk/AddOn/TAcq/racqueth.h@ 3909

Last change on this file since 3909 was 3909, checked in by ansari, 15 years ago

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

File size: 7.5 KB
Line 
1#ifndef RACQUETH_H_SEEN
2#define RACQUETH_H_SEEN
3
4//----------------------------------------------------------------
5// ---- classes de threads pour lecture/ecriture des paquets (transfert DMA)
6// et ecriture disque pour acquisition BAORadio -----
7// LAL - R. Ansari - Juin/Juillet 2008
8//----------------------------------------------------------------
9
10#include "racqumem.h"
11#include <string>
12#include <vector>
13#include <iostream>
14#include "sopnamsp.h"
15#include "zthread.h"
16#include "pciewrap.h"
17#include "swrapsock.h"
18#include "brtypes.h"
19#include "brpaqu.h"
20#include "brparam.h"
21#include "minifits.h"
22
23using namespace std;
24
25// Quelques definitions globales
26// Nombre maximum de fibres geres par les classes PCIEToEthernet ...
27// ATTENTION cette definition (MAXANAFIB) se trouve dans plusieurs fichiers
28#ifndef MAXNBFIB
29#define MAXNBFIB 32
30#endif
31// ATTENTION cette definition (MAXANAFIB) se trouve dans plusieurs fichiers
32#ifndef MAXANAFIB
33#define MAXANAFIB 32
34#endif
35
36#ifndef BRSPORTID
37#define BRSPORTID 6912
38#endif
39#ifndef BRTCPMSGLEN
40#define BRTCPMSGLEN 128
41#endif
42#ifndef BRTCPMSGLEN2
43#define BRTCPMSGLEN2 64
44#endif
45
46
47//----------------------------------------------------------------------------------
48// Classe thread de lecture PCI-Express et recopie sur interface reseau (Ethernet)
49//----------------------------------------------------------------------------------
50
51class PCIEToEthernet : public ZThread {
52public:
53 PCIEToEthernet(vector<PCIEWrapperInterface*> vec_pciw , vector<string>& destname, BRParList const& par, int portid=BRSPORTID);
54 virtual ~PCIEToEthernet();
55 virtual void run();
56 void Stop();
57 inline void STOP() { stop_ = true; }
58
59 inline int SetPrintLevel(int lev=0, uint_8 prtmodulo=50000)
60 { prtlev_=lev; prtmodulo_=prtmodulo; return 0; }
61
62protected:
63 virtual size_t SendToTargets(int fib, Byte* data, size_t len, bool fgfin=false);
64 virtual void CleanUpEndSendAllLinks();
65
66 BRParList par_; // Parametres divers d'acquisition
67
68 uint_8 nmaxpaq_; // Nombre maxi de paquets traites - DOIT etre mutiple de mmgr.NbPaquets()
69 BRDataFmtConv swapall_; // select data swap/format conversion for BRPaquet
70 bool stop_;
71 unsigned int sizeFr_ ;
72 vector<PCIEWrapperInterface *> vec_pciw_;
73 vector<string> destname_;
74 int tcpportid_;
75 vector< vector<ClientSocket> > vvec_skt_;
76 vector< vector<uint_8> > vvec_errorcnt_;
77 vector< uint_8 > vec_cntpaq_;
78 vector< bool > vfgmsgfin_; // true -> message fin envoye pour la fibre correspondante
79 uint_4 packSize_;
80 uint_4 packSizeInMgr_;
81 uint_4 nbDma_;
82 uint_8 totrdsnd_;
83 bool fgdirectsend_; // true -> direct transfer of DMA data to ethernet
84
85 int prtlev_; // print level
86 uint_8 prtmodulo_; // print periodicity (modulo)
87};
88
89//------------------------------------------------------------------
90// Classe thread de lecture sur interface reseau (Ethernet)
91//------------------------------------------------------------------
92class EthernetReader : public ZThread {
93public:
94 EthernetReader(RAcqMemZoneMgr& mem, BRParList const& par, int portid=BRSPORTID);
95 virtual ~EthernetReader();
96
97 // Configuration du mode de lecture des paquets
98 // Si force_samefc=true, on essaye de lire des paquets avec meme FrameCounter, sans depasser une
99 // 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
108 inline void SetReadMode(bool force_samefc=false, uint_4 maxdiff_paqnum=0, uint_4 maxresync=0)
109 { rdsamefc_=force_samefc; sfc_maxdpc_=maxdiff_paqnum; sfc_maxresync_=maxresync; }
110 // En activant le flag, le reader ne se termine qu'avec la reception des message END sur chaque lien
111 inline void WaitENDMsg4Terminate(bool waitendmsg=false)
112 { waitendmsg_=waitendmsg; }
113
114 virtual void run();
115 inline void Stop() { stop_ = true; }
116 inline void STOP() { stop_ = true; }
117
118 inline int SetPrintLevel(int lev=0, uint_8 prtmodulo=50000)
119 { prtlev_=lev; prtmodulo_=prtmodulo; return 0; }
120
121protected:
122 bool ReadNextAllFibers(); // Renvoie true si probleme
123 bool ReadNext(int fib); // Renvoie true si probleme
124 void CleanUpAllSockets(); // pour finir la lecture de toutes les fibres
125 size_t ReceiveFromSocket(int fib, char* data, size_t len);
126
127 bool ReadNextAllFibersWithSync(); // Renvoie true si probleme
128// recale les links en cas d'ecart important entre nb de paquets lu sur chaque lien
129 int SkipAndSyncLinks(); // Renvoie 0 si rien fait, 1 si skip fait, 9 si probleme
130
131 // Permet d'avancer d'un paquet dans la zone - renvoie true si probleme
132 inline bool MoveToNextTarget() {
133 if ((mmbuf_ == NULL )||(targ_npaq_ >= max_targ_npaq))
134 if (MZoneManage()) return true;
135 targ_npaq_++;
136 return false;
137 }
138 inline Byte* GetPaquetTarget(int numfib) {
139 if ((mmbufib_[numfib] == NULL )||(targ_npaq_ > max_targ_npaq)||(targ_npaq_ == 0)) return NULL;
140 Byte* rb=mmbufib_[numfib]+(targ_npaq_-1)*packsize_;
141 return rb;
142 }
143 bool MZoneManage(bool clean=false); // Renvoie true si probleme
144
145 RAcqMemZoneMgr& memgr_;
146 BRParList par_; // Parametres divers d'acquisition
147 int tcpportid_;
148 ServerSocket* srv_sokp_; // Le socket serveur
149 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
151 vector< uint_8 > vec_cntpaq_; // vecteur de compteurs de paquet ( 1 compteur / lien )
152 vector< uint_4 > vec_fgsokend_; // vecteur de flag, >0 : fin de reception (ou ereur) sur le lien
153 bool gl_fgsokend; // true -> au moins l'un de liens a termine
154 bool stop_;
155 bool rdsamefc_; // if true, read paquets with same value of FrameCounter on different fibers/link
156 uint_4 sfc_maxdpc_; // difference maxi entre nombre de paquets lu sur les liens
157 uint_4 sfc_maxresync_; // nb maximum de tentatives de resynchronisation
158
159 uint_8 totnbytesrd_;
160 uint_8 totnpaqrd_;
161 uint_8 totsamefc_; // nombre total de paquets avec meme framecounter
162
163 uint_8 totnbresync_; // nombre total de saut+resynchronisation
164
165 vector<BRPaquet> vpaq_;
166 vector<BRPaqChecker> vpchk_;
167 vector<uint_8> curfc_; // Numeros des FrameCounter des paquets courants
168 vector<uint_8> totnpqrd_; // nombre total de paquets lus / lien
169 vector<uint_8> totnpqok_; // nombre total de paquets OK / lien
170
171 uint_4 packsize_;
172 int mid_; // Identificateur zone memoire
173 uint_4 targ_npaq_; // Numero de paquet dans une seule zone memoire
174 uint_4 max_targ_npaq; // = mmgr.NbPaquets() = Max de targ_npaq_
175 Byte* mmbuf_; // Pointeur zone memoire rendu par RAcqMemZoneMgr
176 Byte* mmbufib_[MAXANAFIB]; // Pointeurs zone memoire de chaque fibre rendu par RAcqMemZoneMgr
177
178 // zone tampon contenant zero si lecture sur fibre est fini
179 char* dummybuff_;
180 string stopreason_; // message descriptif de la raison d'arret
181
182 bool waitendmsg_; // si true, attendre le message END message sur chaque lien avant de s'arreter
183
184 int prtlev_; // print level
185 uint_8 prtmodulo_; // print periodicity (modulo)
186};
187
188
189
190#endif
Note: See TracBrowser for help on using the repository browser.