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