1 #include "otsdaq/CoreSupervisors/FESupervisor.h"
2 #include "otsdaq/ConfigurationInterface/ConfigurationManager.h"
3 #include "otsdaq/FECore/FEVInterfacesManager.h"
4 #include "otsdaq/TablePlugins/ARTDAQTableBase/ARTDAQTableBase.h"
6 #include "artdaq/DAQdata/Globals.hh"
12 #include "artdaq-core/Utilities/ExceptionHandler.hh"
41 FESupervisor::FESupervisor(xdaq::ApplicationStub* stub)
44 , dp_socket_{dp_context_, zmq::socket_type::pub}
46 __SUP_COUT__ <<
"Constructing..." << __E__;
49 &FESupervisor::macroMakerSupervisorRequest,
50 "MacroMakerSupervisorRequest",
54 this, &FESupervisor::workLoopStatusRequest,
"WorkLoopStatusRequest", XDAQ_NS_URI);
57 &FESupervisor::frontEndCommunicationRequest,
61 std::string dataPublishingEndpoint;
64 dataPublishingEndpoint = getSupervisorProperty(
65 "data_publishing_endpoint");
67 catch(
const std::runtime_error& e)
69 __SUP_COUT__ <<
"Data publishing property 'data_publishing_endpoint' not set. "
70 "Defaulting to data publishing disabled."
75 dataPublishingEndpoint = __ENV__(
76 "DATA_PUBLISHING_ENDPOINT");
78 catch(
const std::runtime_error& e)
81 <<
"Data publishing environment variable 'DATA_PUBLISHING_ENDPOINT' "
82 "not set. Defaulting to data publishing disabled."
86 __SUP_COUT_INFO__ <<
"dataPublishingEndpoint = " << dataPublishingEndpoint << __E__;
88 if(dataPublishingEndpoint.size())
90 __SUP_COUT__ <<
"Initializing data publishing to endpoint '"
91 << dataPublishingEndpoint <<
"'..." << __E__;
93 initDataPublishing(dataPublishingEndpoint,
94 getSupervisorProperty(
"data_publishing_topic",
""));
99 CoreSupervisorBase::theStateMachineImplementation_.push_back(
101 CorePropertySupervisorBase::getContextTreeNode(),
102 CorePropertySupervisorBase::getSupervisorConfigurationPath()));
106 if(CorePropertySupervisorBase::allSupervisorInfo_.isMacroMakerMode())
108 __SUP_COUT_WARN__ <<
"Error caught constructing FE Interface Manager. In "
109 "Macro Maker mode, the input fhicl defines the "
110 "configuration tree, make sure you specified a valid "
117 catch(
const std::runtime_error& e)
119 __SUP_COUT_WARN__ << e.what() << __E__;
126 extractFEInterfacesManager();
128 __SUP_COUT__ <<
"Constructed." << __E__;
130 if(CorePropertySupervisorBase::allSupervisorInfo_.isMacroMakerMode())
132 __SUP_COUT_INFO__ <<
"Macro Maker mode, so configuring at startup!" << __E__;
133 if(!theFEInterfacesManager_)
135 __SUP_SS__ <<
"Missing FE Interface manager!" << __E__;
146 __SUP_COUT__ <<
"Configuring all state machine implementations..." << __E__;
147 __SUP_COUTV__(stateMachinesIterationDone_.size());
148 preStateMachineExecutionLoop();
149 __SUP_COUTV__(stateMachinesIterationDone_.size());
150 for(
unsigned int i = 0; i < theStateMachineImplementation_.size(); ++i)
152 __SUP_COUT__ <<
"Configuring state machine i " << i << __E__;
155 if(subIterationWorkStateMachineIndex_ != (
unsigned int)-1 &&
156 i != subIterationWorkStateMachineIndex_)
159 if(stateMachinesIterationDone_[i])
162 preStateMachineExecution(i);
163 theStateMachineImplementation_[i]->parentSupervisor_ =
166 theStateMachineImplementation_[i]->configure();
169 postStateMachineExecution(i);
171 postStateMachineExecutionLoop();
174 CorePropertySupervisorBase::indicateOtsAlive(0);
176 catch(
const std::runtime_error& e)
178 __SUP_SS__ <<
"Error was caught while configuring: " << e.what() << __E__;
179 __SUP_COUT_ERR__ <<
"\n" << ss.str();
185 <<
"Unknown error was caught while configuring. Please checked the logs."
191 catch(
const std::exception& e)
193 ss <<
"Exception message: " << e.what();
198 __SUP_COUT_ERR__ <<
"\n" << ss.str();
205 FESupervisor::~FESupervisor(
void)
207 __SUP_COUT__ <<
"Destroying..." << __E__;
221 artdaq::Globals::CleanUpGlobals();
223 __SUP_COUT__ <<
"Destructed." << __E__;
227 xoap::MessageReference FESupervisor::frontEndCommunicationRequest(
228 xoap::MessageReference message)
233 if(!theFEInterfacesManager_)
235 __SUP_SS__ <<
"No FE Interface Manager!" << __E__;
239 typeParameter.addParameter(
"type");
240 SOAPUtilities::receive(message, typeParameter);
242 std::string type = typeParameter.getValue(
"type");
252 rxParameters.addParameter(
"requester");
253 rxParameters.addParameter(
"targetInterfaceID");
259 rxParameters.addParameter(
"value");
260 SOAPUtilities::receive(message, rxParameters);
262 std::string requester = rxParameters.getValue(
"requester");
263 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
264 std::string value = rxParameters.getValue(
"value");
266 __SUP_COUTV__(requester);
267 __SUP_COUTV__(targetInterfaceID);
268 __SUP_COUTV__(value);
275 std::lock_guard<std::mutex> lock(
278 theFEInterfacesManager_
279 ->frontEndCommunicationReceiveBuffer_[targetInterfaceID][requester]
282 __SUP_COUT__ <<
"Number of target interface ID '" << targetInterfaceID
284 << theFEInterfacesManager_
285 ->frontEndCommunicationReceiveBuffer_[targetInterfaceID]
289 <<
"Number of source interface ID '" << requester <<
"' values received: "
290 << theFEInterfacesManager_
291 ->frontEndCommunicationReceiveBuffer_[targetInterfaceID][requester]
295 return SOAPUtilities::makeSOAPMessageReference(
"Received");
297 else if(type ==
"feMacro")
301 rxParameters.addParameter(
"feMacroName");
302 rxParameters.addParameter(
"inputArgs");
304 SOAPUtilities::receive(message, rxParameters);
306 std::string requester = rxParameters.getValue(
"requester");
307 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
308 std::string feMacroName = rxParameters.getValue(
"feMacroName");
309 std::string inputArgs = rxParameters.getValue(
"inputArgs");
311 __SUP_COUTV__(requester);
312 __SUP_COUTV__(targetInterfaceID);
313 __SUP_COUTV__(feMacroName);
314 __SUP_COUTV__(inputArgs);
316 std::string outputArgs;
320 requester, targetInterfaceID, feMacroName, inputArgs, outputArgs);
322 catch(std::runtime_error& e)
324 __SUP_SS__ <<
"In Supervisor with LID="
325 << getApplicationDescriptor()->getLocalId()
326 <<
" the FE Macro named '" << feMacroName <<
"' with target FE '"
327 << targetInterfaceID <<
"' failed. Here is the error:\n\n"
328 << e.what() << __E__;
333 __SUP_SS__ <<
"In Supervisor with LID="
334 << getApplicationDescriptor()->getLocalId()
335 <<
" the FE Macro named '" << feMacroName <<
"' with target FE '"
336 << targetInterfaceID <<
"' failed due to an unknown error."
342 catch(
const std::exception& e)
344 ss <<
"Exception message: " << e.what();
352 __SUP_COUTV__(outputArgs);
354 xoap::MessageReference replyMessage =
355 SOAPUtilities::makeSOAPMessageReference(
"feMacrosResponse");
357 txParameters.addParameter(
"requester", requester);
358 txParameters.addParameter(
"targetInterfaceID", targetInterfaceID);
359 txParameters.addParameter(
"feMacroName", feMacroName);
360 txParameters.addParameter(
"outputArgs", outputArgs);
361 SOAPUtilities::addParameters(replyMessage, txParameters);
363 __SUP_COUT__ <<
"Sending FE macro result: "
364 << SOAPUtilities::translate(replyMessage) << __E__;
368 else if(type ==
"feMacroMultiDimensionalStart" ||
369 type ==
"macroMultiDimensionalStart")
375 rxParameters.addParameter(
"macroString");
376 rxParameters.addParameter(
"macroName");
379 rxParameters.addParameter(
"feMacroName");
381 rxParameters.addParameter(
"enableSavingOutput");
382 rxParameters.addParameter(
"outputFilePath");
383 rxParameters.addParameter(
"outputFileRadix");
384 rxParameters.addParameter(
"inputArgs");
386 SOAPUtilities::receive(message, rxParameters);
388 std::string requester = rxParameters.getValue(
"requester");
389 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
390 std::string macroName, macroString;
393 macroName = rxParameters.getValue(
"macroName");
394 macroString = rxParameters.getValue(
"macroString");
395 __SUP_COUTV__(macroString);
398 macroName = rxParameters.getValue(
"feMacroName");
399 bool enableSavingOutput = rxParameters.getValue(
"enableSavingOutput") ==
"1";
400 std::string outputFilePath = rxParameters.getValue(
"outputFilePath");
401 std::string outputFileRadix = rxParameters.getValue(
"outputFileRadix");
402 std::string inputArgs = rxParameters.getValue(
"inputArgs");
404 __SUP_COUTV__(requester);
405 __SUP_COUTV__(targetInterfaceID);
406 __SUP_COUTV__(macroName);
407 __SUP_COUTV__(enableSavingOutput);
408 __SUP_COUTV__(outputFilePath);
409 __SUP_COUTV__(outputFileRadix);
410 __SUP_COUTV__(inputArgs);
425 catch(std::runtime_error& e)
427 __SUP_SS__ <<
"In Supervisor with LID="
428 << getApplicationDescriptor()->getLocalId()
429 <<
" the Macro named '" << macroName <<
"' with target FE '"
431 <<
"' failed to start multi-dimensional launch. "
432 <<
"Here is the error:\n\n"
433 << e.what() << __E__;
438 __SUP_SS__ <<
"In Supervisor with LID="
439 << getApplicationDescriptor()->getLocalId()
440 <<
" the Macro named '" << macroName <<
"' with target FE '"
442 <<
"' failed to start multi-dimensional launch "
443 <<
"due to an unknown error." << __E__;
448 catch(
const std::exception& e)
450 ss <<
"Exception message: " << e.what();
470 catch(std::runtime_error& e)
472 __SUP_SS__ <<
"In Supervisor with LID="
473 << getApplicationDescriptor()->getLocalId()
474 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
476 <<
"' failed to start multi-dimensional launch. "
477 <<
"Here is the error:\n\n"
478 << e.what() << __E__;
483 __SUP_SS__ <<
"In Supervisor with LID="
484 << getApplicationDescriptor()->getLocalId()
485 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
487 <<
"' failed to start multi-dimensional launch "
488 <<
"due to an unknown error." << __E__;
493 catch(
const std::exception& e)
495 ss <<
"Exception message: " << e.what();
504 xoap::MessageReference replyMessage =
505 SOAPUtilities::makeSOAPMessageReference(type +
"Done");
508 SOAPUtilities::addParameters(replyMessage, txParameters);
510 __SUP_COUT__ <<
"Sending FE macro result: "
511 << SOAPUtilities::translate(replyMessage) << __E__;
515 else if(type ==
"feMacroMultiDimensionalCheck" ||
516 type ==
"macroMultiDimensionalCheck")
520 rxParameters.addParameter(
"macroName");
522 rxParameters.addParameter(
"feMacroName");
523 rxParameters.addParameter(
"targetInterfaceID");
525 SOAPUtilities::receive(message, rxParameters);
527 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
528 std::string macroName;
530 macroName = rxParameters.getValue(
"macroName");
532 macroName = rxParameters.getValue(
"feMacroName");
543 catch(std::runtime_error& e)
545 __SUP_SS__ <<
"In Supervisor with LID="
546 << getApplicationDescriptor()->getLocalId()
547 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
549 <<
"' failed to check multi-dimensional launch. "
550 <<
"Here is the error:\n\n"
551 << e.what() << __E__;
556 __SUP_SS__ <<
"In Supervisor with LID="
557 << getApplicationDescriptor()->getLocalId()
558 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
560 <<
"' failed to check multi-dimensional launch "
561 <<
"due to an unknown error." << __E__;
566 catch(
const std::exception& e)
568 ss <<
"Exception message: " << e.what();
576 xoap::MessageReference replyMessage =
577 SOAPUtilities::makeSOAPMessageReference(type +
"Done");
579 txParameters.addParameter(
"Done", done ?
"1" :
"0");
580 SOAPUtilities::addParameters(replyMessage, txParameters);
588 __SUP_SS__ <<
"Unrecognized FE Communication type: " << type << __E__;
592 catch(
const std::runtime_error& e)
594 __SUP_SS__ <<
"Error encountered processing FE communication request: " << e.what()
596 __SUP_COUT_ERR__ << ss.str();
599 parameters.addParameter(
"Error", ss.str());
600 return SOAPUtilities::makeSOAPMessageReference(
601 supervisorClassNoNamespace_ +
"FailFECommunicationRequest", parameters);
605 __SUP_SS__ <<
"Unknown error encountered processing FE communication request."
611 catch(
const std::exception& e)
613 ss <<
"Exception message: " << e.what();
618 __SUP_COUT_ERR__ << ss.str();
621 parameters.addParameter(
"Error", ss.str());
622 return SOAPUtilities::makeSOAPMessageReference(
623 supervisorClassNoNamespace_ +
"FailFECommunicationRequest", parameters);
634 xoap::MessageReference message)
636 __SUP_COUT__ <<
"$$$$$$$$$$$$$$$$$" << __E__;
640 parameters.addParameter(
"Request");
642 __SUP_COUT__ <<
"Received Macro Maker message: " << SOAPUtilities::translate(message)
645 SOAPUtilities::receive(message, parameters);
646 std::string
request = parameters.getValue(
"Request");
648 __SUP_COUT__ <<
"request: " <<
request << __E__;
664 if(theFEInterfacesManager_)
665 retParameters.addParameter(
668 std::to_string(getApplicationDescriptor()->getLocalId())));
670 retParameters.addParameter(
"FEList",
"");
673 if(theStateMachine_.getErrorMessage() !=
"")
674 retParameters.addParameter(
"frontEndError",
675 theStateMachine_.getErrorMessage());
677 return SOAPUtilities::makeSOAPMessageReference(
678 supervisorClassNoNamespace_ +
"Response", retParameters);
680 else if(
request ==
"UniversalWrite")
682 if(!theFEInterfacesManager_)
684 __SUP_SS__ <<
"No FE Interface Manager! Are you configured?" << __E__;
689 requestParameters.addParameter(
"InterfaceID");
690 requestParameters.addParameter(
"Address");
691 requestParameters.addParameter(
"Data");
692 SOAPUtilities::receive(message, requestParameters);
693 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
694 std::string addressStr = requestParameters.getValue(
"Address");
695 std::string dataStr = requestParameters.getValue(
"Data");
697 __SUP_COUT__ <<
"Address: " << addressStr <<
" Data: " << dataStr
698 <<
" InterfaceID: " << interfaceID << __E__;
705 <<
"theFEInterfacesManager_->getInterfaceUniversalAddressSize(index) "
709 <<
"theFEInterfacesManager_->getInterfaceUniversalDataSize(index) "
719 __SUP_COUT__ <<
"Translating address: ";
721 std::string addressTmp;
724 char* address = &addressTmp[0];
726 if(addressStr.size() % 2)
727 addressStr =
"0" + addressStr;
729 for(; i < addressStr.size() &&
734 tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
735 tmpHex[1] = addressStr[addressStr.size() - 1 - i];
736 sscanf(tmpHex,
"%hhX", (
unsigned char*)&address[i / 2]);
737 printf(
"%2.2X", (
unsigned char)address[i / 2]);
745 printf(
"%2.2X", (
unsigned char)address[i / 2]);
750 __SUP_COUT__ <<
"Translating data: ";
755 char* data = &dataTmp[0];
757 if(dataStr.size() % 2)
758 dataStr =
"0" + dataStr;
761 for(; i < dataStr.size() &&
766 tmpHex[0] = dataStr[dataStr.size() - 1 - i - 1];
767 tmpHex[1] = dataStr[dataStr.size() - 1 - i];
768 sscanf(tmpHex,
"%hhX", (
unsigned char*)&data[i / 2]);
769 printf(
"%2.2X", (
unsigned char)data[i / 2]);
777 printf(
"%2.2X", (
unsigned char)data[i / 2]);
789 theFEInterfacesManager_->
universalWrite(interfaceID, address, data);
794 return SOAPUtilities::makeSOAPMessageReference(
795 supervisorClassNoNamespace_ +
"DataWritten", retParameters);
797 else if(
request ==
"UniversalRead")
799 if(!theFEInterfacesManager_)
801 __SUP_SS__ <<
"No FE Interface Manager! Are you configured?" << __E__;
807 requestParameters.addParameter(
"InterfaceID");
808 requestParameters.addParameter(
"Address");
809 SOAPUtilities::receive(message, requestParameters);
810 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
811 std::string addressStr = requestParameters.getValue(
"Address");
813 __SUP_COUT__ <<
"Address: " << addressStr <<
" InterfaceID: " << interfaceID
822 <<
"theFEInterfacesManager_->getInterfaceUniversalAddressSize(index) "
826 <<
"theFEInterfacesManager_->getInterfaceUniversalDataSize(index) "
833 __SUP_COUT__ <<
"Translating address: ";
835 std::string addressTmp;
838 char* address = &addressTmp[0];
840 if(addressStr.size() % 2)
841 addressStr =
"0" + addressStr;
844 for(; i < addressStr.size() &&
849 tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
850 tmpHex[1] = addressStr[addressStr.size() - 1 - i];
851 sscanf(tmpHex,
"%hhX", (
unsigned char*)&address[i / 2]);
852 printf(
"%2.2X", (
unsigned char)address[i / 2]);
860 printf(
"%2.2X", (
unsigned char)address[i / 2]);
865 unsigned int dataSz =
868 dataStr.resize(dataSz);
869 char* data = &dataStr[0];
877 theFEInterfacesManager_->
universalRead(interfaceID, address, data);
879 catch(
const std::runtime_error& e)
883 __SUP_COUT_ERR__ <<
"Exception caught during read: " << e.what() << __E__;
884 retParameters.addParameter(
"dataResult",
"Time Out Error");
885 return SOAPUtilities::makeSOAPMessageReference(
886 supervisorClassNoNamespace_ +
"aa", retParameters);
892 __SUP_COUT_ERR__ <<
"Exception caught during read." << __E__;
893 retParameters.addParameter(
"dataResult",
"Time Out Error");
894 return SOAPUtilities::makeSOAPMessageReference(
895 supervisorClassNoNamespace_ +
"aa", retParameters);
901 std::string str8(data);
903 __SUP_COUT__ <<
"decResult[" << dataSz
904 <<
" bytes]: " << *((
unsigned long long*)(&str8[0]))
908 std::string hexResultStr;
909 hexResultStr.reserve(dataSz * 2 + 1);
910 char* hexResult = &hexResultStr[0];
914 for(
unsigned int i = 0; i < dataSz; ++i)
916 sprintf(&hexResult[i * 2],
"%2.2X", (
unsigned char)data[dataSz - 1 - i]);
919 __SUP_COUT__ <<
"hexResult[" << strlen(hexResult)
920 <<
" nibbles]: " << std::string(hexResult) << __E__;
922 retParameters.addParameter(
"dataResult", hexResult);
923 return SOAPUtilities::makeSOAPMessageReference(
924 supervisorClassNoNamespace_ +
"aa", retParameters);
926 else if(
request ==
"GetInterfaceMacros")
928 if(theFEInterfacesManager_)
930 __SUP_COUT__ <<
"Getting FE Macros from FE Interface Manager..." << __E__;
931 retParameters.addParameter(
934 CorePropertySupervisorBase::getSupervisorUID(),
935 std::to_string(CoreSupervisorBase::getSupervisorLID())));
939 __SUP_COUT__ <<
"No FE Macros because there is no FE Interface Manager..."
941 retParameters.addParameter(
"FEMacros",
"");
944 return SOAPUtilities::makeSOAPMessageReference(
945 supervisorClassNoNamespace_ +
"Response", retParameters);
947 else if(
request ==
"RunInterfaceMacro")
949 if(!theFEInterfacesManager_)
951 __SUP_SS__ <<
"Missing FE Interface Manager! Are you configured?"
958 requestParameters.addParameter(
"feMacroName");
959 requestParameters.addParameter(
"inputArgs");
960 requestParameters.addParameter(
"outputArgs");
961 requestParameters.addParameter(
"InterfaceID");
962 requestParameters.addParameter(
"userPermissions");
963 SOAPUtilities::receive(message, requestParameters);
964 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
965 std::string feMacroName = requestParameters.getValue(
"feMacroName");
966 std::string inputArgs = requestParameters.getValue(
"inputArgs");
967 std::string outputArgs = requestParameters.getValue(
"outputArgs");
968 std::string userPermissions = requestParameters.getValue(
"userPermissions");
973 __COUTV__(userPermissions);
974 std::map<std::string, WebUsers::permissionLevel_t> userPermissionLevelsMap;
976 userPermissions, userPermissionLevelsMap);
987 auto FEMacroIt = fe->getMapOfFEMacroFunctions().find(feMacroName);
988 if(FEMacroIt == fe->getMapOfFEMacroFunctions().end())
990 __SUP_SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '"
991 << interfaceID <<
"' was not found!" << __E__;
996 __COUTV__(FEMacro.requiredUserPermissions_);
997 std::map<std::string, WebUsers::permissionLevel_t>
998 FERequiredUserPermissionsMap;
1000 FEMacro.requiredUserPermissions_, FERequiredUserPermissionsMap);
1004 userPermissionLevelsMap, FERequiredUserPermissionsMap))
1006 __SUP_SS__ <<
"Invalid user permission for FE Macro '" << feMacroName
1007 <<
"' of interfaceID '" << interfaceID <<
"'!\n\n"
1008 <<
"Must have access level of at least '"
1010 <<
".' Users permissions level is only '"
1011 << userPermissions <<
".'" << __E__;
1016 interfaceID, FEMacro, inputArgs, outputArgs);
1020 catch(std::runtime_error& e)
1022 __SUP_SS__ <<
"In Supervisor with LID="
1023 << getApplicationDescriptor()->getLocalId()
1024 <<
" the FE Macro named '" << feMacroName
1025 <<
"' with target FE '" << interfaceID
1026 <<
"' failed. Here is the error:\n\n"
1027 << e.what() << __E__;
1030 catch(std::exception& e)
1032 __SUP_SS__ <<
"In Supervisor with LID="
1033 << getApplicationDescriptor()->getLocalId()
1034 <<
" the FE Macro named '" << feMacroName
1035 <<
"' with target FE '" << interfaceID
1036 <<
"' failed. Here is the error:\n\n"
1037 << e.what() << __E__;
1042 __SUP_SS__ <<
"In Supervisor with LID="
1043 << getApplicationDescriptor()->getLocalId()
1044 <<
" the FE Macro named '" << feMacroName
1045 <<
"' with target FE '" << interfaceID
1046 <<
"' failed due to an unknown error." << __E__;
1051 catch(
const std::exception& e)
1053 ss <<
"Exception message: " << e.what();
1062 retParameters.addParameter(
"outputArgs", outputArgs);
1064 return SOAPUtilities::makeSOAPMessageReference(
1065 supervisorClassNoNamespace_ +
"Response", retParameters);
1067 else if(
request ==
"RunMacroMakerMacro")
1069 if(!theFEInterfacesManager_)
1071 __SUP_SS__ <<
"Missing FE Interface Manager! Are you configured?"
1078 requestParameters.addParameter(
"macroName");
1079 requestParameters.addParameter(
"macroString");
1080 requestParameters.addParameter(
"inputArgs");
1081 requestParameters.addParameter(
"outputArgs");
1082 requestParameters.addParameter(
"InterfaceID");
1083 SOAPUtilities::receive(message, requestParameters);
1084 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
1085 std::string macroName = requestParameters.getValue(
"macroName");
1086 std::string macroString = requestParameters.getValue(
"macroString");
1087 std::string inputArgs = requestParameters.getValue(
"inputArgs");
1088 std::string outputArgs = requestParameters.getValue(
"outputArgs");
1095 interfaceID, macroString, inputArgs, outputArgs);
1097 catch(std::runtime_error& e)
1099 __SUP_SS__ <<
"In Supervisor with LID="
1100 << getApplicationDescriptor()->getLocalId()
1101 <<
" the MacroMaker Macro named '" << macroName
1102 <<
"' with target FE '" << interfaceID
1103 <<
"' failed. Here is the error:\n\n"
1104 << e.what() << __E__;
1109 __SUP_SS__ <<
"In Supervisor with LID="
1110 << getApplicationDescriptor()->getLocalId()
1111 <<
" the MacroMaker Macro named '" << macroName
1112 <<
"' with target FE '" << interfaceID
1113 <<
"' failed due to an unknown error." << __E__;
1118 catch(
const std::exception& e)
1120 ss <<
"Exception message: " << e.what();
1128 retParameters.addParameter(
"outputArgs", outputArgs);
1130 return SOAPUtilities::makeSOAPMessageReference(
1131 supervisorClassNoNamespace_ +
"Response", retParameters);
1135 __SUP_SS__ <<
"Unrecognized request received! '" <<
request <<
"'" << __E__;
1139 catch(
const std::runtime_error& e)
1141 __SUP_SS__ <<
"Error occurred handling request: " << e.what() << __E__;
1142 __SUP_COUT_ERR__ << ss.str();
1143 retParameters.addParameter(
"Error", ss.str());
1147 __SUP_SS__ <<
"Error occurred handling request." << __E__;
1152 catch(
const std::exception& e)
1154 ss <<
"Exception message: " << e.what();
1159 __SUP_COUT_ERR__ << ss.str();
1160 retParameters.addParameter(
"Error", ss.str());
1163 return SOAPUtilities::makeSOAPMessageReference(
1164 supervisorClassNoNamespace_ +
"FailRequest", retParameters);
1169 xoap::MessageReference FESupervisor::workLoopStatusRequest(
1170 xoap::MessageReference )
1172 if(!theFEInterfacesManager_)
1174 __SUP_SS__ <<
"Invalid request for front-end workloop status from Supervisor "
1175 "without a FEVInterfacesManager."
1180 return SOAPUtilities::makeSOAPMessageReference(
1182 ? CoreSupervisorBase::WORK_LOOP_DONE
1183 : CoreSupervisorBase::WORK_LOOP_WORKING));
1196 theFEInterfacesManager_ = 0;
1198 for(
unsigned int i = 0; i < theStateMachineImplementation_.size(); ++i)
1202 theFEInterfacesManager_ =
1204 if(!theFEInterfacesManager_)
1207 __SUP_SS__ <<
"Dynamic cast failure!" << __E__;
1210 __SUP_COUT__ <<
"State Machine " << i <<
" WAS of type FEVInterfacesManager"
1217 __SUP_COUT__ <<
"State Machine " << i
1218 <<
" was NOT of type FEVInterfacesManager" << __E__;
1222 __SUP_COUT__ <<
"theFEInterfacesManager pointer = " << theFEInterfacesManager_
1225 return theFEInterfacesManager_;
1229 void FESupervisor::transitionConfiguring(toolbox::Event::Reference )
1231 __SUP_COUT__ <<
"transitionConfiguring" << __E__;
1233 CoreSupervisorBase::configureInit();
1238 __COUTV__(CorePropertySupervisorBase::getSupervisorConfigurationPath());
1241 CorePropertySupervisorBase::getSupervisorTableNode();
1243 std::string metric_string =
"";
1244 bool metricStringSetup =
true;
1247 std::ostringstream oss;
1248 std::string tabString =
"";
1249 std::string commentsString =
"";
1251 oss, tabString, commentsString,
"" , feSupervisorNode);
1252 metric_string = oss.str();
1256 metricStringSetup =
false;
1262 __SUP_COUT__ <<
"Metric manager is not instantiated! Attempting to fix."
1264 metricMan = std::make_unique<artdaq::MetricManager>();
1266 std::string metricNamePreamble =
1267 feSupervisorNode.
getNode(
"/SlowControlsMetricManagerChannelNamePreamble")
1269 __SUP_COUTV__(metricNamePreamble);
1270 if(metricNamePreamble == TableViewColumnInfo::DATATYPE_STRING_DEFAULT)
1271 metricNamePreamble =
"";
1274 fhicl::ParameterSet metric_pset = fhicl::ParameterSet::make(metric_string);
1276 __SUP_COUTV__(metricNamePreamble);
1279 metricMan->initialize(metric_pset.get<fhicl::ParameterSet>(
"metrics"),
1280 metricNamePreamble);
1284 if(metricStringSetup)
1287 __SUP_COUT__ <<
"Ignore metric manager initialize error because metric "
1288 "string is not setup."
1291 __SUP_COUT__ <<
"transitionConfiguring metric manager(" << metricMan
1292 <<
") initialized = " << metricMan->Initialized() << __E__;
1294 catch(
const std::runtime_error& e)
1296 __SS__ <<
"Error loading metrics in FESupervisor::transitionConfiguring(): "
1297 << e.what() << __E__;
1298 __SUP_COUT_ERR__ << ss.str();
1302 theStateMachine_.setErrorMessage(ss.str());
1303 throw toolbox::fsm::exception::Exception(
1304 "Transition Error" ,
1306 "FESupervisor::transitionConfiguring" ,
1313 __SS__ <<
"Error loading metrics in FESupervisor::transitionConfiguring()"
1319 catch(
const std::exception& e)
1321 ss <<
"Exception message: " << e.what();
1326 __SUP_COUT_ERR__ << ss.str();
1330 theStateMachine_.setErrorMessage(ss.str());
1331 throw toolbox::fsm::exception::Exception(
1332 "Transition Error" ,
1334 "FESupervisor::transitionConfiguring" ,
1340 CoreSupervisorBase::transitionConfiguringFSMs();
1342 __SUP_COUT__ <<
"transitionConfiguring done." << __E__;
1348 __SUP_COUT__ <<
"transitionHalting" << __E__;
1349 TLOG_DEBUG(7) <<
"transitionHalting";
1356 if(metricMan && metricMan->Initialized())
1358 TLOG_DEBUG(7) <<
"Metric manager(" << metricMan <<
") shutting down..."
1362 TLOG_DEBUG(7) <<
"Metric manager shutdown." << __E__;
1365 __SUP_COUT__ <<
"Metric manager(" << metricMan <<
") already shutdown."
1368 metricMan.reset(
nullptr);
1372 __SS__ <<
"Error shutting down metrics in FESupervisor::transitionHalting()"
1378 catch(
const std::exception& e)
1380 ss <<
"Exception message: " << e.what();
1385 __SUP_COUT_ERR__ << ss.str();
1389 theStateMachine_.setErrorMessage(ss.str());
1390 throw toolbox::fsm::exception::Exception(
1391 "Transition Error" ,
1393 "FESupervisor::transitionHalting" ,
1399 __SUP_COUT__ <<
"transitionHalting done." << __E__;
1404 const std::string& topic)
1406 if(dp_isInitialized_)
1413 dp_endpoint_ = endpoint;
1419 dp_socket_.bind(dp_endpoint_);
1421 catch(
const zmq::error_t& e)
1423 __SUP_SS__ <<
"initDataPublishing() - bind to zmq '" + dp_endpoint_ +
1424 "' failed: " + e.what()
1429 dp_isInitialized_ =
true;
1435 if(dp_isInitialized_)
1439 dp_socket_.set(zmq::sockopt::linger, 0);
1442 catch(
const zmq::error_t&)
1448 if(alsoCloseContext)
1449 dp_context_.close();
1451 catch(
const zmq::error_t&)
1455 dp_isInitialized_ =
false;
1469 if(!dp_isInitialized_)
1471 __SUP_SS__ <<
"publishData() called before zmq init()" << __E__;
1477 auto rc_topic = dp_socket_.send(zmq::buffer(dp_topic_), zmq::send_flags::sndmore);
1480 __SUP_SS__ <<
"publishData() - failed to send zmq topic" << __E__;
1486 if(dataPtr ==
nullptr && dataSize > 0)
1488 __SUP_SS__ <<
"FESupervisor::publishData() - dataPtr is nullptr but dataSize is "
1489 << dataSize << __E__;
1493 dp_socket_.send(zmq::buffer(dataPtr, dataSize), zmq::send_flags::none);
1496 __SUP_SS__ <<
"publishData() - failed to send zmq payload" << __E__;
static void insertMetricsBlock(std::ostream &out, std::string &tabStr, std::string &commentStr, const std::string &parentPath, ConfigurationTree daqNode)
insertMetricsBlock
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
void getValue(T &value) const
static void extractPermissionsMapFromString(const std::string &permissionsString, std::map< std::string, WebUsers::permissionLevel_t > &permissionsMap)
static bool doPermissionsGrantAccess(std::map< std::string, WebUsers::permissionLevel_t > &permissionLevelsMap, std::map< std::string, WebUsers::permissionLevel_t > &permissionThresholdsMap)
virtual void transitionHalting(toolbox::Event::Reference event)
virtual void request(const std::string &requestType, cgicc::Cgicc &cgiIn, HttpXmlDocument &xmlOut, const WebUsers::RequestUserInfo &userInfo)
void publishData(const char *dataPtr, size_t dataSize)
virtual void transitionHalting(toolbox::Event::Reference event) override
void initDataPublishing(const std::string &endpoint, const std::string &topic="test")
void closeDataPublishing(bool alsoCloseContext=true)
xoap::MessageReference macroMakerSupervisorRequest(xoap::MessageReference message)
const FEVInterface & getFEInterface(const std::string &interfaceID) const
getFEInterface
std::string getFEMacrosString(const std::string &supervisorName, const std::string &supervisorLid)
used by MacroMaker
FEVInterface * getFEInterfaceP(const std::string &interfaceID)
getFEInterfaceP
void runFEMacro(const std::string &interfaceID, const FEVInterface::frontEndMacroStruct_t &feMacro, const std::string &inputArgs, std::string &outputArgs)
used by MacroMaker and FE calling indirectly
unsigned int getInterfaceUniversalAddressSize(const std::string &interfaceID)
used by MacroMaker
void startFEMacroMultiDimensional(const std::string &requester, const std::string &interfaceID, const std::string &feMacroName, const bool enableSavingOutput, const std::string &outputFilePath, const std::string &outputFileRadix, const std::string &inputArgs)
used by iterator calling (i.e. FESupervisor)
void universalWrite(const std::string &interfaceID, char *address, char *writeValue)
used by MacroMaker
bool allFEWorkloopsAreDone(void)
used by Iterator, e.g.
void runFEMacroByFE(const std::string &callingInterfaceID, const std::string &interfaceID, const std::string &feMacroName, const std::string &inputArgs, std::string &outputArgs)
used by FE calling (i.e. FESupervisor)
unsigned int getInterfaceUniversalDataSize(const std::string &interfaceID)
used by MacroMaker
void universalRead(const std::string &interfaceID, char *address, char *returnValue)
used by MacroMaker
void startMacroMultiDimensional(const std::string &requester, const std::string &interfaceID, const std::string ¯oName, const std::string ¯oString, const bool enableSavingOutput, const std::string &outputFilePath, const std::string &outputFileRadix, const std::string &inputArgs)
used by iterator calling (i.e. FESupervisor)
bool checkMacroMultiDimensional(const std::string &interfaceID, const std::string ¯oName)
used by iterator calling (i.e. FESupervisor)
std::mutex frontEndCommunicationReceiveMutex_
FE communication helpers.
void runMacro(const std::string &interfaceID, const std::string ¯oObjectString, const std::string &inputArgs, std::string &outputArgs)
used by MacroMaker
std::string getFEListString(const std::string &supervisorLid)
used by MacroMaker
defines used also by OtsConfigurationWizardSupervisor
< members fully define a front-end macro function
static std::string mapToString(const std::map< std::string, T > &mapToReturn, const std::string &primaryDelimeter=", ", const std::string &secondaryDelimeter=": ")