00001 #ifndef AUTOBU_BU_H 00002 #define AUTOBU_BU_H 1 00003 00004 00005 #include "EventFilter/AutoBU/interface/BUEvent.h" 00006 00007 #include "EventFilter/Utilities/interface/StateMachine.h" 00008 #include "EventFilter/Utilities/interface/WebGUI.h" 00009 #include "EventFilter/Utilities/interface/Exception.h" 00010 00011 #include "EventFilter/Playback/interface/PlaybackRawDataProvider.h" 00012 00013 #include "xdaq/Application.h" 00014 00015 #include "toolbox/mem/HeapAllocator.h" 00016 #include "toolbox/mem/MemoryPoolFactory.h" 00017 #include "toolbox/net/URN.h" 00018 #include "toolbox/fsm/exception/Exception.h" 00019 00020 #include "xdata/InfoSpace.h" 00021 #include "xdata/UnsignedInteger32.h" 00022 #include "xdata/Double.h" 00023 #include "xdata/Boolean.h" 00024 #include "xdata/String.h" 00025 00026 #include "interface/evb/i2oEVBMsgs.h" 00027 #include "interface/shared/i2oXFunctionCodes.h" 00028 00029 #include "interface/shared/frl_header.h" 00030 #include "interface/shared/fed_header.h" 00031 #include "interface/shared/fed_trailer.h" 00032 00033 #include "i2o/Method.h" 00034 #include "i2o/utils/AddressMap.h" 00035 00036 #include "CLHEP/Random/RandGauss.h" 00037 00038 00039 #include <vector> 00040 #include <queue> 00041 #include <cmath> 00042 #include <semaphore.h> 00043 #include <sys/time.h> 00044 00045 00046 namespace evf { 00047 00048 00049 class BU : public xdaq::Application, 00050 public xdata::ActionListener 00051 { 00052 public: 00053 // 00054 // xdaq instantiator macro 00055 // 00056 XDAQ_INSTANTIATOR(); 00057 00058 00059 // 00060 // construction/destruction 00061 // 00062 BU(xdaq::ApplicationStub *s); 00063 virtual ~BU(); 00064 00065 00066 // 00067 // public member functions 00068 // 00069 00070 // work loop functions to be executed during transitional states (async) 00071 bool configuring(toolbox::task::WorkLoop* wl); 00072 bool enabling(toolbox::task::WorkLoop* wl); 00073 bool stopping(toolbox::task::WorkLoop* wl); 00074 bool halting(toolbox::task::WorkLoop* wl); 00075 00076 // fsm soap command callback 00077 xoap::MessageReference fsmCallback(xoap::MessageReference msg) 00078 throw (xoap::exception::Exception); 00079 00080 // i2o callbacks 00081 void I2O_BU_ALLOCATE_Callback(toolbox::mem::Reference *bufRef); 00082 void I2O_BU_DISCARD_Callback(toolbox::mem::Reference *bufRef); 00083 00084 // xdata::ActionListener callback 00085 void actionPerformed(xdata::Event& e); 00086 00087 // Hyper DAQ web interface [see Utilities/WebGUI] 00088 void webPageRequest(xgi::Input *in,xgi::Output *out) 00089 throw (xgi::exception::Exception); 00090 void customWebPage(xgi::Input*in,xgi::Output*out) 00091 throw (xgi::exception::Exception); 00092 00093 // build events (random or playback) 00094 void startBuildingWorkLoop() throw (evf::Exception); 00095 bool building(toolbox::task::WorkLoop* wl); 00096 00097 // send events to connected FU 00098 void startSendingWorkLoop() throw (evf::Exception); 00099 bool sending(toolbox::task::WorkLoop* wl); 00100 00101 // calculate monitoring information in separate thread 00102 void startMonitoringWorkLoop() throw (evf::Exception); 00103 bool monitoring(toolbox::task::WorkLoop* wl); 00104 00105 00106 private: 00107 // 00108 // private member functions 00109 // 00110 void lock() { sem_wait(&lock_); } 00111 void unlock() { sem_post(&lock_); } 00112 void waitBuild() { sem_wait(&buildSem_); } 00113 void postBuild() { sem_post(&buildSem_); } 00114 void waitSend() { sem_wait(&sendSem_); } 00115 void postSend() { sem_post(&sendSem_); } 00116 void waitRqst() { sem_wait(&rqstSem_); } 00117 void postRqst() { sem_post(&rqstSem_); } 00118 00119 void exportParameters(); 00120 void reset(); 00121 double deltaT(const struct timeval *start,const struct timeval *end); 00122 00123 bool generateEvent(evf::BUEvent* evt); 00124 toolbox::mem::Reference *createMsgChain(evf::BUEvent *evt, 00125 unsigned int fuResourceId); 00126 00127 00128 void dumpFrame(unsigned char* data,unsigned int len); 00129 00130 00131 private: 00132 // 00133 // member data 00134 // 00135 00136 // BU message logger 00137 Logger log_; 00138 00139 // BU application descriptor 00140 xdaq::ApplicationDescriptor *buAppDesc_; 00141 00142 // FU application descriptor 00143 xdaq::ApplicationDescriptor *fuAppDesc_; 00144 00145 // BU application context 00146 xdaq::ApplicationContext *buAppContext_; 00147 00148 // BU state machine 00149 StateMachine fsm_; 00150 00151 // BU web interface 00152 WebGUI *gui_; 00153 00154 // resource management 00155 std::vector<evf::BUEvent*> events_; 00156 std::queue<unsigned int> rqstIds_; 00157 std::queue<unsigned int> freeIds_; 00158 std::queue<unsigned int> builtIds_; 00159 std::set<unsigned int> sentIds_; 00160 unsigned int evtNumber_; 00161 std::vector<unsigned int> validFedIds_; 00162 00163 bool isBuilding_; 00164 bool isSending_; 00165 bool isHalting_; 00166 00167 // workloop / action signature for building events 00168 toolbox::task::WorkLoop *wlBuilding_; 00169 toolbox::task::ActionSignature *asBuilding_; 00170 00171 // workloop / action signature for sending events 00172 toolbox::task::WorkLoop *wlSending_; 00173 toolbox::task::ActionSignature *asSending_; 00174 00175 // workloop / action signature for monitoring 00176 toolbox::task::WorkLoop *wlMonitoring_; 00177 toolbox::task::ActionSignature *asMonitoring_; 00178 00179 00180 std::string sourceId_; 00181 00182 // monitored parameters 00183 xdata::String url_; 00184 xdata::String class_; 00185 xdata::UnsignedInteger32 instance_; 00186 xdata::String hostname_; 00187 xdata::UnsignedInteger32 runNumber_; 00188 xdata::Double memUsedInMB_; 00189 00190 xdata::Double deltaT_; 00191 xdata::UnsignedInteger32 deltaN_; 00192 xdata::Double deltaSumOfSquares_; 00193 xdata::UnsignedInteger32 deltaSumOfSizes_; 00194 00195 xdata::Double throughput_; 00196 xdata::Double average_; 00197 xdata::Double rate_; 00198 xdata::Double rms_; 00199 00200 // monitored counters 00201 xdata::UnsignedInteger32 nbEventsInBU_; 00202 xdata::UnsignedInteger32 nbEventsRequested_; 00203 xdata::UnsignedInteger32 nbEventsBuilt_; 00204 xdata::UnsignedInteger32 nbEventsSent_; 00205 xdata::UnsignedInteger32 nbEventsDiscarded_; 00206 00207 // standard parameters 00208 xdata::String mode_; 00209 xdata::Boolean replay_; 00210 xdata::Boolean crc_; 00211 xdata::Boolean overwriteEvtId_; 00212 xdata::Boolean overwriteLsId_; 00213 xdata::UnsignedInteger32 fakeLsUpdateSecs_; 00214 xdata::UnsignedInteger32 firstEvent_; 00215 xdata::UnsignedInteger32 queueSize_; 00216 xdata::UnsignedInteger32 eventBufferSize_; 00217 xdata::UnsignedInteger32 msgBufferSize_; 00218 xdata::UnsignedInteger32 fedSizeMax_; 00219 xdata::UnsignedInteger32 fedSizeMean_; 00220 xdata::UnsignedInteger32 fedSizeWidth_; 00221 xdata::Boolean useFixedFedSize_; 00222 xdata::UnsignedInteger32 monSleepSec_; 00223 00224 unsigned int fakeLs_; 00225 timeval lastLsUpdate_; 00226 // gaussian aprameters for randpm fed size generation (log-normal) 00227 double gaussianMean_; 00228 double gaussianWidth_; 00229 00230 // monitoring helpers 00231 struct timeval monStartTime_; 00232 unsigned int monLastN_; 00233 uint64_t monLastSumOfSquares_; 00234 unsigned int monLastSumOfSizes_; 00235 uint64_t sumOfSquares_; 00236 unsigned int sumOfSizes_; 00237 00238 00239 // memory pool for i20 communication 00240 toolbox::mem::Pool* i2oPool_; 00241 00242 // synchronization 00243 sem_t lock_; 00244 sem_t buildSem_; 00245 sem_t sendSem_; 00246 sem_t rqstSem_; 00247 00248 00249 // 00250 // static member data 00251 // 00252 static const int frlHeaderSize_ =sizeof(frlh_t); 00253 static const int fedHeaderSize_ =sizeof(fedh_t); 00254 static const int fedTrailerSize_=sizeof(fedt_t); 00255 00256 }; // class BU 00257 00258 00259 } // namespace evf 00260 00261 00262 #endif