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

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

Amelioration des classes PCIEToEthernet et EthernetReader pour eviter des situations de blocage lorsque lecture avec ForceSameFrameCounter, Reza 04/10/2010

File size: 6.3 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);
64
65 BRParList par_; // Parametres divers d'acquisition
66
67 uint_8 nmaxpaq_; // Nombre maxi de paquets traites - DOIT etre mutiple de mmgr.NbPaquets()
68 BRDataFmtConv swapall_; // select data swap/format conversion for BRPaquet
69 bool stop_;
70 unsigned int sizeFr_ ;
71 vector<PCIEWrapperInterface *> vec_pciw_;
72 vector<string> destname_;
73 int tcpportid_;
74 vector< vector<ClientSocket> > vvec_skt_;
75 vector< vector<uint_8> > vvec_errorcnt_;
76 vector< uint_8 > vec_cntpaq_;
77 uint_4 packSize_;
78 uint_4 packSizeInMgr_;
79 uint_4 nbDma_;
80 uint_8 totrdsnd_;
81 bool fgdirectsend_; // true -> direct transfer of DMA data to ethernet
82
83 int prtlev_; // print level
84 uint_8 prtmodulo_; // print periodicity (modulo)
85};
86
87//------------------------------------------------------------------
88// Classe thread de lecture sur interface reseau (Ethernet)
89//------------------------------------------------------------------
90class EthernetReader : public ZThread {
91public:
92 EthernetReader(RAcqMemZoneMgr& mem, BRParList const& par, int portid=BRSPORTID);
93 virtual ~EthernetReader();
94
95 // Configuration du mode de lecture des paquets
96 // Si force_samefc=true, on essaye de lire des paquets avec meme FrameCounter, sans depasser une
97 // difference maximum de maxdiff_paqnum entre nombre de paquets lus sur chaque fibre
98 inline void SetReadMode(bool force_samefc=false, uint_4 maxdiff_paqnum=50, uint_4 maxresync=50)
99 { rdsamefc_=force_samefc; sfc_maxdpc_=maxdiff_paqnum; sfc_maxresync_=maxresync; }
100
101 virtual void run();
102 inline void Stop() { stop_ = true; }
103 inline void STOP() { stop_ = true; }
104
105 inline int SetPrintLevel(int lev=0, uint_8 prtmodulo=50000)
106 { prtlev_=lev; prtmodulo_=prtmodulo; return 0; }
107
108protected:
109 bool ReadNextAllFibers(); // Renvoie true si probleme
110 bool ReadNext(int fib); // Renvoie true si probleme
111 void CleanUpAllSockets(); // pour finir la lecture de toutes les fibres
112 size_t ReceiveFromSocket(int fib, char* data, size_t len);
113
114// recale les links en cas d'ecart important entre nb de paquets lu sur chaque lien
115 int SkipAndSyncLinks(); // Renvoie 0 si rien fait, 1 si skip fait, 9 si probleme
116
117 // Permet d'avancer d'un paquet dans la zone - renvoie true si probleme
118 inline bool MoveToNextTarget() {
119 if ((mmbuf_ == NULL )||(targ_npaq_ >= max_targ_npaq))
120 if (MZoneManage()) return true;
121 targ_npaq_++;
122 return false;
123 }
124 inline Byte* GetPaquetTarget(int numfib) {
125 if ((mmbufib_[numfib] == NULL )||(targ_npaq_ > max_targ_npaq)||(targ_npaq_ == 0)) return NULL;
126 Byte* rb=mmbufib_[numfib]+(targ_npaq_-1)*packsize_;
127 return rb;
128 }
129 bool MZoneManage(bool clean=false); // Renvoie true si probleme
130
131 RAcqMemZoneMgr& memgr_;
132 BRParList par_; // Parametres divers d'acquisition
133 int tcpportid_;
134 ServerSocket* srv_sokp_; // Le socket serveur
135 vector< Socket > vsok_; // Les sockets de lecture pour chaque lien ethernet (1 lien= 1 fibre a l'envoi)
136 vector< uint_8 > vec_cntpaq_; // vecteur de compteurs de paquet ( 1 compteur / lien )
137 vector< uint_4 > vec_fgsokend_; // vecteur de flag, >0 : fin de reception (ou ereur) sur le lien
138 bool gl_fgsokend; // true -> au moins l'un de liens a termine
139 bool stop_;
140 bool rdsamefc_; // if true, read paquets with same value of FrameCounter on different fibers/link
141 uint_4 sfc_maxdpc_; // difference maxi entre nombre de paquets lu sur les liens
142 uint_4 sfc_maxresync_; // nb maximum de tentatives de resynchronisation
143
144 uint_8 totnbytesrd_;
145 uint_8 totnpaqrd_;
146 uint_8 totsamefc_; // nombre total de paquets avec meme framecounter
147
148 uint_8 totnbresync_; // nombre total de saut+resynchronisation
149
150 vector<BRPaquet> vpaq_;
151 vector<BRPaqChecker> vpchk_;
152 vector<uint_8> curfc_; // Numeros des FrameCounter des paquets courants
153 vector<uint_8> totnpqrd_; // nombre total de paquets lus / lien
154 vector<uint_8> totnpqok_; // nombre total de paquets OK / lien
155
156 uint_4 packsize_;
157 int mid_; // Identificateur zone memoire
158 uint_4 targ_npaq_; // Numero de paquet dans une seule zone memoire
159 uint_4 max_targ_npaq; // = mmgr.NbPaquets() = Max de targ_npaq_
160 Byte* mmbuf_; // Pointeur zone memoire rendu par RAcqMemZoneMgr
161 Byte* mmbufib_[MAXANAFIB]; // Pointeurs zone memoire de chaque fibre rendu par RAcqMemZoneMgr
162
163 // zone tampon contenant zero si lecture sur fibre est fini
164 char* dummybuff_;
165
166 int prtlev_; // print level
167 uint_8 prtmodulo_; // print periodicity (modulo)
168};
169
170
171
172#endif
Note: See TracBrowser for help on using the repository browser.