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

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

Ajout flag waitendmsg (Wait for END message) pour le controle de la fin d'execution de EthernetReader , Reza 04/10/2010

File size: 6.6 KB
RevLine 
[3757]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
[3775]29#define MAXNBFIB 32
[3757]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
[3762]42#ifndef BRTCPMSGLEN2
43#define BRTCPMSGLEN2 64
44#endif
[3757]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
[3883]59 inline int SetPrintLevel(int lev=0, uint_8 prtmodulo=50000)
60 { prtlev_=lev; prtmodulo_=prtmodulo; return 0; }
[3759]61
[3757]62protected:
[3758]63 virtual size_t SendToTargets(int fib, Byte* data, size_t len);
64
[3757]65 BRParList par_; // Parametres divers d'acquisition
66
[3897]67 uint_8 nmaxpaq_; // Nombre maxi de paquets traites - DOIT etre mutiple de mmgr.NbPaquets()
[3757]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_;
[3897]75 vector< vector<uint_8> > vvec_errorcnt_;
76 vector< uint_8 > vec_cntpaq_;
[3757]77 uint_4 packSize_;
78 uint_4 packSizeInMgr_;
79 uint_4 nbDma_;
[3758]80 uint_8 totrdsnd_;
[3762]81 bool fgdirectsend_; // true -> direct transfer of DMA data to ethernet
[3764]82
[3883]83 int prtlev_; // print level
84 uint_8 prtmodulo_; // print periodicity (modulo)
[3757]85};
86
87//------------------------------------------------------------------
88// Classe thread de lecture sur interface reseau (Ethernet)
89//------------------------------------------------------------------
90class EthernetReader : public ZThread {
91public:
[3897]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; }
[3899]100 // En activant le flag, le reader ne se termine qu'avec la reception des message END sur chaque lien
101 inline void WaitENDMsg4Terminate(bool waitendmsg=false)
102 { waitendmsg_=waitendmsg; }
[3897]103
[3757]104 virtual void run();
105 inline void Stop() { stop_ = true; }
106 inline void STOP() { stop_ = true; }
107
[3883]108 inline int SetPrintLevel(int lev=0, uint_8 prtmodulo=50000)
109 { prtlev_=lev; prtmodulo_=prtmodulo; return 0; }
[3759]110
[3757]111protected:
112 bool ReadNextAllFibers(); // Renvoie true si probleme
113 bool ReadNext(int fib); // Renvoie true si probleme
[3897]114 void CleanUpAllSockets(); // pour finir la lecture de toutes les fibres
[3759]115 size_t ReceiveFromSocket(int fib, char* data, size_t len);
116
[3897]117// recale les links en cas d'ecart important entre nb de paquets lu sur chaque lien
118 int SkipAndSyncLinks(); // Renvoie 0 si rien fait, 1 si skip fait, 9 si probleme
119
[3757]120 // Permet d'avancer d'un paquet dans la zone - renvoie true si probleme
121 inline bool MoveToNextTarget() {
122 if ((mmbuf_ == NULL )||(targ_npaq_ >= max_targ_npaq))
123 if (MZoneManage()) return true;
124 targ_npaq_++;
125 return false;
126 }
127 inline Byte* GetPaquetTarget(int numfib) {
128 if ((mmbufib_[numfib] == NULL )||(targ_npaq_ > max_targ_npaq)||(targ_npaq_ == 0)) return NULL;
129 Byte* rb=mmbufib_[numfib]+(targ_npaq_-1)*packsize_;
130 return rb;
131 }
132 bool MZoneManage(bool clean=false); // Renvoie true si probleme
133
134 RAcqMemZoneMgr& memgr_;
135 BRParList par_; // Parametres divers d'acquisition
136 int tcpportid_;
[3897]137 ServerSocket* srv_sokp_; // Le socket serveur
138 vector< Socket > vsok_; // Les sockets de lecture pour chaque lien ethernet (1 lien= 1 fibre a l'envoi)
139 vector< uint_8 > vec_cntpaq_; // vecteur de compteurs de paquet ( 1 compteur / lien )
140 vector< uint_4 > vec_fgsokend_; // vecteur de flag, >0 : fin de reception (ou ereur) sur le lien
141 bool gl_fgsokend; // true -> au moins l'un de liens a termine
[3757]142 bool stop_;
143 bool rdsamefc_; // if true, read paquets with same value of FrameCounter on different fibers/link
[3897]144 uint_4 sfc_maxdpc_; // difference maxi entre nombre de paquets lu sur les liens
145 uint_4 sfc_maxresync_; // nb maximum de tentatives de resynchronisation
146
[3757]147 uint_8 totnbytesrd_;
148 uint_8 totnpaqrd_;
149 uint_8 totsamefc_; // nombre total de paquets avec meme framecounter
150
[3897]151 uint_8 totnbresync_; // nombre total de saut+resynchronisation
152
[3757]153 vector<BRPaquet> vpaq_;
154 vector<BRPaqChecker> vpchk_;
155 vector<uint_8> curfc_; // Numeros des FrameCounter des paquets courants
156 vector<uint_8> totnpqrd_; // nombre total de paquets lus / lien
157 vector<uint_8> totnpqok_; // nombre total de paquets OK / lien
158
159 uint_4 packsize_;
160 int mid_; // Identificateur zone memoire
161 uint_4 targ_npaq_; // Numero de paquet dans une seule zone memoire
162 uint_4 max_targ_npaq; // = mmgr.NbPaquets() = Max de targ_npaq_
163 Byte* mmbuf_; // Pointeur zone memoire rendu par RAcqMemZoneMgr
164 Byte* mmbufib_[MAXANAFIB]; // Pointeurs zone memoire de chaque fibre rendu par RAcqMemZoneMgr
165
[3897]166 // zone tampon contenant zero si lecture sur fibre est fini
167 char* dummybuff_;
[3898]168 string stopreason_; // message descriptif de la raison d'arret
[3897]169
[3899]170 bool waitendmsg_; // si true, attendre le message END message sur chaque lien avant de s'arreter
171
[3883]172 int prtlev_; // print level
173 uint_8 prtmodulo_; // print periodicity (modulo)
[3757]174};
175
176
177
178#endif
Note: See TracBrowser for help on using the repository browser.