1 #ifndef _ots_FEVInterface_h_
2 #define _ots_FEVInterface_h_
4 #define TRACE_NAME "FEVInterface"
5 #include "artdaq/DAQdata/Globals.hh"
7 #include "otsdaq/Configurable/Configurable.h"
8 #include "otsdaq/FECore/FESlowControlsWorkLoop.h"
9 #include "otsdaq/FiniteStateMachine/VStateMachine.h"
10 #include "otsdaq/WorkLoopManager/WorkLoop.h"
12 #include "otsdaq/CoreSupervisors/CoreSupervisorBase.h"
14 #include "otsdaq/SupervisorInfo/AllSupervisorInfo.h"
16 #include "otsdaq/CoreSupervisors/FESupervisor.h"
18 #include "otsdaq/FECore/FESlowControlsChannel.h"
19 #include "otsdaq/SOAPUtilities/SOAPMessenger.h"
26 #include "otsdaq/Macros/CoutMacros.h"
29 const frontEndMacroStruct_t & feMacroStruct, \
30 FEVInterface::frontEndMacroConstArgs_t argsIn, \
31 FEVInterface::frontEndMacroArgs_t argsOut
33 #define __GET_ARG_IN__(X, Y) getFEMacroConstArgumentValue<Y>(argsIn, X)
34 #define __GET_ARG_OUT__(X, Y) getFEMacroArgumentValue<Y>(argsOut, X)
36 #define __SET_ARG_IN__(X, Y) FEVInterface::emplaceFEMacroArgumentValue(argsIn, X, Y)
37 #define __SET_ARG_OUT__(X, Y) FEVInterface::setFEMacroArgumentValue(argsOut, X, Y)
41 class FEVInterfacesManager;
60 const std::string& interfaceUID,
62 const std::string& configurationPath);
69 const std::string& getInterfaceUID (
void)
const {
return interfaceUID_; }
70 virtual std::string getInterfaceType (
void)
const
72 return theXDAQContextConfigTree_.getBackNode(theConfigurationPath_)
73 .getNode(
"FEInterfacePluginName")
74 .getValue<std::string>();
77 virtual void universalRead (
char* address,
char* returnValue) = 0;
78 virtual void universalWrite (
char* address,
char* writeValue) = 0;
79 const unsigned int& getUniversalAddressSize (
void) {
return universalAddressSize_; }
80 const unsigned int& getUniversalDataSize (
void) {
return universalDataSize_; }
82 void runSequenceOfCommands (
const std::string& treeLinkName);
84 static void sendAsyncErrorToGateway (
FEVInterface* fe,
const std::string& errMsg,
bool isSoftError);
90 __COUT__ <<
"\t Configure" << std::endl;
91 runSequenceOfCommands(
92 "LinkToConfigureSequence");
94 void start (std::string runNumber)
96 __COUT__ <<
"\t Start" << std::endl;
97 runSequenceOfCommands(
"LinkToStartSequence");
101 __COUT__ <<
"\t Stop" << std::endl;
102 runSequenceOfCommands(
"LinkToStopSequence");
104 void halt (
void) { stop(); }
105 void pause (
void) { stop(); }
106 void resume (
void) { start(
""); }
107 bool running (
void) {
return false; }
113 virtual void configureSlowControls (
void);
114 void addSlowControlsChannels (
ConfigurationTree slowControlsGroupLink,
const std::string& subInterfaceID, std::map<std::string /* ROC UID*/, FESlowControlsChannel>* mapOfSlowControlsChannels);
116 virtual void resetSlowControlsChannelIterator (
void);
118 virtual unsigned int getSlowControlsChannelCount (
void);
120 bool slowControlsRunning (
void);
121 void startSlowControlsWorkLoop (
void) { slowControlsWorkLoop_.startWorkLoop(); }
122 void stopSlowControlsWorkLoop (
void) { slowControlsWorkLoop_.stopWorkLoop(); }
126 std::map<std::string, FESlowControlsChannel> mapOfSlowControlsChannels_;
127 std::map<std::string,
137 using frontEndMacroArg_t = std::pair<
const std::string , std::string >;
138 using frontEndMacroArgs_t = std::vector<frontEndMacroArg_t>&;
139 using frontEndMacroConstArgs_t =
const std::vector<frontEndMacroArg_t>&;
145 const std::string& feMacroName,
146 const frontEndMacroFunction_t& feMacroFunction,
147 const std::vector<std::string>& namesOfInputArgs,
148 const std::vector<std::string>& namesOfOutputArgs,
149 const uint8_t requiredUserPermissions = 1 ,
150 const std::string& allowedCallingFrontEnds =
"*" )
151 : feMacroName_ (feMacroName)
152 , macroFunction_ (feMacroFunction)
153 , namesOfInputArguments_ (namesOfInputArgs)
154 , namesOfOutputArguments_ (namesOfOutputArgs)
155 , requiredUserPermissions_ (requiredUserPermissions)
156 , allowedCallingFrontEnds_ (allowedCallingFrontEnds)
160 const std::string feMacroName_;
161 const frontEndMacroFunction_t macroFunction_;
162 const std::vector<std::string> namesOfInputArguments_, namesOfOutputArguments_;
163 const uint8_t requiredUserPermissions_;
164 const std::string allowedCallingFrontEnds_;
166 const std::map<std::string, frontEndMacroStruct_t>& getMapOfFEMacroFunctions(
void)
168 return mapOfFEMacroFunctions_;
170 void runSelfFrontEndMacro (
171 const std::string& feMacroName,
172 const std::vector<FEVInterface::frontEndMacroArg_t>& inputArgs,
173 std::vector<FEVInterface::frontEndMacroArg_t>& outputArgs);
194 std::string addressVarName_;
196 std::string dataVarName_;
203 std::string addressVarName_;
206 std::string dataVarName_;
213 std::string delayVarName_;
216 std::string macroName_;
217 std::vector<std::pair<
unsigned int ,
220 std::vector<macroStruct_t::readOp_t> readOps_;
221 std::vector<macroStruct_t::writeOp_t> writeOps_;
222 std::vector<macroStruct_t::delayOp_t> delayOps_;
223 std::set<std::string> namesOfInputArguments_, namesOfOutputArguments_;
228 std::map<std::string /*name*/, uint64_t /*value*/>& variableMap);
238 void sendToFrontEnd (
const std::string& targetInterfaceID,
const T& value)
const;
239 void runFrontEndMacro (
const std::string& targetInterfaceID,
const std::string& feMacroName,
const std::vector<FEVInterface::frontEndMacroArg_t>& inputArgs, std::vector<FEVInterface::frontEndMacroArg_t>& outputArgs)
const;
246 void receiveFromFrontEnd (
const std::string& requester, T& retValue,
unsigned int timeoutInSeconds = 1)
const;
248 void receiveFromFrontEnd (
const std::string& requester, std::string& retValue,
unsigned int timeoutInSeconds = 1)
const;
252 T receiveFromFrontEnd (
const std::string& requester =
"*",
unsigned int timeoutInSeconds = 1)
const;
254 std::string receiveFromFrontEnd (
const std::string& requester =
"*",
unsigned int timeoutInSeconds = 1)
const;
260 bool workLoopThread (toolbox::task::WorkLoop* workLoop);
262 std::string interfaceUID_;
264 unsigned int universalAddressSize_ = 0;
265 unsigned int universalDataSize_ = 0;
270 std::map<std::string, frontEndMacroStruct_t> mapOfFEMacroFunctions_;
271 void registerFEMacroFunction (
272 const std::string& feMacroName,
273 frontEndMacroFunction_t feMacroFunction,
274 const std::vector<std::string>& namesOfInputArgs,
275 const std::vector<std::string>& namesOfOutputArgs,
276 uint8_t requiredUserPermissions = 1 ,
277 const std::string& allowedCallingFEs =
"*" );
280 static const std::string& getFEMacroConstArgument (frontEndMacroConstArgs_t args,
const std::string& argName);
281 static std::string& getFEMacroArgument (frontEndMacroArgs_t args,
const std::string& argName);
285 std::string& setFEMacroArgumentValue (frontEndMacroArgs_t args,
const std::string& argName,
const T& value)
const;
288 std::string& emplaceFEMacroArgumentValue (frontEndMacroArgs_t args,
const std::string& argName,
const T& value)
const;
294 T getFEMacroConstArgumentValue (FEVInterface::frontEndMacroConstArgs_t args,
const std::string& argName);
298 std::string getFEMacroConstArgumentValue<std::string> (FEVInterface::frontEndMacroConstArgs_t args,
const std::string& argName);
301 T getFEMacroArgumentValue (FEVInterface::frontEndMacroArgs_t args,
const std::string& argName);
305 std::string getFEMacroArgumentValue<std::string> (FEVInterface::frontEndMacroArgs_t argsIn,
const std::string& argName);
308 #include "otsdaq/FECore/FEVInterface.icc"