1 #include "otsdaq-core/CoreSupervisors/FESupervisor.h"
2 #include "otsdaq-core/FECore/FEVInterfacesManager.h"
3 #include "otsdaq-core/ConfigurationInterface/ConfigurationManager.h"
4 #include "otsdaq-core/FECore/FEVInterfacesManager.h"
17 xoap::bind(
this, &FESupervisor::macroMakerSupervisorRequest,
"MacroMakerSupervisorRequest", XDAQ_NS_URI);
18 xoap::bind(
this, &FESupervisor::workLoopStatusRequest,
"WorkLoopStatusRequest", XDAQ_NS_URI);
20 CoreSupervisorBase::theStateMachineImplementation_.push_back(
22 CoreSupervisorBase::theConfigurationManager_->getNode(CoreSupervisorBase::XDAQContextConfigurationName_),
23 CoreSupervisorBase::supervisorConfigurationPath_
30 FESupervisor::~FESupervisor(
void)
43 xoap::MessageReference FESupervisor::macroMakerSupervisorRequest(
44 xoap::MessageReference message)
45 throw (xoap::exception::Exception)
47 __COUT__ <<
"$$$$$$$$$$$$$$$$$" << std::endl;
54 parameters.addParameter(
"Request");
55 parameters.addParameter(
"InterfaceID");
58 parameters.addParameter(
"Address");
59 parameters.addParameter(
"Data");
62 parameters.addParameter(
"feMacroName");
63 parameters.addParameter(
"inputArgs");
64 parameters.addParameter(
"outputArgs");
66 SOAPMessenger::receive(message, parameters);
67 std::string request = parameters.getValue(
"Request");
68 std::string addressStr = parameters.getValue(
"Address");
69 std::string dataStr = parameters.getValue(
"Data");
70 std::string InterfaceID = parameters.getValue(
"InterfaceID");
72 __COUT__ <<
"request: " << request << std::endl;
74 __COUT__ <<
"Address: " << addressStr <<
" Data: "
75 << dataStr <<
" InterfaceID: " << InterfaceID << std::endl;
81 if (request ==
"GetInterfaces")
83 if (theFEInterfacesManager)
84 retParameters.addParameter(
"FEList",
85 theFEInterfacesManager->getFEListString(
86 std::to_string(getApplicationDescriptor()->getLocalId())));
88 retParameters.addParameter(
"FEList",
"");
90 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"Response",
93 else if (request ==
"UniversalWrite")
95 if (!theFEInterfacesManager)
97 __COUT_INFO__ <<
"No FE Interface Manager! (So no write occurred)" << std::endl;
98 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"DataWritten", retParameters);
106 __COUT__ <<
"theFEInterfacesManager->getInterfaceUniversalAddressSize(index) " <<
107 theFEInterfacesManager->getInterfaceUniversalAddressSize(InterfaceID) << std::endl;
108 __COUT__ <<
"theFEInterfacesManager->getInterfaceUniversalDataSize(index) " <<
109 theFEInterfacesManager->getInterfaceUniversalDataSize(InterfaceID) << std::endl;
118 __COUT__ <<
"Translating address: ";
120 std::string addressTmp; addressTmp.reserve(theFEInterfacesManager->getInterfaceUniversalAddressSize(InterfaceID));
121 char* address = &addressTmp[0];
123 if (addressStr.size() % 2)
124 addressStr =
"0" + addressStr;
126 for (; i < addressStr.size() &&
127 i / 2 < theFEInterfacesManager->getInterfaceUniversalAddressSize(InterfaceID); i += 2)
129 tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
130 tmpHex[1] = addressStr[addressStr.size() - 1 - i];
131 sscanf(tmpHex,
"%hhX", (
unsigned char*)&address[i / 2]);
132 printf(
"%2.2X", (
unsigned char)address[i / 2]);
135 for (; i / 2 < theFEInterfacesManager->getInterfaceUniversalAddressSize(InterfaceID); i += 2)
138 printf(
"%2.2X", (
unsigned char)address[i / 2]);
141 std::cout << std::endl;
143 __COUT__ <<
"Translating data: ";
145 std::string dataTmp; dataTmp.reserve(theFEInterfacesManager->getInterfaceUniversalDataSize(InterfaceID));
146 char* data = &dataTmp[0];
148 if (dataStr.size() % 2)
149 dataStr =
"0" + dataStr;
152 for (; i < dataStr.size() &&
153 i / 2 < theFEInterfacesManager->getInterfaceUniversalDataSize(InterfaceID); i += 2)
155 tmpHex[0] = dataStr[dataStr.size() - 1 - i - 1];
156 tmpHex[1] = dataStr[dataStr.size() - 1 - i];
157 sscanf(tmpHex,
"%hhX", (
unsigned char*)&data[i / 2]);
158 printf(
"%2.2X", (
unsigned char)data[i / 2]);
161 for (; i / 2 < theFEInterfacesManager->getInterfaceUniversalDataSize(InterfaceID); i += 2)
164 printf(
"%2.2X", (
unsigned char)data[i / 2]);
167 std::cout << std::endl;
176 theFEInterfacesManager->universalWrite(InterfaceID, address, data);
181 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"DataWritten", retParameters);
183 else if (request ==
"UniversalRead")
185 if (!theFEInterfacesManager)
187 __COUT_INFO__ <<
"No FE Interface Manager! (So no read occurred)" << std::endl;
188 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"aa", retParameters);
195 __COUT__ <<
"theFEInterfacesManager->getInterfaceUniversalAddressSize(index) "
196 << theFEInterfacesManager->getInterfaceUniversalAddressSize(InterfaceID) << std::endl;
197 __COUT__ <<
"theFEInterfacesManager->getInterfaceUniversalDataSize(index) "
198 << theFEInterfacesManager->getInterfaceUniversalDataSize(InterfaceID) << std::endl;
204 __COUT__ <<
"Translating address: ";
206 std::string addressTmp; addressTmp.reserve(theFEInterfacesManager->getInterfaceUniversalAddressSize(InterfaceID));
207 char* address = &addressTmp[0];
209 if (addressStr.size() % 2)
210 addressStr =
"0" + addressStr;
213 for (; i < addressStr.size() &&
214 i / 2 < theFEInterfacesManager->getInterfaceUniversalAddressSize(InterfaceID); i += 2)
216 tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
217 tmpHex[1] = addressStr[addressStr.size() - 1 - i];
218 sscanf(tmpHex,
"%hhX", (
unsigned char*)&address[i / 2]);
219 printf(
"%2.2X", (
unsigned char)address[i / 2]);
222 for (; i / 2 < theFEInterfacesManager->getInterfaceUniversalAddressSize(InterfaceID); i += 2)
225 printf(
"%2.2X", (
unsigned char)address[i / 2]);
228 std::cout << std::endl;
230 unsigned int dataSz = theFEInterfacesManager->getInterfaceUniversalDataSize(InterfaceID);
231 std::string dataStr; dataStr.resize(dataSz);
232 char* data = &dataStr[0];
240 if (theFEInterfacesManager->universalRead(InterfaceID, address, data) < 0)
242 retParameters.addParameter(
"dataResult",
"Time Out Error");
243 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"aa", retParameters);
246 catch (
const std::runtime_error& e)
249 __MOUT_ERR__ <<
"Exception caught during read: " << e.what() << std::endl;
250 __COUT_ERR__ <<
"Exception caught during read: " << e.what() << std::endl;
251 retParameters.addParameter(
"dataResult",
"Time Out Error");
252 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"aa", retParameters);
257 __MOUT_ERR__ <<
"Exception caught during read." << std::endl;
258 __COUT_ERR__ <<
"Exception caught during read." << std::endl;
259 retParameters.addParameter(
"dataResult",
"Time Out Error");
260 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"aa", retParameters);
266 std::string str8(data);
268 __COUT__ <<
"decResult[" << dataSz <<
" bytes]: " <<
269 *((
unsigned long long *)(&str8[0])) << std::endl;
273 std::string hexResultStr;
274 hexResultStr.reserve(dataSz * 2 + 1);
275 char* hexResult = &hexResultStr[0];
279 for (
unsigned int i = 0; i < dataSz; ++i)
281 sprintf(&hexResult[i * 2],
"%2.2X", (
unsigned char)data[dataSz - 1 - i]);
284 __COUT__ <<
"hexResult[" << strlen(hexResult) <<
" nibbles]: " << std::string(hexResult) << std::endl;
288 retParameters.addParameter(
"dataResult", hexResult);
289 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"aa", retParameters);
292 else if (request ==
"GetInterfaceMacros")
294 if (theFEInterfacesManager)
295 retParameters.addParameter(
"FEMacros", theFEInterfacesManager->getFEMacrosString(
296 std::to_string(getApplicationDescriptor()->getLocalId())));
298 retParameters.addParameter(
"FEMacros",
"");
300 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"Response",
303 else if (request ==
"RunInterfaceMacro")
305 if (!theFEInterfacesManager)
307 retParameters.addParameter(
"success",
"0");
308 retParameters.addParameter(
"outputArgs",
"");
309 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"Response",
313 std::string feMacroName = parameters.getValue(
"feMacroName");
314 std::string inputArgs = parameters.getValue(
"inputArgs");
315 std::string outputArgs = parameters.getValue(
"outputArgs");
322 theFEInterfacesManager->runFEMacro(InterfaceID, feMacroName, inputArgs, outputArgs);
324 catch (std::runtime_error &e)
326 __SS__ <<
"In Supervisor with LID=" << getApplicationDescriptor()->getLocalId()
327 <<
" the FE Macro named '" << feMacroName <<
"' with tartget FE '"
328 << InterfaceID <<
"' failed. Here is the error:\n\n" << e.what() << std::endl;
329 __COUT_ERR__ <<
"\n" << ss.str();
331 outputArgs = ss.str();
335 retParameters.addParameter(
"success", success ?
"1" :
"0");
336 retParameters.addParameter(
"outputArgs", outputArgs);
338 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"Response",
343 __COUT_WARN__ <<
"Unrecognized request received! '" << request <<
"'" << std::endl;
346 catch (
const std::runtime_error& e)
348 __SS__ <<
"Error occurred handling request: " << e.what() << __E__;
349 __COUT_ERR__ << ss.str();
353 __SS__ <<
"Error occurred handling request." << __E__;
354 __COUT_ERR__ << ss.str();
359 return SOAPUtilities::makeSOAPMessageReference(supervisorClassNoNamespace_ +
"FailRequest", retParameters);
365 xoap::MessageReference FESupervisor::workLoopStatusRequest(xoap::MessageReference message)
366 throw (xoap::exception::Exception)
371 if (!theFEInterfacesManager)
373 __SS__ <<
"Invalid request for front-end workloop status from Supervisor without a FEVInterfacesManager."
375 __COUT_ERR__ << ss.str();
376 throw std::runtime_error(ss.str());
379 return SOAPUtilities::makeSOAPMessageReference(
380 (theFEInterfacesManager->allFEWorkloopsAreDone() ?
381 CoreSupervisorBase::WORK_LOOP_DONE :
382 CoreSupervisorBase::WORK_LOOP_WORKING));
397 for (
unsigned int i = 0; i < theStateMachineImplementation_.size(); ++i)
401 theFEInterfacesManager =
403 if (!theFEInterfacesManager)
406 __SS__ <<
"Dynamic cast failure!" << std::endl;
407 __COUT_ERR__ << ss.str();
408 throw std::runtime_error(ss.str());
410 __COUT__ <<
"State Machine " << i <<
" WAS of type FEVInterfacesManager" << std::endl;
416 __COUT__ <<
"State Machine " << i <<
" was NOT of type FEVInterfacesManager" << std::endl;
420 __COUT__ <<
"theFEInterfacesManager pointer = " << theFEInterfacesManager << std::endl;
422 return theFEInterfacesManager;