00001 #ifndef _ots_FEVInterface_h_
00002 #define _ots_FEVInterface_h_
00003
00004 #include "otsdaq-core/FiniteStateMachine/VStateMachine.h"
00005 #include "otsdaq-core/WorkLoopManager/WorkLoop.h"
00006 #include "otsdaq-core/Configurable/Configurable.h"
00007 #include "otsdaq-core/FECore/FESlowControlsWorkLoop.h"
00008
00009
00010
00011 #include "otsdaq-core/FECore/FESlowControlsChannel.h"
00012
00013 #include <string>
00014 #include <iostream>
00015 #include <vector>
00016 #include <array>
00017
00018 #define __ARGS__ FEVInterface::frontEndMacroInArgs_t argsIn, FEVInterface::frontEndMacroOutArgs_t argsOut
00019 #define __GET_ARG_IN__(X,Y) getFEMacroInputArgumentValue<Y> (argsIn ,X)
00020 #define __GET_ARG_OUT__(X) FEVInterface::getFEMacroOutputArgument (argsOut,X)
00021 #define __SET_ARG_OUT__(X,Y) FEVInterface::setFEMacroOutputArgumentValue (argsOut,X,Y)
00022
00023 namespace ots
00024 {
00025
00026 class FrontEndHardwareBase;
00027 class FrontEndFirmwareBase;
00028 class FEInterfaceConfigurationBase;
00029
00030
00031
00032
00033
00034
00035 class FEVInterface : public VStateMachine, public WorkLoop, public Configurable
00036 {
00037 public:
00038
00039 FEVInterface (const std::string& interfaceUID, const ConfigurationTree& theXDAQContextConfigTree, const std::string& configurationPath)
00040 : WorkLoop (interfaceUID)
00041 , Configurable (theXDAQContextConfigTree, configurationPath)
00042 , interfaceUID_ (interfaceUID)
00043 , interfaceType_ (theXDAQContextConfigTree_.getBackNode(theConfigurationPath_).getNode("FEInterfacePluginName").getValue<std::string>())
00044 , daqHardwareType_ ("NOT SET")
00045 , firmwareType_ ("NOT SET")
00046 , slowControlsWorkLoop_ (interfaceUID + "-SlowControls", this)
00047 {}
00048
00049 virtual ~FEVInterface (void) {;}
00050
00052
00053
00054
00055
00056
00057
00058
00059
00060
00062
00063 const std::string& getInterfaceUID (void) const {return interfaceUID_;}
00064 const std::string& getDaqHardwareType (void) const {return daqHardwareType_;}
00065 const std::string& getFirmwareType (void) const {return firmwareType_;}
00066 const std::string& getInterfaceType (void) const {return interfaceType_;}
00067
00068 virtual int universalRead (char* address, char* returnValue) = 0;
00069 virtual void universalWrite (char* address, char* writeValue) = 0;
00070 const unsigned int& getUniversalAddressSize (void) {return universalAddressSize_;}
00071 const unsigned int& getUniversalDataSize (void) {return universalDataSize_;}
00072
00073 FrontEndHardwareBase* getHardwareP (void) const {return theFrontEndHardware_;}
00074 FrontEndFirmwareBase* getFirmwareP (void) const {return theFrontEndFirmware_;}
00075
00076 void runSequenceOfCommands (const std::string &treeLinkName);
00077
00079
00080 void configure (void) { __COUT__ << "\t Configure" << std::endl; runSequenceOfCommands("LinkToConfigureSequence"); }
00081 void start (std::string runNumber) { __COUT__ << "\t Start" << std::endl; runSequenceOfCommands("LinkToStartSequence"); }
00082 void stop (void) { __COUT__ << "\t Stop" << std::endl; runSequenceOfCommands("LinkToStopSequence"); }
00083 void halt (void) { stop();}
00084 void pause (void) { stop();}
00085 void resume (void) { start("");}
00086 bool running (void) { return false;}
00087
00089
00091
00092 void configureSlowControls (void);
00093 bool slowControlsRunning (void);
00094 void startSlowControlsWorkLooop (void) {slowControlsWorkLoop_.startWorkLoop();}
00095 void stopSlowControlsWorkLooop (void) {slowControlsWorkLoop_.stopWorkLoop();}
00096
00098
00099
00101
00102
00103
00104 using frontEndMacroInArg_t = std::pair<const std::string , const std::string >;
00105 using frontEndMacroInArgs_t = const std::vector<frontEndMacroInArg_t> &;
00106 using frontEndMacroOutArg_t = std::pair<const std::string , std::string >;
00107 using frontEndMacroOutArgs_t = std::vector<frontEndMacroOutArg_t> &;
00108 using frontEndMacroFunction_t = void (ots::FEVInterface::* )(frontEndMacroInArgs_t, frontEndMacroOutArgs_t);
00109 struct frontEndMacroStruct_t
00110 {
00111 frontEndMacroStruct_t(const frontEndMacroFunction_t &feMacroFunction,
00112 const std::vector<std::string> &namesOfInputArgs,
00113 const std::vector<std::string> &namesOfOutputArgs,
00114 const uint8_t requiredUserPermissions)
00115 :macroFunction_(feMacroFunction)
00116 ,namesOfInputArguments_(namesOfInputArgs)
00117 ,namesOfOutputArguments_(namesOfOutputArgs)
00118 ,requiredUserPermissions_(requiredUserPermissions)
00119 {}
00120
00121 const frontEndMacroFunction_t macroFunction_;
00122 const std::vector<std::string> namesOfInputArguments_, namesOfOutputArguments_;
00123 const uint8_t requiredUserPermissions_;
00124 };
00125 const std::map<std::string, frontEndMacroStruct_t>& getMapOfFEMacroFunctions() {return mapOfFEMacroFunctions_;}
00126
00128
00129 protected:
00130 bool workLoopThread(toolbox::task::WorkLoop* workLoop){continueWorkLoop_ = running(); return continueWorkLoop_;}
00131 std::string interfaceUID_;
00132 std::string interfaceType_;
00133
00134
00135 std::string daqHardwareType_;
00136 std::string firmwareType_;
00137
00138 FrontEndHardwareBase* theFrontEndHardware_ = nullptr;
00139 FrontEndFirmwareBase* theFrontEndFirmware_ = nullptr;
00140
00141 unsigned int universalAddressSize_ = 0;
00142 unsigned int universalDataSize_ = 0;
00143
00144
00145 std::map<std::string, FESlowControlsChannel> mapOfSlowControlsChannels_;
00146 FESlowControlsWorkLoop slowControlsWorkLoop_;
00147
00148
00149
00150
00151 std::map<std::string, frontEndMacroStruct_t> mapOfFEMacroFunctions_;
00152 void registerFEMacroFunction(const std::string &feMacroName, frontEndMacroFunction_t feMacroFunction, const std::vector<std::string> &namesOfInputArgs, const std::vector<std::string> &namesOfOutputArgs, uint8_t requiredUserPermissions);
00153
00154 public:
00155 static const std::string& getFEMacroInputArgument (frontEndMacroInArgs_t &argsIn, const std::string &argName);
00156 protected:
00157 static std::string& getFEMacroOutputArgument (frontEndMacroOutArgs_t &argsOut, const std::string& argName);
00158
00159
00160 template<class T>
00161 std::string& setFEMacroOutputArgumentValue(
00162 frontEndMacroOutArgs_t &argsOut,
00163 const std::string &argName, const T& value) const
00164 {
00165 std::string& argOut = getFEMacroOutputArgument(argsOut,argName);
00166 std::stringstream ss; ss << value;
00167 argOut = ss.str();
00168 return argOut;
00169 }
00170
00171 };
00172
00173
00174 template<class T>
00175 T getFEMacroInputArgumentValue(
00176 FEVInterface::frontEndMacroInArgs_t &argsIn, const std::string &argName)
00177 {
00178
00179
00180
00181 const std::string& data = FEVInterface::getFEMacroInputArgument(argsIn, argName);
00182
00183
00184 T retValue;
00185
00186 if(!StringMacros::getNumber(data,retValue))
00187 {
00188 __SS__ << "Error extracting value for argument named '" <<
00189 argName << ".' The value '" << data << "' is not a number!" << std::endl;
00190 __COUT__ << "\n" << ss.str();
00191 throw std::runtime_error(ss.str());
00192 }
00193
00194 return retValue;
00195 }
00196
00197 template<>
00198 std::string getFEMacroInputArgumentValue<std::string> (FEVInterface::frontEndMacroInArgs_t &argsIn, const std::string &argName);
00199
00200
00201 }
00202
00203 #endif