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"
13 #include "artdaq-core/Utilities/ExceptionHandler.hh"
42 FESupervisor::FESupervisor(xdaq::ApplicationStub* stub)
45 , dp_socket_{dp_context_, zmq::socket_type::pub}
47 __SUP_COUT__ <<
"Constructing..." << __E__;
50 &FESupervisor::macroMakerSupervisorRequest,
51 "MacroMakerSupervisorRequest",
55 this, &FESupervisor::workLoopStatusRequest,
"WorkLoopStatusRequest", XDAQ_NS_URI);
58 &FESupervisor::frontEndCommunicationRequest,
62 std::string dataPublishingEndpoint;
65 dataPublishingEndpoint = getSupervisorProperty(
66 "data_publishing_endpoint");
68 catch(
const std::runtime_error& e)
70 __SUP_COUT__ <<
"Data publishing property 'data_publishing_endpoint' not set. "
71 "Defaulting to data publishing disabled."
76 dataPublishingEndpoint = __ENV__(
77 "DATA_PUBLISHING_ENDPOINT");
79 catch(
const std::runtime_error& e)
82 <<
"Data publishing environment variable 'DATA_PUBLISHING_ENDPOINT' "
83 "not set. Defaulting to data publishing disabled."
87 __SUP_COUT_INFO__ <<
"dataPublishingEndpoint = " << dataPublishingEndpoint << __E__;
89 if(dataPublishingEndpoint.size())
91 __SUP_COUT__ <<
"Initializing data publishing to endpoint '"
92 << dataPublishingEndpoint <<
"'..." << __E__;
94 initDataPublishing(dataPublishingEndpoint,
95 getSupervisorProperty(
"data_publishing_topic",
""));
100 CoreSupervisorBase::theStateMachineImplementation_.push_back(
102 CorePropertySupervisorBase::getContextTreeNode(),
103 CorePropertySupervisorBase::getSupervisorConfigurationPath()));
107 if(CorePropertySupervisorBase::allSupervisorInfo_.isMacroMakerMode())
109 __SUP_COUT_WARN__ <<
"Error caught constructing FE Interface Manager. In "
110 "Macro Maker mode, the input fhicl defines the "
111 "configuration tree, make sure you specified a valid "
118 catch(
const std::runtime_error& e)
120 __SUP_COUT_WARN__ << e.what() << __E__;
127 extractFEInterfacesManager();
129 __SUP_COUT__ <<
"Constructed." << __E__;
131 if(CorePropertySupervisorBase::allSupervisorInfo_.isMacroMakerMode())
133 __SUP_COUT_INFO__ <<
"Macro Maker mode, so configuring at startup!" << __E__;
134 if(!theFEInterfacesManager_)
136 __SUP_SS__ <<
"Missing FE Interface manager!" << __E__;
147 __SUP_COUT__ <<
"Configuring all state machine implementations..." << __E__;
148 __SUP_COUTV__(stateMachinesIterationDone_.size());
149 preStateMachineExecutionLoop();
150 __SUP_COUTV__(stateMachinesIterationDone_.size());
151 for(
unsigned int i = 0; i < theStateMachineImplementation_.size(); ++i)
153 __SUP_COUT__ <<
"Configuring state machine i " << i << __E__;
156 if(subIterationWorkStateMachineIndex_ != (
unsigned int)-1 &&
157 i != subIterationWorkStateMachineIndex_)
160 if(stateMachinesIterationDone_[i])
163 preStateMachineExecution(i);
164 theStateMachineImplementation_[i]->parentSupervisor_ =
167 theStateMachineImplementation_[i]->configure();
170 postStateMachineExecution(i);
172 postStateMachineExecutionLoop();
175 CorePropertySupervisorBase::indicateOtsAlive(0);
177 catch(
const std::runtime_error& e)
179 __SUP_SS__ <<
"Error was caught while configuring: " << e.what() << __E__;
180 __SUP_COUT_ERR__ <<
"\n" << ss.str();
186 <<
"Unknown error was caught while configuring. Please checked the logs."
192 catch(
const std::exception& e)
194 ss <<
"Exception message: " << e.what();
199 __SUP_COUT_ERR__ <<
"\n" << ss.str();
206 FESupervisor::~FESupervisor(
void)
208 __SUP_COUT__ <<
"Destroying..." << __E__;
222 artdaq::Globals::CleanUpGlobals();
224 __SUP_COUT__ <<
"Destructed." << __E__;
228 xoap::MessageReference FESupervisor::frontEndCommunicationRequest(
229 xoap::MessageReference message)
232 __SUP_COUT_INFO__ <<
"DIAG ms=" << StringMacros::nowEpochMs() <<
" tid=" << gettid()
233 <<
" frontEndCommunicationRequest received: "
234 << SOAPUtilities::translate(message) << __E__;
236 if(!theFEInterfacesManager_)
238 __SUP_SS__ <<
"No FE Interface Manager!" << __E__;
242 typeParameter.addParameter(
"type");
243 SOAPUtilities::receive(message, typeParameter);
245 std::string type = typeParameter.getValue(
"type");
255 rxParameters.addParameter(
"requester");
256 rxParameters.addParameter(
"targetInterfaceID");
262 rxParameters.addParameter(
"value");
263 SOAPUtilities::receive(message, rxParameters);
265 std::string requester = rxParameters.getValue(
"requester");
266 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
267 std::string value = rxParameters.getValue(
"value");
269 __SUP_COUTV__(requester);
270 __SUP_COUTV__(targetInterfaceID);
271 __SUP_COUTV__(value);
278 std::lock_guard<std::mutex> lock(
281 theFEInterfacesManager_
282 ->frontEndCommunicationReceiveBuffer_[targetInterfaceID][requester]
285 __SUP_COUT__ <<
"Number of target interface ID '" << targetInterfaceID
287 << theFEInterfacesManager_
288 ->frontEndCommunicationReceiveBuffer_[targetInterfaceID]
292 <<
"Number of source interface ID '" << requester <<
"' values received: "
293 << theFEInterfacesManager_
294 ->frontEndCommunicationReceiveBuffer_[targetInterfaceID][requester]
298 return SOAPUtilities::makeSOAPMessageReference(
"Received");
300 else if(type ==
"feMacro")
304 rxParameters.addParameter(
"feMacroName");
305 rxParameters.addParameter(
"inputArgs");
307 SOAPUtilities::receive(message, rxParameters);
309 std::string requester = rxParameters.getValue(
"requester");
310 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
311 std::string feMacroName = rxParameters.getValue(
"feMacroName");
312 std::string inputArgs = rxParameters.getValue(
"inputArgs");
314 __SUP_COUTV__(requester);
315 __SUP_COUTV__(targetInterfaceID);
316 __SUP_COUTV__(feMacroName);
317 __SUP_COUTV__(inputArgs);
319 std::string outputArgs;
322 __SUP_COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
323 <<
" runFEMacroByFE starting, macro='" << feMacroName
324 <<
"' target='" << targetInterfaceID <<
"'" << __E__;
326 requester, targetInterfaceID, feMacroName, inputArgs, outputArgs);
327 __SUP_COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
328 <<
" runFEMacroByFE done, macro='" << feMacroName <<
"'"
331 catch(std::runtime_error& e)
333 __SUP_SS__ <<
"In Supervisor with LID="
334 << getApplicationDescriptor()->getLocalId()
335 <<
" the FE Macro named '" << feMacroName <<
"' with target FE '"
336 << targetInterfaceID <<
"' failed. Here is the error:\n\n"
337 << e.what() << __E__;
342 __SUP_SS__ <<
"In Supervisor with LID="
343 << getApplicationDescriptor()->getLocalId()
344 <<
" the FE Macro named '" << feMacroName <<
"' with target FE '"
345 << targetInterfaceID <<
"' failed due to an unknown error."
351 catch(
const std::exception& e)
353 ss <<
"Exception message: " << e.what();
361 __SUP_COUTV__(outputArgs);
363 xoap::MessageReference replyMessage =
364 SOAPUtilities::makeSOAPMessageReference(
"feMacrosResponse");
366 txParameters.addParameter(
"requester", requester);
367 txParameters.addParameter(
"targetInterfaceID", targetInterfaceID);
368 txParameters.addParameter(
"feMacroName", feMacroName);
369 txParameters.addParameter(
"outputArgs", outputArgs);
370 SOAPUtilities::addParameters(replyMessage, txParameters);
372 __SUP_COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
373 <<
" Sending FE macro result: "
374 << SOAPUtilities::translate(replyMessage) << __E__;
378 else if(type ==
"feMacroMultiDimensionalStart" ||
379 type ==
"macroMultiDimensionalStart")
385 rxParameters.addParameter(
"macroString");
386 rxParameters.addParameter(
"macroName");
389 rxParameters.addParameter(
"feMacroName");
391 rxParameters.addParameter(
"enableSavingOutput");
392 rxParameters.addParameter(
"outputFilePath");
393 rxParameters.addParameter(
"outputFileRadix");
394 rxParameters.addParameter(
"inputArgs");
396 SOAPUtilities::receive(message, rxParameters);
398 std::string requester = rxParameters.getValue(
"requester");
399 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
400 std::string macroName, macroString;
403 macroName = rxParameters.getValue(
"macroName");
404 macroString = rxParameters.getValue(
"macroString");
405 __SUP_COUTV__(macroString);
408 macroName = rxParameters.getValue(
"feMacroName");
409 bool enableSavingOutput = rxParameters.getValue(
"enableSavingOutput") ==
"1";
410 std::string outputFilePath = rxParameters.getValue(
"outputFilePath");
411 std::string outputFileRadix = rxParameters.getValue(
"outputFileRadix");
412 std::string inputArgs = rxParameters.getValue(
"inputArgs");
414 __SUP_COUTV__(requester);
415 __SUP_COUTV__(targetInterfaceID);
416 __SUP_COUTV__(macroName);
417 __SUP_COUTV__(enableSavingOutput);
418 __SUP_COUTV__(outputFilePath);
419 __SUP_COUTV__(outputFileRadix);
420 __SUP_COUTV__(inputArgs);
435 catch(std::runtime_error& e)
437 __SUP_SS__ <<
"In Supervisor with LID="
438 << getApplicationDescriptor()->getLocalId()
439 <<
" the Macro named '" << macroName <<
"' with target FE '"
441 <<
"' failed to start multi-dimensional launch. "
442 <<
"Here is the error:\n\n"
443 << e.what() << __E__;
448 __SUP_SS__ <<
"In Supervisor with LID="
449 << getApplicationDescriptor()->getLocalId()
450 <<
" the Macro named '" << macroName <<
"' with target FE '"
452 <<
"' failed to start multi-dimensional launch "
453 <<
"due to an unknown error." << __E__;
458 catch(
const std::exception& e)
460 ss <<
"Exception message: " << e.what();
480 catch(std::runtime_error& e)
482 __SUP_SS__ <<
"In Supervisor with LID="
483 << getApplicationDescriptor()->getLocalId()
484 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
486 <<
"' failed to start multi-dimensional launch. "
487 <<
"Here is the error:\n\n"
488 << e.what() << __E__;
493 __SUP_SS__ <<
"In Supervisor with LID="
494 << getApplicationDescriptor()->getLocalId()
495 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
497 <<
"' failed to start multi-dimensional launch "
498 <<
"due to an unknown error." << __E__;
503 catch(
const std::exception& e)
505 ss <<
"Exception message: " << e.what();
514 xoap::MessageReference replyMessage =
515 SOAPUtilities::makeSOAPMessageReference(type +
"Done");
518 SOAPUtilities::addParameters(replyMessage, txParameters);
520 __SUP_COUT__ <<
"Sending FE macro result: "
521 << SOAPUtilities::translate(replyMessage) << __E__;
525 else if(type ==
"feMacroMultiDimensionalCheck" ||
526 type ==
"macroMultiDimensionalCheck")
530 rxParameters.addParameter(
"macroName");
532 rxParameters.addParameter(
"feMacroName");
533 rxParameters.addParameter(
"targetInterfaceID");
535 SOAPUtilities::receive(message, rxParameters);
537 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
538 std::string macroName;
540 macroName = rxParameters.getValue(
"macroName");
542 macroName = rxParameters.getValue(
"feMacroName");
548 std::string outputFile;
552 targetInterfaceID, macroName, &outputFile);
554 catch(std::runtime_error& 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 <<
"Here is the error:\n\n"
562 << e.what() << __E__;
567 __SUP_SS__ <<
"In Supervisor with LID="
568 << getApplicationDescriptor()->getLocalId()
569 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
571 <<
"' failed to check multi-dimensional launch "
572 <<
"due to an unknown error." << __E__;
577 catch(
const std::exception& e)
579 ss <<
"Exception message: " << e.what();
587 xoap::MessageReference replyMessage =
588 SOAPUtilities::makeSOAPMessageReference(type +
"Done");
590 txParameters.addParameter(
"Done", done ?
"1" :
"0");
591 txParameters.addParameter(
"OutputFile", outputFile);
592 SOAPUtilities::addParameters(replyMessage, txParameters);
600 __SUP_SS__ <<
"Unrecognized FE Communication type: " << type << __E__;
604 catch(
const std::runtime_error& e)
606 __SUP_SS__ <<
"Error encountered processing FE communication request: " << e.what()
608 __SUP_COUT_ERR__ << ss.str();
611 parameters.addParameter(
"Error", ss.str());
612 return SOAPUtilities::makeSOAPMessageReference(
613 supervisorClassNoNamespace_ +
"FailFECommunicationRequest", parameters);
617 __SUP_SS__ <<
"Unknown error encountered processing FE communication request."
623 catch(
const std::exception& e)
625 ss <<
"Exception message: " << e.what();
630 __SUP_COUT_ERR__ << ss.str();
633 parameters.addParameter(
"Error", ss.str());
634 return SOAPUtilities::makeSOAPMessageReference(
635 supervisorClassNoNamespace_ +
"FailFECommunicationRequest", parameters);
646 xoap::MessageReference message)
648 __SUP_COUT__ <<
"$$$$$$$$$$$$$$$$$" << __E__;
652 parameters.addParameter(
"Request");
654 __SUP_COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs() <<
" tid=" << gettid()
655 <<
" Received Macro Maker message: " << SOAPUtilities::translate(message)
658 SOAPUtilities::receive(message, parameters);
659 std::string
request = parameters.getValue(
"Request");
661 __SUP_COUT__ <<
"request: " <<
request << __E__;
678 if(theFEInterfacesManager_)
679 retParameters.addParameter(
682 std::to_string(getApplicationDescriptor()->getLocalId())));
684 retParameters.addParameter(
"FEList",
"");
687 if(theStateMachine_.getErrorMessage() !=
"")
688 retParameters.addParameter(
"frontEndError",
689 theStateMachine_.getErrorMessage());
691 return SOAPUtilities::makeSOAPMessageReference(
692 supervisorClassNoNamespace_ +
"Response", retParameters);
694 else if(
request ==
"UniversalWrite")
696 if(!theFEInterfacesManager_)
698 __SUP_SS__ <<
"No FE Interface Manager! Are you configured?" << __E__;
703 requestParameters.addParameter(
"InterfaceID");
704 requestParameters.addParameter(
"Address");
705 requestParameters.addParameter(
"Data");
706 SOAPUtilities::receive(message, requestParameters);
707 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
708 std::string addressStr = requestParameters.getValue(
"Address");
709 std::string dataStr = requestParameters.getValue(
"Data");
711 __SUP_COUT__ <<
"Address: " << addressStr <<
" Data: " << dataStr
712 <<
" InterfaceID: " << interfaceID << __E__;
719 <<
"theFEInterfacesManager_->getInterfaceUniversalAddressSize(index) "
723 <<
"theFEInterfacesManager_->getInterfaceUniversalDataSize(index) "
733 __SUP_COUT__ <<
"Translating address: ";
735 std::string addressTmp;
738 char* address = &addressTmp[0];
740 if(addressStr.size() % 2)
741 addressStr =
"0" + addressStr;
743 for(; i < addressStr.size() &&
748 tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
749 tmpHex[1] = addressStr[addressStr.size() - 1 - i];
750 sscanf(tmpHex,
"%hhX", (
unsigned char*)&address[i / 2]);
751 printf(
"%2.2X", (
unsigned char)address[i / 2]);
759 printf(
"%2.2X", (
unsigned char)address[i / 2]);
764 __SUP_COUT__ <<
"Translating data: ";
769 char* data = &dataTmp[0];
771 if(dataStr.size() % 2)
772 dataStr =
"0" + dataStr;
775 for(; i < dataStr.size() &&
780 tmpHex[0] = dataStr[dataStr.size() - 1 - i - 1];
781 tmpHex[1] = dataStr[dataStr.size() - 1 - i];
782 sscanf(tmpHex,
"%hhX", (
unsigned char*)&data[i / 2]);
783 printf(
"%2.2X", (
unsigned char)data[i / 2]);
791 printf(
"%2.2X", (
unsigned char)data[i / 2]);
803 theFEInterfacesManager_->
universalWrite(interfaceID, address, data);
808 return SOAPUtilities::makeSOAPMessageReference(
809 supervisorClassNoNamespace_ +
"DataWritten", retParameters);
811 else if(
request ==
"UniversalRead")
813 if(!theFEInterfacesManager_)
815 __SUP_SS__ <<
"No FE Interface Manager! Are you configured?" << __E__;
821 requestParameters.addParameter(
"InterfaceID");
822 requestParameters.addParameter(
"Address");
823 SOAPUtilities::receive(message, requestParameters);
824 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
825 std::string addressStr = requestParameters.getValue(
"Address");
827 __SUP_COUT__ <<
"Address: " << addressStr <<
" InterfaceID: " << interfaceID
836 <<
"theFEInterfacesManager_->getInterfaceUniversalAddressSize(index) "
840 <<
"theFEInterfacesManager_->getInterfaceUniversalDataSize(index) "
847 __SUP_COUT__ <<
"Translating address: ";
849 std::string addressTmp;
852 char* address = &addressTmp[0];
854 if(addressStr.size() % 2)
855 addressStr =
"0" + addressStr;
858 for(; i < addressStr.size() &&
863 tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
864 tmpHex[1] = addressStr[addressStr.size() - 1 - i];
865 sscanf(tmpHex,
"%hhX", (
unsigned char*)&address[i / 2]);
866 printf(
"%2.2X", (
unsigned char)address[i / 2]);
874 printf(
"%2.2X", (
unsigned char)address[i / 2]);
879 unsigned int dataSz =
882 dataStr.resize(dataSz);
883 char* data = &dataStr[0];
891 theFEInterfacesManager_->
universalRead(interfaceID, address, data);
893 catch(
const std::runtime_error& e)
897 __SUP_COUT_ERR__ <<
"Exception caught during read: " << e.what() << __E__;
898 retParameters.addParameter(
"dataResult",
"Time Out Error");
899 return SOAPUtilities::makeSOAPMessageReference(
900 supervisorClassNoNamespace_ +
"aa", retParameters);
906 __SUP_COUT_ERR__ <<
"Exception caught during read." << __E__;
907 retParameters.addParameter(
"dataResult",
"Time Out Error");
908 return SOAPUtilities::makeSOAPMessageReference(
909 supervisorClassNoNamespace_ +
"aa", retParameters);
915 std::string str8(data);
917 __SUP_COUT__ <<
"decResult[" << dataSz
918 <<
" bytes]: " << *((
unsigned long long*)(&str8[0]))
922 std::string hexResultStr;
923 hexResultStr.reserve(dataSz * 2 + 1);
924 char* hexResult = &hexResultStr[0];
928 for(
unsigned int i = 0; i < dataSz; ++i)
930 sprintf(&hexResult[i * 2],
"%2.2X", (
unsigned char)data[dataSz - 1 - i]);
933 __SUP_COUT__ <<
"hexResult[" << strlen(hexResult)
934 <<
" nibbles]: " << std::string(hexResult) << __E__;
936 retParameters.addParameter(
"dataResult", hexResult);
937 return SOAPUtilities::makeSOAPMessageReference(
938 supervisorClassNoNamespace_ +
"aa", retParameters);
940 else if(
request ==
"GetInterfaceMacros")
942 if(theFEInterfacesManager_)
944 __SUP_COUT__ <<
"Getting FE Macros from FE Interface Manager..." << __E__;
945 retParameters.addParameter(
948 CorePropertySupervisorBase::getSupervisorUID(),
949 std::to_string(CoreSupervisorBase::getSupervisorLID())));
953 __SUP_COUT__ <<
"No FE Macros because there is no FE Interface Manager..."
955 retParameters.addParameter(
"FEMacros",
"");
958 return SOAPUtilities::makeSOAPMessageReference(
959 supervisorClassNoNamespace_ +
"Response", retParameters);
961 else if(
request ==
"GetInterfaceMacroInputDefaults")
963 if(!theFEInterfacesManager_)
965 __SUP_SS__ <<
"Missing FE Interface Manager! Are you configured?"
971 requestParameters.addParameter(
"InterfaceID");
972 requestParameters.addParameter(
"feMacroName");
973 requestParameters.addParameter(
"inputArgs");
974 requestParameters.addParameter(
"userPermissions");
975 SOAPUtilities::receive(message, requestParameters);
977 const std::string interfaceID = requestParameters.getValue(
"InterfaceID");
978 const std::string feMacroName = requestParameters.getValue(
"feMacroName");
979 const std::string inputArgs = requestParameters.getValue(
"inputArgs");
980 const std::string userPermissions =
981 requestParameters.getValue(
"userPermissions");
984 auto macroIt = fe->getMapOfFEMacroFunctions().find(feMacroName);
985 if(macroIt == fe->getMapOfFEMacroFunctions().end())
987 __SUP_SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '"
988 << interfaceID <<
"' was not found!" << __E__;
992 std::map<std::string, WebUsers::permissionLevel_t> userPermissionLevelsMap;
994 userPermissions, userPermissionLevelsMap);
995 std::map<std::string, WebUsers::permissionLevel_t>
996 requiredPermissionLevelsMap;
998 macroIt->second.requiredUserPermissions_, requiredPermissionLevelsMap);
1000 userPermissionLevelsMap, requiredPermissionLevelsMap))
1002 __SUP_SS__ <<
"Invalid user permission for FE Macro '" << feMacroName
1003 <<
"' of interfaceID '" << interfaceID <<
"'." << __E__;
1008 interfaceID, feMacroName, inputArgs);
1009 std::string encodedDefaults;
1010 for(
const auto& defaultValue : defaults)
1012 if(!encodedDefaults.empty())
1013 encodedDefaults +=
";";
1014 encodedDefaults += StringMacros::encodeURIComponent(defaultValue.first) +
1016 StringMacros::encodeURIComponent(defaultValue.second);
1018 retParameters.addParameter(
"InputDefaults", encodedDefaults);
1019 return SOAPUtilities::makeSOAPMessageReference(
1020 supervisorClassNoNamespace_ +
"Response", retParameters);
1022 else if(
request ==
"RunInterfaceMacro")
1024 if(!theFEInterfacesManager_)
1026 __SUP_SS__ <<
"Missing FE Interface Manager! Are you configured?"
1033 requestParameters.addParameter(
"feMacroName");
1034 requestParameters.addParameter(
"inputArgs");
1035 requestParameters.addParameter(
"outputArgs");
1036 requestParameters.addParameter(
"InterfaceID");
1037 requestParameters.addParameter(
"userPermissions");
1038 requestParameters.addParameter(
"AsyncSupported");
1039 SOAPUtilities::receive(message, requestParameters);
1040 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
1041 std::string feMacroName = requestParameters.getValue(
"feMacroName");
1042 std::string inputArgs = requestParameters.getValue(
"inputArgs");
1043 std::string outputArgs = requestParameters.getValue(
"outputArgs");
1044 std::string userPermissions = requestParameters.getValue(
"userPermissions");
1045 bool asyncSupported = requestParameters.getValue(
"AsyncSupported") ==
"1";
1050 __COUTV__(userPermissions);
1051 std::map<std::string, WebUsers::permissionLevel_t> userPermissionLevelsMap;
1053 userPermissions, userPermissionLevelsMap);
1063 auto FEMacroIt = fe->getMapOfFEMacroFunctions().find(feMacroName);
1064 if(FEMacroIt == fe->getMapOfFEMacroFunctions().end())
1066 __SUP_SS__ <<
"FE Macro '" << feMacroName <<
"' of interfaceID '"
1067 << interfaceID <<
"' was not found!" << __E__;
1072 __COUTV__(FEMacro.requiredUserPermissions_);
1073 std::map<std::string, WebUsers::permissionLevel_t>
1074 FERequiredUserPermissionsMap;
1076 FEMacro.requiredUserPermissions_, FERequiredUserPermissionsMap);
1080 userPermissionLevelsMap, FERequiredUserPermissionsMap))
1082 __SUP_SS__ <<
"Invalid user permission for FE Macro '" << feMacroName
1083 <<
"' of interfaceID '" << interfaceID <<
"'!\n\n"
1084 <<
"Must have access level of at least '"
1086 <<
".' Users permissions level is only '" << userPermissions
1094 auto task = std::make_shared<AsyncMacroTask>();
1096 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1097 task->taskID = ++asyncMacroTaskIDCounter_;
1098 if(asyncMacroTaskIDCounter_ == 0)
1099 task->taskID = ++asyncMacroTaskIDCounter_;
1100 task->interfaceID = interfaceID;
1101 task->startTime = time(0);
1102 asyncMacroTasks_.push_back(task);
1111 outputArgs]()
mutable {
1113 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1114 task->threadID = std::this_thread::get_id();
1120 ->clearFEMacroPercentDone(std::this_thread::get_id());
1128 __COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
1129 <<
" async FE Macro thread starting runFEMacro, taskID="
1130 << task->taskID << __E__;
1132 interfaceID, localFEMacro, inputArgs, outputArgs);
1133 __COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
1134 <<
" async FE Macro thread finished runFEMacro, taskID="
1135 << task->taskID << __E__;
1139 ->clearFEMacroPercentDone(std::this_thread::get_id());
1145 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1146 task->outputArgs = outputArgs;
1147 task->doneTime = time(0);
1151 catch(
const std::exception& e)
1156 ->clearFEMacroPercentDone(std::this_thread::get_id());
1161 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1163 "In Supervisor with LID=" +
1164 std::to_string(getApplicationDescriptor()->getLocalId()) +
1165 " the FE Macro named '" + interfaceID +
1166 "' failed. Here is the error:\n\n" + e.what();
1167 task->doneTime = time(0);
1175 ->clearFEMacroPercentDone(std::this_thread::get_id());
1180 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1182 "In Supervisor with LID=" +
1183 std::to_string(getApplicationDescriptor()->getLocalId()) +
1184 " the FE Macro named '" + interfaceID +
1185 "' failed due to an unknown error.";
1186 task->doneTime = time(0);
1191 __SUP_COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
1192 <<
" Launched async FE Macro '" << feMacroName
1193 <<
"' for interfaceID '" << interfaceID
1194 <<
"' with taskID=" << task->taskID << __E__;
1198 size_t sleepUs = 100;
1199 for(
int i = 0; i < 10; ++i)
1203 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1206 if(!task->error.empty())
1208 std::string errorCopy = task->error;
1209 for(
size_t j = 0; j < asyncMacroTasks_.size(); ++j)
1210 if(asyncMacroTasks_[j]->taskID == task->taskID)
1212 asyncMacroTasks_.erase(
1213 asyncMacroTasks_.begin() + j);
1216 __SUP_SS__ << errorCopy;
1220 <<
"DIAG ms=" << StringMacros::nowEpochMs()
1221 <<
" async macro finished within quick-wait,"
1222 <<
" returning synchronously, taskID=" << task->taskID
1224 retParameters.addParameter(
"outputArgs",
1226 for(
size_t j = 0; j < asyncMacroTasks_.size(); ++j)
1227 if(asyncMacroTasks_[j]->taskID == task->taskID)
1229 asyncMacroTasks_.erase(asyncMacroTasks_.begin() +
1233 return SOAPUtilities::makeSOAPMessageReference(
1234 supervisorClassNoNamespace_ +
"Response",
1244 __SUP_COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
1245 <<
" async macro NOT done within quick-wait,"
1246 <<
" returning NotDoneTaskID=" << task->taskID << __E__;
1247 retParameters.addParameter(
"NotDoneTaskID", std::to_string(task->taskID));
1248 return SOAPUtilities::makeSOAPMessageReference(
1249 supervisorClassNoNamespace_ +
"Response", retParameters);
1257 interfaceID, FEMacro, inputArgs, outputArgs);
1259 catch(std::runtime_error& e)
1261 __SUP_SS__ <<
"In Supervisor with LID="
1262 << getApplicationDescriptor()->getLocalId()
1263 <<
" the FE Macro named '" << feMacroName
1264 <<
"' with target FE '" << interfaceID
1265 <<
"' failed. Here is the error:\n\n"
1266 << e.what() << __E__;
1269 catch(std::exception& e)
1271 __SUP_SS__ <<
"In Supervisor with LID="
1272 << getApplicationDescriptor()->getLocalId()
1273 <<
" the FE Macro named '" << feMacroName
1274 <<
"' with target FE '" << interfaceID
1275 <<
"' failed. Here is the error:\n\n"
1276 << e.what() << __E__;
1281 __SUP_SS__ <<
"In Supervisor with LID="
1282 << getApplicationDescriptor()->getLocalId()
1283 <<
" the FE Macro named '" << feMacroName
1284 <<
"' with target FE '" << interfaceID
1285 <<
"' failed due to an unknown error." << __E__;
1290 catch(
const std::exception& e)
1292 ss <<
"Exception message: " << e.what();
1300 retParameters.addParameter(
"outputArgs", outputArgs);
1301 return SOAPUtilities::makeSOAPMessageReference(
1302 supervisorClassNoNamespace_ +
"Response", retParameters);
1305 else if(
request ==
"RunMacroMakerMacro")
1307 if(!theFEInterfacesManager_)
1309 __SUP_SS__ <<
"Missing FE Interface Manager! Are you configured?"
1316 requestParameters.addParameter(
"macroName");
1317 requestParameters.addParameter(
"macroString");
1318 requestParameters.addParameter(
"inputArgs");
1319 requestParameters.addParameter(
"outputArgs");
1320 requestParameters.addParameter(
"InterfaceID");
1321 requestParameters.addParameter(
"AsyncSupported");
1322 SOAPUtilities::receive(message, requestParameters);
1323 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
1324 std::string macroName = requestParameters.getValue(
"macroName");
1325 std::string macroString = requestParameters.getValue(
"macroString");
1326 std::string inputArgs = requestParameters.getValue(
"inputArgs");
1327 std::string outputArgs = requestParameters.getValue(
"outputArgs");
1328 bool asyncSupported = requestParameters.getValue(
"AsyncSupported") ==
"1";
1333 auto task = std::make_shared<AsyncMacroTask>();
1335 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1336 task->taskID = ++asyncMacroTaskIDCounter_;
1337 if(asyncMacroTaskIDCounter_ == 0)
1338 task->taskID = ++asyncMacroTaskIDCounter_;
1339 task->interfaceID = interfaceID;
1340 task->startTime = time(0);
1341 asyncMacroTasks_.push_back(task);
1350 outputArgs]()
mutable {
1352 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1353 task->threadID = std::this_thread::get_id();
1358 ->clearFEMacroPercentDone(std::this_thread::get_id());
1367 interfaceID, macroString, inputArgs, outputArgs);
1371 ->clearFEMacroPercentDone(std::this_thread::get_id());
1377 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1378 task->outputArgs = outputArgs;
1379 task->doneTime = time(0);
1383 catch(
const std::exception& e)
1388 ->clearFEMacroPercentDone(std::this_thread::get_id());
1393 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1395 "In Supervisor with LID=" +
1396 std::to_string(getApplicationDescriptor()->getLocalId()) +
1397 " the MacroMaker Macro named '" + macroName +
1398 "' with target FE '" + interfaceID +
1399 "' failed. Here is the error:\n\n" + e.what();
1400 task->doneTime = time(0);
1408 ->clearFEMacroPercentDone(std::this_thread::get_id());
1413 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1415 "In Supervisor with LID=" +
1416 std::to_string(getApplicationDescriptor()->getLocalId()) +
1417 " the MacroMaker Macro named '" + macroName +
1418 "' with target FE '" + interfaceID +
1419 "' failed due to an unknown error.";
1420 task->doneTime = time(0);
1425 __SUP_COUT__ <<
"Launched async MacroMaker Macro '" << macroName
1426 <<
"' for interfaceID '" << interfaceID
1427 <<
"' with taskID=" << task->taskID << __E__;
1431 size_t sleepUs = 100;
1432 for(
int i = 0; i < 10; ++i)
1436 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1439 if(!task->error.empty())
1441 std::string errorCopy = task->error;
1442 for(
size_t j = 0; j < asyncMacroTasks_.size(); ++j)
1443 if(asyncMacroTasks_[j]->taskID == task->taskID)
1445 asyncMacroTasks_.erase(
1446 asyncMacroTasks_.begin() + j);
1449 __SUP_SS__ << errorCopy;
1453 <<
"DIAG ms=" << StringMacros::nowEpochMs()
1454 <<
" async macro finished within quick-wait,"
1455 <<
" returning synchronously, taskID=" << task->taskID
1457 retParameters.addParameter(
"outputArgs",
1459 for(
size_t j = 0; j < asyncMacroTasks_.size(); ++j)
1460 if(asyncMacroTasks_[j]->taskID == task->taskID)
1462 asyncMacroTasks_.erase(asyncMacroTasks_.begin() +
1466 return SOAPUtilities::makeSOAPMessageReference(
1467 supervisorClassNoNamespace_ +
"Response",
1477 __SUP_COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
1478 <<
" async macro NOT done within quick-wait,"
1479 <<
" returning NotDoneTaskID=" << task->taskID << __E__;
1480 retParameters.addParameter(
"NotDoneTaskID", std::to_string(task->taskID));
1481 return SOAPUtilities::makeSOAPMessageReference(
1482 supervisorClassNoNamespace_ +
"Response", retParameters);
1490 interfaceID, macroString, inputArgs, outputArgs);
1492 catch(std::runtime_error& e)
1494 __SUP_SS__ <<
"In Supervisor with LID="
1495 << getApplicationDescriptor()->getLocalId()
1496 <<
" the MacroMaker Macro named '" << macroName
1497 <<
"' with target FE '" << interfaceID
1498 <<
"' failed. Here is the error:\n\n"
1499 << e.what() << __E__;
1504 __SUP_SS__ <<
"In Supervisor with LID="
1505 << getApplicationDescriptor()->getLocalId()
1506 <<
" the MacroMaker Macro named '" << macroName
1507 <<
"' with target FE '" << interfaceID
1508 <<
"' failed due to an unknown error." << __E__;
1513 catch(
const std::exception& e)
1515 ss <<
"Exception message: " << e.what();
1523 retParameters.addParameter(
"outputArgs", outputArgs);
1524 return SOAPUtilities::makeSOAPMessageReference(
1525 supervisorClassNoNamespace_ +
"Response", retParameters);
1528 else if(
request ==
"CheckMacro")
1531 requestParameters.addParameter(
"TaskID");
1532 SOAPUtilities::receive(message, requestParameters);
1533 uint64_t taskID = std::stoull(requestParameters.getValue(
"TaskID"));
1535 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1538 time_t now = time(0);
1539 for(
size_t i = 0; i < asyncMacroTasks_.size();)
1541 auto& t = asyncMacroTasks_[i];
1542 if(t->done && t->doneTime > 0 && (now - t->doneTime) > 5 * 60)
1543 asyncMacroTasks_.erase(asyncMacroTasks_.begin() + i);
1549 std::shared_ptr<AsyncMacroTask> foundTask;
1550 for(
auto& t : asyncMacroTasks_)
1552 if(t->taskID == taskID)
1561 __SUP_SS__ <<
"Async macro task with ID=" << taskID
1562 <<
" was not found. Perhaps it completed more than 5 "
1570 if(!foundTask->error.empty())
1572 std::string errorCopy = foundTask->error;
1574 for(
size_t i = 0; i < asyncMacroTasks_.size(); ++i)
1576 if(asyncMacroTasks_[i]->taskID == taskID)
1578 asyncMacroTasks_.erase(asyncMacroTasks_.begin() + i);
1582 __SUP_SS__ << errorCopy;
1586 __SUP_COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
1587 <<
" CheckMacro found task DONE (doneTime="
1588 << foundTask->doneTime <<
"), taskID=" << taskID << __E__;
1589 retParameters.addParameter(
"outputArgs", foundTask->outputArgs);
1592 for(
size_t i = 0; i < asyncMacroTasks_.size(); ++i)
1594 if(asyncMacroTasks_[i]->taskID == taskID)
1596 asyncMacroTasks_.erase(asyncMacroTasks_.begin() + i);
1601 return SOAPUtilities::makeSOAPMessageReference(
1602 supervisorClassNoNamespace_ +
"Response", retParameters);
1607 if(theFEInterfacesManager_ && foundTask->threadID != std::thread::id())
1611 int progress = theFEInterfacesManager_
1613 ->getFEMacroPercentDone(foundTask->threadID);
1615 retParameters.addParameter(
"Progress",
1616 std::to_string(progress));
1622 __SUP_COUT__ <<
"DIAG ms=" << StringMacros::nowEpochMs()
1623 <<
" CheckMacro found task still RUNNING, taskID=" << taskID
1625 retParameters.addParameter(
"NotDoneTaskID", std::to_string(taskID));
1626 return SOAPUtilities::makeSOAPMessageReference(
1627 supervisorClassNoNamespace_ +
"Response", retParameters);
1632 __SUP_SS__ <<
"Unrecognized request received! '" <<
request <<
"'" << __E__;
1636 catch(
const std::runtime_error& e)
1638 __SUP_SS__ <<
"Error occurred handling request: " << e.what() << __E__;
1639 __SUP_COUT_ERR__ << ss.str();
1640 retParameters.addParameter(
"Error", ss.str());
1644 __SUP_SS__ <<
"Error occurred handling request." << __E__;
1649 catch(
const std::exception& e)
1651 ss <<
"Exception message: " << e.what();
1656 __SUP_COUT_ERR__ << ss.str();
1657 retParameters.addParameter(
"Error", ss.str());
1660 return SOAPUtilities::makeSOAPMessageReference(
1661 supervisorClassNoNamespace_ +
"FailRequest", retParameters);
1666 xoap::MessageReference FESupervisor::workLoopStatusRequest(
1667 xoap::MessageReference )
1669 if(!theFEInterfacesManager_)
1671 __SUP_SS__ <<
"Invalid request for front-end workloop status from Supervisor "
1672 "without a FEVInterfacesManager."
1677 return SOAPUtilities::makeSOAPMessageReference(
1679 ? CoreSupervisorBase::WORK_LOOP_DONE
1680 : CoreSupervisorBase::WORK_LOOP_WORKING));
1693 theFEInterfacesManager_ = 0;
1695 for(
unsigned int i = 0; i < theStateMachineImplementation_.size(); ++i)
1699 theFEInterfacesManager_ =
1701 if(!theFEInterfacesManager_)
1704 __SUP_SS__ <<
"Dynamic cast failure!" << __E__;
1707 __SUP_COUT__ <<
"State Machine " << i <<
" WAS of type FEVInterfacesManager"
1714 __SUP_COUT__ <<
"State Machine " << i
1715 <<
" was NOT of type FEVInterfacesManager" << __E__;
1719 __SUP_COUT__ <<
"theFEInterfacesManager pointer = " << theFEInterfacesManager_
1722 return theFEInterfacesManager_;
1726 void FESupervisor::transitionConfiguring(toolbox::Event::Reference )
1728 __SUP_COUT__ <<
"transitionConfiguring" << __E__;
1729 CoreSupervisorBase::configureInit();
1734 __COUTV__(CorePropertySupervisorBase::getSupervisorConfigurationPath());
1737 CorePropertySupervisorBase::getSupervisorTableNode();
1739 std::string metric_string =
"";
1740 bool metricStringSetup =
true;
1743 std::ostringstream oss;
1744 std::string tabString =
"";
1745 std::string commentsString =
"";
1747 oss, tabString, commentsString,
"" , feSupervisorNode);
1748 metric_string = oss.str();
1752 metricStringSetup =
false;
1758 __SUP_COUT__ <<
"Metric manager is not instantiated! Attempting to fix."
1760 metricMan = std::make_unique<artdaq::MetricManager>();
1762 std::string metricNamePreamble =
1763 feSupervisorNode.
getNode(
"/SlowControlsMetricManagerChannelNamePreamble")
1765 __SUP_COUTV__(metricNamePreamble);
1768 fhicl::ParameterSet metric_pset = fhicl::ParameterSet::make(metric_string);
1770 __SUP_COUTV__(metricNamePreamble);
1773 metricMan->initialize(metric_pset.get<fhicl::ParameterSet>(
"metrics"),
1774 metricNamePreamble);
1778 if(metricStringSetup)
1781 __SUP_COUT__ <<
"Ignore metric manager initialize error because metric "
1782 "string is not setup."
1785 __SUP_COUT__ <<
"transitionConfiguring metric manager(" << metricMan
1786 <<
") initialized = " << metricMan->Initialized() << __E__;
1788 catch(
const std::runtime_error& e)
1790 __SS__ <<
"Error loading metrics in FESupervisor::transitionConfiguring(): "
1791 << e.what() << __E__;
1792 __SUP_COUT_ERR__ << ss.str();
1796 theStateMachine_.setErrorMessage(ss.str());
1797 throw toolbox::fsm::exception::Exception(
1798 "Transition Error" ,
1800 "FESupervisor::transitionConfiguring" ,
1807 __SS__ <<
"Error loading metrics in FESupervisor::transitionConfiguring()"
1813 catch(
const std::exception& e)
1815 ss <<
"Exception message: " << e.what();
1820 __SUP_COUT_ERR__ << ss.str();
1824 theStateMachine_.setErrorMessage(ss.str());
1825 throw toolbox::fsm::exception::Exception(
1826 "Transition Error" ,
1828 "FESupervisor::transitionConfiguring" ,
1834 CoreSupervisorBase::transitionConfiguringFSMs();
1836 __SUP_COUT__ <<
"transitionConfiguring done." << __E__;
1842 __SUP_COUT__ <<
"transitionHalting" << __E__;
1843 TLOG_DEBUG(7) <<
"transitionHalting";
1847 const int timeoutSeconds = 30;
1848 const time_t deadline = time(0) + timeoutSeconds;
1849 bool hasOutstanding =
true;
1850 while(hasOutstanding && time(0) < deadline)
1853 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1854 hasOutstanding =
false;
1855 for(
const auto& t : asyncMacroTasks_)
1859 hasOutstanding =
true;
1866 __SUP_COUT__ <<
"Waiting for outstanding async macro tasks to complete "
1873 __SUP_COUT_WARN__ <<
"Timed out waiting for async macro tasks; "
1874 "proceeding with halt."
1876 std::lock_guard<std::mutex> lock(asyncMacroMutex_);
1877 asyncMacroTasks_.clear();
1885 if(metricMan && metricMan->Initialized())
1887 TLOG_DEBUG(7) <<
"Metric manager(" << metricMan <<
") shutting down..."
1891 TLOG_DEBUG(7) <<
"Metric manager shutdown." << __E__;
1894 __SUP_COUT__ <<
"Metric manager(" << metricMan <<
") already shutdown."
1897 metricMan.reset(
nullptr);
1901 __SS__ <<
"Error shutting down metrics in FESupervisor::transitionHalting()"
1907 catch(
const std::exception& e)
1909 ss <<
"Exception message: " << e.what();
1914 __SUP_COUT_ERR__ << ss.str();
1918 theStateMachine_.setErrorMessage(ss.str());
1919 throw toolbox::fsm::exception::Exception(
1920 "Transition Error" ,
1922 "FESupervisor::transitionHalting" ,
1928 __SUP_COUT__ <<
"transitionHalting done." << __E__;
1933 const std::string& topic)
1935 if(dp_isInitialized_)
1942 dp_endpoint_ = endpoint;
1948 dp_socket_.bind(dp_endpoint_);
1950 catch(
const zmq::error_t& e)
1952 __SUP_SS__ <<
"initDataPublishing() - bind to zmq '" + dp_endpoint_ +
1953 "' failed: " + e.what()
1958 dp_isInitialized_ =
true;
1964 if(dp_isInitialized_)
1968 dp_socket_.set(zmq::sockopt::linger, 0);
1971 catch(
const zmq::error_t&)
1977 if(alsoCloseContext)
1978 dp_context_.close();
1980 catch(
const zmq::error_t&)
1984 dp_isInitialized_ =
false;
1998 if(!dp_isInitialized_)
2000 __SUP_SS__ <<
"publishData() called before zmq init()" << __E__;
2006 auto rc_topic = dp_socket_.send(zmq::buffer(dp_topic_), zmq::send_flags::sndmore);
2009 __SUP_SS__ <<
"publishData() - failed to send zmq topic" << __E__;
2015 if(dataPtr ==
nullptr && dataSize > 0)
2017 __SUP_SS__ <<
"FESupervisor::publishData() - dataPtr is nullptr but dataSize is "
2018 << dataSize << __E__;
2022 dp_socket_.send(zmq::buffer(dataPtr, dataSize), zmq::send_flags::none);
2025 __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
T getValueWithDefault(const T &defaultValue) 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)
bool checkMacroMultiDimensional(const std::string &interfaceID, const std::string ¯oName, std::string *outputFile=nullptr)
used by iterator calling (i.e. FESupervisor); on Done, outputFile receives the saved-output path ("" ...
unsigned int getInterfaceUniversalDataSize(const std::string &interfaceID)
used by MacroMaker
void universalRead(const std::string &interfaceID, char *address, char *returnValue)
used by MacroMaker
std::map< std::string, std::string > getFEMacroInputDefaults(const std::string &interfaceID, const std::string &feMacroName, const std::string &inputArgs)
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)
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=": ")