00001 #ifndef _ots_DataManager_h_
00002 #define _ots_DataManager_h_
00003
00004 #include "otsdaq-core/MessageFacility/MessageFacility.h"
00005 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
00006 #include "otsdaq-core/FiniteStateMachine/VStateMachine.h"
00007 #include "otsdaq-core/DataManager/CircularBuffer.h"
00008 #include "otsdaq-core/ConfigurationInterface/Configurable.h"
00009
00010 #include <map>
00011 #include <string>
00012 #include <vector>
00013 #include <memory>
00014
00015 namespace ots
00016 {
00017 class DataProcessor;
00018 class DataProducer;
00019 class DataConsumer;
00020 class CircularBufferBase;
00021
00022 class DataManager: public VStateMachine, public Configurable
00023 {
00024 public:
00025 DataManager(const ConfigurationTree& theXDAQContextConfigTree, const std::string& supervisorConfigurationPath);
00026 virtual ~DataManager(void);
00027
00028
00029 virtual void configure(void);
00030 virtual void halt (void);
00031 virtual void pause (void);
00032 virtual void resume (void);
00033 virtual void start (std::string runNumber);
00034 virtual void stop (void);
00035
00036
00037
00038 template<class D, class H>
00039 void configureBuffer(std::string bufferUID)
00040 {
00041 buffers_[bufferUID].buffer_ = new CircularBuffer<D,H>();
00042 buffers_[bufferUID].status_ = Initialized;
00043 }
00044 void registerProducer(std::string bufferUID, DataProducer* producer);
00045 void registerConsumer(std::string bufferUID, DataConsumer* consumer, bool registerToBuffer=true);
00046
00047 protected:
00048 void eraseAllBuffers (void);
00049 void eraseBuffer (std::string bufferUID);
00050
00051 void startAllBuffers (std::string runNumber);
00052 void stopAllBuffers (void);
00053 void resumeAllBuffers(void);
00054 void pauseAllBuffers (void);
00055
00056 void startBuffer (std::string bufferUID, std::string runNumber);
00057 void stopBuffer (std::string bufferUID);
00058 void resumeBuffer (std::string bufferUID);
00059 void pauseBuffer (std::string bufferUID);
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 enum BufferStatus {Initialized, Running};
00070
00071 bool unregisterConsumer(std::string consumerID);
00072 bool deleteBuffer (std::string bufferUID);
00073 struct Buffer
00074 {
00075 CircularBufferBase* buffer_;
00076 std::vector<std::shared_ptr<DataProducer>> producers_;
00077
00078 std::vector<std::shared_ptr<DataConsumer>> consumers_;
00079 BufferStatus status_;
00080 };
00081 std::map<std::string, Buffer> buffers_;
00082 };
00083
00084 }
00085
00086 #endif