1 #ifndef _ots_FEVInterface_h_
2 #define _ots_FEVInterface_h_
6 #define TRACEMF_USE_VERBATIM 1
7 #include "artdaq/DAQdata/Globals.hh"
9 #include "otsdaq/Configurable/Configurable.h"
10 #include "otsdaq/FECore/FESlowControlsWorkLoop.h"
11 #include "otsdaq/FiniteStateMachine/VStateMachine.h"
12 #include "otsdaq/WorkLoopManager/WorkLoop.h"
14 #include "otsdaq/CoreSupervisors/CoreSupervisorBase.h"
16 #include "otsdaq/SupervisorInfo/AllSupervisorInfo.h"
18 #include "otsdaq/FECore/FESlowControlsChannel.h"
19 #include "otsdaq/SOAPUtilities/SOAPMessenger.h"
29 #include "otsdaq/Macros/CoutMacros.h"
32 [[maybe_unused]] const frontEndMacroStruct_t & feMacroStruct, \
33 [[maybe_unused]] FEVInterface::frontEndMacroConstArgs_t argsIn, \
34 [[maybe_unused]] FEVInterface::frontEndMacroArgs_t argsOut
36 #define __GET_ARG_IN_NO_DEFAULT__(X, Y) getFEMacroConstArgumentValue<Y>(argsIn, X)
37 #define __GET_ARG_IN_DEFAULT__(X, Y, D) getFEMacroConstArgumentValue<Y>(argsIn, X, D)
38 #define GET_4TH_ARG(arg1, arg2, arg3, arg4, ...) arg4
39 #define __GET_ARG_IN_CHOOSER__(...) \
40 GET_4TH_ARG(__VA_ARGS__, __GET_ARG_IN_DEFAULT__, __GET_ARG_IN_NO_DEFAULT__, )
41 #define __GET_ARG_IN__(...) __GET_ARG_IN_CHOOSER__(__VA_ARGS__)(__VA_ARGS__)
42 #define __GET_ARG_OUT__(X, Y) getFEMacroArgumentValue<Y>(argsOut, X)
44 #define __SET_ARG_IN__(X, Y) FEVInterface::emplaceFEMacroArgumentValue(argsIn, X, Y)
45 #define __SET_ARG_OUT__(X, Y) FEVInterface::setFEMacroArgumentValue(argsOut, X, Y)
46 #define __SET_PCT_DONE__(X) setFEMacroPercentDone(X)
49 #define PLOTLY_PLOT "Plotly_Plot"
75 class FEVInterfacesManager;
92 const std::string& interfaceUID,
94 const std::string& configurationPath);
103 const std::string& getInterfaceUID (
void)
const {
return interfaceUID_; }
104 const std::string& getInterfaceType (
void)
const {
return interfaceType_; }
107 virtual void universalWrite (
char* address,
char* writeValue) = 0;
108 const unsigned int& getUniversalAddressSize (
void) {
return universalAddressSize_; }
109 const unsigned int& getUniversalDataSize (
void) {
return universalDataSize_; }
110 virtual void universalBlockRead (
char* address,
char* returnValue,
unsigned int numberOfBytes) {
throw std::runtime_error(
"UNDEFINED BLOCK READ"); __COUTV__((
void*)address); __COUTV__((
void*)returnValue); __COUTV__(numberOfBytes); }
112 virtual void universalBlockWrite (
char* address,
char* writeValue,
unsigned int numberOfBytes) {
throw std::runtime_error(
"UNDEFINED BLOCK WRITE"); __COUTV__((
void*)address); __COUTV__((
void*)writeValue); __COUTV__(numberOfBytes); }
123 __COUT__ <<
"\t Configure" << std::endl;
125 "LinkToConfigureSequence");
127 virtual void start (std::string )
129 __COUT__ <<
"\t Start" << std::endl;
132 virtual void stop (
void)
134 __COUT__ <<
"\t Stop" << std::endl;
137 virtual void halt (
void) { stop(); }
138 virtual void pause (
void) { stop(); }
139 virtual void resume (
void) { start(
""); }
153 void startSlowControlsWorkLoop (
void) { slowControlsWorkLoop_.startWorkLoop(); }
154 void stopSlowControlsWorkLoop (
void) { slowControlsWorkLoop_.stopWorkLoop(); }
156 static const std::string UNKNOWN_TYPE;
161 std::map<std::string,
164 std::atomic<bool> slowControlsWorkLoopShouldRun_{
true};
174 using frontEndMacroArg_t = std::pair<
const std::string , std::string >;
175 using frontEndMacroArgs_t = std::vector<frontEndMacroArg_t>&;
176 using frontEndMacroConstArgs_t =
const std::vector<frontEndMacroArg_t>&;
182 const std::string& feMacroName,
184 const std::vector<std::string>& namesOfInputArgs,
185 const std::vector<std::string>& namesOfOutputArgs,
186 const std::string& requiredUserPermissions =
"1" ,
187 const std::string& allowedCallingFrontEnds =
"*" ,
188 const std::string& feMacroTooltip =
"")
189 : feMacroName_ (feMacroName)
191 , namesOfInputArguments_ (namesOfInputArgs)
192 , namesOfOutputArguments_ (namesOfOutputArgs)
193 , requiredUserPermissions_ (requiredUserPermissions)
194 , allowedCallingFrontEnds_ (allowedCallingFrontEnds)
195 , feMacroTooltip_ (feMacroTooltip)
199 const std::string feMacroName_;
201 const std::vector<std::string> namesOfInputArguments_, namesOfOutputArguments_;
202 const std::string requiredUserPermissions_;
203 const std::string allowedCallingFrontEnds_;
204 const std::string feMacroTooltip_;
206 const std::map<std::string, frontEndMacroStruct_t>& getMapOfFEMacroFunctions(
void)
215 const std::map<std::string, std::string>& )
const
219 void runSelfFrontEndMacro (
220 const std::string& feMacroName,
221 const std::vector<FEVInterface::frontEndMacroArg_t>& inputArgs,
222 std::vector<FEVInterface::frontEndMacroArg_t>& outputArgs);
224 void runSelfFrontEndMacro(
225 const std::string& feMacroName,
226 const std::vector<frontEndMacroArg_t>& inputArgs,
227 std::vector<frontEndMacroArg_t>& outputArgs,
228 const std::function<
void(
unsigned int)>& onProgress);
250 std::string addressVarName_;
252 std::string dataVarName_;
259 std::string addressVarName_;
262 std::string dataVarName_;
269 std::string delayVarName_;
272 std::string macroName_;
273 std::vector<std::pair<
unsigned int ,
276 std::vector<macroStruct_t::readOp_t> readOps_;
277 std::vector<macroStruct_t::writeOp_t> writeOps_;
278 std::vector<macroStruct_t::delayOp_t> delayOps_;
279 std::set<std::string> namesOfInputArguments_, namesOfOutputArguments_;
284 std::map<std::string /*name*/, uint64_t /*value*/>& variableMap);
294 void sendToFrontEnd (
const std::string& targetInterfaceID,
const T& value)
const;
295 void runFrontEndMacro (
const std::string& targetInterfaceID,
const std::string& feMacroName,
const std::vector<FEVInterface::frontEndMacroArg_t>& inputArgs, std::vector<FEVInterface::frontEndMacroArg_t>& outputArgs)
const;
297 void PauseResumeSlowControls (__ARGS__);
304 void receiveFromFrontEnd (
const std::string& requester, T& retValue,
unsigned int timeoutInSeconds = 1)
const;
306 void receiveFromFrontEnd (
const std::string& requester, std::string& retValue,
unsigned int timeoutInSeconds = 1)
const;
312 std::string
receiveFromFrontEnd (
const std::string& requester =
"*",
unsigned int timeoutInSeconds = 1)
const;
320 std::string interfaceUID_, interfaceType_;
323 unsigned int universalAddressSize_ = 0;
324 unsigned int universalDataSize_ = 0;
331 const std::string& feMacroName,
333 const std::vector<std::string>& namesOfInputArgs,
334 const std::vector<std::string>& namesOfOutputArgs,
335 uint8_t requiredUserPermissions = 1 ,
336 const std::string& allowedCallingFEs =
"*" ,
337 const std::string& feMacroTooltip =
"");
339 const std::string& feMacroName,
341 const std::vector<std::string>& namesOfInputArgs,
342 const std::vector<std::string>& namesOfOutputArgs,
343 const std::string& requiredUserPermissions = WebUsers::DEFAULT_USER_GROUP +
":1" ,
344 const std::string& allowedCallingFEs =
"*" ,
345 const std::string& feMacroTooltip =
"");
349 static std::string&
getFEMacroArgument (frontEndMacroArgs_t args,
const std::string& argName);
352 std::string& setFEMacroArgumentValue (frontEndMacroArgs_t args,
const std::string& argName,
const T& value)
const;
355 static std::string& emplaceFEMacroArgumentValue (frontEndMacroArgs_t args,
const std::string& argName,
const T& value);
359 int getFEMacroPercentDone (std::thread::id threadID)
const;
360 void clearFEMacroPercentDone (std::thread::id threadID);
363 mutable std::mutex feMacroPercentDoneMutex_;
364 std::map<std::thread::id, int> feMacroPercentDoneMap_;
369 T getFEMacroConstArgumentValue (FEVInterface::frontEndMacroConstArgs_t args,
const std::string& argName,
const T& defaultValue = T());
373 std::string getFEMacroConstArgumentValue<std::string> (FEVInterface::frontEndMacroConstArgs_t args,
const std::string& argName,
const std::string& defaultValue);
376 T getFEMacroArgumentValue (FEVInterface::frontEndMacroArgs_t args,
const std::string& argName);
380 std::string getFEMacroArgumentValue<std::string> (FEVInterface::frontEndMacroArgs_t argsIn,
const std::string& argName);
383 #include "otsdaq/FECore/FEVInterface.icc"
void runMacro(FEVInterface::macroStruct_t ¯o, 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)
virtual void configureSlowControls(void)
end State Machine handlers
static void sendAsyncExceptionToGateway(FEVInterface *fe, const std::string &errMsg, bool isPauseException, bool isStopException)
void runSequenceOfCommands(const std::string &treeLinkName)
virtual void configure(void)
std::map< std::string, frontEndMacroStruct_t > mapOfFEMacroFunctions_
Map of FE Macro functions members.
virtual std::map< std::string, std::string > getFEMacroInputDefaults(const std::string &, const std::map< std::string, std::string > &) const
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...
void addSlowControlsChannels(ConfigurationTree slowControlsGroupLink, std::map< std::string, FESlowControlsChannel > *mapOfSlowControlsChannels)
static const std::string DEFAULT
end Slow Controls
std::string mfSubject_
for GEN_COUT decorations which would be safe in destructors, e.g. mirror interfaceUID_
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 setFEMacroPercentDone(unsigned int percentDone)
FE Macro progress reporting (for async macros via FESupervisor)
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)
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.
defines used also by OtsConfigurationWizardSupervisor
< members fully define a front-end macro function
const frontEndMacroFunction_t macroFunction_
Note: must be called using this instance.
uint64_t delay_
milliseconds
macroStruct_t(const std::string ¯oString)
macroStruct_t constructor
bool lsbf_
least significant byte first