1 #include "otsdaq-core/CoreSupervisors/FESupervisor.h"
2 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
3 #include "otsdaq-core/FECore/FEVInterfacesManager.h"
14 &FESupervisor::macroMakerSupervisorRequest,
15 "MacroMakerSupervisorRequest",
19 this, &FESupervisor::workLoopStatusRequest,
"WorkLoopStatusRequest", XDAQ_NS_URI);
22 &FESupervisor::frontEndCommunicationRequest,
27 CorePropertySupervisorBase::getContextTreeNode(),
28 CorePropertySupervisorBase::getSupervisorConfigurationPath()));
30 extractFEInterfacesManager();
32 __SUP_COUT__ <<
"Destructed." << __E__;
36 FESupervisor::~FESupervisor(
void)
38 __SUP_COUT__ <<
"Destroying..." << __E__;
41 __SUP_COUT__ <<
"Destructed." << __E__;
45 xoap::MessageReference FESupervisor::frontEndCommunicationRequest(
46 xoap::MessageReference message)
try
48 __SUP_COUT__ <<
"FE Request received: " << SOAPUtilities::translate(message) << __E__;
50 if(!theFEInterfacesManager_)
52 __SUP_SS__ <<
"No FE Interface Manager!" << __E__;
56 typeParameter.addParameter(
"type");
57 SOAPUtilities::receive(message, typeParameter);
59 std::string type = typeParameter.getValue(
"type");
69 rxParameters.addParameter(
"requester");
70 rxParameters.addParameter(
"targetInterfaceID");
76 rxParameters.addParameter(
"value");
77 SOAPUtilities::receive(message, rxParameters);
79 std::string requester = rxParameters.getValue(
"requester");
80 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
81 std::string value = rxParameters.getValue(
"value");
83 __SUP_COUTV__(requester);
84 __SUP_COUTV__(targetInterfaceID);
88 theFEInterfacesManager_->getFEInterface(targetInterfaceID);
92 std::lock_guard<std::mutex> lock(
93 theFEInterfacesManager_->frontEndCommunicationReceiveMutex_);
95 theFEInterfacesManager_
96 ->frontEndCommunicationReceiveBuffer_[targetInterfaceID][requester]
99 __SUP_COUT__ <<
"Number of target interface ID '" << targetInterfaceID
101 << theFEInterfacesManager_
102 ->frontEndCommunicationReceiveBuffer_[targetInterfaceID]
106 <<
"Number of source interface ID '" << requester <<
"' values received: "
107 << theFEInterfacesManager_
108 ->frontEndCommunicationReceiveBuffer_[targetInterfaceID][requester]
112 return SOAPUtilities::makeSOAPMessageReference(
"Received");
114 else if(type ==
"feMacro")
118 rxParameters.addParameter(
"feMacroName");
119 rxParameters.addParameter(
"inputArgs");
121 SOAPUtilities::receive(message, rxParameters);
123 std::string requester = rxParameters.getValue(
"requester");
124 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
125 std::string feMacroName = rxParameters.getValue(
"feMacroName");
126 std::string inputArgs = rxParameters.getValue(
"inputArgs");
128 __SUP_COUTV__(requester);
129 __SUP_COUTV__(targetInterfaceID);
130 __SUP_COUTV__(feMacroName);
131 __SUP_COUTV__(inputArgs);
133 std::string outputArgs;
136 theFEInterfacesManager_->runFEMacroByFE(
137 requester, targetInterfaceID, feMacroName, inputArgs, outputArgs);
139 catch(std::runtime_error& e)
141 __SUP_SS__ <<
"In Supervisor with LID="
142 << getApplicationDescriptor()->getLocalId()
143 <<
" the FE Macro named '" << feMacroName <<
"' with target FE '"
144 << targetInterfaceID <<
"' failed. Here is the error:\n\n"
145 << e.what() << __E__;
150 __SUP_SS__ <<
"In Supervisor with LID="
151 << getApplicationDescriptor()->getLocalId()
152 <<
" the FE Macro named '" << feMacroName <<
"' with target FE '"
153 << targetInterfaceID <<
"' failed due to an unknown error."
158 __SUP_COUTV__(outputArgs);
160 xoap::MessageReference replyMessage =
161 SOAPUtilities::makeSOAPMessageReference(
"feMacrosResponse");
163 txParameters.addParameter(
"requester", requester);
164 txParameters.addParameter(
"targetInterfaceID", targetInterfaceID);
165 txParameters.addParameter(
"feMacroName", feMacroName);
166 txParameters.addParameter(
"outputArgs", outputArgs);
167 SOAPUtilities::addParameters(replyMessage, txParameters);
169 __SUP_COUT__ <<
"Sending FE macro result: "
170 << SOAPUtilities::translate(replyMessage) << __E__;
174 else if(type ==
"feMacroMultiDimensionalStart" ||
175 type ==
"macroMultiDimensionalStart")
181 rxParameters.addParameter(
"macroString");
182 rxParameters.addParameter(
"macroName");
185 rxParameters.addParameter(
"feMacroName");
187 rxParameters.addParameter(
"enableSavingOutput");
188 rxParameters.addParameter(
"outputFilePath");
189 rxParameters.addParameter(
"outputFileRadix");
190 rxParameters.addParameter(
"inputArgs");
192 SOAPUtilities::receive(message, rxParameters);
194 std::string requester = rxParameters.getValue(
"requester");
195 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
196 std::string macroName, macroString;
199 macroName = rxParameters.getValue(
"macroName");
200 macroString = rxParameters.getValue(
"macroString");
201 __SUP_COUTV__(macroString);
204 macroName = rxParameters.getValue(
"feMacroName");
205 bool enableSavingOutput = rxParameters.getValue(
"enableSavingOutput") ==
"1";
206 std::string outputFilePath = rxParameters.getValue(
"outputFilePath");
207 std::string outputFileRadix = rxParameters.getValue(
"outputFileRadix");
208 std::string inputArgs = rxParameters.getValue(
"inputArgs");
210 __SUP_COUTV__(requester);
211 __SUP_COUTV__(targetInterfaceID);
212 __SUP_COUTV__(macroName);
213 __SUP_COUTV__(enableSavingOutput);
214 __SUP_COUTV__(outputFilePath);
215 __SUP_COUTV__(outputFileRadix);
216 __SUP_COUTV__(inputArgs);
231 catch(std::runtime_error& e)
233 __SUP_SS__ <<
"In Supervisor with LID="
234 << getApplicationDescriptor()->getLocalId()
235 <<
" the Macro named '" << macroName <<
"' with target FE '"
237 <<
"' failed to start multi-dimensional launch. "
238 <<
"Here is the error:\n\n"
239 << e.what() << __E__;
244 __SUP_SS__ <<
"In Supervisor with LID="
245 << getApplicationDescriptor()->getLocalId()
246 <<
" the Macro named '" << macroName <<
"' with target FE '"
248 <<
"' failed to start multi-dimensional launch "
249 <<
"due to an unknown error." << __E__;
257 theFEInterfacesManager_->startFEMacroMultiDimensional(requester,
265 catch(std::runtime_error& e)
267 __SUP_SS__ <<
"In Supervisor with LID="
268 << getApplicationDescriptor()->getLocalId()
269 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
271 <<
"' failed to start multi-dimensional launch. "
272 <<
"Here is the error:\n\n"
273 << e.what() << __E__;
278 __SUP_SS__ <<
"In Supervisor with LID="
279 << getApplicationDescriptor()->getLocalId()
280 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
282 <<
"' failed to start multi-dimensional launch "
283 <<
"due to an unknown error." << __E__;
288 xoap::MessageReference replyMessage =
289 SOAPUtilities::makeSOAPMessageReference(type +
"Done");
292 SOAPUtilities::addParameters(replyMessage, txParameters);
294 __SUP_COUT__ <<
"Sending FE macro result: "
295 << SOAPUtilities::translate(replyMessage) << __E__;
299 else if(type ==
"feMacroMultiDimensionalCheck" ||
300 type ==
"macroMultiDimensionalCheck")
304 rxParameters.addParameter(
"macroName");
306 rxParameters.addParameter(
"feMacroName");
307 rxParameters.addParameter(
"targetInterfaceID");
309 SOAPUtilities::receive(message, rxParameters);
311 std::string targetInterfaceID = rxParameters.getValue(
"targetInterfaceID");
312 std::string macroName;
314 macroName = rxParameters.getValue(
"macroName");
316 macroName = rxParameters.getValue(
"feMacroName");
318 __SUP_COUTV__(targetInterfaceID);
319 __SUP_COUTV__(macroName);
324 done = theFEInterfacesManager_->checkMacroMultiDimensional(targetInterfaceID,
327 catch(std::runtime_error& e)
329 __SUP_SS__ <<
"In Supervisor with LID="
330 << getApplicationDescriptor()->getLocalId()
331 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
333 <<
"' failed to check multi-dimensional launch. "
334 <<
"Here is the error:\n\n"
335 << e.what() << __E__;
340 __SUP_SS__ <<
"In Supervisor with LID="
341 << getApplicationDescriptor()->getLocalId()
342 <<
" the FE Macro named '" << macroName <<
"' with target FE '"
344 <<
"' failed to check multi-dimensional launch "
345 <<
"due to an unknown error." << __E__;
349 xoap::MessageReference replyMessage =
350 SOAPUtilities::makeSOAPMessageReference(type +
"Done");
352 txParameters.addParameter(
"Done", done ?
"1" :
"0");
353 SOAPUtilities::addParameters(replyMessage, txParameters);
355 __SUP_COUT__ <<
"Sending FE macro result: "
356 << SOAPUtilities::translate(replyMessage) << __E__;
362 __SUP_SS__ <<
"Unrecognized FE Communication type: " << type << __E__;
366 catch(
const std::runtime_error& e)
368 __SUP_SS__ <<
"Error encountered processing FE communication request: " << e.what()
370 __SUP_COUT_ERR__ << ss.str();
373 parameters.addParameter(
"Error", ss.str());
374 return SOAPUtilities::makeSOAPMessageReference(
375 supervisorClassNoNamespace_ +
"FailFECommunicationRequest", parameters);
379 __SUP_SS__ <<
"Unknown error encountered processing FE communication request."
381 __SUP_COUT_ERR__ << ss.str();
384 parameters.addParameter(
"Error", ss.str());
385 return SOAPUtilities::makeSOAPMessageReference(
386 supervisorClassNoNamespace_ +
"FailFECommunicationRequest", parameters);
396 xoap::MessageReference FESupervisor::macroMakerSupervisorRequest(
397 xoap::MessageReference message)
399 __SUP_COUT__ <<
"$$$$$$$$$$$$$$$$$" << __E__;
403 parameters.addParameter(
"Request");
405 __SUP_COUT__ <<
"Received Macro Maker message: " << SOAPUtilities::translate(message)
408 SOAPUtilities::receive(message, parameters);
409 std::string request = parameters.getValue(
"Request");
411 __SUP_COUT__ <<
"request: " << request << __E__;
425 if(request ==
"GetInterfaces")
427 if(theFEInterfacesManager_)
428 retParameters.addParameter(
430 theFEInterfacesManager_->getFEListString(
431 std::to_string(getApplicationDescriptor()->getLocalId())));
433 retParameters.addParameter(
"FEList",
"");
435 return SOAPUtilities::makeSOAPMessageReference(
436 supervisorClassNoNamespace_ +
"Response", retParameters);
438 else if(request ==
"UniversalWrite")
440 if(!theFEInterfacesManager_)
442 __SUP_SS__ <<
"No FE Interface Manager! Are you configured?" << __E__;
447 requestParameters.addParameter(
"InterfaceID");
448 requestParameters.addParameter(
"Address");
449 requestParameters.addParameter(
"Data");
450 SOAPUtilities::receive(message, requestParameters);
451 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
452 std::string addressStr = requestParameters.getValue(
"Address");
453 std::string dataStr = requestParameters.getValue(
"Data");
455 __SUP_COUT__ <<
"Address: " << addressStr <<
" Data: " << dataStr
456 <<
" InterfaceID: " << interfaceID << __E__;
463 <<
"theFEInterfacesManager_->getInterfaceUniversalAddressSize(index) "
464 << theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID)
467 <<
"theFEInterfacesManager_->getInterfaceUniversalDataSize(index) "
468 << theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID)
477 __SUP_COUT__ <<
"Translating address: ";
479 std::string addressTmp;
481 theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID));
482 char* address = &addressTmp[0];
484 if(addressStr.size() % 2)
485 addressStr =
"0" + addressStr;
487 for(; i < addressStr.size() &&
488 i / 2 < theFEInterfacesManager_->getInterfaceUniversalAddressSize(
492 tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
493 tmpHex[1] = addressStr[addressStr.size() - 1 - i];
494 sscanf(tmpHex,
"%hhX", (
unsigned char*)&address[i / 2]);
495 printf(
"%2.2X", (
unsigned char)address[i / 2]);
499 theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID);
503 printf(
"%2.2X", (
unsigned char)address[i / 2]);
508 __SUP_COUT__ <<
"Translating data: ";
512 theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID));
513 char* data = &dataTmp[0];
515 if(dataStr.size() % 2)
516 dataStr =
"0" + dataStr;
519 for(; i < dataStr.size() &&
521 theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID);
524 tmpHex[0] = dataStr[dataStr.size() - 1 - i - 1];
525 tmpHex[1] = dataStr[dataStr.size() - 1 - i];
526 sscanf(tmpHex,
"%hhX", (
unsigned char*)&data[i / 2]);
527 printf(
"%2.2X", (
unsigned char)data[i / 2]);
531 theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID);
535 printf(
"%2.2X", (
unsigned char)data[i / 2]);
547 theFEInterfacesManager_->universalWrite(interfaceID, address, data);
552 return SOAPUtilities::makeSOAPMessageReference(
553 supervisorClassNoNamespace_ +
"DataWritten", retParameters);
555 else if(request ==
"UniversalRead")
557 if(!theFEInterfacesManager_)
559 __SUP_SS__ <<
"No FE Interface Manager! Are you configured?" << __E__;
565 requestParameters.addParameter(
"InterfaceID");
566 requestParameters.addParameter(
"Address");
567 SOAPUtilities::receive(message, requestParameters);
568 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
569 std::string addressStr = requestParameters.getValue(
"Address");
571 __SUP_COUT__ <<
"Address: " << addressStr <<
" InterfaceID: " << interfaceID
580 <<
"theFEInterfacesManager_->getInterfaceUniversalAddressSize(index) "
581 << theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID)
584 <<
"theFEInterfacesManager_->getInterfaceUniversalDataSize(index) "
585 << theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID)
591 __SUP_COUT__ <<
"Translating address: ";
593 std::string addressTmp;
595 theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID));
596 char* address = &addressTmp[0];
598 if(addressStr.size() % 2)
599 addressStr =
"0" + addressStr;
602 for(; i < addressStr.size() &&
603 i / 2 < theFEInterfacesManager_->getInterfaceUniversalAddressSize(
607 tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
608 tmpHex[1] = addressStr[addressStr.size() - 1 - i];
609 sscanf(tmpHex,
"%hhX", (
unsigned char*)&address[i / 2]);
610 printf(
"%2.2X", (
unsigned char)address[i / 2]);
614 theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID);
618 printf(
"%2.2X", (
unsigned char)address[i / 2]);
623 unsigned int dataSz =
624 theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID);
626 dataStr.resize(dataSz);
627 char* data = &dataStr[0];
635 theFEInterfacesManager_->universalRead(interfaceID, address, data);
637 catch(
const std::runtime_error& e)
641 __MOUT_ERR__ <<
"Exception caught during read: " << e.what() << __E__;
642 __SUP_COUT_ERR__ <<
"Exception caught during read: " << e.what() << __E__;
643 retParameters.addParameter(
"dataResult",
"Time Out Error");
644 return SOAPUtilities::makeSOAPMessageReference(
645 supervisorClassNoNamespace_ +
"aa", retParameters);
651 __MOUT_ERR__ <<
"Exception caught during read." << __E__;
652 __SUP_COUT_ERR__ <<
"Exception caught during read." << __E__;
653 retParameters.addParameter(
"dataResult",
"Time Out Error");
654 return SOAPUtilities::makeSOAPMessageReference(
655 supervisorClassNoNamespace_ +
"aa", retParameters);
661 std::string str8(data);
663 __SUP_COUT__ <<
"decResult[" << dataSz
664 <<
" bytes]: " << *((
unsigned long long*)(&str8[0]))
668 std::string hexResultStr;
669 hexResultStr.reserve(dataSz * 2 + 1);
670 char* hexResult = &hexResultStr[0];
674 for(
unsigned int i = 0; i < dataSz; ++i)
676 sprintf(&hexResult[i * 2],
"%2.2X", (
unsigned char)data[dataSz - 1 - i]);
679 __SUP_COUT__ <<
"hexResult[" << strlen(hexResult)
680 <<
" nibbles]: " << std::string(hexResult) << __E__;
682 retParameters.addParameter(
"dataResult", hexResult);
683 return SOAPUtilities::makeSOAPMessageReference(
684 supervisorClassNoNamespace_ +
"aa", retParameters);
686 else if(request ==
"GetInterfaceMacros")
688 if(theFEInterfacesManager_)
689 retParameters.addParameter(
691 theFEInterfacesManager_->getFEMacrosString(
692 CorePropertySupervisorBase::getSupervisorUID(),
694 CoreSupervisorBase::getSupervisorLID())));
696 retParameters.addParameter(
"FEMacros",
"");
698 return SOAPUtilities::makeSOAPMessageReference(
699 supervisorClassNoNamespace_ +
"Response", retParameters);
701 else if(request ==
"RunInterfaceMacro")
703 if(!theFEInterfacesManager_)
705 __SUP_SS__ <<
"Missing FE Interface Manager! Are you configured?"
712 requestParameters.addParameter(
"feMacroName");
713 requestParameters.addParameter(
"inputArgs");
714 requestParameters.addParameter(
"outputArgs");
715 requestParameters.addParameter(
"InterfaceID");
716 SOAPUtilities::receive(message, requestParameters);
717 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
718 std::string feMacroName = requestParameters.getValue(
"feMacroName");
719 std::string inputArgs = requestParameters.getValue(
"inputArgs");
720 std::string outputArgs = requestParameters.getValue(
"outputArgs");
726 theFEInterfacesManager_->runFEMacro(
727 interfaceID, feMacroName, inputArgs, outputArgs);
729 catch(std::runtime_error& e)
731 __SUP_SS__ <<
"In Supervisor with LID="
732 << getApplicationDescriptor()->getLocalId()
733 <<
" the FE Macro named '" << feMacroName
734 <<
"' with target FE '" << interfaceID
735 <<
"' failed. Here is the error:\n\n"
736 << e.what() << __E__;
741 __SUP_SS__ <<
"In Supervisor with LID="
742 << getApplicationDescriptor()->getLocalId()
743 <<
" the FE Macro named '" << feMacroName
744 <<
"' with target FE '" << interfaceID
745 <<
"' failed due to an unknown error." << __E__;
750 retParameters.addParameter(
"outputArgs", outputArgs);
752 return SOAPUtilities::makeSOAPMessageReference(
753 supervisorClassNoNamespace_ +
"Response", retParameters);
755 else if(request ==
"RunMacroMakerMacro")
757 if(!theFEInterfacesManager_)
759 __SUP_SS__ <<
"Missing FE Interface Manager! Are you configured?"
766 requestParameters.addParameter(
"macroName");
767 requestParameters.addParameter(
"macroString");
768 requestParameters.addParameter(
"inputArgs");
769 requestParameters.addParameter(
"outputArgs");
770 requestParameters.addParameter(
"InterfaceID");
771 SOAPUtilities::receive(message, requestParameters);
772 std::string interfaceID = requestParameters.getValue(
"InterfaceID");
773 std::string macroName = requestParameters.getValue(
"macroName");
774 std::string macroString = requestParameters.getValue(
"macroString");
775 std::string inputArgs = requestParameters.getValue(
"inputArgs");
776 std::string outputArgs = requestParameters.getValue(
"outputArgs");
782 theFEInterfacesManager_->runMacro(
783 interfaceID, macroString, inputArgs, outputArgs);
785 catch(std::runtime_error& e)
787 __SUP_SS__ <<
"In Supervisor with LID="
788 << getApplicationDescriptor()->getLocalId()
789 <<
" the MacroMaker Macro named '" << macroName
790 <<
"' with target FE '" << interfaceID
791 <<
"' failed. Here is the error:\n\n"
792 << e.what() << __E__;
797 __SUP_SS__ <<
"In Supervisor with LID="
798 << getApplicationDescriptor()->getLocalId()
799 <<
" the MacroMaker Macro named '" << macroName
800 <<
"' with target FE '" << interfaceID
801 <<
"' failed due to an unknown error." << __E__;
805 retParameters.addParameter(
"outputArgs", outputArgs);
807 return SOAPUtilities::makeSOAPMessageReference(
808 supervisorClassNoNamespace_ +
"Response", retParameters);
812 __SUP_SS__ <<
"Unrecognized request received! '" << request <<
"'" << __E__;
816 catch(
const std::runtime_error& e)
818 __SUP_SS__ <<
"Error occurred handling request: " << e.what() << __E__;
819 __SUP_COUT_ERR__ << ss.str();
820 retParameters.addParameter(
"Error", ss.str());
824 __SUP_SS__ <<
"Error occurred handling request." << __E__;
825 __SUP_COUT_ERR__ << ss.str();
826 retParameters.addParameter(
"Error", ss.str());
829 return SOAPUtilities::makeSOAPMessageReference(
830 supervisorClassNoNamespace_ +
"FailRequest", retParameters);
835 xoap::MessageReference FESupervisor::workLoopStatusRequest(xoap::MessageReference message)
837 if(!theFEInterfacesManager_)
839 __SUP_SS__ <<
"Invalid request for front-end workloop status from Supervisor "
840 "without a FEVInterfacesManager."
845 return SOAPUtilities::makeSOAPMessageReference(
846 (theFEInterfacesManager_->allFEWorkloopsAreDone()
847 ? CoreSupervisorBase::WORK_LOOP_DONE
848 : CoreSupervisorBase::WORK_LOOP_WORKING));
861 theFEInterfacesManager_ = 0;
863 for(
unsigned int i = 0; i < theStateMachineImplementation_.size(); ++i)
867 theFEInterfacesManager_ =
869 if(!theFEInterfacesManager_)
872 __SUP_SS__ <<
"Dynamic cast failure!" << __E__;
875 __SUP_COUT__ <<
"State Machine " << i <<
" WAS of type FEVInterfacesManager"
882 __SUP_COUT__ <<
"State Machine " << i
883 <<
" was NOT of type FEVInterfacesManager" << __E__;
887 __SUP_COUT__ <<
"theFEInterfacesManager pointer = " << theFEInterfacesManager_
890 return theFEInterfacesManager_;
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)