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/ConfigurationInterface/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 namespace ots
00019 {
00020 class FrontEndHardwareBase;
00021 class FrontEndFirmwareBase;
00022 class FEInterfaceConfigurationBase;
00023
00024
00025 class FEVInterface : public VStateMachine, public WorkLoop, public Configurable
00026 {
00027 public:
00028
00029 FEVInterface (const std::string& interfaceUID, const ConfigurationTree& theXDAQContextConfigTree, const std::string& configurationPath)
00030 : WorkLoop (interfaceUID)
00031 , Configurable (theXDAQContextConfigTree, configurationPath)
00032 , interfaceUID_ (interfaceUID)
00033 , interfaceType_ (theXDAQContextConfigTree_.getBackNode(theConfigurationPath_).getNode("FEInterfacePluginName").getValue<std::string>())
00034 , daqHardwareType_ ("NOT SET")
00035 , firmwareType_ ("NOT SET")
00036 , slowControlsWorkLoop_ (interfaceUID + "-SlowControls", this)
00037 {}
00038
00039 virtual ~FEVInterface (void) {;}
00040
00041 virtual void initLocalGroup(int local_group_comm_){std::cout << __PRETTY_FUNCTION__ << std::endl;}
00042
00043
00044
00045
00046 void configureSlowControls(void);
00047
00048
00049
00050 const std::string& getInterfaceUID (void) const {return interfaceUID_;}
00051 const std::string& getDaqHardwareType (void) const {return daqHardwareType_;}
00052 const std::string& getFirmwareType (void) const {return firmwareType_;}
00053 const std::string& getInterfaceType (void) const {return interfaceType_;}
00054
00055 virtual int universalRead (char* address, char* returnValue) = 0;
00056 virtual void universalWrite (char* address, char* writeValue) = 0;
00057 const unsigned int& getUniversalAddressSize(void) {return universalAddressSize_;}
00058 const unsigned int& getUniversalDataSize (void) {return universalDataSize_;}
00059
00060
00061
00062
00063 FrontEndHardwareBase* getHardwareP(void) const {return theFrontEndHardware_;}
00064 FrontEndFirmwareBase* getFirmwareP(void) const {return theFrontEndFirmware_;}
00065
00066 bool slowControlsRunning(void);
00067 void startSlowControlsWorkLooop(void) {slowControlsWorkLoop_.startWorkLoop();}
00068 void stopSlowControlsWorkLooop(void) {slowControlsWorkLoop_.stopWorkLoop();}
00069
00070
00071 using frontEndMacroInArg_t = std::pair<const std::string , const std::string >;
00072 using frontEndMacroInArgs_t = const std::vector<frontEndMacroInArg_t> &;
00073 using frontEndMacroOutArg_t = std::pair<const std::string , std::string >;
00074 using frontEndMacroOutArgs_t = std::vector<frontEndMacroOutArg_t> &;
00075 using frontEndMacroFunction_t = void (ots::FEVInterface::* )(frontEndMacroInArgs_t, frontEndMacroOutArgs_t);
00076 struct frontEndMacroStruct_t
00077 {
00078 frontEndMacroStruct_t(const frontEndMacroFunction_t &feMacroFunction,
00079 const std::vector<std::string> &namesOfInputArgs,
00080 const std::vector<std::string> &namesOfOutputArgs,
00081 const uint8_t requiredUserPermissions)
00082 :macroFunction_(feMacroFunction)
00083 ,namesOfInputArguments_(namesOfInputArgs)
00084 ,namesOfOutputArguments_(namesOfOutputArgs)
00085 ,requiredUserPermissions_(requiredUserPermissions)
00086 {}
00087
00088 const frontEndMacroFunction_t macroFunction_;
00089 const std::vector<std::string> namesOfInputArguments_, namesOfOutputArguments_;
00090 const uint8_t requiredUserPermissions_;
00091 };
00092 const std::map<std::string, frontEndMacroStruct_t>& getMapOfFEMacroFunctions() {return mapOfFEMacroFunctions_;}
00093
00094 protected:
00095 bool workLoopThread(toolbox::task::WorkLoop* workLoop){return running();}
00096 std::string interfaceUID_;
00097 std::string interfaceType_;
00098
00099
00100 std::string daqHardwareType_;
00101 std::string firmwareType_;
00102
00103 FrontEndHardwareBase* theFrontEndHardware_ = nullptr;
00104 FrontEndFirmwareBase* theFrontEndFirmware_ = nullptr;
00105
00106 unsigned int universalAddressSize_ = 0;
00107 unsigned int universalDataSize_ = 0;
00108
00109
00110 std::map<std::string, FESlowControlsChannel> mapOfSlowControlsChannels_;
00111 FESlowControlsWorkLoop slowControlsWorkLoop_;
00112
00113
00114
00115
00116 std::map<std::string, frontEndMacroStruct_t> mapOfFEMacroFunctions_;
00117 std::array<std::string, 3> testarr_;
00118
00119 void registerFEMacroFunction(const std::string &feMacroName, frontEndMacroFunction_t feMacroFunction, const std::vector<std::string> &namesOfInputArgs, const std::vector<std::string> &namesOfOutputArgs,uint8_t requiredUserPermissions);
00120 const std::string& getFEMacroInputArgument(frontEndMacroInArgs_t &argsIn, const std::string &argName);
00121 std::string& getFEMacroOutputArgument(frontEndMacroOutArgs_t &argsOut, const std::string& argName);
00122 };
00123
00124 }
00125
00126 #endif