1 #ifndef _ots_FEVInterface_h_
2 #define _ots_FEVInterface_h_
4 #define TRACE_NAME "FEVInterface"
5 #include "artdaq/DAQdata/Globals.hh"
7 #include "otsdaq-core/Configurable/Configurable.h"
8 #include "otsdaq-core/FECore/FESlowControlsWorkLoop.h"
9 #include "otsdaq-core/FiniteStateMachine/VStateMachine.h"
10 #include "otsdaq-core/WorkLoopManager/WorkLoop.h"
12 #include "otsdaq-core/CoreSupervisors/CoreSupervisorBase.h"
14 #include "otsdaq-core/SupervisorInfo/AllSupervisorInfo.h"
16 #include "otsdaq-core/CoreSupervisors/FESupervisor.h"
18 #include "otsdaq-core/FECore/FESlowControlsChannel.h"
19 #include "otsdaq-core/SOAPUtilities/SOAPMessenger.h"
26 #include "otsdaq-core/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)
42 class FEVInterfacesManager;
60 const std::string& configurationPath);
66 const std::string& getInterfaceUID(
void)
const {
return interfaceUID_; }
67 virtual std::string getInterfaceType(
void)
const
69 return theXDAQContextConfigTree_.getBackNode(theConfigurationPath_)
70 .getNode(
"FEInterfacePluginName")
71 .getValue<std::string>();
74 virtual void universalRead(
76 char* returnValue) = 0;
77 virtual void universalWrite(
char* address,
char* writeValue) = 0;
78 const unsigned int& getUniversalAddressSize(
void) {
return universalAddressSize_; }
79 const unsigned int& getUniversalDataSize(
void) {
return universalDataSize_; }
81 void runSequenceOfCommands(
const std::string& treeLinkName);
84 const std::string& errMsg,
91 __COUT__ <<
"\t Configure" << std::endl;
92 runSequenceOfCommands(
93 "LinkToConfigureSequence");
95 void start(std::string runNumber)
97 __COUT__ <<
"\t Start" << std::endl;
98 runSequenceOfCommands(
"LinkToStartSequence");
102 __COUT__ <<
"\t Stop" << std::endl;
103 runSequenceOfCommands(
"LinkToStopSequence");
105 void halt(
void) { stop(); }
106 void pause(
void) { stop(); }
107 void resume(
void) { start(
""); }
108 bool running(
void) {
return false; }
114 void configureSlowControls(
void);
115 bool slowControlsRunning(
void);
116 void startSlowControlsWorkLooop(
void) { slowControlsWorkLoop_.startWorkLoop(); }
117 void stopSlowControlsWorkLooop(
void) { slowControlsWorkLoop_.stopWorkLoop(); }
125 using frontEndMacroArg_t =
126 std::pair<
const std::string , std::string >;
127 using frontEndMacroArgs_t = std::vector<frontEndMacroArg_t>&;
128 using frontEndMacroConstArgs_t =
const std::vector<frontEndMacroArg_t>&;
135 const std::string& feMacroName,
136 const frontEndMacroFunction_t& feMacroFunction,
137 const std::vector<std::string>& namesOfInputArgs,
138 const std::vector<std::string>& namesOfOutputArgs,
139 const uint8_t requiredUserPermissions = 1 ,
140 const std::string& allowedCallingFrontEnds =
142 : feMacroName_(feMacroName)
143 , macroFunction_(feMacroFunction)
144 , namesOfInputArguments_(namesOfInputArgs)
145 , namesOfOutputArguments_(namesOfOutputArgs)
146 , requiredUserPermissions_(requiredUserPermissions)
147 , allowedCallingFrontEnds_(allowedCallingFrontEnds)
151 const std::string feMacroName_;
152 const frontEndMacroFunction_t
154 const std::vector<std::string> namesOfInputArguments_, namesOfOutputArguments_;
155 const uint8_t requiredUserPermissions_;
156 const std::string allowedCallingFrontEnds_;
158 const std::map<std::string, frontEndMacroStruct_t>& getMapOfFEMacroFunctions(
void)
160 return mapOfFEMacroFunctions_;
162 void runSelfFrontEndMacro(
163 const std::string& feMacroName,
164 const std::vector<FEVInterface::frontEndMacroArg_t>& inputArgs,
165 std::vector<FEVInterface::frontEndMacroArg_t>& outputArgs);
186 std::string addressVarName_;
188 std::string dataVarName_;
195 std::string addressVarName_;
198 std::string dataVarName_;
205 std::string delayVarName_;
208 std::string macroName_;
209 std::vector<std::pair<
unsigned int ,
212 std::vector<macroStruct_t::readOp_t> readOps_;
213 std::vector<macroStruct_t::writeOp_t> writeOps_;
214 std::vector<macroStruct_t::delayOp_t> delayOps_;
215 std::set<std::string> namesOfInputArguments_, namesOfOutputArguments_;
220 std::map<std::string /*name*/, uint64_t /*value*/>& variableMap);
230 void sendToFrontEnd(
const std::string& targetInterfaceID,
const T& value)
const;
231 void runFrontEndMacro(
232 const std::string& targetInterfaceID,
233 const std::string& feMacroName,
234 const std::vector<FEVInterface::frontEndMacroArg_t>& inputArgs,
235 std::vector<FEVInterface::frontEndMacroArg_t>& outputArgs)
const;
242 void receiveFromFrontEnd(
const std::string& requester,
244 unsigned int timeoutInSeconds = 1)
const;
246 void receiveFromFrontEnd(
const std::string& requester,
247 std::string& retValue,
248 unsigned int timeoutInSeconds = 1)
const;
252 T receiveFromFrontEnd(
const std::string& requester =
"*",
253 unsigned int timeoutInSeconds = 1)
const;
255 std::string receiveFromFrontEnd(
const std::string& requester =
"*",
256 unsigned int timeoutInSeconds = 1)
const;
262 bool workLoopThread(toolbox::task::WorkLoop* workLoop);
263 std::string interfaceUID_;
265 unsigned int universalAddressSize_ = 0;
266 unsigned int universalDataSize_ = 0;
269 std::map<std::string, FESlowControlsChannel> mapOfSlowControlsChannels_;
274 std::map<std::string, frontEndMacroStruct_t>
275 mapOfFEMacroFunctions_;
276 void registerFEMacroFunction(
277 const std::string& feMacroName,
278 frontEndMacroFunction_t feMacroFunction,
279 const std::vector<std::string>& namesOfInputArgs,
280 const std::vector<std::string>& namesOfOutputArgs,
281 uint8_t requiredUserPermissions = 1 ,
282 const std::string& allowedCallingFEs =
286 static const std::string& getFEMacroConstArgument(frontEndMacroConstArgs_t args,
287 const std::string& argName);
288 static std::string& getFEMacroArgument(frontEndMacroArgs_t args,
289 const std::string& argName);
293 std::string& setFEMacroArgumentValue(frontEndMacroArgs_t args,
294 const std::string& argName,
295 const T& value)
const;
304 std::string& emplaceFEMacroArgumentValue(frontEndMacroArgs_t args,
305 const std::string& argName,
306 const T& value)
const;
317 T getFEMacroConstArgumentValue(FEVInterface::frontEndMacroConstArgs_t args,
318 const std::string& argName);
321 std::string getFEMacroConstArgumentValue<std::string>(
322 FEVInterface::frontEndMacroConstArgs_t args,
const std::string& argName);
325 T getFEMacroArgumentValue(FEVInterface::frontEndMacroArgs_t args,
326 const std::string& argName);
330 std::string getFEMacroArgumentValue<std::string>(FEVInterface::frontEndMacroArgs_t argsIn,
331 const std::string& argName);
334 #include "otsdaq-core/FECore/FEVInterface.icc"