1 #include "otsdaq/DataLoggerApp/DataLoggerApp.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
4 #include "otsdaq-core/XmlUtilities/HttpXmlDocument.h"
5 #include "otsdaq-core/SOAPUtilities/SOAPUtilities.h"
6 #include "otsdaq-core/SOAPUtilities/SOAPCommand.h"
8 #include "otsdaq-core/ConfigurationDataFormats/ConfigurationGroupKey.h"
9 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
10 #include "otsdaq-core/ConfigurationPluginDataFormats/XDAQContextConfiguration.h"
12 #include <toolbox/fsm/FailedEvent.h>
14 #include <xdaq/NamespaceURI.h>
15 #include <xoap/Method.h>
17 #include "artdaq/DAQdata/Globals.hh"
19 #include "messagefacility/MessageLogger/MessageLogger.h"
20 #include "artdaq-core/Utilities/configureMessageFacility.hh"
21 #include "cetlib/exception.h"
22 #include "artdaq/BuildInfo/GetPackageBuildInfo.hh"
23 #include "fhiclcpp/make_ParameterSet.h"
28 #include <boost/exception/all.hpp>
36 : xdaq::Application (s)
38 , stateMachineWorkLoopManager_(toolbox::task::bind(this, &
DataLoggerApp::stateMachineThread, "StateMachine"))
39 , stateMachineSemaphore_ (toolbox::BSem::FULL)
41 , XDAQContextConfigurationName_(theConfigurationManager_->__GET_CONFIG__(
XDAQContextConfiguration)->getConfigurationName())
42 , supervisorConfigurationPath_ ("INITIALIZED INSIDE THE CONTRUCTOR BECAUSE IT NEEDS supervisorContextUID_ and supervisorApplicationUID_")
43 , supervisorContextUID_ ("INITIALIZED INSIDE THE CONTRUCTOR TO LAUNCH AN EXCEPTION")
44 , supervisorApplicationUID_ ("INITIALIZED INSIDE THE CONTRUCTOR TO LAUNCH AN EXCEPTION")
47 INIT_MF(
"DataLoggerApp");
48 xgi::bind (
this, &DataLoggerApp::Default,
"Default" );
49 xgi::bind (
this, &DataLoggerApp::stateMachineXgiHandler,
"StateMachineXgiHandler");
51 xoap::bind(
this, &DataLoggerApp::stateMachineStateRequest,
"StateMachineStateRequest", XDAQ_NS_URI );
52 xoap::bind(
this, &DataLoggerApp::stateMachineErrorMessageRequest,
"StateMachineErrorMessageRequest", XDAQ_NS_URI );
56 supervisorContextUID_ = theConfigurationManager_->__GET_CONFIG__(
XDAQContextConfiguration)->getContextUID(getApplicationContext()->getContextDescriptor()->getURL());
60 __COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through the Configuration Context Group." <<
61 " The XDAQContextConfigurationName = " << XDAQContextConfigurationName_ <<
62 ". The supervisorApplicationUID = " << supervisorApplicationUID_ << std::endl;
69 getApplicationContext()->getContextDescriptor()->getURL(),
70 getApplicationDescriptor()->getLocalId()
75 __COUT_ERR__ <<
"XDAQ Supervisor could not access it's configuration through the Configuration Application Group."
76 <<
" The supervisorApplicationUID = " << supervisorApplicationUID_ << std::endl;
79 supervisorConfigurationPath_ =
"/" + supervisorContextUID_ +
"/LinkToApplicationConfiguration/" + supervisorApplicationUID_ +
"/LinkToSupervisorConfiguration";
81 setStateMachineName(supervisorApplicationUID_);
86 DataLoggerApp::~DataLoggerApp(
void)
91 void DataLoggerApp::init(
void)
93 std::cout << __COUT_HDR_FL__ <<
"ARTDAQDataLogger SUPERVISOR INIT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << std::endl;
94 allSupervisorInfo_.init(getApplicationContext());
95 artdaq::configureMessageFacility(
"DataLogger");
99 std::cout << __COUT_HDR_FL__ <<
"ARTDAQDataLogger SUPERVISOR INIT4!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << std::endl;
100 std::string name =
"DataLogger";
101 unsigned short port = 5300;
103 artdaq::setMsgFacAppName(name, port);
105 mf::LogDebug(name +
"Supervisor") <<
"artdaq version " <<
106 artdaq::GetPackageBuildInfo::getPackageBuildInfo().getPackageVersion()
108 artdaq::GetPackageBuildInfo::getPackageBuildInfo().getBuildTimestamp();
112 my_rank = this->getApplicationDescriptor()->getLocalId();
113 theDataLoggerInterface_ =
new artdaq::DataLoggerApp();
117 void DataLoggerApp::destroy(
void)
119 delete theDataLoggerInterface_;
123 void DataLoggerApp::Default(xgi::Input * in, xgi::Output * out )
throw (xgi::exception::Exception)
126 *out <<
"<!DOCTYPE HTML><html lang='en'><frameset col='100%' row='100%'><frame src='/WebPath/html/DataLoggerApp.html?urn=" <<
127 this->getApplicationDescriptor()->getLocalId() <<
"'></frameset></html>";
131 void DataLoggerApp::stateMachineXgiHandler(xgi::Input * in, xgi::Output * out )
throw (xgi::exception::Exception)
135 void DataLoggerApp::stateMachineResultXgiHandler(xgi::Input* in, xgi::Output* out )
throw (xgi::exception::Exception)
139 xoap::MessageReference DataLoggerApp::stateMachineXoapHandler(xoap::MessageReference message )
throw (xoap::exception::Exception)
141 std::cout << __COUT_HDR_FL__ <<
"Soap Handler!" << std::endl;
142 stateMachineWorkLoopManager_.removeProcessedRequests();
143 stateMachineWorkLoopManager_.processRequest(message);
144 std::cout << __COUT_HDR_FL__ <<
"Done - Soap Handler!" << std::endl;
149 xoap::MessageReference DataLoggerApp::stateMachineResultXoapHandler(xoap::MessageReference message )
throw (xoap::exception::Exception)
151 std::cout << __COUT_HDR_FL__ <<
"Soap Handler!" << std::endl;
154 std::cout << __COUT_HDR_FL__ <<
"Done - Soap Handler!" << std::endl;
159 bool DataLoggerApp::stateMachineThread(toolbox::task::WorkLoop* workLoop)
161 stateMachineSemaphore_.take();
162 std::cout << __COUT_HDR_FL__ <<
"Re-sending message..." << SOAPUtilities::translate(stateMachineWorkLoopManager_.getMessage(workLoop)).getCommand() << std::endl;
163 std::string reply = send(this->getApplicationDescriptor(),stateMachineWorkLoopManager_.getMessage(workLoop));
164 stateMachineWorkLoopManager_.report(workLoop, reply, 100,
true);
165 std::cout << __COUT_HDR_FL__ <<
"Done with message" << std::endl;
166 stateMachineSemaphore_.give();
172 xoap::MessageReference DataLoggerApp::stateMachineStateRequest(xoap::MessageReference message)
throw (xoap::exception::Exception)
174 std::cout << __COUT_HDR_FL__ << theStateMachine_.getCurrentStateName() << std::endl;
175 return SOAPUtilities::makeSOAPMessageReference(theStateMachine_.getCurrentStateName());
179 xoap::MessageReference DataLoggerApp::stateMachineErrorMessageRequest(xoap::MessageReference message)
180 throw (xoap::exception::Exception)
182 __COUT__<<
"theStateMachine_.getErrorMessage() = " << theStateMachine_.getErrorMessage() << std::endl;
185 retParameters.addParameter(
"ErrorMessage",theStateMachine_.getErrorMessage());
186 return SOAPUtilities::makeSOAPMessageReference(
"stateMachineErrorMessageRequestReply",retParameters);
190 void DataLoggerApp::stateInitial(toolbox::fsm::FiniteStateMachine& fsm)
throw (toolbox::fsm::exception::Exception)
196 void DataLoggerApp::stateHalted(toolbox::fsm::FiniteStateMachine& fsm)
throw (toolbox::fsm::exception::Exception)
202 void DataLoggerApp::stateRunning(toolbox::fsm::FiniteStateMachine& fsm)
throw (toolbox::fsm::exception::Exception)
208 void DataLoggerApp::stateConfigured(toolbox::fsm::FiniteStateMachine& fsm)
throw (toolbox::fsm::exception::Exception)
214 void DataLoggerApp::statePaused(toolbox::fsm::FiniteStateMachine& fsm)
throw (toolbox::fsm::exception::Exception)
220 void DataLoggerApp::inError (toolbox::fsm::FiniteStateMachine & fsm)
throw (toolbox::fsm::exception::Exception)
222 std::cout << __COUT_HDR_FL__ <<
"Fsm current state: " << theStateMachine_.getCurrentStateName()<< std::endl;
227 void DataLoggerApp::enteringError (toolbox::Event::Reference e)
throw (toolbox::fsm::exception::Exception)
229 std::cout << __COUT_HDR_FL__ <<
"Fsm current state: " << theStateMachine_.getCurrentStateName()<< std::endl;
230 toolbox::fsm::FailedEvent& failedEvent =
dynamic_cast<toolbox::fsm::FailedEvent&
>(*e);
231 std::ostringstream error;
232 error <<
"Failure performing transition from "
233 << failedEvent.getFromState()
235 << failedEvent.getToState()
236 <<
" exception: " << failedEvent.getException().what();
237 std::cout << __COUT_HDR_FL__ << error.str() << std::endl;
243 #define ARTDAQ_FCL_PATH std::string(getenv("USER_DATA")) + "/"+ "ARTDAQConfigurations/"
244 #define ARTDAQ_FILE_PREAMBLE "aggregator"
246 void DataLoggerApp::transitionConfiguring(toolbox::Event::Reference e)
throw (toolbox::fsm::exception::Exception)
249 std::cout << __COUT_HDR_FL__ <<
"ARTDAQDataLogger SUPERVISOR CONFIGURING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << std::endl;
250 std::cout << __COUT_HDR_FL__ << SOAPUtilities::translate(theStateMachine_.getCurrentMessage()) << std::endl;
253 SOAPUtilities::translate(theStateMachine_.getCurrentMessage()).
254 getParameters().getValue(
"ConfigurationGroupName"),
256 getParameters().getValue(
"ConfigurationGroupKey")));
258 __COUT__ <<
"Configuration group name: " << theGroup.first <<
" key: " <<
259 theGroup.second << std::endl;
261 theConfigurationManager_->loadConfigurationGroup(
263 theGroup.second,
true);
266 std::string path =
"";
267 char* dirMRB = getenv(
"MRB_BUILDDIR");
268 char* dirP = getenv(
"OTSDAQ_DIR");
270 if(dirMRB) { path = std::string(dirMRB) +
"/otsdaq_demo/"; }
271 else if(dirP) { path = std::string(dirP) +
"/"; }
280 fhicl::ParameterSet pset;
283 std::string filename = ARTDAQ_FCL_PATH + ARTDAQ_FILE_PREAMBLE +
"-";
284 std::string uid = theConfigurationManager_->getNode(XDAQContextConfigurationName_).getNode(supervisorConfigurationPath_).getValue();
286 __COUT__ <<
"uid: " << uid << std::endl;
287 for(
unsigned int i=0;i<uid.size();++i)
288 if((uid[i] >=
'a' && uid[i] <=
'z') ||
289 (uid[i] >=
'A' && uid[i] <=
'Z') ||
290 (uid[i] >=
'0' && uid[i] <=
'9'))
295 __COUT__ << std::endl;
296 __COUT__ << std::endl;
297 __COUT__ <<
"filename: " << filename << std::endl;
299 std::string fileFclString;
301 std::ifstream in(filename, std::ios::in | std::ios::binary);
304 std::string contents;
305 in.seekg(0, std::ios::end);
306 fileFclString.resize(in.tellg());
307 in.seekg(0, std::ios::beg);
308 in.read(&fileFclString[0], fileFclString.size());
313 __COUT__ << fileFclString << std::endl;
314 fhicl::make_ParameterSet(fileFclString, pset);
318 theDataLoggerInterface_->initialize(pset, 0, 0);
319 mf::LogInfo(
"DataLoggerInterface") <<
"ARTDAQDataLogger SUPERVISOR DONE CONFIGURING!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
324 void DataLoggerApp::transitionHalting(toolbox::Event::Reference e)
throw (toolbox::fsm::exception::Exception)
330 void DataLoggerApp::transitionInitializing(toolbox::Event::Reference e)
throw (toolbox::fsm::exception::Exception)
336 void DataLoggerApp::transitionPausing(toolbox::Event::Reference e)
throw (toolbox::fsm::exception::Exception)
338 theDataLoggerInterface_->pause(0, 0);
342 void DataLoggerApp::transitionResuming(toolbox::Event::Reference e)
throw (toolbox::fsm::exception::Exception)
344 theDataLoggerInterface_->resume(0, 0);
348 void DataLoggerApp::transitionStarting(toolbox::Event::Reference e)
throw (toolbox::fsm::exception::Exception)
350 auto runnumber= SOAPUtilities::translate(theStateMachine_.getCurrentMessage()).getParameters().getValue(
"RunNumber");
352 art::RunID runId((art::RunNumber_t)boost::lexical_cast<art::RunNumber_t>(runnumber));
353 theDataLoggerInterface_->start(runId,0,0);
355 catch(
const boost::exception& e)
357 std::cerr <<
"Error parsing string to art::RunNumber_t: " << runnumber << std::endl;
363 void DataLoggerApp::transitionStopping(toolbox::Event::Reference e)
throw (toolbox::fsm::exception::Exception)
365 theDataLoggerInterface_->stop(0,0);
366 theDataLoggerInterface_->shutdown(0);