otsdaq  3.03.00
FEVInterface.h
1 #ifndef _ots_FEVInterface_h_
2 #define _ots_FEVInterface_h_
3 
4 #define TRACEMF_USE_VERBATIM 1 // for trace longer path filenames
5 #include "artdaq/DAQdata/Globals.hh"
6 
7 #include "otsdaq/Configurable/Configurable.h"
8 #include "otsdaq/FECore/FESlowControlsWorkLoop.h"
9 #include "otsdaq/FiniteStateMachine/VStateMachine.h"
10 #include "otsdaq/WorkLoopManager/WorkLoop.h"
11 
12 #include "otsdaq/CoreSupervisors/CoreSupervisorBase.h"
13 
14 #include "otsdaq/SupervisorInfo/AllSupervisorInfo.h" //to send errors to Gateway, e.g.
15 
16 #include "otsdaq/FECore/FESlowControlsChannel.h"
17 #include "otsdaq/SOAPUtilities/SOAPMessenger.h" //for xdaq::ApplicationDescriptor communication
18 
19 #include <array>
20 #include <iostream>
21 #include <string>
22 #include <vector>
23 
24 #include "otsdaq/Macros/CoutMacros.h"
25 
26 #define __ARGS__ \
27  [[maybe_unused]] const frontEndMacroStruct_t & feMacroStruct, \
28  [[maybe_unused]] FEVInterface::frontEndMacroConstArgs_t argsIn, \
29  [[maybe_unused]] FEVInterface::frontEndMacroArgs_t argsOut
30 
31 #define __GET_ARG_IN_NO_DEFAULT__(X, Y) getFEMacroConstArgumentValue<Y>(argsIn, X)
32 #define __GET_ARG_IN_DEFAULT__(X, Y, D) getFEMacroConstArgumentValue<Y>(argsIn, X, D)
33 #define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
34 #define __GET_ARG_IN_CHOOSER__(...) \
35  GET_4TH_ARG(__VA_ARGS__, __GET_ARG_IN_DEFAULT__, __GET_ARG_IN_NO_DEFAULT__, )
36 #define __GET_ARG_IN__(...) __GET_ARG_IN_CHOOSER__(__VA_ARGS__)(__VA_ARGS__)
37 #define __GET_ARG_OUT__(X, Y) getFEMacroArgumentValue<Y>(argsOut, X)
38 
39 #define __SET_ARG_IN__(X, Y) FEVInterface::emplaceFEMacroArgumentValue(argsIn, X, Y)
40 #define __SET_ARG_OUT__(X, Y) FEVInterface::setFEMacroArgumentValue(argsOut, X, Y)
41 
42 // clang-format off
43 #define PLOTLY_PLOT "Plotly_Plot"
66 
67 namespace ots
68 {
69 class FEVInterfacesManager;
70 
80 class FEVInterface : public WorkLoop, public Configurable, public VStateMachine
81 {
82  friend class FEVInterfacesManager;
83 
84  public:
86  const std::string& interfaceUID,
87  const ConfigurationTree& theXDAQContextConfigTree,
88  const std::string& configurationPath);
89 
90  virtual ~FEVInterface(void);
91 
92  FEVInterfacesManager* parentInterfaceManager_;
93 
94  const std::string& getInterfaceUID (void) const { return interfaceUID_; }
95  const std::string& getInterfaceType (void) const { return interfaceType_; }
96 
97  virtual void universalRead (char* address, char* returnValue) = 0;
98  virtual void universalWrite (char* address, char* writeValue) = 0;
99  const unsigned int& getUniversalAddressSize (void) { return universalAddressSize_; }
100  const unsigned int& getUniversalDataSize (void) { return universalDataSize_; }
101  virtual void universalBlockRead (char* address, char* returnValue, unsigned int numberOfBytes) { throw std::runtime_error("UNDEFINED BLOCK READ"); /* to make compiler happy, use params */ __COUTV__((void*)address); __COUTV__((void*)returnValue); __COUTV__(numberOfBytes); }
103  virtual void universalBlockWrite (char* address, char* writeValue, unsigned int numberOfBytes) { throw std::runtime_error("UNDEFINED BLOCK WRITE"); /* to make compiler happy, use params */ __COUTV__((void*)address); __COUTV__((void*)writeValue); __COUTV__(numberOfBytes); }
104 
105 
106  void runSequenceOfCommands (const std::string& treeLinkName);
107 
108  static void sendAsyncExceptionToGateway (FEVInterface* fe, const std::string& errMsg, bool isPauseException, bool isStopException);
109 
112  virtual void configure (void)
113  {
114  __COUT__ << "\t Configure" << std::endl;
116  "LinkToConfigureSequence"); /*Run Configure Sequence Commands*/
117  }
118  virtual void start (std::string /*runNumber*/)
119  {
120  __COUT__ << "\t Start" << std::endl;
121  runSequenceOfCommands("LinkToStartSequence"); /*Run Start Sequence Commands*/
122  }
123  virtual void stop (void)
124  {
125  __COUT__ << "\t Stop" << std::endl;
126  runSequenceOfCommands("LinkToStopSequence"); /*Run Stop Sequence Commands*/
127  }
128  virtual void halt (void) { stop(); }
129  virtual void pause (void) { stop(); }
130  virtual void resume (void) { start(""); }
131  virtual bool running (void) { /*while(WorkLoop::continueWorkLoop_){;}*/ return false; }
137  virtual void configureSlowControls (void);
138  void addSlowControlsChannels (ConfigurationTree slowControlsGroupLink, std::map<std::string /* ROC UID*/, FESlowControlsChannel>* mapOfSlowControlsChannels);
139 
140  virtual void resetSlowControlsChannelIterator (void);
142  virtual unsigned int getSlowControlsChannelCount (void);
143  bool slowControlsRunning (void);
144  void startSlowControlsWorkLoop (void) { slowControlsWorkLoop_.startWorkLoop(); }
145  void stopSlowControlsWorkLoop (void) { slowControlsWorkLoop_.stopWorkLoop(); }
146 
147 
148  static const std::string UNKNOWN_TYPE;
149 
150  protected:
152  std::map<std::string, FESlowControlsChannel> mapOfSlowControlsChannels_;
153  std::map<std::string,
154  FESlowControlsChannel>::iterator slowControlsChannelsIterator_;
155  FESlowControlsWorkLoop slowControlsWorkLoop_;
161  public:
163  using frontEndMacroArg_t = std::pair<const std::string /* arg name */, std::string /* arg return value */>;
164  using frontEndMacroArgs_t = std::vector<frontEndMacroArg_t>&;
165  using frontEndMacroConstArgs_t = const std::vector<frontEndMacroArg_t>&;
166  struct frontEndMacroStruct_t;
167  using frontEndMacroFunction_t = void (ots::FEVInterface::*)(__ARGS__);
169  {
171  const std::string& feMacroName,
172  const frontEndMacroFunction_t& feMacroFunction,
173  const std::vector<std::string>& namesOfInputArgs,
174  const std::vector<std::string>& namesOfOutputArgs,
175  const std::string& requiredUserPermissions = "1" /*Level definition: 0:no-access,1:=user,255:=admin*/,
176  const std::string& allowedCallingFrontEnds = "*" /*StringMacros:: wild card set match string (i.e. string-to-set, then wild-card-set match)*/,
177  const std::string& feMacroTooltip = "")
178  : feMacroName_ (feMacroName)
179  , macroFunction_ (feMacroFunction)
180  , namesOfInputArguments_ (namesOfInputArgs)
181  , namesOfOutputArguments_ (namesOfOutputArgs)
182  , requiredUserPermissions_ (requiredUserPermissions)
183  , allowedCallingFrontEnds_ (allowedCallingFrontEnds)
184  , feMacroTooltip_ (feMacroTooltip)
185  {
186  }
187 
188  const std::string feMacroName_;
190  const std::vector<std::string> namesOfInputArguments_, namesOfOutputArguments_;
191  const std::string requiredUserPermissions_;
192  const std::string allowedCallingFrontEnds_;
193  const std::string feMacroTooltip_;
194  }; //end frontEndMacroStruct_t
195  const std::map<std::string, frontEndMacroStruct_t>& getMapOfFEMacroFunctions(void)
196  {
197  return mapOfFEMacroFunctions_;
198  }
199  void runSelfFrontEndMacro (
200  const std::string& feMacroName,
201  const std::vector<FEVInterface::frontEndMacroArg_t>& inputArgs,
202  std::vector<FEVInterface::frontEndMacroArg_t>& outputArgs);
209  {
210  macroStruct_t(const std::string& macroString);
211 
212  enum
213  {
214  OP_TYPE_READ,
215  OP_TYPE_WRITE,
216  OP_TYPE_DELAY,
217  };
218 
219  struct readOp_t
220  {
221  uint64_t address_;
222  bool addressIsVar_;
223  std::string addressVarName_;
224  bool dataIsVar_;
225  std::string dataVarName_;
226  }; // end macroStruct_t::writeOp_t declaration
227 
228  struct writeOp_t
229  {
230  uint64_t address_;
231  bool addressIsVar_;
232  std::string addressVarName_;
233  uint64_t data_;
234  bool dataIsVar_;
235  std::string dataVarName_;
236  }; // end macroStruct_t::writeOp_t declaration
237 
238  struct delayOp_t
239  {
240  uint64_t delay_;
241  bool delayIsVar_;
242  std::string delayVarName_;
243  }; // end macroStruct_t::writeOp_t declaration
244 
245  std::string macroName_;
246  std::vector<std::pair<unsigned int /*op type*/,
247  unsigned int /*index in specific type vector*/> >
248  operations_;
249  std::vector<macroStruct_t::readOp_t> readOps_;
250  std::vector<macroStruct_t::writeOp_t> writeOps_;
251  std::vector<macroStruct_t::delayOp_t> delayOps_;
252  std::set<std::string> namesOfInputArguments_, namesOfOutputArguments_;
253  bool lsbf_;
254  }; // end macroStruct_t declaration
255  protected:
257  std::map<std::string /*name*/, uint64_t /*value*/>& variableMap);
258 
259  public:
266  template<class T>
267  void sendToFrontEnd (const std::string& targetInterfaceID, const T& value) const;
268  void runFrontEndMacro (const std::string& targetInterfaceID,const std::string& feMacroName, const std::vector<FEVInterface::frontEndMacroArg_t>& inputArgs, std::vector<FEVInterface::frontEndMacroArg_t>& outputArgs) const;
269 
274  template<class T>
275  void receiveFromFrontEnd (const std::string& requester, T& retValue, unsigned int timeoutInSeconds = 1) const;
277  void receiveFromFrontEnd (const std::string& requester, std::string& retValue, unsigned int timeoutInSeconds = 1) const;
280  template<class T>
281  T receiveFromFrontEnd (const std::string& requester = "*", unsigned int timeoutInSeconds = 1) const;
283  std::string receiveFromFrontEnd (const std::string& requester = "*", unsigned int timeoutInSeconds = 1) const;
284 
288  protected:
289  bool workLoopThread (toolbox::task::WorkLoop* workLoop);
290 
291  std::string interfaceUID_, interfaceType_;
292  std::string mfSubject_;
293 
294  unsigned int universalAddressSize_ = 0;
295  unsigned int universalDataSize_ = 0;
296 
297 
300  std::map<std::string, frontEndMacroStruct_t> mapOfFEMacroFunctions_;
302  const std::string& feMacroName,
303  frontEndMacroFunction_t feMacroFunction,
304  const std::vector<std::string>& namesOfInputArgs,
305  const std::vector<std::string>& namesOfOutputArgs,
306  uint8_t requiredUserPermissions = 1 /*Level definition: 0:no-access,1:=user,255:=admin*/,
307  const std::string& allowedCallingFEs = "*" /*StringMacros:: wild card set match string (i.e. string-to-set, then wild-card-set match)*/,
308  const std::string& feMacroTooltip = "");
310  const std::string& feMacroName,
311  frontEndMacroFunction_t feMacroFunction,
312  const std::vector<std::string>& namesOfInputArgs,
313  const std::vector<std::string>& namesOfOutputArgs,
314  const std::string& requiredUserPermissions = WebUsers::DEFAULT_USER_GROUP + ":1" /*Level definition: 0:no-access,1:=user,255:=admin*/,
315  const std::string& allowedCallingFEs = "*" /*StringMacros:: wild card set match string (i.e. string-to-set, then wild-card-set match)*/,
316  const std::string& feMacroTooltip = "");
317 
318  public:
319  static const std::string& getFEMacroConstArgument (frontEndMacroConstArgs_t args, const std::string& argName);
320  static std::string& getFEMacroArgument (frontEndMacroArgs_t args, const std::string& argName);
321  protected:
322  template<class T>
323  std::string& setFEMacroArgumentValue (frontEndMacroArgs_t args, const std::string& argName, const T& value) const;
324  public:
325  template<class T>
326  static std::string& emplaceFEMacroArgumentValue (frontEndMacroArgs_t args, const std::string& argName, const T& value);
327 
328 
329 }; // end FEVInterface class
330 
331 template<class T>
332 T getFEMacroConstArgumentValue (FEVInterface::frontEndMacroConstArgs_t args, const std::string& argName, const T& defaultValue = T());
333 
335 template<>
336 std::string getFEMacroConstArgumentValue<std::string> (FEVInterface::frontEndMacroConstArgs_t args, const std::string& argName, const std::string& defaultValue);
337 
338 template<class T>
339 T getFEMacroArgumentValue (FEVInterface::frontEndMacroArgs_t args, const std::string& argName);
340 
342 template<>
343 std::string getFEMacroArgumentValue<std::string> (FEVInterface::frontEndMacroArgs_t argsIn, const std::string& argName);
344 
346 #include "otsdaq/FECore/FEVInterface.icc"
347 
348 // clang-format on
349 
350 } // namespace ots
351 
352 #endif
void runMacro(FEVInterface::macroStruct_t &macro, std::map< std::string, uint64_t > &variableMap)
runMacro
virtual void resetSlowControlsChannelIterator(void)
virtual in case channels are handled in multiple maps, for example
void(ots::FEVInterface::*)(const frontEndMacroStruct_t &feMacroStruct, FEVInterface::frontEndMacroConstArgs_t argsIn, FEVInterface::frontEndMacroArgs_t argsOut) frontEndMacroFunction_t
void function (vector-of-inputs, vector-of-outputs)
Definition: FEVInterface.h:167
virtual void configureSlowControls(void)
end State Machine handlers
Definition: FEVInterface.cc:65
static void sendAsyncExceptionToGateway(FEVInterface *fe, const std::string &errMsg, bool isPauseException, bool isStopException)
void runSequenceOfCommands(const std::string &treeLinkName)
virtual void configure(void)
Definition: FEVInterface.h:112
std::map< std::string, frontEndMacroStruct_t > mapOfFEMacroFunctions_
Map of FE Macro functions members.
Definition: FEVInterface.h:300
static const std::string & getFEMacroConstArgument(frontEndMacroConstArgs_t args, const std::string &argName)
< for specialized access to FE Macro in/out arguments
bool universalBlockReadImplementationConfirmed
is confirmed by slow controls handling (for example) that universalBlockRead is implemented by the FE...
Definition: FEVInterface.h:102
void addSlowControlsChannels(ConfigurationTree slowControlsGroupLink, std::map< std::string, FESlowControlsChannel > *mapOfSlowControlsChannels)
std::string mfSubject_
for GEN_COUT decorations which would be safe in destructors, e.g. mirror interfaceUID_
Definition: FEVInterface.h:292
std::pair< const std::string, std::string > frontEndMacroArg_t
end Slow Controls
Definition: FEVInterface.h:163
virtual FESlowControlsChannel * getNextSlowControlsChannel(void)
virtual in case channels are handled in multiple maps, for example
void runFrontEndMacro(const std::string &targetInterfaceID, const std::string &feMacroName, const std::vector< FEVInterface::frontEndMacroArg_t > &inputArgs, std::vector< FEVInterface::frontEndMacroArg_t > &outputArgs) const
virtual void universalRead(char *address, char *returnValue)=0
throw std::runtime_error exception on error/timeout
void runSelfFrontEndMacro(const std::string &feMacroName, const std::vector< FEVInterface::frontEndMacroArg_t > &inputArgs, std::vector< FEVInterface::frontEndMacroArg_t > &outputArgs)
T receiveFromFrontEnd(const std::string &requester="*", unsigned int timeoutInSeconds=1) const
static std::string & getFEMacroArgument(frontEndMacroArgs_t args, const std::string &argName)
virtual bool running(void)
Definition: FEVInterface.h:131
bool slowControlsRunning(void)
slow controls workloop calls this
virtual unsigned int getSlowControlsChannelCount(void)
virtual in case channels are handled in multiple maps, for example
void receiveFromFrontEnd(const std::string &requester, T &retValue, unsigned int timeoutInSeconds=1) const
bool workLoopThread(toolbox::task::WorkLoop *workLoop)
end FE Communication helpers //////
void sendToFrontEnd(const std::string &targetInterfaceID, const T &value) const
end FE Macros
void registerFEMacroFunction(const std::string &feMacroName, frontEndMacroFunction_t feMacroFunction, const std::vector< std::string > &namesOfInputArgs, const std::vector< std::string > &namesOfOutputArgs, uint8_t requiredUserPermissions=1, const std::string &allowedCallingFEs="*", const std::string &feMacroTooltip="")
std::map< std::string, FESlowControlsChannel > mapOfSlowControlsChannels_
Slow Controls members.
Definition: FEVInterface.h:152
< members fully define a front-end macro function
Definition: FEVInterface.h:169
const frontEndMacroFunction_t macroFunction_
Note: must be called using this instance.
Definition: FEVInterface.h:189
macroStruct_t(const std::string &macroString)
macroStruct_t constructor
bool lsbf_
least significant byte first
Definition: FEVInterface.h:253