source: Sophya/trunk/ArchTOIPipe/Kernel/toi.h@ 1442

Last change on this file since 1442 was 1437, checked in by ansari, 25 years ago

Protections diverses dans TOIProcessor et FITSTOIReader/Writer
Ajout d'un TOI (TOISeqBuffered) avec gestion d'un buffer entre put/get
Ajout de processeurs de test (RZTOIProc...) , programme test associe
et SMakefile (pour compil avec SOPHYA)

Reza 12/3/2001

File size: 4.9 KB
Line 
1// This may look like C code, but it is really -*- C++ -*-
2#ifndef TOI_H
3#define TOI_H
4
5#include "config.h"
6
7#include <pthread.h>
8#include <vector>
9using namespace std;
10
11#ifdef WITH_SOPHYA
12#include "array.h"
13#include "pexceptions.h"
14using namespace SOPHYA;
15#else
16#include "apexceptions.h"
17#endif
18
19
20
21class TOIProcessor;
22
23class TOI {
24public:
25 TOI();
26 TOI(string name);
27 virtual ~TOI();
28
29 // ----- Rajouts Reza 12/3/2001
30 virtual void PrintStatus(ostream & os) const;
31 // Fin rajouts Reza 12/3/2001 ------
32
33#ifdef WITH_SOPHYA
34 virtual Array getData(int iStart, int iEnd);
35 virtual Array getError(int iStart, int iEnd);
36 virtual TArray<int_4> getFlag(int iStart, int iEnd);
37#endif
38
39 virtual double getData(int i);
40 virtual double getError(int i);
41 virtual int_4 getFlag(int i);
42
43 enum DataStatus {DATA_OK=0, DATA_DELETED, DATA_NOT_YET};
44 virtual DataStatus isDataAvail(int iStart, int iEnd);
45 virtual DataStatus isDataAvail(int i);
46 virtual void waitForData(int iStart, int iEnd);
47 virtual void waitForData(int i);
48 virtual void waitForAnyData();
49 virtual int nextDataAvail(int iAfter)=0;
50 virtual bool hasSomeData()=0;
51
52 virtual void putData(int i, double value, int_4 flag=0);
53 virtual void putDataError(int i, double value,
54 double error, int_4 flag=0);
55
56 virtual void wontNeedBefore(int i);
57
58 bool dbg;
59
60 void setName(string n) {name =n;}
61 string getName() const {return name;}
62
63protected:
64 TOI* errorTOI;
65 pthread_mutex_t mutex;
66 // ----- Rajouts Reza 12/3/2001
67 pthread_cond_t condv;
68 bool fgwaitput;
69 bool fgwaitget;
70 bool fgsigput;
71 bool fgsigget;
72 int countwaitput;
73 int countwaitget;
74 // Fin rajouts Reza 12/3/2001 ------
75
76 TOIProcessor* producer;
77 vector<TOIProcessor*> consumers;
78 double defaultValue;
79
80#ifdef WITH_SOPHYA
81 virtual Array doGetData(int iStart, int iEnd)=0;
82 virtual TArray<int_4> doGetFlag(int iStart, int iEnd)=0;
83#endif
84 virtual double doGetData(int i)=0;
85 virtual int_4 doGetFlag(int i)=0;
86 virtual void doPutData(int i, double value, int_4 flag=0)=0;
87 virtual void doWontNeedBefore(int i);
88
89 virtual DataStatus isDataAvailNL(int iStart, int iEnd)=0;
90 virtual DataStatus isDataAvailNL(int i);
91
92 virtual void setProducer(TOIProcessor* prod);
93 virtual void addConsumer(TOIProcessor* prod);
94 friend class TOIProcessor;
95
96 string name;
97
98 virtual int getMinSn();
99 virtual int getMaxSn();
100 void TOIInit();
101
102 // Il faut faire attention avec mutex et condv, si TOI cree sur le stack !
103 // Il faut donc faire new TOI - Reza 11/3/2001
104 void lock() {pthread_mutex_lock(&mutex);}
105 void unlock() {pthread_mutex_unlock(&mutex);}
106
107 // ----- Rajouts Reza 12/3/2001
108 void wait() {pthread_cond_wait(&condv, &mutex);}
109 void signal() {pthread_cond_signal(&condv);}
110 void broadcast() {pthread_cond_broadcast(&condv);}
111 inline void waitPut()
112 {fgwaitput=true; countwaitput++; pthread_cond_wait(&condv, &mutex);}
113 inline void waitGet()
114 {fgwaitget=true; countwaitget++; pthread_cond_wait(&condv, &mutex);}
115 inline bool isPutWaiting() const { return fgwaitput; }
116 inline bool isGetWaiting() const { return fgwaitget; }
117 inline void signalPut() {fgsigput=true;}
118 inline void signalGet() {fgsigget=true;}
119 inline void cleanWaitPut() { fgsigput = fgwaitput = false; }
120 inline void cleanWaitGet() { fgsigget = fgwaitget = false; }
121
122public:
123 inline int getCountWaitPut() const { return countwaitput; }
124 inline int getCountWaitGet() const { return countwaitget; }
125 // Fin rajouts Reza 12/3/2001 ------
126
127};
128
129inline ostream & operator << (ostream & os, TOI const & toi)
130{ toi.PrintStatus(os); return os; }
131
132class TOIRegular : public TOI {
133};
134
135// Classe de TOI avec une fenetre glissante, et echantillonnage regulier.
136// Pour le moment au moins,
137// il faut que les providers fassent arriver les donnees par samplenum croissant.
138class TOIRegularWindow : public TOIRegular {
139public:
140 TOIRegularWindow();
141 TOIRegularWindow(string nm);
142 virtual ~TOIRegularWindow();
143
144 virtual DataStatus isDataAvailNL(int iStart, int iEnd);
145 virtual DataStatus isDataAvailNL(int i); // override required
146
147
148//protected:
149 vector<double> data;
150 vector<int_4> flags;
151 long i0;
152 double defaultValue;
153
154#ifdef WITH_SOPHYA
155 virtual Array doGetData(int iStart, int iEnd);
156 virtual TArray<int_4> doGetFlag(int iStart, int iEnd);
157#endif
158 virtual double doGetData(int i);
159 virtual int_4 doGetFlag(int i);
160
161 virtual void doPutData(int i, double value, int_4 flag=0);
162 virtual void doWontNeedBefore(int i);
163
164 virtual int nextDataAvail(int iAfter);
165 virtual bool hasSomeData();
166};
167
168#endif
Note: See TracBrowser for help on using the repository browser.