1 #include "otsdaq-core/FECore/FEVInterfacesManager.h"
2 #include "otsdaq-core/MessageFacility/MessageFacility.h"
3 #include "otsdaq-core/Macros/CoutHeaderMacros.h"
4 #include "otsdaq-core/FECore/FEVInterface.h"
5 #include "otsdaq-core/PluginMakers/MakeInterface.h"
6 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
8 #include "messagefacility/MessageLogger/MessageLogger.h"
9 #include "artdaq/DAQdata/configureMessageFacility.hh"
10 #include "artdaq/BuildInfo/GetPackageBuildInfo.hh"
11 #include "fhiclcpp/make_ParameterSet.h"
19 FEVInterfacesManager::FEVInterfacesManager(
const ConfigurationTree& theXDAQContextConfigTree,
const std::string& supervisorConfigurationPath)
20 :
Configurable(theXDAQContextConfigTree, supervisorConfigurationPath)
26 FEVInterfacesManager::~FEVInterfacesManager(
void)
32 void FEVInterfacesManager::init(
void)
37 void FEVInterfacesManager::destroy(
void)
39 for(
auto& it : theFEInterfaces_)
42 theFEInterfaces_.clear();
46 void FEVInterfacesManager::createInterfaces(
void)
50 __COUT__ <<
"Path: "<< theConfigurationPath_+
"/LinkToFEInterfaceConfiguration" << std::endl;
51 for(
const auto& interface: theXDAQContextConfigTree_.getNode(theConfigurationPath_+
"/LinkToFEInterfaceConfiguration").getChildren())
55 if(!interface.second.getNode(ViewColumnInfo::COL_NAME_STATUS).getValue<
bool>())
continue;
59 __COUT_INFO__ <<
"Ignoring FE Status since Status column is missing!" << std::endl;
62 __COUT__ <<
"Interface Plugin Name: "<< interface.second.getNode(
"FEInterfacePluginName").getValue<std::string>() << std::endl;
63 __COUT__ <<
"Interface Name: "<< interface.first << std::endl;
64 __COUT__ <<
"XDAQContext Node: "<< theXDAQContextConfigTree_ << std::endl;
65 __COUT__ <<
"Path to configuration: "<< (theConfigurationPath_ +
"/LinkToFEInterfaceConfiguration/" + interface.first +
"/LinkToFETypeConfiguration") << std::endl;
66 theFEInterfaces_[interface.first] = makeInterface(
67 interface.second.getNode(
"FEInterfacePluginName").getValue<std::string>(),
69 theXDAQContextConfigTree_,
70 (theConfigurationPath_ +
"/LinkToFEInterfaceConfiguration/" + interface.first +
"/LinkToFETypeConfiguration")
73 __COUT__ <<
"Done creating interfaces" << std::endl;
78 int FEVInterfacesManager::universalRead(
const std::string &interfaceID,
char* address,
char* returnValue)
80 __COUT__ <<
"interfaceID: " << interfaceID <<
" and size: " << theFEInterfaces_.size() << std::endl;
82 if (theFEInterfaces_[interfaceID]->universalRead(address, returnValue) < 0)
return -1;
89 unsigned int FEVInterfacesManager::getInterfaceUniversalAddressSize(
const std::string &interfaceID)
90 {
return theFEInterfaces_[interfaceID]->getUniversalAddressSize(); }
94 unsigned int FEVInterfacesManager::getInterfaceUniversalDataSize(
const std::string &interfaceID)
95 {
return theFEInterfaces_[interfaceID]->getUniversalDataSize(); }
99 void FEVInterfacesManager::universalWrite(
const std::string &interfaceID,
char* address,
char* writeValue)
102 __COUT__ <<
"interfaceID: " << interfaceID <<
" and size: " << theFEInterfaces_.size() << std::endl;
104 theFEInterfaces_[interfaceID]->universalWrite(address, writeValue);
120 std::string FEVInterfacesManager::getFEListString(
const std::string &supervisorLid)
122 std::string retList =
"";
124 for(
const auto& it : theFEInterfaces_)
126 __COUT__ <<
"Just curious: it.first is " << it.first << std::endl;
128 retList += it.second->getInterfaceType() +
129 ":" + supervisorLid +
":" +
130 it.second->getInterfaceUID() +
"\n";
146 void FEVInterfacesManager::runFEMacro(
const std::string &interfaceID,
147 const std::string &feMacroName,
const std::string &inputArgs, std::string &outputArgs)
150 auto FEVInterfaceIt = theFEInterfaces_.find(interfaceID);
151 if(FEVInterfaceIt == theFEInterfaces_.end())
153 __SS__ <<
"interfaceID '" << interfaceID <<
"' was not found!" << std::endl;
154 __COUT_ERR__ <<
"\n" << ss.str();
155 throw std::runtime_error(ss.str());
159 auto FEMacroIt = FEVInterfaceIt->second->getMapOfFEMacroFunctions().find(feMacroName);
160 if(FEMacroIt == FEVInterfaceIt->second->getMapOfFEMacroFunctions().end())
162 __SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" <<
163 interfaceID <<
"' was not found!" << std::endl;
164 __COUT_ERR__ <<
"\n" << ss.str();
165 throw std::runtime_error(ss.str());
170 std::vector<FEVInterface::frontEndMacroInArg_t> argsIn;
172 std::istringstream inputStream(inputArgs);
173 std::string splitVal, argName, argValue;
174 while (getline(inputStream, splitVal,
';'))
176 std::istringstream pairInputStream(splitVal);
177 getline(pairInputStream, argName,
',');
178 getline(pairInputStream, argValue,
',');
179 argsIn.push_back(std::pair<std::string,std::string>(argName,argValue));
184 if(FEMacroIt->second.namesOfInputArguments_.size() != argsIn.size())
186 __SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" <<
187 interfaceID <<
"' was attempted with a mismatch in" <<
188 " number of input arguments. " << argsIn.size() <<
189 " were given. " << FEMacroIt->second.namesOfInputArguments_.size() <<
190 " expected." << std::endl;
191 __COUT_ERR__ <<
"\n" << ss.str();
192 throw std::runtime_error(ss.str());
194 for(
unsigned int i=0;i<argsIn.size();++i)
195 if(argsIn[i].first != FEMacroIt->second.namesOfInputArguments_[i])
197 __SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" <<
198 interfaceID <<
"' was attempted with a mismatch in" <<
199 " a name of an input argument. " <<
200 argsIn[i].first <<
" were given. " <<
201 FEMacroIt->second.namesOfInputArguments_[i] <<
202 " expected." << std::endl;
203 __COUT_ERR__ <<
"\n" << ss.str();
204 throw std::runtime_error(ss.str());
210 std::vector<std::string> returnStrings;
211 std::vector<FEVInterface::frontEndMacroOutArg_t> argsOut;
214 std::istringstream inputStream(outputArgs);
216 while (getline(inputStream, argName,
','))
218 __COUT__ <<
"argName " << argName << std::endl;
220 returnStrings.push_back(
"valueLore" );
221 argsOut.push_back(FEVInterface::frontEndMacroOutArg_t(
223 returnStrings[returnStrings.size()-1]));
226 __COUT__ << (uint64_t) &(returnStrings[returnStrings.size()-1]) << std::endl;
231 if(FEMacroIt->second.namesOfOutputArguments_.size() != argsOut.size())
233 __SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" <<
234 interfaceID <<
"' was attempted with a mismatch in" <<
235 " number of output arguments. " << argsOut.size() <<
236 " were given. " << FEMacroIt->second.namesOfOutputArguments_.size() <<
237 " expected." << std::endl;
238 __COUT_ERR__ <<
"\n" << ss.str();
239 throw std::runtime_error(ss.str());
241 for(
unsigned int i=0;i<argsOut.size();++i)
242 if(argsOut[i].first != FEMacroIt->second.namesOfOutputArguments_[i])
244 __SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" <<
245 interfaceID <<
"' was attempted with a mismatch in" <<
246 " a name of an output argument. " <<
247 argsOut[i].first <<
" were given. " <<
248 FEMacroIt->second.namesOfOutputArguments_[i] <<
249 " expected." << std::endl;
250 __COUT_ERR__ <<
"\n" << ss.str();
251 throw std::runtime_error(ss.str());
259 __COUT__ <<
"# of input args = " << argsIn.size() << std::endl;
260 for(
auto &argIn:argsIn)
261 __COUT__ << argIn.first <<
": " << argIn.second << std::endl;
272 __COUT__ <<
"Trying it " << std::endl;
275 (FEVInterfaceIt->second.get()->*(FEMacroIt->second.macroFunction_))(argsIn,argsOut);
277 __COUT__ <<
"Made it " << std::endl;
279 __COUT__ <<
"# of output args = " << argsOut.size() << std::endl;
280 for(
const auto &arg:argsOut)
281 __COUT__ << arg.first <<
": " << arg.second << std::endl;
288 if(FEMacroIt->second.namesOfOutputArguments_.size() != argsOut.size())
290 __SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '" <<
291 interfaceID <<
"' was attempted but the FE macro "
292 "manipulated the output arguments vector. It is illegal "
293 "to add or remove output vector name/value pairs." << std::endl;
294 __COUT_ERR__ <<
"\n" << ss.str();
295 throw std::runtime_error(ss.str());
302 for(
unsigned int i=0; i<argsOut.size(); ++i)
304 if(i) outputArgs +=
";";
305 outputArgs += argsOut[i].first +
"," + argsOut[i].second;
308 __COUT__ <<
"outputArgs = " << outputArgs << std::endl;
319 std::string FEVInterfacesManager::getFEMacrosString(
const std::string &supervisorLid)
321 std::string retList =
"";
323 for(
const auto& it : theFEInterfaces_)
325 __COUT__ <<
"FE interface UID = " << it.first << std::endl;
327 retList += it.second->getInterfaceType() +
328 ":" + supervisorLid +
":" +
329 it.second->getInterfaceUID();
331 for(
const auto& macroPair : it.second->getMapOfFEMacroFunctions())
333 __COUT__ <<
"FE Macro name = " << macroPair.first << std::endl;
335 ":" + macroPair.first +
336 ":" + std::to_string(macroPair.second.requiredUserPermissions_) +
337 ":" + std::to_string(macroPair.second.namesOfInputArguments_.size());
338 for(
const auto& name:macroPair.second.namesOfInputArguments_)
339 retList +=
":" + name;
342 ":" + std::to_string(macroPair.second.namesOfOutputArguments_.size());
343 for(
const auto& name:macroPair.second.namesOfOutputArguments_)
344 retList +=
":" + name;
353 bool FEVInterfacesManager::allFEWorkloopsAreDone(
void)
355 bool allFEWorkloopsAreDone =
true;
358 for(
const auto& FEInterface: theFEInterfaces_)
360 isActive = FEInterface.second->isActive();
361 __COUT__ << FEInterface.second->getInterfaceUID() <<
" of type " <<
362 FEInterface.second->getInterfaceType() <<
": \t" <<
363 "workLoop_->isActive() " <<
364 (isActive?
"yes":
"no") << std::endl;
368 allFEWorkloopsAreDone =
false;
373 return allFEWorkloopsAreDone;
377 void FEVInterfacesManager::configure(
void)
380 for(
const auto& it : theFEInterfaces_)
385 __COUT__ <<
"Configuring interface " << it.first << std::endl;
386 __COUT__ <<
"Configuring interface " << it.first << std::endl;
387 __COUT__ <<
"Configuring interface " << it.first << std::endl;
388 it.second->configure();
398 __COUT__ <<
"Done configuring interface " << it.first << std::endl;
399 __COUT__ <<
"Done configuring interface " << it.first << std::endl;
400 __COUT__ <<
"Done configuring interface " << it.first << std::endl;
408 __COUT__ <<
"Done Configure" << std::endl;
412 void FEVInterfacesManager::halt(
void)
414 for(
const auto& it : theFEInterfaces_)
417 it.second->stopWorkLoop();
425 void FEVInterfacesManager::pause(
void)
427 for(
const auto& it : theFEInterfaces_)
430 it.second->stopWorkLoop();
435 void FEVInterfacesManager::resume(
void)
437 for(
const auto& it : theFEInterfaces_)
440 it.second->startWorkLoop();
445 void FEVInterfacesManager::start(std::string runNumber)
447 for(
const auto& it : theFEInterfaces_)
449 it.second->start(runNumber);
450 it.second->startWorkLoop();
454 void FEVInterfacesManager::stop(
void)
456 for(
const auto& it : theFEInterfaces_)
458 it.second->stopWorkLoop();