source: Sophya/trunk/AddOn/TAcq/racqumem.h@ 3676

Last change on this file since 3676 was 3658, checked in by ansari, 16 years ago

1/ Gestion multi-fibre ds RAcqMemZoneMgr et les DMAReader/DiskWriter (brproc.cc)
2/ Possibilite d'ajout de mot cle ds l'entete FITS par la classe MiniFITSFile

Reza , 18/10/2009

File size: 6.0 KB
Line 
1#ifndef RACQUMEM_H_SEEN
2#define RACQUMEM_H_SEEN
3
4//----------------------------------------------------------------
5// ---- classes de gestion memoire pour acquisition BAORadio -----
6// LAL - R. Ansari - Juin/Juillet 2008
7// Modifs Mai 2009
8// - Introduction du numero d'ordre de remplissage
9// - Introduction de mask de recyclage et sequence de traitement procA/B/C
10//----------------------------------------------------------------
11
12
13#include "machdefs.h"
14#include <string>
15#include <vector>
16#include <iostream>
17#include "sopnamsp.h"
18#include "zthread.h"
19// #include "dmamgrintf.h"
20#include "brtypes.h"
21#include "pciewrap.h"
22using namespace std;
23
24// Structure de gestion utilisee par la classe RAcqMemMgr
25typedef struct {
26 uint_8 serial; // Numero de serie permettant d'ordonner en temps les zones memoire rempli
27 uint_4 act; // Indique l'action en cours sur une zone Fill,Save ...
28 uint_4 stat; // Champ de flag (bits) indiquant les operations effectuees sur la zone
29 uint_4 nbact[6]; // compteurs nb de fois ou (fill,save,proc,procA/B/C) a ete effectuee sur la zone
30// int tid; Pas utilise pour le moment, permet l'identification du thread operant sur la zone
31} St_MemZ;
32
33
34// Les flags (bits) correspondant aux operations effectuees sur une zone
35// Free->libre, Filled->rempli(par DMA), Saved(ecrit sur disque), Proc(Traitement)
36// ProcA/B/C : Trois traitement qui doivent s'enchainer
37enum MemZStatus { MemZS_Free=0, MemZS_Filled=1, MemZS_Saved=2, MemZS_Proc=4,
38 MemZS_ProcA=8, MemZS_ProcB=16, MemZS_ProcC=32 };
39// L'action en cours sur une zone
40enum MemZaction { MemZA_None=0, MemZA_Fill=1, MemZA_Save=2, MemZA_Proc=4,
41 MemZA_ProcA=8, MemZA_ProcB=16, MemZA_ProcC=32 };
42
43// configuration du RAcqMemZoneMgr
44enum MemZconfig { MemZConf_SingleFiberDataOnly=0, MemZConf_MultiFiberDataOnly=1,
45 MemZConf_SingleFiberProcDataOnly=2, MemZConf_MultiFiberProcDataOnly=3,
46 MemZConf_SingleFiberDataAndProcData=4, MemZConf_MultiFiberDataAndProcData=5 };
47// L'etat d'execution en cours : running, waiting, stopped
48enum MemZRunState { MemZR_Running=0, MemZR_Waiting=1, MemZR_Stopped=2};
49
50
51
52// -------------------------------------------------------------------
53// Classe de gestion de zones memoire partagee (des buffers) entre
54// threads - qui doivent operer successivement sur les vecteurs
55// -------------------------------------------------------------------
56class RAcqMemZoneMgr {
57public:
58// Constructeur, nz=Nb de zones, np=Nb de paquets/zone , psz=taille de paquet
59// Si procpsz>0 , on alloue aussi des zones memoire pour donnees traitees
60// dans ce cas, procpsz à la taille memoire des donnees traites pour chaque paquet
61// Constructeur 1 : l'objet ne contient que les donnees d'une fibre
62// garde pour maintenir la compatibilite avec version TAcq v <= 6.0
63 RAcqMemZoneMgr(uint_4 nz, uint_4 np, uint_4 psz);
64// Constructeur 2 : l'objet peut contenir plusieurs fibres, et des donnees processes en plus
65 RAcqMemZoneMgr(uint_4 nzon, uint_4 nfib, uint_4 npaq, uint_4 paqsz, uint_4 procsz=0);
66
67 ~RAcqMemZoneMgr();
68
69 // Retourne le nombre de fibres dans chaque zone
70 inline uint_4 NbZones() { return nzones; }
71 // Retourne le nombre de zones memoire
72 inline uint_4 NbFibres() { return nfibres; }
73 // Retourne la taille de paquet
74 inline uint_4 PaqSize() { return paqsz; }
75 // Retourne le nb de paquets dans une zone
76 inline uint_4 NbPaquets() { return npaq; }
77 // Retourne la taille totale d'une zone
78 inline uint_4 ZoneSize() { return nfibres*npaq*paqsz; }
79 inline uint_4 OneFiberZoneSize() { return npaq*paqsz; }
80
81 // Retourne la taille de la zone memoire correspondant aux donnees traitees d'un paquet
82 inline uint_4 ProcPaqSize() { return procpaqsz; }
83 // Retourne la taille totale d'une zone de donnees traitees
84 inline uint_4 ProcZoneSize() { return nfibres*npaq*procpaqsz; }
85 inline uint_4 OneFiberProcZoneSize() { return npaq*procpaqsz; }
86
87 // Definit l'etat des operations obligatoires avant qu'une zone
88 // remplie ne puisse etre recyclee (re-remplie)
89 inline void SetFinalizedMask(uint_4 mask=((uint_4)MemZS_Saved))
90 { mask_finalized_ = mask; }
91 inline uint_4 GetFinalizedMask() { return mask_finalized_; }
92
93 // Retourne un MemZone disponible pour une action specifique
94 int FindMemZoneId(MemZaction act);
95 // Libere une zone memoire en marquant son etat
96 int FreeMemZone(int id, MemZStatus st);
97 // Retourne le pointeur de la zone numero k pour les datas
98
99 // Retourne le pointeur de la zone numero k pour les datas pour une fibre donnee
100 inline Byte* GetMemZone(int id, int fib) {
101 if ((id < 0) || (id >=(int) memzones.size())) return NULL;
102 if ((fib < 0) || (fib >=(int) nfibres)) return NULL;
103 return memzones[id]+fib*OneFiberZoneSize();
104 }
105 // Retourne le pointeur de la zone numero k pour les resultats de traitement pour une fibre donnee
106 inline Byte* GetProcMemZone(int id, int fib) {
107 if ((id < 0) || (id >=(int) procmemzones.size())) return NULL;
108 return procmemzones[id]+fib*OneFiberProcZoneSize();
109 }
110 // Retourne le pointeur de la zone numero k pour les datas
111 inline Byte* GetMemZone(int id) {
112 if ((id < 0) || (id >=(int) memzones.size())) return NULL;
113 return memzones[id];
114 }
115 // Retourne le pointeur de la zone numero k pour les resultats de traitement
116 inline Byte* GetProcMemZone(int id) {
117 if ((id < 0) || (id >=(int) procmemzones.size())) return NULL;
118 return procmemzones[id];
119 }
120
121 ostream& Print(ostream& os);
122
123 void Stop();
124 inline MemZRunState GetRunState()
125 { return runstate_; }
126 inline MemZRunState ChangeRunState( MemZRunState st)
127 { runstate_ = st; return runstate_; }
128
129protected:
130 void Init(); // Fait l'allocation des differents buffers - est appele par les constructeurs
131
132 // ... variables membres
133 ZMutex mex;
134 uint_4 nzones, nfibres, npaq, paqsz, procpaqsz;
135// DMAMgrInterface &dma_;
136 vector< Byte* > memzones;
137 vector< St_MemZ > states;
138 vector< Byte* > procmemzones;
139 bool stop_;
140 MemZRunState runstate_;
141 uint_4 mask_finalized_;
142 uint_8 serial_;
143};
144
145
146
147
148#endif
Note: See TracBrowser for help on using the repository browser.