tdaq-develop-2025-02-12
FESupervisor.cc
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"
5 
6 #include "artdaq/DAQdata/Globals.hh" // instantiates artdaq::Globals::metricMan_
7 
8 #include "artdaq-core/Utilities/ExceptionHandler.hh" /*for artdaq::ExceptionHandler*/
9 
32 using namespace ots;
33 
34 XDAQ_INSTANTIATOR_IMPL(FESupervisor)
35 
36 //==============================================================================
37 FESupervisor::FESupervisor(xdaq::ApplicationStub* stub) : CoreSupervisorBase(stub)
38 {
39  __SUP_COUT__ << "Constructing..." << __E__;
40 
41  xoap::bind(this,
42  &FESupervisor::macroMakerSupervisorRequest,
43  "MacroMakerSupervisorRequest",
44  XDAQ_NS_URI);
45 
46  xoap::bind(
47  this, &FESupervisor::workLoopStatusRequest, "WorkLoopStatusRequest", XDAQ_NS_URI);
48 
49  xoap::bind(this,
50  &FESupervisor::frontEndCommunicationRequest,
51  "FECommunication",
52  XDAQ_NS_URI);
53 
54  try
55  {
56  CoreSupervisorBase::theStateMachineImplementation_.push_back(
58  CorePropertySupervisorBase::getContextTreeNode(),
59  CorePropertySupervisorBase::getSupervisorConfigurationPath()));
60  }
61  catch(...)
62  {
63  if(CorePropertySupervisorBase::allSupervisorInfo_.isMacroMakerMode())
64  {
65  __SUP_COUT_WARN__ << "Error caught constructing FE Interface Manager. In "
66  "Macro Maker mode, the input fhicl defines the "
67  "configuration tree, make sure you specified a valid "
68  "fcl file path."
69  << __E__;
70  try
71  {
72  throw;
73  }
74  catch(const std::runtime_error& e)
75  {
76  __SUP_COUT_WARN__ << e.what() << __E__;
77  throw;
78  }
79  }
80  throw;
81  }
82 
83  extractFEInterfacesManager();
84 
85  __SUP_COUT__ << "Constructed." << __E__;
86 
87  if(CorePropertySupervisorBase::allSupervisorInfo_.isMacroMakerMode())
88  {
89  __SUP_COUT_INFO__ << "Macro Maker mode, so configuring at startup!" << __E__;
90  if(!theFEInterfacesManager_)
91  {
92  __SUP_SS__ << "Missing FE Interface manager!" << __E__;
93  __SUP_SS_THROW__;
94  }
95 
96  // copied from CoreSupervisorBase::transitionConfiguring()
97 
98  // Now that the configuration manager has all the necessary configurations,
99  // create all objects that depend on the configuration (the first iteration)
100 
101  try
102  {
103  __SUP_COUT__ << "Configuring all state machine implementations..." << __E__;
104  __SUP_COUTV__(stateMachinesIterationDone_.size());
105  preStateMachineExecutionLoop();
106  __SUP_COUTV__(stateMachinesIterationDone_.size());
107  for(unsigned int i = 0; i < theStateMachineImplementation_.size(); ++i)
108  {
109  __SUP_COUT__ << "Configuring state machine i " << i << __E__;
110 
111  // if one state machine is doing a sub-iteration, then target that one
112  if(subIterationWorkStateMachineIndex_ != (unsigned int)-1 &&
113  i != subIterationWorkStateMachineIndex_)
114  continue; // skip those not in the sub-iteration
115 
116  if(stateMachinesIterationDone_[i])
117  continue; // skip state machines already done
118 
119  preStateMachineExecution(i);
120  theStateMachineImplementation_[i]->parentSupervisor_ =
121  this; // for backwards compatibility, kept out of configure
122  // parameters
123  theStateMachineImplementation_[i]->configure(); // e.g. for FESupervisor,
124  // this is configure of
125  // FEVInterfacesManager
126  postStateMachineExecution(i);
127  }
128  postStateMachineExecutionLoop();
129 
130  //ony indicate alive after configure
131  CorePropertySupervisorBase::indicateOtsAlive(0);
132  }
133  catch(const std::runtime_error& e)
134  {
135  __SUP_SS__ << "Error was caught while configuring: " << e.what() << __E__;
136  __SUP_COUT_ERR__ << "\n" << ss.str();
137  throw;
138  }
139  catch(...)
140  {
141  __SUP_SS__
142  << "Unknown error was caught while configuring. Please checked the logs."
143  << __E__;
144  try
145  {
146  throw;
147  } //one more try to printout extra info
148  catch(const std::exception& e)
149  {
150  ss << "Exception message: " << e.what();
151  }
152  catch(...)
153  {
154  }
155  __SUP_COUT_ERR__ << "\n" << ss.str();
156  throw;
157  }
158  } // end Macro Maker mode initial configure
159 } // end constructor
160 
161 //==============================================================================
162 FESupervisor::~FESupervisor(void)
163 {
164  __SUP_COUT__ << "Destroying..." << __E__;
165  // theStateMachineImplementation_ is reset and the object it points to deleted in
166  // ~CoreSupervisorBase()
167 
168  artdaq::Globals::CleanUpGlobals(); // destruct metricManager (among other things)
169 
170  __SUP_COUT__ << "Destructed." << __E__;
171 } // end destructor
172 
173 //==============================================================================
174 xoap::MessageReference FESupervisor::frontEndCommunicationRequest(
175  xoap::MessageReference message)
176 try
177 {
178  // LORE__SUP_COUT__ << "FE Request received: " << SOAPUtilities::translate(message) << __E__;
179 
180  if(!theFEInterfacesManager_)
181  {
182  __SUP_SS__ << "No FE Interface Manager!" << __E__;
183  __SUP_SS_THROW__;
184  }
185  SOAPParameters typeParameter, rxParameters; // params for xoap to recv
186  typeParameter.addParameter("type");
187  SOAPUtilities::receive(message, typeParameter);
188 
189  std::string type = typeParameter.getValue("type");
190 
191  // types
192  // feSend
193  // feMacro
194  // feMacroMultiDimensionalStart
195  // macroMultiDimensionalStart
196  // feMacroMultiDimensionalCheck
197  // macroMultiDimensionalCheck
198 
199  rxParameters.addParameter("requester");
200  rxParameters.addParameter("targetInterfaceID");
201 
202  if(type == "feSend")
203  {
204  __SUP_COUTV__(type);
205 
206  rxParameters.addParameter("value");
207  SOAPUtilities::receive(message, rxParameters);
208 
209  std::string requester = rxParameters.getValue("requester");
210  std::string targetInterfaceID = rxParameters.getValue("targetInterfaceID");
211  std::string value = rxParameters.getValue("value");
212 
213  __SUP_COUTV__(requester);
214  __SUP_COUTV__(targetInterfaceID);
215  __SUP_COUTV__(value);
216 
217  // test that the interface exists
218  theFEInterfacesManager_->getFEInterface(targetInterfaceID);
219 
220  // mutex scope
221  {
222  std::lock_guard<std::mutex> lock(
223  theFEInterfacesManager_->frontEndCommunicationReceiveMutex_);
224 
225  theFEInterfacesManager_
226  ->frontEndCommunicationReceiveBuffer_[targetInterfaceID][requester]
227  .emplace(value);
228 
229  __SUP_COUT__ << "Number of target interface ID '" << targetInterfaceID
230  << "' buffers: "
231  << theFEInterfacesManager_
232  ->frontEndCommunicationReceiveBuffer_[targetInterfaceID]
233  .size()
234  << __E__;
235  __SUP_COUT__
236  << "Number of source interface ID '" << requester << "' values received: "
237  << theFEInterfacesManager_
238  ->frontEndCommunicationReceiveBuffer_[targetInterfaceID][requester]
239  .size()
240  << __E__;
241  }
242  return SOAPUtilities::makeSOAPMessageReference("Received");
243  } // end type feSend
244  else if(type == "feMacro")
245  {
246  __SUP_COUTV__(type);
247 
248  rxParameters.addParameter("feMacroName");
249  rxParameters.addParameter("inputArgs");
250 
251  SOAPUtilities::receive(message, rxParameters);
252 
253  std::string requester = rxParameters.getValue("requester");
254  std::string targetInterfaceID = rxParameters.getValue("targetInterfaceID");
255  std::string feMacroName = rxParameters.getValue("feMacroName");
256  std::string inputArgs = rxParameters.getValue("inputArgs");
257 
258  __SUP_COUTV__(requester);
259  __SUP_COUTV__(targetInterfaceID);
260  __SUP_COUTV__(feMacroName);
261  __SUP_COUTV__(inputArgs);
262 
263  std::string outputArgs;
264  try
265  {
266  theFEInterfacesManager_->runFEMacroByFE(
267  requester, targetInterfaceID, feMacroName, inputArgs, outputArgs);
268  }
269  catch(std::runtime_error& e)
270  {
271  __SUP_SS__ << "In Supervisor with LID="
272  << getApplicationDescriptor()->getLocalId()
273  << " the FE Macro named '" << feMacroName << "' with target FE '"
274  << targetInterfaceID << "' failed. Here is the error:\n\n"
275  << e.what() << __E__;
276  __SUP_SS_THROW__;
277  }
278  catch(...)
279  {
280  __SUP_SS__ << "In Supervisor with LID="
281  << getApplicationDescriptor()->getLocalId()
282  << " the FE Macro named '" << feMacroName << "' with target FE '"
283  << targetInterfaceID << "' failed due to an unknown error."
284  << __E__;
285  try
286  {
287  throw;
288  } //one more try to printout extra info
289  catch(const std::exception& e)
290  {
291  ss << "Exception message: " << e.what();
292  }
293  catch(...)
294  {
295  }
296  __SUP_SS_THROW__;
297  }
298 
299  __SUP_COUTV__(outputArgs);
300 
301  xoap::MessageReference replyMessage =
302  SOAPUtilities::makeSOAPMessageReference("feMacrosResponse");
303  SOAPParameters txParameters;
304  txParameters.addParameter("requester", requester);
305  txParameters.addParameter("targetInterfaceID", targetInterfaceID);
306  txParameters.addParameter("feMacroName", feMacroName);
307  txParameters.addParameter("outputArgs", outputArgs);
308  SOAPUtilities::addParameters(replyMessage, txParameters);
309 
310  __SUP_COUT__ << "Sending FE macro result: "
311  << SOAPUtilities::translate(replyMessage) << __E__;
312 
313  return replyMessage;
314  } // end type feMacro
315  else if(type == "feMacroMultiDimensionalStart" || // from iterator
316  type == "macroMultiDimensionalStart") // from iterator
317  {
318  __SUP_COUTV__(type);
319 
320  if(type[0] == 'm')
321  {
322  rxParameters.addParameter("macroString");
323  rxParameters.addParameter("macroName");
324  }
325  else
326  rxParameters.addParameter("feMacroName");
327 
328  rxParameters.addParameter("enableSavingOutput");
329  rxParameters.addParameter("outputFilePath");
330  rxParameters.addParameter("outputFileRadix");
331  rxParameters.addParameter("inputArgs");
332 
333  SOAPUtilities::receive(message, rxParameters);
334 
335  std::string requester = rxParameters.getValue("requester");
336  std::string targetInterfaceID = rxParameters.getValue("targetInterfaceID");
337  std::string macroName, macroString;
338  if(type[0] == 'm')
339  {
340  macroName = rxParameters.getValue("macroName");
341  macroString = rxParameters.getValue("macroString");
342  __SUP_COUTV__(macroString);
343  }
344  else
345  macroName = rxParameters.getValue("feMacroName");
346  bool enableSavingOutput = rxParameters.getValue("enableSavingOutput") == "1";
347  std::string outputFilePath = rxParameters.getValue("outputFilePath");
348  std::string outputFileRadix = rxParameters.getValue("outputFileRadix");
349  std::string inputArgs = rxParameters.getValue("inputArgs");
350 
351  __SUP_COUTV__(requester);
352  __SUP_COUTV__(targetInterfaceID);
353  __SUP_COUTV__(macroName);
354  __SUP_COUTV__(enableSavingOutput);
355  __SUP_COUTV__(outputFilePath);
356  __SUP_COUTV__(outputFileRadix);
357  __SUP_COUTV__(inputArgs);
358 
359  if(type[0] == 'm') // start Macro
360  {
361  try
362  {
363  theFEInterfacesManager_->startMacroMultiDimensional(requester,
364  targetInterfaceID,
365  macroName,
366  macroString,
367  enableSavingOutput,
368  outputFilePath,
369  outputFileRadix,
370  inputArgs);
371  }
372  catch(std::runtime_error& e)
373  {
374  __SUP_SS__ << "In Supervisor with LID="
375  << getApplicationDescriptor()->getLocalId()
376  << " the Macro named '" << macroName << "' with target FE '"
377  << targetInterfaceID
378  << "' failed to start multi-dimensional launch. "
379  << "Here is the error:\n\n"
380  << e.what() << __E__;
381  __SUP_SS_THROW__;
382  }
383  catch(...)
384  {
385  __SUP_SS__ << "In Supervisor with LID="
386  << getApplicationDescriptor()->getLocalId()
387  << " the Macro named '" << macroName << "' with target FE '"
388  << targetInterfaceID
389  << "' failed to start multi-dimensional launch "
390  << "due to an unknown error." << __E__;
391  try
392  {
393  throw;
394  } //one more try to printout extra info
395  catch(const std::exception& e)
396  {
397  ss << "Exception message: " << e.what();
398  }
399  catch(...)
400  {
401  }
402  __SUP_SS_THROW__;
403  }
404  }
405  else // start FE Macro
406  {
407  try
408  {
409  theFEInterfacesManager_->startFEMacroMultiDimensional(requester,
410  targetInterfaceID,
411  macroName,
412  enableSavingOutput,
413  outputFilePath,
414  outputFileRadix,
415  inputArgs);
416  }
417  catch(std::runtime_error& e)
418  {
419  __SUP_SS__ << "In Supervisor with LID="
420  << getApplicationDescriptor()->getLocalId()
421  << " the FE Macro named '" << macroName << "' with target FE '"
422  << targetInterfaceID
423  << "' failed to start multi-dimensional launch. "
424  << "Here is the error:\n\n"
425  << e.what() << __E__;
426  __SUP_SS_THROW__;
427  }
428  catch(...)
429  {
430  __SUP_SS__ << "In Supervisor with LID="
431  << getApplicationDescriptor()->getLocalId()
432  << " the FE Macro named '" << macroName << "' with target FE '"
433  << targetInterfaceID
434  << "' failed to start multi-dimensional launch "
435  << "due to an unknown error." << __E__;
436  try
437  {
438  throw;
439  } //one more try to printout extra info
440  catch(const std::exception& e)
441  {
442  ss << "Exception message: " << e.what();
443  }
444  catch(...)
445  {
446  }
447  __SUP_SS_THROW__;
448  }
449  }
450 
451  xoap::MessageReference replyMessage =
452  SOAPUtilities::makeSOAPMessageReference(type + "Done");
453  SOAPParameters txParameters;
454  // txParameters.addParameter("started", "1");
455  SOAPUtilities::addParameters(replyMessage, txParameters);
456 
457  __SUP_COUT__ << "Sending FE macro result: "
458  << SOAPUtilities::translate(replyMessage) << __E__;
459 
460  return replyMessage;
461  } // end type (fe)MacroMultiDimensionalStart
462  else if(type == "feMacroMultiDimensionalCheck" || // from iterator
463  type == "macroMultiDimensionalCheck")
464  {
465  // LORE__SUP_COUTV__(type);
466  if(type[0] == 'm')
467  rxParameters.addParameter("macroName");
468  else
469  rxParameters.addParameter("feMacroName");
470  rxParameters.addParameter("targetInterfaceID");
471 
472  SOAPUtilities::receive(message, rxParameters);
473 
474  std::string targetInterfaceID = rxParameters.getValue("targetInterfaceID");
475  std::string macroName;
476  if(type[0] == 'm')
477  macroName = rxParameters.getValue("macroName");
478  else
479  macroName = rxParameters.getValue("feMacroName");
480 
481  // LORE__SUP_COUTV__(targetInterfaceID);
482  // LORE__SUP_COUTV__(macroName);
483 
484  bool done = false;
485  try
486  {
487  done = theFEInterfacesManager_->checkMacroMultiDimensional(targetInterfaceID,
488  macroName);
489  }
490  catch(std::runtime_error& e)
491  {
492  __SUP_SS__ << "In Supervisor with LID="
493  << getApplicationDescriptor()->getLocalId()
494  << " the FE Macro named '" << macroName << "' with target FE '"
495  << targetInterfaceID
496  << "' failed to check multi-dimensional launch. "
497  << "Here is the error:\n\n"
498  << e.what() << __E__;
499  __SUP_SS_THROW__;
500  }
501  catch(...)
502  {
503  __SUP_SS__ << "In Supervisor with LID="
504  << getApplicationDescriptor()->getLocalId()
505  << " the FE Macro named '" << macroName << "' with target FE '"
506  << targetInterfaceID
507  << "' failed to check multi-dimensional launch "
508  << "due to an unknown error." << __E__;
509  try
510  {
511  throw;
512  } //one more try to printout extra info
513  catch(const std::exception& e)
514  {
515  ss << "Exception message: " << e.what();
516  }
517  catch(...)
518  {
519  }
520  __SUP_SS_THROW__;
521  }
522 
523  xoap::MessageReference replyMessage =
524  SOAPUtilities::makeSOAPMessageReference(type + "Done");
525  SOAPParameters txParameters;
526  txParameters.addParameter("Done", done ? "1" : "0");
527  SOAPUtilities::addParameters(replyMessage, txParameters);
528 
529  // LORE__SUP_COUT__ << "Sending FE macro result: " << SOAPUtilities::translate(replyMessage) << __E__;
530 
531  return replyMessage;
532  } // end type (fe)MacroMultiDimensionalCheck
533  else
534  {
535  __SUP_SS__ << "Unrecognized FE Communication type: " << type << __E__;
536  __SUP_SS_THROW__;
537  }
538 }
539 catch(const std::runtime_error& e)
540 {
541  __SUP_SS__ << "Error encountered processing FE communication request: " << e.what()
542  << __E__;
543  __SUP_COUT_ERR__ << ss.str();
544 
545  SOAPParameters parameters;
546  parameters.addParameter("Error", ss.str());
547  return SOAPUtilities::makeSOAPMessageReference(
548  supervisorClassNoNamespace_ + "FailFECommunicationRequest", parameters);
549 }
550 catch(...)
551 {
552  __SUP_SS__ << "Unknown error encountered processing FE communication request."
553  << __E__;
554  try
555  {
556  throw;
557  } //one more try to printout extra info
558  catch(const std::exception& e)
559  {
560  ss << "Exception message: " << e.what();
561  }
562  catch(...)
563  {
564  }
565  __SUP_COUT_ERR__ << ss.str();
566 
567  SOAPParameters parameters;
568  parameters.addParameter("Error", ss.str());
569  return SOAPUtilities::makeSOAPMessageReference(
570  supervisorClassNoNamespace_ + "FailFECommunicationRequest", parameters);
571 } // end frontEndCommunicationRequest()
572 
573 //==============================================================================
581  xoap::MessageReference message)
582 {
583  __SUP_COUT__ << "$$$$$$$$$$$$$$$$$" << __E__;
584 
585  // receive request parameters
586  SOAPParameters parameters;
587  parameters.addParameter("Request");
588 
589  __SUP_COUT__ << "Received Macro Maker message: " << SOAPUtilities::translate(message)
590  << __E__;
591 
592  SOAPUtilities::receive(message, parameters);
593  std::string request = parameters.getValue("Request");
594 
595  __SUP_COUT__ << "request: " << request << __E__;
596 
597  // request types:
598  // GetInterfaces
599  // UniversalWrite
600  // UniversalRead
601  // GetInterfaceMacros
602  // RunInterfaceMacro
603  // RunMacroMakerMacro
604 
605  SOAPParameters retParameters;
606 
607  try
608  {
609  if(request == "GetInterfaces")
610  {
611  if(theFEInterfacesManager_)
612  retParameters.addParameter(
613  "FEList",
614  theFEInterfacesManager_->getFEListString(
615  std::to_string(getApplicationDescriptor()->getLocalId())));
616  else // if no FE interfaces, return empty string
617  retParameters.addParameter("FEList", "");
618 
619  // if errors in state machine, send also
620  if(theStateMachine_.getErrorMessage() != "")
621  retParameters.addParameter("frontEndError",
622  theStateMachine_.getErrorMessage());
623 
624  return SOAPUtilities::makeSOAPMessageReference(
625  supervisorClassNoNamespace_ + "Response", retParameters);
626  }
627  else if(request == "UniversalWrite")
628  {
629  if(!theFEInterfacesManager_)
630  {
631  __SUP_SS__ << "No FE Interface Manager! Are you configured?" << __E__;
632  __SUP_SS_THROW__;
633  }
634  // params for running macros
635  SOAPParameters requestParameters;
636  requestParameters.addParameter("InterfaceID");
637  requestParameters.addParameter("Address");
638  requestParameters.addParameter("Data");
639  SOAPUtilities::receive(message, requestParameters);
640  std::string interfaceID = requestParameters.getValue("InterfaceID");
641  std::string addressStr = requestParameters.getValue("Address");
642  std::string dataStr = requestParameters.getValue("Data");
643 
644  __SUP_COUT__ << "Address: " << addressStr << " Data: " << dataStr
645  << " InterfaceID: " << interfaceID << __E__;
646 
647  // parameters interface index!
648  // unsigned int index = stoi(indexStr); // As long as the supervisor has only
649  // one interface, this index will remain 0?
650 
651  __SUP_COUT__
652  << "theFEInterfacesManager_->getInterfaceUniversalAddressSize(index) "
653  << theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID)
654  << __E__;
655  __SUP_COUT__
656  << "theFEInterfacesManager_->getInterfaceUniversalDataSize(index) "
657  << theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID)
658  << __E__;
659 
660  // Converting std::string to char*
661  // char address
662 
663  char tmpHex[3]; // for use converting hex to binary
664  tmpHex[2] = '\0';
665 
666  __SUP_COUT__ << "Translating address: ";
667 
668  std::string addressTmp;
669  addressTmp.reserve(
670  theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID));
671  char* address = &addressTmp[0];
672 
673  if(addressStr.size() % 2) // if odd, make even
674  addressStr = "0" + addressStr;
675  unsigned int i = 0;
676  for(; i < addressStr.size() &&
677  i / 2 < theFEInterfacesManager_->getInterfaceUniversalAddressSize(
678  interfaceID);
679  i += 2)
680  {
681  tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
682  tmpHex[1] = addressStr[addressStr.size() - 1 - i];
683  sscanf(tmpHex, "%hhX", (unsigned char*)&address[i / 2]);
684  printf("%2.2X", (unsigned char)address[i / 2]);
685  }
686  // finish and fill with 0s
687  for(; i / 2 <
688  theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID);
689  i += 2)
690  {
691  address[i / 2] = 0;
692  printf("%2.2X", (unsigned char)address[i / 2]);
693  }
694 
695  std::cout << __E__;
696 
697  __SUP_COUT__ << "Translating data: ";
698 
699  std::string dataTmp;
700  dataTmp.reserve(
701  theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID));
702  char* data = &dataTmp[0];
703 
704  if(dataStr.size() % 2) // if odd, make even
705  dataStr = "0" + dataStr;
706 
707  i = 0;
708  for(; i < dataStr.size() &&
709  i / 2 <
710  theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID);
711  i += 2)
712  {
713  tmpHex[0] = dataStr[dataStr.size() - 1 - i - 1];
714  tmpHex[1] = dataStr[dataStr.size() - 1 - i];
715  sscanf(tmpHex, "%hhX", (unsigned char*)&data[i / 2]);
716  printf("%2.2X", (unsigned char)data[i / 2]);
717  }
718  // finish and fill with 0s
719  for(; i / 2 <
720  theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID);
721  i += 2)
722  {
723  data[i / 2] = 0;
724  printf("%2.2X", (unsigned char)data[i / 2]);
725  }
726 
727  std::cout << __E__;
728 
729  // char* address = new char[addressStr.size() + 1];
730  // std::copy(addressStr.begin(), addressStr.end(), address);
731  // address[addressStr.size()] = '\0';
732  // char* data = new char[dataStr.size() + 1];
733  // std::copy(dataStr.begin(), dataStr.end(), data);
734  // data[dataStr.size()] = '\0';
735 
736  theFEInterfacesManager_->universalWrite(interfaceID, address, data);
737 
738  // delete[] address;
739  // delete[] data;
740 
741  return SOAPUtilities::makeSOAPMessageReference(
742  supervisorClassNoNamespace_ + "DataWritten", retParameters);
743  }
744  else if(request == "UniversalRead")
745  {
746  if(!theFEInterfacesManager_)
747  {
748  __SUP_SS__ << "No FE Interface Manager! Are you configured?" << __E__;
749  __SUP_SS_THROW__;
750  }
751 
752  // params for running macros
753  SOAPParameters requestParameters;
754  requestParameters.addParameter("InterfaceID");
755  requestParameters.addParameter("Address");
756  SOAPUtilities::receive(message, requestParameters);
757  std::string interfaceID = requestParameters.getValue("InterfaceID");
758  std::string addressStr = requestParameters.getValue("Address");
759 
760  __SUP_COUT__ << "Address: " << addressStr << " InterfaceID: " << interfaceID
761  << __E__;
762 
763  // parameters interface index!
764  // parameter address and data
765  // unsigned int index = stoi(indexStr); // As long as the supervisor has only
766  // one interface, this index will remain 0?
767 
768  __SUP_COUT__
769  << "theFEInterfacesManager_->getInterfaceUniversalAddressSize(index) "
770  << theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID)
771  << __E__;
772  __SUP_COUT__
773  << "theFEInterfacesManager_->getInterfaceUniversalDataSize(index) "
774  << theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID)
775  << __E__;
776 
777  char tmpHex[3]; // for use converting hex to binary
778  tmpHex[2] = '\0';
779 
780  __SUP_COUT__ << "Translating address: ";
781 
782  std::string addressTmp;
783  addressTmp.reserve(
784  theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID));
785  char* address = &addressTmp[0];
786 
787  if(addressStr.size() % 2) // if odd, make even
788  addressStr = "0" + addressStr;
789 
790  unsigned int i = 0;
791  for(; i < addressStr.size() &&
792  i / 2 < theFEInterfacesManager_->getInterfaceUniversalAddressSize(
793  interfaceID);
794  i += 2)
795  {
796  tmpHex[0] = addressStr[addressStr.size() - 1 - i - 1];
797  tmpHex[1] = addressStr[addressStr.size() - 1 - i];
798  sscanf(tmpHex, "%hhX", (unsigned char*)&address[i / 2]);
799  printf("%2.2X", (unsigned char)address[i / 2]);
800  }
801  // finish and fill with 0s
802  for(; i / 2 <
803  theFEInterfacesManager_->getInterfaceUniversalAddressSize(interfaceID);
804  i += 2)
805  {
806  address[i / 2] = 0;
807  printf("%2.2X", (unsigned char)address[i / 2]);
808  }
809 
810  std::cout << __E__;
811 
812  unsigned int dataSz =
813  theFEInterfacesManager_->getInterfaceUniversalDataSize(interfaceID);
814  std::string dataStr;
815  dataStr.resize(dataSz);
816  char* data = &dataStr[0];
817 
818  // std::string result =
819  // theFEInterfacesManager_->universalRead(index,address,data);
820  // __SUP_COUT__<< result << __E__ << __E__;
821 
822  try
823  {
824  theFEInterfacesManager_->universalRead(interfaceID, address, data);
825  }
826  catch(const std::runtime_error& e)
827  {
828  // do not allow read exception to crash everything when a macromaker
829  // command
830  __SUP_COUT_ERR__ << "Exception caught during read: " << e.what() << __E__;
831  retParameters.addParameter("dataResult", "Time Out Error");
832  return SOAPUtilities::makeSOAPMessageReference(
833  supervisorClassNoNamespace_ + "aa", retParameters);
834  }
835  catch(...)
836  {
837  // do not allow read exception to crash everything when a macromaker
838  // command
839  __SUP_COUT_ERR__ << "Exception caught during read." << __E__;
840  retParameters.addParameter("dataResult", "Time Out Error");
841  return SOAPUtilities::makeSOAPMessageReference(
842  supervisorClassNoNamespace_ + "aa", retParameters);
843  }
844 
845  // if dataSz is less than 8 show what the unsigned number would be
846  if(dataSz <= 8)
847  {
848  std::string str8(data);
849  str8.resize(8);
850  __SUP_COUT__ << "decResult[" << dataSz
851  << " bytes]: " << *((unsigned long long*)(&str8[0]))
852  << __E__;
853  }
854 
855  std::string hexResultStr;
856  hexResultStr.reserve(dataSz * 2 + 1);
857  char* hexResult = &hexResultStr[0];
858  // go through each byte and convert it to hex value (i.e. 2 0-F chars)
859  // go backwards through source data since should be provided in host order
860  // (i.e. a cast to unsigned long long should acquire expected value)
861  for(unsigned int i = 0; i < dataSz; ++i)
862  {
863  sprintf(&hexResult[i * 2], "%2.2X", (unsigned char)data[dataSz - 1 - i]);
864  }
865 
866  __SUP_COUT__ << "hexResult[" << strlen(hexResult)
867  << " nibbles]: " << std::string(hexResult) << __E__;
868 
869  retParameters.addParameter("dataResult", hexResult);
870  return SOAPUtilities::makeSOAPMessageReference(
871  supervisorClassNoNamespace_ + "aa", retParameters);
872  }
873  else if(request == "GetInterfaceMacros")
874  {
875  if(theFEInterfacesManager_)
876  {
877  __SUP_COUT__ << "Getting FE Macros from FE Interface Manager..." << __E__;
878  retParameters.addParameter(
879  "FEMacros",
880  theFEInterfacesManager_->getFEMacrosString(
881  CorePropertySupervisorBase::getSupervisorUID(),
882  std::to_string(CoreSupervisorBase::getSupervisorLID())));
883  }
884  else
885  {
886  __SUP_COUT__ << "No FE Macros because there is no FE Interface Manager..."
887  << __E__;
888  retParameters.addParameter("FEMacros", "");
889  }
890 
891  return SOAPUtilities::makeSOAPMessageReference(
892  supervisorClassNoNamespace_ + "Response", retParameters);
893  }
894  else if(request == "RunInterfaceMacro")
895  {
896  if(!theFEInterfacesManager_)
897  {
898  __SUP_SS__ << "Missing FE Interface Manager! Are you configured?"
899  << __E__;
900  __SUP_SS_THROW__;
901  }
902 
903  // params for running macros
904  SOAPParameters requestParameters;
905  requestParameters.addParameter("feMacroName");
906  requestParameters.addParameter("inputArgs");
907  requestParameters.addParameter("outputArgs");
908  requestParameters.addParameter("InterfaceID");
909  requestParameters.addParameter("userPermissions");
910  SOAPUtilities::receive(message, requestParameters);
911  std::string interfaceID = requestParameters.getValue("InterfaceID");
912  std::string feMacroName = requestParameters.getValue("feMacroName");
913  std::string inputArgs = requestParameters.getValue("inputArgs");
914  std::string outputArgs = requestParameters.getValue("outputArgs");
915  std::string userPermissions = requestParameters.getValue("userPermissions");
916 
917  // check user permission
918  // userPermissions = "allUsers:1";
919  // userPermissions = "allUsers:1 & TDAQ:255";
920  __COUTV__(userPermissions);
921  std::map<std::string, WebUsers::permissionLevel_t> userPermissionLevelsMap;
923  userPermissions, userPermissionLevelsMap);
924  __COUTV__(StringMacros::mapToString(userPermissionLevelsMap));
925 
926  // outputArgs must be filled with the proper argument names
927  // and then the response output values will be returned in the string.
928  try
929  {
930  // check for interfaceID
931  FEVInterface* fe = theFEInterfacesManager_->getFEInterfaceP(interfaceID);
932 
933  // have pointer to virtual FEInterface, find Macro structure
934  auto FEMacroIt = fe->getMapOfFEMacroFunctions().find(feMacroName);
935  if(FEMacroIt == fe->getMapOfFEMacroFunctions().end())
936  {
937  __SUP_SS__ << "FE Macro '" << feMacroName << "' of interfaceID '"
938  << interfaceID << "' was not found!" << __E__;
939  __SUP_SS_THROW__;
940  }
941  const FEVInterface::frontEndMacroStruct_t& FEMacro = FEMacroIt->second;
942 
943  __COUTV__(FEMacro.requiredUserPermissions_);
944  std::map<std::string, WebUsers::permissionLevel_t>
945  FERequiredUserPermissionsMap;
947  FEMacro.requiredUserPermissions_, FERequiredUserPermissionsMap);
948  __COUTV__(StringMacros::mapToString(FERequiredUserPermissionsMap));
949 
951  userPermissionLevelsMap, FERequiredUserPermissionsMap))
952  {
953  __SUP_SS__ << "Invalid user permission for FE Macro '" << feMacroName
954  << "' of interfaceID '" << interfaceID << "'!\n\n"
955  << "Must have access level of at least '"
956  << StringMacros::mapToString(FERequiredUserPermissionsMap)
957  << ".' Users permissions level is only '"
958  << userPermissions << ".'" << __E__;
959  __SUP_SS_THROW__;
960  }; // skip icon if no access
961 
962  theFEInterfacesManager_->runFEMacro(
963  interfaceID, FEMacro, inputArgs, outputArgs);
964 
965  // theFEInterfacesManager_->runFEMacro(interfaceID, feMacroName, inputArgs, outputArgs);
966  }
967  catch(std::runtime_error& e)
968  {
969  __SUP_SS__ << "In Supervisor with LID="
970  << getApplicationDescriptor()->getLocalId()
971  << " the FE Macro named '" << feMacroName
972  << "' with target FE '" << interfaceID
973  << "' failed. Here is the error:\n\n"
974  << e.what() << __E__;
975  __SUP_SS_THROW__;
976  }
977  catch(std::exception& e)
978  {
979  __SUP_SS__ << "In Supervisor with LID="
980  << getApplicationDescriptor()->getLocalId()
981  << " the FE Macro named '" << feMacroName
982  << "' with target FE '" << interfaceID
983  << "' failed. Here is the error:\n\n"
984  << e.what() << __E__;
985  __SUP_SS_THROW__;
986  }
987  catch(...)
988  {
989  __SUP_SS__ << "In Supervisor with LID="
990  << getApplicationDescriptor()->getLocalId()
991  << " the FE Macro named '" << feMacroName
992  << "' with target FE '" << interfaceID
993  << "' failed due to an unknown error." << __E__;
994  try
995  {
996  throw;
997  } //one more try to printout extra info
998  catch(const std::exception& e)
999  {
1000  ss << "Exception message: " << e.what();
1001  }
1002  catch(...)
1003  {
1004  }
1005  __SUP_SS_THROW__;
1006  }
1007 
1008  // retParameters.addParameter("success", success ? "1" : "0");
1009  retParameters.addParameter("outputArgs", outputArgs);
1010 
1011  return SOAPUtilities::makeSOAPMessageReference(
1012  supervisorClassNoNamespace_ + "Response", retParameters);
1013  }
1014  else if(request == "RunMacroMakerMacro")
1015  {
1016  if(!theFEInterfacesManager_)
1017  {
1018  __SUP_SS__ << "Missing FE Interface Manager! Are you configured?"
1019  << __E__;
1020  __SUP_SS_THROW__;
1021  }
1022 
1023  // params for running macros
1024  SOAPParameters requestParameters;
1025  requestParameters.addParameter("macroName");
1026  requestParameters.addParameter("macroString");
1027  requestParameters.addParameter("inputArgs");
1028  requestParameters.addParameter("outputArgs");
1029  requestParameters.addParameter("InterfaceID");
1030  SOAPUtilities::receive(message, requestParameters);
1031  std::string interfaceID = requestParameters.getValue("InterfaceID");
1032  std::string macroName = requestParameters.getValue("macroName");
1033  std::string macroString = requestParameters.getValue("macroString");
1034  std::string inputArgs = requestParameters.getValue("inputArgs");
1035  std::string outputArgs = requestParameters.getValue("outputArgs");
1036 
1037  // outputArgs must be filled with the proper argument names
1038  // and then the response output values will be returned in the string.
1039  try
1040  {
1041  theFEInterfacesManager_->runMacro(
1042  interfaceID, macroString, inputArgs, outputArgs);
1043  }
1044  catch(std::runtime_error& e)
1045  {
1046  __SUP_SS__ << "In Supervisor with LID="
1047  << getApplicationDescriptor()->getLocalId()
1048  << " the MacroMaker Macro named '" << macroName
1049  << "' with target FE '" << interfaceID
1050  << "' failed. Here is the error:\n\n"
1051  << e.what() << __E__;
1052  __SUP_SS_THROW__;
1053  }
1054  catch(...)
1055  {
1056  __SUP_SS__ << "In Supervisor with LID="
1057  << getApplicationDescriptor()->getLocalId()
1058  << " the MacroMaker Macro named '" << macroName
1059  << "' with target FE '" << interfaceID
1060  << "' failed due to an unknown error." << __E__;
1061  try
1062  {
1063  throw;
1064  } //one more try to printout extra info
1065  catch(const std::exception& e)
1066  {
1067  ss << "Exception message: " << e.what();
1068  }
1069  catch(...)
1070  {
1071  }
1072  __SUP_SS_THROW__;
1073  }
1074 
1075  retParameters.addParameter("outputArgs", outputArgs);
1076 
1077  return SOAPUtilities::makeSOAPMessageReference(
1078  supervisorClassNoNamespace_ + "Response", retParameters);
1079  }
1080  else
1081  {
1082  __SUP_SS__ << "Unrecognized request received! '" << request << "'" << __E__;
1083  __SUP_SS_THROW__;
1084  }
1085  }
1086  catch(const std::runtime_error& e)
1087  {
1088  __SUP_SS__ << "Error occurred handling request: " << e.what() << __E__;
1089  __SUP_COUT_ERR__ << ss.str();
1090  retParameters.addParameter("Error", ss.str());
1091  }
1092  catch(...)
1093  {
1094  __SUP_SS__ << "Error occurred handling request." << __E__;
1095  try
1096  {
1097  throw;
1098  } //one more try to printout extra info
1099  catch(const std::exception& e)
1100  {
1101  ss << "Exception message: " << e.what();
1102  }
1103  catch(...)
1104  {
1105  }
1106  __SUP_COUT_ERR__ << ss.str();
1107  retParameters.addParameter("Error", ss.str());
1108  }
1109 
1110  return SOAPUtilities::makeSOAPMessageReference(
1111  supervisorClassNoNamespace_ + "FailRequest", retParameters);
1112 
1113 } // end macroMakerSupervisorRequest()
1114 
1115 //==============================================================================
1116 xoap::MessageReference FESupervisor::workLoopStatusRequest(
1117  xoap::MessageReference /*message*/)
1118 {
1119  if(!theFEInterfacesManager_)
1120  {
1121  __SUP_SS__ << "Invalid request for front-end workloop status from Supervisor "
1122  "without a FEVInterfacesManager."
1123  << __E__;
1124  __SUP_SS_THROW__;
1125  }
1126 
1127  return SOAPUtilities::makeSOAPMessageReference(
1128  (theFEInterfacesManager_->allFEWorkloopsAreDone()
1129  ? CoreSupervisorBase::WORK_LOOP_DONE
1130  : CoreSupervisorBase::WORK_LOOP_WORKING));
1131 } // end workLoopStatusRequest()
1132 
1133 //==============================================================================
1141 FEVInterfacesManager* FESupervisor::extractFEInterfacesManager()
1142 {
1143  theFEInterfacesManager_ = 0;
1144 
1145  for(unsigned int i = 0; i < theStateMachineImplementation_.size(); ++i)
1146  {
1147  try
1148  {
1149  theFEInterfacesManager_ =
1150  dynamic_cast<FEVInterfacesManager*>(theStateMachineImplementation_[i]);
1151  if(!theFEInterfacesManager_)
1152  {
1153  // dynamic_cast returns null pointer on failure
1154  __SUP_SS__ << "Dynamic cast failure!" << __E__;
1155  __SUP_SS_THROW__;
1156  }
1157  __SUP_COUT__ << "State Machine " << i << " WAS of type FEVInterfacesManager"
1158  << __E__;
1159 
1160  break;
1161  }
1162  catch(...)
1163  {
1164  __SUP_COUT__ << "State Machine " << i
1165  << " was NOT of type FEVInterfacesManager" << __E__;
1166  }
1167  }
1168 
1169  __SUP_COUT__ << "theFEInterfacesManager pointer = " << theFEInterfacesManager_
1170  << __E__;
1171 
1172  return theFEInterfacesManager_;
1173 } // end extractFEInterfaceManager()
1174 
1175 //==============================================================================
1176 void FESupervisor::transitionConfiguring(toolbox::Event::Reference /*event*/)
1177 {
1178  __SUP_COUT__ << "transitionConfiguring" << __E__;
1179 
1180  { // do like start of CoreSupervisorBase::transitionConfiguring
1181  // activate the configuration tree (the first iteration)
1182  if(RunControlStateMachine::getIterationIndex() == 0 &&
1183  RunControlStateMachine::getSubIterationIndex() == 0)
1184  {
1185  std::pair<std::string /*group name*/, TableGroupKey> theGroup(
1186  SOAPUtilities::translate(theStateMachine_.getCurrentMessage())
1187  .getParameters()
1188  .getValue("ConfigurationTableGroupName"),
1189  TableGroupKey(
1190  SOAPUtilities::translate(theStateMachine_.getCurrentMessage())
1191  .getParameters()
1192  .getValue("ConfigurationTableGroupKey")));
1193 
1194  __SUP_COUT__ << "Configuration table group name: " << theGroup.first
1195  << " key: " << theGroup.second << __E__;
1196 
1197  try
1198  {
1199  //disable version tracking to accept untracked versions to be selected by the FSM transition source
1200  theConfigurationManager_->loadTableGroup(
1201  theGroup.first,
1202  theGroup.second,
1203  true /*doActivate*/,
1204  0,
1205  0,
1206  0,
1207  0,
1208  0,
1209  0,
1210  false,
1211  0,
1212  0,
1213  ConfigurationManager::LoadGroupType::ALL_TYPES,
1214  true /*ignoreVersionTracking*/);
1215  }
1216  catch(const std::runtime_error& e)
1217  {
1218  __SS__ << "Error loading table group '" << theGroup.first << "("
1219  << theGroup.second << ")! \n"
1220  << e.what() << __E__;
1221  __SUP_COUT_ERR__ << ss.str();
1222  // ExceptionHandler(ExceptionHandlerRethrow::no, ss.str());
1223 
1224  //__SS_THROW_ONLY__;
1225  theStateMachine_.setErrorMessage(ss.str());
1226  throw toolbox::fsm::exception::Exception(
1227  "Transition Error" /*name*/,
1228  ss.str() /* message*/,
1229  "FESupervisor::transitionConfiguring" /*module*/,
1230  __LINE__ /*line*/,
1231  __FUNCTION__ /*function*/
1232  );
1233  }
1234  catch(...)
1235  {
1236  __SS__ << "Unknown error loading table group '" << theGroup.first << "("
1237  << theGroup.second << ")!" << __E__;
1238  try
1239  {
1240  throw;
1241  } //one more try to printout extra info
1242  catch(const std::exception& e)
1243  {
1244  ss << "Exception message: " << e.what();
1245  }
1246  catch(...)
1247  {
1248  }
1249  __SUP_COUT_ERR__ << ss.str();
1250  // ExceptionHandler(ExceptionHandlerRethrow::no, ss.str());
1251 
1252  //__SS_THROW_ONLY__;
1253  theStateMachine_.setErrorMessage(ss.str());
1254  throw toolbox::fsm::exception::Exception(
1255  "Transition Error" /*name*/,
1256  ss.str() /* message*/,
1257  "FESupervisor::transitionConfiguring" /*module*/,
1258  __LINE__ /*line*/,
1259  __FUNCTION__ /*function*/
1260  );
1261  }
1262  }
1263  } // end start like CoreSupervisorBase::transitionConfiguring
1264 
1265  // get pset from Board Reader metric manager table
1266  try
1267  {
1268  __COUTV__(CorePropertySupervisorBase::getSupervisorConfigurationPath());
1269 
1270  ConfigurationTree feSupervisorNode =
1271  CorePropertySupervisorBase::getSupervisorTableNode();
1272 
1273  std::string metric_string = "";
1274  bool metricStringSetup = true;
1275  try
1276  {
1277  std::ostringstream oss;
1278  std::string tabString = "";
1279  std::string commentsString = "";
1281  oss, tabString, commentsString, feSupervisorNode);
1282  metric_string = oss.str();
1283  }
1284  catch(...)
1285  {
1286  metricStringSetup = false;
1287  metric_string = "";
1288  } // ignore error
1289 
1290  if(!metricMan)
1291  {
1292  __SUP_COUT__ << "Metric manager is not instantiated! Attempting to fix."
1293  << __E__;
1294  metricMan = std::make_unique<artdaq::MetricManager>();
1295  }
1296  std::string metricNamePreamble =
1297  feSupervisorNode.getNode("/SlowControlsMetricManagerChannelNamePreamble")
1298  .getValue<std::string>();
1299  __SUP_COUTV__(metricNamePreamble);
1300  if(metricNamePreamble == TableViewColumnInfo::DATATYPE_STRING_DEFAULT)
1301  metricNamePreamble = "";
1302 
1303  // std::string metric_string = "epics: {metricPluginType:epics level:3 channel_name_prefix:Mu2e}";
1304  fhicl::ParameterSet metric_pset = fhicl::ParameterSet::make(metric_string);
1305 
1306  __SUP_COUTV__(metricNamePreamble);
1307  try
1308  {
1309  metricMan->initialize(metric_pset.get<fhicl::ParameterSet>("metrics"),
1310  metricNamePreamble);
1311  }
1312  catch(...)
1313  {
1314  if(metricStringSetup)
1315  throw;
1316  else
1317  __SUP_COUT__ << "Ignore metric manager initialize error because metric "
1318  "string is not setup."
1319  << __E__;
1320  }
1321  __SUP_COUT__ << "transitionConfiguring metric manager(" << metricMan
1322  << ") initialized = " << metricMan->Initialized() << __E__;
1323  }
1324  catch(const std::runtime_error& e)
1325  {
1326  __SS__ << "Error loading metrics in FESupervisor::transitionConfiguring(): "
1327  << e.what() << __E__;
1328  __SUP_COUT_ERR__ << ss.str();
1329  // ExceptionHandler(ExceptionHandlerRethrow::no, ss.str());
1330 
1331  //__SS_THROW_ONLY__;
1332  theStateMachine_.setErrorMessage(ss.str());
1333  throw toolbox::fsm::exception::Exception(
1334  "Transition Error" /*name*/,
1335  ss.str() /* message*/,
1336  "FESupervisor::transitionConfiguring" /*module*/,
1337  __LINE__ /*line*/,
1338  __FUNCTION__ /*function*/
1339  );
1340  }
1341  catch(...)
1342  {
1343  __SS__ << "Error loading metrics in FESupervisor::transitionConfiguring()"
1344  << __E__;
1345  try
1346  {
1347  throw;
1348  } //one more try to printout extra info
1349  catch(const std::exception& e)
1350  {
1351  ss << "Exception message: " << e.what();
1352  }
1353  catch(...)
1354  {
1355  }
1356  __SUP_COUT_ERR__ << ss.str();
1357  // ExceptionHandler(ExceptionHandlerRethrow::no, ss.str());
1358 
1359  //__SS_THROW_ONLY__;
1360  theStateMachine_.setErrorMessage(ss.str());
1361  throw toolbox::fsm::exception::Exception(
1362  "Transition Error" /*name*/,
1363  ss.str() /* message*/,
1364  "FESupervisor::transitionConfiguring" /*module*/,
1365  __LINE__ /*line*/,
1366  __FUNCTION__ /*function*/
1367  );
1368  }
1369 
1370  CoreSupervisorBase::transitionConfiguringFSMs();
1371 
1372  __SUP_COUT__ << "transitionConfiguring done." << __E__;
1373 } // end transitionConfiguring()
1374 
1375 //==============================================================================
1376 void FESupervisor::transitionHalting(toolbox::Event::Reference event)
1377 {
1378  __SUP_COUT__ << "transitionHalting" << __E__;
1379  TLOG_DEBUG(7) << "transitionHalting";
1380 
1381  // shutdown workloops first, then shutdown metric manager
1383 
1384  try
1385  {
1386  if(metricMan && metricMan->Initialized())
1387  {
1388  TLOG_DEBUG(7) << "Metric manager(" << metricMan << ") shutting down..."
1389  << __E__;
1390  metricMan
1391  ->shutdown(); // will set initilized_ to false with mutex, which should prevent races
1392  TLOG_DEBUG(7) << "Metric manager shutdown." << __E__;
1393  }
1394  else
1395  __SUP_COUT__ << "Metric manager(" << metricMan << ") already shutdown."
1396  << __E__;
1397 
1398  metricMan.reset(nullptr);
1399  }
1400  catch(...)
1401  {
1402  __SS__ << "Error shutting down metrics in FESupervisor::transitionHalting()"
1403  << __E__;
1404  try
1405  {
1406  throw;
1407  } //one more try to printout extra info
1408  catch(const std::exception& e)
1409  {
1410  ss << "Exception message: " << e.what();
1411  }
1412  catch(...)
1413  {
1414  }
1415  __SUP_COUT_ERR__ << ss.str();
1416  // ExceptionHandler(ExceptionHandlerRethrow::no, ss.str());
1417 
1418  //__SS_THROW_ONLY__;
1419  theStateMachine_.setErrorMessage(ss.str());
1420  throw toolbox::fsm::exception::Exception(
1421  "Transition Error" /*name*/,
1422  ss.str() /* message*/,
1423  "FESupervisor::transitionHalting" /*module*/,
1424  __LINE__ /*line*/,
1425  __FUNCTION__ /*function*/
1426  );
1427  }
1428 
1429  __SUP_COUT__ << "transitionHalting done." << __E__;
1430 } // end transitionHalting()
static void insertMetricsBlock(std::ostream &out, std::string &tabStr, std::string &commentStr, ConfigurationTree daqNode)
insertMetricsBlock
void loadTableGroup(const std::string &tableGroupName, const TableGroupKey &tableGroupKey, bool doActivate=false, std::map< std::string, TableVersion > *groupMembers=0, ProgressBar *progressBar=0, std::string *accumulateWarnings=0, std::string *groupComment=0, std::string *groupAuthor=0, std::string *groupCreateTime=0, bool doNotLoadMember=false, std::string *groupTypeString=0, std::map< std::string, std::string > *groupAliases=0, ConfigurationManager::LoadGroupType onlyLoadIfBackboneOrContext=ConfigurationManager::LoadGroupType::ALL_TYPES, bool ignoreVersionTracking=false)
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)
virtual void transitionHalting(toolbox::Event::Reference event) override
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 &macroName, const std::string &macroString, 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 &macroName)
used by iterator calling (i.e. FESupervisor)
std::mutex frontEndCommunicationReceiveMutex_
FE communication helpers.
void runMacro(const std::string &interfaceID, const std::string &macroObjectString, const std::string &inputArgs, std::string &outputArgs)
used by MacroMaker
std::string getFEListString(const std::string &supervisorLid)
used by MacroMaker
< members fully define a front-end macro function
Definition: FEVInterface.h:146
static std::string mapToString(const std::map< std::string, T > &mapToReturn, const std::string &primaryDelimeter=", ", const std::string &secondaryDelimeter=": ")