otsdaq  v2_04_01
FEVInterfacesManager.h
1 #ifndef _ots_FEVInterfacesManager_h_
2 #define _ots_FEVInterfacesManager_h_
3 
4 #include <map>
5 #include <memory>
6 #include <mutex>
7 #include <queue>
8 #include <string>
9 #include "otsdaq-core/Configurable/Configurable.h"
10 #include "otsdaq-core/FECore/FEVInterface.h"
11 #include "otsdaq-core/FiniteStateMachine/VStateMachine.h"
12 
13 namespace ots
14 {
15 // FEVInterfacesManager
16 // This class is a virtual class that handles a collection of front-end interface
17 // plugins.
19 {
20  public:
21  FEVInterfacesManager(const ConfigurationTree& theXDAQContextConfigTree,
22  const std::string& supervisorConfigurationPath);
23  virtual ~FEVInterfacesManager(void);
24 
25  // Methods
26  void init(void);
27  void destroy(void);
28  void createInterfaces(void);
29 
30  // State Machine Methods
31  void configure(void);
32  void halt(void);
33  void initialize(void);
34  void pause(void);
35  void resume(void);
36  void start(std::string runNumber);
37  void stop(void);
38 
39  void universalRead(const std::string& interfaceID,
40  char* address,
41  char* returnValue); // used by MacroMaker
42  void universalWrite(const std::string& interfaceID,
43  char* address,
44  char* writeValue); // used by MacroMaker
45  std::string getFEListString(const std::string& supervisorLid); // used by MacroMaker
46  std::string getFEMacrosString(
47  const std::string& supervisorName,
48  const std::string& supervisorLid); // used by MacroMaker
49  void runFEMacro(
50  const std::string& interfaceID,
52  const std::string& inputArgs,
53  std::string& outputArgs); // used by MacroMaker and FE calling indirectly
54  void runFEMacro(const std::string& interfaceID,
55  const std::string& feMacroName,
56  const std::string& inputArgs,
57  std::string& outputArgs); // used by MacroMaker
58  void runMacro(const std::string& interfaceID,
59  const std::string& macroObjectString,
60  const std::string& inputArgs,
61  std::string& outputArgs); // used by MacroMaker
62  void runFEMacroByFE(
63  const std::string& callingInterfaceID,
64  const std::string& interfaceID,
65  const std::string& feMacroName,
66  const std::string& inputArgs,
67  std::string& outputArgs); // used by FE calling (i.e. FESupervisor)
68  void startFEMacroMultiDimensional(
69  const std::string& requester,
70  const std::string& interfaceID,
71  const std::string& feMacroName,
72  const bool enableSavingOutput,
73  const std::string& outputFilePath,
74  const std::string& outputFileRadix,
75  const std::string& inputArgs); // used by iterator calling (i.e. FESupervisor)
77  const std::string& requester,
78  const std::string& interfaceID,
79  const std::string& macroName,
80  const std::string& macroString,
81  const bool enableSavingOutput,
82  const std::string& outputFilePath,
83  const std::string& outputFileRadix,
84  const std::string& inputArgs); // used by iterator calling (i.e. FESupervisor)
85  bool checkMacroMultiDimensional(
86  const std::string& interfaceID,
87  const std::string& macroName); // used by iterator calling (i.e. FESupervisor)
88 
89  unsigned int getInterfaceUniversalAddressSize(
90  const std::string& interfaceID); // used by MacroMaker
91  unsigned int getInterfaceUniversalDataSize(
92  const std::string& interfaceID); // used by MacroMaker
93  bool allFEWorkloopsAreDone(void); // used by Iterator, e.g.
94  const FEVInterface& getFEInterface(const std::string& interfaceID) const;
95 
96  const std::map<std::string /*name*/, std::unique_ptr<FEVInterface> >& getFEInterfaces(
97  void) const
98  {
99  return theFEInterfaces_;
100  }
101  FEVInterface* getFEInterfaceP(const std::string& interfaceID);
102 
103  // FE communication helpers
104  std::mutex frontEndCommunicationReceiveMutex_;
105  std::map<std::string /*targetInterfaceID*/, // map of target to buffers organized by
106  // source
107  std::map<std::string /*requester*/, std::queue<std::string /*value*/> > >
108  frontEndCommunicationReceiveBuffer_;
109 
110  // multi-dimensional FE Macro helpers
111  std::mutex macroMultiDimensionalDoneMutex_;
112  std::map<std::string /*targetInterfaceID*/, // set of active multi-dimensional Macro
113  // launches
114  std::string /*status := Active, Done, Error: <message> */>
115  macroMultiDimensionalStatusMap_;
116 
117  private:
118  std::map<std::string /*name*/, std::unique_ptr<FEVInterface> > theFEInterfaces_;
119  std::vector<std::string /*name*/> theFENamesByPriority_;
120 
121  // for managing transition iterations
122  std::map<std::string /*name*/, bool /*isDone*/> stateMachinesIterationDone_;
123  unsigned int stateMachinesIterationWorkCount_;
124  unsigned int subIterationWorkStateMachineIndex_;
125  void preStateMachineExecution(unsigned int i);
126  bool postStateMachineExecution(unsigned int i);
127  void preStateMachineExecutionLoop(void);
128  void postStateMachineExecutionLoop(void);
129 };
130 
131 } // namespace ots
132 
133 #endif
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)