// This may look like C code, but it is really -*- C++ -*- #ifndef TOI_H #define TOI_H #include "config.h" #include #include using namespace std; #ifdef WITH_SOPHYA #include "array.h" #include "pexceptions.h" using namespace SOPHYA; #else #include "apexceptions.h" #endif class TOIProcessor; class TOI { public: TOI(); TOI(string name); virtual ~TOI(); #ifdef WITH_SOPHYA virtual Array getData(int iStart, int iEnd); virtual Array getError(int iStart, int iEnd); virtual TArray getFlag(int iStart, int iEnd); #endif virtual double getData(int i); virtual double getError(int i); virtual int_4 getFlag(int i); enum DataStatus {DATA_OK=0, DATA_DELETED, DATA_NOT_YET}; virtual DataStatus isDataAvail(int iStart, int iEnd); virtual DataStatus isDataAvail(int i); virtual void waitForData(int iStart, int iEnd); virtual void waitForData(int i); virtual void waitForAnyData(); virtual int nextDataAvail(int iAfter)=0; virtual bool hasSomeData()=0; virtual void putData(int i, double value, int_4 flag=0); virtual void putDataError(int i, double value, double error, int_4 flag=0); virtual void wontNeedBefore(int i); bool dbg; void setName(string n) {name =n;} string getName() {return name;} protected: TOI* errorTOI; pthread_mutex_t mutex; TOIProcessor* producer; vector consumers; double defaultValue; #ifdef WITH_SOPHYA virtual Array doGetData(int iStart, int iEnd)=0; virtual TArray doGetFlag(int iStart, int iEnd)=0; #endif virtual double doGetData(int i)=0; virtual int_4 doGetFlag(int i)=0; virtual void doPutData(int i, double value, int_4 flag=0)=0; virtual void doWontNeedBefore(int i); virtual DataStatus isDataAvailNL(int iStart, int iEnd)=0; virtual DataStatus isDataAvailNL(int i); virtual void setProducer(TOIProcessor* prod); virtual void addConsumer(TOIProcessor* prod); friend class TOIProcessor; string name; virtual int getMinSn(); virtual int getMaxSn(); void TOIInit(); void lock() {pthread_mutex_lock(&mutex);} void unlock() {pthread_mutex_unlock(&mutex);} }; class TOIRegular : public TOI { }; // Classe de TOI avec une fenetre glissante, et echantillonnage regulier. // Pour le moment au moins, // il faut que les providers fassent arriver les donnees par samplenum croissant. class TOIRegularWindow : public TOIRegular { public: TOIRegularWindow(); TOIRegularWindow(string nm); ~TOIRegularWindow(); virtual DataStatus isDataAvailNL(int iStart, int iEnd); virtual DataStatus isDataAvailNL(int i); // override required //protected: vector data; vector flags; long i0; double defaultValue; #ifdef WITH_SOPHYA virtual Array doGetData(int iStart, int iEnd); virtual TArray doGetFlag(int iStart, int iEnd); #endif virtual double doGetData(int i); virtual int_4 doGetFlag(int i); virtual void doPutData(int i, double value, int_4 flag=0); virtual void doWontNeedBefore(int i); virtual int nextDataAvail(int iAfter); virtual bool hasSomeData(); }; #endif