1 #ifndef _ots_FEVInterface_h_
2 #define _ots_FEVInterface_h_
4 #include "otsdaq-core/FiniteStateMachine/VStateMachine.h"
5 #include "otsdaq-core/WorkLoopManager/WorkLoop.h"
6 #include "otsdaq-core/Configurable/Configurable.h"
7 #include "otsdaq-core/FECore/FESlowControlsWorkLoop.h"
11 #include "otsdaq-core/FECore/FESlowControlsChannel.h"
18 #define __ARGS__ FEVInterface::frontEndMacroInArgs_t argsIn, FEVInterface::frontEndMacroOutArgs_t argsOut
19 #define __GET_ARG_IN__(X,Y) getFEMacroInputArgumentValue<Y> (argsIn ,X)
20 #define __GET_ARG_OUT__(X) FEVInterface::getFEMacroOutputArgument (argsOut,X)
21 #define __SET_ARG_OUT__(X,Y) FEVInterface::setFEMacroOutputArgumentValue (argsOut,X,Y)
26 class FrontEndHardwareBase;
27 class FrontEndFirmwareBase;
28 class FEInterfaceConfigurationBase;
41 ,
Configurable (theXDAQContextConfigTree, configurationPath)
42 , interfaceUID_ (interfaceUID)
43 , interfaceType_ (theXDAQContextConfigTree_.getBackNode(theConfigurationPath_).getNode(
"FEInterfacePluginName").getValue<std::string>())
44 , daqHardwareType_ (
"NOT SET")
45 , firmwareType_ (
"NOT SET")
46 , slowControlsWorkLoop_ (interfaceUID +
"-SlowControls",
this)
63 const std::string& getInterfaceUID (
void)
const {
return interfaceUID_;}
64 const std::string& getDaqHardwareType (
void)
const {
return daqHardwareType_;}
65 const std::string& getFirmwareType (
void)
const {
return firmwareType_;}
66 const std::string& getInterfaceType (
void)
const {
return interfaceType_;}
68 virtual int universalRead (
char* address,
char* returnValue) = 0;
69 virtual void universalWrite (
char* address,
char* writeValue) = 0;
70 const unsigned int& getUniversalAddressSize (
void) {
return universalAddressSize_;}
71 const unsigned int& getUniversalDataSize (
void) {
return universalDataSize_;}
73 FrontEndHardwareBase* getHardwareP (
void)
const {
return theFrontEndHardware_;}
74 FrontEndFirmwareBase* getFirmwareP (
void)
const {
return theFrontEndFirmware_;}
76 void runSequenceOfCommands (
const std::string &treeLinkName);
80 void configure (
void) { __COUT__ <<
"\t Configure" << std::endl; runSequenceOfCommands(
"LinkToConfigureSequence"); }
81 void start (std::string runNumber) { __COUT__ <<
"\t Start" << std::endl; runSequenceOfCommands(
"LinkToStartSequence"); }
82 void stop (
void) { __COUT__ <<
"\t Stop" << std::endl; runSequenceOfCommands(
"LinkToStopSequence"); }
83 void halt (
void) { stop();}
84 void pause (
void) { stop();}
85 void resume (
void) { start(
"");}
86 bool running (
void) {
return false;}
92 void configureSlowControls (
void);
93 bool slowControlsRunning (
void);
94 void startSlowControlsWorkLooop (
void) {slowControlsWorkLoop_.startWorkLoop();}
95 void stopSlowControlsWorkLooop (
void) {slowControlsWorkLoop_.stopWorkLoop();}
104 using frontEndMacroInArg_t = std::pair<
const std::string ,
const std::string >;
105 using frontEndMacroInArgs_t =
const std::vector<frontEndMacroInArg_t> &;
106 using frontEndMacroOutArg_t = std::pair<
const std::string , std::string >;
107 using frontEndMacroOutArgs_t = std::vector<frontEndMacroOutArg_t> &;
108 using frontEndMacroFunction_t = void (
ots::FEVInterface::* )(frontEndMacroInArgs_t, frontEndMacroOutArgs_t);
112 const std::vector<std::string> &namesOfInputArgs,
113 const std::vector<std::string> &namesOfOutputArgs,
114 const uint8_t requiredUserPermissions)
115 :macroFunction_(feMacroFunction)
116 ,namesOfInputArguments_(namesOfInputArgs)
117 ,namesOfOutputArguments_(namesOfOutputArgs)
118 ,requiredUserPermissions_(requiredUserPermissions)
121 const frontEndMacroFunction_t macroFunction_;
122 const std::vector<std::string> namesOfInputArguments_, namesOfOutputArguments_;
123 const uint8_t requiredUserPermissions_;
125 const std::map<std::string, frontEndMacroStruct_t>& getMapOfFEMacroFunctions() {
return mapOfFEMacroFunctions_;}
130 bool workLoopThread(toolbox::task::WorkLoop* workLoop){continueWorkLoop_ = running();
return continueWorkLoop_;}
131 std::string interfaceUID_;
132 std::string interfaceType_;
135 std::string daqHardwareType_;
136 std::string firmwareType_;
138 FrontEndHardwareBase* theFrontEndHardware_ =
nullptr;
139 FrontEndFirmwareBase* theFrontEndFirmware_ =
nullptr;
141 unsigned int universalAddressSize_ = 0;
142 unsigned int universalDataSize_ = 0;
145 std::map<std::string, FESlowControlsChannel> mapOfSlowControlsChannels_;
146 FESlowControlsWorkLoop slowControlsWorkLoop_;
151 std::map<std::string, frontEndMacroStruct_t> mapOfFEMacroFunctions_;
152 void registerFEMacroFunction(
const std::string &feMacroName, frontEndMacroFunction_t feMacroFunction,
const std::vector<std::string> &namesOfInputArgs,
const std::vector<std::string> &namesOfOutputArgs, uint8_t requiredUserPermissions);
155 static const std::string& getFEMacroInputArgument (frontEndMacroInArgs_t &argsIn,
const std::string &argName);
157 static std::string& getFEMacroOutputArgument (frontEndMacroOutArgs_t &argsOut,
const std::string& argName);
161 std::string& setFEMacroOutputArgumentValue(
162 frontEndMacroOutArgs_t &argsOut,
163 const std::string &argName,
const T& value)
const
165 std::string& argOut = getFEMacroOutputArgument(argsOut,argName);
166 std::stringstream ss; ss << value;
175 T getFEMacroInputArgumentValue(
176 FEVInterface::frontEndMacroInArgs_t &argsIn,
const std::string &argName)
181 const std::string& data = FEVInterface::getFEMacroInputArgument(argsIn, argName);
186 if(!StringMacros::getNumber(data,retValue))
188 __SS__ <<
"Error extracting value for argument named '" <<
189 argName <<
".' The value '" << data <<
"' is not a number!" << std::endl;
190 __COUT__ <<
"\n" << ss.str();
191 throw std::runtime_error(ss.str());
198 std::string getFEMacroInputArgumentValue<std::string> (FEVInterface::frontEndMacroInArgs_t &argsIn,
const std::string &argName);